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.
Files changed (291) 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/fallback-build-manifest.json +3 -3
  6. package/.next/prerender-manifest.json +3 -3
  7. package/.next/server/app/_global-error.html +1 -1
  8. package/.next/server/app/_global-error.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found.html +1 -1
  15. package/.next/server/app/_not-found.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  22. package/.next/server/app/new.html +1 -1
  23. package/.next/server/app/new.rsc +1 -1
  24. package/.next/server/app/new.segments/_full.segment.rsc +1 -1
  25. package/.next/server/app/new.segments/_head.segment.rsc +1 -1
  26. package/.next/server/app/new.segments/_index.segment.rsc +1 -1
  27. package/.next/server/app/new.segments/_tree.segment.rsc +1 -1
  28. package/.next/server/app/new.segments/new/__PAGE__.segment.rsc +1 -1
  29. package/.next/server/app/new.segments/new.segment.rsc +1 -1
  30. package/.next/server/app/onboarding.html +1 -1
  31. package/.next/server/app/onboarding.rsc +1 -1
  32. package/.next/server/app/onboarding.segments/_full.segment.rsc +1 -1
  33. package/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
  34. package/.next/server/app/onboarding.segments/_index.segment.rsc +1 -1
  35. package/.next/server/app/onboarding.segments/_tree.segment.rsc +1 -1
  36. package/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +1 -1
  37. package/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
  38. package/.next/server/app/personas.html +1 -1
  39. package/.next/server/app/personas.rsc +1 -1
  40. package/.next/server/app/personas.segments/_full.segment.rsc +1 -1
  41. package/.next/server/app/personas.segments/_head.segment.rsc +1 -1
  42. package/.next/server/app/personas.segments/_index.segment.rsc +1 -1
  43. package/.next/server/app/personas.segments/_tree.segment.rsc +1 -1
  44. package/.next/server/app/personas.segments/personas/__PAGE__.segment.rsc +1 -1
  45. package/.next/server/app/personas.segments/personas.segment.rsc +1 -1
  46. package/.next/server/app/settings.html +1 -1
  47. package/.next/server/app/settings.rsc +1 -1
  48. package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  49. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  50. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  51. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  52. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  53. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  54. package/.next/server/app/templates.html +1 -1
  55. package/.next/server/app/templates.rsc +1 -1
  56. package/.next/server/app/templates.segments/_full.segment.rsc +1 -1
  57. package/.next/server/app/templates.segments/_head.segment.rsc +1 -1
  58. package/.next/server/app/templates.segments/_index.segment.rsc +1 -1
  59. package/.next/server/app/templates.segments/_tree.segment.rsc +1 -1
  60. package/.next/server/app/templates.segments/templates/__PAGE__.segment.rsc +1 -1
  61. package/.next/server/app/templates.segments/templates.segment.rsc +1 -1
  62. package/.next/server/middleware-build-manifest.js +3 -3
  63. package/.next/server/pages/404.html +1 -1
  64. package/.next/server/pages/500.html +1 -1
  65. package/.next/server/server-reference-manifest.js +1 -1
  66. package/.next/server/server-reference-manifest.json +1 -1
  67. package/.next/trace +1 -1
  68. package/.next/trace-build +1 -1
  69. package/dist/cli/commands/doctor.js +116 -0
  70. package/dist/cli/commands/doctor.js.map +1 -0
  71. package/dist/cli/commands/init.js +211 -0
  72. package/dist/cli/commands/init.js.map +1 -0
  73. package/dist/cli/commands/start.js +240 -0
  74. package/dist/cli/commands/start.js.map +1 -0
  75. package/dist/cli/commands/status.js +54 -0
  76. package/dist/cli/commands/status.js.map +1 -0
  77. package/dist/cli/commands/stop.js +97 -0
  78. package/dist/cli/commands/stop.js.map +1 -0
  79. package/dist/cli/connect.js +108 -0
  80. package/dist/cli/connect.js.map +1 -0
  81. package/dist/cli/index.js +99 -0
  82. package/dist/cli/index.js.map +1 -0
  83. package/dist/cli/port-utils.js +260 -0
  84. package/dist/cli/port-utils.js.map +1 -0
  85. package/dist/cli/runtime-env.js +60 -0
  86. package/dist/cli/runtime-env.js.map +1 -0
  87. package/dist/cli/shared.js +54 -0
  88. package/dist/cli/shared.js.map +1 -0
  89. package/dist/cli/ui.js +60 -0
  90. package/dist/cli/ui.js.map +1 -0
  91. package/dist/daemon/agents/claude.js +98 -0
  92. package/dist/daemon/agents/claude.js.map +1 -0
  93. package/dist/daemon/agents/codex.js +160 -0
  94. package/dist/daemon/agents/codex.js.map +1 -0
  95. package/dist/daemon/agents/gemini.js +111 -0
  96. package/dist/daemon/agents/gemini.js.map +1 -0
  97. package/dist/daemon/agents/index.js +59 -0
  98. package/dist/daemon/agents/index.js.map +1 -0
  99. package/dist/daemon/agents/kimi.js +206 -0
  100. package/dist/daemon/agents/kimi.js.map +1 -0
  101. package/dist/daemon/agents/opencode.js +228 -0
  102. package/dist/daemon/agents/opencode.js.map +1 -0
  103. package/dist/daemon/agents/openrouter.js +274 -0
  104. package/dist/daemon/agents/openrouter.js.map +1 -0
  105. package/dist/daemon/agents/parsers/claude.js +63 -0
  106. package/dist/daemon/agents/parsers/claude.js.map +1 -0
  107. package/dist/daemon/agents/parsers/codex.js +51 -0
  108. package/dist/daemon/agents/parsers/codex.js.map +1 -0
  109. package/dist/daemon/agents/parsers/gemini.js +144 -0
  110. package/dist/daemon/agents/parsers/gemini.js.map +1 -0
  111. package/dist/daemon/agents/parsers/index.js +31 -0
  112. package/dist/daemon/agents/parsers/index.js.map +1 -0
  113. package/dist/daemon/agents/parsers/kimi.js +8 -0
  114. package/dist/daemon/agents/parsers/kimi.js.map +1 -0
  115. package/dist/daemon/agents/parsers/opencode.js +105 -0
  116. package/dist/daemon/agents/parsers/opencode.js.map +1 -0
  117. package/dist/daemon/agents/parsers/openrouter.js +69 -0
  118. package/dist/daemon/agents/parsers/openrouter.js.map +1 -0
  119. package/dist/daemon/agents/parsers/shared.js +17 -0
  120. package/dist/daemon/agents/parsers/shared.js.map +1 -0
  121. package/dist/daemon/agents/preflight.js +83 -0
  122. package/dist/daemon/agents/preflight.js.map +1 -0
  123. package/dist/daemon/agents/quote.js +45 -0
  124. package/dist/daemon/agents/quote.js.map +1 -0
  125. package/dist/daemon/agents/sandbox-guard.js +69 -0
  126. package/dist/daemon/agents/sandbox-guard.js.map +1 -0
  127. package/dist/daemon/agents/types.js +6 -0
  128. package/dist/daemon/agents/types.js.map +1 -0
  129. package/dist/daemon/api-response.js +65 -0
  130. package/dist/daemon/api-response.js.map +1 -0
  131. package/dist/daemon/error-detector.js +329 -0
  132. package/dist/daemon/error-detector.js.map +1 -0
  133. package/dist/daemon/headless.js +533 -0
  134. package/dist/daemon/headless.js.map +1 -0
  135. package/dist/daemon/index.js +333 -0
  136. package/dist/daemon/index.js.map +1 -0
  137. package/dist/daemon/openrouter.js +192 -0
  138. package/dist/daemon/openrouter.js.map +1 -0
  139. package/dist/daemon/orchestrators/claude.js +163 -0
  140. package/dist/daemon/orchestrators/claude.js.map +1 -0
  141. package/dist/daemon/orchestrators/codex.js +101 -0
  142. package/dist/daemon/orchestrators/codex.js.map +1 -0
  143. package/dist/daemon/orchestrators/cursor-windsurf.js +118 -0
  144. package/dist/daemon/orchestrators/cursor-windsurf.js.map +1 -0
  145. package/dist/daemon/orchestrators/gemini.js +108 -0
  146. package/dist/daemon/orchestrators/gemini.js.map +1 -0
  147. package/dist/daemon/orchestrators/index.js +90 -0
  148. package/dist/daemon/orchestrators/index.js.map +1 -0
  149. package/dist/daemon/orchestrators/kimi.js +108 -0
  150. package/dist/daemon/orchestrators/kimi.js.map +1 -0
  151. package/dist/daemon/orchestrators/opencode.js +152 -0
  152. package/dist/daemon/orchestrators/opencode.js.map +1 -0
  153. package/dist/daemon/orchestrators/shared.js +60 -0
  154. package/dist/daemon/orchestrators/shared.js.map +1 -0
  155. package/dist/daemon/output-watcher.js +131 -0
  156. package/dist/daemon/output-watcher.js.map +1 -0
  157. package/dist/daemon/participant-aborts.js +123 -0
  158. package/dist/daemon/participant-aborts.js.map +1 -0
  159. package/dist/daemon/reaper.js +46 -0
  160. package/dist/daemon/reaper.js.map +1 -0
  161. package/dist/daemon/routes/chats-events.js +62 -0
  162. package/dist/daemon/routes/chats-events.js.map +1 -0
  163. package/dist/daemon/routes/chats-stream.js +241 -0
  164. package/dist/daemon/routes/chats-stream.js.map +1 -0
  165. package/dist/daemon/routes/chats-validation.js +13 -0
  166. package/dist/daemon/routes/chats-validation.js.map +1 -0
  167. package/dist/daemon/routes/chats.js +545 -0
  168. package/dist/daemon/routes/chats.js.map +1 -0
  169. package/dist/daemon/routes/openrouter.js +103 -0
  170. package/dist/daemon/routes/openrouter.js.map +1 -0
  171. package/dist/daemon/routes/settings.js +199 -0
  172. package/dist/daemon/routes/settings.js.map +1 -0
  173. package/dist/daemon/routes/stats.js +155 -0
  174. package/dist/daemon/routes/stats.js.map +1 -0
  175. package/dist/daemon/routes/system.js +208 -0
  176. package/dist/daemon/routes/system.js.map +1 -0
  177. package/dist/daemon/routes/templates-personas.js +254 -0
  178. package/dist/daemon/routes/templates-personas.js.map +1 -0
  179. package/dist/daemon/routes/voices.js +139 -0
  180. package/dist/daemon/routes/voices.js.map +1 -0
  181. package/dist/daemon/runner/doer-driver.js +346 -0
  182. package/dist/daemon/runner/doer-driver.js.map +1 -0
  183. package/dist/daemon/runner/doer.js +336 -0
  184. package/dist/daemon/runner/doer.js.map +1 -0
  185. package/dist/daemon/runner/prior-round.js +140 -0
  186. package/dist/daemon/runner/prior-round.js.map +1 -0
  187. package/dist/daemon/runner/prompt-builder.js +292 -0
  188. package/dist/daemon/runner/prompt-builder.js.map +1 -0
  189. package/dist/daemon/runner/review-only-phase.js +103 -0
  190. package/dist/daemon/runner/review-only-phase.js.map +1 -0
  191. package/dist/daemon/runner/reviewer-driver.js +410 -0
  192. package/dist/daemon/runner/reviewer-driver.js.map +1 -0
  193. package/dist/daemon/runner/reviewer.js +384 -0
  194. package/dist/daemon/runner/reviewer.js.map +1 -0
  195. package/dist/daemon/runner/run-with-fallback.js +56 -0
  196. package/dist/daemon/runner/run-with-fallback.js.map +1 -0
  197. package/dist/daemon/runner/sanitize-name.js +8 -0
  198. package/dist/daemon/runner/sanitize-name.js.map +1 -0
  199. package/dist/daemon/runner/stream-file-writer.js +116 -0
  200. package/dist/daemon/runner/stream-file-writer.js.map +1 -0
  201. package/dist/daemon/runner/swap-sidecar.js +102 -0
  202. package/dist/daemon/runner/swap-sidecar.js.map +1 -0
  203. package/dist/daemon/runner/template-fallback.js +119 -0
  204. package/dist/daemon/runner/template-fallback.js.map +1 -0
  205. package/dist/daemon/runner/types.js +3 -0
  206. package/dist/daemon/runner/types.js.map +1 -0
  207. package/dist/daemon/runner/verdict.js +51 -0
  208. package/dist/daemon/runner/verdict.js.map +1 -0
  209. package/dist/daemon/runner-multiplex.js +364 -0
  210. package/dist/daemon/runner-multiplex.js.map +1 -0
  211. package/dist/daemon/runner.js +427 -0
  212. package/dist/daemon/runner.js.map +1 -0
  213. package/dist/daemon/ship.js +340 -0
  214. package/dist/daemon/ship.js.map +1 -0
  215. package/dist/daemon/template-cache.js +37 -0
  216. package/dist/daemon/template-cache.js.map +1 -0
  217. package/dist/daemon/tmux-types.js +9 -0
  218. package/dist/daemon/tmux-types.js.map +1 -0
  219. package/dist/daemon/tmux.js +341 -0
  220. package/dist/daemon/tmux.js.map +1 -0
  221. package/dist/lib/atomic-write.js +55 -0
  222. package/dist/lib/atomic-write.js.map +1 -0
  223. package/dist/lib/chat-events-bus.js +27 -0
  224. package/dist/lib/chat-events-bus.js.map +1 -0
  225. package/dist/lib/chat-slug.js +105 -0
  226. package/dist/lib/chat-slug.js.map +1 -0
  227. package/dist/lib/cli-detect.js +388 -0
  228. package/dist/lib/cli-detect.js.map +1 -0
  229. package/dist/lib/cli-health.js +156 -0
  230. package/dist/lib/cli-health.js.map +1 -0
  231. package/dist/lib/cli-paths.js +113 -0
  232. package/dist/lib/cli-paths.js.map +1 -0
  233. package/dist/lib/cli-precheck.js +141 -0
  234. package/dist/lib/cli-precheck.js.map +1 -0
  235. package/dist/lib/db/chats.js +244 -0
  236. package/dist/lib/db/chats.js.map +1 -0
  237. package/dist/lib/db/connection.js +254 -0
  238. package/dist/lib/db/connection.js.map +1 -0
  239. package/dist/lib/db/index.js +34 -0
  240. package/dist/lib/db/index.js.map +1 -0
  241. package/dist/lib/db/personas.js +65 -0
  242. package/dist/lib/db/personas.js.map +1 -0
  243. package/dist/lib/db/phase-events.js +172 -0
  244. package/dist/lib/db/phase-events.js.map +1 -0
  245. package/dist/lib/db/secrets.js +53 -0
  246. package/dist/lib/db/secrets.js.map +1 -0
  247. package/dist/lib/db/settings.js +47 -0
  248. package/dist/lib/db/settings.js.map +1 -0
  249. package/dist/lib/db/templates.js +75 -0
  250. package/dist/lib/db/templates.js.map +1 -0
  251. package/dist/lib/db/voices.js +184 -0
  252. package/dist/lib/db/voices.js.map +1 -0
  253. package/dist/lib/lineage-maps.js +200 -0
  254. package/dist/lib/lineage-maps.js.map +1 -0
  255. package/dist/lib/logger.js +186 -0
  256. package/dist/lib/logger.js.map +1 -0
  257. package/dist/lib/personas.js +117 -0
  258. package/dist/lib/personas.js.map +1 -0
  259. package/dist/lib/runtime-path.js +222 -0
  260. package/dist/lib/runtime-path.js.map +1 -0
  261. package/dist/lib/settings/billing.js +58 -0
  262. package/dist/lib/settings/billing.js.map +1 -0
  263. package/dist/lib/settings/permissions.js +81 -0
  264. package/dist/lib/settings/permissions.js.map +1 -0
  265. package/dist/lib/settings/transport.js +113 -0
  266. package/dist/lib/settings/transport.js.map +1 -0
  267. package/dist/lib/telemetry.js +290 -0
  268. package/dist/lib/telemetry.js.map +1 -0
  269. package/dist/lib/template-schema.js +319 -0
  270. package/dist/lib/template-schema.js.map +1 -0
  271. package/dist/lib/template-validation.js +82 -0
  272. package/dist/lib/template-validation.js.map +1 -0
  273. package/dist/lib/voices.js +533 -0
  274. package/dist/lib/voices.js.map +1 -0
  275. package/dist/mcp/client.js +138 -0
  276. package/dist/mcp/client.js.map +1 -0
  277. package/dist/mcp/index.js +178 -0
  278. package/dist/mcp/index.js.map +1 -0
  279. package/dist/mcp/tools.js +355 -0
  280. package/dist/mcp/tools.js.map +1 -0
  281. package/package.json +2 -1
  282. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js +0 -6077
  283. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js.map +0 -69
  284. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js +0 -6318
  285. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js.map +0 -71
  286. package/.next/dev/types/cache-life.d.ts +0 -145
  287. package/.next/dev/types/routes.d.ts +0 -84
  288. package/.next/dev/types/validator.ts +0 -178
  289. /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 8H2I8TTPlrKuWCV-SxY5f}/_buildManifest.js +0 -0
  290. /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 8H2I8TTPlrKuWCV-SxY5f}/_clientMiddlewareManifest.js +0 -0
  291. /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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"}