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