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,60 @@
1
+ "use strict";
2
+ /**
3
+ * Detect where chorus is running so the CLI can print the right URL hint.
4
+ *
5
+ * The cockpit binds to 127.0.0.1:5050. On a native install that opens fine in
6
+ * the local browser. On remote-dev setups (VSCode/Cursor Remote-SSH,
7
+ * Codespaces, dev containers, plain SSH), the user's browser lives on a
8
+ * different host — they need their editor to forward the port.
9
+ *
10
+ * Detection is best-effort and read-only. We never guess; if no signal is
11
+ * present we report 'native' and let `open()` handle it.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.detectRuntimeEnv = detectRuntimeEnv;
15
+ exports.shouldAutoOpenBrowser = shouldAutoOpenBrowser;
16
+ function detectRuntimeEnv() {
17
+ const env = process.env;
18
+ if (env.CODESPACES === 'true') {
19
+ return {
20
+ kind: 'codespaces',
21
+ hint: 'Codespaces will auto-forward port 5050. Open the Ports tab and click 5050.',
22
+ };
23
+ }
24
+ // VSCode and Cursor both set VSCODE_IPC_HOOK_CLI when running through
25
+ // their integrated terminal. We tell them apart by the binary name in
26
+ // TERM_PROGRAM (Cursor sets 'cursor', VSCode sets 'vscode').
27
+ if (env.VSCODE_IPC_HOOK_CLI || env.TERM_PROGRAM === 'vscode') {
28
+ const isCursor = env.TERM_PROGRAM === 'cursor' || env.CURSOR_TRACE_ID;
29
+ return {
30
+ kind: isCursor ? 'cursor-remote' : 'vscode-remote',
31
+ hint: `${isCursor ? 'Cursor' : 'VSCode'} should auto-forward 5050 — open the Ports tab in the bottom panel and click "Open in Browser" next to the row for 5050. If you don't see it, click "Forward a Port" and enter 5050.`,
32
+ };
33
+ }
34
+ if (env.WSL_DISTRO_NAME) {
35
+ // WSL2 forwards 127.0.0.1 to the Windows host automatically.
36
+ return {
37
+ kind: 'wsl',
38
+ hint: 'On WSL2, http://localhost:5050 in your Windows browser should just work.',
39
+ };
40
+ }
41
+ if (env.SSH_CONNECTION || env.SSH_TTY) {
42
+ return {
43
+ kind: 'ssh',
44
+ hint: 'Plain SSH session detected — no auto-forwarding. Either:\n' +
45
+ ' • Run `ssh -L 5050:127.0.0.1:5050 <host>` from your laptop and visit http://localhost:5050, or\n' +
46
+ ' • Use VSCode/Cursor Remote-SSH which forwards ports automatically.',
47
+ };
48
+ }
49
+ return { kind: 'native', hint: '' };
50
+ }
51
+ /**
52
+ * Should `chorus start --ui` actually try to spawn a browser?
53
+ * On remote-dev hosts there's usually no graphical browser; calling `open()`
54
+ * just emits an `xdg-open` error. Skip it and rely on the printed URL +
55
+ * the editor's own port-forwarding UI.
56
+ */
57
+ function shouldAutoOpenBrowser(env) {
58
+ return env.kind === 'native' || env.kind === 'wsl';
59
+ }
60
+ //# sourceMappingURL=runtime-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-env.js","sourceRoot":"","sources":["../../src/cli/runtime-env.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAgBH,4CAyCC;AAQD,sDAEC;AAnDD,SAAgB,gBAAgB;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAExB,IAAI,GAAG,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,IAAI,EACF,4EAA4E;SAC/E,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,sEAAsE;IACtE,6DAA6D;IAC7D,IAAI,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,KAAK,QAAQ,IAAI,GAAG,CAAC,eAAe,CAAC;QACtE,OAAO;YACL,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe;YAClD,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,sLAAsL;SAC9N,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;QACxB,6DAA6D;QAC7D,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,0EAA0E;SACjF,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QACtC,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EACF,4DAA4D;gBAC5D,sGAAsG;gBACtG,wEAAwE;SAC3E,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,GAAmB;IACvD,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC;AACrD,CAAC"}
@@ -0,0 +1,54 @@
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.pkg = exports.CHORUS_BIN_PATH = exports.DAEMON_URL = exports.COCKPIT_URL = void 0;
7
+ exports.printCockpitAccessHint = printCockpitAccessHint;
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const runtime_env_js_1 = require("./runtime-env.js");
11
+ const ui_js_1 = require("./ui.js");
12
+ exports.COCKPIT_URL = 'http://127.0.0.1:5050';
13
+ exports.DAEMON_URL = 'http://127.0.0.1:7707';
14
+ /**
15
+ * Absolute path to bin/chorus.mjs. Resolved from __dirname so the path
16
+ * is correct whether the CLI runs via:
17
+ * - `npm i -g chorus-codes` → /usr/local/lib/node_modules/chorus-codes/dist/cli/index.js
18
+ * - tsx dev mode → /home/.../chorus/src/cli/index.ts
19
+ * - direct dist → /home/.../chorus/dist/cli/index.js
20
+ *
21
+ * `process.argv[1]` would also work for the npm-installed case, but in
22
+ * tsx dev mode it points at the .ts file which `node` can't execute.
23
+ */
24
+ exports.CHORUS_BIN_PATH = path_1.default.resolve(__dirname, '..', '..', 'bin', 'chorus.mjs');
25
+ /**
26
+ * Read version from the shipped package.json so it can never drift.
27
+ * __dirname is dist/cli (built) or src/cli (tsx dev); ../../package.json
28
+ * resolves to the package root in both layouts.
29
+ */
30
+ exports.pkg = (() => {
31
+ try {
32
+ const pkgPath = path_1.default.resolve(__dirname, '..', '..', 'package.json');
33
+ const raw = fs_1.default.readFileSync(pkgPath, 'utf-8');
34
+ const parsed = JSON.parse(raw);
35
+ return {
36
+ version: parsed.version ?? '0.0.0',
37
+ name: parsed.name ?? 'chorus',
38
+ };
39
+ }
40
+ catch {
41
+ return { version: '0.0.0', name: 'chorus' };
42
+ }
43
+ })();
44
+ function printCockpitAccessHint() {
45
+ const env = (0, runtime_env_js_1.detectRuntimeEnv)();
46
+ console.log('');
47
+ console.log(` ${ui_js_1.c.gray('Open')} ${ui_js_1.c.cyan(exports.COCKPIT_URL)}`);
48
+ if (env.hint) {
49
+ console.log('');
50
+ console.log((0, ui_js_1.tip)(env.hint));
51
+ }
52
+ console.log('');
53
+ }
54
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/cli/shared.ts"],"names":[],"mappings":";;;;;;AA6CA,wDASC;AAtDD,4CAAoB;AACpB,gDAAwB;AACxB,qDAAoD;AACpD,mCAAiC;AAEpB,QAAA,WAAW,GAAG,uBAAuB,CAAC;AACtC,QAAA,UAAU,GAAG,uBAAuB,CAAC;AAElD;;;;;;;;;GASG;AACU,QAAA,eAAe,GAAG,cAAI,CAAC,OAAO,CACzC,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,YAAY,CACb,CAAC;AAEF;;;;GAIG;AACU,QAAA,GAAG,GAAsC,CAAC,GAAG,EAAE;IAC1D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QACpE,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwC,CAAC;QACtE,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,OAAO;YAClC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ;SAC9B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC9C,CAAC;AACH,CAAC,CAAC,EAAE,CAAC;AAEL,SAAgB,sBAAsB;IACpC,MAAM,GAAG,GAAG,IAAA,iCAAgB,GAAE,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,MAAM,SAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,SAAC,CAAC,IAAI,CAAC,mBAAW,CAAC,EAAE,CAAC,CAAC;IAC5D,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
package/dist/cli/ui.js ADDED
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ /**
3
+ * CLI output helpers — colors, symbols, formatters.
4
+ * Zero deps — raw ANSI escapes. Respects NO_COLOR env var.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.sym = exports.c = void 0;
8
+ exports.header = header;
9
+ exports.kv = kv;
10
+ exports.tip = tip;
11
+ const useColor = !process.env.NO_COLOR && process.stdout.isTTY !== false;
12
+ function ansi(code) {
13
+ return (s) => (useColor ? `\x1b[${code}m${s}\x1b[0m` : s);
14
+ }
15
+ exports.c = {
16
+ bold: ansi('1'),
17
+ dim: ansi('2'),
18
+ red: ansi('31'),
19
+ green: ansi('32'),
20
+ yellow: ansi('33'),
21
+ blue: ansi('34'),
22
+ magenta: ansi('35'),
23
+ cyan: ansi('36'),
24
+ gray: ansi('90'),
25
+ };
26
+ exports.sym = {
27
+ ok: exports.c.green('✓'),
28
+ err: exports.c.red('✗'),
29
+ bullet: exports.c.cyan('●'),
30
+ arrow: exports.c.gray('→'),
31
+ pointer: exports.c.cyan('▶'),
32
+ rocket: '🚀',
33
+ info: exports.c.blue('ⓘ'),
34
+ };
35
+ /**
36
+ * Header line with bold title, optional dim subtitle.
37
+ * header(sym.ok, 'Chorus started') → ✓ Chorus started
38
+ * header(sym.ok, 'Started', 'PID 1234') → ✓ Started (PID 1234)
39
+ */
40
+ function header(icon, title, sub) {
41
+ const main = `${icon} ${exports.c.bold(title)}`;
42
+ return sub ? `${main} ${exports.c.dim(sub)}` : main;
43
+ }
44
+ /**
45
+ * Aligned key/value rows. Pads keys to the longest key width.
46
+ * kv([['Cockpit', 'http://...'], ['Daemon', 'http://...']])
47
+ */
48
+ function kv(rows, indent = ' ') {
49
+ const width = Math.max(...rows.map(([k]) => k.length));
50
+ return rows
51
+ .map(([k, v]) => `${indent}${exports.c.gray(k.padEnd(width))} ${v}`)
52
+ .join('\n');
53
+ }
54
+ /**
55
+ * A boxed tip line. Used for one-time hints/footnotes.
56
+ */
57
+ function tip(text, indent = ' ') {
58
+ return `${indent}${exports.sym.info} ${exports.c.dim(text)}`;
59
+ }
60
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/cli/ui.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAmCH,wBAGC;AAMD,gBAKC;AAKD,kBAEC;AAtDD,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;AAEzE,SAAS,IAAI,CAAC,IAAY;IACxB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAEY,QAAA,CAAC,GAAG;IACf,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;IACf,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;IACd,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC;IACf,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;IACjB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;IAChB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;CACjB,CAAC;AAEW,QAAA,GAAG,GAAG;IACjB,EAAE,EAAE,SAAC,CAAC,KAAK,CAAC,GAAG,CAAC;IAChB,GAAG,EAAE,SAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACf,MAAM,EAAE,SAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IACnB,KAAK,EAAE,SAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IAClB,OAAO,EAAE,SAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IACpB,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,SAAC,CAAC,IAAI,CAAC,GAAG,CAAC;CAClB,CAAC;AAEF;;;;GAIG;AACH,SAAgB,MAAM,CAAC,IAAY,EAAE,KAAa,EAAE,GAAY;IAC9D,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,SAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IACxC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,SAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,SAAgB,EAAE,CAAC,IAA6B,EAAE,MAAM,GAAG,KAAK;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,SAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;SAC5D,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,GAAG,CAAC,IAAY,EAAE,MAAM,GAAG,KAAK;IAC9C,OAAO,GAAG,MAAM,GAAG,WAAG,CAAC,IAAI,IAAI,SAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ /**
3
+ * Claude Code agent shim.
4
+ * Multi-paragraph prompts are fine; no special formatting needed.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.claudeShim = void 0;
8
+ const quote_js_1 = require("./quote.js");
9
+ const preflight_js_1 = require("./preflight.js");
10
+ const headless_js_1 = require("../headless.js");
11
+ const index_js_1 = require("./parsers/index.js");
12
+ exports.claudeShim = {
13
+ lineage: 'anthropic',
14
+ name: 'claude-code',
15
+ buildLaunchCommand(opts) {
16
+ // Pre-trust the chat dir so Claude Code doesn't stop on its first-launch
17
+ // "Trust this folder?" prompt. Idempotent; safe to call every spawn.
18
+ (0, preflight_js_1.preTrustClaudeWorkspace)(opts.cwd);
19
+ const cwd = (0, quote_js_1.quotePath)(opts.cwd);
20
+ let cmd = `cd ${cwd} && claude`;
21
+ // Sandbox profile mapping. Claude Code itself doesn't expose a
22
+ // workspace-vs-strict toggle — the existing per-tool permission allow-list
23
+ // (settings.local.json `permissions.allow[]`) already implements the
24
+ // "workspace" profile. Full = bypass everything; strict isn't expressible
25
+ // at spawn time, only via tighter allow-list.
26
+ if (opts.unsandboxed || opts.sandbox === 'full') {
27
+ cmd += ` --dangerously-skip-permissions`;
28
+ }
29
+ if (opts.model) {
30
+ cmd += ` --model ${(0, quote_js_1.quoteValue)(opts.model)}`;
31
+ }
32
+ return cmd;
33
+ },
34
+ formatPrompt(opts) {
35
+ const sentinel = opts.expectDoneSentinel
36
+ ? '\n\nWhen finished, end your response with: ## DONE'
37
+ : '';
38
+ return (`${opts.task}\n\n` +
39
+ `Read the prompt at: ${opts.promptFile}\n\n` +
40
+ `Write your full answer to: ${opts.answerFile}${sentinel}`);
41
+ },
42
+ /**
43
+ * Headless mode (`claude --print --output-format stream-json --verbose`).
44
+ *
45
+ * Pipes the full prompt via stdin, parses Anthropic-shape stream-json events,
46
+ * yields AgentEvents to the runner. No tmux session, no pane scraping, no
47
+ * permission dialogs (bypassPermissions is set when autoApprove is on).
48
+ *
49
+ * Verified format 2026-04-30 against Claude Code 2.1.123. See parsers.ts
50
+ * for the parsed shapes and inline tests.
51
+ */
52
+ runHeadless(opts) {
53
+ (0, preflight_js_1.preTrustClaudeWorkspace)(opts.cwd);
54
+ const args = ['--print', '--output-format', 'stream-json', '--verbose'];
55
+ // Sandbox profile → permission-mode mapping. Headless mode auto-skips the
56
+ // workspace-trust dialog (per `claude -p` docs) so we don't need preflight
57
+ // beyond the trust marker write above.
58
+ if (opts.sandbox === 'strict') {
59
+ // 'plan' = read-only-ish: no Edit, no Bash. The closest Claude has to
60
+ // a strict sandbox in headless.
61
+ args.push('--permission-mode', 'plan');
62
+ }
63
+ else if (opts.autoApprove !== false || opts.sandbox === 'full') {
64
+ // Default for headless reviewer spawns — bypass per-tool prompts so the
65
+ // agent doesn't hang waiting on stdin for an approval that'll never come.
66
+ args.push('--permission-mode', 'bypassPermissions');
67
+ }
68
+ // 'workspace' (default) without auto-approve: leave Claude in default
69
+ // permission mode (per-tool prompts). Will hang on the first prompt
70
+ // unless settings.local.json pre-approves what's needed — which is what
71
+ // `chorus init` writes into the user's config.
72
+ if (opts.model) {
73
+ args.push('--model', opts.model);
74
+ }
75
+ // Claude doesn't have a "no network" flag in headless, so networkAccess
76
+ // is implicitly governed by the user's claude config and any tool the
77
+ // agent attempts. Strict sandbox + plan mode is our gate.
78
+ const run = (0, headless_js_1.spawnHeadless)({
79
+ command: 'claude',
80
+ args,
81
+ cwd: opts.cwd,
82
+ stdinPayload: opts.promptText,
83
+ parseLine: index_js_1.parseClaude,
84
+ cli: 'claude',
85
+ timeoutMs: opts.timeoutMs,
86
+ abortSignal: opts.abortSignal,
87
+ // Streaming CLI — no heartbeat needed; text_delta events provide
88
+ // continuous progress signal.
89
+ heartbeat: false,
90
+ });
91
+ return run.events;
92
+ },
93
+ estimateCostUsd() {
94
+ // Claude Code uses subscription, not per-call API billing
95
+ return 0;
96
+ },
97
+ };
98
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/daemon/agents/claude.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AASH,yCAAmD;AACnD,iDAAyD;AACzD,gDAA+C;AAC/C,iDAAiD;AAEpC,QAAA,UAAU,GAAc;IACnC,OAAO,EAAE,WAAW;IACpB,IAAI,EAAE,aAAa;IAEnB,kBAAkB,CAAC,IAAuB;QACxC,yEAAyE;QACzE,qEAAqE;QACrE,IAAA,sCAAuB,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAElC,MAAM,GAAG,GAAG,IAAA,oBAAS,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,GAAG,GAAG,MAAM,GAAG,YAAY,CAAC;QAEhC,+DAA+D;QAC/D,2EAA2E;QAC3E,qEAAqE;QACrE,0EAA0E;QAC1E,8CAA8C;QAC9C,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YAChD,GAAG,IAAI,iCAAiC,CAAC;QAC3C,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,GAAG,IAAI,YAAY,IAAA,qBAAU,EAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,YAAY,CAAC,IAAuB;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB;YACtC,CAAC,CAAC,oDAAoD;YACtD,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO,CACL,GAAG,IAAI,CAAC,IAAI,MAAM;YAClB,uBAAuB,IAAI,CAAC,UAAU,MAAM;YAC5C,8BAA8B,IAAI,CAAC,UAAU,GAAG,QAAQ,EAAE,CAC3D,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACH,WAAW,CAAC,IAA0B;QACpC,IAAA,sCAAuB,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAElC,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;QAExE,0EAA0E;QAC1E,2EAA2E;QAC3E,uCAAuC;QACvC,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC9B,sEAAsE;YACtE,gCAAgC;YAChC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YACjE,wEAAwE;YACxE,0EAA0E;YAC1E,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;QACtD,CAAC;QACD,sEAAsE;QACtE,oEAAoE;QACpE,wEAAwE;QACxE,+CAA+C;QAE/C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,wEAAwE;QACxE,sEAAsE;QACtE,0DAA0D;QAE1D,MAAM,GAAG,GAAG,IAAA,2BAAa,EAAC;YACxB,OAAO,EAAE,QAAQ;YACjB,IAAI;YACJ,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,YAAY,EAAE,IAAI,CAAC,UAAU;YAC7B,SAAS,EAAE,sBAAW;YACtB,GAAG,EAAE,QAAQ;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,iEAAiE;YACjE,8BAA8B;YAC9B,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QAEH,OAAO,GAAG,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,eAAe;QACb,0DAA0D;QAC1D,OAAO,CAAC,CAAC;IACX,CAAC;CACF,CAAC"}
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ /**
3
+ * Codex CLI agent shim.
4
+ * Per-session CODEX_HOME for parallel safety (see feedback_codex_home_per_account.md).
5
+ * Transport-aware sandbox modes (see feedback_codex_sandbox_modes.md).
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.codexShim = void 0;
12
+ const quote_js_1 = require("./quote.js");
13
+ const preflight_js_1 = require("./preflight.js");
14
+ const headless_js_1 = require("../headless.js");
15
+ const index_js_1 = require("./parsers/index.js");
16
+ const fs_1 = __importDefault(require("fs"));
17
+ const path_1 = __importDefault(require("path"));
18
+ const os_1 = __importDefault(require("os"));
19
+ /**
20
+ * Resolve CODEX_HOME for this spawn.
21
+ *
22
+ * - `CHORUS_CODEX_HOME` env var (when set) wins on the single-user path.
23
+ * Lets users point chorus at a non-rate-limited codex account
24
+ * (e.g. `~/.codex-cdx-2`) without forking the shim or wiring multi-account
25
+ * isolation. Ignored when `accountId` is explicit — that path already owns
26
+ * account selection.
27
+ * - When `accountId` is undefined/empty AND no env override: reuse the user's
28
+ * existing `~/.codex/` (their primary login). v0.5 single-user default.
29
+ * - When `accountId` is explicit: create/reuse `~/.codex-<accountId>/` for
30
+ * parallel multi-account isolation. Copies config.toml from the primary
31
+ * home; NEVER copies auth.json (each account must have its own login).
32
+ */
33
+ function ensureCodexHome(accountId) {
34
+ const homeDir = os_1.default.homedir();
35
+ const primary = path_1.default.join(homeDir, '.codex');
36
+ if (!accountId) {
37
+ const override = process.env.CHORUS_CODEX_HOME?.trim();
38
+ if (override && override.length > 0) {
39
+ // Trust the user — if the dir doesn't exist or has no auth.json, codex
40
+ // exec will fail loudly (which is now surfaced via quota_exhausted /
41
+ // cli_error). Better than silently picking the rate-limited primary.
42
+ return override;
43
+ }
44
+ // Single-user fast path — use the user's existing login.
45
+ return primary;
46
+ }
47
+ const codexDir = path_1.default.join(homeDir, `.codex-${accountId}`);
48
+ if (!fs_1.default.existsSync(codexDir)) {
49
+ fs_1.default.mkdirSync(codexDir, { recursive: true });
50
+ const defaultConfigPath = path_1.default.join(primary, 'config.toml');
51
+ const targetConfigPath = path_1.default.join(codexDir, 'config.toml');
52
+ if (fs_1.default.existsSync(defaultConfigPath) && !fs_1.default.existsSync(targetConfigPath)) {
53
+ const content = fs_1.default.readFileSync(defaultConfigPath, 'utf-8');
54
+ fs_1.default.writeFileSync(targetConfigPath, content, 'utf-8');
55
+ }
56
+ // NOTE: NEVER copy auth.json — each CODEX_HOME must have its own.
57
+ // First launch will prompt for `codex login`.
58
+ }
59
+ return codexDir;
60
+ }
61
+ exports.codexShim = {
62
+ lineage: 'openai',
63
+ name: 'codex-cli',
64
+ buildLaunchCommand(opts) {
65
+ (0, quote_js_1.validateValue)('accountId', opts.accountId);
66
+ (0, quote_js_1.validateValue)('model', opts.model);
67
+ const codexHome = ensureCodexHome(opts.accountId);
68
+ // Pre-trust the chat dir so Codex skips its first-launch trust prompt.
69
+ (0, preflight_js_1.preTrustCodexWorkspace)(codexHome, opts.cwd);
70
+ const cwd = (0, quote_js_1.quotePath)(opts.cwd);
71
+ const flags = [];
72
+ // Sandbox profile from user settings (may be overridden by transport).
73
+ if (opts.unsandboxed || opts.sandbox === 'full') {
74
+ // Full bypass — user explicitly opted into trust-everything.
75
+ flags.push('--dangerously-bypass-approvals-and-sandbox');
76
+ }
77
+ else if (opts.sandbox === 'strict') {
78
+ // Read-only — codex can't write files or shell-exec.
79
+ flags.push('-c', 'sandbox_mode="read-only"');
80
+ }
81
+ // 'workspace' (default) leaves codex in its config.toml-defined
82
+ // workspace-write mode. No flag override.
83
+ // Network access — opt-in. github transport always needs network.
84
+ if (opts.networkAccess || opts.transport === 'github') {
85
+ flags.push('-c', 'sandbox_workspace_write.network_access=true');
86
+ }
87
+ if (opts.model) {
88
+ flags.push('--model', (0, quote_js_1.quoteValue)(opts.model));
89
+ }
90
+ const flagsStr = flags.length > 0 ? ` ${flags.join(' ')}` : '';
91
+ return `cd ${cwd} && CODEX_HOME=${(0, quote_js_1.quotePath)(codexHome)} codex${flagsStr}`;
92
+ },
93
+ formatPrompt(opts) {
94
+ const sentinel = opts.expectDoneSentinel
95
+ ? '\n\nWhen finished, end your response with: ## DONE'
96
+ : '';
97
+ return (`${opts.task}\n\n` +
98
+ `Read the prompt at: ${opts.promptFile}\n\n` +
99
+ `Write your full answer to: ${opts.answerFile}${sentinel}`);
100
+ },
101
+ /**
102
+ * Headless mode (`codex exec -`).
103
+ *
104
+ * Codex `exec` accepts the prompt either as a positional arg or, when `-`
105
+ * is passed (or no positional), on stdin. We always pipe via stdin so big
106
+ * diff reviews (chorus self-review on a 100KB+ PR diff) don't hit the OS
107
+ * argv ceiling — a single large argv string crosses ARG_MAX on some shells
108
+ * and triggers truncation/silent failure modes upstream.
109
+ *
110
+ * Sandbox flags forwarded same as the tmux path. Codex's `exec` honors
111
+ * `-c sandbox_mode=...` and `-c sandbox_workspace_write.network_access=...`
112
+ * the same way as the interactive command.
113
+ */
114
+ runHeadless(opts) {
115
+ (0, quote_js_1.validateValue)('accountId', opts.accountId);
116
+ (0, quote_js_1.validateValue)('model', opts.model);
117
+ const codexHome = ensureCodexHome(opts.accountId);
118
+ (0, preflight_js_1.preTrustCodexWorkspace)(codexHome, opts.cwd);
119
+ const args = ['exec'];
120
+ // Chorus chat dirs aren't git repos. Without this flag codex exec
121
+ // exits 1 with "Not inside a trusted directory" — the trust_level
122
+ // entry in config.toml only suppresses the interactive prompt, not
123
+ // the git-repo guard. Discovered 2026-05-01 dogfooding tri-review:
124
+ // codex reviewers wrote 0 bytes because exec aborted pre-LLM.
125
+ args.push('--skip-git-repo-check');
126
+ if (opts.sandbox === 'full') {
127
+ args.push('--dangerously-bypass-approvals-and-sandbox');
128
+ }
129
+ else if (opts.sandbox === 'strict') {
130
+ args.push('-c', 'sandbox_mode="read-only"');
131
+ }
132
+ if (opts.networkAccess) {
133
+ args.push('-c', 'sandbox_workspace_write.network_access=true');
134
+ }
135
+ if (opts.model) {
136
+ args.push('--model', opts.model);
137
+ }
138
+ // `-` tells codex exec to read the prompt from stdin.
139
+ args.push('-');
140
+ const run = (0, headless_js_1.spawnHeadless)({
141
+ command: 'codex',
142
+ args,
143
+ cwd: opts.cwd,
144
+ env: { CODEX_HOME: codexHome },
145
+ stdinPayload: opts.promptText,
146
+ parseLine: index_js_1.parseCodex,
147
+ onExit: (fullStdout, fullStderr, code) => (0, index_js_1.parseCodexExit)(fullStdout, fullStderr, code),
148
+ cli: 'codex',
149
+ timeoutMs: opts.timeoutMs,
150
+ abortSignal: opts.abortSignal,
151
+ heartbeat: true, // no streaming; heartbeat keeps UI alive
152
+ });
153
+ return run.events;
154
+ },
155
+ estimateCostUsd() {
156
+ // Codex uses subscription, not per-call API billing
157
+ return 0;
158
+ },
159
+ };
160
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/daemon/agents/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ /**
3
+ * Gemini CLI agent shim.
4
+ * Single-line prompts only (see feedback_gemini_multiline_prompts.md).
5
+ * Uses --approval-mode auto_edit (never yolo, see feedback_gemini_yolo_dangerous.md).
6
+ * File references via @/abs/path inline syntax.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.geminiShim = void 0;
10
+ const quote_js_1 = require("./quote.js");
11
+ const headless_js_1 = require("../headless.js");
12
+ const index_js_1 = require("./parsers/index.js");
13
+ exports.geminiShim = {
14
+ lineage: 'google',
15
+ name: 'gemini-cli',
16
+ buildLaunchCommand(opts) {
17
+ (0, quote_js_1.validateValue)('model', opts.model);
18
+ const cwd = (0, quote_js_1.quotePath)(opts.cwd);
19
+ // Map sandbox profile to gemini's approval-mode. Never use yolo —
20
+ // see feedback_gemini_yolo_dangerous.md (auto_edit is safe-by-default).
21
+ let approvalMode = 'auto_edit';
22
+ if (opts.sandbox === 'strict')
23
+ approvalMode = 'default';
24
+ // 'workspace' (default) and 'full' both use auto_edit. Going beyond
25
+ // auto_edit (i.e. yolo) is intentionally NOT supported here — the user
26
+ // who wants gemini fully unsandboxed can run gemini outside chorus.
27
+ let cmd = `cd ${cwd} && gemini --approval-mode ${approvalMode}`;
28
+ if (opts.model) {
29
+ cmd += ` -m ${(0, quote_js_1.quoteValue)(opts.model)}`;
30
+ }
31
+ else {
32
+ // Default to gemini-3.1-pro-preview (gemini-pro is not valid on current plan)
33
+ cmd += ` -m gemini-3.1-pro-preview`;
34
+ }
35
+ return cmd;
36
+ },
37
+ formatPrompt(opts) {
38
+ // CRITICAL: Single-line only. Gemini submits each \n as a separate query.
39
+ // Use @/abs/path inline syntax for file references (no plain paths).
40
+ const sentinel = opts.expectDoneSentinel ? ' End your response with ## DONE.' : '';
41
+ return (`@${opts.promptFile} Read this file and follow the <ask> XML block, ` +
42
+ `write your full answer to ${opts.answerFile}.${sentinel}`);
43
+ },
44
+ /**
45
+ * Headless mode (`gemini -p " " --output-format stream-json` + stdin).
46
+ *
47
+ * Gemini's `-p`/`--prompt` value is appended to anything piped on stdin
48
+ * ("Appended to input on stdin (if any)" — verified `gemini --help`
49
+ * 2026-05-02). We pipe the full multi-line prompt via stdin and pass a
50
+ * placeholder `" "` (single space) on `-p` to mark the run non-interactive.
51
+ * This dodges:
52
+ * 1. argv overflow on big diffs (chorus self-reviews routinely cross
53
+ * 100KB+ — argv hits ARG_MAX or shell-quoting issues).
54
+ * 2. The historical "-p with newlines hangs" bug — irrelevant once the
55
+ * multi-line content lives on stdin.
56
+ *
57
+ * Format verified 2026-04-30; see parseGemini for shape.
58
+ */
59
+ runHeadless(opts) {
60
+ // -p needs a non-empty value to flip gemini into non-interactive mode.
61
+ // The single-space placeholder is harmless once stdin carries the real
62
+ // prompt (gemini concatenates them with the stdin content first).
63
+ const args = [
64
+ '-p',
65
+ ' ',
66
+ '--output-format',
67
+ 'stream-json',
68
+ '--skip-trust',
69
+ ];
70
+ // Sandbox profile → approval-mode mapping. Never use yolo
71
+ // (see feedback_gemini_yolo_dangerous.md — empty-content overwrites).
72
+ if (opts.sandbox === 'strict') {
73
+ args.push('--approval-mode', 'plan'); // read-only
74
+ }
75
+ else {
76
+ args.push('--approval-mode', 'auto_edit');
77
+ }
78
+ // Model — Gemini CLI requires an explicit model on current API; default
79
+ // to gemini-3.1-pro-preview (the verified-working model).
80
+ args.push('-m', opts.model || 'gemini-3.1-pro-preview');
81
+ const run = (0, headless_js_1.spawnHeadless)({
82
+ command: 'gemini',
83
+ args,
84
+ cwd: opts.cwd,
85
+ stdinPayload: opts.promptText,
86
+ env: {
87
+ // Defense in depth: env-var trust override matches the --skip-trust flag.
88
+ GEMINI_CLI_TRUST_WORKSPACE: 'true',
89
+ },
90
+ parseLine: index_js_1.parseGemini,
91
+ // gemini-cli logs upstream API errors (notably 429 quota
92
+ // exhaustion) to stderr without mirroring them in the JSON
93
+ // result line. parseGeminiExit scans the captured stderr on
94
+ // exit and emits a `quota_exhausted` event with the parsed
95
+ // reset window — without this, the cockpit only sees the
96
+ // generic "Gemini result status=error" from the parser and
97
+ // the user can't tell when their quota will reset.
98
+ onExit: (out, err, code) => (0, index_js_1.parseGeminiExit)(out, err, code),
99
+ cli: 'gemini',
100
+ timeoutMs: opts.timeoutMs,
101
+ abortSignal: opts.abortSignal,
102
+ heartbeat: false, // streaming
103
+ });
104
+ return run.events;
105
+ },
106
+ estimateCostUsd() {
107
+ // Gemini via CLI may use subscription or API key; assume 0 for now
108
+ return 0;
109
+ },
110
+ };
111
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/daemon/agents/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ /**
3
+ * Agent shim registry: lineage → shim implementation.
4
+ * Each CLI lineage (anthropic, openai, google, xai) has a corresponding shim
5
+ * that handles launch commands, prompt formatting, and cost estimation.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.openrouterShim = exports.kimiShim = exports.opencodeShim = exports.geminiShim = exports.codexShim = exports.claudeShim = void 0;
9
+ exports.pickShimForVoice = pickShimForVoice;
10
+ exports.isHttpDispatchedShim = isHttpDispatchedShim;
11
+ const claude_js_1 = require("./claude.js");
12
+ Object.defineProperty(exports, "claudeShim", { enumerable: true, get: function () { return claude_js_1.claudeShim; } });
13
+ const codex_js_1 = require("./codex.js");
14
+ Object.defineProperty(exports, "codexShim", { enumerable: true, get: function () { return codex_js_1.codexShim; } });
15
+ const gemini_js_1 = require("./gemini.js");
16
+ Object.defineProperty(exports, "geminiShim", { enumerable: true, get: function () { return gemini_js_1.geminiShim; } });
17
+ const opencode_js_1 = require("./opencode.js");
18
+ Object.defineProperty(exports, "opencodeShim", { enumerable: true, get: function () { return opencode_js_1.opencodeShim; } });
19
+ const kimi_js_1 = require("./kimi.js");
20
+ Object.defineProperty(exports, "kimiShim", { enumerable: true, get: function () { return kimi_js_1.kimiShim; } });
21
+ const openrouter_js_1 = require("./openrouter.js");
22
+ Object.defineProperty(exports, "openrouterShim", { enumerable: true, get: function () { return openrouter_js_1.openrouterShim; } });
23
+ const SHIMS = {
24
+ anthropic: claude_js_1.claudeShim,
25
+ openai: codex_js_1.codexShim,
26
+ google: gemini_js_1.geminiShim,
27
+ opencode: opencode_js_1.opencodeShim,
28
+ moonshot: kimi_js_1.kimiShim,
29
+ openrouter: openrouter_js_1.openrouterShim,
30
+ any: claude_js_1.claudeShim, // Fallback to Claude
31
+ };
32
+ const registry = {
33
+ pickShim(lineage) {
34
+ return SHIMS[lineage] ?? SHIMS.any;
35
+ },
36
+ listAvailable() {
37
+ return Object.values(SHIMS);
38
+ },
39
+ };
40
+ /**
41
+ * Pick a shim taking the model id into account. When the model has the
42
+ * `openrouter:` prefix, dispatch goes through the HTTP shim regardless of
43
+ * the slot's declared lineage — the lineage is preserved on the voice row
44
+ * for diversity scoring, but the actual transport is OpenRouter's
45
+ * chat-completions API.
46
+ *
47
+ * Callers that have a model hint (runner doer + reviewer dispatch) should
48
+ * use this; callers that don't (legacy paths) can keep using `registry.pickShim`.
49
+ */
50
+ function pickShimForVoice(lineage, model) {
51
+ if (model && model.startsWith('openrouter:'))
52
+ return openrouter_js_1.openrouterShim;
53
+ return registry.pickShim(lineage);
54
+ }
55
+ /** True when this voice should bypass CLI-credential precheck (HTTP-auth instead). */
56
+ function isHttpDispatchedShim(shim) {
57
+ return shim === openrouter_js_1.openrouterShim;
58
+ }
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/daemon/agents/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAwCH,4CAGC;AAGD,oDAEC;AA7CD,2CAAyC;AAgDhC,2FAhDA,sBAAU,OAgDA;AA/CnB,yCAAuC;AA+ClB,0FA/CZ,oBAAS,OA+CY;AA9C9B,2CAAyC;AA8CT,2FA9CvB,sBAAU,OA8CuB;AA7C1C,+CAA6C;AA6CD,6FA7CnC,0BAAY,OA6CmC;AA5CxD,uCAAqC;AA4CqB,yFA5CjD,kBAAQ,OA4CiD;AA3ClE,mDAAiD;AA2CmB,+FA3C3D,8BAAc,OA2C2D;AAzClF,MAAM,KAAK,GAA+B;IACxC,SAAS,EAAE,sBAAU;IACrB,MAAM,EAAE,oBAAS;IACjB,MAAM,EAAE,sBAAU;IAClB,QAAQ,EAAE,0BAAY;IACtB,QAAQ,EAAE,kBAAQ;IAClB,UAAU,EAAE,8BAAc;IAC1B,GAAG,EAAE,sBAAU,EAAE,qBAAqB;CACvC,CAAC;AAEF,MAAM,QAAQ,GAAkB;IAC9B,QAAQ,CAAC,OAAgB;QACvB,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC;IACrC,CAAC;IAED,aAAa;QACX,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF,CAAC;AAEF;;;;;;;;;GASG;AACH,SAAgB,gBAAgB,CAAC,OAAgB,EAAE,KAAc;IAC/D,IAAI,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,8BAAc,CAAC;IACpE,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,sFAAsF;AACtF,SAAgB,oBAAoB,CAAC,IAAe;IAClD,OAAO,IAAI,KAAK,8BAAc,CAAC;AACjC,CAAC"}