chorus-codes 0.7.0 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/cache/.previewinfo +1 -1
  4. package/.next/cache/.rscinfo +1 -1
  5. package/.next/cache/.tsbuildinfo +1 -1
  6. package/.next/fallback-build-manifest.json +3 -3
  7. package/.next/prerender-manifest.json +3 -3
  8. package/.next/server/app/_global-error.html +1 -1
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.html +1 -1
  16. package/.next/server/app/_not-found.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  22. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  23. package/.next/server/app/new.html +1 -1
  24. package/.next/server/app/new.rsc +1 -1
  25. package/.next/server/app/new.segments/_full.segment.rsc +1 -1
  26. package/.next/server/app/new.segments/_head.segment.rsc +1 -1
  27. package/.next/server/app/new.segments/_index.segment.rsc +1 -1
  28. package/.next/server/app/new.segments/_tree.segment.rsc +1 -1
  29. package/.next/server/app/new.segments/new/__PAGE__.segment.rsc +1 -1
  30. package/.next/server/app/new.segments/new.segment.rsc +1 -1
  31. package/.next/server/app/onboarding.html +1 -1
  32. package/.next/server/app/onboarding.rsc +1 -1
  33. package/.next/server/app/onboarding.segments/_full.segment.rsc +1 -1
  34. package/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
  35. package/.next/server/app/onboarding.segments/_index.segment.rsc +1 -1
  36. package/.next/server/app/onboarding.segments/_tree.segment.rsc +1 -1
  37. package/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +1 -1
  38. package/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
  39. package/.next/server/app/personas.html +1 -1
  40. package/.next/server/app/personas.rsc +1 -1
  41. package/.next/server/app/personas.segments/_full.segment.rsc +1 -1
  42. package/.next/server/app/personas.segments/_head.segment.rsc +1 -1
  43. package/.next/server/app/personas.segments/_index.segment.rsc +1 -1
  44. package/.next/server/app/personas.segments/_tree.segment.rsc +1 -1
  45. package/.next/server/app/personas.segments/personas/__PAGE__.segment.rsc +1 -1
  46. package/.next/server/app/personas.segments/personas.segment.rsc +1 -1
  47. package/.next/server/app/settings.html +1 -1
  48. package/.next/server/app/settings.rsc +1 -1
  49. package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  50. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  51. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  52. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  53. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  54. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  55. package/.next/server/app/templates.html +1 -1
  56. package/.next/server/app/templates.rsc +1 -1
  57. package/.next/server/app/templates.segments/_full.segment.rsc +1 -1
  58. package/.next/server/app/templates.segments/_head.segment.rsc +1 -1
  59. package/.next/server/app/templates.segments/_index.segment.rsc +1 -1
  60. package/.next/server/app/templates.segments/_tree.segment.rsc +1 -1
  61. package/.next/server/app/templates.segments/templates/__PAGE__.segment.rsc +1 -1
  62. package/.next/server/app/templates.segments/templates.segment.rsc +1 -1
  63. package/.next/server/middleware-build-manifest.js +3 -3
  64. package/.next/server/pages/404.html +1 -1
  65. package/.next/server/pages/500.html +1 -1
  66. package/.next/server/server-reference-manifest.js +1 -1
  67. package/.next/server/server-reference-manifest.json +1 -1
  68. package/.next/trace +1 -1
  69. package/.next/trace-build +1 -1
  70. package/README.md +38 -15
  71. package/dist/cli/commands/doctor.js +116 -0
  72. package/dist/cli/commands/doctor.js.map +1 -0
  73. package/dist/cli/commands/init.js +211 -0
  74. package/dist/cli/commands/init.js.map +1 -0
  75. package/dist/cli/commands/start.js +298 -0
  76. package/dist/cli/commands/start.js.map +1 -0
  77. package/dist/cli/commands/status.js +54 -0
  78. package/dist/cli/commands/status.js.map +1 -0
  79. package/dist/cli/commands/stop.js +97 -0
  80. package/dist/cli/commands/stop.js.map +1 -0
  81. package/dist/cli/connect.js +108 -0
  82. package/dist/cli/connect.js.map +1 -0
  83. package/dist/cli/index.js +99 -0
  84. package/dist/cli/index.js.map +1 -0
  85. package/dist/cli/port-utils.js +260 -0
  86. package/dist/cli/port-utils.js.map +1 -0
  87. package/dist/cli/runtime-env.js +60 -0
  88. package/dist/cli/runtime-env.js.map +1 -0
  89. package/dist/cli/shared.js +54 -0
  90. package/dist/cli/shared.js.map +1 -0
  91. package/dist/cli/ui.js +60 -0
  92. package/dist/cli/ui.js.map +1 -0
  93. package/dist/daemon/agents/claude.js +98 -0
  94. package/dist/daemon/agents/claude.js.map +1 -0
  95. package/dist/daemon/agents/codex.js +160 -0
  96. package/dist/daemon/agents/codex.js.map +1 -0
  97. package/dist/daemon/agents/gemini.js +111 -0
  98. package/dist/daemon/agents/gemini.js.map +1 -0
  99. package/dist/daemon/agents/index.js +59 -0
  100. package/dist/daemon/agents/index.js.map +1 -0
  101. package/dist/daemon/agents/kimi.js +206 -0
  102. package/dist/daemon/agents/kimi.js.map +1 -0
  103. package/dist/daemon/agents/opencode.js +228 -0
  104. package/dist/daemon/agents/opencode.js.map +1 -0
  105. package/dist/daemon/agents/openrouter.js +274 -0
  106. package/dist/daemon/agents/openrouter.js.map +1 -0
  107. package/dist/daemon/agents/parsers/claude.js +63 -0
  108. package/dist/daemon/agents/parsers/claude.js.map +1 -0
  109. package/dist/daemon/agents/parsers/codex.js +51 -0
  110. package/dist/daemon/agents/parsers/codex.js.map +1 -0
  111. package/dist/daemon/agents/parsers/gemini.js +144 -0
  112. package/dist/daemon/agents/parsers/gemini.js.map +1 -0
  113. package/dist/daemon/agents/parsers/index.js +31 -0
  114. package/dist/daemon/agents/parsers/index.js.map +1 -0
  115. package/dist/daemon/agents/parsers/kimi.js +8 -0
  116. package/dist/daemon/agents/parsers/kimi.js.map +1 -0
  117. package/dist/daemon/agents/parsers/opencode.js +105 -0
  118. package/dist/daemon/agents/parsers/opencode.js.map +1 -0
  119. package/dist/daemon/agents/parsers/openrouter.js +69 -0
  120. package/dist/daemon/agents/parsers/openrouter.js.map +1 -0
  121. package/dist/daemon/agents/parsers/shared.js +17 -0
  122. package/dist/daemon/agents/parsers/shared.js.map +1 -0
  123. package/dist/daemon/agents/preflight.js +83 -0
  124. package/dist/daemon/agents/preflight.js.map +1 -0
  125. package/dist/daemon/agents/quote.js +45 -0
  126. package/dist/daemon/agents/quote.js.map +1 -0
  127. package/dist/daemon/agents/sandbox-guard.js +69 -0
  128. package/dist/daemon/agents/sandbox-guard.js.map +1 -0
  129. package/dist/daemon/agents/types.js +6 -0
  130. package/dist/daemon/agents/types.js.map +1 -0
  131. package/dist/daemon/api-response.js +65 -0
  132. package/dist/daemon/api-response.js.map +1 -0
  133. package/dist/daemon/error-detector.js +329 -0
  134. package/dist/daemon/error-detector.js.map +1 -0
  135. package/dist/daemon/headless.js +533 -0
  136. package/dist/daemon/headless.js.map +1 -0
  137. package/dist/daemon/index.js +333 -0
  138. package/dist/daemon/index.js.map +1 -0
  139. package/dist/daemon/openrouter.js +192 -0
  140. package/dist/daemon/openrouter.js.map +1 -0
  141. package/dist/daemon/orchestrators/claude.js +163 -0
  142. package/dist/daemon/orchestrators/claude.js.map +1 -0
  143. package/dist/daemon/orchestrators/codex.js +101 -0
  144. package/dist/daemon/orchestrators/codex.js.map +1 -0
  145. package/dist/daemon/orchestrators/cursor-windsurf.js +118 -0
  146. package/dist/daemon/orchestrators/cursor-windsurf.js.map +1 -0
  147. package/dist/daemon/orchestrators/gemini.js +108 -0
  148. package/dist/daemon/orchestrators/gemini.js.map +1 -0
  149. package/dist/daemon/orchestrators/index.js +90 -0
  150. package/dist/daemon/orchestrators/index.js.map +1 -0
  151. package/dist/daemon/orchestrators/kimi.js +108 -0
  152. package/dist/daemon/orchestrators/kimi.js.map +1 -0
  153. package/dist/daemon/orchestrators/opencode.js +152 -0
  154. package/dist/daemon/orchestrators/opencode.js.map +1 -0
  155. package/dist/daemon/orchestrators/shared.js +60 -0
  156. package/dist/daemon/orchestrators/shared.js.map +1 -0
  157. package/dist/daemon/output-watcher.js +131 -0
  158. package/dist/daemon/output-watcher.js.map +1 -0
  159. package/dist/daemon/participant-aborts.js +123 -0
  160. package/dist/daemon/participant-aborts.js.map +1 -0
  161. package/dist/daemon/reaper.js +46 -0
  162. package/dist/daemon/reaper.js.map +1 -0
  163. package/dist/daemon/routes/chats-events.js +62 -0
  164. package/dist/daemon/routes/chats-events.js.map +1 -0
  165. package/dist/daemon/routes/chats-stream.js +241 -0
  166. package/dist/daemon/routes/chats-stream.js.map +1 -0
  167. package/dist/daemon/routes/chats-validation.js +13 -0
  168. package/dist/daemon/routes/chats-validation.js.map +1 -0
  169. package/dist/daemon/routes/chats.js +545 -0
  170. package/dist/daemon/routes/chats.js.map +1 -0
  171. package/dist/daemon/routes/openrouter.js +103 -0
  172. package/dist/daemon/routes/openrouter.js.map +1 -0
  173. package/dist/daemon/routes/settings.js +199 -0
  174. package/dist/daemon/routes/settings.js.map +1 -0
  175. package/dist/daemon/routes/stats.js +155 -0
  176. package/dist/daemon/routes/stats.js.map +1 -0
  177. package/dist/daemon/routes/system.js +208 -0
  178. package/dist/daemon/routes/system.js.map +1 -0
  179. package/dist/daemon/routes/templates-personas.js +254 -0
  180. package/dist/daemon/routes/templates-personas.js.map +1 -0
  181. package/dist/daemon/routes/voices.js +139 -0
  182. package/dist/daemon/routes/voices.js.map +1 -0
  183. package/dist/daemon/runner/doer-driver.js +346 -0
  184. package/dist/daemon/runner/doer-driver.js.map +1 -0
  185. package/dist/daemon/runner/doer.js +336 -0
  186. package/dist/daemon/runner/doer.js.map +1 -0
  187. package/dist/daemon/runner/prior-round.js +140 -0
  188. package/dist/daemon/runner/prior-round.js.map +1 -0
  189. package/dist/daemon/runner/prompt-builder.js +292 -0
  190. package/dist/daemon/runner/prompt-builder.js.map +1 -0
  191. package/dist/daemon/runner/review-only-phase.js +103 -0
  192. package/dist/daemon/runner/review-only-phase.js.map +1 -0
  193. package/dist/daemon/runner/reviewer-driver.js +410 -0
  194. package/dist/daemon/runner/reviewer-driver.js.map +1 -0
  195. package/dist/daemon/runner/reviewer.js +384 -0
  196. package/dist/daemon/runner/reviewer.js.map +1 -0
  197. package/dist/daemon/runner/run-with-fallback.js +56 -0
  198. package/dist/daemon/runner/run-with-fallback.js.map +1 -0
  199. package/dist/daemon/runner/sanitize-name.js +8 -0
  200. package/dist/daemon/runner/sanitize-name.js.map +1 -0
  201. package/dist/daemon/runner/stream-file-writer.js +116 -0
  202. package/dist/daemon/runner/stream-file-writer.js.map +1 -0
  203. package/dist/daemon/runner/swap-sidecar.js +102 -0
  204. package/dist/daemon/runner/swap-sidecar.js.map +1 -0
  205. package/dist/daemon/runner/template-fallback.js +119 -0
  206. package/dist/daemon/runner/template-fallback.js.map +1 -0
  207. package/dist/daemon/runner/types.js +3 -0
  208. package/dist/daemon/runner/types.js.map +1 -0
  209. package/dist/daemon/runner/verdict.js +51 -0
  210. package/dist/daemon/runner/verdict.js.map +1 -0
  211. package/dist/daemon/runner-multiplex.js +364 -0
  212. package/dist/daemon/runner-multiplex.js.map +1 -0
  213. package/dist/daemon/runner.js +427 -0
  214. package/dist/daemon/runner.js.map +1 -0
  215. package/dist/daemon/ship.js +340 -0
  216. package/dist/daemon/ship.js.map +1 -0
  217. package/dist/daemon/template-cache.js +37 -0
  218. package/dist/daemon/template-cache.js.map +1 -0
  219. package/dist/daemon/tmux-types.js +9 -0
  220. package/dist/daemon/tmux-types.js.map +1 -0
  221. package/dist/daemon/tmux.js +341 -0
  222. package/dist/daemon/tmux.js.map +1 -0
  223. package/dist/lib/atomic-write.js +55 -0
  224. package/dist/lib/atomic-write.js.map +1 -0
  225. package/dist/lib/chat-events-bus.js +27 -0
  226. package/dist/lib/chat-events-bus.js.map +1 -0
  227. package/dist/lib/chat-slug.js +105 -0
  228. package/dist/lib/chat-slug.js.map +1 -0
  229. package/dist/lib/cli-detect.js +388 -0
  230. package/dist/lib/cli-detect.js.map +1 -0
  231. package/dist/lib/cli-health.js +156 -0
  232. package/dist/lib/cli-health.js.map +1 -0
  233. package/dist/lib/cli-paths.js +113 -0
  234. package/dist/lib/cli-paths.js.map +1 -0
  235. package/dist/lib/cli-precheck.js +141 -0
  236. package/dist/lib/cli-precheck.js.map +1 -0
  237. package/dist/lib/db/chats.js +244 -0
  238. package/dist/lib/db/chats.js.map +1 -0
  239. package/dist/lib/db/connection.js +254 -0
  240. package/dist/lib/db/connection.js.map +1 -0
  241. package/dist/lib/db/index.js +34 -0
  242. package/dist/lib/db/index.js.map +1 -0
  243. package/dist/lib/db/personas.js +65 -0
  244. package/dist/lib/db/personas.js.map +1 -0
  245. package/dist/lib/db/phase-events.js +172 -0
  246. package/dist/lib/db/phase-events.js.map +1 -0
  247. package/dist/lib/db/secrets.js +53 -0
  248. package/dist/lib/db/secrets.js.map +1 -0
  249. package/dist/lib/db/settings.js +47 -0
  250. package/dist/lib/db/settings.js.map +1 -0
  251. package/dist/lib/db/templates.js +75 -0
  252. package/dist/lib/db/templates.js.map +1 -0
  253. package/dist/lib/db/voices.js +184 -0
  254. package/dist/lib/db/voices.js.map +1 -0
  255. package/dist/lib/lineage-maps.js +200 -0
  256. package/dist/lib/lineage-maps.js.map +1 -0
  257. package/dist/lib/logger.js +186 -0
  258. package/dist/lib/logger.js.map +1 -0
  259. package/dist/lib/personas.js +117 -0
  260. package/dist/lib/personas.js.map +1 -0
  261. package/dist/lib/runtime-path.js +222 -0
  262. package/dist/lib/runtime-path.js.map +1 -0
  263. package/dist/lib/settings/billing.js +58 -0
  264. package/dist/lib/settings/billing.js.map +1 -0
  265. package/dist/lib/settings/permissions.js +81 -0
  266. package/dist/lib/settings/permissions.js.map +1 -0
  267. package/dist/lib/settings/transport.js +113 -0
  268. package/dist/lib/settings/transport.js.map +1 -0
  269. package/dist/lib/telemetry.js +290 -0
  270. package/dist/lib/telemetry.js.map +1 -0
  271. package/dist/lib/template-schema.js +319 -0
  272. package/dist/lib/template-schema.js.map +1 -0
  273. package/dist/lib/template-validation.js +82 -0
  274. package/dist/lib/template-validation.js.map +1 -0
  275. package/dist/lib/voices.js +533 -0
  276. package/dist/lib/voices.js.map +1 -0
  277. package/dist/mcp/client.js +138 -0
  278. package/dist/mcp/client.js.map +1 -0
  279. package/dist/mcp/index.js +178 -0
  280. package/dist/mcp/index.js.map +1 -0
  281. package/dist/mcp/tools.js +355 -0
  282. package/dist/mcp/tools.js.map +1 -0
  283. package/package.json +2 -1
  284. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js +0 -6077
  285. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js.map +0 -69
  286. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js +0 -6318
  287. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js.map +0 -71
  288. package/.next/dev/types/cache-life.d.ts +0 -145
  289. package/.next/dev/types/routes.d.ts +0 -84
  290. package/.next/dev/types/validator.ts +0 -178
  291. /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 9cD3yIOGe_Aqr17uJHTQS}/_buildManifest.js +0 -0
  292. /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 9cD3yIOGe_Aqr17uJHTQS}/_clientMiddlewareManifest.js +0 -0
  293. /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 9cD3yIOGe_Aqr17uJHTQS}/_ssgManifest.js +0 -0
