diff --git a/config/extensions.lock.json b/config/extensions.lock.json index 143ad72..d3a8d72 100644 --- a/config/extensions.lock.json +++ b/config/extensions.lock.json @@ -97,6 +97,15 @@ "reason": "Current Container Tools extension; its README states it replaces the older Docker extension functionality.", "mode": "baseline" }, + { + "id": "formulahendry.acp-client", + "version": "0.2.0", + "platform": "universal", + "vsix_url": "https://open-vsx.org/api/formulahendry/acp-client/0.2.0/file/formulahendry.acp-client-0.2.0.vsix", + "sha256_url": "https://open-vsx.org/api/formulahendry/acp-client/0.2.0/file/formulahendry.acp-client-0.2.0.sha256", + "reason": "Generic Agent Client Protocol client. Drives the local omp harness via `omp acp` (ACP wire version 1), giving the IDE a native agent panel without a custom extension. MIT, engines.vscode ^1.85.0, no extensionKind so it loads in the remote extension host where child_process exists.", + "mode": "baseline" + }, { "id": "sourcegraph.cody-ai", "version": "1.155.0", diff --git a/q5vault/index.md b/q5vault/index.md index 54228ff..6bcbd2a 100644 --- a/q5vault/index.md +++ b/q5vault/index.md @@ -36,6 +36,7 @@ Browser IDE for user `loca`, reverse-proxied by Nginx, gated by Authelia one-fac | --- | --- | --- | | `Continue.continue` | 2.1.0 | open-source AI agent, chat, edit, autocomplete | | `Anthropic.claude-code` | 2.1.235 | first-party Claude Code IDE integration | +| `formulahendry.acp-client` | 0.2.0 | ACP client; runs the local `omp` harness as a native agent panel | | `ms-python.python` | 2026.4.0 | Python language support | | `ms-python.debugpy` | 2026.6.0 | Python debugger, pinned explicitly | | `ms-toolsai.jupyter` | 2025.9.1 | notebooks in the browser IDE | @@ -45,6 +46,7 @@ Browser IDE for user `loca`, reverse-proxied by Nginx, gated by Authelia one-fac - audit against the lock file: `./scripts/list-extension-versions.sh` - optional, enterprise-only: `sourcegraph.cody-ai` 1.155.0 via `./scripts/install-extensions.sh --include-optional` - AI models come from the host LiteLLM gateway (`127.0.0.1:52001`), not a cloud sign-in; use the `free` model — see [[operations/extensions]] +- the `omp` harness is available as a native agent panel: activity bar → ACP Client → `ACP: New Conversation` → `Oh My Pi`, backed by `omp acp` over stdio — see [[operations/extensions]] - a fresh browser profile starts in Restricted Mode and hides every third-party extension until the folder is trusted — see [[operations/extensions]] - details: [[operations/extensions]] diff --git a/q5vault/operations/extensions.md b/q5vault/operations/extensions.md index 8d49a02..42b1433 100644 --- a/q5vault/operations/extensions.md +++ b/q5vault/operations/extensions.md @@ -7,18 +7,46 @@ reviewed: 2026-08-20 # 🧩 Extension baseline -## Pinned baseline (six entries) +## Pinned baseline (seven entries) | id | version | platform | reason | |---|---|---|---| | `Continue.continue` | 2.1.0 | linux-x64 | Primary open-source AI agent/chat/edit/autocomplete extension. | | `Anthropic.claude-code` | 2.1.235 | linux-x64 | First-party Claude Code IDE integration. | +| `formulahendry.acp-client` | 0.2.0 | universal | Generic Agent Client Protocol client; drives the local `omp` harness as a native agent panel. | | `ms-python.python` | 2026.4.0 | universal | Python language support expected in this environment. | | `ms-python.debugpy` | 2026.6.0 | linux-x64 | Explicit debugger dependency instead of relying on later bootstrap by the Python extension. | | `ms-toolsai.jupyter` | 2025.9.1 | universal | Notebook workflow support in the browser IDE. | | `ms-azuretools.vscode-containers` | 2.4.5 | universal | Current Container Tools extension; its README states it replaces the older Docker extension functionality. | -All six come from `config/extensions.lock.json` (registry: `https://open-vsx.org`). +All seven come from `config/extensions.lock.json` (registry: `https://open-vsx.org`). + +## OMP as a native agent panel (ACP) + +The `omp` harness is wired into the IDE over the Agent Client Protocol. No custom extension and no marketplace exception were needed: OMP already ships an ACP server and Open VSX already ships a generic ACP client. + +- agent side: `omp acp` runs Oh My Pi as an ACP server over stdio. Verified against the installed binary — `initialize` returns `protocolVersion 1` and `agentInfo {name: oh-my-pi, version: 17.4.0}`, and a full `session/new` + `session/prompt` turn streams `tool_call`, `plan`, `agent_message_chunk`, `usage_update`, `stopReason: end_turn` +- client side: `formulahendry.acp-client` 0.2.0, MIT, `engines.vscode ^1.85.0`. It declares no `extensionKind`, so it loads in the remote extension host where Node and `child_process` exist — a requirement, since the client spawns the agent as a child process +- protocol versions differ but interoperate: the client bundles ACP SDK `^0.21.1`, OMP pins `0.25.0`, both negotiate wire version 1 +- configuration lives in `data/user/User/settings.json`: + +```json +"acp.agents": { + "Oh My Pi": { "command": "/home/loca/.local/bin/omp", "args": ["acp"], "env": {} } +} +``` + +VS Code merges this object with the extension's own defaults, so the agent tree shows the shipped entries (Copilot, Claude Code, Gemini, Qwen and others, all of which would `npx`-fetch at runtime) plus `Oh My Pi`. Only `Oh My Pi` is a pinned local binary; treat the rest as unpinned and unsupported here. + +Usage: activity bar → ACP Client → `ACP: New Conversation` → pick `Oh My Pi`. The status bar shows `ACP: Oh My Pi` when connected. The chat panel renders OMP's own session config as native controls (mode Default/Plan, model, thinking level), and the agents tree lists real prior OMP sessions for the open folder, because the client calls `session/list` and OMP answers from `~/.omp/agent/sessions`. + +Operational notes: + +- credentials never move. OMP authenticates itself from `~/.omp` via its `agent` auth method; the extension is not given any key. This is why the ACP route was chosen over exposing OMP on a loopback port +- the IDE runs as `loca`, which holds `NOPASSWD: ALL`. An OMP session in this panel is therefore root-equivalent, gated only by Authelia one_factor on `cdsr.loca.zone`. Leave the client's permission prompts enabled; its file and terminal handlers are not workspace-confined +- OMP's own `tools.approvalMode` default is permissive and subagents are unconditionally so. Set it explicitly rather than inheriting it +- one `omp acp` process serves multiple sessions, but stdio carries a single client, so the IDE panel and a CLI `omp` are separate processes. They share `~/.omp`: session transcripts are per-directory with unique filenames and atomic rewrites, so that is safe, but memory and config are shared context, not isolation +- OMP cannot be reached over MCP. It implements an MCP client only, so Continue's `mcpServers` cannot point at it; ACP is the only protocol bridge ## Lock file mechanics diff --git a/q5vault/operations/index.md b/q5vault/operations/index.md index 448720b..a3256d4 100644 --- a/q5vault/operations/index.md +++ b/q5vault/operations/index.md @@ -13,7 +13,7 @@ Operations reference for the single-user code-server deployment at `cdsr.loca.zo - [[operations/install-upgrade]] — install or upgrade the upstream Debian package, service lifecycle, extension reinstall after Code version bumps, fallback path - [[operations/auth-tls]] — Authelia access rule, nginx four-block topology, shared cert lineage, proof commands, rollback/debug order -- [[operations/extensions]] — pinned baseline table, optional Cody, explicit exclusions, first-run sign-in notes, install/audit scripts +- [[operations/extensions]] — pinned baseline table, the OMP-over-ACP agent panel, LiteLLM model wiring, optional Cody, explicit exclusions, install/audit scripts - [[operations/verification]] — every smoke check with expected outputs: systemctl, loopback healthz, auth redirect, wiki public, Authelia compose, extension audit, browser flows, dev proxy, wiki build ## 🚨 Triage order when something is broken diff --git a/q5vault/operations/verification.md b/q5vault/operations/verification.md index 7cc8df1..976ef1a 100644 --- a/q5vault/operations/verification.md +++ b/q5vault/operations/verification.md @@ -76,8 +76,23 @@ Exit code: `0` 1. Open `https://cdsr.loca.zone` in a browser. 2. Complete Authelia one-factor login at `auth.loca.zone`. 3. Confirm code-server editor shell loads (activity bar, file explorer, terminals). -4. Open Extensions view (Ctrl+Shift+X): verify `Continue` and `Claude Code` are installed and enabled. +4. Open Extensions view (Ctrl+Shift+X): verify `Continue`, `Claude Code` and `ACP Client` are installed and enabled. 5. Open integrated terminal (Ctrl+`): run `whoami` -> output `loca`. +6. If the activity bar shows no third-party icons, the folder is in Restricted Mode: Command Palette → `Workspaces: Manage Workspace Trust` → Trust. Workspace Trust silently disables every third-party extension, which looks exactly like a failed install. + +## 7b. OMP agent panel over ACP (manual) + +Proves the `omp` harness is reachable as a native agent, end to end. + +1. Activity bar → `ACP Client`. The `AGENTS` tree lists `Oh My Pi` alongside the extension's shipped defaults; only `Oh My Pi` is a pinned local binary. +2. Command Palette → `ACP: New Conversation` → pick `Oh My Pi`. +3. Status bar reads `ACP: Oh My Pi`. The chat header shows the open folder and OMP's own session controls: mode (Default/Plan), model, thinking level. +4. Send `Reply with exactly: IDE-ACP-OK`. Expect the reply text plus rendered tool-call and plan cards. +5. Agent-side check without the IDE, if the panel misbehaves: + ```bash + printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":1,"clientCapabilities":{"fs":{"readTextFile":true,"writeTextFile":true}}}}' | omp acp + ``` + Expect one JSON line containing `"protocolVersion":1` and `"agentInfo":{"name":"oh-my-pi"`. If that works and the panel does not, the fault is the extension or `acp.agents`, not OMP. ## 8. dev-routing smoke (manual)