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,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseOpencode = parseOpencode;
4
+ exports.parseOpencodeExit = parseOpencodeExit;
5
+ const shared_js_1 = require("./shared.js");
6
+ function parseOpencode(line) {
7
+ const obj = (0, shared_js_1.tryJson)(line);
8
+ if (!obj || obj.type !== 'text')
9
+ return [];
10
+ const part = obj.part;
11
+ const text = part && typeof part.text === 'string' ? part.text : '';
12
+ if (text.length === 0)
13
+ return [];
14
+ return [{ type: 'text_delta', text }];
15
+ }
16
+ /**
17
+ * Walk every line of opencode JSON-Lines stdout, sum tokens + USD cost
18
+ * from every `step_finish`, return undefined when no step_finish carried
19
+ * any usable counts.
20
+ *
21
+ * Cost summing rationale: opencode's step_finish carries a per-step
22
+ * `cost` (USD) computed against opencode-go's published per-token
23
+ * pricing. Multi-step sessions (tool calls) accrue cost per step; summing
24
+ * yields total session cost.
25
+ */
26
+ function aggregateOpencodeUsage(fullStdout) {
27
+ const acc = {};
28
+ let any = false;
29
+ for (const line of fullStdout.split('\n')) {
30
+ const obj = (0, shared_js_1.tryJson)(line);
31
+ if (!obj || obj.type !== 'step_finish')
32
+ continue;
33
+ const part = obj.part;
34
+ const tokens = part?.tokens;
35
+ if (tokens) {
36
+ if (typeof tokens.input === 'number') {
37
+ acc.inputTokens = (acc.inputTokens ?? 0) + tokens.input;
38
+ any = true;
39
+ }
40
+ if (typeof tokens.output === 'number') {
41
+ acc.outputTokens = (acc.outputTokens ?? 0) + tokens.output;
42
+ any = true;
43
+ }
44
+ if (typeof tokens.cache?.read === 'number') {
45
+ acc.cachedInputTokens = (acc.cachedInputTokens ?? 0) + tokens.cache.read;
46
+ any = true;
47
+ }
48
+ }
49
+ // Cost is present on every step_finish opencode emits, independent
50
+ // of whether tokens.* fields were populated. A malformed-tokens-but-
51
+ // known-cost step still represents real spend.
52
+ if (typeof part?.cost === 'number') {
53
+ acc.costUsd = (acc.costUsd ?? 0) + part.cost;
54
+ any = true;
55
+ }
56
+ }
57
+ return any ? acc : undefined;
58
+ }
59
+ /**
60
+ * OpenCode on-exit handler. Two responsibilities:
61
+ *
62
+ * 1. JSON-Lines path (modern `opencode run --format json`):
63
+ * parseOpencode already emitted text_delta events; the runner
64
+ * accumulated them. Emit a single synthetic message_done with
65
+ * finalText="" (runner falls back to its accumulator) plus the SUM
66
+ * of step_finish token counts across the whole session.
67
+ *
68
+ * 2. Single-blob path (older opencode builds, fallback shape): parse
69
+ * the whole stdout as a JSON object, lift `message`/`result`/`output`
70
+ * as finalText. No usage available.
71
+ *
72
+ * Either way: ONE message_done — never multiple — so the runner's
73
+ * participant_done lifecycle fires exactly once.
74
+ *
75
+ * Always emit message_done when JSON-Lines is detected, even when no
76
+ * step_finish was found. Earlier code returned [] when usage was
77
+ * undefined, which dropped the terminal event entirely and caused the
78
+ * runner's `for await` loop to exit without firing participant_done —
79
+ * the phase then sat in `working` until the watchdog timeout.
80
+ */
81
+ function parseOpencodeExit(fullStdout) {
82
+ if (fullStdout.trim().length === 0)
83
+ return [];
84
+ const firstLine = fullStdout.split('\n').find((l) => l.trim().length > 0);
85
+ if (firstLine) {
86
+ const probe = (0, shared_js_1.tryJson)(firstLine);
87
+ if (probe && typeof probe.type === 'string') {
88
+ const usage = aggregateOpencodeUsage(fullStdout);
89
+ return [
90
+ usage
91
+ ? { type: 'message_done', finalText: '', usage }
92
+ : { type: 'message_done', finalText: '' },
93
+ ];
94
+ }
95
+ }
96
+ const obj = (0, shared_js_1.tryJson)(fullStdout);
97
+ if (!obj)
98
+ return [{ type: 'message_done', finalText: fullStdout }];
99
+ const text = (typeof obj.message === 'string' && obj.message) ||
100
+ (typeof obj.result === 'string' && obj.result) ||
101
+ (typeof obj.output === 'string' && obj.output) ||
102
+ fullStdout;
103
+ return [{ type: 'message_done', finalText: text }];
104
+ }
105
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../../src/daemon/agents/parsers/opencode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseOpenRouterSSE = parseOpenRouterSSE;
4
+ const shared_js_1 = require("./shared.js");
5
+ function parseOpenRouterSSE(line) {
6
+ const trimmed = line.trim();
7
+ if (trimmed.length === 0)
8
+ return [];
9
+ if (trimmed === '[DONE]')
10
+ return [];
11
+ // OpenRouter passes through OpenAI-style "OPENROUTER PROCESSING"
12
+ // comments on slow upstreams as `: <message>` — these aren't JSON.
13
+ if (trimmed.startsWith(':'))
14
+ return [];
15
+ const obj = (0, shared_js_1.tryJson)(trimmed);
16
+ if (!obj)
17
+ return [];
18
+ // Error envelope (e.g. invalid model, rate limit). OpenRouter wraps
19
+ // these as `{"error":{"message":"...","code":...,"metadata":...}}`.
20
+ if (obj.error && typeof obj.error === 'object') {
21
+ const err = obj.error;
22
+ const message = typeof err.message === 'string' ? err.message : 'OpenRouter stream error';
23
+ const code = typeof err.code === 'string' || typeof err.code === 'number'
24
+ ? String(err.code)
25
+ : 'openrouter_error';
26
+ return [{ type: 'error', kind: code, message }];
27
+ }
28
+ const events = [];
29
+ const choices = obj.choices;
30
+ if (Array.isArray(choices) && choices.length > 0) {
31
+ for (const c of choices) {
32
+ if (!c || typeof c !== 'object')
33
+ continue;
34
+ const choice = c;
35
+ const delta = choice.delta ?? {};
36
+ if (typeof delta.content === 'string' && delta.content.length > 0) {
37
+ events.push({ type: 'text_delta', text: delta.content });
38
+ }
39
+ // finish_reason is set ('stop' | 'length' | 'content_filter' |
40
+ // ...) on the terminal chunk. We don't emit message_done here
41
+ // because the usage-bearing chunk often arrives AFTER the finish
42
+ // chunk; the message_done fires on the usage chunk below.
43
+ }
44
+ }
45
+ // Usage chunk — sent LAST when stream_options.include_usage is set.
46
+ // cost is OpenRouter-specific (USD). Emit a synthetic message_done
47
+ // with empty finalText so the runner's accumulator (which holds the
48
+ // assembled finalText) wins, but usage is attached.
49
+ const usage = obj.usage;
50
+ if (usage && typeof usage === 'object') {
51
+ const inputTokens = typeof usage.prompt_tokens === 'number' ? usage.prompt_tokens : undefined;
52
+ const outputTokens = typeof usage.completion_tokens === 'number'
53
+ ? usage.completion_tokens
54
+ : undefined;
55
+ const cost = typeof usage.cost === 'number' ? usage.cost : undefined;
56
+ const u = {};
57
+ if (inputTokens !== undefined)
58
+ u.inputTokens = inputTokens;
59
+ if (outputTokens !== undefined)
60
+ u.outputTokens = outputTokens;
61
+ if (cost !== undefined)
62
+ u.costUsd = cost;
63
+ if (Object.keys(u).length > 0) {
64
+ events.push({ type: 'message_done', finalText: '', usage: u });
65
+ }
66
+ }
67
+ return events;
68
+ }
69
+ //# sourceMappingURL=openrouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../../../src/daemon/agents/parsers/openrouter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tryJson = tryJson;
4
+ /** JSON.parse → undefined on malformed lines (CLIs sometimes emit blank
5
+ * lines, log lines, or partial frames in error paths). */
6
+ function tryJson(line) {
7
+ const trimmed = line.trim();
8
+ if (trimmed.length === 0)
9
+ return undefined;
10
+ try {
11
+ return JSON.parse(trimmed);
12
+ }
13
+ catch {
14
+ return undefined;
15
+ }
16
+ }
17
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/daemon/agents/parsers/shared.ts"],"names":[],"mappings":";;AAEA,0BAQC;AAVD;2DAC2D;AAC3D,SAAgB,OAAO,CAAC,IAAY;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ /**
3
+ * Pre-spawn hooks: prepare each CLI's local config so it doesn't stop on
4
+ * first-launch interactive prompts that would block the runner.
5
+ *
6
+ * Currently handles:
7
+ * - Claude Code: ~/.claude.json projects.<cwd>.hasTrustDialogAccepted = true
8
+ * - Codex CLI: <CODEX_HOME>/config.toml [projects."<cwd>"] trust_level = "trusted"
9
+ *
10
+ * Gemini and OpenCode have auth-on-first-launch flows we can't paper over with
11
+ * config; the user sets those up once during onboarding.
12
+ */
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.preTrustClaudeWorkspace = preTrustClaudeWorkspace;
18
+ exports.preTrustCodexWorkspace = preTrustCodexWorkspace;
19
+ const node_fs_1 = __importDefault(require("node:fs"));
20
+ const node_path_1 = __importDefault(require("node:path"));
21
+ const node_os_1 = __importDefault(require("node:os"));
22
+ /**
23
+ * Pre-suppress every Claude Code first-launch prompt that would block a
24
+ * spawned doer/reviewer. Currently:
25
+ * - projects.<cwd>.hasTrustDialogAccepted (workspace trust dialog)
26
+ * - hasCompletedClaudeInChromeOnboarding (top-level "Claude in Chrome (Beta)" splash)
27
+ *
28
+ * Add new keys here as Claude Code releases new one-time popups. Each fix is
29
+ * a small global tax we pay once, vs. one stuck-doer per missed splash.
30
+ *
31
+ * Idempotent. Returns early if config is corrupt rather than wiping it.
32
+ */
33
+ function preTrustClaudeWorkspace(cwd) {
34
+ const configPath = node_path_1.default.join(node_os_1.default.homedir(), '.claude.json');
35
+ let config = {};
36
+ if (node_fs_1.default.existsSync(configPath)) {
37
+ try {
38
+ const raw = node_fs_1.default.readFileSync(configPath, 'utf-8');
39
+ config = JSON.parse(raw);
40
+ }
41
+ catch {
42
+ // Corrupt config — skip rather than wipe the user's file.
43
+ return;
44
+ }
45
+ }
46
+ const projects = (config.projects && typeof config.projects === 'object'
47
+ ? config.projects
48
+ : {});
49
+ const existing = projects[cwd] ?? {};
50
+ const trustOk = existing.hasTrustDialogAccepted === true;
51
+ const chromeOk = config.hasCompletedClaudeInChromeOnboarding === true;
52
+ if (trustOk && chromeOk)
53
+ return; // nothing to write
54
+ projects[cwd] = {
55
+ ...existing,
56
+ hasTrustDialogAccepted: true,
57
+ };
58
+ node_fs_1.default.writeFileSync(configPath, JSON.stringify({
59
+ ...config,
60
+ projects,
61
+ hasCompletedClaudeInChromeOnboarding: true,
62
+ }, null, 2), 'utf-8');
63
+ }
64
+ /**
65
+ * Mark `cwd` as trusted in <CODEX_HOME>/config.toml so Codex skips its
66
+ * trust prompt. Appends a [projects."<cwd>"] block if missing.
67
+ */
68
+ function preTrustCodexWorkspace(codexHome, cwd) {
69
+ const configPath = node_path_1.default.join(codexHome, 'config.toml');
70
+ let body = '';
71
+ if (node_fs_1.default.existsSync(configPath)) {
72
+ body = node_fs_1.default.readFileSync(configPath, 'utf-8');
73
+ }
74
+ else {
75
+ node_fs_1.default.mkdirSync(codexHome, { recursive: true });
76
+ }
77
+ const marker = `[projects."${cwd}"]`;
78
+ if (body.includes(marker))
79
+ return; // already present
80
+ const block = `\n${marker}\ntrust_level = "trusted"\n`;
81
+ node_fs_1.default.writeFileSync(configPath, body + block, 'utf-8');
82
+ }
83
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../../src/daemon/agents/preflight.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;AAiBH,0DAyCC;AAMD,wDAeC;AA7ED,sDAAyB;AACzB,0DAA6B;AAC7B,sDAAyB;AAEzB;;;;;;;;;;GAUG;AACH,SAAgB,uBAAuB,CAAC,GAAW;IACjD,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;IAC3D,IAAI,MAAM,GAA4B,EAAE,CAAC;IAEzC,IAAI,iBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,iBAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;YAC1D,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;QACtE,CAAC,CAAE,MAAM,CAAC,QAAoD;QAC9D,CAAC,CAAC,EAAE,CAAC,CAAC;IAER,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,sBAAsB,KAAK,IAAI,CAAC;IACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,oCAAoC,KAAK,IAAI,CAAC;IACtE,IAAI,OAAO,IAAI,QAAQ;QAAE,OAAO,CAAC,mBAAmB;IAEpD,QAAQ,CAAC,GAAG,CAAC,GAAG;QACd,GAAG,QAAQ;QACX,sBAAsB,EAAE,IAAI;KAC7B,CAAC;IAEF,iBAAE,CAAC,aAAa,CACd,UAAU,EACV,IAAI,CAAC,SAAS,CACZ;QACE,GAAG,MAAM;QACT,QAAQ;QACR,oCAAoC,EAAE,IAAI;KAC3C,EACD,IAAI,EACJ,CAAC,CACF,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,SAAiB,EAAE,GAAW;IACnE,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACvD,IAAI,IAAI,GAAG,EAAE,CAAC;IAEd,IAAI,iBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,IAAI,GAAG,iBAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,iBAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,GAAG,IAAI,CAAC;IACrC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,kBAAkB;IAErD,MAAM,KAAK,GAAG,KAAK,MAAM,6BAA6B,CAAC;IACvD,iBAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ /**
3
+ * Shell-quoting and validation helpers.
4
+ * Used by all agent shims to safely quote values for tmux launch commands.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.quotePath = void 0;
8
+ exports.quoteValue = quoteValue;
9
+ exports.validateValue = validateValue;
10
+ const SHELL_METACHARACTERS = /[$\`;|&<>()\\"']/;
11
+ class InvalidValueError extends Error {
12
+ constructor(field, value) {
13
+ super(`Invalid ${field}: contains shell metacharacters. ` +
14
+ `Got: ${value}`);
15
+ this.name = 'InvalidValueError';
16
+ }
17
+ }
18
+ /**
19
+ * Quote a string for safe use in shell commands (bash %q equivalent).
20
+ * Uses single-quote wrapping with escaped embedded quotes.
21
+ * Safe to pass to `tmux new-session -d -s <name> "..."`.
22
+ */
23
+ function quoteValue(s) {
24
+ // Wrap in single quotes, escape any embedded single quotes
25
+ return `'${s.replace(/'/g, `'\\''`)}'`;
26
+ }
27
+ /**
28
+ * Quote a filesystem path for safe use in shell commands.
29
+ * Identical to quoteValue; kept separate for semantic clarity.
30
+ */
31
+ exports.quotePath = quoteValue;
32
+ /**
33
+ * Validate a value against shell metacharacters.
34
+ * Throws InvalidValueError if validation fails.
35
+ * Use BEFORE building launch commands to catch bad input early.
36
+ */
37
+ function validateValue(field, value) {
38
+ if (value === undefined || value === '') {
39
+ return; // empty/undefined is OK
40
+ }
41
+ if (SHELL_METACHARACTERS.test(value)) {
42
+ throw new InvalidValueError(field, value);
43
+ }
44
+ }
45
+ //# sourceMappingURL=quote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quote.js","sourceRoot":"","sources":["../../../src/daemon/agents/quote.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAmBH,gCAGC;AAaD,sCAOC;AAxCD,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEhD,MAAM,iBAAkB,SAAQ,KAAK;IACnC,YAAY,KAAa,EAAE,KAAa;QACtC,KAAK,CACH,WAAW,KAAK,mCAAmC;YACnD,QAAQ,KAAK,EAAE,CAChB,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED;;;;GAIG;AACH,SAAgB,UAAU,CAAC,CAAS;IAClC,2DAA2D;IAC3D,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AACzC,CAAC;AAED;;;GAGG;AACU,QAAA,SAAS,GAAG,UAAU,CAAC;AAEpC;;;;GAIG;AACH,SAAgB,aAAa,CAAC,KAAa,EAAE,KAAyB;IACpE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACxC,OAAO,CAAC,wBAAwB;IAClC,CAAC;IACD,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ /**
3
+ * Fail-closed sandbox enforcement for shims that can't translate the
4
+ * 'strict' sandbox profile to a CLI flag.
5
+ *
6
+ * Audit D1 (pre-launch dogfood) found that opencode + kimi shims
7
+ * accepted but ignored `opts.sandbox`. The "Strict" cockpit label
8
+ * became decorative for ~40% of reviewers — a doer running through
9
+ * an opencode-go gateway could write files and execute shell
10
+ * regardless of the visual setting.
11
+ *
12
+ * Long-term fix is to map 'strict' to upstream CLI flags as those
13
+ * land. Until then, refuse to spawn rather than silently misrepresent
14
+ * the sandbox state. The tmux path throws (the runner converts to a
15
+ * cli_error event); the headless path returns a one-shot async
16
+ * iterable that emits the same error event shape.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.assertSandboxSupported = assertSandboxSupported;
20
+ exports.sandboxFailClosed = sandboxFailClosed;
21
+ /**
22
+ * Throw on `strict`; otherwise no-op. Use from `buildLaunchCommand`
23
+ * where the shim returns a string (tmux path). The runner catches the
24
+ * throw and surfaces it as a cli_error to the cockpit.
25
+ */
26
+ function assertSandboxSupported(sandbox, cli) {
27
+ if (sandbox === 'strict') {
28
+ throw new Error(`${cli} shim cannot enforce sandbox=strict (no upstream read-only flag yet). ` +
29
+ `Switch to a lineage that supports strict (claude / codex / gemini), or relax to 'workspace'.`);
30
+ }
31
+ }
32
+ /**
33
+ * Return a one-shot AsyncIterable<AgentEvent> that emits a
34
+ * `sandbox_unsupported` error when the shim can't enforce strict.
35
+ * Call from `runHeadless` like:
36
+ *
37
+ * const sb = sandboxFailClosed(opts.sandbox, 'opencode');
38
+ * if (sb) return sb;
39
+ *
40
+ * Returns null when the requested sandbox is supported (or undefined),
41
+ * letting the caller proceed with the normal spawn path.
42
+ */
43
+ function sandboxFailClosed(sandbox, cli) {
44
+ if (sandbox !== 'strict')
45
+ return null;
46
+ const message = `${cli} shim cannot enforce sandbox=strict (no upstream read-only flag yet). ` +
47
+ `Switch to a lineage that supports strict (claude / codex / gemini), or relax to 'workspace'.`;
48
+ return {
49
+ [Symbol.asyncIterator]() {
50
+ let yielded = false;
51
+ return {
52
+ async next() {
53
+ if (yielded)
54
+ return { value: undefined, done: true };
55
+ yielded = true;
56
+ return {
57
+ value: {
58
+ type: 'error',
59
+ kind: 'sandbox_unsupported',
60
+ message,
61
+ },
62
+ done: false,
63
+ };
64
+ },
65
+ };
66
+ },
67
+ };
68
+ }
69
+ //# sourceMappingURL=sandbox-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox-guard.js","sourceRoot":"","sources":["../../../src/daemon/agents/sandbox-guard.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;AAYH,wDAUC;AAaD,8CA2BC;AAvDD;;;;GAIG;AACH,SAAgB,sBAAsB,CACpC,OAAmC,EACnC,GAAW;IAEX,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,GAAG,GAAG,wEAAwE;YAC5E,8FAA8F,CACjG,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,iBAAiB,CAC/B,OAAmC,EACnC,GAAW;IAEX,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,OAAO,GACX,GAAG,GAAG,wEAAwE;QAC9E,8FAA8F,CAAC;IACjG,OAAO;QACL,CAAC,MAAM,CAAC,aAAa,CAAC;YACpB,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,OAAO;gBACL,KAAK,CAAC,IAAI;oBACR,IAAI,OAAO;wBAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;oBACrD,OAAO,GAAG,IAAI,CAAC;oBACf,OAAO;wBACL,KAAK,EAAE;4BACL,IAAI,EAAE,OAAO;4BACb,IAAI,EAAE,qBAAqB;4BAC3B,OAAO;yBACR;wBACD,IAAI,EAAE,KAAK;qBACZ,CAAC;gBACJ,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ // Agent shim interface — every CLI lineage implements this.
3
+ // Pattern ported from openbridge's lib/agents/<name>.sh; see
4
+ // /home/ubuntu/.claude/projects/-home-ubuntu/memory/openbridge_architecture.md
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/daemon/agents/types.ts"],"names":[],"mappings":";AAAA,4DAA4D;AAC5D,6DAA6D;AAC7D,+EAA+E"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ /**
3
+ * Wire envelope shared by every daemon HTTP response.
4
+ *
5
+ * Why a uniform envelope: the cockpit's fetchFromDaemon helper inspects
6
+ * `ok` and either returns `data` or throws a DaemonError carrying
7
+ * `error.code` + `error.message`. Keeping these types in one place lets
8
+ * the route modules and the chats-flow code in index.ts stay aligned
9
+ * without each importing fastify or redefining the shape inline.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.errorResponse = errorResponse;
13
+ exports.successResponse = successResponse;
14
+ exports.listEnvelope = listEnvelope;
15
+ exports.sendError = sendError;
16
+ function errorResponse(code, message, details) {
17
+ return {
18
+ ok: false,
19
+ error: details ? { code, message, details } : { code, message },
20
+ };
21
+ }
22
+ function successResponse(data) {
23
+ return {
24
+ ok: true,
25
+ data,
26
+ };
27
+ }
28
+ function listEnvelope(items, hasMore = false) {
29
+ return { items, total: items.length, hasMore };
30
+ }
31
+ /**
32
+ * Default HTTP status per ErrorCode. Routes can override but should
33
+ * very rarely need to — these match standard REST semantics.
34
+ */
35
+ const DEFAULT_STATUS = {
36
+ validation: 400,
37
+ bad_request: 400,
38
+ parse_error: 400,
39
+ not_found: 404,
40
+ conflict: 409,
41
+ cli_failed: 502,
42
+ connection_failed: 502,
43
+ openrouter_error: 502,
44
+ db_error: 500,
45
+ stats_error: 500,
46
+ internal: 500,
47
+ };
48
+ /**
49
+ * Send an error response with the right HTTP status code AND the
50
+ * canonical envelope. Replaces the older pattern of returning the body
51
+ * from `errorResponse(...)` without setting `reply.code`, which left
52
+ * 4xx-shaped errors arriving as HTTP 200.
53
+ *
54
+ * Use this in route handlers from now on. Existing `errorResponse(...)`
55
+ * call-sites that still bare-return the body keep working (HTTP 200 +
56
+ * `ok: false`) until migrated; cockpit + MCP both read the envelope, not
57
+ * the status. New code should use `sendError` so we can drop the legacy
58
+ * pattern in v0.8.
59
+ */
60
+ function sendError(reply, code, message, details, statusOverride) {
61
+ const status = statusOverride ?? DEFAULT_STATUS[code] ?? 500;
62
+ reply.code(status);
63
+ return errorResponse(code, message, details);
64
+ }
65
+ //# sourceMappingURL=api-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-response.js","sourceRoot":"","sources":["../../src/daemon/api-response.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAsDH,sCASC;AAED,0CAKC;AAiBD,oCAEC;AAgCD,8BAUC;AA7ED,SAAgB,aAAa,CAC3B,IAAwB,EACxB,OAAe,EACf,OAAiC;IAEjC,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;KAChE,CAAC;AACJ,CAAC;AAED,SAAgB,eAAe,CAAI,IAAO;IACxC,OAAO;QACL,EAAE,EAAE,IAAI;QACR,IAAI;KACL,CAAC;AACJ,CAAC;AAiBD,SAAgB,YAAY,CAAI,KAAU,EAAE,OAAO,GAAG,KAAK;IACzD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,cAAc,GAA2B;IAC7C,UAAU,EAAE,GAAG;IACf,WAAW,EAAE,GAAG;IAChB,WAAW,EAAE,GAAG;IAChB,SAAS,EAAE,GAAG;IACd,QAAQ,EAAE,GAAG;IACb,UAAU,EAAE,GAAG;IACf,iBAAiB,EAAE,GAAG;IACtB,gBAAgB,EAAE,GAAG;IACrB,QAAQ,EAAE,GAAG;IACb,WAAW,EAAE,GAAG;IAChB,QAAQ,EAAE,GAAG;CACd,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,SAAgB,SAAS,CACvB,KAAmB,EACnB,IAAe,EACf,OAAe,EACf,OAAiC,EACjC,cAAuB;IAEvB,MAAM,MAAM,GAAG,cAAc,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC"}