aicodeman 1.33.3 → 1.34.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 (198) hide show
  1. package/dist/config/cli-registry/schema.d.ts +18 -0
  2. package/dist/config/cli-registry/schema.d.ts.map +1 -1
  3. package/dist/config/cli-registry/schema.js +27 -0
  4. package/dist/config/cli-registry/schema.js.map +1 -1
  5. package/dist/config/cli-registry/stock.d.ts.map +1 -1
  6. package/dist/config/cli-registry/stock.js +35 -0
  7. package/dist/config/cli-registry/stock.js.map +1 -1
  8. package/dist/config/cli-registry/types.d.ts +33 -0
  9. package/dist/config/cli-registry/types.d.ts.map +1 -1
  10. package/dist/hooks-config.d.ts.map +1 -1
  11. package/dist/hooks-config.js +5 -1
  12. package/dist/hooks-config.js.map +1 -1
  13. package/dist/mcp-sync.d.ts +105 -0
  14. package/dist/mcp-sync.d.ts.map +1 -0
  15. package/dist/mcp-sync.js +619 -0
  16. package/dist/mcp-sync.js.map +1 -0
  17. package/dist/mux-interface.d.ts +4 -0
  18. package/dist/mux-interface.d.ts.map +1 -1
  19. package/dist/session-cli-builder.d.ts +20 -1
  20. package/dist/session-cli-builder.d.ts.map +1 -1
  21. package/dist/session-cli-builder.js +33 -3
  22. package/dist/session-cli-builder.js.map +1 -1
  23. package/dist/session-cli-registry-bridge.d.ts +2 -0
  24. package/dist/session-cli-registry-bridge.d.ts.map +1 -1
  25. package/dist/session-cli-registry-bridge.js +15 -8
  26. package/dist/session-cli-registry-bridge.js.map +1 -1
  27. package/dist/session.d.ts +19 -0
  28. package/dist/session.d.ts.map +1 -1
  29. package/dist/session.js +29 -2
  30. package/dist/session.js.map +1 -1
  31. package/dist/tmux-manager.d.ts +2 -0
  32. package/dist/tmux-manager.d.ts.map +1 -1
  33. package/dist/tmux-manager.js +4 -2
  34. package/dist/tmux-manager.js.map +1 -1
  35. package/dist/types/index.d.ts +3 -1
  36. package/dist/types/index.d.ts.map +1 -1
  37. package/dist/types/index.js +3 -1
  38. package/dist/types/index.js.map +1 -1
  39. package/dist/types/mcp-sync.d.ts +40 -0
  40. package/dist/types/mcp-sync.d.ts.map +1 -0
  41. package/dist/types/mcp-sync.js +8 -0
  42. package/dist/types/mcp-sync.js.map +1 -0
  43. package/dist/types/push.d.ts +37 -2
  44. package/dist/types/push.d.ts.map +1 -1
  45. package/dist/types/push.js +10 -3
  46. package/dist/types/push.js.map +1 -1
  47. package/dist/types/session.d.ts +34 -1
  48. package/dist/types/session.d.ts.map +1 -1
  49. package/dist/types/session.js +25 -1
  50. package/dist/types/session.js.map +1 -1
  51. package/dist/web/public/admin-ui.js.gz +0 -0
  52. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  53. package/dist/web/public/app.cf0db8ce.js +43 -0
  54. package/dist/web/public/app.cf0db8ce.js.br +0 -0
  55. package/dist/web/public/app.cf0db8ce.js.gz +0 -0
  56. package/dist/web/public/approvals-ui.js.gz +0 -0
  57. package/dist/web/public/constants.d95fade9.js.gz +0 -0
  58. package/dist/web/public/cron-ui.js.gz +0 -0
  59. package/dist/web/public/entrance-animations.js.gz +0 -0
  60. package/dist/web/public/home-sessions.js.gz +0 -0
  61. package/dist/web/public/host-wake-ui.js.gz +0 -0
  62. package/dist/web/public/i18n.398b8331.js +1 -0
  63. package/dist/web/public/i18n.398b8331.js.br +0 -0
  64. package/dist/web/public/i18n.398b8331.js.gz +0 -0
  65. package/dist/web/public/image-input.a216cf9e.js.gz +0 -0
  66. package/dist/web/public/index.html +118 -10
  67. package/dist/web/public/index.html.br +0 -0
  68. package/dist/web/public/index.html.gz +0 -0
  69. package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
  70. package/dist/web/public/keyboard-accessory.c1e7c7b7.js.gz +0 -0
  71. package/dist/web/public/mobile-handlers.23a85db1.js.gz +0 -0
  72. package/dist/web/public/mobile-ime-preview.2dbaf262.js +1 -0
  73. package/dist/web/public/mobile-ime-preview.2dbaf262.js.br +0 -0
  74. package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
  75. package/dist/web/public/mobile-overview.js.gz +0 -0
  76. package/dist/web/public/mobile.1aa4952d.css.gz +0 -0
  77. package/dist/web/public/notification-manager.50bb87d8.js.gz +0 -0
  78. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  79. package/dist/web/public/panels-ui.6a5898d9.js.gz +0 -0
  80. package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
  81. package/dist/web/public/{ralph-wizard.13a1831e.js → ralph-wizard.b6c0dd19.js} +2 -0
  82. package/dist/web/public/ralph-wizard.b6c0dd19.js.br +0 -0
  83. package/dist/web/public/{ralph-wizard.13a1831e.js.gz → ralph-wizard.b6c0dd19.js.gz} +0 -0
  84. package/dist/web/public/readmymind-ui.js.gz +0 -0
  85. package/dist/web/public/reboot-restore-ui.js.gz +0 -0
  86. package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
  87. package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
  88. package/dist/web/public/session-lineage.js +27 -11
  89. package/dist/web/public/session-lineage.js.br +0 -0
  90. package/dist/web/public/session-lineage.js.gz +0 -0
  91. package/dist/web/public/{session-ui.7575a231.js → session-ui.bf66c13b.js} +4 -4
  92. package/dist/web/public/session-ui.bf66c13b.js.br +0 -0
  93. package/dist/web/public/session-ui.bf66c13b.js.gz +0 -0
  94. package/dist/web/public/{settings-ui.c68e7f59.js → settings-ui.331d3b1d.js} +12 -10
  95. package/dist/web/public/settings-ui.331d3b1d.js.br +0 -0
  96. package/dist/web/public/settings-ui.331d3b1d.js.gz +0 -0
  97. package/dist/web/public/styles.8c485d26.css +1 -0
  98. package/dist/web/public/styles.8c485d26.css.br +0 -0
  99. package/dist/web/public/styles.8c485d26.css.gz +0 -0
  100. package/dist/web/public/subagent-windows.e6ca799f.js.gz +0 -0
  101. package/dist/web/public/sw.js +2 -2
  102. package/dist/web/public/sw.js.br +0 -0
  103. package/dist/web/public/sw.js.gz +0 -0
  104. package/dist/web/public/tab-layout-browser.4e0ed50c.js +1 -0
  105. package/dist/web/public/tab-layout-browser.4e0ed50c.js.br +0 -0
  106. package/dist/web/public/tab-layout-browser.4e0ed50c.js.gz +0 -0
  107. package/dist/web/public/tab-rail-resize.dcdc5772.js.gz +0 -0
  108. package/dist/web/public/terminal-keycode229-recovery.fb91b25b.js.gz +0 -0
  109. package/dist/web/public/terminal-split.js +82 -34
  110. package/dist/web/public/terminal-split.js.br +0 -0
  111. package/dist/web/public/terminal-split.js.gz +0 -0
  112. package/dist/web/public/terminal-ui.a4535311.js +2 -0
  113. package/dist/web/public/terminal-ui.a4535311.js.br +0 -0
  114. package/dist/web/public/terminal-ui.a4535311.js.gz +0 -0
  115. package/dist/web/public/ultracode-panel.js.gz +0 -0
  116. package/dist/web/public/ultracode-windows.js.gz +0 -0
  117. package/dist/web/public/upload.html.gz +0 -0
  118. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  119. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  120. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  121. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  122. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  123. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  124. package/dist/web/public/vendor/{xterm-predictive-echo.bd6882b8.js → xterm-predictive-echo.ae5e3d5d.js} +1 -1
  125. package/dist/web/public/vendor/{xterm-predictive-echo.bd6882b8.js.br → xterm-predictive-echo.ae5e3d5d.js.br} +0 -0
  126. package/dist/web/public/vendor/{xterm-predictive-echo.bd6882b8.js.gz → xterm-predictive-echo.ae5e3d5d.js.gz} +0 -0
  127. package/dist/web/public/vendor/xterm-zerolag-input.bbb5f84c.js +4 -0
  128. package/dist/web/public/vendor/xterm-zerolag-input.bbb5f84c.js.br +0 -0
  129. package/dist/web/public/vendor/xterm-zerolag-input.bbb5f84c.js.gz +0 -0
  130. package/dist/web/public/vendor/xterm.css.gz +0 -0
  131. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  132. package/dist/web/public/voice-input.c4b51eb6.js.gz +0 -0
  133. package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
  134. package/dist/web/public/webview-tabs.js +21 -10
  135. package/dist/web/public/webview-tabs.js.br +0 -0
  136. package/dist/web/public/webview-tabs.js.gz +0 -0
  137. package/dist/web/reboot-restore-registry.d.ts +2 -1
  138. package/dist/web/reboot-restore-registry.d.ts.map +1 -1
  139. package/dist/web/reboot-restore-registry.js +2 -1
  140. package/dist/web/reboot-restore-registry.js.map +1 -1
  141. package/dist/web/routes/index.d.ts +2 -0
  142. package/dist/web/routes/index.d.ts.map +1 -1
  143. package/dist/web/routes/index.js +2 -0
  144. package/dist/web/routes/index.js.map +1 -1
  145. package/dist/web/routes/mcp-sync-routes.d.ts +29 -0
  146. package/dist/web/routes/mcp-sync-routes.d.ts.map +1 -0
  147. package/dist/web/routes/mcp-sync-routes.js +83 -0
  148. package/dist/web/routes/mcp-sync-routes.js.map +1 -0
  149. package/dist/web/routes/ralph-routes.d.ts.map +1 -1
  150. package/dist/web/routes/ralph-routes.js +2 -1
  151. package/dist/web/routes/ralph-routes.js.map +1 -1
  152. package/dist/web/routes/reboot-restore-routes.d.ts.map +1 -1
  153. package/dist/web/routes/reboot-restore-routes.js +2 -0
  154. package/dist/web/routes/reboot-restore-routes.js.map +1 -1
  155. package/dist/web/routes/session-routes.d.ts.map +1 -1
  156. package/dist/web/routes/session-routes.js +40 -17
  157. package/dist/web/routes/session-routes.js.map +1 -1
  158. package/dist/web/routes/webhook-routes.d.ts +21 -0
  159. package/dist/web/routes/webhook-routes.d.ts.map +1 -0
  160. package/dist/web/routes/webhook-routes.js +87 -0
  161. package/dist/web/routes/webhook-routes.js.map +1 -0
  162. package/dist/web/schemas.d.ts +47 -2
  163. package/dist/web/schemas.d.ts.map +1 -1
  164. package/dist/web/schemas.js +64 -0
  165. package/dist/web/schemas.js.map +1 -1
  166. package/dist/web/server.d.ts +4 -0
  167. package/dist/web/server.d.ts.map +1 -1
  168. package/dist/web/server.js +55 -25
  169. package/dist/web/server.js.map +1 -1
  170. package/dist/webhook-notify.d.ts +71 -0
  171. package/dist/webhook-notify.d.ts.map +1 -0
  172. package/dist/webhook-notify.js +282 -0
  173. package/dist/webhook-notify.js.map +1 -0
  174. package/package.json +2 -1
  175. package/skills/codeman/SKILL.md +26 -8
  176. package/skills/codeman/preamble.sh +16 -4
  177. package/skills/codeman/reference/endpoints.md +11 -3
  178. package/skills/codeman/reference/recipes.md +1 -1
  179. package/dist/web/public/app.0879466b.js +0 -43
  180. package/dist/web/public/app.0879466b.js.br +0 -0
  181. package/dist/web/public/app.0879466b.js.gz +0 -0
  182. package/dist/web/public/i18n.7f8be985.js +0 -1
  183. package/dist/web/public/i18n.7f8be985.js.br +0 -0
  184. package/dist/web/public/i18n.7f8be985.js.gz +0 -0
  185. package/dist/web/public/ralph-wizard.13a1831e.js.br +0 -0
  186. package/dist/web/public/session-ui.7575a231.js.br +0 -0
  187. package/dist/web/public/session-ui.7575a231.js.gz +0 -0
  188. package/dist/web/public/settings-ui.c68e7f59.js.br +0 -0
  189. package/dist/web/public/settings-ui.c68e7f59.js.gz +0 -0
  190. package/dist/web/public/styles.f2b78b86.css +0 -1
  191. package/dist/web/public/styles.f2b78b86.css.br +0 -0
  192. package/dist/web/public/styles.f2b78b86.css.gz +0 -0
  193. package/dist/web/public/terminal-ui.d5223c0e.js +0 -2
  194. package/dist/web/public/terminal-ui.d5223c0e.js.br +0 -0
  195. package/dist/web/public/terminal-ui.d5223c0e.js.gz +0 -0
  196. package/dist/web/public/vendor/xterm-zerolag-input.6fee72f2.js +0 -4
  197. package/dist/web/public/vendor/xterm-zerolag-input.6fee72f2.js.br +0 -0
  198. package/dist/web/public/vendor/xterm-zerolag-input.6fee72f2.js.gz +0 -0
