@kal-elsam/kairo-runtime 0.15.0 → 0.17.0
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/CHANGELOG.md +76 -0
- package/package.json +2 -1
- package/scripts/cockpit-smoke.mjs +1 -1
- package/scripts/ux-smoke-test.sh +3 -3
- package/src/cli.js +106 -11
- package/src/global/agent-capabilities/create-capability-adapter.js +2 -2
- package/src/global/architect/architect-cli.js +76 -0
- package/src/global/architect/architect-codex.js +146 -0
- package/src/global/architect/architect-manager.js +125 -0
- package/src/global/architect/architect-store.js +377 -0
- package/src/global/architect/architect-types.js +47 -0
- package/src/global/cli-help.js +12 -1
- package/src/global/cockpit/app.js +475 -0
- package/src/global/cockpit/card.js +111 -0
- package/src/global/cockpit/cli.js +33 -0
- package/src/global/cockpit/gauge.js +31 -0
- package/src/global/cockpit/project-overlay.js +683 -0
- package/src/global/cockpit/rows.js +148 -0
- package/src/global/cockpit/theme.js +118 -0
- package/src/global/cockpit/view.js +1263 -0
- package/src/global/control-plane/attention.js +141 -0
- package/src/global/control-plane/build-report.js +146 -0
- package/src/global/control-plane/cli.js +36 -0
- package/src/global/control-plane/constants.js +38 -0
- package/src/global/control-plane/gentle-adapters.js +183 -0
- package/src/global/control-plane/provider.js +69 -0
- package/src/global/control-plane/review-status.js +115 -0
- package/src/global/control-plane/sdd-status.js +49 -0
- package/src/global/control-plane/team.js +63 -0
- package/src/global/conversation/bootstrap-analyzer-adapters.js +251 -0
- package/src/global/conversation/cli.js +53 -0
- package/src/global/conversation/codex-sandbox.js +230 -0
- package/src/global/conversation/cursor-sandbox.js +215 -0
- package/src/global/conversation/project-analysis.js +204 -0
- package/src/global/conversation/project-profile.js +178 -0
- package/src/global/conversation/project-router.js +149 -0
- package/src/global/conversation/project-strategy-store.js +64 -0
- package/src/global/conversation/project-strategy.js +514 -0
- package/src/global/conversation/sanitized-snapshot.js +169 -0
- package/src/global/conversation/secret-scanner.js +71 -0
- package/src/global/conversation/service.js +1063 -0
- package/src/global/conversation/session-store.js +75 -0
- package/src/global/conversation/transcript-store.js +79 -0
- package/src/global/conversation/ui.js +195 -0
- package/src/global/intelligence/capability-scoring.js +480 -0
- package/src/global/intelligence/execution-router.js +444 -0
- package/src/global/intelligence/kairo-telemetry-source.js +59 -0
- package/src/global/intelligence/kairobench-runner.js +85 -0
- package/src/global/intelligence/kairobench-source.js +34 -0
- package/src/global/intelligence/kairobench-tasks.js +47 -0
- package/src/global/intelligence/model-candidate-catalog.js +456 -0
- package/src/global/intelligence/model-capability-registry-sources.js +145 -0
- package/src/global/intelligence/model-capability-registry.js +125 -0
- package/src/global/intelligence/model-intelligence.js +1646 -0
- package/src/global/intelligence/official-benchmark-snapshots.js +162 -0
- package/src/global/intelligence/quick-ask.js +149 -0
- package/src/global/intelligence/role-profiles.js +251 -0
- package/src/global/intelligence/skill-catalog.js +67 -0
- package/src/global/intelligence/subscription-pressure-source.js +41 -0
- package/src/global/mcp/kairo-mcp.js +51 -18
- package/src/global/mcp/work-snapshot-rule.js +4 -2
- package/src/global/mcp/workspace-binding.js +88 -0
- package/src/global/mcp/workspace-mcp-entry.js +74 -0
- package/src/global/mcp-install.js +8 -1
- package/src/global/observability/artificial-analysis-models.js +118 -0
- package/src/global/observability/claude-models.js +31 -0
- package/src/global/observability/claude-usage.js +112 -0
- package/src/global/observability/codex-models.js +96 -0
- package/src/global/observability/codex-usage.js +160 -0
- package/src/global/observability/cursor-auth.js +88 -0
- package/src/global/observability/cursor-models.js +101 -0
- package/src/global/observability/gentle-probe.js +30 -2
- package/src/global/observability/huggingface-leaderboard.js +97 -0
- package/src/global/observability/index.js +2 -1
- package/src/global/observability/opencode-models.js +101 -0
- package/src/global/observability/opencode-usage.js +162 -0
- package/src/global/paths.js +49 -2
- package/src/global/profile.js +23 -1
- package/src/global/runtime/execution-adapters/claude.js +63 -30
- package/src/global/runtime/execution-adapters/codex.js +9 -2
- package/src/global/runtime/execution-adapters/create-execution-adapter.js +6 -1
- package/src/global/runtime/execution-adapters/opencode.js +83 -18
- package/src/global/runtime/execution-worktree-manager.js +924 -0
- package/src/global/runtime/execution-worktree-orchestrator.js +194 -0
- package/src/global/runtime/execution-worktree-store.js +83 -0
- package/src/global/runtime/execution-worktree-types.js +45 -0
- package/src/global/runtime/run-events.js +38 -0
- package/src/global/runtime/run-manager.js +22 -6
- package/src/global/runtime/run-supervisor.js +41 -12
- package/src/global/runtime/usage-manager.js +96 -0
- package/src/global/runtime/usage-store.js +69 -0
- package/src/global/runtime/usage-types.js +62 -0
|
@@ -1,39 +1,104 @@
|
|
|
1
|
-
import { createExecutionAdapter } from "./create-execution-adapter.js";
|
|
1
|
+
import { createExecutionAdapter, parseNdjsonLine } from "./create-execution-adapter.js";
|
|
2
|
+
import { isExecutableAvailable } from "../../cli-probe.js";
|
|
2
3
|
|
|
3
4
|
const EXECUTABLE = "opencode";
|
|
4
5
|
|
|
6
|
+
// Verified live (`opencode run --format json`) against a real account: the
|
|
7
|
+
// CLI genuinely emits parseable NDJSON events — step_start/step_finish,
|
|
8
|
+
// tool_use (with real tool name + status), text, and error — including
|
|
9
|
+
// real per-step `tokens` {input, output, reasoning, cache} and `cost` on
|
|
10
|
+
// step_finish. That earlier "does not emit auditable structured events"
|
|
11
|
+
// claim was wrong; structuredEvents below is now an accurate capability.
|
|
12
|
+
//
|
|
13
|
+
// It stays `launchable: false` anyway, for a different, harder reason:
|
|
14
|
+
// this adapter is shared by both OpenCode Go (subscription, $10/mo) and
|
|
15
|
+
// OpenCode Zen (PAYG) — same `opencode` executable, same event shapes,
|
|
16
|
+
// no field in any event that names which product tier actually served
|
|
17
|
+
// the request. A live invocation with `-m opencode/<id>` for a model that
|
|
18
|
+
// exists on BOTH tiers was confirmed to be ambiguous — no way to prove
|
|
19
|
+
// after the fact whether it ran on Go or silently billed against Zen. A
|
|
20
|
+
// second invocation with the Go-specific `opencode-go/<id>` prefix simply
|
|
21
|
+
// hung. Per explicit decision: Kairo must not route real tasks through
|
|
22
|
+
// this adapter until it can prove, from the run's own evidence, both (1)
|
|
23
|
+
// the effective provider actually used was opencode-go, and (2) Zen was
|
|
24
|
+
// not touched. Until that receipt-level proof exists, this stays blocked
|
|
25
|
+
// — no more paid trial invocations to "just check" this again.
|
|
26
|
+
function checkOpencodeAvailability(context = {}) {
|
|
27
|
+
const available = isExecutableAvailable(EXECUTABLE, { env: context.env ?? process.env });
|
|
28
|
+
if (!available) {
|
|
29
|
+
return {
|
|
30
|
+
available: false, compatible: false, launchable: false,
|
|
31
|
+
reason: `OpenCode CLI "${EXECUTABLE}" is not on PATH.`
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
available: true, compatible: true, launchable: false,
|
|
36
|
+
reason: "OpenCode Go/Zen share one executable with no per-event way to prove which product tier actually served a run — blocked until that provider-isolation evidence exists."
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
5
40
|
function buildOpencodeLaunch({ task, cwd, model, permissions = [] }) {
|
|
6
|
-
|
|
41
|
+
// Not the adapter's call to make: which provider prefix ("opencode/" vs
|
|
42
|
+
// "opencode-go/") is safe for a given model id is exactly the unresolved
|
|
43
|
+
// question above. Whatever fully-qualified model ref the caller supplies
|
|
44
|
+
// is passed through unmodified, same as codex.js/claude.js do.
|
|
45
|
+
const args = ["run", "--format", "json"];
|
|
46
|
+
const normalized = permissions.map((entry) => String(entry).toLowerCase());
|
|
47
|
+
if (normalized.includes("yolo") || normalized.includes("force") || normalized.includes("all")) {
|
|
48
|
+
args.push("--auto");
|
|
49
|
+
}
|
|
50
|
+
if (model) args.push("--model", model);
|
|
51
|
+
args.push(task);
|
|
52
|
+
return { command: EXECUTABLE, args, cwd, env: process.env };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Verified against real captured output (`opencode run --format json`),
|
|
57
|
+
* not guessed: tool_use/tool -> tool_call, step_finish's real per-step
|
|
58
|
+
* tokens+cost -> usage, error -> passed through raw (no invented shape
|
|
59
|
+
* for a case never seen with a matching one here). Everything else
|
|
60
|
+
* (step_start, text) passes through raw, same fallback as the other
|
|
61
|
+
* adapters' parsers.
|
|
62
|
+
*/
|
|
63
|
+
export function parseOpencodeEventLine(line) {
|
|
64
|
+
const parsed = parseNdjsonLine(line);
|
|
65
|
+
if (!parsed || typeof parsed !== "object") return null;
|
|
7
66
|
|
|
8
|
-
if (
|
|
9
|
-
|
|
67
|
+
if (parsed.type === "tool_use" && parsed.part?.type === "tool") {
|
|
68
|
+
return {
|
|
69
|
+
type: "tool_call",
|
|
70
|
+
tool_name: parsed.part.tool ?? "unknown",
|
|
71
|
+
status: parsed.part.state?.status ?? "started"
|
|
72
|
+
};
|
|
10
73
|
}
|
|
11
74
|
|
|
12
|
-
if (
|
|
13
|
-
|
|
75
|
+
if (parsed.type === "step_finish" && parsed.part?.tokens) {
|
|
76
|
+
const tokens = parsed.part.tokens;
|
|
77
|
+
return {
|
|
78
|
+
type: "usage",
|
|
79
|
+
inputTokens: tokens.input ?? null,
|
|
80
|
+
outputTokens: tokens.output ?? null,
|
|
81
|
+
totalTokens: tokens.total ?? null,
|
|
82
|
+
cost: parsed.part.cost ?? null
|
|
83
|
+
};
|
|
14
84
|
}
|
|
15
85
|
|
|
16
|
-
return
|
|
17
|
-
command: EXECUTABLE,
|
|
18
|
-
args,
|
|
19
|
-
cwd,
|
|
20
|
-
env: process.env
|
|
21
|
-
};
|
|
86
|
+
return parsed;
|
|
22
87
|
}
|
|
23
88
|
|
|
24
89
|
export default createExecutionAdapter({
|
|
25
90
|
id: "opencode",
|
|
26
91
|
label: "OpenCode",
|
|
27
92
|
executable: EXECUTABLE,
|
|
28
|
-
launchable: false,
|
|
29
93
|
capabilities: {
|
|
30
|
-
structuredEvents:
|
|
31
|
-
tokens:
|
|
94
|
+
structuredEvents: true,
|
|
95
|
+
tokens: true,
|
|
32
96
|
diff: false,
|
|
33
97
|
cancel: true,
|
|
34
|
-
transcript:
|
|
35
|
-
permissionModes: ["force"]
|
|
98
|
+
transcript: true,
|
|
99
|
+
permissionModes: ["force", "yolo"]
|
|
36
100
|
},
|
|
101
|
+
checkAvailability: checkOpencodeAvailability,
|
|
37
102
|
buildLaunch: buildOpencodeLaunch,
|
|
38
|
-
parseEventLine:
|
|
103
|
+
parseEventLine: parseOpencodeEventLine
|
|
39
104
|
});
|