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,410 @@
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.runReviewers = runReviewers;
40
+ const fs_1 = __importDefault(require("fs"));
41
+ const path_1 = __importDefault(require("path"));
42
+ const template_schema_js_1 = require("../../lib/template-schema.js");
43
+ const cli_health_js_1 = require("../../lib/cli-health.js");
44
+ const cli_precheck_js_1 = require("../../lib/cli-precheck.js");
45
+ const index_js_1 = require("../../lib/db/index.js");
46
+ const permissions_js_1 = require("../../lib/settings/permissions.js");
47
+ const transport_js_1 = require("../../lib/settings/transport.js");
48
+ const index_js_2 = require("../agents/index.js");
49
+ const output_watcher_js_1 = require("../output-watcher.js");
50
+ const participantAborts = __importStar(require("../participant-aborts.js"));
51
+ const prompt_builder_js_1 = require("./prompt-builder.js");
52
+ const reviewer_js_1 = require("./reviewer.js");
53
+ const run_with_fallback_js_1 = require("./run-with-fallback.js");
54
+ const sanitize_name_js_1 = require("./sanitize-name.js");
55
+ const swap_sidecar_js_1 = require("./swap-sidecar.js");
56
+ const template_fallback_js_1 = require("./template-fallback.js");
57
+ const verdict_js_1 = require("./verdict.js");
58
+ // Cap concurrent reviewer subprocesses per chat. Templates with 4+
59
+ // reviewer candidates would otherwise spawn the full set in parallel —
60
+ // which in practice means simultaneous LLM-CLI subprocesses each holding
61
+ // a shim child + stream parser, plus per-chat cwd. At load=133 last week
62
+ // the root cause was unbounded fan-out across re-attached SSE sessions;
63
+ // the per-chat ceiling stops a single big template from melting the host.
64
+ const REVIEWER_CONCURRENCY = 3;
65
+ async function runReviewers(chatDir, chatId, phase, phaseIdx, round, doerOutput, work, filesBlock, tmuxMgr, errorDetector, onEvent, abortSignal, templateFallbackReviewer) {
66
+ if (!phase.reviewer || phase.reviewer.candidates.length === 0) {
67
+ return { agreed: true, summary: '', allFailed: false };
68
+ }
69
+ const roundDir = path_1.default.join(chatDir, `round-${round}`);
70
+ if (!fs_1.default.existsSync(roundDir)) {
71
+ fs_1.default.mkdirSync(roundDir, { recursive: true });
72
+ }
73
+ // 'failed' = reviewer never produced a valid answer (timeout/quota/crash).
74
+ // The chat-level verdict has to know the difference: if EVERY reviewer
75
+ // failed, we shouldn't auto-approve.
76
+ const reviews = [];
77
+ const candidates = phase.reviewer.candidates;
78
+ let cursor = 0;
79
+ async function worker() {
80
+ while (true) {
81
+ const idx = cursor++;
82
+ if (idx >= candidates.length)
83
+ return;
84
+ const candidate = candidates[idx];
85
+ try {
86
+ const res = await runReviewer(chatDir, chatId, phase, phaseIdx, round, idx, doerOutput, work, filesBlock, tmuxMgr, errorDetector, onEvent, abortSignal, templateFallbackReviewer);
87
+ reviews.push({
88
+ reviewer: `${candidate.lineage}-${idx}`,
89
+ outcome: res === null ? 'failed' : res ? 'agreed' : 'disagreed',
90
+ });
91
+ }
92
+ catch {
93
+ reviews.push({
94
+ reviewer: `${candidate.lineage}-${idx}`,
95
+ outcome: 'failed',
96
+ });
97
+ }
98
+ }
99
+ }
100
+ const workerCount = Math.min(REVIEWER_CONCURRENCY, candidates.length);
101
+ await Promise.all(Array.from({ length: workerCount }, () => worker()));
102
+ const agreedCount = reviews.filter((r) => r.outcome === 'agreed').length;
103
+ const failedCount = reviews.filter((r) => r.outcome === 'failed').length;
104
+ const required = phase.reviewer.require;
105
+ const agreed = agreedCount >= required;
106
+ const allFailed = failedCount === reviews.length && reviews.length > 0;
107
+ const summary = allFailed
108
+ ? `All ${reviews.length} reviewer(s) failed (timeout/quota/crash)`
109
+ : reviews.length > 0
110
+ ? `${agreedCount}/${reviews.length} reviewers agreed${failedCount ? `, ${failedCount} failed` : ''}`
111
+ : 'No reviews completed';
112
+ return { agreed, summary, allFailed };
113
+ }
114
+ async function runReviewer(chatDir, chatId, phase, phaseIdx, round, reviewerIdx, doerOutput, work, filesBlock, tmuxMgr, errorDetector, onEvent, abortSignal, templateFallbackReviewer) {
115
+ // Returns:
116
+ // true = reviewer ran and approved
117
+ // false = reviewer ran and disagreed
118
+ // null = reviewer never produced a valid answer (timeout/quota/crash)
119
+ if (!phase.reviewer)
120
+ return true;
121
+ const candidate = phase.reviewer.candidates[reviewerIdx];
122
+ const reviewerModel = candidate.models?.[0];
123
+ const shim = (0, index_js_2.pickShimForVoice)(candidate.lineage, reviewerModel);
124
+ const agentName = shim.name;
125
+ // Pre-spawn precheck — same gate as runDoer. A reviewer that fails
126
+ // precheck returns null, which the phase loop already handles by
127
+ // counting it toward the all-reviewers-failed threshold and continuing
128
+ // with the remaining reviewers. HTTP-dispatched shims (openrouter)
129
+ // skip this — auth is the secrets table, checked inside the shim.
130
+ if (!(0, index_js_2.isHttpDispatchedShim)(shim)) {
131
+ const preRev = await (0, cli_precheck_js_1.precheckLineage)(candidate.lineage);
132
+ if (!preRev.ok) {
133
+ onEvent({
134
+ chatId,
135
+ type: 'cli_warning',
136
+ payload: {
137
+ phaseId: phase.id,
138
+ round,
139
+ role: 'reviewer',
140
+ agent: `${agentName}-${reviewerIdx}`,
141
+ lineage: candidate.lineage,
142
+ reason: preRev.reason,
143
+ message: preRev.message,
144
+ cta: preRev.cta,
145
+ resetAt: preRev.resetAt,
146
+ },
147
+ ts: Date.now(),
148
+ });
149
+ return null;
150
+ }
151
+ }
152
+ const roundDir = path_1.default.join(chatDir, `round-${round}`);
153
+ const reviewerDir = path_1.default.join(roundDir, `reviewer-${agentName}-${reviewerIdx}`);
154
+ if (!fs_1.default.existsSync(reviewerDir)) {
155
+ fs_1.default.mkdirSync(reviewerDir, { recursive: true });
156
+ }
157
+ const askFile = path_1.default.join(reviewerDir, 'ask.md');
158
+ const answerFile = path_1.default.join(reviewerDir, 'answer.md');
159
+ // Resolve reviewer persona — same fallback + warning pattern as runDoer.
160
+ let reviewerPersonaPrompt;
161
+ if (candidate.persona) {
162
+ const personaId = candidate.persona;
163
+ try {
164
+ const row = await index_js_1.personas.getById(personaId);
165
+ if (row) {
166
+ reviewerPersonaPrompt = row.system_prompt;
167
+ }
168
+ else {
169
+ onEvent({
170
+ chatId,
171
+ type: 'cli_warning',
172
+ payload: {
173
+ phaseId: phase.id,
174
+ phaseIdx,
175
+ round,
176
+ role: 'reviewer',
177
+ agent: `${agentName}-${reviewerIdx}`,
178
+ kind: 'persona_missing',
179
+ message: `Reviewer persona "${personaId}" not found in personas table — running with generic prompt. Check the template's reviewer candidate persona field.`,
180
+ },
181
+ ts: Date.now(),
182
+ });
183
+ }
184
+ }
185
+ catch (err) {
186
+ const message = err instanceof Error ? err.message : String(err);
187
+ onEvent({
188
+ chatId,
189
+ type: 'cli_warning',
190
+ payload: {
191
+ phaseId: phase.id,
192
+ phaseIdx,
193
+ round,
194
+ role: 'reviewer',
195
+ agent: `${agentName}-${reviewerIdx}`,
196
+ kind: 'persona_lookup_failed',
197
+ message: `Reviewer persona lookup for "${personaId}" failed: ${message} — running with generic prompt.`,
198
+ },
199
+ ts: Date.now(),
200
+ });
201
+ }
202
+ }
203
+ const ask = (0, prompt_builder_js_1.buildReviewerAsk)(phase, phaseIdx, round, work, doerOutput, filesBlock, reviewerPersonaPrompt);
204
+ fs_1.default.writeFileSync(askFile, ask);
205
+ // Per-slot model fallback: when candidate.models lists multiple models
206
+ // we try them in order, falling through on `null` (no answer produced).
207
+ // The boolean verdict `false` (disagreement) is a real result and stops
208
+ // the chain — runWithModelFallback only re-tries on literal null.
209
+ const transport = await (0, transport_js_1.getTransport)();
210
+ if (transport === 'headless' && shim.runHeadless) {
211
+ const handle = participantAborts.register(chatId, participantAborts.participantKey('reviewer', agentName, reviewerIdx), abortSignal);
212
+ try {
213
+ // Compose: this slot's per-slot chain + template-level
214
+ // fallback.reviewer (same lineage, dedup'd against this slot AND
215
+ // every other reviewer slot in the phase so we don't spawn a
216
+ // duplicate voice).
217
+ const allReviewerSlots = (phase.reviewer?.candidates ?? []).map((c) => ({
218
+ lineage: c.lineage,
219
+ models: c.models ?? [],
220
+ }));
221
+ const thisSlot = {
222
+ lineage: candidate.lineage,
223
+ models: candidate.models ?? [],
224
+ };
225
+ const chain = (0, template_fallback_js_1.buildSlotFallbackChain)(thisSlot, allReviewerSlots, templateFallbackReviewer);
226
+ return await (0, run_with_fallback_js_1.runWithChainFallback)(chain, async (entry) => {
227
+ // Cross-lineage swap: when the entry's lineage differs from the
228
+ // slot's primary, re-resolve the shim. The slot's identity
229
+ // (agentName, reviewerDir, participant key) stays bound to the
230
+ // primary lineage so the cockpit card doesn't re-key mid-run —
231
+ // the cli_warning below tells the UI a swap happened.
232
+ const entryShim = entry.lineage === candidate.lineage
233
+ ? shim
234
+ : (0, index_js_2.pickShimForVoice)(entry.lineage, entry.model);
235
+ return (0, reviewer_js_1.runReviewerHeadless)({
236
+ shim: entryShim,
237
+ chatId,
238
+ phase,
239
+ round,
240
+ reviewerIdx,
241
+ candidateLineage: entry.lineage,
242
+ candidateModel: entry.model,
243
+ agentName,
244
+ askContent: ask,
245
+ answerFile,
246
+ reviewerDir,
247
+ abortSignal: handle.signal,
248
+ onEvent,
249
+ });
250
+ }, (from, to, fromIdx) => {
251
+ const sameLineage = from.lineage === to.lineage;
252
+ const reason = sameLineage ? 'model_fallback' : 'lineage_fallback';
253
+ const message = sameLineage
254
+ ? `Reviewer model "${from.model ?? '(default)'}" produced no answer; retrying with "${to.model ?? '(default)'}".`
255
+ : `Reviewer ${from.lineage}/${from.model ?? '(default)'} failed; switching to ${to.lineage}/${to.model ?? '(default)'} (cross-lineage fallback).`;
256
+ onEvent({
257
+ chatId,
258
+ type: 'cli_warning',
259
+ payload: {
260
+ phaseId: phase.id,
261
+ round,
262
+ role: 'reviewer',
263
+ agent: `${agentName}-${reviewerIdx}`,
264
+ reason,
265
+ fromLineage: from.lineage,
266
+ toLineage: to.lineage,
267
+ fromModel: from.model ?? '(default)',
268
+ toModel: to.model ?? '(default)',
269
+ fallbackIdx: fromIdx,
270
+ message,
271
+ },
272
+ ts: Date.now(),
273
+ });
274
+ // Persist a sidecar so swap cards survive page reloads — the
275
+ // SSE stream shuts off for terminal chats, and phase_events
276
+ // packs warnings as opaque text. Mirrors the _stats.json /
277
+ // _meta.json pattern: append-only JSON array, read by the
278
+ // run-artifacts route at the next refresh tick.
279
+ (0, swap_sidecar_js_1.appendSwapSidecar)(reviewerDir, {
280
+ round,
281
+ phaseId: phase.id,
282
+ role: 'reviewer',
283
+ agent: `${agentName}-${reviewerIdx}`,
284
+ reason,
285
+ fromLineage: from.lineage,
286
+ toLineage: to.lineage,
287
+ fromModel: from.model ?? '(default)',
288
+ toModel: to.model ?? '(default)',
289
+ fallbackIdx: fromIdx,
290
+ ts: Date.now(),
291
+ });
292
+ });
293
+ }
294
+ finally {
295
+ handle.release();
296
+ }
297
+ }
298
+ // Reviewers don't share sessions across rounds — each round wants a
299
+ // fresh perspective on the new doer output. Across-phase reuse never
300
+ // makes sense.
301
+ const perms = await (0, permissions_js_1.getPermissions)();
302
+ const sessionName = (0, sanitize_name_js_1.sanitizeName)(`chorus-${chatId}-${phase.id}-reviewer-${agentName}-${reviewerIdx}`);
303
+ const session = await tmuxMgr.acquire({
304
+ chatId,
305
+ phaseId: phase.id,
306
+ role: 'reviewer',
307
+ round,
308
+ shareSessionAcrossRounds: false,
309
+ shareSessionAcrossPhases: false,
310
+ shim,
311
+ spawnOpts: {
312
+ sessionName,
313
+ cwd: reviewerDir,
314
+ model: candidate.models?.[0],
315
+ sandbox: perms.sandboxProfile,
316
+ autoApprove: perms.autoApprovePrompts,
317
+ networkAccess: perms.networkAccess,
318
+ },
319
+ agentName: `${agentName}-${reviewerIdx}`,
320
+ });
321
+ if (shim.clearKeys && shim.clearKeys.length > 0) {
322
+ tmuxMgr.sendKeys(session.name, [...shim.clearKeys]);
323
+ }
324
+ if (shim.preNudge)
325
+ shim.preNudge(session.name);
326
+ const prompt = shim.formatPrompt({
327
+ promptFile: askFile,
328
+ answerFile,
329
+ task: `Review: ${phase.title}`,
330
+ expectDoneSentinel: true,
331
+ });
332
+ // Wait for the CLI's TUI to finish cold-start before pasting (6s
333
+ // covers Codex's slow cold-start). See doer-driver for rationale.
334
+ await new Promise((r) => setTimeout(r, 6000));
335
+ tmuxMgr.pasteBuffer(session.name, prompt);
336
+ await new Promise((r) => setTimeout(r, 500));
337
+ tmuxMgr.sendKeys(session.name, ['Enter']);
338
+ // Failure-mode polling — same pattern as the doer.
339
+ const pollHandle = setInterval(() => {
340
+ try {
341
+ const pane = tmuxMgr.capturePane(session.name);
342
+ const err = errorDetector.inspect(session.name, candidate.lineage, pane);
343
+ if (err) {
344
+ const recoveryKeys = err.kind === 'permission_prompt' ? shim.recoverKeys?.permission_prompt : undefined;
345
+ if (recoveryKeys && recoveryKeys.length > 0) {
346
+ tmuxMgr.sendKeys(session.name, [...recoveryKeys]);
347
+ onEvent({
348
+ chatId,
349
+ type: 'cli_warning',
350
+ payload: {
351
+ phaseId: phase.id,
352
+ round,
353
+ role: 'reviewer',
354
+ agent: `${agentName}-${reviewerIdx}`,
355
+ recovered: err.kind,
356
+ keys: [...recoveryKeys],
357
+ detail: err.detail,
358
+ },
359
+ ts: Date.now(),
360
+ });
361
+ }
362
+ else {
363
+ // Fire-and-forget — see doer-driver for rationale.
364
+ (0, cli_health_js_1.recordHealth)({
365
+ lineage: candidate.lineage,
366
+ status: (0, cli_health_js_1.kindToStatus)(err.kind),
367
+ message: err.message,
368
+ resetAt: err.resetAt,
369
+ }).catch((healthErr) => {
370
+ console.error(`[chorus] recordHealth failed for ${candidate.lineage}:`, healthErr);
371
+ });
372
+ onEvent({
373
+ chatId,
374
+ type: 'cli_error',
375
+ payload: {
376
+ phaseId: phase.id,
377
+ round,
378
+ role: 'reviewer',
379
+ agent: `${agentName}-${reviewerIdx}`,
380
+ error: err,
381
+ },
382
+ ts: Date.now(),
383
+ });
384
+ }
385
+ }
386
+ }
387
+ catch {
388
+ // ignore
389
+ }
390
+ }, 2000);
391
+ try {
392
+ const result = await (0, output_watcher_js_1.waitForAnswer)(answerFile, {
393
+ timeoutMs: phase.timeoutMs ?? template_schema_js_1.DEFAULT_TMUX_PHASE_TIMEOUT_MS,
394
+ doneSentinel: '## DONE',
395
+ });
396
+ if (!result.full || result.content.trim().length === 0) {
397
+ // Watcher resolved on timeout/silence with no real answer.
398
+ return null;
399
+ }
400
+ return (0, verdict_js_1.verdictFromReviewerText)(result.content);
401
+ }
402
+ catch {
403
+ // Timed out or watcher errored — no valid answer produced.
404
+ return null;
405
+ }
406
+ finally {
407
+ clearInterval(pollHandle);
408
+ }
409
+ }
410
+ //# sourceMappingURL=reviewer-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer-driver.js","sourceRoot":"","sources":["../../../src/daemon/runner/reviewer-driver.ts"],"names":[],"mappings":"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"}