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