cdsr: wire the omp harness into the IDE as a native agent panel over ACP

Pin formulahendry.acp-client 0.2.0 (Open VSX, MIT, sha256-verified) and point
acp.agents at `omp acp`. OMP already ships an ACP v1 server, so no custom
extension and no marketplace exception were needed.

Verified in the running IDE: status bar `ACP: Oh My Pi`, session/list returns
real prior OMP sessions for the open folder, and a full prompt turn streams
text plus tool-call and plan cards.

Credentials never move: OMP authenticates from ~/.omp via its `agent` auth
method and the extension is given no key.
This commit is contained in:
Antigravity
2026-08-20 17:25:06 +02:00
parent c2d92d7b74
commit f52d7ba656
5 changed files with 58 additions and 4 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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)