From fb7ae0c2d6a492f410cec14a43709598efe5cd70 Mon Sep 17 00:00:00 2001 From: Damon <16412057+Modsofthenation@users.noreply.github.com> Date: Wed, 11 Nov 2026 06:42:12 +0000 Subject: [PATCH] Publish Locus 0.19.0. Bring current product sources across and retarget auto-updates at Modsofthenation/Locus. --- .github/ISSUE_TEMPLATE/bug.yml | 4 +- .github/workflows/ci.yml | 2 +- CHANGELOG.md | 18 + CONTEXT.md | 16 +- CONTRIBUTING.md | 4 +- README.md | 8 +- apps/android/app/build.gradle.kts | 4 +- apps/chrome-extension/manifest.json | 2 +- apps/cli/package.json | 2 +- apps/cli/src/help.ts | 2 +- apps/desktop/e2e/visual.spec.ts | 24 + .../appearance-contrast.png | Bin 76763 -> 89252 bytes .../appearance-ember.png | Bin 77482 -> 97071 bytes .../appearance-midnight.png | Bin 78439 -> 97281 bytes .../appearance-paper.png | Bin 76906 -> 97003 bytes .../ide-empty-ember.png | Bin 7731 -> 8227 bytes .../ide-empty-paper.png | Bin 7572 -> 8216 bytes .../new-automation-ember.png | Bin 50863 -> 49636 bytes .../new-automation-paper.png | Bin 50831 -> 49724 bytes .../new-automation-schedule-ember.png | Bin 63358 -> 61457 bytes .../new-automation-schedule-paper.png | Bin 71090 -> 69770 bytes .../visual.spec.ts-snapshots/rail-ember.png | Bin 8669 -> 12621 bytes .../visual.spec.ts-snapshots/rail-paper.png | Bin 8536 -> 12552 bytes .../settings-providers-ember.png | Bin 37290 -> 16975 bytes .../settings-providers-paper.png | Bin 37114 -> 16854 bytes .../shortcuts-ember-phone.png | Bin 50970 -> 51133 bytes .../shortcuts-ember.png | Bin 55494 -> 54638 bytes .../shortcuts-paper.png | Bin 55573 -> 54687 bytes .../sidebar-ember.png | Bin 0 -> 33686 bytes .../sidebar-paper.png | Bin 0 -> 33408 bytes apps/desktop/electron/control-plane.cjs | 4 +- apps/desktop/electron/control-plane.test.ts | 13 + apps/desktop/electron/keep-alive.cjs | 8 +- apps/desktop/electron/keep-alive.test.ts | 17 +- apps/desktop/electron/launch.cjs | 28 +- apps/desktop/electron/launch.test.ts | 70 +- apps/desktop/electron/main.cjs | 21 +- apps/desktop/package.json | 2 +- apps/desktop/src/App.test.tsx | 29 +- apps/desktop/src/App.tsx | 15 +- .../src/components/assets/AssetDropWell.tsx | 6 +- .../src/components/assets/AssetEmpty.test.tsx | 22 + .../automations/Automations.test.tsx | 57 +- .../components/automations/Automations.tsx | 102 +- .../automations/NewAutomation.test.tsx | 83 +- .../components/automations/NewAutomation.tsx | 252 ++- .../src/components/automations/jobRun.tsx | 214 ++ .../src/components/board/BoardCanvas.tsx | 2 +- .../src/components/board/BoardEmpty.tsx | 3 - .../src/components/brain/Brain.test.tsx | 30 +- apps/desktop/src/components/brain/Brain.tsx | 83 +- .../src/components/chat/ChatPane.test.tsx | 167 +- apps/desktop/src/components/chat/ChatPane.tsx | 123 +- .../src/components/chat/ChatThread.test.tsx | 52 +- .../src/components/chat/ChatThread.tsx | 4 +- .../src/components/chat/ComposerFiles.tsx | 45 +- .../components/chat/ExpandableLog.test.tsx | 9 + .../src/components/chat/ExpandableLog.tsx | 8 +- .../src/components/chat/NewSession.tsx | 2 +- .../src/components/codebase/Codebase.test.tsx | 119 +- .../src/components/codebase/Codebase.tsx | 288 ++- .../components/design/DesignEmpty.test.tsx | 59 +- .../src/components/design/DesignEmpty.tsx | 186 +- .../src/components/docker/Docker.test.tsx | 2 +- .../components/docker/DockerExplorer.test.tsx | 27 +- .../src/components/docker/DockerExplorer.tsx | 9 +- .../src/components/docker/DockerSwarm.tsx | 6 +- .../src/components/game/GameEmpty.test.tsx | 33 + .../src/components/grafana/Grafana.tsx | 5 - .../src/components/layout/EmptyHero.tsx | 5 +- .../src/components/layout/EmptyState.test.tsx | 110 +- .../src/components/layout/EmptyState.tsx | 104 +- .../src/components/layout/InboxPane.test.tsx | 64 + .../src/components/layout/InboxPane.tsx | 51 + .../src/components/layout/LaunchWorkspace.tsx | 3 + .../components/layout/MobileShell.test.tsx | 4 +- .../src/components/layout/MobileShell.tsx | 86 +- .../src/components/layout/OverflowMenu.tsx | 13 +- .../src/components/layout/SetupBanner.tsx | 46 + .../src/components/layout/Sidebar.test.tsx | 682 +++++- .../desktop/src/components/layout/Sidebar.tsx | 1963 +++++++---------- .../src/components/layout/Topbar.test.tsx | 235 +- apps/desktop/src/components/layout/Topbar.tsx | 126 +- .../components/layout/sidebar/FilterChips.tsx | 30 + .../components/layout/sidebar/InboxList.tsx | 97 + .../components/layout/sidebar/SideRail.tsx | 412 ++++ .../layout/sidebar/automationList.tsx | 124 ++ .../components/layout/sidebar/sectionMeta.tsx | 102 + .../components/layout/sidebar/sessionList.tsx | 464 ++++ .../src/components/projects/ProjectEmpty.tsx | 5 - .../settings/AppearanceSettings.test.tsx | 39 +- .../settings/AppearanceSettings.tsx | 85 +- .../settings/FinishSetupChecklist.tsx | 29 +- .../components/settings/ModelPicker.test.tsx | 20 +- .../src/components/settings/ModelPicker.tsx | 34 +- .../settings/NotificationSettings.tsx | 6 +- .../components/settings/RecipeCards.test.tsx | 71 +- .../src/components/settings/RecipeCards.tsx | 137 +- .../src/components/settings/RuntimePicker.tsx | 40 +- .../src/components/settings/Settings.test.tsx | 245 +- .../src/components/settings/Settings.tsx | 499 +++-- .../src/components/settings/SettingsBits.tsx | 65 + .../components/settings/SettingsCards.test.ts | 4 +- .../src/components/settings/SettingsCards.tsx | 239 +- .../components/settings/ThemePreview.test.tsx | 25 +- .../src/components/settings/ThemePreview.tsx | 19 +- apps/desktop/src/components/slack/Slack.tsx | 2 +- .../workspace/HostWorkspace.test.tsx | 5 +- .../components/workspace/HostWorkspace.tsx | 15 +- .../components/workspace/IdeEmpty.test.tsx | 34 +- .../src/components/workspace/IdeEmpty.tsx | 38 +- .../workspace/WorkspaceBody.test.tsx | 17 + .../components/workspace/WorkspaceBody.tsx | 12 +- .../workspace/WorkspaceEditor.test.tsx | 54 +- .../components/workspace/WorkspaceEditor.tsx | 198 +- apps/desktop/src/index.css | 909 +++++++- apps/desktop/src/lib/api.ts | 2 + apps/desktop/src/lib/automations.test.ts | 25 + apps/desktop/src/lib/automations.ts | 34 + apps/desktop/src/lib/cssTokens.test.ts | 8 +- apps/desktop/src/lib/discoverability.ts | 8 +- apps/desktop/src/lib/inboxList.test.ts | 79 + apps/desktop/src/lib/inboxList.ts | 108 + apps/desktop/src/lib/launchCopy.ts | 19 + apps/desktop/src/lib/markdown.test.ts | 8 + apps/desktop/src/lib/markdown.ts | 10 +- apps/desktop/src/lib/palette.test.ts | 9 +- apps/desktop/src/lib/palette.ts | 16 +- apps/desktop/src/lib/railNav.test.ts | 49 + apps/desktop/src/lib/railNav.ts | 127 ++ apps/desktop/src/lib/sessionUndo.test.ts | 34 + apps/desktop/src/lib/sessionUndo.ts | 23 +- apps/desktop/src/lib/shortcuts.test.ts | 8 + apps/desktop/src/lib/shortcuts.ts | 11 +- apps/desktop/src/lib/sidebarCopy.test.ts | 43 + apps/desktop/src/lib/sidebarCopy.ts | 69 + apps/desktop/src/lib/sidebarPrefs.test.ts | 38 + apps/desktop/src/lib/sidebarPrefs.ts | 56 +- apps/desktop/src/lib/theme.test.ts | 13 + apps/desktop/src/lib/useDrawerSidebar.ts | 33 + apps/desktop/src/lib/uxContract.test.ts | 4 +- apps/desktop/src/lib/visualScreens.test.tsx | 1 + apps/desktop/src/state/sessionMerge.ts | 104 + apps/desktop/src/state/store.test.ts | 47 + apps/desktop/src/state/store.ts | 162 +- apps/desktop/src/styles/swarm.css | 7 +- apps/desktop/src/styles/ux.css | 9 - apps/desktop/src/visual.tsx | 57 +- apps/server/package.json | 2 +- apps/server/src/app.test.ts | 18 +- .../src/automations/automations.test.ts | 46 + apps/server/src/automations/automations.ts | 54 +- apps/server/src/core/configSave.test.ts | 18 +- apps/server/src/core/configSave.ts | 12 + apps/server/src/core/guests.test.ts | 20 + apps/server/src/core/guests.ts | 39 +- apps/server/src/core/store.test.ts | 64 +- apps/server/src/core/store.ts | 185 +- apps/server/src/evals/generation.eval.test.ts | 14 +- .../src/git/architectureCheckout.test.ts | 4 +- apps/server/src/git/forge.test.ts | 104 + apps/server/src/git/forgeHttp.ts | 48 +- apps/server/src/git/githubForge.ts | 6 +- apps/server/src/git/repos.test.ts | 108 +- apps/server/src/git/repos.ts | 53 +- apps/server/src/http/configRoutes.ts | 8 +- apps/server/src/http/dockerRoutes.ts | 2 + apps/server/src/integrations/cliGitMcp.ts | 2 +- .../server/src/integrations/cursorCli.test.ts | 2 +- apps/server/src/integrations/locusMcp.ts | 2 +- apps/server/src/integrations/mcp.ts | 4 +- .../src/runtime/dockerInventory.test.ts | 33 + apps/server/src/runtime/dockerInventory.ts | 10 + apps/server/src/session/agentTurn.ts | 75 +- apps/server/src/session/controlPlaneTools.ts | 20 - apps/server/src/session/hostCliTurn.test.ts | 2 +- apps/server/src/session/kiroCliTurn.test.ts | 99 + .../src/session/sessionForgeTools.test.ts | 36 +- apps/server/src/session/sessionForgeTools.ts | 26 + .../server/src/session/sessionMockLlm.test.ts | 14 + apps/server/src/session/sessionMockLlm.ts | 62 +- apps/server/src/session/sessions.ts | 4 +- .../server/src/session/studioContinue.test.ts | 47 + apps/server/src/session/studioContinue.ts | 69 + docs/architecture.md | 2 +- docs/troubleshooting.md | 2 +- images/agent/README.md | 2 +- package-lock.json | 24 +- package.json | 4 +- packages/alb/package.json | 2 +- packages/compute/package.json | 2 +- packages/guest-agent/README.md | 2 +- packages/guest-agent/package.json | 2 +- packages/guest-agent/src/chromium.test.ts | 22 + packages/guest-agent/src/chromium.ts | 15 + packages/guest-agent/src/commands.ts | 23 +- packages/guest-agent/src/docker.ts | 15 +- packages/guest-agent/src/factory.test.ts | 56 + packages/guest-agent/src/factory.ts | 53 + packages/guest-agent/src/host.ts | 23 +- packages/guest-agent/src/index.test.ts | 21 + packages/guest-agent/src/index.ts | 5 + packages/guest-agent/src/ssh.ts | 17 +- packages/guest-agent/src/winrm.ts | 17 +- packages/hypervisor/README.md | 2 +- packages/hypervisor/package.json | 2 +- packages/hypervisor/src/docker.test.ts | 7 + packages/hypervisor/src/docker.ts | 15 +- packages/hypervisor/src/images.test.ts | 2 +- packages/providers/package.json | 2 +- packages/providers/src/kiroCli.test.ts | 178 +- packages/providers/src/kiroCli.ts | 135 +- packages/shared/package.json | 2 +- packages/shared/src/generationEval.test.ts | 16 +- packages/shared/src/generationEval.ts | 3 +- packages/shared/src/i18n.ts | 2 +- packages/shared/src/index.test.ts | 10 +- packages/shared/src/models/docker.ts | 6 + packages/shared/src/models/theme.ts | 8 + packages/shared/src/models/tools.ts | 162 +- .../shared/src/models/toolsCatalog.test.ts | 27 + packages/shared/src/models/vm.ts | 15 +- packages/shared/src/remoteError.test.ts | 26 +- packages/shared/src/remoteError.ts | 22 + packages/worker/package.json | 2 +- packages/worker/src/browserHub.ts | 4 +- packages/worker/src/client.ts | 8 +- packages/worker/src/guests.ts | 40 +- 228 files changed, 9859 insertions(+), 3537 deletions(-) create mode 100644 apps/desktop/e2e/visual.spec.ts-snapshots/sidebar-ember.png create mode 100644 apps/desktop/e2e/visual.spec.ts-snapshots/sidebar-paper.png create mode 100644 apps/desktop/src/components/automations/jobRun.tsx create mode 100644 apps/desktop/src/components/layout/InboxPane.test.tsx create mode 100644 apps/desktop/src/components/layout/InboxPane.tsx create mode 100644 apps/desktop/src/components/layout/SetupBanner.tsx create mode 100644 apps/desktop/src/components/layout/sidebar/FilterChips.tsx create mode 100644 apps/desktop/src/components/layout/sidebar/InboxList.tsx create mode 100644 apps/desktop/src/components/layout/sidebar/SideRail.tsx create mode 100644 apps/desktop/src/components/layout/sidebar/automationList.tsx create mode 100644 apps/desktop/src/components/layout/sidebar/sectionMeta.tsx create mode 100644 apps/desktop/src/components/layout/sidebar/sessionList.tsx create mode 100644 apps/desktop/src/components/settings/SettingsBits.tsx create mode 100644 apps/desktop/src/lib/inboxList.test.ts create mode 100644 apps/desktop/src/lib/inboxList.ts create mode 100644 apps/desktop/src/lib/launchCopy.ts create mode 100644 apps/desktop/src/lib/sidebarCopy.test.ts create mode 100644 apps/desktop/src/lib/sidebarCopy.ts create mode 100644 apps/desktop/src/lib/useDrawerSidebar.ts create mode 100644 apps/desktop/src/state/sessionMerge.ts create mode 100644 apps/server/src/session/studioContinue.test.ts create mode 100644 apps/server/src/session/studioContinue.ts create mode 100644 packages/guest-agent/src/factory.test.ts create mode 100644 packages/guest-agent/src/factory.ts create mode 100644 packages/shared/src/models/toolsCatalog.test.ts diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index d8d64bf..6048042 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -12,8 +12,8 @@ body: id: version attributes: label: Version - description: Settings → About, or the GitHub Release tag (for example 0.18.0). - placeholder: 0.18.0 + description: Settings → About, or the GitHub Release tag (for example 0.19.0). + placeholder: 0.19.0 validations: required: true - type: dropdown diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9ceae59..ab7822b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,7 +41,7 @@ jobs: run: | mkdir -p images/agent/vendor node scripts/prefetch-github-release-asset.mjs --owner coder --repo code-server --tag v4.96.4 --file code-server-4.96.4-linux-amd64.tar.gz --out images/agent/vendor/code-server.tar.gz - - run: docker build -t locus/agent:0.1 -t locus/agent:0.18.0 images/agent + - run: docker build -t locus/agent:0.1 -t locus/agent:0.19.0 images/agent android: runs-on: ubuntu-latest diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e680f6..467d28b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,24 @@ ## Unreleased +## 0.19.0 — 2026-11-11 + +Inbox and a resizable sidebar with pinnable rail sections, the Console theme, a UI/UX polish pass across every section, and more reliable Jobs, worker uploads, and desktop updates. Settings → About is **0.19.0**. + +**Sidebar and Inbox.** The icon rail opens with Inbox: agents, boards, Brain, and failing jobs waiting on you, with Approve / Deny on waiting tools. Sections from More can be pinned to the rail, reordered, and unpinned by right-clicking a rail icon. The list panel resizes (240–480px), session lists share All / Needs you / Running / Unread filters, and Alt+1–9 jumps between Inbox and pinned sections. On narrow windows the sidebar no longer slides under the chat, and the phone Needs you tab shares the Inbox list. + +**UI/UX pass.** List headers, empty states, and filter chips are consistent across the app. The chat composer is a single frame with Send inside it, the model chip and topbar always agree, and Design sessions open with the canvas visible. Automations are called Jobs throughout. Settings pages lead with a one-line summary, providers are grouped Enabled / Available, and on/off settings are switches. + +**Console theme.** Settings → Appearance adds Console: amber phosphor on charcoal with a monospace font and scanlines (`locus config theme console`). + +**Jobs.** Run now checks Docker first and offers to switch to Host or start Docker. Jobs whose linked repo was removed run and save again, and run errors read as one plain sentence with details on demand. + +**Codebase and IDE.** Public GitHub, GitLab, Bitbucket, Gitea, and Azure repos load pull requests and issues without a token, and blocked or rate-limited reads say so in place. README badges render correctly in the IDE. + +**Fixes.** Uploads to guests on a worker plane no longer answer "Not found". Deleting the open agent returns to the new-agent screen, with Undo reopening it. The desktop app picks up rebuilt UI between releases and restarts a control plane left by an older build. Kiro CLI turns no longer duplicate tool chips, recognise more test runners as verification, and use Locus's Git tools instead of reading forge tokens from the environment. + +**Under the hood.** Host, Docker, and worker guests share one tool catalog and lifecycle, simplifying how VMs, containers, and remote workers are driven. + ## 0.18.0 — 2026-11-09 Worker VMs with proxied displays and golden disks, Azure and GCP placement, Slack Approve, Windows guest CLIs, and Linux installers. Settings → About is **0.18.0**. diff --git a/CONTEXT.md b/CONTEXT.md index 46970dc..373dfc0 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -10,9 +10,21 @@ A chat session that drives a **guest** (Docker container, VM, or host workspace) The machine the agent tools target. Docker, VM, and host are adapters behind one **guest runtime** interface. Live guests set `liveGuest`; the in-memory mock adapter omits it. +## Guest factory + +Picks the Guest runtime adapter (Docker, Host, Windows SSH+WinRM, SSH, or mock) from a Machine. Control-plane GuestHub and worker WorkerGuestHub are thin adapters on that interface. + +## Runtime catalog + +The shared Guest tool list Host and Docker catalogs are derived from. Host adds Board / Project / Swarm planning tools and headed Chrome; Docker adds `start_process`, `record_screen`, and headed Chromium. + +## Studio continue + +Turn policy after a Design / Game / Asset round: look, incomplete canvas, quality, juice, sculpt, unused assets, mutate follow-up. Model, tool, and CLI Turns share the predicates; coding / review / ops continue stays on the Turn module. + ## Session -Persisted agent state: messages, queue, checkpoints, linked repo, preview. +Persisted agent state: messages, queue, checkpoints, linked repo, preview. Desktop streaming applies **Session merge** so a list-view snapshot does not wipe a fuller local transcript. ## Machine @@ -76,7 +88,7 @@ A scheduled or webhook-triggered prompt run that reuses an agent or boots a gold ## Config save -The Settings write path: merge secrets, validate providers/forges/templates/MCP/skills/plugins/workers, then persist. +The Settings write path: merge secrets, lock managed policy, validate providers/forges/templates/MCP/skills/plugins/workers, then persist. `prepareSavedConfig` is the merge+normalize interface; the route persists and notifies. ## Agent canvas diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 356da67..cdc2608 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -48,8 +48,8 @@ First agent without Docker: Settings → Providers (Ollama needs no key) then Ne After merge to `main`: ```bash -git tag v0.18.0 -git push origin v0.18.0 +git tag v0.19.0 +git push origin v0.19.0 ``` GitHub Releases are the distribution channel (`v*` tags). Pushing a `v*` tag publishes Linux, macOS, and Windows installers, then **Prune GitHub Releases** deletes older published releases so only the last three remain (git tags are kept). See [docs/public-release.md](docs/public-release.md) for listing settings this tree cannot change (visibility, vulnerability reporting, unsigned macOS/Windows). Keep the repository description as the README tagline and topics `ai-agents`, `qemu`, `docker`, `computer-use`, `electron`, `local-first`. diff --git a/README.md b/README.md index 44741a2..775eafb 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Locus is a desktop control plane for AI coding agents that run on hardware you own — a Docker container, a QEMU virtual machine, or a folder on disk. Chat on one side, the live guest on the other. Code, keys, sessions, and disks stay under `~/.locus`. -This is **v0.18.0** (MIT). The API binds to loopback. Linux, macOS, and Windows. Bring any LLM provider you have a key for. +This is **v0.19.0** (MIT). The API binds to loopback. Linux, macOS, and Windows. Bring any LLM provider you have a key for. ## Install @@ -42,7 +42,7 @@ The runtime is chosen per agent and stays fixed. New agents default to Docker wh ## Tour -The icon rail is **Agents, Design, IDE, Codebase, Automations**, then **More** for Games, Assets, Board, Projects, Brain, Slack, Grafana, and Docker. Settings is a full page. Developer / Swarm lives in Appearance (and the command palette) — Developer is this control plane; Swarm hides the rail and is teammate-first (Teammates, Teams, Routines). +The icon rail starts with **Inbox** (everything waiting on you), then **Agents, Design, IDE, Codebase, Jobs** (Automations), then **More** for Games, Assets, Board, Projects, Brain, Slack, Grafana, and Docker. Pin a More surface onto the rail from that menu, then drag it or use Move up / down. Hover a collapsed rail icon to peek that list. Alt+1–9 jumps Inbox then pinned sections. Drag the sidebar edge to resize. Session lists share All / Needs you / Running / Unread chips and can group by day, repo, or status; Docker uses All / Running chips. Inbox rows are tagged and can Approve / Deny waiting tools. Settings is a full page. Developer / Swarm lives in Appearance (and the command palette) — Developer is this control plane; Swarm hides the rail and is teammate-first (Teammates, Teams, Routines). ### Setup @@ -210,7 +210,7 @@ Git includes **Sign in with GitHub** / **Sign in with GitLab** / **Sign in with Settings → Phone mints a LAN pairing token (QR on that tab). Settings → Workers lists LAN / Cloud VM / Fargate hosts. Settings → Environments lists named boxes saved from New agent or Automations. Settings → Notifications toggles desktop alerts and quiet hours. Settings → Appearance filters themes and sets editor font size, format on save, and the minimap. Settings → Advanced **Tailscale Funnel** exposes **only** `/api/hooks` (never the whole control plane) so GitHub can reach forge webhooks; `locus config funnel enable|disable`. -Integrations: Slack, Grafana, Jira, Confluence, Linear, Miro, Figma, incident.io, AWS IAM, Portainer, Kubernetes, Sentry, Gmail, Google Calendar, Google Drive, and agent-authored HTTP plugins. Settings → About is **0.18.0**. +Integrations: Slack, Grafana, Jira, Confluence, Linear, Miro, Figma, incident.io, AWS IAM, Portainer, Kubernetes, Sentry, Gmail, Google Calendar, Google Drive, and agent-authored HTTP plugins. Settings → About is **0.19.0**.