@@ -0,0 +1,619 @@
1
+ /**
2
+ * @fileoverview MCP server sync between the enabled agent CLIs.
3
+ *
4
+ * Each CLI keeps its own user-level MCP list in its own dialect (`CliEntry.capabilities.mcpConfig`
5
+ * names the file and the dialect). This module reads every participating CLI's list into one
6
+ * neutral shape, and adds any server a CLI is missing from the others. The whole feature is
7
+ * opt-in (`mcpSyncEnabled`, default OFF; the route enforces it) because it writes OTHER tools'
8
+ * own user config.
9
+ *
10
+ * Deliberately conservative:
11
+ * - ADDITIVE only. A server already present under a name (in ANY shape, even one this module
12
+ * does not understand) is never rewritten and nothing is ever removed. Same name with a
13
+ * different definition is reported as a conflict and left alone.
14
+ * - A server the user has switched off in its own CLI (codex `enabled = false`, opencode
15
+ * `enabled: false`, antigravity `disabled: true`) is not propagated: copying it would
16
+ * switch it on in every other CLI.
17
+ * - A file that does not parse (e.g. opencode JSONC with comments, a TOML file with a
18
+ * duplicate table) is never written, and a write is only made after the NEW text has been
19
+ * parsed again and every added server comes back as intended.
20
+ * - Only the MCP table is touched; every other key in the file is preserved. Files are
21
+ * re-read immediately before the write and replaced via tmp+rename next to the REAL target
22
+ * (a symlinked dotfile stays a symlink), with the old file kept as `<file>.codeman-bak`
23
+ * (overwritten by each sync).
24
+ * - Copied servers can carry secrets in `env`/`headers`: a file that receives any is left
25
+ * readable by its owner only.
26
+ * - Servers a dialect cannot express (SSE for codex) are skipped and reported.
27
+ * - Only one apply runs at a time.
28
+ * - A CLI whose file was moved by its own env var (`mcpConfig.relocation`: `CODEX_HOME`,
29
+ * `CLAUDE_CONFIG_DIR`, ...) is followed there, as the SERVER env sets it; a relative value
30
+ * cannot be located safely, so that target is reported `skipped` and never written.
31
+ *
32
+ * The result types (src/types/mcp-sync.ts) never carry env values or headers: those commonly
33
+ * hold secrets and the result is returned over HTTP. For the same reason a parse failure is
34
+ * reported by position only (`describeMcpSyncError`): parsers quote the offending source.
35
+ *
36
+ * @module mcp-sync
37
+ */
38
+ import { promises as fs } from 'node:fs';
39
+ import { randomBytes } from 'node:crypto';
40
+ import { homedir } from 'node:os';
41
+ import { dirname, isAbsolute, join } from 'node:path';
42
+ import { parse as parseToml, TomlError } from 'smol-toml';
43
+ /** A second apply was requested while one was running. */
44
+ export class McpSyncBusyError extends Error {
45
+ constructor() {
46
+ super('An MCP sync is already running');
47
+ this.name = 'McpSyncBusyError';
48
+ }
49
+ }
50
+ /**
51
+ * An error whose message this module wrote itself. It names keys Codeman chose and server names
52
+ * (which the result reports anyway), never a value from the file, so it may be shown as is.
53
+ */
54
+ class McpConfigError extends Error {
55
+ constructor(message) {
56
+ super(message);
57
+ this.name = 'McpConfigError';
58
+ }
59
+ }
60
+ /**
61
+ * What a target's `error` may say. A parser's own message can quote the file: smol-toml's
62
+ * `TomlError` carries a code frame of the offending line and the one before it, and V8's JSON
63
+ * "Unexpected token" errors quote about ten characters of source. These files hold env values
64
+ * and headers and the result goes over HTTP, so a parse failure is reported by position only,
65
+ * an errno failure by Node's own message (code, syscall and path: no file content), and anything
66
+ * else by a fixed category.
67
+ */
68
+ function describeMcpSyncError(err) {
69
+ if (err instanceof McpConfigError)
70
+ return err.message;
71
+ if (err instanceof TomlError)
72
+ return `not valid TOML (line ${err.line}, column ${err.column})`;
73
+ if (err instanceof SyntaxError) {
74
+ const lc = /\(line (\d+) column (\d+)\)/.exec(err.message);
75
+ if (lc)
76
+ return `not valid JSON (line ${lc[1]}, column ${lc[2]})`;
77
+ const pos = /at position (\d+)/.exec(err.message);
78
+ return pos ? `not valid JSON (position ${pos[1]})` : 'not valid JSON';
79
+ }
80
+ const code = err?.code;
81
+ if (err instanceof Error && typeof code === 'string' && /^E[A-Z0-9]+$/.test(code))
82
+ return err.message;
83
+ return 'unexpected error';
84
+ }
85
+ // ---------------------------------------------------------------------------
86
+ // Helpers
87
+ // ---------------------------------------------------------------------------
88
+ const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
89
+ /** Names that would reach Object.prototype through a plain-object table (`out[name] = ...`). */
90
+ const UNSAFE_NAMES = new Set(['__proto__', 'constructor', 'prototype']);
91
+ /** A table keyed by untrusted names: no prototype, so `toString`/`hasOwnProperty` are ordinary keys. */
92
+ function dict() {
93
+ return Object.create(null);
94
+ }
95
+ /** Own, safe keys of an untrusted table. */
96
+ function safeKeys(table) {
97
+ return Object.keys(table).filter((k) => !UNSAFE_NAMES.has(k));
98
+ }
99
+ function strMap(v) {
100
+ if (!isRecord(v))
101
+ return undefined;
102
+ const out = dict();
103
+ for (const k of safeKeys(v))
104
+ if (typeof v[k] === 'string')
105
+ out[k] = v[k];
106
+ return Object.keys(out).length ? out : undefined;
107
+ }
108
+ function strArr(v) {
109
+ return Array.isArray(v) && v.every((x) => typeof x === 'string') ? v : undefined;
110
+ }
111
+ /** Drop undefined/empty fields so equal servers compare equal. */
112
+ function clean(s) {
113
+ const out = { transport: s.transport };
114
+ if (s.command)
115
+ out.command = s.command;
116
+ if (s.args?.length)
117
+ out.args = s.args;
118
+ if (s.env && Object.keys(s.env).length)
119
+ out.env = s.env;
120
+ if (s.cwd)
121
+ out.cwd = s.cwd;
122
+ if (s.url)
123
+ out.url = s.url;
124
+ if (s.headers && Object.keys(s.headers).length)
125
+ out.headers = s.headers;
126
+ if (s.disabled)
127
+ out.disabled = true;
128
+ return out;
129
+ }
130
+ const sortedEntries = (m) => Object.entries(m ?? {}).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
131
+ /** Identity for conflict detection: what the server runs/connects to, not how it is spelled. */
132
+ function fingerprint(s) {
133
+ const t = s.transport === 'stdio' ? 'stdio' : 'url';
134
+ return JSON.stringify([t, s.command ?? null, s.args ?? [], s.url ?? null]);
135
+ }
136
+ /** Fingerprint plus the secrets-bearing maps: what must survive a write unchanged. */
137
+ function fullIdentity(s) {
138
+ return JSON.stringify([fingerprint(s), sortedEntries(s.env), sortedEntries(s.headers)]);
139
+ }
140
+ const carriesSecrets = (m) => Object.values(m).some((s) => s.env || s.headers);
141
+ // ---------------------------------------------------------------------------
142
+ // JSON dialects
143
+ // ---------------------------------------------------------------------------
144
+ function fromClaude(raw) {
145
+ if (!isRecord(raw))
146
+ return null;
147
+ const type = raw.type;
148
+ if ((type === 'http' || type === 'sse') && typeof raw.url === 'string') {
149
+ return clean({ transport: type, url: raw.url, headers: strMap(raw.headers) });
150
+ }
151
+ if (typeof raw.command === 'string') {
152
+ return clean({ transport: 'stdio', command: raw.command, args: strArr(raw.args), env: strMap(raw.env) });
153
+ }
154
+ return null;
155
+ }
156
+ function toClaude(s) {
157
+ if (s.transport === 'stdio')
158
+ return { type: 'stdio', command: s.command, args: s.args ?? [], env: s.env ?? {} };
159
+ return { type: s.transport, url: s.url, ...(s.headers ? { headers: s.headers } : {}) };
160
+ }
161
+ function fromGemini(raw) {
162
+ if (!isRecord(raw))
163
+ return null;
164
+ // `httpUrl` is the legacy streamable-http key; `url` + `type` is what `gemini mcp add` writes
165
+ // today, and a bare `url` with no type is the legacy SSE form.
166
+ if (typeof raw.httpUrl === 'string')
167
+ return clean({ transport: 'http', url: raw.httpUrl, headers: strMap(raw.headers) });
168
+ if (typeof raw.url === 'string') {
169
+ return clean({ transport: raw.type === 'http' ? 'http' : 'sse', url: raw.url, headers: strMap(raw.headers) });
170
+ }
171
+ if (typeof raw.command === 'string') {
172
+ return clean({
173
+ transport: 'stdio',
174
+ command: raw.command,
175
+ args: strArr(raw.args),
176
+ env: strMap(raw.env),
177
+ cwd: typeof raw.cwd === 'string' ? raw.cwd : undefined,
178
+ });
179
+ }
180
+ return null;
181
+ }
182
+ function toGemini(s) {
183
+ if (s.transport === 'stdio') {
184
+ return {
185
+ command: s.command,
186
+ args: s.args ?? [],
187
+ ...(s.env ? { env: s.env } : {}),
188
+ ...(s.cwd ? { cwd: s.cwd } : {}),
189
+ };
190
+ }
191
+ return { url: s.url, type: s.transport, ...(s.headers ? { headers: s.headers } : {}) };
192
+ }
193
+ /** Antigravity (`agy mcp add`): stdio or http only; http servers use `serverUrl`. */
194
+ function fromAntigravity(raw) {
195
+ if (!isRecord(raw))
196
+ return null;
197
+ const disabled = raw.disabled === true;
198
+ if (typeof raw.serverUrl === 'string')
199
+ return clean({ transport: 'http', url: raw.serverUrl, headers: strMap(raw.headers), disabled });
200
+ if (typeof raw.command === 'string') {
201
+ return clean({
202
+ transport: 'stdio',
203
+ command: raw.command,
204
+ args: strArr(raw.args),
205
+ env: strMap(raw.env),
206
+ disabled,
207
+ });
208
+ }
209
+ return null;
210
+ }
211
+ function toAntigravity(s) {
212
+ if (s.transport === 'sse')
213
+ return null;
214
+ if (s.transport === 'stdio') {
215
+ return { command: s.command, args: s.args ?? [], ...(s.env ? { env: s.env } : {}), disabled: false };
216
+ }
217
+ return { serverUrl: s.url, ...(s.headers ? { headers: s.headers } : {}), disabled: false };
218
+ }
219
+ function fromOpencode(raw) {
220
+ if (!isRecord(raw))
221
+ return null;
222
+ const disabled = raw.enabled === false;
223
+ if (raw.type === 'remote' && typeof raw.url === 'string') {
224
+ return clean({ transport: 'http', url: raw.url, headers: strMap(raw.headers), disabled });
225
+ }
226
+ if (raw.type === 'local') {
227
+ const cmd = strArr(raw.command);
228
+ if (!cmd?.length)
229
+ return null;
230
+ return clean({
231
+ transport: 'stdio',
232
+ command: cmd[0],
233
+ args: cmd.slice(1),
234
+ env: strMap(raw.environment),
235
+ disabled,
236
+ });
237
+ }
238
+ return null;
239
+ }
240
+ function toOpencode(s) {
241
+ if (s.transport === 'stdio') {
242
+ return {
243
+ type: 'local',
244
+ command: [s.command, ...(s.args ?? [])],
245
+ ...(s.env ? { environment: s.env } : {}),
246
+ enabled: true,
247
+ };
248
+ }
249
+ return { type: 'remote', url: s.url, ...(s.headers ? { headers: s.headers } : {}), enabled: true };
250
+ }
251
+ const JSON_DIALECTS = {
252
+ 'claude-json': { key: 'mcpServers', from: fromClaude, to: toClaude },
253
+ 'gemini-json': { key: 'mcpServers', from: fromGemini, to: toGemini },
254
+ 'antigravity-json': { key: 'mcpServers', from: fromAntigravity, to: toAntigravity },
255
+ 'opencode-json': {
256
+ key: 'mcp',
257
+ from: fromOpencode,
258
+ to: toOpencode,
259
+ seed: { $schema: 'https://opencode.ai/config.json' },
260
+ },
261
+ };
262
+ // ---------------------------------------------------------------------------
263
+ // Codex TOML (the `[mcp_servers.*]` tables only)
264
+ // ---------------------------------------------------------------------------
265
+ function fromCodex(t) {
266
+ const disabled = t.enabled === false;
267
+ if (typeof t.url === 'string') {
268
+ return clean({ transport: 'http', url: t.url, headers: strMap(t.http_headers), disabled });
269
+ }
270
+ if (typeof t.command === 'string') {
271
+ return clean({ transport: 'stdio', command: t.command, args: strArr(t.args), env: strMap(t.env), disabled });
272
+ }
273
+ return null;
274
+ }
275
+ const tomlStr = (v) => JSON.stringify(v);
276
+ const tomlKey = (k) => (/^[A-Za-z0-9_-]+$/.test(k) ? k : tomlStr(k));
277
+ function toCodexToml(name, s) {
278
+ const head = `[mcp_servers.${tomlKey(name)}]`;
279
+ const lines = [head];
280
+ if (s.transport === 'stdio') {
281
+ lines.push(`command = ${tomlStr(s.command ?? '')}`);
282
+ lines.push(`args = [${(s.args ?? []).map(tomlStr).join(', ')}]`);
283
+ if (s.env) {
284
+ lines.push('', `[mcp_servers.${tomlKey(name)}.env]`);
285
+ for (const [k, v] of Object.entries(s.env))
286
+ lines.push(`${tomlKey(k)} = ${tomlStr(v)}`);
287
+ }
288
+ }
289
+ else {
290
+ lines.push(`url = ${tomlStr(s.url ?? '')}`);
291
+ if (s.headers) {
292
+ lines.push('', `[mcp_servers.${tomlKey(name)}.http_headers]`);
293
+ for (const [k, v] of Object.entries(s.headers))
294
+ lines.push(`${tomlKey(k)} = ${tomlStr(v)}`);
295
+ }
296
+ }
297
+ return lines.join('\n') + '\n';
298
+ }
299
+ /** The MCP table of a config file's text (null = file absent). Throws if it cannot be read safely. */
300
+ function mcpTable(format, text) {
301
+ if (text === null || !text.trim())
302
+ return dict();
303
+ if (format === 'codex-toml') {
304
+ const doc = parseToml(text);
305
+ const table = doc.mcp_servers;
306
+ if (table === undefined)
307
+ return dict();
308
+ if (!isRecord(table))
309
+ throw new McpConfigError('"mcp_servers" is not a table');
310
+ return table;
311
+ }
312
+ const dialect = JSON_DIALECTS[format];
313
+ const doc = JSON.parse(text);
314
+ if (!isRecord(doc))
315
+ throw new McpConfigError('top level is not a JSON object');
316
+ const table = doc[dialect.key];
317
+ if (table === undefined)
318
+ return dict();
319
+ if (!isRecord(table))
320
+ throw new McpConfigError(`"${dialect.key}" is not an object`);
321
+ return table;
322
+ }
323
+ /** Parse a config file's text (null = file absent). Throws if it cannot be read safely. */
324
+ export function parseConfig(format, text) {
325
+ const table = mcpTable(format, text);
326
+ const servers = dict();
327
+ const names = new Set();
328
+ for (const name of safeKeys(table)) {
329
+ names.add(name);
330
+ const raw = table[name];
331
+ const s = format === 'codex-toml'
332
+ ? isRecord(raw)
333
+ ? fromCodex(raw)
334
+ : null
335
+ : JSON_DIALECTS[format].from(raw);
336
+ if (s)
337
+ servers[name] = s;
338
+ }
339
+ return { servers, names };
340
+ }
341
+ /** The servers of a config file's text. */
342
+ export function parseServers(format, text) {
343
+ return parseConfig(format, text).servers;
344
+ }
345
+ /** Whether this dialect can express the server. */
346
+ function canExpress(format, s) {
347
+ if (format === 'codex-toml' || format === 'antigravity-json')
348
+ return s.transport !== 'sse';
349
+ return true;
350
+ }
351
+ /**
352
+ * Add servers to a config file's text and return the new text. A name already defined under the
353
+ * MCP table (in any shape) is skipped; the new text is parsed again and every added server must
354
+ * come back as intended, otherwise this throws and nothing should be written.
355
+ */
356
+ export function addServers(format, text, add) {
357
+ const before = parseConfig(format, text);
358
+ const todo = dict();
359
+ for (const n of safeKeys(add))
360
+ if (!before.names.has(n) && canExpress(format, add[n]))
361
+ todo[n] = add[n];
362
+ const names = Object.keys(todo);
363
+ if (names.length === 0)
364
+ return text ?? '';
365
+ let out;
366
+ if (format === 'codex-toml') {
367
+ const base = text ?? '';
368
+ const eol = base.includes('\r\n') ? '\r\n' : '\n';
369
+ const sep = base.length === 0
370
+ ? ''
371
+ : base.endsWith('\n\n') || base.endsWith('\r\n\r\n')
372
+ ? ''
373
+ : base.endsWith('\n')
374
+ ? eol
375
+ : eol + eol;
376
+ const blocks = names.map((n) => toCodexToml(n, todo[n]).replace(/\n/g, eol));
377
+ out = base + sep + blocks.join(eol);
378
+ }
379
+ else {
380
+ const dialect = JSON_DIALECTS[format];
381
+ const doc = text && text.trim() ? JSON.parse(text) : { ...dialect.seed };
382
+ const existing = doc[dialect.key];
383
+ const table = isRecord(existing) ? existing : {};
384
+ for (const n of names) {
385
+ const entry = dialect.to(todo[n]);
386
+ if (entry)
387
+ table[n] = entry;
388
+ }
389
+ doc[dialect.key] = table;
390
+ out = JSON.stringify(doc, null, 2) + '\n';
391
+ }
392
+ // Re-read what we are about to write.
393
+ const after = parseConfig(format, out);
394
+ for (const n of before.names) {
395
+ if (!after.names.has(n))
396
+ throw new McpConfigError(`refusing to write: "${n}" would be lost`);
397
+ }
398
+ for (const n of names) {
399
+ const got = after.servers[n];
400
+ if (!got || fullIdentity(got) !== fullIdentity(todo[n])) {
401
+ throw new McpConfigError(`refusing to write: "${n}" does not read back as written`);
402
+ }
403
+ }
404
+ return out;
405
+ }
406
+ // ---------------------------------------------------------------------------
407
+ // Orchestration
408
+ // ---------------------------------------------------------------------------
409
+ async function readText(file) {
410
+ try {
411
+ return await fs.readFile(file, 'utf8');
412
+ }
413
+ catch (err) {
414
+ if (err.code === 'ENOENT')
415
+ return null;
416
+ throw err;
417
+ }
418
+ }
419
+ async function exists(file) {
420
+ try {
421
+ await fs.access(file);
422
+ return true;
423
+ }
424
+ catch {
425
+ return false;
426
+ }
427
+ }
428
+ /**
429
+ * Write `text` over `file`, keeping the old content as `<file>.codeman-bak`. Follows a symlink
430
+ * to the real file so a symlinked dotfile stays a symlink. When `secret` is set the result is
431
+ * readable by its owner only.
432
+ */
433
+ async function writeAtomic(file, text, secret) {
434
+ let target = file;
435
+ try {
436
+ if ((await fs.lstat(file)).isSymbolicLink())
437
+ target = await fs.realpath(file);
438
+ }
439
+ catch (err) {
440
+ if (err.code !== 'ENOENT')
441
+ throw err;
442
+ // ENOENT from realpath on a dangling link, or lstat on a missing file: tell them apart.
443
+ try {
444
+ await fs.lstat(file);
445
+ throw new McpConfigError('config path is a dangling symlink');
446
+ }
447
+ catch (inner) {
448
+ if (inner.code !== 'ENOENT')
449
+ throw inner;
450
+ }
451
+ }
452
+ let mode = 0o600;
453
+ try {
454
+ mode = (await fs.stat(target)).mode & 0o777;
455
+ await fs.copyFile(target, `${target}.codeman-bak`);
456
+ await fs.chmod(`${target}.codeman-bak`, 0o600);
457
+ }
458
+ catch (err) {
459
+ if (err.code !== 'ENOENT')
460
+ throw err;
461
+ }
462
+ if (secret)
463
+ mode &= ~0o077;
464
+ await fs.mkdir(dirname(target), { recursive: true });
465
+ const tmp = `${target}.codeman-tmp-${process.pid}-${randomBytes(4).toString('hex')}`;
466
+ try {
467
+ await fs.writeFile(tmp, text, { mode });
468
+ // writeFile's mode is masked by the umask; the mode we computed is the one we mean.
469
+ await fs.chmod(tmp, mode);
470
+ await fs.rename(tmp, target);
471
+ }
472
+ catch (err) {
473
+ await fs.unlink(tmp).catch(() => undefined);
474
+ throw err;
475
+ }
476
+ }
477
+ /**
478
+ * The config file a target means, honouring its relocation env var. `skip` is set when the var
479
+ * holds something that cannot be located safely (a relative path resolves against the CLI's
480
+ * working directory, which differs per session), so the target is neither read nor written.
481
+ */
482
+ function resolveFile(t, home, env) {
483
+ const rel = t.relocation;
484
+ const dir = rel ? env[rel.envVar] : undefined;
485
+ // Every CLI declared today treats an empty value as unset (`||` / a non-empty filter).
486
+ if (!rel || dir === undefined || dir === '')
487
+ return { file: join(home, t.path) };
488
+ if (!isAbsolute(dir)) {
489
+ return {
490
+ file: `$${rel.envVar}/${rel.path}`,
491
+ skip: `${rel.envVar} is set to a relative path, so the file ${t.label} reads cannot be located safely`,
492
+ };
493
+ }
494
+ return { file: join(dir, rel.path) };
495
+ }
496
+ let applying = false;
497
+ /**
498
+ * Sync across `targets` (already filtered to enabled CLIs with an `mcpConfig`, in priority
499
+ * order: when two CLIs define a name differently, the first one's definition is the one copied).
500
+ * Throws `McpSyncBusyError` if another apply is running.
501
+ */
502
+ export async function syncMcpServers(targets, opts, unsupported = []) {
503
+ if (opts.apply) {
504
+ if (applying)
505
+ throw new McpSyncBusyError();
506
+ applying = true;
507
+ }
508
+ try {
509
+ return await run(targets, opts, unsupported);
510
+ }
511
+ finally {
512
+ if (opts.apply)
513
+ applying = false;
514
+ }
515
+ }
516
+ async function run(targets, opts, unsupported) {
517
+ const home = opts.home ?? homedir();
518
+ const env = opts.env ?? (opts.home === undefined ? process.env : {});
519
+ const seen = new Set();
520
+ const live = targets
521
+ .map((t) => ({ t, ...resolveFile(t, home, env) }))
522
+ .filter(({ file }) => (seen.has(file) ? false : (seen.add(file), true)));
523
+ const state = live.map(({ t, file, skip }) => {
524
+ const res = {
525
+ id: t.id,
526
+ label: t.label,
527
+ file,
528
+ status: skip ? 'skipped' : 'ok',
529
+ ...(skip ? { error: skip } : {}),
530
+ servers: [],
531
+ added: [],
532
+ skipped: [],
533
+ };
534
+ return { t, file, res, servers: dict(), names: new Set() };
535
+ });
536
+ for (const s of state) {
537
+ if (s.res.status !== 'ok')
538
+ continue;
539
+ try {
540
+ if (!s.t.installed && !(await exists(s.file))) {
541
+ s.res.status = 'absent';
542
+ continue;
543
+ }
544
+ const parsed = parseConfig(s.t.format, await readText(s.file));
545
+ s.servers = parsed.servers;
546
+ s.names = parsed.names;
547
+ s.res.servers = [...parsed.names];
548
+ }
549
+ catch (err) {
550
+ s.res.status = 'unreadable';
551
+ s.res.error = describeMcpSyncError(err);
552
+ }
553
+ }
554
+ // Union, first enabled definition wins; a later, different definition of the same name is a conflict.
555
+ const union = dict();
556
+ const conflicts = new Set();
557
+ const switchedOff = new Set();
558
+ for (const s of state) {
559
+ if (s.res.status !== 'ok')
560
+ continue;
561
+ for (const name of Object.keys(s.servers)) {
562
+ const def = s.servers[name];
563
+ if (def.disabled) {
564
+ switchedOff.add(name);
565
+ continue;
566
+ }
567
+ if (!(name in union))
568
+ union[name] = def;
569
+ else if (fingerprint(union[name]) !== fingerprint(def))
570
+ conflicts.add(name);
571
+ }
572
+ }
573
+ const disabled = [...switchedOff].filter((n) => !(n in union)).sort();
574
+ for (const s of state) {
575
+ if (s.res.status !== 'ok')
576
+ continue;
577
+ const add = dict();
578
+ for (const name of Object.keys(union)) {
579
+ if (s.names.has(name))
580
+ continue;
581
+ if (canExpress(s.t.format, union[name]))
582
+ add[name] = union[name];
583
+ else
584
+ s.res.skipped.push(name);
585
+ }
586
+ s.res.added = Object.keys(add);
587
+ if (!opts.apply || s.res.added.length === 0)
588
+ continue;
589
+ try {
590
+ // Re-read right before writing: claude rewrites ~/.claude.json constantly.
591
+ const fresh = await readText(s.file);
592
+ const out = addServers(s.t.format, fresh, add);
593
+ const current = parseConfig(s.t.format, fresh);
594
+ const written = Object.keys(add).filter((n) => !current.names.has(n));
595
+ if (written.length === 0) {
596
+ s.res.added = [];
597
+ continue;
598
+ }
599
+ const subset = dict();
600
+ for (const n of written)
601
+ subset[n] = add[n];
602
+ await writeAtomic(s.file, out, carriesSecrets(subset));
603
+ s.res.added = written;
604
+ }
605
+ catch (err) {
606
+ s.res.status = 'failed';
607
+ s.res.error = describeMcpSyncError(err);
608
+ s.res.added = [];
609
+ }
610
+ }
611
+ return {
612
+ applied: opts.apply,
613
+ targets: state.map((s) => s.res),
614
+ conflicts: [...conflicts].sort(),
615
+ disabled,
616
+ unsupported,
617
+ };
618
+ }
619
+ //# sourceMappingURL=mcp-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-sync.js","sourceRoot":"","sources":["../src/mcp-sync.ts"],"names":[],"mappings":"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"}
@@ -93,6 +93,8 @@ export interface CreateSessionOptions {
93
93
  envOverrides?: Record<string, string>;
94
94
  /** Claude CLI effort level, injected as a `--settings` soft default (overridable via /effort in-session) */
95
95
  effort?: EffortLevel;
96
+ /** Claude advisor model, merged into the same `--settings` JSON (overridable via /advisor in-session) */
97
+ advisorModel?: string;
96
98
  /** tmux history-limit (scrollback lines) allocated when this session is created. */
97
99
  historyLimit?: number;
98
100
  /** Remote execution metadata for local tmux sessions wrapping SSH */
@@ -141,6 +143,8 @@ export interface RespawnPaneOptions {
141
143
  unsetEnvKeys?: string[];
142
144
  /** Claude CLI effort level (preserved across respawns, injected via `--settings`) */
143
145
  effort?: EffortLevel;
146
+ /** Claude advisor model (preserved across respawns, merged into the same `--settings` JSON) */
147
+ advisorModel?: string;
144
148
  /** Original tmux history-limit retained for config parity; respawn cannot resize the existing pane. */
145
149
  historyLimit?: number;
146
150
  /** Remote execution metadata for local tmux sessions wrapping SSH */