omegon 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitattributes +3 -0
- package/AGENTS.md +16 -0
- package/LICENSE +15 -0
- package/README.md +289 -0
- package/bin/pi.mjs +30 -0
- package/extensions/00-secrets/index.ts +1126 -0
- package/extensions/01-auth/auth.ts +401 -0
- package/extensions/01-auth/index.ts +289 -0
- package/extensions/auto-compact.ts +42 -0
- package/extensions/bootstrap/deps.ts +291 -0
- package/extensions/bootstrap/index.ts +811 -0
- package/extensions/chronos/chronos.sh +487 -0
- package/extensions/chronos/index.ts +148 -0
- package/extensions/cleave/assessment.ts +754 -0
- package/extensions/cleave/bridge.ts +31 -0
- package/extensions/cleave/conflicts.ts +250 -0
- package/extensions/cleave/dispatcher.ts +808 -0
- package/extensions/cleave/guardrails.ts +426 -0
- package/extensions/cleave/index.ts +3121 -0
- package/extensions/cleave/lifecycle-emitter.ts +20 -0
- package/extensions/cleave/openspec.ts +811 -0
- package/extensions/cleave/planner.ts +260 -0
- package/extensions/cleave/review.ts +579 -0
- package/extensions/cleave/skills.ts +355 -0
- package/extensions/cleave/types.ts +261 -0
- package/extensions/cleave/workspace.ts +861 -0
- package/extensions/cleave/worktree.ts +243 -0
- package/extensions/core-renderers.ts +253 -0
- package/extensions/dashboard/context-gauge.ts +58 -0
- package/extensions/dashboard/file-watch.ts +14 -0
- package/extensions/dashboard/footer.ts +1145 -0
- package/extensions/dashboard/git.ts +185 -0
- package/extensions/dashboard/index.ts +478 -0
- package/extensions/dashboard/memory-audit.ts +34 -0
- package/extensions/dashboard/overlay-data.ts +705 -0
- package/extensions/dashboard/overlay.ts +365 -0
- package/extensions/dashboard/render-utils.ts +54 -0
- package/extensions/dashboard/types.ts +191 -0
- package/extensions/dashboard/uri-helper.ts +45 -0
- package/extensions/debug.ts +69 -0
- package/extensions/defaults.ts +282 -0
- package/extensions/design-tree/dashboard-state.ts +161 -0
- package/extensions/design-tree/design-card.ts +362 -0
- package/extensions/design-tree/index.ts +2130 -0
- package/extensions/design-tree/lifecycle-emitter.ts +41 -0
- package/extensions/design-tree/tree.ts +1607 -0
- package/extensions/design-tree/types.ts +163 -0
- package/extensions/distill.ts +127 -0
- package/extensions/effort/index.ts +395 -0
- package/extensions/effort/tiers.ts +146 -0
- package/extensions/effort/types.ts +105 -0
- package/extensions/lib/git-state.ts +227 -0
- package/extensions/lib/local-models.ts +157 -0
- package/extensions/lib/model-preferences.ts +51 -0
- package/extensions/lib/model-routing.ts +720 -0
- package/extensions/lib/operator-fallback.ts +205 -0
- package/extensions/lib/operator-profile.ts +360 -0
- package/extensions/lib/slash-command-bridge.ts +253 -0
- package/extensions/lib/typebox-helpers.ts +16 -0
- package/extensions/local-inference/index.ts +727 -0
- package/extensions/mcp-bridge/README.md +220 -0
- package/extensions/mcp-bridge/index.ts +951 -0
- package/extensions/mcp-bridge/lib.ts +365 -0
- package/extensions/mcp-bridge/mcp.json +3 -0
- package/extensions/mcp-bridge/package.json +11 -0
- package/extensions/model-budget.ts +752 -0
- package/extensions/offline-driver.ts +403 -0
- package/extensions/openspec/archive-gate.ts +164 -0
- package/extensions/openspec/branch-cleanup.ts +64 -0
- package/extensions/openspec/dashboard-state.ts +50 -0
- package/extensions/openspec/index.ts +1917 -0
- package/extensions/openspec/lifecycle-emitter.ts +65 -0
- package/extensions/openspec/lifecycle-files.ts +70 -0
- package/extensions/openspec/lifecycle.ts +50 -0
- package/extensions/openspec/reconcile.ts +187 -0
- package/extensions/openspec/spec.ts +1385 -0
- package/extensions/openspec/types.ts +98 -0
- package/extensions/project-memory/DESIGN-global-mind.md +198 -0
- package/extensions/project-memory/README.md +202 -0
- package/extensions/project-memory/api-types.ts +382 -0
- package/extensions/project-memory/compaction-policy.ts +29 -0
- package/extensions/project-memory/core.ts +164 -0
- package/extensions/project-memory/embeddings.ts +230 -0
- package/extensions/project-memory/extraction-v2.ts +861 -0
- package/extensions/project-memory/factstore.ts +2177 -0
- package/extensions/project-memory/index.ts +3459 -0
- package/extensions/project-memory/injection-metrics.ts +91 -0
- package/extensions/project-memory/jsonl-io.ts +12 -0
- package/extensions/project-memory/lifecycle.ts +331 -0
- package/extensions/project-memory/migration.ts +293 -0
- package/extensions/project-memory/package.json +9 -0
- package/extensions/project-memory/sci-renderers.ts +7 -0
- package/extensions/project-memory/template.ts +103 -0
- package/extensions/project-memory/triggers.ts +52 -0
- package/extensions/project-memory/types.ts +102 -0
- package/extensions/render/composition/fonts/Inter-Bold.ttf +0 -0
- package/extensions/render/composition/fonts/Inter-Regular.ttf +0 -0
- package/extensions/render/composition/fonts/Tomorrow-Bold.ttf +0 -0
- package/extensions/render/composition/fonts/Tomorrow-Regular.ttf +0 -0
- package/extensions/render/composition/package-lock.json +534 -0
- package/extensions/render/composition/package.json +22 -0
- package/extensions/render/composition/render.mjs +246 -0
- package/extensions/render/composition/test-comp.tsx +87 -0
- package/extensions/render/composition/types.ts +24 -0
- package/extensions/render/excalidraw/UPSTREAM.md +81 -0
- package/extensions/render/excalidraw/elements.ts +764 -0
- package/extensions/render/excalidraw/index.ts +66 -0
- package/extensions/render/excalidraw/types.ts +223 -0
- package/extensions/render/excalidraw-renderer/pyproject.toml +8 -0
- package/extensions/render/excalidraw-renderer/render_excalidraw.py +182 -0
- package/extensions/render/excalidraw-renderer/render_template.html +59 -0
- package/extensions/render/index.ts +830 -0
- package/extensions/render/native-diagrams/index.ts +57 -0
- package/extensions/render/native-diagrams/motifs.ts +542 -0
- package/extensions/render/native-diagrams/raster.ts +8 -0
- package/extensions/render/native-diagrams/scene.ts +75 -0
- package/extensions/render/native-diagrams/spec.ts +204 -0
- package/extensions/render/native-diagrams/svg.ts +116 -0
- package/extensions/sci-ui.ts +304 -0
- package/extensions/session-log.ts +174 -0
- package/extensions/shared-state.ts +146 -0
- package/extensions/spinner-verbs.ts +91 -0
- package/extensions/style.ts +281 -0
- package/extensions/terminal-title.ts +191 -0
- package/extensions/tool-profile/index.ts +291 -0
- package/extensions/tool-profile/profiles.ts +290 -0
- package/extensions/types.d.ts +9 -0
- package/extensions/vault/index.ts +185 -0
- package/extensions/version-check.ts +90 -0
- package/extensions/view/index.ts +859 -0
- package/extensions/view/uri-resolver.ts +148 -0
- package/extensions/web-search/index.ts +182 -0
- package/extensions/web-search/providers.ts +121 -0
- package/extensions/web-ui/index.ts +110 -0
- package/extensions/web-ui/server.ts +265 -0
- package/extensions/web-ui/state.ts +462 -0
- package/extensions/web-ui/static/index.html +145 -0
- package/extensions/web-ui/types.ts +284 -0
- package/package.json +76 -0
- package/prompts/init.md +75 -0
- package/prompts/new-repo.md +54 -0
- package/prompts/oci-login.md +56 -0
- package/prompts/status.md +50 -0
- package/settings.json +4 -0
- package/skills/cleave/SKILL.md +218 -0
- package/skills/git/SKILL.md +209 -0
- package/skills/git/_reference/ci-validation.md +204 -0
- package/skills/oci/SKILL.md +338 -0
- package/skills/openspec/SKILL.md +346 -0
- package/skills/pi-extensions/SKILL.md +191 -0
- package/skills/pi-tui/SKILL.md +517 -0
- package/skills/python/SKILL.md +189 -0
- package/skills/rust/SKILL.md +268 -0
- package/skills/security/SKILL.md +206 -0
- package/skills/style/SKILL.md +264 -0
- package/skills/typescript/SKILL.md +225 -0
- package/skills/vault/SKILL.md +102 -0
- package/themes/alpharius-legacy.json +85 -0
- package/themes/alpharius.conf +59 -0
- package/themes/alpharius.json +88 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# mcp-bridge
|
|
2
|
+
|
|
3
|
+
Pi extension that connects to [MCP](https://modelcontextprotocol.io/) servers and registers their tools as native pi tools. Supports both **stdio** (local process) and **Streamable HTTP** (remote server) transports.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Interactive setup
|
|
9
|
+
/mcp add
|
|
10
|
+
|
|
11
|
+
# Or create ~/.pi/agent/mcp.json manually
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Configuration
|
|
15
|
+
|
|
16
|
+
Server configs are loaded from multiple locations, merged with higher-priority files winning on name collisions:
|
|
17
|
+
|
|
18
|
+
| Priority | Path | Scope |
|
|
19
|
+
|----------|------|-------|
|
|
20
|
+
| 1 (highest) | `.pi/mcp.json` | Project-level (per-workspace) |
|
|
21
|
+
| 2 | `~/.pi/agent/mcp.json` | User-level (global, all projects) |
|
|
22
|
+
| 3 (lowest) | `<extension>/mcp.json` | Extension-bundled (fallback/examples) |
|
|
23
|
+
|
|
24
|
+
### Streamable HTTP server
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"servers": {
|
|
29
|
+
"scribe": {
|
|
30
|
+
"url": "https://scribe.example.com/mcp/transport/",
|
|
31
|
+
"headers": {
|
|
32
|
+
"Authorization": "Bearer ${GITHUB_TOKEN}"
|
|
33
|
+
},
|
|
34
|
+
"timeout": 15000
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
| Field | Required | Description |
|
|
41
|
+
|-------|----------|-------------|
|
|
42
|
+
| `url` | yes | MCP Streamable HTTP endpoint URL (use canonical URL — no trailing-slash redirects) |
|
|
43
|
+
| `headers` | no | HTTP headers object; values support `${ENV_VAR}` interpolation |
|
|
44
|
+
| `timeout` | no | Connection timeout in ms (default: 15000) |
|
|
45
|
+
|
|
46
|
+
### Stdio server
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"servers": {
|
|
51
|
+
"my-tool": {
|
|
52
|
+
"command": "npx",
|
|
53
|
+
"args": ["-y", "@example/mcp-server"],
|
|
54
|
+
"env": {
|
|
55
|
+
"API_KEY": "${MY_API_KEY}"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
| Field | Required | Description |
|
|
63
|
+
|-------|----------|-------------|
|
|
64
|
+
| `command` | yes | Executable to spawn |
|
|
65
|
+
| `args` | no | Command arguments array |
|
|
66
|
+
| `env` | no | Environment variables object; values support `${ENV_VAR}` interpolation |
|
|
67
|
+
|
|
68
|
+
### Validation
|
|
69
|
+
|
|
70
|
+
The config is validated at load time. The bridge will report and skip servers with:
|
|
71
|
+
|
|
72
|
+
- Missing or invalid `servers` object
|
|
73
|
+
- Entries that have neither `url` nor `command`
|
|
74
|
+
- Entries that have **both** `url` and `command` (ambiguous transport)
|
|
75
|
+
- Invalid URLs, non-object `headers`/`env`, non-array `args`, non-positive `timeout`
|
|
76
|
+
|
|
77
|
+
Valid servers connect normally even if other entries fail validation.
|
|
78
|
+
|
|
79
|
+
## Secret management
|
|
80
|
+
|
|
81
|
+
Environment variables in `${...}` are resolved via `process.env` at connect time. Use the **00-secrets** extension to populate secrets from keychains, CLI tools, or other backends.
|
|
82
|
+
|
|
83
|
+
This extension declares `GITHUB_TOKEN` via the `@secret` annotation. To configure:
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
/secrets configure GITHUB_TOKEN
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Or add a recipe to `~/.pi/agent/secrets.json`:
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"GITHUB_TOKEN": "!gh auth token"
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
When adding a server via `/mcp add`, the flow checks whether referenced secrets are available and directs you to `/secrets configure` if they're missing.
|
|
98
|
+
|
|
99
|
+
## Commands
|
|
100
|
+
|
|
101
|
+
| Command | Description |
|
|
102
|
+
|---------|-------------|
|
|
103
|
+
| `/mcp` or `/mcp list` | Show all servers: status, transport, tool count, config source, secret status |
|
|
104
|
+
| `/mcp add` | Guided interactive setup — transport, URL/command, auth, scope |
|
|
105
|
+
| `/mcp remove [name]` | Remove a server from user or project config (interactive picker if no name) |
|
|
106
|
+
| `/mcp test [name]` | Test connection to a server without registering tools |
|
|
107
|
+
| `/mcp reconnect [name]` | Tear down and reconnect a live server |
|
|
108
|
+
|
|
109
|
+
### `/mcp add` flow
|
|
110
|
+
|
|
111
|
+
1. **Transport** — HTTP (remote) or Stdio (local process)
|
|
112
|
+
2. **Endpoint** — URL for HTTP, command for Stdio
|
|
113
|
+
3. **Name** — auto-suggested from URL hostname or command name
|
|
114
|
+
4. **Auth** — Bearer token, API key header, or none (HTTP only)
|
|
115
|
+
5. **Scope** — user-level (`~/.pi/agent/mcp.json`) or project-level (`.pi/mcp.json`)
|
|
116
|
+
6. **Secrets check** — warns if referenced secrets aren't configured
|
|
117
|
+
7. **Reload** — offers to reload pi so the new server's tools are available immediately
|
|
118
|
+
|
|
119
|
+
## Architecture
|
|
120
|
+
|
|
121
|
+
### Config resolution
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
1. Read .pi/mcp.json (project) ← highest priority
|
|
125
|
+
2. Read ~/.pi/agent/mcp.json (user)
|
|
126
|
+
3. Read <extension>/mcp.json (bundled)
|
|
127
|
+
4. Merge: later layers overwrite earlier on name collision
|
|
128
|
+
5. Validate all entries
|
|
129
|
+
6. Connect valid servers in parallel
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
The bundled `mcp.json` ships empty. Server-specific configs belong in user or project scope — not in the extension repo.
|
|
133
|
+
|
|
134
|
+
### Extension lifecycle
|
|
135
|
+
|
|
136
|
+
Understanding when tools are registered is critical:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
1. pi loads extension, calls async factory() ← tools registered HERE
|
|
140
|
+
2. pi snapshots tool registry (getAllRegisteredTools)
|
|
141
|
+
3. pi fires session_start event ← too late for registerTool
|
|
142
|
+
4. agent loop begins with snapshotted tools
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
The bridge connects to all MCP servers and calls `pi.registerTool()` inside the **async factory** — not in `session_start`. This is a hard requirement: pi snapshots the tool registry after factories complete, so tools registered in `session_start` exist in the extension's internal Map but are invisible to the agent.
|
|
146
|
+
|
|
147
|
+
When `/mcp add` adds a new server, it writes the config and offers `ctx.reload()` which re-runs the factory with the updated config.
|
|
148
|
+
|
|
149
|
+
### Tool execution flow
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
agent calls mcp_scribe_list_partnerships(params)
|
|
153
|
+
→ execute() reads servers["scribe"] (live reference, not captured)
|
|
154
|
+
→ client.callTool({ name: "list_partnerships", arguments: params })
|
|
155
|
+
→ extractText(result) → return to agent
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
If the server reference has been replaced by a reconnect, the execute closure picks up the new one automatically because it reads from the `servers` object on every call.
|
|
159
|
+
|
|
160
|
+
### Error classification
|
|
161
|
+
|
|
162
|
+
Errors from `callTool` are classified into three buckets:
|
|
163
|
+
|
|
164
|
+
| Type | Detection | Action |
|
|
165
|
+
|------|-----------|--------|
|
|
166
|
+
| **Auth** (401/403) | `isAuthError()` — status codes, HTTP status in message, keyword patterns | Return remediation message. Skip reconnect (expired tokens can't be fixed by reconnecting). |
|
|
167
|
+
| **Transport** (connection lost) | `isTransportError()` — ECONNREFUSED, fetch failed, not connected, ECONNRESET | Attempt one reconnect + retry. Deduplicate concurrent reconnect attempts via mutex Map. |
|
|
168
|
+
| **Other** | Neither auth nor transport | Return error message directly. |
|
|
169
|
+
|
|
170
|
+
Auth and transport errors are mutually exclusive by design (tested).
|
|
171
|
+
|
|
172
|
+
### Reconnection
|
|
173
|
+
|
|
174
|
+
On transport errors, the bridge:
|
|
175
|
+
|
|
176
|
+
1. Checks the `reconnecting` Map — if a reconnect is already in flight for this server, awaits the existing promise (no duplicate connections)
|
|
177
|
+
2. Tears down the old client
|
|
178
|
+
3. Creates a fresh connection with the same config
|
|
179
|
+
4. Retries the original `callTool`
|
|
180
|
+
5. If the retry also fails with an auth error, returns remediation guidance
|
|
181
|
+
|
|
182
|
+
## Behavior summary
|
|
183
|
+
|
|
184
|
+
- **Layered config**: Project > User > Bundled, merged by server name
|
|
185
|
+
- **Parallel connection**: All servers connect concurrently during the factory phase. One slow/failing server does not block others (`Promise.allSettled`).
|
|
186
|
+
- **Timeouts**: Each connection has an independent timeout (default 15s, configurable via `timeout`). Timed-out transports are closed to prevent leaked child processes or HTTP connections.
|
|
187
|
+
- **Config validation**: All config files are validated before any connections are attempted. Invalid entries are reported; valid entries proceed.
|
|
188
|
+
- **Auth error detection**: 401/403 responses short-circuit reconnect and return actionable guidance.
|
|
189
|
+
- **Tool naming**: Tools are registered as `mcp_{server}_{tool}`, e.g., `mcp_scribe_list_partnerships`.
|
|
190
|
+
- **Shutdown**: All client connections are closed on `session_shutdown`.
|
|
191
|
+
- **Secrets awareness**: `/mcp list` and `/mcp add` check `process.env` for referenced secrets and direct to `/secrets configure` when missing.
|
|
192
|
+
|
|
193
|
+
## File structure
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
extensions/mcp-bridge/
|
|
197
|
+
├── index.ts # Extension factory — connection, registration, lifecycle, commands
|
|
198
|
+
├── lib.ts # Pure functions — config types, validation, error classification, layered loading
|
|
199
|
+
├── lib.test.ts # Unit tests (run: npx tsx --test extensions/mcp-bridge/lib.test.ts)
|
|
200
|
+
├── mcp.json # Bundled server config (ships empty — user/project configs are preferred)
|
|
201
|
+
├── package.json # Extension manifest + SDK dependency
|
|
202
|
+
└── README.md
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
User config: `~/.pi/agent/mcp.json`
|
|
206
|
+
Project config: `.pi/mcp.json`
|
|
207
|
+
|
|
208
|
+
## Dependencies
|
|
209
|
+
|
|
210
|
+
- `@modelcontextprotocol/sdk` — MCP client, transports (stdio + Streamable HTTP)
|
|
211
|
+
- `@sinclair/typebox` — provided by pi (virtual module)
|
|
212
|
+
- `@mariozechner/pi-coding-agent` — provided by pi (virtual module)
|
|
213
|
+
|
|
214
|
+
The SDK is declared in `package.json` and installed by pi's package manager (`npm install` at the Omegon root after `git pull`).
|
|
215
|
+
|
|
216
|
+
## Known limitations
|
|
217
|
+
|
|
218
|
+
- **Token refresh**: `gho_` tokens (from `gh auth token`) expire after ~8h. The bridge resolves `${GITHUB_TOKEN}` once at startup. A long-lived session will eventually hit 401s. Workaround: restart pi. A proper fix would require TTL-based re-resolution in `00-secrets`.
|
|
219
|
+
- **No late tool registration**: Pi's tool registry is snapshotted once. If an MCP server adds tools after initial connection (`tools/listChanged`), the bridge cannot register them without a full pi restart. `/mcp add` works around this by offering `ctx.reload()`.
|
|
220
|
+
- **Reconnect does not re-register tools**: Reconnection replaces the client/transport but the tool set is fixed from the initial `listTools()` call during the factory.
|