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.
Files changed (160) hide show
  1. package/.gitattributes +3 -0
  2. package/AGENTS.md +16 -0
  3. package/LICENSE +15 -0
  4. package/README.md +289 -0
  5. package/bin/pi.mjs +30 -0
  6. package/extensions/00-secrets/index.ts +1126 -0
  7. package/extensions/01-auth/auth.ts +401 -0
  8. package/extensions/01-auth/index.ts +289 -0
  9. package/extensions/auto-compact.ts +42 -0
  10. package/extensions/bootstrap/deps.ts +291 -0
  11. package/extensions/bootstrap/index.ts +811 -0
  12. package/extensions/chronos/chronos.sh +487 -0
  13. package/extensions/chronos/index.ts +148 -0
  14. package/extensions/cleave/assessment.ts +754 -0
  15. package/extensions/cleave/bridge.ts +31 -0
  16. package/extensions/cleave/conflicts.ts +250 -0
  17. package/extensions/cleave/dispatcher.ts +808 -0
  18. package/extensions/cleave/guardrails.ts +426 -0
  19. package/extensions/cleave/index.ts +3121 -0
  20. package/extensions/cleave/lifecycle-emitter.ts +20 -0
  21. package/extensions/cleave/openspec.ts +811 -0
  22. package/extensions/cleave/planner.ts +260 -0
  23. package/extensions/cleave/review.ts +579 -0
  24. package/extensions/cleave/skills.ts +355 -0
  25. package/extensions/cleave/types.ts +261 -0
  26. package/extensions/cleave/workspace.ts +861 -0
  27. package/extensions/cleave/worktree.ts +243 -0
  28. package/extensions/core-renderers.ts +253 -0
  29. package/extensions/dashboard/context-gauge.ts +58 -0
  30. package/extensions/dashboard/file-watch.ts +14 -0
  31. package/extensions/dashboard/footer.ts +1145 -0
  32. package/extensions/dashboard/git.ts +185 -0
  33. package/extensions/dashboard/index.ts +478 -0
  34. package/extensions/dashboard/memory-audit.ts +34 -0
  35. package/extensions/dashboard/overlay-data.ts +705 -0
  36. package/extensions/dashboard/overlay.ts +365 -0
  37. package/extensions/dashboard/render-utils.ts +54 -0
  38. package/extensions/dashboard/types.ts +191 -0
  39. package/extensions/dashboard/uri-helper.ts +45 -0
  40. package/extensions/debug.ts +69 -0
  41. package/extensions/defaults.ts +282 -0
  42. package/extensions/design-tree/dashboard-state.ts +161 -0
  43. package/extensions/design-tree/design-card.ts +362 -0
  44. package/extensions/design-tree/index.ts +2130 -0
  45. package/extensions/design-tree/lifecycle-emitter.ts +41 -0
  46. package/extensions/design-tree/tree.ts +1607 -0
  47. package/extensions/design-tree/types.ts +163 -0
  48. package/extensions/distill.ts +127 -0
  49. package/extensions/effort/index.ts +395 -0
  50. package/extensions/effort/tiers.ts +146 -0
  51. package/extensions/effort/types.ts +105 -0
  52. package/extensions/lib/git-state.ts +227 -0
  53. package/extensions/lib/local-models.ts +157 -0
  54. package/extensions/lib/model-preferences.ts +51 -0
  55. package/extensions/lib/model-routing.ts +720 -0
  56. package/extensions/lib/operator-fallback.ts +205 -0
  57. package/extensions/lib/operator-profile.ts +360 -0
  58. package/extensions/lib/slash-command-bridge.ts +253 -0
  59. package/extensions/lib/typebox-helpers.ts +16 -0
  60. package/extensions/local-inference/index.ts +727 -0
  61. package/extensions/mcp-bridge/README.md +220 -0
  62. package/extensions/mcp-bridge/index.ts +951 -0
  63. package/extensions/mcp-bridge/lib.ts +365 -0
  64. package/extensions/mcp-bridge/mcp.json +3 -0
  65. package/extensions/mcp-bridge/package.json +11 -0
  66. package/extensions/model-budget.ts +752 -0
  67. package/extensions/offline-driver.ts +403 -0
  68. package/extensions/openspec/archive-gate.ts +164 -0
  69. package/extensions/openspec/branch-cleanup.ts +64 -0
  70. package/extensions/openspec/dashboard-state.ts +50 -0
  71. package/extensions/openspec/index.ts +1917 -0
  72. package/extensions/openspec/lifecycle-emitter.ts +65 -0
  73. package/extensions/openspec/lifecycle-files.ts +70 -0
  74. package/extensions/openspec/lifecycle.ts +50 -0
  75. package/extensions/openspec/reconcile.ts +187 -0
  76. package/extensions/openspec/spec.ts +1385 -0
  77. package/extensions/openspec/types.ts +98 -0
  78. package/extensions/project-memory/DESIGN-global-mind.md +198 -0
  79. package/extensions/project-memory/README.md +202 -0
  80. package/extensions/project-memory/api-types.ts +382 -0
  81. package/extensions/project-memory/compaction-policy.ts +29 -0
  82. package/extensions/project-memory/core.ts +164 -0
  83. package/extensions/project-memory/embeddings.ts +230 -0
  84. package/extensions/project-memory/extraction-v2.ts +861 -0
  85. package/extensions/project-memory/factstore.ts +2177 -0
  86. package/extensions/project-memory/index.ts +3459 -0
  87. package/extensions/project-memory/injection-metrics.ts +91 -0
  88. package/extensions/project-memory/jsonl-io.ts +12 -0
  89. package/extensions/project-memory/lifecycle.ts +331 -0
  90. package/extensions/project-memory/migration.ts +293 -0
  91. package/extensions/project-memory/package.json +9 -0
  92. package/extensions/project-memory/sci-renderers.ts +7 -0
  93. package/extensions/project-memory/template.ts +103 -0
  94. package/extensions/project-memory/triggers.ts +52 -0
  95. package/extensions/project-memory/types.ts +102 -0
  96. package/extensions/render/composition/fonts/Inter-Bold.ttf +0 -0
  97. package/extensions/render/composition/fonts/Inter-Regular.ttf +0 -0
  98. package/extensions/render/composition/fonts/Tomorrow-Bold.ttf +0 -0
  99. package/extensions/render/composition/fonts/Tomorrow-Regular.ttf +0 -0
  100. package/extensions/render/composition/package-lock.json +534 -0
  101. package/extensions/render/composition/package.json +22 -0
  102. package/extensions/render/composition/render.mjs +246 -0
  103. package/extensions/render/composition/test-comp.tsx +87 -0
  104. package/extensions/render/composition/types.ts +24 -0
  105. package/extensions/render/excalidraw/UPSTREAM.md +81 -0
  106. package/extensions/render/excalidraw/elements.ts +764 -0
  107. package/extensions/render/excalidraw/index.ts +66 -0
  108. package/extensions/render/excalidraw/types.ts +223 -0
  109. package/extensions/render/excalidraw-renderer/pyproject.toml +8 -0
  110. package/extensions/render/excalidraw-renderer/render_excalidraw.py +182 -0
  111. package/extensions/render/excalidraw-renderer/render_template.html +59 -0
  112. package/extensions/render/index.ts +830 -0
  113. package/extensions/render/native-diagrams/index.ts +57 -0
  114. package/extensions/render/native-diagrams/motifs.ts +542 -0
  115. package/extensions/render/native-diagrams/raster.ts +8 -0
  116. package/extensions/render/native-diagrams/scene.ts +75 -0
  117. package/extensions/render/native-diagrams/spec.ts +204 -0
  118. package/extensions/render/native-diagrams/svg.ts +116 -0
  119. package/extensions/sci-ui.ts +304 -0
  120. package/extensions/session-log.ts +174 -0
  121. package/extensions/shared-state.ts +146 -0
  122. package/extensions/spinner-verbs.ts +91 -0
  123. package/extensions/style.ts +281 -0
  124. package/extensions/terminal-title.ts +191 -0
  125. package/extensions/tool-profile/index.ts +291 -0
  126. package/extensions/tool-profile/profiles.ts +290 -0
  127. package/extensions/types.d.ts +9 -0
  128. package/extensions/vault/index.ts +185 -0
  129. package/extensions/version-check.ts +90 -0
  130. package/extensions/view/index.ts +859 -0
  131. package/extensions/view/uri-resolver.ts +148 -0
  132. package/extensions/web-search/index.ts +182 -0
  133. package/extensions/web-search/providers.ts +121 -0
  134. package/extensions/web-ui/index.ts +110 -0
  135. package/extensions/web-ui/server.ts +265 -0
  136. package/extensions/web-ui/state.ts +462 -0
  137. package/extensions/web-ui/static/index.html +145 -0
  138. package/extensions/web-ui/types.ts +284 -0
  139. package/package.json +76 -0
  140. package/prompts/init.md +75 -0
  141. package/prompts/new-repo.md +54 -0
  142. package/prompts/oci-login.md +56 -0
  143. package/prompts/status.md +50 -0
  144. package/settings.json +4 -0
  145. package/skills/cleave/SKILL.md +218 -0
  146. package/skills/git/SKILL.md +209 -0
  147. package/skills/git/_reference/ci-validation.md +204 -0
  148. package/skills/oci/SKILL.md +338 -0
  149. package/skills/openspec/SKILL.md +346 -0
  150. package/skills/pi-extensions/SKILL.md +191 -0
  151. package/skills/pi-tui/SKILL.md +517 -0
  152. package/skills/python/SKILL.md +189 -0
  153. package/skills/rust/SKILL.md +268 -0
  154. package/skills/security/SKILL.md +206 -0
  155. package/skills/style/SKILL.md +264 -0
  156. package/skills/typescript/SKILL.md +225 -0
  157. package/skills/vault/SKILL.md +102 -0
  158. package/themes/alpharius-legacy.json +85 -0
  159. package/themes/alpharius.conf +59 -0
  160. 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.