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.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/cache/.previewinfo +1 -1
- package/.next/cache/.rscinfo +1 -1
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/new.html +1 -1
- package/.next/server/app/new.rsc +1 -1
- package/.next/server/app/new.segments/_full.segment.rsc +1 -1
- package/.next/server/app/new.segments/_head.segment.rsc +1 -1
- package/.next/server/app/new.segments/_index.segment.rsc +1 -1
- package/.next/server/app/new.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/new.segments/new/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/new.segments/new.segment.rsc +1 -1
- package/.next/server/app/onboarding.html +1 -1
- package/.next/server/app/onboarding.rsc +1 -1
- package/.next/server/app/onboarding.segments/_full.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/_index.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
- package/.next/server/app/personas.html +1 -1
- package/.next/server/app/personas.rsc +1 -1
- package/.next/server/app/personas.segments/_full.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_head.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_index.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/personas.segments/personas/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/personas.segments/personas.segment.rsc +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +1 -1
- package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/templates.html +1 -1
- package/.next/server/app/templates.rsc +1 -1
- package/.next/server/app/templates.segments/_full.segment.rsc +1 -1
- package/.next/server/app/templates.segments/_head.segment.rsc +1 -1
- package/.next/server/app/templates.segments/_index.segment.rsc +1 -1
- package/.next/server/app/templates.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/templates.segments/templates/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/templates.segments/templates.segment.rsc +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/trace +1 -1
- package/.next/trace-build +1 -1
- package/README.md +38 -15
- package/dist/cli/commands/doctor.js +116 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.js +211 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/start.js +298 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.js +54 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.js +97 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/connect.js +108 -0
- package/dist/cli/connect.js.map +1 -0
- package/dist/cli/index.js +99 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/port-utils.js +260 -0
- package/dist/cli/port-utils.js.map +1 -0
- package/dist/cli/runtime-env.js +60 -0
- package/dist/cli/runtime-env.js.map +1 -0
- package/dist/cli/shared.js +54 -0
- package/dist/cli/shared.js.map +1 -0
- package/dist/cli/ui.js +60 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/daemon/agents/claude.js +98 -0
- package/dist/daemon/agents/claude.js.map +1 -0
- package/dist/daemon/agents/codex.js +160 -0
- package/dist/daemon/agents/codex.js.map +1 -0
- package/dist/daemon/agents/gemini.js +111 -0
- package/dist/daemon/agents/gemini.js.map +1 -0
- package/dist/daemon/agents/index.js +59 -0
- package/dist/daemon/agents/index.js.map +1 -0
- package/dist/daemon/agents/kimi.js +206 -0
- package/dist/daemon/agents/kimi.js.map +1 -0
- package/dist/daemon/agents/opencode.js +228 -0
- package/dist/daemon/agents/opencode.js.map +1 -0
- package/dist/daemon/agents/openrouter.js +274 -0
- package/dist/daemon/agents/openrouter.js.map +1 -0
- package/dist/daemon/agents/parsers/claude.js +63 -0
- package/dist/daemon/agents/parsers/claude.js.map +1 -0
- package/dist/daemon/agents/parsers/codex.js +51 -0
- package/dist/daemon/agents/parsers/codex.js.map +1 -0
- package/dist/daemon/agents/parsers/gemini.js +144 -0
- package/dist/daemon/agents/parsers/gemini.js.map +1 -0
- package/dist/daemon/agents/parsers/index.js +31 -0
- package/dist/daemon/agents/parsers/index.js.map +1 -0
- package/dist/daemon/agents/parsers/kimi.js +8 -0
- package/dist/daemon/agents/parsers/kimi.js.map +1 -0
- package/dist/daemon/agents/parsers/opencode.js +105 -0
- package/dist/daemon/agents/parsers/opencode.js.map +1 -0
- package/dist/daemon/agents/parsers/openrouter.js +69 -0
- package/dist/daemon/agents/parsers/openrouter.js.map +1 -0
- package/dist/daemon/agents/parsers/shared.js +17 -0
- package/dist/daemon/agents/parsers/shared.js.map +1 -0
- package/dist/daemon/agents/preflight.js +83 -0
- package/dist/daemon/agents/preflight.js.map +1 -0
- package/dist/daemon/agents/quote.js +45 -0
- package/dist/daemon/agents/quote.js.map +1 -0
- package/dist/daemon/agents/sandbox-guard.js +69 -0
- package/dist/daemon/agents/sandbox-guard.js.map +1 -0
- package/dist/daemon/agents/types.js +6 -0
- package/dist/daemon/agents/types.js.map +1 -0
- package/dist/daemon/api-response.js +65 -0
- package/dist/daemon/api-response.js.map +1 -0
- package/dist/daemon/error-detector.js +329 -0
- package/dist/daemon/error-detector.js.map +1 -0
- package/dist/daemon/headless.js +533 -0
- package/dist/daemon/headless.js.map +1 -0
- package/dist/daemon/index.js +333 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/openrouter.js +192 -0
- package/dist/daemon/openrouter.js.map +1 -0
- package/dist/daemon/orchestrators/claude.js +163 -0
- package/dist/daemon/orchestrators/claude.js.map +1 -0
- package/dist/daemon/orchestrators/codex.js +101 -0
- package/dist/daemon/orchestrators/codex.js.map +1 -0
- package/dist/daemon/orchestrators/cursor-windsurf.js +118 -0
- package/dist/daemon/orchestrators/cursor-windsurf.js.map +1 -0
- package/dist/daemon/orchestrators/gemini.js +108 -0
- package/dist/daemon/orchestrators/gemini.js.map +1 -0
- package/dist/daemon/orchestrators/index.js +90 -0
- package/dist/daemon/orchestrators/index.js.map +1 -0
- package/dist/daemon/orchestrators/kimi.js +108 -0
- package/dist/daemon/orchestrators/kimi.js.map +1 -0
- package/dist/daemon/orchestrators/opencode.js +152 -0
- package/dist/daemon/orchestrators/opencode.js.map +1 -0
- package/dist/daemon/orchestrators/shared.js +60 -0
- package/dist/daemon/orchestrators/shared.js.map +1 -0
- package/dist/daemon/output-watcher.js +131 -0
- package/dist/daemon/output-watcher.js.map +1 -0
- package/dist/daemon/participant-aborts.js +123 -0
- package/dist/daemon/participant-aborts.js.map +1 -0
- package/dist/daemon/reaper.js +46 -0
- package/dist/daemon/reaper.js.map +1 -0
- package/dist/daemon/routes/chats-events.js +62 -0
- package/dist/daemon/routes/chats-events.js.map +1 -0
- package/dist/daemon/routes/chats-stream.js +241 -0
- package/dist/daemon/routes/chats-stream.js.map +1 -0
- package/dist/daemon/routes/chats-validation.js +13 -0
- package/dist/daemon/routes/chats-validation.js.map +1 -0
- package/dist/daemon/routes/chats.js +545 -0
- package/dist/daemon/routes/chats.js.map +1 -0
- package/dist/daemon/routes/openrouter.js +103 -0
- package/dist/daemon/routes/openrouter.js.map +1 -0
- package/dist/daemon/routes/settings.js +199 -0
- package/dist/daemon/routes/settings.js.map +1 -0
- package/dist/daemon/routes/stats.js +155 -0
- package/dist/daemon/routes/stats.js.map +1 -0
- package/dist/daemon/routes/system.js +208 -0
- package/dist/daemon/routes/system.js.map +1 -0
- package/dist/daemon/routes/templates-personas.js +254 -0
- package/dist/daemon/routes/templates-personas.js.map +1 -0
- package/dist/daemon/routes/voices.js +139 -0
- package/dist/daemon/routes/voices.js.map +1 -0
- package/dist/daemon/runner/doer-driver.js +346 -0
- package/dist/daemon/runner/doer-driver.js.map +1 -0
- package/dist/daemon/runner/doer.js +336 -0
- package/dist/daemon/runner/doer.js.map +1 -0
- package/dist/daemon/runner/prior-round.js +140 -0
- package/dist/daemon/runner/prior-round.js.map +1 -0
- package/dist/daemon/runner/prompt-builder.js +292 -0
- package/dist/daemon/runner/prompt-builder.js.map +1 -0
- package/dist/daemon/runner/review-only-phase.js +103 -0
- package/dist/daemon/runner/review-only-phase.js.map +1 -0
- package/dist/daemon/runner/reviewer-driver.js +410 -0
- package/dist/daemon/runner/reviewer-driver.js.map +1 -0
- package/dist/daemon/runner/reviewer.js +384 -0
- package/dist/daemon/runner/reviewer.js.map +1 -0
- package/dist/daemon/runner/run-with-fallback.js +56 -0
- package/dist/daemon/runner/run-with-fallback.js.map +1 -0
- package/dist/daemon/runner/sanitize-name.js +8 -0
- package/dist/daemon/runner/sanitize-name.js.map +1 -0
- package/dist/daemon/runner/stream-file-writer.js +116 -0
- package/dist/daemon/runner/stream-file-writer.js.map +1 -0
- package/dist/daemon/runner/swap-sidecar.js +102 -0
- package/dist/daemon/runner/swap-sidecar.js.map +1 -0
- package/dist/daemon/runner/template-fallback.js +119 -0
- package/dist/daemon/runner/template-fallback.js.map +1 -0
- package/dist/daemon/runner/types.js +3 -0
- package/dist/daemon/runner/types.js.map +1 -0
- package/dist/daemon/runner/verdict.js +51 -0
- package/dist/daemon/runner/verdict.js.map +1 -0
- package/dist/daemon/runner-multiplex.js +364 -0
- package/dist/daemon/runner-multiplex.js.map +1 -0
- package/dist/daemon/runner.js +427 -0
- package/dist/daemon/runner.js.map +1 -0
- package/dist/daemon/ship.js +340 -0
- package/dist/daemon/ship.js.map +1 -0
- package/dist/daemon/template-cache.js +37 -0
- package/dist/daemon/template-cache.js.map +1 -0
- package/dist/daemon/tmux-types.js +9 -0
- package/dist/daemon/tmux-types.js.map +1 -0
- package/dist/daemon/tmux.js +341 -0
- package/dist/daemon/tmux.js.map +1 -0
- package/dist/lib/atomic-write.js +55 -0
- package/dist/lib/atomic-write.js.map +1 -0
- package/dist/lib/chat-events-bus.js +27 -0
- package/dist/lib/chat-events-bus.js.map +1 -0
- package/dist/lib/chat-slug.js +105 -0
- package/dist/lib/chat-slug.js.map +1 -0
- package/dist/lib/cli-detect.js +388 -0
- package/dist/lib/cli-detect.js.map +1 -0
- package/dist/lib/cli-health.js +156 -0
- package/dist/lib/cli-health.js.map +1 -0
- package/dist/lib/cli-paths.js +113 -0
- package/dist/lib/cli-paths.js.map +1 -0
- package/dist/lib/cli-precheck.js +141 -0
- package/dist/lib/cli-precheck.js.map +1 -0
- package/dist/lib/db/chats.js +244 -0
- package/dist/lib/db/chats.js.map +1 -0
- package/dist/lib/db/connection.js +254 -0
- package/dist/lib/db/connection.js.map +1 -0
- package/dist/lib/db/index.js +34 -0
- package/dist/lib/db/index.js.map +1 -0
- package/dist/lib/db/personas.js +65 -0
- package/dist/lib/db/personas.js.map +1 -0
- package/dist/lib/db/phase-events.js +172 -0
- package/dist/lib/db/phase-events.js.map +1 -0
- package/dist/lib/db/secrets.js +53 -0
- package/dist/lib/db/secrets.js.map +1 -0
- package/dist/lib/db/settings.js +47 -0
- package/dist/lib/db/settings.js.map +1 -0
- package/dist/lib/db/templates.js +75 -0
- package/dist/lib/db/templates.js.map +1 -0
- package/dist/lib/db/voices.js +184 -0
- package/dist/lib/db/voices.js.map +1 -0
- package/dist/lib/lineage-maps.js +200 -0
- package/dist/lib/lineage-maps.js.map +1 -0
- package/dist/lib/logger.js +186 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/personas.js +117 -0
- package/dist/lib/personas.js.map +1 -0
- package/dist/lib/runtime-path.js +222 -0
- package/dist/lib/runtime-path.js.map +1 -0
- package/dist/lib/settings/billing.js +58 -0
- package/dist/lib/settings/billing.js.map +1 -0
- package/dist/lib/settings/permissions.js +81 -0
- package/dist/lib/settings/permissions.js.map +1 -0
- package/dist/lib/settings/transport.js +113 -0
- package/dist/lib/settings/transport.js.map +1 -0
- package/dist/lib/telemetry.js +290 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/lib/template-schema.js +319 -0
- package/dist/lib/template-schema.js.map +1 -0
- package/dist/lib/template-validation.js +82 -0
- package/dist/lib/template-validation.js.map +1 -0
- package/dist/lib/voices.js +533 -0
- package/dist/lib/voices.js.map +1 -0
- package/dist/mcp/client.js +138 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/index.js +178 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools.js +355 -0
- package/dist/mcp/tools.js.map +1 -0
- package/package.json +2 -1
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js +0 -6077
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js.map +0 -69
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js +0 -6318
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js.map +0 -71
- package/.next/dev/types/cache-life.d.ts +0 -145
- package/.next/dev/types/routes.d.ts +0 -84
- package/.next/dev/types/validator.ts +0 -178
- /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 9cD3yIOGe_Aqr17uJHTQS}/_buildManifest.js +0 -0
- /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 9cD3yIOGe_Aqr17uJHTQS}/_clientMiddlewareManifest.js +0 -0
- /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"}
|