chorus-codes 0.7.0 → 0.7.1
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/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/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 +240 -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 → 8H2I8TTPlrKuWCV-SxY5f}/_buildManifest.js +0 -0
- /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 8H2I8TTPlrKuWCV-SxY5f}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 8H2I8TTPlrKuWCV-SxY5f}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerDoctorCommand = registerDoctorCommand;
|
|
4
|
+
const ui_js_1 = require("../ui.js");
|
|
5
|
+
async function gatherReport() {
|
|
6
|
+
const { detectAllClis } = await import('../../lib/cli-detect.js');
|
|
7
|
+
const { loadCapturedPath } = await import('../../lib/runtime-path.js');
|
|
8
|
+
const { cliPaths } = await import('../../lib/cli-paths.js');
|
|
9
|
+
await cliPaths.refreshCache();
|
|
10
|
+
const detection = detectAllClis(true);
|
|
11
|
+
const capturedPath = await loadCapturedPath();
|
|
12
|
+
const manualPaths = await cliPaths.listAll();
|
|
13
|
+
const compactManual = {};
|
|
14
|
+
for (const [id, p] of Object.entries(manualPaths)) {
|
|
15
|
+
if (p)
|
|
16
|
+
compactManual[id] = p;
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
detection,
|
|
20
|
+
capturedPath,
|
|
21
|
+
daemonPath: process.env.PATH ?? '',
|
|
22
|
+
manualPaths: compactManual,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function printReport(r) {
|
|
26
|
+
const labelMap = {
|
|
27
|
+
'claude-code': 'claude',
|
|
28
|
+
'codex-cli': 'codex',
|
|
29
|
+
'gemini-cli': 'gemini',
|
|
30
|
+
'opencode-cli': 'opencode',
|
|
31
|
+
'kimi-cli': 'kimi',
|
|
32
|
+
};
|
|
33
|
+
console.log('');
|
|
34
|
+
console.log((0, ui_js_1.header)(ui_js_1.sym.pointer, 'Chorus doctor'));
|
|
35
|
+
console.log('');
|
|
36
|
+
console.log(ui_js_1.c.bold(' CLI detection'));
|
|
37
|
+
console.log('');
|
|
38
|
+
for (const d of r.detection) {
|
|
39
|
+
const name = labelMap[d.id] ?? d.id;
|
|
40
|
+
if (d.found) {
|
|
41
|
+
const sourceTag = d.source === 'manual'
|
|
42
|
+
? ui_js_1.c.cyan('manual')
|
|
43
|
+
: d.source === 'fallback'
|
|
44
|
+
? ui_js_1.c.yellow('fallback')
|
|
45
|
+
: ui_js_1.c.dim('PATH');
|
|
46
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.bold(name.padEnd(10))} ${ui_js_1.c.dim(d.path ?? '')} ${ui_js_1.c.dim('(')}${sourceTag}${ui_js_1.c.dim(')')}`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const reason = d.reason ? ui_js_1.c.dim(` — ${d.reason}`) : '';
|
|
50
|
+
console.log(` ${ui_js_1.sym.err} ${ui_js_1.c.bold(name.padEnd(10))} ${ui_js_1.c.red('not found')}${reason}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
console.log('');
|
|
54
|
+
console.log(ui_js_1.c.bold(' PATH visibility'));
|
|
55
|
+
console.log('');
|
|
56
|
+
console.log(` daemon PATH: ${ui_js_1.c.dim(`${r.daemonPath.split(':').length} dirs`)} ${r.daemonPath ? ui_js_1.c.dim(`(${r.daemonPath.slice(0, 80)}${r.daemonPath.length > 80 ? '…' : ''})`) : ''}`);
|
|
57
|
+
if (r.capturedPath) {
|
|
58
|
+
console.log(` captured shell: ${ui_js_1.c.dim(`${r.capturedPath.split(':').length} dirs`)} ${ui_js_1.c.dim(`(${r.capturedPath.slice(0, 80)}${r.capturedPath.length > 80 ? '…' : ''})`)}`);
|
|
59
|
+
const inDaemon = new Set(r.daemonPath.split(':'));
|
|
60
|
+
const missing = r.capturedPath
|
|
61
|
+
.split(':')
|
|
62
|
+
.filter((p) => p && !inDaemon.has(p));
|
|
63
|
+
if (missing.length > 0) {
|
|
64
|
+
console.log('');
|
|
65
|
+
console.log(` ${ui_js_1.c.yellow('!')} ${missing.length} dirs in your shell PATH but NOT in the daemon's PATH:`);
|
|
66
|
+
for (const p of missing.slice(0, 8)) {
|
|
67
|
+
console.log(` ${ui_js_1.c.dim(p)}`);
|
|
68
|
+
}
|
|
69
|
+
if (missing.length > 8) {
|
|
70
|
+
console.log(` ${ui_js_1.c.dim(`… +${missing.length - 8} more`)}`);
|
|
71
|
+
}
|
|
72
|
+
console.log('');
|
|
73
|
+
console.log(` ${ui_js_1.c.dim('Tip:')} restart the daemon with ${ui_js_1.c.bold('chorus stop && chorus start')} to re-capture.`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.log(` captured shell: ${ui_js_1.c.dim('not captured yet — run ')}${ui_js_1.c.bold('chorus init')}${ui_js_1.c.dim(' or ')}${ui_js_1.c.bold('chorus start')}`);
|
|
78
|
+
}
|
|
79
|
+
if (Object.keys(r.manualPaths).length > 0) {
|
|
80
|
+
console.log('');
|
|
81
|
+
console.log(ui_js_1.c.bold(' Manual overrides'));
|
|
82
|
+
console.log('');
|
|
83
|
+
for (const [id, p] of Object.entries(r.manualPaths)) {
|
|
84
|
+
const name = labelMap[id] ?? id;
|
|
85
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.bold(name.padEnd(10))} ${ui_js_1.c.dim(p)}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Final hint when something looks off
|
|
89
|
+
const missingCli = r.detection.filter((d) => !d.found);
|
|
90
|
+
if (missingCli.length > 0) {
|
|
91
|
+
console.log('');
|
|
92
|
+
console.log(ui_js_1.c.bold(' Next steps'));
|
|
93
|
+
console.log('');
|
|
94
|
+
console.log(` ${ui_js_1.c.dim('•')} Visit ${ui_js_1.c.cyan('http://127.0.0.1:5050/onboarding')} → "I know where it is"`);
|
|
95
|
+
console.log(` to paste a path for any missing CLI.`);
|
|
96
|
+
console.log(` ${ui_js_1.c.dim('•')} Or run ${ui_js_1.c.bold('chorus stop && chorus start')} from your usual terminal so`);
|
|
97
|
+
console.log(` we re-capture the PATH that has the CLI.`);
|
|
98
|
+
}
|
|
99
|
+
console.log('');
|
|
100
|
+
}
|
|
101
|
+
function registerDoctorCommand(program) {
|
|
102
|
+
program
|
|
103
|
+
.command('doctor')
|
|
104
|
+
.description('Diagnose CLI detection + PATH issues — what the daemon sees vs what your shell sees')
|
|
105
|
+
.action(async () => {
|
|
106
|
+
try {
|
|
107
|
+
const report = await gatherReport();
|
|
108
|
+
printReport(report);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
console.error('doctor failed:', err instanceof Error ? err.message : err);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,211 @@
|
|
|
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.registerInitCommand = registerInitCommand;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const index_js_1 = require("../../lib/db/index.js");
|
|
11
|
+
const shared_js_1 = require("../shared.js");
|
|
12
|
+
const ui_js_1 = require("../ui.js");
|
|
13
|
+
/**
|
|
14
|
+
* Detect which reviewer CLIs (claude/codex/gemini/opencode/kimi) are
|
|
15
|
+
* usable on the host. Returns the list of human-friendly names that
|
|
16
|
+
* passed the full detect-and-verify probe. Used by `chorus init` to
|
|
17
|
+
* warn when zero are installed — the cockpit would otherwise look
|
|
18
|
+
* healthy but every run would hang on first dispatch.
|
|
19
|
+
*/
|
|
20
|
+
async function detectReviewerClis() {
|
|
21
|
+
try {
|
|
22
|
+
const { detectAllClis } = await import('../../lib/cli-detect.js');
|
|
23
|
+
const all = detectAllClis();
|
|
24
|
+
const labelMap = {
|
|
25
|
+
'claude-code': 'claude',
|
|
26
|
+
'codex-cli': 'codex',
|
|
27
|
+
'gemini-cli': 'gemini',
|
|
28
|
+
'opencode-cli': 'opencode',
|
|
29
|
+
'kimi-cli': 'kimi',
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
clis: all.filter((d) => d.found).map((d) => labelMap[d.id] ?? d.id),
|
|
33
|
+
detectFailed: false,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return {
|
|
38
|
+
clis: [],
|
|
39
|
+
detectFailed: true,
|
|
40
|
+
detectError: err instanceof Error ? err.message : String(err),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Detect Claude Code / Codex / Gemini / OpenCode and wire each one.
|
|
46
|
+
* If the user passed `--connect <list>` we only touch those.
|
|
47
|
+
*/
|
|
48
|
+
async function runOrchestratorAutoConnect(connectFlag) {
|
|
49
|
+
const { autoConnectAll } = await import('../../daemon/orchestrators/index.js');
|
|
50
|
+
const binPath = shared_js_1.CHORUS_BIN_PATH;
|
|
51
|
+
const ALL_NAMES = [
|
|
52
|
+
'claude',
|
|
53
|
+
'codex',
|
|
54
|
+
'gemini',
|
|
55
|
+
'opencode',
|
|
56
|
+
'kimi',
|
|
57
|
+
'cursor',
|
|
58
|
+
'windsurf',
|
|
59
|
+
];
|
|
60
|
+
let only;
|
|
61
|
+
if (connectFlag) {
|
|
62
|
+
const wanted = connectFlag.split(',').map((s) => s.trim().toLowerCase());
|
|
63
|
+
only = [];
|
|
64
|
+
for (const w of wanted) {
|
|
65
|
+
if (ALL_NAMES.includes(w)) {
|
|
66
|
+
only.push(w);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.error(`Unknown orchestrator '${w}' in --connect. Valid: ${ALL_NAMES.join(', ')}`);
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
console.log('');
|
|
75
|
+
console.log(` ${ui_js_1.c.dim('Detecting orchestrators...')}`);
|
|
76
|
+
const result = await autoConnectAll({ binPath, ...(only ? { only } : {}) });
|
|
77
|
+
for (const step of result.steps) {
|
|
78
|
+
if (!step.detected) {
|
|
79
|
+
console.log(` ${ui_js_1.c.gray('○')} ${ui_js_1.c.gray(step.label.padEnd(14))} ${ui_js_1.c.dim('not detected')}`);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (step.error) {
|
|
83
|
+
console.log(` ${ui_js_1.c.yellow('!')} ${ui_js_1.c.yellow(step.label.padEnd(14))} ${ui_js_1.c.dim(step.error)}`);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const parts = [];
|
|
87
|
+
if (step.registered)
|
|
88
|
+
parts.push('MCP registered');
|
|
89
|
+
else
|
|
90
|
+
parts.push('MCP already registered');
|
|
91
|
+
if (step.toolsAdded > 0)
|
|
92
|
+
parts.push(`${step.toolsAdded} tool(s) approved`);
|
|
93
|
+
else if (step.name === 'claude')
|
|
94
|
+
parts.push('all tools approved');
|
|
95
|
+
if (step.slashCommand === 'installed')
|
|
96
|
+
parts.push('/chorus installed');
|
|
97
|
+
else if (step.slashCommand === 'updated')
|
|
98
|
+
parts.push('/chorus updated');
|
|
99
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.bold(step.label.padEnd(14))} ${ui_js_1.c.dim(parts.join(' · '))}`);
|
|
100
|
+
}
|
|
101
|
+
if (!result.anyConnected) {
|
|
102
|
+
console.log('');
|
|
103
|
+
console.log(` ${ui_js_1.sym.info} ${ui_js_1.c.dim('No supported editors found. Connect manually later with')} ${ui_js_1.c.bold('chorus connect')}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function registerInitCommand(program) {
|
|
107
|
+
program
|
|
108
|
+
.command('init')
|
|
109
|
+
.description('Initialize Chorus: create ~/.chorus/, seed database, register MCP with detected editors')
|
|
110
|
+
.option('--no-register', 'Skip auto-detecting orchestrators')
|
|
111
|
+
.option('--connect <list>', 'Comma-separated list of CLIs to connect (claude,codex,gemini,opencode,kimi,cursor,windsurf). Default: all detected.')
|
|
112
|
+
.action(async (opts) => {
|
|
113
|
+
try {
|
|
114
|
+
const chorusDir = path_1.default.join(os_1.default.homedir(), '.chorus');
|
|
115
|
+
console.log('');
|
|
116
|
+
console.log((0, ui_js_1.header)(ui_js_1.sym.pointer, 'Initializing Chorus...'));
|
|
117
|
+
console.log('');
|
|
118
|
+
if (!fs_1.default.existsSync(chorusDir)) {
|
|
119
|
+
fs_1.default.mkdirSync(chorusDir, { recursive: true });
|
|
120
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.dim('created')} ${chorusDir}`);
|
|
121
|
+
}
|
|
122
|
+
// Seed the DB. resolveDbPath() honours CHORUS_DB_PATH so the
|
|
123
|
+
// line we print matches what the daemon will actually open —
|
|
124
|
+
// hardcoding ~/.chorus/chorus.db here misled users who'd set
|
|
125
|
+
// the env var and then asked "where's my DB?".
|
|
126
|
+
const { getDb } = await import('../../lib/db/index.js');
|
|
127
|
+
await getDb();
|
|
128
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.dim('database ready at')} ${(0, index_js_1.resolveDbPath)()}`);
|
|
129
|
+
// Capture interactive PATH so the daemon can find CLIs in
|
|
130
|
+
// ~/.opencode/bin etc. when it later spawns reviewers from a
|
|
131
|
+
// non-interactive shell. Best-effort: skipped silently when
|
|
132
|
+
// capture fails (CI, no $SHELL, exotic shells we don't model).
|
|
133
|
+
try {
|
|
134
|
+
const { captureInteractivePath, persistCapturedPath } = await import('../../lib/runtime-path.js');
|
|
135
|
+
const captured = captureInteractivePath();
|
|
136
|
+
if (captured) {
|
|
137
|
+
await persistCapturedPath(captured);
|
|
138
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.dim('captured shell PATH (')} ${captured.split(':').length} ${ui_js_1.c.dim('dirs)')}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
/* non-fatal — daemon falls back to known-install probes */
|
|
143
|
+
}
|
|
144
|
+
const templatesDir = path_1.default.join(__dirname, '..', '..', '..', 'templates');
|
|
145
|
+
if (fs_1.default.existsSync(templatesDir)) {
|
|
146
|
+
const files = fs_1.default
|
|
147
|
+
.readdirSync(templatesDir)
|
|
148
|
+
.filter((f) => f.endsWith('.yaml'));
|
|
149
|
+
const seeded = [];
|
|
150
|
+
for (const file of files) {
|
|
151
|
+
const id = file.replace('.yaml', '');
|
|
152
|
+
const yamlPath = path_1.default.join(templatesDir, file);
|
|
153
|
+
const yamlContent = fs_1.default.readFileSync(yamlPath, 'utf-8');
|
|
154
|
+
const existing = await index_js_1.templates.getById(id);
|
|
155
|
+
if (!existing) {
|
|
156
|
+
await index_js_1.templates.create(id, yamlContent, 'builtin');
|
|
157
|
+
seeded.push(id);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (seeded.length > 0) {
|
|
161
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.dim('seeded templates:')} ${ui_js_1.c.cyan(seeded.join(', '))}`);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.dim('templates already up to date')}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Auto-detect & register every supported orchestrator. Skipped
|
|
168
|
+
// if user passes --no-register; restricted via --connect <list>.
|
|
169
|
+
if (opts.register !== false) {
|
|
170
|
+
await runOrchestratorAutoConnect(opts.connect);
|
|
171
|
+
}
|
|
172
|
+
// Reviewer-CLI presence check — separate from orchestrator wiring
|
|
173
|
+
// above. Without at least one of claude/codex/gemini/opencode/
|
|
174
|
+
// kimi installed OR an OpenRouter API key configured, Chorus
|
|
175
|
+
// has nothing to dispatch chats to.
|
|
176
|
+
const detect = await detectReviewerClis();
|
|
177
|
+
if (detect.detectFailed) {
|
|
178
|
+
console.log('');
|
|
179
|
+
console.log(` ${ui_js_1.c.yellow('!')} ${ui_js_1.c.bold(ui_js_1.c.yellow('CLI detection crashed:'))} ${detect.detectError ?? 'unknown error'}`);
|
|
180
|
+
console.log(ui_js_1.c.dim(' Init continued anyway — verify reviewers in Settings → Voices once you start the cockpit.'));
|
|
181
|
+
}
|
|
182
|
+
else if (detect.clis.length === 0) {
|
|
183
|
+
console.log('');
|
|
184
|
+
console.log(` ${ui_js_1.c.yellow('!')} ${ui_js_1.c.bold(ui_js_1.c.yellow('No AI CLIs detected on this machine.'))}`);
|
|
185
|
+
console.log(ui_js_1.c.dim(' Chorus needs at least one of these (or an OpenRouter API key):'));
|
|
186
|
+
console.log(ui_js_1.c.dim(' claude — https://docs.anthropic.com/en/docs/claude-code'));
|
|
187
|
+
console.log(ui_js_1.c.dim(' codex — https://github.com/openai/codex'));
|
|
188
|
+
console.log(ui_js_1.c.dim(' gemini — https://github.com/google-gemini/gemini-cli'));
|
|
189
|
+
console.log(ui_js_1.c.dim(' opencode — https://opencode.ai'));
|
|
190
|
+
console.log(ui_js_1.c.dim(' kimi — https://github.com/MoonshotAI/kimi-cli'));
|
|
191
|
+
console.log(ui_js_1.c.dim(' openrouter — Settings → Voices → Add OpenRouter (uses your API key)'));
|
|
192
|
+
console.log(ui_js_1.c.dim(' Install at least one CLI, or add an OpenRouter voice after `chorus start`.'));
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
console.log('');
|
|
196
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.dim('AI CLIs ready:')} ${ui_js_1.c.cyan(detect.clis.join(', '))}`);
|
|
197
|
+
}
|
|
198
|
+
console.log('');
|
|
199
|
+
console.log((0, ui_js_1.header)(ui_js_1.sym.ok, 'Chorus initialized'));
|
|
200
|
+
console.log('');
|
|
201
|
+
console.log(` ${ui_js_1.c.dim('Next:')} ${ui_js_1.c.bold('chorus start')} ${ui_js_1.c.dim('— bring up the daemon and cockpit.')}`);
|
|
202
|
+
console.log(` ${ui_js_1.c.dim('Then restart any editor we just registered (Claude Code, etc.) so it picks up the MCP server.')}`);
|
|
203
|
+
console.log('');
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
console.error(`${ui_js_1.sym.err} ${ui_js_1.c.red('Initialization failed:')}`, error);
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,240 @@
|
|
|
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.registerStartCommand = registerStartCommand;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const open_1 = __importDefault(require("open"));
|
|
10
|
+
const os_1 = __importDefault(require("os"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const port_utils_js_1 = require("../port-utils.js");
|
|
13
|
+
const runtime_env_js_1 = require("../runtime-env.js");
|
|
14
|
+
const shared_js_1 = require("../shared.js");
|
|
15
|
+
const ui_js_1 = require("../ui.js");
|
|
16
|
+
function registerStartCommand(program) {
|
|
17
|
+
program
|
|
18
|
+
.command('start')
|
|
19
|
+
.option('--ui', 'Open browser UI after starting daemon')
|
|
20
|
+
.description('Start the Chorus daemon (PM2-style fork)')
|
|
21
|
+
.action(async (options) => {
|
|
22
|
+
try {
|
|
23
|
+
const chorusDir = path_1.default.join(os_1.default.homedir(), '.chorus');
|
|
24
|
+
const pidFile = path_1.default.join(chorusDir, 'daemon.pid');
|
|
25
|
+
if (await alreadyRunning(pidFile, options.ui))
|
|
26
|
+
return;
|
|
27
|
+
await reapOrphans();
|
|
28
|
+
warnIfTmuxMissing();
|
|
29
|
+
// Capture the interactive PATH from the user's terminal BEFORE
|
|
30
|
+
// forking the daemon. The daemon's own spawn loses this — it
|
|
31
|
+
// runs from a non-interactive shell that skips ~/.bashrc, so
|
|
32
|
+
// tools installed to ~/.opencode/bin etc. would be missing.
|
|
33
|
+
// Re-capturing on every start (not just init) means a user who
|
|
34
|
+
// adds a new tool to PATH and restarts picks it up automatically.
|
|
35
|
+
await captureAndPersistPath();
|
|
36
|
+
spawnDaemonAndCockpit(chorusDir, pidFile);
|
|
37
|
+
scheduleAutoOpenBrowser(options.ui);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error('Failed to start daemon:', error);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Run the user's interactive shell once and stash $PATH so the daemon
|
|
47
|
+
* (running in a non-interactive shell that skips .bashrc/.zshrc) can
|
|
48
|
+
* find CLIs the user installed via official curl-bash scripts.
|
|
49
|
+
*
|
|
50
|
+
* Best-effort. Capture or persist failures are swallowed — the daemon
|
|
51
|
+
* has fallback known-install probes and the previous saved value, if
|
|
52
|
+
* any, stays put.
|
|
53
|
+
*/
|
|
54
|
+
async function captureAndPersistPath() {
|
|
55
|
+
try {
|
|
56
|
+
const { captureInteractivePath, persistCapturedPath } = await import('../../lib/runtime-path.js');
|
|
57
|
+
const captured = captureInteractivePath();
|
|
58
|
+
if (captured)
|
|
59
|
+
await persistCapturedPath(captured);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
/* non-fatal */
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async function alreadyRunning(pidFile, uiFlag) {
|
|
66
|
+
if (!fs_1.default.existsSync(pidFile))
|
|
67
|
+
return false;
|
|
68
|
+
const oldPid = parseInt(fs_1.default.readFileSync(pidFile, 'utf-8'), 10);
|
|
69
|
+
try {
|
|
70
|
+
// Cross-platform liveness probe. process.kill(pid, 0) throws if no
|
|
71
|
+
// process with that pid exists; works on Windows/macOS/Linux unlike
|
|
72
|
+
// the unix-only `kill -0` shell command we used to invoke here.
|
|
73
|
+
if (Number.isFinite(oldPid) && oldPid > 0) {
|
|
74
|
+
process.kill(oldPid, 0);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
throw new Error('invalid pid');
|
|
78
|
+
}
|
|
79
|
+
console.log('');
|
|
80
|
+
console.log((0, ui_js_1.header)(ui_js_1.sym.ok, 'Chorus is already running', `daemon PID ${oldPid}`));
|
|
81
|
+
(0, shared_js_1.printCockpitAccessHint)();
|
|
82
|
+
if (uiFlag && (0, runtime_env_js_1.shouldAutoOpenBrowser)((0, runtime_env_js_1.detectRuntimeEnv)())) {
|
|
83
|
+
(0, open_1.default)(shared_js_1.COCKPIT_URL);
|
|
84
|
+
}
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Process doesn't exist, clean up the stale pidfile.
|
|
89
|
+
fs_1.default.unlinkSync(pidFile);
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Pre-spawn orphan reap. Pidfile-based liveness only catches the
|
|
95
|
+
* recorded daemon PID — it misses a stale next-server (cockpit) or
|
|
96
|
+
* daemon that survived a previous `chorus stop` because the SIGTERM
|
|
97
|
+
* was ignored or the pidfile got out of sync. Without this sweep, a
|
|
98
|
+
* fresh `chorus start` would race against the orphan on :5050 / :7707,
|
|
99
|
+
* the new spawn would lose, and the user would see 500s served by the
|
|
100
|
+
* ghost (incident 2026-05-03).
|
|
101
|
+
*
|
|
102
|
+
* Foreign-process guard: only reap PIDs whose cmdline looks like a
|
|
103
|
+
* chorus daemon/cockpit. If something else (Grafana on :5050, a
|
|
104
|
+
* colleague's `next dev` on :7707) is bound, refuse to kill it and ask
|
|
105
|
+
* the user to free the port. Pre-fix the reaper would silently SIGKILL
|
|
106
|
+
* whatever it found.
|
|
107
|
+
*/
|
|
108
|
+
async function reapOrphans() {
|
|
109
|
+
for (const [port, label] of [
|
|
110
|
+
[7707, 'daemon'],
|
|
111
|
+
[5050, 'cockpit'],
|
|
112
|
+
]) {
|
|
113
|
+
if (!(await (0, port_utils_js_1.isPortInUse)(port)))
|
|
114
|
+
continue;
|
|
115
|
+
const pids = (0, port_utils_js_1.findPidsOnPort)(port);
|
|
116
|
+
if (pids.length === 0) {
|
|
117
|
+
console.log('');
|
|
118
|
+
console.log((0, ui_js_1.header)(ui_js_1.sym.err, `Port :${port} is in use by another process`, `couldn't identify the PID — free the port and retry`));
|
|
119
|
+
console.log('');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
for (const pid of pids) {
|
|
123
|
+
const { match, cmdline } = (0, port_utils_js_1.pidLooksLikeChorus)(pid);
|
|
124
|
+
if (!match) {
|
|
125
|
+
console.log('');
|
|
126
|
+
console.log((0, ui_js_1.header)(ui_js_1.sym.err, `Port :${port} is in use by a non-chorus process`, `PID ${pid}: ${cmdline ?? '(unreadable)'}`));
|
|
127
|
+
console.log('');
|
|
128
|
+
console.log((0, ui_js_1.tip)(label === 'daemon'
|
|
129
|
+
? `Free :${port} (stop the other process, or relocate the daemon via CHORUS_DAEMON_PORT) and retry \`chorus start\`.`
|
|
130
|
+
: `Free :${port} (stop the other process listening on the cockpit port) and retry \`chorus start\`.`));
|
|
131
|
+
console.log('');
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
const dead = await (0, port_utils_js_1.killAndVerify)(pid, `${label} orphan`);
|
|
135
|
+
if (dead) {
|
|
136
|
+
console.log(` ${ui_js_1.sym.ok} reaped ${label} orphan on :${port} ${ui_js_1.c.dim(`(PID ${pid})`)}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Default transport is 'headless' (no tmux needed). tmux is the
|
|
143
|
+
* OPTIONAL backup mode for users who want to attach to a live voice
|
|
144
|
+
* session and take over / watch step-by-step / hand off mid-run.
|
|
145
|
+
* Surfaced once at start so power users know the feature exists.
|
|
146
|
+
* Soft-info (not a warning) so we don't scare default-path users.
|
|
147
|
+
*/
|
|
148
|
+
function warnIfTmuxMissing() {
|
|
149
|
+
try {
|
|
150
|
+
(0, child_process_1.execFileSync)('tmux', ['-V'], { stdio: 'ignore' });
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
console.log('');
|
|
154
|
+
console.log(ui_js_1.c.dim(` ${ui_js_1.sym.info} tmux not detected. Chorus runs headless by default — this is fine.`));
|
|
155
|
+
console.log(ui_js_1.c.dim(' Optional backup mode: install tmux, then open'));
|
|
156
|
+
console.log(ui_js_1.c.dim(' http://127.0.0.1:5050/settings#transport and pick "Tmux — attach & take over".'));
|
|
157
|
+
console.log(ui_js_1.c.dim(' `tmux attach -t <name>` lets you watch step-by-step or take over mid-run.'));
|
|
158
|
+
console.log(ui_js_1.c.dim(' macOS: brew install tmux · Ubuntu/Debian: apt install tmux · Fedora: dnf install tmux'));
|
|
159
|
+
console.log('');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function spawnDaemonAndCockpit(chorusDir, pidFile) {
|
|
163
|
+
// Prefer the compiled JS so a global install works (no src/ shipped,
|
|
164
|
+
// no tsx loader registered); fall back to the .ts source when running
|
|
165
|
+
// in dev mode where the user only has src/ on disk.
|
|
166
|
+
const daemonJs = path_1.default.resolve(__dirname, '..', '..', 'daemon', 'index.js');
|
|
167
|
+
const daemonTs = path_1.default.resolve(__dirname, '..', '..', '..', 'src', 'daemon', 'index.ts');
|
|
168
|
+
const useCompiled = fs_1.default.existsSync(daemonJs);
|
|
169
|
+
const daemonPath = useCompiled ? daemonJs : daemonTs;
|
|
170
|
+
const spawnArgs = useCompiled ? [daemonPath] : ['-r', 'tsx/cjs', daemonPath];
|
|
171
|
+
// Pipe daemon stdout + stderr to a log file so the user (and we, when
|
|
172
|
+
// debugging) can see why a chat went sideways. Previously stdio was
|
|
173
|
+
// 'ignore' which made silent failures impossible to diagnose. Logs
|
|
174
|
+
// rotate manually; truncated to 10 MB max via periodic rotate inside
|
|
175
|
+
// the daemon (TODO).
|
|
176
|
+
fs_1.default.mkdirSync(chorusDir, { recursive: true });
|
|
177
|
+
const logsDir = path_1.default.join(chorusDir, 'logs');
|
|
178
|
+
fs_1.default.mkdirSync(logsDir, { recursive: true });
|
|
179
|
+
const daemonLogPath = path_1.default.join(logsDir, 'daemon.log');
|
|
180
|
+
const daemonLogFd = fs_1.default.openSync(daemonLogPath, 'a');
|
|
181
|
+
const child = (0, child_process_1.spawn)('node', spawnArgs, {
|
|
182
|
+
detached: true,
|
|
183
|
+
stdio: ['ignore', daemonLogFd, daemonLogFd],
|
|
184
|
+
});
|
|
185
|
+
if (!child.pid) {
|
|
186
|
+
throw new Error('Failed to spawn daemon process');
|
|
187
|
+
}
|
|
188
|
+
fs_1.default.writeFileSync(pidFile, child.pid.toString());
|
|
189
|
+
// Spawn the cockpit web UI alongside the daemon. The package ships a
|
|
190
|
+
// built .next directory; run next from the package root so it picks
|
|
191
|
+
// up the bundled bun_modules. Web PID is tracked separately so
|
|
192
|
+
// `chorus stop` can clean up both.
|
|
193
|
+
const packageRoot = path_1.default.resolve(__dirname, '..', '..', '..');
|
|
194
|
+
const nextEntry = path_1.default.resolve(packageRoot, 'node_modules', 'next', 'dist', 'bin', 'next');
|
|
195
|
+
const webPidFile = path_1.default.join(chorusDir, 'web.pid');
|
|
196
|
+
if (fs_1.default.existsSync(nextEntry) &&
|
|
197
|
+
fs_1.default.existsSync(path_1.default.join(packageRoot, '.next'))) {
|
|
198
|
+
const webLogPath = path_1.default.join(logsDir, 'web.log');
|
|
199
|
+
const webLogFd = fs_1.default.openSync(webLogPath, 'a');
|
|
200
|
+
const webChild = (0, child_process_1.spawn)('node', [nextEntry, 'start', '-p', '5050', '-H', '127.0.0.1'], {
|
|
201
|
+
cwd: packageRoot,
|
|
202
|
+
detached: true,
|
|
203
|
+
stdio: ['ignore', webLogFd, webLogFd],
|
|
204
|
+
});
|
|
205
|
+
if (webChild.pid) {
|
|
206
|
+
fs_1.default.writeFileSync(webPidFile, webChild.pid.toString());
|
|
207
|
+
webChild.unref();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
// Loud, actionable error — the previous yellow warning was easy to
|
|
212
|
+
// miss and left users at a blank cockpit URL with no idea why. We
|
|
213
|
+
// keep the daemon running (MCP + API still work) but make the
|
|
214
|
+
// remediation steps obvious.
|
|
215
|
+
console.log('');
|
|
216
|
+
console.log(ui_js_1.c.red(' ✗ Cockpit UI not found.'));
|
|
217
|
+
if (fs_1.default.existsSync(path_1.default.join(packageRoot, 'src'))) {
|
|
218
|
+
console.log(ui_js_1.c.dim(' This looks like a dev checkout. Build it once:'));
|
|
219
|
+
console.log(` ${ui_js_1.c.bold('pnpm install && pnpm build')}`);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
console.log(ui_js_1.c.dim(' The published install should ship a built UI. Try reinstalling:'));
|
|
223
|
+
console.log(` ${ui_js_1.c.bold('npm install -g chorus-codes')}`);
|
|
224
|
+
}
|
|
225
|
+
console.log(ui_js_1.c.dim(' The daemon API is still up on port 7707 if you only need MCP.'));
|
|
226
|
+
console.log('');
|
|
227
|
+
}
|
|
228
|
+
child.unref();
|
|
229
|
+
console.log('');
|
|
230
|
+
console.log((0, ui_js_1.header)(ui_js_1.sym.ok, 'Chorus started', `daemon PID ${child.pid}`));
|
|
231
|
+
(0, shared_js_1.printCockpitAccessHint)();
|
|
232
|
+
}
|
|
233
|
+
function scheduleAutoOpenBrowser(uiFlag) {
|
|
234
|
+
setTimeout(() => {
|
|
235
|
+
if (uiFlag && (0, runtime_env_js_1.shouldAutoOpenBrowser)((0, runtime_env_js_1.detectRuntimeEnv)())) {
|
|
236
|
+
(0, open_1.default)(shared_js_1.COCKPIT_URL);
|
|
237
|
+
}
|
|
238
|
+
}, 1000);
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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"}
|