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.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/cache/.previewinfo +1 -1
- package/.next/cache/.rscinfo +1 -1
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/new.html +1 -1
- package/.next/server/app/new.rsc +1 -1
- package/.next/server/app/new.segments/_full.segment.rsc +1 -1
- package/.next/server/app/new.segments/_head.segment.rsc +1 -1
- package/.next/server/app/new.segments/_index.segment.rsc +1 -1
- package/.next/server/app/new.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/new.segments/new/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/new.segments/new.segment.rsc +1 -1
- package/.next/server/app/onboarding.html +1 -1
- package/.next/server/app/onboarding.rsc +1 -1
- package/.next/server/app/onboarding.segments/_full.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/_index.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
- package/.next/server/app/personas.html +1 -1
- package/.next/server/app/personas.rsc +1 -1
- package/.next/server/app/personas.segments/_full.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_head.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_index.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/personas.segments/personas/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/personas.segments/personas.segment.rsc +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +1 -1
- package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/templates.html +1 -1
- package/.next/server/app/templates.rsc +1 -1
- package/.next/server/app/templates.segments/_full.segment.rsc +1 -1
- package/.next/server/app/templates.segments/_head.segment.rsc +1 -1
- package/.next/server/app/templates.segments/_index.segment.rsc +1 -1
- package/.next/server/app/templates.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/templates.segments/templates/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/templates.segments/templates.segment.rsc +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/trace +1 -1
- package/.next/trace-build +1 -1
- package/README.md +38 -15
- package/dist/cli/commands/doctor.js +116 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.js +211 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/start.js +298 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.js +54 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.js +97 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/connect.js +108 -0
- package/dist/cli/connect.js.map +1 -0
- package/dist/cli/index.js +99 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/port-utils.js +260 -0
- package/dist/cli/port-utils.js.map +1 -0
- package/dist/cli/runtime-env.js +60 -0
- package/dist/cli/runtime-env.js.map +1 -0
- package/dist/cli/shared.js +54 -0
- package/dist/cli/shared.js.map +1 -0
- package/dist/cli/ui.js +60 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/daemon/agents/claude.js +98 -0
- package/dist/daemon/agents/claude.js.map +1 -0
- package/dist/daemon/agents/codex.js +160 -0
- package/dist/daemon/agents/codex.js.map +1 -0
- package/dist/daemon/agents/gemini.js +111 -0
- package/dist/daemon/agents/gemini.js.map +1 -0
- package/dist/daemon/agents/index.js +59 -0
- package/dist/daemon/agents/index.js.map +1 -0
- package/dist/daemon/agents/kimi.js +206 -0
- package/dist/daemon/agents/kimi.js.map +1 -0
- package/dist/daemon/agents/opencode.js +228 -0
- package/dist/daemon/agents/opencode.js.map +1 -0
- package/dist/daemon/agents/openrouter.js +274 -0
- package/dist/daemon/agents/openrouter.js.map +1 -0
- package/dist/daemon/agents/parsers/claude.js +63 -0
- package/dist/daemon/agents/parsers/claude.js.map +1 -0
- package/dist/daemon/agents/parsers/codex.js +51 -0
- package/dist/daemon/agents/parsers/codex.js.map +1 -0
- package/dist/daemon/agents/parsers/gemini.js +144 -0
- package/dist/daemon/agents/parsers/gemini.js.map +1 -0
- package/dist/daemon/agents/parsers/index.js +31 -0
- package/dist/daemon/agents/parsers/index.js.map +1 -0
- package/dist/daemon/agents/parsers/kimi.js +8 -0
- package/dist/daemon/agents/parsers/kimi.js.map +1 -0
- package/dist/daemon/agents/parsers/opencode.js +105 -0
- package/dist/daemon/agents/parsers/opencode.js.map +1 -0
- package/dist/daemon/agents/parsers/openrouter.js +69 -0
- package/dist/daemon/agents/parsers/openrouter.js.map +1 -0
- package/dist/daemon/agents/parsers/shared.js +17 -0
- package/dist/daemon/agents/parsers/shared.js.map +1 -0
- package/dist/daemon/agents/preflight.js +83 -0
- package/dist/daemon/agents/preflight.js.map +1 -0
- package/dist/daemon/agents/quote.js +45 -0
- package/dist/daemon/agents/quote.js.map +1 -0
- package/dist/daemon/agents/sandbox-guard.js +69 -0
- package/dist/daemon/agents/sandbox-guard.js.map +1 -0
- package/dist/daemon/agents/types.js +6 -0
- package/dist/daemon/agents/types.js.map +1 -0
- package/dist/daemon/api-response.js +65 -0
- package/dist/daemon/api-response.js.map +1 -0
- package/dist/daemon/error-detector.js +329 -0
- package/dist/daemon/error-detector.js.map +1 -0
- package/dist/daemon/headless.js +533 -0
- package/dist/daemon/headless.js.map +1 -0
- package/dist/daemon/index.js +333 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/openrouter.js +192 -0
- package/dist/daemon/openrouter.js.map +1 -0
- package/dist/daemon/orchestrators/claude.js +163 -0
- package/dist/daemon/orchestrators/claude.js.map +1 -0
- package/dist/daemon/orchestrators/codex.js +101 -0
- package/dist/daemon/orchestrators/codex.js.map +1 -0
- package/dist/daemon/orchestrators/cursor-windsurf.js +118 -0
- package/dist/daemon/orchestrators/cursor-windsurf.js.map +1 -0
- package/dist/daemon/orchestrators/gemini.js +108 -0
- package/dist/daemon/orchestrators/gemini.js.map +1 -0
- package/dist/daemon/orchestrators/index.js +90 -0
- package/dist/daemon/orchestrators/index.js.map +1 -0
- package/dist/daemon/orchestrators/kimi.js +108 -0
- package/dist/daemon/orchestrators/kimi.js.map +1 -0
- package/dist/daemon/orchestrators/opencode.js +152 -0
- package/dist/daemon/orchestrators/opencode.js.map +1 -0
- package/dist/daemon/orchestrators/shared.js +60 -0
- package/dist/daemon/orchestrators/shared.js.map +1 -0
- package/dist/daemon/output-watcher.js +131 -0
- package/dist/daemon/output-watcher.js.map +1 -0
- package/dist/daemon/participant-aborts.js +123 -0
- package/dist/daemon/participant-aborts.js.map +1 -0
- package/dist/daemon/reaper.js +46 -0
- package/dist/daemon/reaper.js.map +1 -0
- package/dist/daemon/routes/chats-events.js +62 -0
- package/dist/daemon/routes/chats-events.js.map +1 -0
- package/dist/daemon/routes/chats-stream.js +241 -0
- package/dist/daemon/routes/chats-stream.js.map +1 -0
- package/dist/daemon/routes/chats-validation.js +13 -0
- package/dist/daemon/routes/chats-validation.js.map +1 -0
- package/dist/daemon/routes/chats.js +545 -0
- package/dist/daemon/routes/chats.js.map +1 -0
- package/dist/daemon/routes/openrouter.js +103 -0
- package/dist/daemon/routes/openrouter.js.map +1 -0
- package/dist/daemon/routes/settings.js +199 -0
- package/dist/daemon/routes/settings.js.map +1 -0
- package/dist/daemon/routes/stats.js +155 -0
- package/dist/daemon/routes/stats.js.map +1 -0
- package/dist/daemon/routes/system.js +208 -0
- package/dist/daemon/routes/system.js.map +1 -0
- package/dist/daemon/routes/templates-personas.js +254 -0
- package/dist/daemon/routes/templates-personas.js.map +1 -0
- package/dist/daemon/routes/voices.js +139 -0
- package/dist/daemon/routes/voices.js.map +1 -0
- package/dist/daemon/runner/doer-driver.js +346 -0
- package/dist/daemon/runner/doer-driver.js.map +1 -0
- package/dist/daemon/runner/doer.js +336 -0
- package/dist/daemon/runner/doer.js.map +1 -0
- package/dist/daemon/runner/prior-round.js +140 -0
- package/dist/daemon/runner/prior-round.js.map +1 -0
- package/dist/daemon/runner/prompt-builder.js +292 -0
- package/dist/daemon/runner/prompt-builder.js.map +1 -0
- package/dist/daemon/runner/review-only-phase.js +103 -0
- package/dist/daemon/runner/review-only-phase.js.map +1 -0
- package/dist/daemon/runner/reviewer-driver.js +410 -0
- package/dist/daemon/runner/reviewer-driver.js.map +1 -0
- package/dist/daemon/runner/reviewer.js +384 -0
- package/dist/daemon/runner/reviewer.js.map +1 -0
- package/dist/daemon/runner/run-with-fallback.js +56 -0
- package/dist/daemon/runner/run-with-fallback.js.map +1 -0
- package/dist/daemon/runner/sanitize-name.js +8 -0
- package/dist/daemon/runner/sanitize-name.js.map +1 -0
- package/dist/daemon/runner/stream-file-writer.js +116 -0
- package/dist/daemon/runner/stream-file-writer.js.map +1 -0
- package/dist/daemon/runner/swap-sidecar.js +102 -0
- package/dist/daemon/runner/swap-sidecar.js.map +1 -0
- package/dist/daemon/runner/template-fallback.js +119 -0
- package/dist/daemon/runner/template-fallback.js.map +1 -0
- package/dist/daemon/runner/types.js +3 -0
- package/dist/daemon/runner/types.js.map +1 -0
- package/dist/daemon/runner/verdict.js +51 -0
- package/dist/daemon/runner/verdict.js.map +1 -0
- package/dist/daemon/runner-multiplex.js +364 -0
- package/dist/daemon/runner-multiplex.js.map +1 -0
- package/dist/daemon/runner.js +427 -0
- package/dist/daemon/runner.js.map +1 -0
- package/dist/daemon/ship.js +340 -0
- package/dist/daemon/ship.js.map +1 -0
- package/dist/daemon/template-cache.js +37 -0
- package/dist/daemon/template-cache.js.map +1 -0
- package/dist/daemon/tmux-types.js +9 -0
- package/dist/daemon/tmux-types.js.map +1 -0
- package/dist/daemon/tmux.js +341 -0
- package/dist/daemon/tmux.js.map +1 -0
- package/dist/lib/atomic-write.js +55 -0
- package/dist/lib/atomic-write.js.map +1 -0
- package/dist/lib/chat-events-bus.js +27 -0
- package/dist/lib/chat-events-bus.js.map +1 -0
- package/dist/lib/chat-slug.js +105 -0
- package/dist/lib/chat-slug.js.map +1 -0
- package/dist/lib/cli-detect.js +388 -0
- package/dist/lib/cli-detect.js.map +1 -0
- package/dist/lib/cli-health.js +156 -0
- package/dist/lib/cli-health.js.map +1 -0
- package/dist/lib/cli-paths.js +113 -0
- package/dist/lib/cli-paths.js.map +1 -0
- package/dist/lib/cli-precheck.js +141 -0
- package/dist/lib/cli-precheck.js.map +1 -0
- package/dist/lib/db/chats.js +244 -0
- package/dist/lib/db/chats.js.map +1 -0
- package/dist/lib/db/connection.js +254 -0
- package/dist/lib/db/connection.js.map +1 -0
- package/dist/lib/db/index.js +34 -0
- package/dist/lib/db/index.js.map +1 -0
- package/dist/lib/db/personas.js +65 -0
- package/dist/lib/db/personas.js.map +1 -0
- package/dist/lib/db/phase-events.js +172 -0
- package/dist/lib/db/phase-events.js.map +1 -0
- package/dist/lib/db/secrets.js +53 -0
- package/dist/lib/db/secrets.js.map +1 -0
- package/dist/lib/db/settings.js +47 -0
- package/dist/lib/db/settings.js.map +1 -0
- package/dist/lib/db/templates.js +75 -0
- package/dist/lib/db/templates.js.map +1 -0
- package/dist/lib/db/voices.js +184 -0
- package/dist/lib/db/voices.js.map +1 -0
- package/dist/lib/lineage-maps.js +200 -0
- package/dist/lib/lineage-maps.js.map +1 -0
- package/dist/lib/logger.js +186 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/personas.js +117 -0
- package/dist/lib/personas.js.map +1 -0
- package/dist/lib/runtime-path.js +222 -0
- package/dist/lib/runtime-path.js.map +1 -0
- package/dist/lib/settings/billing.js +58 -0
- package/dist/lib/settings/billing.js.map +1 -0
- package/dist/lib/settings/permissions.js +81 -0
- package/dist/lib/settings/permissions.js.map +1 -0
- package/dist/lib/settings/transport.js +113 -0
- package/dist/lib/settings/transport.js.map +1 -0
- package/dist/lib/telemetry.js +290 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/lib/template-schema.js +319 -0
- package/dist/lib/template-schema.js.map +1 -0
- package/dist/lib/template-validation.js +82 -0
- package/dist/lib/template-validation.js.map +1 -0
- package/dist/lib/voices.js +533 -0
- package/dist/lib/voices.js.map +1 -0
- package/dist/mcp/client.js +138 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/index.js +178 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools.js +355 -0
- package/dist/mcp/tools.js.map +1 -0
- package/package.json +2 -1
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js +0 -6077
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js.map +0 -69
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js +0 -6318
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js.map +0 -71
- package/.next/dev/types/cache-life.d.ts +0 -145
- package/.next/dev/types/routes.d.ts +0 -84
- package/.next/dev/types/validator.ts +0 -178
- /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 9cD3yIOGe_Aqr17uJHTQS}/_buildManifest.js +0 -0
- /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 9cD3yIOGe_Aqr17uJHTQS}/_clientMiddlewareManifest.js +0 -0
- /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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"}
|