chorus-codes 0.7.0 → 0.7.2

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