@@ -0,0 +1,545 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.isValidChatId = void 0;
40
+ exports.registerChatRoutes = registerChatRoutes;
41
+ const fs_1 = __importDefault(require("fs"));
42
+ const path_1 = __importDefault(require("path"));
43
+ const yaml_1 = __importDefault(require("yaml"));
44
+ const index_js_1 = require("../../lib/db/index.js");
45
+ const logger_js_1 = require("../../lib/logger.js");
46
+ const template_schema_js_1 = require("../../lib/template-schema.js");
47
+ const api_response_js_1 = require("../api-response.js");
48
+ const participantAborts = __importStar(require("../participant-aborts.js"));
49
+ const runner_multiplex_js_1 = require("../runner-multiplex.js");
50
+ const chats_stream_js_1 = require("./chats-stream.js");
51
+ const chats_validation_js_1 = require("./chats-validation.js");
52
+ Object.defineProperty(exports, "isValidChatId", { enumerable: true, get: function () { return chats_validation_js_1.isValidChatId; } });
53
+ const TERMINAL_STATUSES = [
54
+ 'approved',
55
+ 'merged',
56
+ 'blocked',
57
+ 'cancelled',
58
+ 'failed',
59
+ 'no_review',
60
+ ];
61
+ const VALID_PHASE_KINDS = [
62
+ 'plan',
63
+ 'spec',
64
+ 'tests',
65
+ 'implement',
66
+ 'review',
67
+ 'verify',
68
+ 'divergence',
69
+ ];
70
+ function registerChatRoutes(fastify, { tmuxMgr, errorDetector }) {
71
+ fastify.get('/chats', async (request) => {
72
+ try {
73
+ const { status, limit, offset } = request.query;
74
+ const list = await index_js_1.chats.list({
75
+ status: status || undefined,
76
+ limit: limit ? parseInt(limit, 10) : undefined,
77
+ offset: offset ? parseInt(offset, 10) : undefined,
78
+ });
79
+ return (0, api_response_js_1.successResponse)((0, api_response_js_1.listEnvelope)(list));
80
+ }
81
+ catch (error) {
82
+ const message = error instanceof Error ? error.message : 'Unknown error';
83
+ return (0, api_response_js_1.errorResponse)('db_error', message);
84
+ }
85
+ });
86
+ fastify.get('/chats/:id', async (request, reply) => {
87
+ try {
88
+ if (!(0, chats_validation_js_1.isValidChatId)(request.params.id)) {
89
+ return (0, api_response_js_1.sendError)(reply, 'validation', 'invalid chat id');
90
+ }
91
+ const chat = await index_js_1.chats.getBySlugOrId(request.params.id);
92
+ if (!chat) {
93
+ return (0, api_response_js_1.sendError)(reply, 'not_found', `Chat ${request.params.id} not found`);
94
+ }
95
+ // phaseEvents.list keys by ULID, not slug. Use the resolved row's
96
+ // id so a /chats/<slug> request returns events correctly.
97
+ const events = await index_js_1.phaseEvents.list(chat.id);
98
+ return (0, api_response_js_1.successResponse)({ ...chat, events });
99
+ }
100
+ catch (error) {
101
+ const message = error instanceof Error ? error.message : 'Unknown error';
102
+ return (0, api_response_js_1.errorResponse)('db_error', message);
103
+ }
104
+ });
105
+ fastify.post('/chats', async (request, reply) => {
106
+ try {
107
+ const { work, templateId, files, repoPath, artifact, yolo } = request.body;
108
+ if (!work || !templateId) {
109
+ return (0, api_response_js_1.sendError)(reply, 'validation', 'work and templateId are required');
110
+ }
111
+ // Validate repoPath — must be an absolute path to an existing
112
+ // directory.
113
+ //
114
+ // Symlink handling (Audit D2 BLOCKER): pre-fix `existsSync`
115
+ // followed symlinks silently, so a `repoPath` pointing at
116
+ // `~/innocent-link → /etc` would pass and the doer would spawn
117
+ // with `cwd=/etc`. We realpath-resolve and re-check the target
118
+ // is a directory. Storing the canonical path means a later swap
119
+ // of the symlink can't redirect the doer.
120
+ //
121
+ // Stricter checks (is-a-repo, gh-authed) happen when the ship
122
+ // phase runs.
123
+ // Resolve `repoPath` to its canonical (symlink-followed) form once
124
+ // so we can persist the canonical path on the chat row. Pre-fix
125
+ // we validated via realpath but stored the original `repoPath`,
126
+ // leaving the symlink-swap attack surface from Audit D2 partially
127
+ // open: a later swap of `~/innocent-link → /etc` would still
128
+ // redirect the runner. `canonicalRepoPath` is undefined when no
129
+ // repoPath was supplied — the chat creates without one.
130
+ let canonicalRepoPath;
131
+ if (repoPath !== undefined) {
132
+ if (typeof repoPath !== 'string' || !path_1.default.isAbsolute(repoPath)) {
133
+ return (0, api_response_js_1.sendError)(reply, 'validation', 'repoPath must be an absolute path');
134
+ }
135
+ const resolved = path_1.default.resolve(repoPath);
136
+ try {
137
+ // realpathSync resolves symlinks AND verifies the path
138
+ // exists. Throws ENOENT if either link or target is missing.
139
+ canonicalRepoPath = fs_1.default.realpathSync(resolved);
140
+ }
141
+ catch {
142
+ return (0, api_response_js_1.sendError)(reply, 'validation', `repoPath does not exist: ${resolved}`);
143
+ }
144
+ let stat;
145
+ try {
146
+ stat = fs_1.default.statSync(canonicalRepoPath);
147
+ }
148
+ catch {
149
+ return (0, api_response_js_1.sendError)(reply, 'validation', `repoPath does not exist: ${canonicalRepoPath}`);
150
+ }
151
+ if (!stat.isDirectory()) {
152
+ return (0, api_response_js_1.sendError)(reply, 'validation', `repoPath must be a directory: ${canonicalRepoPath}`);
153
+ }
154
+ }
155
+ // C4 — template existence check is the daemon-side invariant (the
156
+ // MCP layer also validates, but only this check is authoritative).
157
+ // Pre-fix, an unknown templateId silently fell through to chat
158
+ // creation and the runner stalled looking up a row that didn't
159
+ // exist; the user saw a chat stuck in 'drafting' forever.
160
+ const tmpl = await index_js_1.templates.getById(templateId);
161
+ if (!tmpl) {
162
+ const valid = (await index_js_1.templates.list()).map((t) => t.id);
163
+ return (0, api_response_js_1.sendError)(reply, 'not_found', `Unknown templateId "${templateId}". Valid IDs: ${valid.join(', ')}`, { validIds: valid });
164
+ }
165
+ // Parse the template up-front so we can branch on review-only vs
166
+ // standard. Two reads of the same template are tolerable (this
167
+ // path is request-scoped, not hot); the alternative is hand-rolling
168
+ // YAML parsing twice in the same handler.
169
+ let initialPhaseKind = 'plan';
170
+ let parsedTemplateForArtifactCheck = null;
171
+ try {
172
+ const rawParsed = yaml_1.default.parse(tmpl.yaml);
173
+ const safe = template_schema_js_1.TemplateSchema.safeParse(rawParsed);
174
+ if (safe.success) {
175
+ parsedTemplateForArtifactCheck = safe.data;
176
+ const firstKind = safe.data.phases[0]?.kind;
177
+ initialPhaseKind = firstKind;
178
+ }
179
+ else {
180
+ // Fall back to a loose read so older malformed templates
181
+ // still produce an initial event with their declared kind.
182
+ const loose = rawParsed;
183
+ const firstKind = loose?.phases?.[0]?.kind;
184
+ if (firstKind === 'review_only')
185
+ initialPhaseKind = 'review_only';
186
+ else if (typeof firstKind === 'string' &&
187
+ VALID_PHASE_KINDS.includes(firstKind)) {
188
+ initialPhaseKind = firstKind;
189
+ }
190
+ }
191
+ }
192
+ catch {
193
+ /* fall through with 'plan' default */
194
+ }
195
+ // Artifact validation — only meaningful for review-only templates.
196
+ if (parsedTemplateForArtifactCheck &&
197
+ (0, template_schema_js_1.templateRequiresArtifact)(parsedTemplateForArtifactCheck)) {
198
+ if (typeof artifact !== 'string' || artifact.trim().length === 0) {
199
+ return (0, api_response_js_1.sendError)(reply, 'validation', 'artifact is required for review-only templates');
200
+ }
201
+ const firstPhase = parsedTemplateForArtifactCheck.phases[0];
202
+ if (firstPhase && (0, template_schema_js_1.isReviewOnlyPhase)(firstPhase)) {
203
+ const maxBytes = firstPhase.artifact.maxBytes;
204
+ const byteLen = Buffer.byteLength(artifact, 'utf-8');
205
+ if (byteLen > maxBytes) {
206
+ return (0, api_response_js_1.sendError)(reply, 'validation', `artifact exceeds template limit (${byteLen} bytes > ${maxBytes} bytes)`);
207
+ }
208
+ }
209
+ }
210
+ else if (artifact !== undefined && artifact !== null && artifact !== '') {
211
+ // Non-review-only templates: artifact is meaningless. Reject
212
+ // loudly so callers don't silently lose payload (e.g. mistyped
213
+ // templateId pointing at a full-pipeline template).
214
+ return (0, api_response_js_1.sendError)(reply, 'validation', 'artifact is only valid for review-only templates');
215
+ }
216
+ const chat = await index_js_1.chats.create({
217
+ work,
218
+ template_id: templateId,
219
+ attached_files: files ? JSON.stringify(files) : undefined,
220
+ // Persist the canonical (realpath-resolved) repo path so a
221
+ // later swap of an intermediate symlink can't redirect the
222
+ // doer's cwd. See Audit D2 BLOCKER for the attack scenario.
223
+ repo_path: canonicalRepoPath,
224
+ artifact: artifact ?? undefined,
225
+ yolo: yolo === true,
226
+ });
227
+ await index_js_1.phaseEvents.create({
228
+ chat_id: chat.id,
229
+ phase_idx: 0,
230
+ phase_kind: initialPhaseKind,
231
+ role: 'doer',
232
+ agent_id: null,
233
+ state: 'drafting',
234
+ output: null,
235
+ cost_usd: 0,
236
+ tokens_in: 0,
237
+ tokens_out: 0,
238
+ started_at: Date.now(),
239
+ finished_at: null,
240
+ });
241
+ (0, logger_js_1.chatLogger)(chat.id).info({
242
+ templateId,
243
+ phaseKind: initialPhaseKind,
244
+ requestId: request.id,
245
+ hasArtifact: artifact !== undefined && artifact !== null && artifact !== '',
246
+ hasRepoPath: repoPath !== undefined,
247
+ attachedFileCount: files?.length ?? 0,
248
+ }, 'chat created');
249
+ // Auto-fire the runner. Earlier code left chats inert until a
250
+ // client hit /chats/:id/stream — fine for the cockpit (the run
251
+ // page subscribes on open), but the MCP path (autonomous batch
252
+ // reviews, scripts) had no way to trigger the run without a curl-
253
+ // trigger workaround. Fire-and-forget; the SSE route still attaches
254
+ // to the existing activeRuns entry rather than re-creating one.
255
+ //
256
+ // Skip when:
257
+ // - template parsing failed (nothing valid to run)
258
+ // - chat is already in a terminal state (defensive — a fresh
259
+ // row should always be drafting; rules out manual DB seeds and
260
+ // replay bugs)
261
+ //
262
+ // `yolo: false` is NOT checked because chat.status has no
263
+ // pre-run/pending state to pause at — yolo today only gates ship.
264
+ if (parsedTemplateForArtifactCheck &&
265
+ !TERMINAL_STATUSES.includes(chat.status)) {
266
+ // Chain `.catch` so an async rejection inside runChat doesn't
267
+ // escape as an unhandled promise rejection (Node.js >= 15
268
+ // terminates the process on those).
269
+ const entry = (0, runner_multiplex_js_1.runWithMultiplex)({
270
+ chatId: chat.id,
271
+ template: parsedTemplateForArtifactCheck,
272
+ chat,
273
+ tmuxMgr,
274
+ errorDetector,
275
+ });
276
+ entry.promise.catch((err) => {
277
+ (0, logger_js_1.chatLogger)(chat.id).error({ err: err instanceof Error ? err.message : String(err) }, 'auto-fired chat runner failed');
278
+ });
279
+ }
280
+ return (0, api_response_js_1.successResponse)(chat);
281
+ }
282
+ catch (error) {
283
+ const message = error instanceof Error ? error.message : 'Unknown error';
284
+ logger_js_1.logger.error({ requestId: request.id, err: message, route: 'POST /chats' }, 'chat create failed');
285
+ return (0, api_response_js_1.errorResponse)('db_error', message);
286
+ }
287
+ });
288
+ fastify.post('/chats/:id/cancel', async (request, reply) => {
289
+ try {
290
+ const param = request.params.id;
291
+ if (!(0, chats_validation_js_1.isValidChatId)(param)) {
292
+ return (0, api_response_js_1.sendError)(reply, 'validation', 'invalid chat id');
293
+ }
294
+ // Resolve slug → ULID first. Cancel/abort/tmux all key by ULID.
295
+ const existing = await index_js_1.chats.getBySlugOrId(param);
296
+ if (!existing) {
297
+ return (0, api_response_js_1.sendError)(reply, 'not_found', `Chat ${param} not found`);
298
+ }
299
+ const chatId = existing.id;
300
+ const chat = await index_js_1.chats.cancel(chatId);
301
+ // Abort the active runner if there is one. This propagates into
302
+ // the runChat abortListener which fires chat_done(cancelled) once
303
+ // (latched by emitChatDone) — including killing any LLM CLI
304
+ // subprocesses via their AbortSignal. Without this, cancel only
305
+ // flipped the DB row and the runner kept burning tokens until
306
+ // natural termination.
307
+ (0, runner_multiplex_js_1.abortActiveRun)(chatId);
308
+ // Kill any tmux sessions associated with this chat (legacy transport).
309
+ const allSessions = tmuxMgr.list();
310
+ for (const session of allSessions) {
311
+ if (session.chatId === chatId) {
312
+ tmuxMgr.kill(session.name);
313
+ }
314
+ }
315
+ return (0, api_response_js_1.successResponse)(chat);
316
+ }
317
+ catch (error) {
318
+ const message = error instanceof Error ? error.message : 'Unknown error';
319
+ return (0, api_response_js_1.errorResponse)('db_error', message);
320
+ }
321
+ });
322
+ // Cancel a single participant (one reviewer or the doer) without
323
+ // collapsing the entire chat. Useful when one runner is stuck or the
324
+ // user wants to drop a low-value reviewer mid-flight.
325
+ //
326
+ // Path: POST /chats/:id/participants/:key/cancel
327
+ // `key` matches participantAborts.participantKey:
328
+ // `doer-<agentName>` or `reviewer-<agentName>-<idx>`
329
+ //
330
+ // Returns ok:true{aborted:bool}. aborted=false means the participant
331
+ // wasn't found in the registry (already finished, not yet started, or
332
+ // running on the legacy tmux transport which doesn't register).
333
+ fastify.post('/chats/:id/participants/:key/cancel', async (request, reply) => {
334
+ try {
335
+ const id = request.params.id;
336
+ if (!(0, chats_validation_js_1.isValidChatId)(id)) {
337
+ return (0, api_response_js_1.sendError)(reply, 'validation', 'invalid chat id');
338
+ }
339
+ const key = request.params.key;
340
+ // Strict key shape — both prefixes the registry uses. Reject
341
+ // unrecognised shapes so a malformed URL can't side-channel
342
+ // arbitrary registry inspection by guessing keys. The agent name
343
+ // MUST start with an alphanumeric (not `-`/`_`) so a key like
344
+ // `reviewer--0` (empty agent name) is rejected.
345
+ if (!/^(doer-|reviewer-)[A-Za-z0-9][A-Za-z0-9_-]*(?:-\d+)?$/.test(key)) {
346
+ return (0, api_response_js_1.sendError)(reply, 'validation', 'invalid participant key');
347
+ }
348
+ const existing = await index_js_1.chats.getBySlugOrId(id);
349
+ if (!existing) {
350
+ return (0, api_response_js_1.sendError)(reply, 'not_found', `Chat ${id} not found`);
351
+ }
352
+ const aborted = participantAborts.abortParticipant(existing.id, key);
353
+ return (0, api_response_js_1.successResponse)({ aborted });
354
+ }
355
+ catch (error) {
356
+ const message = error instanceof Error ? error.message : 'Unknown error';
357
+ return (0, api_response_js_1.errorResponse)('db_error', message);
358
+ }
359
+ });
360
+ // Re-run an existing chat. Creates a fresh chat row carrying over the
361
+ // same work + template_id + attached_files + repo_path + artifact, plus
362
+ // an initial phase event mirroring /chats POST. Intended for the
363
+ // cancelled/failed → Retry button on the run viewer; the original chat
364
+ // row stays untouched as history.
365
+ fastify.post('/chats/:id/rerun', async (request, reply) => {
366
+ try {
367
+ const param = request.params.id;
368
+ if (!(0, chats_validation_js_1.isValidChatId)(param)) {
369
+ return (0, api_response_js_1.sendError)(reply, 'validation', 'invalid chat id');
370
+ }
371
+ const original = await index_js_1.chats.getBySlugOrId(param);
372
+ if (!original) {
373
+ return (0, api_response_js_1.sendError)(reply, 'not_found', `Chat ${param} not found`);
374
+ }
375
+ // Guard against rerun-on-active. The cockpit Retry button only
376
+ // renders for terminal statuses, but a direct API call could
377
+ // otherwise spawn a duplicate runner alongside the still-alive
378
+ // original. Reject loudly with a dedicated kind so the caller can
379
+ // distinguish from generic validation.
380
+ if (!TERMINAL_STATUSES.includes(original.status)) {
381
+ return (0, api_response_js_1.sendError)(reply, 'conflict', `Chat ${param} is still active (status=${original.status}). Cancel it first, then retry.`);
382
+ }
383
+ // Re-realpath on rerun even though create-side now persists the
384
+ // canonical path. Catches legacy rows from before that fix shipped
385
+ // AND defends against a swap that happened between the original
386
+ // chat's success and the rerun click.
387
+ let rerunRepoPath = original.repo_path ?? undefined;
388
+ if (rerunRepoPath) {
389
+ try {
390
+ rerunRepoPath = fs_1.default.realpathSync(rerunRepoPath);
391
+ }
392
+ catch {
393
+ // Original path no longer resolves — skip the rerun's repoPath
394
+ // rather than silently shipping with a broken cwd.
395
+ rerunRepoPath = undefined;
396
+ }
397
+ }
398
+ const newChat = await index_js_1.chats.create({
399
+ work: original.work,
400
+ template_id: original.template_id,
401
+ attached_files: original.attached_files ?? undefined,
402
+ repo_path: rerunRepoPath,
403
+ artifact: original.artifact ?? undefined,
404
+ });
405
+ // Mirror the create-path's initial phase_event so the cockpit
406
+ // gets a populated stepper from t=0.
407
+ let initialPhaseKind = 'plan';
408
+ try {
409
+ const tmpl = await index_js_1.templates.getById(original.template_id);
410
+ if (tmpl) {
411
+ const safe = template_schema_js_1.TemplateSchema.safeParse(yaml_1.default.parse(tmpl.yaml));
412
+ if (safe.success) {
413
+ const firstKind = safe.data.phases[0]?.kind;
414
+ if (firstKind)
415
+ initialPhaseKind = firstKind;
416
+ }
417
+ }
418
+ }
419
+ catch {
420
+ /* keep default */
421
+ }
422
+ await index_js_1.phaseEvents.create({
423
+ chat_id: newChat.id,
424
+ phase_idx: 0,
425
+ phase_kind: initialPhaseKind,
426
+ role: 'doer',
427
+ agent_id: null,
428
+ state: 'drafting',
429
+ output: null,
430
+ cost_usd: 0,
431
+ tokens_in: 0,
432
+ tokens_out: 0,
433
+ started_at: Date.now(),
434
+ finished_at: null,
435
+ });
436
+ return (0, api_response_js_1.successResponse)(newChat);
437
+ }
438
+ catch (error) {
439
+ const message = error instanceof Error ? error.message : 'Unknown error';
440
+ return (0, api_response_js_1.errorResponse)('db_error', message);
441
+ }
442
+ });
443
+ // Hard-delete a chat (row + phase_events + filesystem artifacts).
444
+ // Cancels any active session first to avoid orphaned subprocesses
445
+ // writing to the dir we're about to nuke. Idempotent: returns 200
446
+ // even if the chat is already gone (allows the cockpit to retry
447
+ // without distinguishing races).
448
+ fastify.delete('/chats/:id', async (request, reply) => {
449
+ try {
450
+ const id = request.params.id;
451
+ if (!(0, chats_validation_js_1.isValidChatId)(id)) {
452
+ return (0, api_response_js_1.sendError)(reply, 'validation', 'invalid chat id');
453
+ }
454
+ const existing = await index_js_1.chats.getBySlugOrId(id);
455
+ if (!existing) {
456
+ return (0, api_response_js_1.successResponse)({ id, deleted: false, reason: 'not_found' });
457
+ }
458
+ // Resolve to the row's authoritative ULID — every downstream key
459
+ // (activeRuns, tmux sessions, phase_events, chat dir on disk)
460
+ // uses the ULID, not the slug. Without this, the route partly
461
+ // worked when called by slug but failed to abort the runner /
462
+ // kill tmux.
463
+ const ulid = existing.id;
464
+ // 1. Cancel first if still active — flips status, signals abort.
465
+ if (existing.status === 'drafting' || existing.status === 'reviewing') {
466
+ try {
467
+ await index_js_1.chats.cancel(ulid);
468
+ }
469
+ catch {
470
+ /* best-effort */
471
+ }
472
+ }
473
+ // 1b. Abort the in-memory runner if one is active. Otherwise the
474
+ // runner could keep streaming events and write to a chat dir
475
+ // that we're about to rm -rf, plus it would re-create the row.
476
+ const active = (0, runner_multiplex_js_1.getActiveRun)(ulid);
477
+ if (active) {
478
+ active.abortController.abort();
479
+ // Wait for the runner to settle before proceeding with the
480
+ // delete. 5-second timeout to avoid hanging forever.
481
+ try {
482
+ await Promise.race([
483
+ active.promise.catch(() => { }),
484
+ new Promise((r) => setTimeout(r, 5000)),
485
+ ]);
486
+ }
487
+ catch {
488
+ /* timeout or error — proceed with delete anyway */
489
+ }
490
+ }
491
+ // 2. Kill any tmux sessions tied to this chat.
492
+ try {
493
+ const allSessions = tmuxMgr.list();
494
+ for (const session of allSessions) {
495
+ if (session.chatId === ulid)
496
+ tmuxMgr.kill(session.name);
497
+ }
498
+ }
499
+ catch {
500
+ /* tmuxMgr may not be ready in test paths */
501
+ }
502
+ // 3. Drop DB row + phase events.
503
+ await index_js_1.chats.delete(ulid);
504
+ // 4. Nuke chat artifacts directory.
505
+ const osModule = await import('os');
506
+ const chatDir = path_1.default.join(osModule.homedir(), '.chorus', 'chats', ulid);
507
+ if (fs_1.default.existsSync(chatDir)) {
508
+ try {
509
+ fs_1.default.rmSync(chatDir, { recursive: true, force: true });
510
+ }
511
+ catch (err) {
512
+ // Don't fail the request — DB row is already gone, dir is
513
+ // just disk-space cleanup.
514
+ console.warn(`[chorus] failed to remove ${chatDir}:`, err);
515
+ }
516
+ }
517
+ return (0, api_response_js_1.successResponse)({ id: ulid, deleted: true });
518
+ }
519
+ catch (error) {
520
+ const message = error instanceof Error ? error.message : 'Unknown error';
521
+ return (0, api_response_js_1.errorResponse)('db_error', message);
522
+ }
523
+ });
524
+ // Resume — answer a blocking question.
525
+ fastify.post('/chats/:id/resume', async (request, reply) => {
526
+ try {
527
+ const chatId = request.params.id;
528
+ if (!(0, chats_validation_js_1.isValidChatId)(chatId)) {
529
+ return (0, api_response_js_1.sendError)(reply, 'validation', 'invalid chat id');
530
+ }
531
+ const { answer } = request.body;
532
+ if (!answer) {
533
+ return (0, api_response_js_1.sendError)(reply, 'validation', 'answer is required');
534
+ }
535
+ const chat = await index_js_1.chats.update(chatId, { status: 'reviewing' });
536
+ return (0, api_response_js_1.successResponse)(chat);
537
+ }
538
+ catch (error) {
539
+ const message = error instanceof Error ? error.message : 'Unknown error';
540
+ return (0, api_response_js_1.errorResponse)('db_error', message);
541
+ }
542
+ });
543
+ (0, chats_stream_js_1.registerChatStreamRoute)(fastify, { tmuxMgr, errorDetector });
544
+ }
545
+ //# sourceMappingURL=chats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chats.js","sourceRoot":"","sources":["../../../src/daemon/routes/chats.ts"],"names":[],"mappings":"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"}