@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.
Files changed (92) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/package.json +2 -1
  3. package/scripts/cockpit-smoke.mjs +1 -1
  4. package/scripts/ux-smoke-test.sh +3 -3
  5. package/src/cli.js +106 -11
  6. package/src/global/agent-capabilities/create-capability-adapter.js +2 -2
  7. package/src/global/architect/architect-cli.js +76 -0
  8. package/src/global/architect/architect-codex.js +146 -0
  9. package/src/global/architect/architect-manager.js +125 -0
  10. package/src/global/architect/architect-store.js +377 -0
  11. package/src/global/architect/architect-types.js +47 -0
  12. package/src/global/cli-help.js +12 -1
  13. package/src/global/cockpit/app.js +475 -0
  14. package/src/global/cockpit/card.js +111 -0
  15. package/src/global/cockpit/cli.js +33 -0
  16. package/src/global/cockpit/gauge.js +31 -0
  17. package/src/global/cockpit/project-overlay.js +683 -0
  18. package/src/global/cockpit/rows.js +148 -0
  19. package/src/global/cockpit/theme.js +118 -0
  20. package/src/global/cockpit/view.js +1263 -0
  21. package/src/global/control-plane/attention.js +141 -0
  22. package/src/global/control-plane/build-report.js +146 -0
  23. package/src/global/control-plane/cli.js +36 -0
  24. package/src/global/control-plane/constants.js +38 -0
  25. package/src/global/control-plane/gentle-adapters.js +183 -0
  26. package/src/global/control-plane/provider.js +69 -0
  27. package/src/global/control-plane/review-status.js +115 -0
  28. package/src/global/control-plane/sdd-status.js +49 -0
  29. package/src/global/control-plane/team.js +63 -0
  30. package/src/global/conversation/bootstrap-analyzer-adapters.js +251 -0
  31. package/src/global/conversation/cli.js +53 -0
  32. package/src/global/conversation/codex-sandbox.js +230 -0
  33. package/src/global/conversation/cursor-sandbox.js +215 -0
  34. package/src/global/conversation/project-analysis.js +204 -0
  35. package/src/global/conversation/project-profile.js +178 -0
  36. package/src/global/conversation/project-router.js +149 -0
  37. package/src/global/conversation/project-strategy-store.js +64 -0
  38. package/src/global/conversation/project-strategy.js +514 -0
  39. package/src/global/conversation/sanitized-snapshot.js +169 -0
  40. package/src/global/conversation/secret-scanner.js +71 -0
  41. package/src/global/conversation/service.js +1063 -0
  42. package/src/global/conversation/session-store.js +75 -0
  43. package/src/global/conversation/transcript-store.js +79 -0
  44. package/src/global/conversation/ui.js +195 -0
  45. package/src/global/intelligence/capability-scoring.js +480 -0
  46. package/src/global/intelligence/execution-router.js +444 -0
  47. package/src/global/intelligence/kairo-telemetry-source.js +59 -0
  48. package/src/global/intelligence/kairobench-runner.js +85 -0
  49. package/src/global/intelligence/kairobench-source.js +34 -0
  50. package/src/global/intelligence/kairobench-tasks.js +47 -0
  51. package/src/global/intelligence/model-candidate-catalog.js +456 -0
  52. package/src/global/intelligence/model-capability-registry-sources.js +145 -0
  53. package/src/global/intelligence/model-capability-registry.js +125 -0
  54. package/src/global/intelligence/model-intelligence.js +1646 -0
  55. package/src/global/intelligence/official-benchmark-snapshots.js +162 -0
  56. package/src/global/intelligence/quick-ask.js +149 -0
  57. package/src/global/intelligence/role-profiles.js +251 -0
  58. package/src/global/intelligence/skill-catalog.js +67 -0
  59. package/src/global/intelligence/subscription-pressure-source.js +41 -0
  60. package/src/global/mcp/kairo-mcp.js +51 -18
  61. package/src/global/mcp/work-snapshot-rule.js +4 -2
  62. package/src/global/mcp/workspace-binding.js +88 -0
  63. package/src/global/mcp/workspace-mcp-entry.js +74 -0
  64. package/src/global/mcp-install.js +8 -1
  65. package/src/global/observability/artificial-analysis-models.js +118 -0
  66. package/src/global/observability/claude-models.js +31 -0
  67. package/src/global/observability/claude-usage.js +112 -0
  68. package/src/global/observability/codex-models.js +96 -0
  69. package/src/global/observability/codex-usage.js +160 -0
  70. package/src/global/observability/cursor-auth.js +88 -0
  71. package/src/global/observability/cursor-models.js +101 -0
  72. package/src/global/observability/gentle-probe.js +30 -2
  73. package/src/global/observability/huggingface-leaderboard.js +97 -0
  74. package/src/global/observability/index.js +2 -1
  75. package/src/global/observability/opencode-models.js +101 -0
  76. package/src/global/observability/opencode-usage.js +162 -0
  77. package/src/global/paths.js +49 -2
  78. package/src/global/profile.js +23 -1
  79. package/src/global/runtime/execution-adapters/claude.js +63 -30
  80. package/src/global/runtime/execution-adapters/codex.js +9 -2
  81. package/src/global/runtime/execution-adapters/create-execution-adapter.js +6 -1
  82. package/src/global/runtime/execution-adapters/opencode.js +83 -18
  83. package/src/global/runtime/execution-worktree-manager.js +924 -0
  84. package/src/global/runtime/execution-worktree-orchestrator.js +194 -0
  85. package/src/global/runtime/execution-worktree-store.js +83 -0
  86. package/src/global/runtime/execution-worktree-types.js +45 -0
  87. package/src/global/runtime/run-events.js +38 -0
  88. package/src/global/runtime/run-manager.js +22 -6
  89. package/src/global/runtime/run-supervisor.js +41 -12
  90. package/src/global/runtime/usage-manager.js +96 -0
  91. package/src/global/runtime/usage-store.js +69 -0
  92. 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
- const args = ["run", task];
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 (model) {
9
- args.unshift("--model", model);
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 (permissions.includes("force") || permissions.includes("all")) {
13
- args.unshift("--force");
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: false,
31
- tokens: false,
94
+ structuredEvents: true,
95
+ tokens: true,
32
96
  diff: false,
33
97
  cancel: true,
34
- transcript: false,
35
- permissionModes: ["force"]
98
+ transcript: true,
99
+ permissionModes: ["force", "yolo"]
36
100
  },
101
+ checkAvailability: checkOpencodeAvailability,
37
102
  buildLaunch: buildOpencodeLaunch,
38
- parseEventLine: null
103
+ parseEventLine: parseOpencodeEventLine
39
104
  });