chorus-codes 0.7.0 → 0.7.2

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 (293) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/cache/.previewinfo +1 -1
  4. package/.next/cache/.rscinfo +1 -1
  5. package/.next/cache/.tsbuildinfo +1 -1
  6. package/.next/fallback-build-manifest.json +3 -3
  7. package/.next/prerender-manifest.json +3 -3
  8. package/.next/server/app/_global-error.html +1 -1
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.html +1 -1
  16. package/.next/server/app/_not-found.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  22. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  23. package/.next/server/app/new.html +1 -1
  24. package/.next/server/app/new.rsc +1 -1
  25. package/.next/server/app/new.segments/_full.segment.rsc +1 -1
  26. package/.next/server/app/new.segments/_head.segment.rsc +1 -1
  27. package/.next/server/app/new.segments/_index.segment.rsc +1 -1
  28. package/.next/server/app/new.segments/_tree.segment.rsc +1 -1
  29. package/.next/server/app/new.segments/new/__PAGE__.segment.rsc +1 -1
  30. package/.next/server/app/new.segments/new.segment.rsc +1 -1
  31. package/.next/server/app/onboarding.html +1 -1
  32. package/.next/server/app/onboarding.rsc +1 -1
  33. package/.next/server/app/onboarding.segments/_full.segment.rsc +1 -1
  34. package/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
  35. package/.next/server/app/onboarding.segments/_index.segment.rsc +1 -1
  36. package/.next/server/app/onboarding.segments/_tree.segment.rsc +1 -1
  37. package/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +1 -1
  38. package/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
  39. package/.next/server/app/personas.html +1 -1
  40. package/.next/server/app/personas.rsc +1 -1
  41. package/.next/server/app/personas.segments/_full.segment.rsc +1 -1
  42. package/.next/server/app/personas.segments/_head.segment.rsc +1 -1
  43. package/.next/server/app/personas.segments/_index.segment.rsc +1 -1
  44. package/.next/server/app/personas.segments/_tree.segment.rsc +1 -1
  45. package/.next/server/app/personas.segments/personas/__PAGE__.segment.rsc +1 -1
  46. package/.next/server/app/personas.segments/personas.segment.rsc +1 -1
  47. package/.next/server/app/settings.html +1 -1
  48. package/.next/server/app/settings.rsc +1 -1
  49. package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  50. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  51. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  52. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  53. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  54. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  55. package/.next/server/app/templates.html +1 -1
  56. package/.next/server/app/templates.rsc +1 -1
  57. package/.next/server/app/templates.segments/_full.segment.rsc +1 -1
  58. package/.next/server/app/templates.segments/_head.segment.rsc +1 -1
  59. package/.next/server/app/templates.segments/_index.segment.rsc +1 -1
  60. package/.next/server/app/templates.segments/_tree.segment.rsc +1 -1
  61. package/.next/server/app/templates.segments/templates/__PAGE__.segment.rsc +1 -1
  62. package/.next/server/app/templates.segments/templates.segment.rsc +1 -1
  63. package/.next/server/middleware-build-manifest.js +3 -3
  64. package/.next/server/pages/404.html +1 -1
  65. package/.next/server/pages/500.html +1 -1
  66. package/.next/server/server-reference-manifest.js +1 -1
  67. package/.next/server/server-reference-manifest.json +1 -1
  68. package/.next/trace +1 -1
  69. package/.next/trace-build +1 -1
  70. package/README.md +38 -15
  71. package/dist/cli/commands/doctor.js +116 -0
  72. package/dist/cli/commands/doctor.js.map +1 -0
  73. package/dist/cli/commands/init.js +211 -0
  74. package/dist/cli/commands/init.js.map +1 -0
  75. package/dist/cli/commands/start.js +298 -0
  76. package/dist/cli/commands/start.js.map +1 -0
  77. package/dist/cli/commands/status.js +54 -0
  78. package/dist/cli/commands/status.js.map +1 -0
  79. package/dist/cli/commands/stop.js +97 -0
  80. package/dist/cli/commands/stop.js.map +1 -0
  81. package/dist/cli/connect.js +108 -0
  82. package/dist/cli/connect.js.map +1 -0
  83. package/dist/cli/index.js +99 -0
  84. package/dist/cli/index.js.map +1 -0
  85. package/dist/cli/port-utils.js +260 -0
  86. package/dist/cli/port-utils.js.map +1 -0
  87. package/dist/cli/runtime-env.js +60 -0
  88. package/dist/cli/runtime-env.js.map +1 -0
  89. package/dist/cli/shared.js +54 -0
  90. package/dist/cli/shared.js.map +1 -0
  91. package/dist/cli/ui.js +60 -0
  92. package/dist/cli/ui.js.map +1 -0
  93. package/dist/daemon/agents/claude.js +98 -0
  94. package/dist/daemon/agents/claude.js.map +1 -0
  95. package/dist/daemon/agents/codex.js +160 -0
  96. package/dist/daemon/agents/codex.js.map +1 -0
  97. package/dist/daemon/agents/gemini.js +111 -0
  98. package/dist/daemon/agents/gemini.js.map +1 -0
  99. package/dist/daemon/agents/index.js +59 -0
  100. package/dist/daemon/agents/index.js.map +1 -0
  101. package/dist/daemon/agents/kimi.js +206 -0
  102. package/dist/daemon/agents/kimi.js.map +1 -0
  103. package/dist/daemon/agents/opencode.js +228 -0
  104. package/dist/daemon/agents/opencode.js.map +1 -0
  105. package/dist/daemon/agents/openrouter.js +274 -0
  106. package/dist/daemon/agents/openrouter.js.map +1 -0
  107. package/dist/daemon/agents/parsers/claude.js +63 -0
  108. package/dist/daemon/agents/parsers/claude.js.map +1 -0
  109. package/dist/daemon/agents/parsers/codex.js +51 -0
  110. package/dist/daemon/agents/parsers/codex.js.map +1 -0
  111. package/dist/daemon/agents/parsers/gemini.js +144 -0
  112. package/dist/daemon/agents/parsers/gemini.js.map +1 -0
  113. package/dist/daemon/agents/parsers/index.js +31 -0
  114. package/dist/daemon/agents/parsers/index.js.map +1 -0
  115. package/dist/daemon/agents/parsers/kimi.js +8 -0
  116. package/dist/daemon/agents/parsers/kimi.js.map +1 -0
  117. package/dist/daemon/agents/parsers/opencode.js +105 -0
  118. package/dist/daemon/agents/parsers/opencode.js.map +1 -0
  119. package/dist/daemon/agents/parsers/openrouter.js +69 -0
  120. package/dist/daemon/agents/parsers/openrouter.js.map +1 -0
  121. package/dist/daemon/agents/parsers/shared.js +17 -0
  122. package/dist/daemon/agents/parsers/shared.js.map +1 -0
  123. package/dist/daemon/agents/preflight.js +83 -0
  124. package/dist/daemon/agents/preflight.js.map +1 -0
  125. package/dist/daemon/agents/quote.js +45 -0
  126. package/dist/daemon/agents/quote.js.map +1 -0
  127. package/dist/daemon/agents/sandbox-guard.js +69 -0
  128. package/dist/daemon/agents/sandbox-guard.js.map +1 -0
  129. package/dist/daemon/agents/types.js +6 -0
  130. package/dist/daemon/agents/types.js.map +1 -0
  131. package/dist/daemon/api-response.js +65 -0
  132. package/dist/daemon/api-response.js.map +1 -0
  133. package/dist/daemon/error-detector.js +329 -0
  134. package/dist/daemon/error-detector.js.map +1 -0
  135. package/dist/daemon/headless.js +533 -0
  136. package/dist/daemon/headless.js.map +1 -0
  137. package/dist/daemon/index.js +333 -0
  138. package/dist/daemon/index.js.map +1 -0
  139. package/dist/daemon/openrouter.js +192 -0
  140. package/dist/daemon/openrouter.js.map +1 -0
  141. package/dist/daemon/orchestrators/claude.js +163 -0
  142. package/dist/daemon/orchestrators/claude.js.map +1 -0
  143. package/dist/daemon/orchestrators/codex.js +101 -0
  144. package/dist/daemon/orchestrators/codex.js.map +1 -0
  145. package/dist/daemon/orchestrators/cursor-windsurf.js +118 -0
  146. package/dist/daemon/orchestrators/cursor-windsurf.js.map +1 -0
  147. package/dist/daemon/orchestrators/gemini.js +108 -0
  148. package/dist/daemon/orchestrators/gemini.js.map +1 -0
  149. package/dist/daemon/orchestrators/index.js +90 -0
  150. package/dist/daemon/orchestrators/index.js.map +1 -0
  151. package/dist/daemon/orchestrators/kimi.js +108 -0
  152. package/dist/daemon/orchestrators/kimi.js.map +1 -0
  153. package/dist/daemon/orchestrators/opencode.js +152 -0
  154. package/dist/daemon/orchestrators/opencode.js.map +1 -0
  155. package/dist/daemon/orchestrators/shared.js +60 -0
  156. package/dist/daemon/orchestrators/shared.js.map +1 -0
  157. package/dist/daemon/output-watcher.js +131 -0
  158. package/dist/daemon/output-watcher.js.map +1 -0
  159. package/dist/daemon/participant-aborts.js +123 -0
  160. package/dist/daemon/participant-aborts.js.map +1 -0
  161. package/dist/daemon/reaper.js +46 -0
  162. package/dist/daemon/reaper.js.map +1 -0
  163. package/dist/daemon/routes/chats-events.js +62 -0
  164. package/dist/daemon/routes/chats-events.js.map +1 -0
  165. package/dist/daemon/routes/chats-stream.js +241 -0
  166. package/dist/daemon/routes/chats-stream.js.map +1 -0
  167. package/dist/daemon/routes/chats-validation.js +13 -0
  168. package/dist/daemon/routes/chats-validation.js.map +1 -0
  169. package/dist/daemon/routes/chats.js +545 -0
  170. package/dist/daemon/routes/chats.js.map +1 -0
  171. package/dist/daemon/routes/openrouter.js +103 -0
  172. package/dist/daemon/routes/openrouter.js.map +1 -0
  173. package/dist/daemon/routes/settings.js +199 -0
  174. package/dist/daemon/routes/settings.js.map +1 -0
  175. package/dist/daemon/routes/stats.js +155 -0
  176. package/dist/daemon/routes/stats.js.map +1 -0
  177. package/dist/daemon/routes/system.js +208 -0
  178. package/dist/daemon/routes/system.js.map +1 -0
  179. package/dist/daemon/routes/templates-personas.js +254 -0
  180. package/dist/daemon/routes/templates-personas.js.map +1 -0
  181. package/dist/daemon/routes/voices.js +139 -0
  182. package/dist/daemon/routes/voices.js.map +1 -0
  183. package/dist/daemon/runner/doer-driver.js +346 -0
  184. package/dist/daemon/runner/doer-driver.js.map +1 -0
  185. package/dist/daemon/runner/doer.js +336 -0
  186. package/dist/daemon/runner/doer.js.map +1 -0
  187. package/dist/daemon/runner/prior-round.js +140 -0
  188. package/dist/daemon/runner/prior-round.js.map +1 -0
  189. package/dist/daemon/runner/prompt-builder.js +292 -0
  190. package/dist/daemon/runner/prompt-builder.js.map +1 -0
  191. package/dist/daemon/runner/review-only-phase.js +103 -0
  192. package/dist/daemon/runner/review-only-phase.js.map +1 -0
  193. package/dist/daemon/runner/reviewer-driver.js +410 -0
  194. package/dist/daemon/runner/reviewer-driver.js.map +1 -0
  195. package/dist/daemon/runner/reviewer.js +384 -0
  196. package/dist/daemon/runner/reviewer.js.map +1 -0
  197. package/dist/daemon/runner/run-with-fallback.js +56 -0
  198. package/dist/daemon/runner/run-with-fallback.js.map +1 -0
  199. package/dist/daemon/runner/sanitize-name.js +8 -0
  200. package/dist/daemon/runner/sanitize-name.js.map +1 -0
  201. package/dist/daemon/runner/stream-file-writer.js +116 -0
  202. package/dist/daemon/runner/stream-file-writer.js.map +1 -0
  203. package/dist/daemon/runner/swap-sidecar.js +102 -0
  204. package/dist/daemon/runner/swap-sidecar.js.map +1 -0
  205. package/dist/daemon/runner/template-fallback.js +119 -0
  206. package/dist/daemon/runner/template-fallback.js.map +1 -0
  207. package/dist/daemon/runner/types.js +3 -0
  208. package/dist/daemon/runner/types.js.map +1 -0
  209. package/dist/daemon/runner/verdict.js +51 -0
  210. package/dist/daemon/runner/verdict.js.map +1 -0
  211. package/dist/daemon/runner-multiplex.js +364 -0
  212. package/dist/daemon/runner-multiplex.js.map +1 -0
  213. package/dist/daemon/runner.js +427 -0
  214. package/dist/daemon/runner.js.map +1 -0
  215. package/dist/daemon/ship.js +340 -0
  216. package/dist/daemon/ship.js.map +1 -0
  217. package/dist/daemon/template-cache.js +37 -0
  218. package/dist/daemon/template-cache.js.map +1 -0
  219. package/dist/daemon/tmux-types.js +9 -0
  220. package/dist/daemon/tmux-types.js.map +1 -0
  221. package/dist/daemon/tmux.js +341 -0
  222. package/dist/daemon/tmux.js.map +1 -0
  223. package/dist/lib/atomic-write.js +55 -0
  224. package/dist/lib/atomic-write.js.map +1 -0
  225. package/dist/lib/chat-events-bus.js +27 -0
  226. package/dist/lib/chat-events-bus.js.map +1 -0
  227. package/dist/lib/chat-slug.js +105 -0
  228. package/dist/lib/chat-slug.js.map +1 -0
  229. package/dist/lib/cli-detect.js +388 -0
  230. package/dist/lib/cli-detect.js.map +1 -0
  231. package/dist/lib/cli-health.js +156 -0
  232. package/dist/lib/cli-health.js.map +1 -0
  233. package/dist/lib/cli-paths.js +113 -0
  234. package/dist/lib/cli-paths.js.map +1 -0
  235. package/dist/lib/cli-precheck.js +141 -0
  236. package/dist/lib/cli-precheck.js.map +1 -0
  237. package/dist/lib/db/chats.js +244 -0
  238. package/dist/lib/db/chats.js.map +1 -0
  239. package/dist/lib/db/connection.js +254 -0
  240. package/dist/lib/db/connection.js.map +1 -0
  241. package/dist/lib/db/index.js +34 -0
  242. package/dist/lib/db/index.js.map +1 -0
  243. package/dist/lib/db/personas.js +65 -0
  244. package/dist/lib/db/personas.js.map +1 -0
  245. package/dist/lib/db/phase-events.js +172 -0
  246. package/dist/lib/db/phase-events.js.map +1 -0
  247. package/dist/lib/db/secrets.js +53 -0
  248. package/dist/lib/db/secrets.js.map +1 -0
  249. package/dist/lib/db/settings.js +47 -0
  250. package/dist/lib/db/settings.js.map +1 -0
  251. package/dist/lib/db/templates.js +75 -0
  252. package/dist/lib/db/templates.js.map +1 -0
  253. package/dist/lib/db/voices.js +184 -0
  254. package/dist/lib/db/voices.js.map +1 -0
  255. package/dist/lib/lineage-maps.js +200 -0
  256. package/dist/lib/lineage-maps.js.map +1 -0
  257. package/dist/lib/logger.js +186 -0
  258. package/dist/lib/logger.js.map +1 -0
  259. package/dist/lib/personas.js +117 -0
  260. package/dist/lib/personas.js.map +1 -0
  261. package/dist/lib/runtime-path.js +222 -0
  262. package/dist/lib/runtime-path.js.map +1 -0
  263. package/dist/lib/settings/billing.js +58 -0
  264. package/dist/lib/settings/billing.js.map +1 -0
  265. package/dist/lib/settings/permissions.js +81 -0
  266. package/dist/lib/settings/permissions.js.map +1 -0
  267. package/dist/lib/settings/transport.js +113 -0
  268. package/dist/lib/settings/transport.js.map +1 -0
  269. package/dist/lib/telemetry.js +290 -0
  270. package/dist/lib/telemetry.js.map +1 -0
  271. package/dist/lib/template-schema.js +319 -0
  272. package/dist/lib/template-schema.js.map +1 -0
  273. package/dist/lib/template-validation.js +82 -0
  274. package/dist/lib/template-validation.js.map +1 -0
  275. package/dist/lib/voices.js +533 -0
  276. package/dist/lib/voices.js.map +1 -0
  277. package/dist/mcp/client.js +138 -0
  278. package/dist/mcp/client.js.map +1 -0
  279. package/dist/mcp/index.js +178 -0
  280. package/dist/mcp/index.js.map +1 -0
  281. package/dist/mcp/tools.js +355 -0
  282. package/dist/mcp/tools.js.map +1 -0
  283. package/package.json +2 -1
  284. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js +0 -6077
  285. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js.map +0 -69
  286. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js +0 -6318
  287. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js.map +0 -71
  288. package/.next/dev/types/cache-life.d.ts +0 -145
  289. package/.next/dev/types/routes.d.ts +0 -84
  290. package/.next/dev/types/validator.ts +0 -178
  291. /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 9cD3yIOGe_Aqr17uJHTQS}/_buildManifest.js +0 -0
  292. /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 9cD3yIOGe_Aqr17uJHTQS}/_clientMiddlewareManifest.js +0 -0
  293. /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 9cD3yIOGe_Aqr17uJHTQS}/_ssgManifest.js +0 -0
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.claudeOrchestrator = void 0;
7
+ exports.registerClaudeMcpServer = registerClaudeMcpServer;
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_os_1 = __importDefault(require("node:os"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const shared_js_1 = require("./shared.js");
12
+ const CLAUDE_SETTINGS_PATH = node_path_1.default.join(node_os_1.default.homedir(), '.claude', 'settings.local.json');
13
+ const CLAUDE_SLASH_COMMAND_PATH = node_path_1.default.join(node_os_1.default.homedir(), '.claude', 'commands', 'chorus.md');
14
+ const CLAUDE_PROJECT_CONFIG_PATH = node_path_1.default.join(node_os_1.default.homedir(), '.claude.json');
15
+ function readClaudeSettings() {
16
+ if (!node_fs_1.default.existsSync(CLAUDE_SETTINGS_PATH))
17
+ return {};
18
+ try {
19
+ return JSON.parse(node_fs_1.default.readFileSync(CLAUDE_SETTINGS_PATH, 'utf-8'));
20
+ }
21
+ catch {
22
+ return {};
23
+ }
24
+ }
25
+ function getClaudeStatus() {
26
+ const config = readClaudeSettings();
27
+ const allow = new Set(config.permissions?.allow ?? []);
28
+ const approved = shared_js_1.CHORUS_TOOLS.filter((t) => allow.has(t)).length;
29
+ return {
30
+ name: 'claude',
31
+ label: 'Claude Code',
32
+ connected: approved === shared_js_1.CHORUS_TOOLS.length,
33
+ approvedTools: approved,
34
+ totalTools: shared_js_1.CHORUS_TOOLS.length,
35
+ note: "Pre-approves the 7 chorus.* tools so Claude Code doesn't prompt per-tool.",
36
+ supported: true,
37
+ firstCallBehavior: 'auto',
38
+ };
39
+ }
40
+ /**
41
+ * Resolve the bundled `/chorus` slash command markdown shipped in the npm
42
+ * package at `assets/slash-commands/chorus.md`. Works in both dist
43
+ * (`__dirname` = `dist/daemon/orchestrators`) and dev/tsx
44
+ * (`__dirname` = `src/daemon/orchestrators`) — both resolve to
45
+ * `<pkg>/assets/...`.
46
+ */
47
+ function resolveChorusSlashAsset() {
48
+ const candidate = node_path_1.default.join(__dirname, '..', '..', '..', 'assets', 'slash-commands', 'chorus.md');
49
+ return node_fs_1.default.existsSync(candidate) ? candidate : null;
50
+ }
51
+ function installChorusSlashCommand() {
52
+ const source = resolveChorusSlashAsset();
53
+ if (!source)
54
+ return 'skipped';
55
+ const desired = node_fs_1.default.readFileSync(source, 'utf-8');
56
+ if (node_fs_1.default.existsSync(CLAUDE_SLASH_COMMAND_PATH)) {
57
+ const current = node_fs_1.default.readFileSync(CLAUDE_SLASH_COMMAND_PATH, 'utf-8');
58
+ if (current === desired)
59
+ return 'unchanged';
60
+ node_fs_1.default.writeFileSync(CLAUDE_SLASH_COMMAND_PATH, desired, 'utf-8');
61
+ return 'updated';
62
+ }
63
+ node_fs_1.default.mkdirSync(node_path_1.default.dirname(CLAUDE_SLASH_COMMAND_PATH), { recursive: true });
64
+ node_fs_1.default.writeFileSync(CLAUDE_SLASH_COMMAND_PATH, desired, 'utf-8');
65
+ return 'installed';
66
+ }
67
+ /**
68
+ * Patch Claude Code's local settings to whitelist all 7 Chorus MCP tools, and
69
+ * drop the `/chorus` slash command into `~/.claude/commands/`. Idempotent.
70
+ */
71
+ async function connectClaude() {
72
+ const config = readClaudeSettings();
73
+ const permissions = (config.permissions ?? {});
74
+ const existing = new Set(permissions.allow ?? []);
75
+ const added = [];
76
+ const alreadyPresent = [];
77
+ for (const tool of shared_js_1.CHORUS_TOOLS) {
78
+ if (existing.has(tool)) {
79
+ alreadyPresent.push(tool);
80
+ }
81
+ else {
82
+ existing.add(tool);
83
+ added.push(tool);
84
+ }
85
+ }
86
+ if (added.length > 0) {
87
+ node_fs_1.default.mkdirSync(node_path_1.default.dirname(CLAUDE_SETTINGS_PATH), { recursive: true });
88
+ const next = {
89
+ ...config,
90
+ permissions: {
91
+ ...permissions,
92
+ allow: Array.from(existing).sort(),
93
+ },
94
+ };
95
+ node_fs_1.default.writeFileSync(CLAUDE_SETTINGS_PATH, JSON.stringify(next, null, 2) + '\n', 'utf-8');
96
+ }
97
+ const slashCommand = installChorusSlashCommand();
98
+ return {
99
+ added,
100
+ alreadyPresent,
101
+ configPath: CLAUDE_SETTINGS_PATH,
102
+ slashCommand,
103
+ slashCommandPath: CLAUDE_SLASH_COMMAND_PATH,
104
+ };
105
+ }
106
+ /**
107
+ * Register Chorus as an MCP server in Claude Code's project config.
108
+ * Patches `~/.claude.json` → projects.<projectDir>.mcpServers.chorus.
109
+ *
110
+ * Idempotent: returns `{ added: false }` when the entry already points at
111
+ * the same bin path.
112
+ */
113
+ async function registerClaudeMcpServer(opts) {
114
+ const project = opts.projectDir ?? node_os_1.default.homedir();
115
+ let config = {};
116
+ if (node_fs_1.default.existsSync(CLAUDE_PROJECT_CONFIG_PATH)) {
117
+ try {
118
+ config = JSON.parse(node_fs_1.default.readFileSync(CLAUDE_PROJECT_CONFIG_PATH, 'utf-8'));
119
+ }
120
+ catch {
121
+ throw new Error(`Could not parse ${CLAUDE_PROJECT_CONFIG_PATH}. Fix the JSON or remove it and re-run.`);
122
+ }
123
+ }
124
+ const projects = config.projects && typeof config.projects === 'object'
125
+ ? config.projects
126
+ : {};
127
+ const projectBlock = projects[project] ?? {};
128
+ const mcpServers = projectBlock.mcpServers && typeof projectBlock.mcpServers === 'object'
129
+ ? projectBlock.mcpServers
130
+ : {};
131
+ const existing = mcpServers.chorus;
132
+ if (existing &&
133
+ Array.isArray(existing.args) &&
134
+ existing.args[0] === opts.binPath &&
135
+ existing.args[1] === 'mcp') {
136
+ return { added: false, configPath: CLAUDE_PROJECT_CONFIG_PATH, project };
137
+ }
138
+ mcpServers.chorus = {
139
+ command: 'node',
140
+ args: [opts.binPath, 'mcp'],
141
+ env: { CHORUS_DAEMON_URL: opts.daemonUrl ?? shared_js_1.DEFAULT_DAEMON_URL },
142
+ };
143
+ projects[project] = { ...projectBlock, mcpServers };
144
+ node_fs_1.default.writeFileSync(CLAUDE_PROJECT_CONFIG_PATH, JSON.stringify({ ...config, projects }, null, 2), 'utf-8');
145
+ return { added: true, configPath: CLAUDE_PROJECT_CONFIG_PATH, project };
146
+ }
147
+ exports.claudeOrchestrator = {
148
+ name: 'claude',
149
+ label: 'Claude Code',
150
+ getStatus: getClaudeStatus,
151
+ detect: () => node_fs_1.default.existsSync(CLAUDE_PROJECT_CONFIG_PATH),
152
+ connect: async (opts) => {
153
+ const reg = await registerClaudeMcpServer(opts);
154
+ const conn = await connectClaude();
155
+ return {
156
+ registered: reg.added,
157
+ toolsAdded: conn.added.length,
158
+ slashCommand: conn.slashCommand,
159
+ full: conn,
160
+ };
161
+ },
162
+ };
163
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/daemon/orchestrators/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.codexOrchestrator = void 0;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_os_1 = __importDefault(require("node:os"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const shared_js_1 = require("./shared.js");
11
+ const CODEX_CONFIG_PATH = node_path_1.default.join(node_os_1.default.homedir(), '.codex', 'config.toml');
12
+ function getCodexStatus() {
13
+ const detected = node_fs_1.default.existsSync(CODEX_CONFIG_PATH);
14
+ const connected = detected && hasCodexMcpServer();
15
+ return {
16
+ name: 'codex',
17
+ label: 'Codex CLI',
18
+ connected,
19
+ approvedTools: connected ? 1 : 0,
20
+ totalTools: 1,
21
+ note: "Registers Chorus as an MCP server in ~/.codex/config.toml. Whether tool calls prompt depends on your codex `approval_policy` setting (we don't change it).",
22
+ supported: detected,
23
+ firstCallBehavior: 'inherits_global',
24
+ };
25
+ }
26
+ function hasCodexMcpServer(expectedBinPath) {
27
+ if (!node_fs_1.default.existsSync(CODEX_CONFIG_PATH))
28
+ return false;
29
+ const body = node_fs_1.default.readFileSync(CODEX_CONFIG_PATH, 'utf-8');
30
+ if (!/^\[mcp_servers\.chorus\]/m.test(body))
31
+ return false;
32
+ if (!expectedBinPath)
33
+ return true;
34
+ return body.includes(expectedBinPath);
35
+ }
36
+ /**
37
+ * Register Chorus as an MCP server in Codex via `codex mcp add`. We shell
38
+ * out rather than write TOML by hand so we always emit the exact format
39
+ * Codex expects — and stay forward-compatible if it changes.
40
+ *
41
+ * Idempotent: skips the call when the entry already exists.
42
+ */
43
+ async function connectCodex(opts) {
44
+ if (hasCodexMcpServer(opts.binPath)) {
45
+ return {
46
+ added: [],
47
+ alreadyPresent: ['mcp_servers.chorus'],
48
+ configPath: CODEX_CONFIG_PATH,
49
+ slashCommand: 'skipped',
50
+ slashCommandPath: '',
51
+ };
52
+ }
53
+ // Stale entry with a different binPath — remove it before re-add.
54
+ if (hasCodexMcpServer()) {
55
+ try {
56
+ await (0, shared_js_1.execFileAsync)('codex', ['mcp', 'remove', 'chorus'], {
57
+ timeout: 30_000,
58
+ });
59
+ }
60
+ catch {
61
+ /* best-effort */
62
+ }
63
+ }
64
+ const daemonUrl = opts.daemonUrl ?? shared_js_1.DEFAULT_DAEMON_URL;
65
+ try {
66
+ await (0, shared_js_1.execFileAsync)('codex', [
67
+ 'mcp',
68
+ 'add',
69
+ 'chorus',
70
+ '--env',
71
+ `CHORUS_DAEMON_URL=${daemonUrl}`,
72
+ '--',
73
+ 'node',
74
+ opts.binPath,
75
+ 'mcp',
76
+ ], { timeout: 30_000 });
77
+ }
78
+ catch (err) {
79
+ const msg = err instanceof Error ? err.message : String(err);
80
+ throw new Error(`codex mcp add failed: ${msg}`);
81
+ }
82
+ return {
83
+ added: ['mcp_servers.chorus'],
84
+ alreadyPresent: [],
85
+ configPath: CODEX_CONFIG_PATH,
86
+ slashCommand: 'skipped',
87
+ slashCommandPath: '',
88
+ };
89
+ }
90
+ exports.codexOrchestrator = {
91
+ name: 'codex',
92
+ label: 'Codex CLI',
93
+ getStatus: getCodexStatus,
94
+ detect: () => node_fs_1.default.existsSync(CODEX_CONFIG_PATH),
95
+ connect: async (opts) => {
96
+ const before = hasCodexMcpServer();
97
+ const full = await connectCodex(opts);
98
+ return { registered: !before, toolsAdded: 0, full };
99
+ },
100
+ };
101
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/daemon/orchestrators/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * Cursor + Windsurf are IDE forks of VSCode that share the
4
+ * `{ mcpServers: { ... } }` JSON shape (same as Gemini/Kimi). Neither
5
+ * ships an `mcp add` CLI — direct JSON edit. Detection looks for the
6
+ * config dir (Cursor/Windsurf is installed); the mcp.json itself
7
+ * usually doesn't exist until first registration.
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.windsurfOrchestrator = exports.cursorOrchestrator = void 0;
14
+ const node_fs_1 = __importDefault(require("node:fs"));
15
+ const node_os_1 = __importDefault(require("node:os"));
16
+ const node_path_1 = __importDefault(require("node:path"));
17
+ const shared_js_1 = require("./shared.js");
18
+ const CURSOR_CONFIG_DIR = node_path_1.default.join(node_os_1.default.homedir(), '.cursor');
19
+ const CURSOR_MCP_PATH = node_path_1.default.join(CURSOR_CONFIG_DIR, 'mcp.json');
20
+ const WINDSURF_CONFIG_DIR = node_path_1.default.join(node_os_1.default.homedir(), '.codeium', 'windsurf');
21
+ const WINDSURF_MCP_PATH = node_path_1.default.join(WINDSURF_CONFIG_DIR, 'mcp_config.json');
22
+ function getCursorStatus() {
23
+ const detected = node_fs_1.default.existsSync(CURSOR_CONFIG_DIR);
24
+ const connected = detected && (0, shared_js_1.hasMcpEntry)(CURSOR_MCP_PATH);
25
+ return {
26
+ name: 'cursor',
27
+ label: 'Cursor',
28
+ connected,
29
+ approvedTools: connected ? 1 : 0,
30
+ totalTools: 1,
31
+ note: 'Registers Chorus in ~/.cursor/mcp.json. Cursor will prompt on first tool call — choose "Always allow" to make it stick.',
32
+ supported: detected,
33
+ firstCallBehavior: 'prompts_once',
34
+ };
35
+ }
36
+ async function connectCursor(opts) {
37
+ if ((0, shared_js_1.hasMcpEntry)(CURSOR_MCP_PATH, opts.binPath)) {
38
+ return {
39
+ added: [],
40
+ alreadyPresent: ['mcpServers.chorus'],
41
+ configPath: CURSOR_MCP_PATH,
42
+ slashCommand: 'skipped',
43
+ slashCommandPath: '',
44
+ };
45
+ }
46
+ (0, shared_js_1.writeMcpEntry)({
47
+ filePath: CURSOR_MCP_PATH,
48
+ binPath: opts.binPath,
49
+ daemonUrl: opts.daemonUrl ?? shared_js_1.DEFAULT_DAEMON_URL,
50
+ });
51
+ return {
52
+ added: ['mcpServers.chorus'],
53
+ alreadyPresent: [],
54
+ configPath: CURSOR_MCP_PATH,
55
+ slashCommand: 'skipped',
56
+ slashCommandPath: '',
57
+ };
58
+ }
59
+ function getWindsurfStatus() {
60
+ const detected = node_fs_1.default.existsSync(WINDSURF_CONFIG_DIR);
61
+ const connected = detected && (0, shared_js_1.hasMcpEntry)(WINDSURF_MCP_PATH);
62
+ return {
63
+ name: 'windsurf',
64
+ label: 'Windsurf',
65
+ connected,
66
+ approvedTools: connected ? 1 : 0,
67
+ totalTools: 1,
68
+ note: 'Registers Chorus in ~/.codeium/windsurf/mcp_config.json. Windsurf will prompt on first tool call — choose "Always allow".',
69
+ supported: detected,
70
+ firstCallBehavior: 'prompts_once',
71
+ };
72
+ }
73
+ async function connectWindsurf(opts) {
74
+ if ((0, shared_js_1.hasMcpEntry)(WINDSURF_MCP_PATH, opts.binPath)) {
75
+ return {
76
+ added: [],
77
+ alreadyPresent: ['mcpServers.chorus'],
78
+ configPath: WINDSURF_MCP_PATH,
79
+ slashCommand: 'skipped',
80
+ slashCommandPath: '',
81
+ };
82
+ }
83
+ (0, shared_js_1.writeMcpEntry)({
84
+ filePath: WINDSURF_MCP_PATH,
85
+ binPath: opts.binPath,
86
+ daemonUrl: opts.daemonUrl ?? shared_js_1.DEFAULT_DAEMON_URL,
87
+ });
88
+ return {
89
+ added: ['mcpServers.chorus'],
90
+ alreadyPresent: [],
91
+ configPath: WINDSURF_MCP_PATH,
92
+ slashCommand: 'skipped',
93
+ slashCommandPath: '',
94
+ };
95
+ }
96
+ exports.cursorOrchestrator = {
97
+ name: 'cursor',
98
+ label: 'Cursor',
99
+ getStatus: getCursorStatus,
100
+ detect: () => node_fs_1.default.existsSync(CURSOR_CONFIG_DIR),
101
+ connect: async (opts) => {
102
+ const before = (0, shared_js_1.hasMcpEntry)(CURSOR_MCP_PATH, opts.binPath);
103
+ const full = await connectCursor(opts);
104
+ return { registered: !before, toolsAdded: 0, full };
105
+ },
106
+ };
107
+ exports.windsurfOrchestrator = {
108
+ name: 'windsurf',
109
+ label: 'Windsurf',
110
+ getStatus: getWindsurfStatus,
111
+ detect: () => node_fs_1.default.existsSync(WINDSURF_CONFIG_DIR),
112
+ connect: async (opts) => {
113
+ const before = (0, shared_js_1.hasMcpEntry)(WINDSURF_MCP_PATH, opts.binPath);
114
+ const full = await connectWindsurf(opts);
115
+ return { registered: !before, toolsAdded: 0, full };
116
+ },
117
+ };
118
+ //# sourceMappingURL=cursor-windsurf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-windsurf.js","sourceRoot":"","sources":["../../../src/daemon/orchestrators/cursor-windsurf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.geminiOrchestrator = void 0;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_os_1 = __importDefault(require("node:os"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const shared_js_1 = require("./shared.js");
11
+ const GEMINI_SETTINGS_PATH = node_path_1.default.join(node_os_1.default.homedir(), '.gemini', 'settings.json');
12
+ function getGeminiStatus() {
13
+ const detected = node_fs_1.default.existsSync(GEMINI_SETTINGS_PATH);
14
+ const connected = detected && hasGeminiMcpServer();
15
+ return {
16
+ name: 'gemini',
17
+ label: 'Gemini CLI',
18
+ connected,
19
+ approvedTools: connected ? 1 : 0,
20
+ totalTools: 1,
21
+ note: "Registers Chorus as a user-scope MCP server in ~/.gemini/settings.json with --trust set so calls don't prompt.",
22
+ supported: detected,
23
+ firstCallBehavior: 'auto',
24
+ };
25
+ }
26
+ function hasGeminiMcpServer(expectedBinPath) {
27
+ if (!node_fs_1.default.existsSync(GEMINI_SETTINGS_PATH))
28
+ return false;
29
+ try {
30
+ const body = JSON.parse(node_fs_1.default.readFileSync(GEMINI_SETTINGS_PATH, 'utf-8'));
31
+ const servers = body.mcpServers;
32
+ const chorus = servers?.chorus;
33
+ if (!chorus)
34
+ return false;
35
+ if (!expectedBinPath)
36
+ return true;
37
+ return Array.isArray(chorus.args) && chorus.args.includes(expectedBinPath);
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ /**
44
+ * Register Chorus with Gemini CLI. `gemini mcp add` writes to
45
+ * ~/.gemini/settings.json (or per-project) for us — we use --scope user
46
+ * to make it global. Idempotent: skips when already present.
47
+ */
48
+ async function connectGemini(opts) {
49
+ if (hasGeminiMcpServer(opts.binPath)) {
50
+ return {
51
+ added: [],
52
+ alreadyPresent: ['mcpServers.chorus'],
53
+ configPath: GEMINI_SETTINGS_PATH,
54
+ slashCommand: 'skipped',
55
+ slashCommandPath: '',
56
+ };
57
+ }
58
+ // Stale entry with different binPath — remove (user-scope) before re-add.
59
+ if (hasGeminiMcpServer()) {
60
+ try {
61
+ await (0, shared_js_1.execFileAsync)('gemini', ['mcp', 'remove', 'chorus', '-s', 'user'], { timeout: 30_000 });
62
+ }
63
+ catch {
64
+ /* best-effort */
65
+ }
66
+ }
67
+ const daemonUrl = opts.daemonUrl ?? shared_js_1.DEFAULT_DAEMON_URL;
68
+ try {
69
+ await (0, shared_js_1.execFileAsync)('gemini', [
70
+ 'mcp',
71
+ 'add',
72
+ 'chorus',
73
+ 'node',
74
+ opts.binPath,
75
+ 'mcp',
76
+ '-e',
77
+ `CHORUS_DAEMON_URL=${daemonUrl}`,
78
+ '-s',
79
+ 'user',
80
+ '-t',
81
+ 'stdio',
82
+ '--trust',
83
+ ], { timeout: 30_000 });
84
+ }
85
+ catch (err) {
86
+ const msg = err instanceof Error ? err.message : String(err);
87
+ throw new Error(`gemini mcp add failed: ${msg}`);
88
+ }
89
+ return {
90
+ added: ['mcpServers.chorus'],
91
+ alreadyPresent: [],
92
+ configPath: GEMINI_SETTINGS_PATH,
93
+ slashCommand: 'skipped',
94
+ slashCommandPath: '',
95
+ };
96
+ }
97
+ exports.geminiOrchestrator = {
98
+ name: 'gemini',
99
+ label: 'Gemini CLI',
100
+ getStatus: getGeminiStatus,
101
+ detect: () => node_fs_1.default.existsSync(GEMINI_SETTINGS_PATH),
102
+ connect: async (opts) => {
103
+ const before = hasGeminiMcpServer();
104
+ const full = await connectGemini(opts);
105
+ return { registered: !before, toolsAdded: 0, full };
106
+ },
107
+ };
108
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/daemon/orchestrators/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ /**
3
+ * Orchestrator integrations: pre-approve Chorus's MCP tools in
4
+ * third-party editors / CLIs so users don't get prompted on every tool
5
+ * call. Same logic the `chorus connect` CLI uses, exposed via daemon
6
+ * HTTP so the cockpit's /connect page can do it with one click.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.CHORUS_TOOLS = void 0;
10
+ exports.listOrchestrators = listOrchestrators;
11
+ exports.connectByName = connectByName;
12
+ exports.autoConnectAll = autoConnectAll;
13
+ const claude_js_1 = require("./claude.js");
14
+ const codex_js_1 = require("./codex.js");
15
+ const cursor_windsurf_js_1 = require("./cursor-windsurf.js");
16
+ const gemini_js_1 = require("./gemini.js");
17
+ const kimi_js_1 = require("./kimi.js");
18
+ const opencode_js_1 = require("./opencode.js");
19
+ var shared_js_1 = require("./shared.js");
20
+ Object.defineProperty(exports, "CHORUS_TOOLS", { enumerable: true, get: function () { return shared_js_1.CHORUS_TOOLS; } });
21
+ const ORCHESTRATORS = [
22
+ claude_js_1.claudeOrchestrator,
23
+ codex_js_1.codexOrchestrator,
24
+ gemini_js_1.geminiOrchestrator,
25
+ opencode_js_1.opencodeOrchestrator,
26
+ kimi_js_1.kimiOrchestrator,
27
+ cursor_windsurf_js_1.cursorOrchestrator,
28
+ cursor_windsurf_js_1.windsurfOrchestrator,
29
+ ];
30
+ function listOrchestrators() {
31
+ return ORCHESTRATORS.map((o) => o.getStatus());
32
+ }
33
+ async function connectByName(name, opts = { binPath: '' }) {
34
+ const def = ORCHESTRATORS.find((o) => o.name === name);
35
+ if (!def)
36
+ throw new Error(`Unknown orchestrator '${name}'.`);
37
+ // Claude is the only orchestrator with a project-config side-effect on
38
+ // top of the user-config one — keep `registerClaudeMcpServer` running
39
+ // before `connectClaude` to match the v0.5 ordering.
40
+ if (def.name === 'claude')
41
+ await (0, claude_js_1.registerClaudeMcpServer)(opts);
42
+ const result = await def.connect(opts);
43
+ return result.full;
44
+ }
45
+ /**
46
+ * Detect every CLI we know about and connect to all that are present.
47
+ * Pass `only` to limit to a subset (e.g. ['claude', 'gemini']).
48
+ */
49
+ async function autoConnectAll(opts) {
50
+ const steps = [];
51
+ const allowed = opts.only ? new Set(opts.only) : null;
52
+ for (const def of ORCHESTRATORS) {
53
+ if (allowed && !allowed.has(def.name))
54
+ continue;
55
+ if (!def.detect()) {
56
+ steps.push({
57
+ name: def.name,
58
+ label: def.label,
59
+ detected: false,
60
+ registered: false,
61
+ toolsAdded: 0,
62
+ });
63
+ continue;
64
+ }
65
+ try {
66
+ const result = await def.connect(opts);
67
+ steps.push({
68
+ name: def.name,
69
+ label: def.label,
70
+ detected: true,
71
+ registered: result.registered,
72
+ toolsAdded: result.toolsAdded,
73
+ slashCommand: result.slashCommand,
74
+ });
75
+ }
76
+ catch (err) {
77
+ steps.push({
78
+ name: def.name,
79
+ label: def.label,
80
+ detected: true,
81
+ registered: false,
82
+ toolsAdded: 0,
83
+ error: err instanceof Error ? err.message : String(err),
84
+ });
85
+ }
86
+ }
87
+ const anyConnected = steps.some((s) => s.detected && !s.unsupported && !s.error);
88
+ return { steps, anyConnected };
89
+ }
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/daemon/orchestrators/index.ts"],"names":[],"mappings":"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"}