@kal-elsam/kairo-runtime 0.22.0 → 0.22.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/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,21 @@ Historical entries below may reference the legacy `@kal-elsam/harness` package n
|
|
|
5
5
|
|
|
6
6
|
## Unreleased
|
|
7
7
|
|
|
8
|
+
## 0.22.1 — 2026-09-18 (Kairo Runtime)
|
|
9
|
+
|
|
10
|
+
Patch release.
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- Execution links no longer hardcode `provider: "claude"` on every
|
|
15
|
+
write regardless of which real adapter (Codex, Cursor, OpenCode Go,
|
|
16
|
+
Claude) actually executed the task. `provider` now mirrors the
|
|
17
|
+
link's own real `agentId`, matching what `service.js`'s
|
|
18
|
+
`executionFor` already treated as ground truth at read time. The
|
|
19
|
+
cockpit reads this field directly for its provider display, so every
|
|
20
|
+
task's shown execution provider had always silently said "claude"
|
|
21
|
+
regardless of what actually ran it.
|
|
22
|
+
|
|
8
23
|
## 0.22.0 — 2026-09-18 (Kairo Runtime)
|
|
9
24
|
|
|
10
25
|
Minor release. Promotes OpenCode Go to a real automatic execution
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kal-elsam/kairo-runtime",
|
|
3
|
-
"version": "0.22.
|
|
3
|
+
"version": "0.22.1",
|
|
4
4
|
"description": "Kairo Runtime — local agent operating system for Codex, Cursor, Claude, Pi, Engram, and Graphify.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://github.com/Kal-elSam/harness#readme",
|
|
@@ -307,23 +307,41 @@ export async function readExecutionLink(projectRoot, taskId) {
|
|
|
307
307
|
const stat = await statOrNull(paths.executionPath);
|
|
308
308
|
if (!stat) return null;
|
|
309
309
|
const link = JSON.parse(await readFile(paths.executionPath, "utf8"));
|
|
310
|
+
// `provider` is real, structural validation only (a non-empty real
|
|
311
|
+
// string) — never a single hardcoded value. PROJECT TEAM can route a
|
|
312
|
+
// real task to any real adapter (Codex, Claude, Cursor, OpenCode Go),
|
|
313
|
+
// and a legacy artifact from before that existed still carries "claude"
|
|
314
|
+
// for real, so this must accept every real one honestly, never lie
|
|
315
|
+
// by forcing them all to read back as "claude".
|
|
310
316
|
if (link?.schema !== EXECUTION_SCHEMA || link?.taskId !== taskId
|
|
311
|
-
|| !/^run_[a-z0-9_]+$/.test(link?.runId ?? "") || link?.provider !== "
|
|
317
|
+
|| !/^run_[a-z0-9_]+$/.test(link?.runId ?? "") || typeof link?.provider !== "string" || link.provider.length === 0) {
|
|
312
318
|
throw new Error(`Invalid execution artifact: ${taskId}`);
|
|
313
319
|
}
|
|
314
320
|
return link;
|
|
315
321
|
}
|
|
316
322
|
|
|
323
|
+
/**
|
|
324
|
+
* `provider` always mirrors the link's own real `agentId` — the field a
|
|
325
|
+
* real caller (executePlan) actually sets, and the one PROJECT TEAM's own
|
|
326
|
+
* routing decision already named. Never a fabricated or hardcoded value;
|
|
327
|
+
* a legacy caller that never set agentId falls back to "claude" only
|
|
328
|
+
* because that's genuinely what every execution WAS before PROJECT TEAM's
|
|
329
|
+
* multi-provider routing existed — never a guess for real, current data.
|
|
330
|
+
*/
|
|
331
|
+
function resolveExecutionProvider(link) {
|
|
332
|
+
return link?.agentId ?? link?.provider ?? "claude";
|
|
333
|
+
}
|
|
334
|
+
|
|
317
335
|
export async function writeExecutionLink(projectRoot, taskId, link) {
|
|
318
336
|
const paths = await prepareTaskDirectory(projectRoot, taskId);
|
|
319
|
-
const value = { ...link, schema: EXECUTION_SCHEMA, taskId, provider:
|
|
337
|
+
const value = { ...link, schema: EXECUTION_SCHEMA, taskId, provider: resolveExecutionProvider(link) };
|
|
320
338
|
await writeAtomicJson(paths.executionPath, value, { createExclusive: true });
|
|
321
339
|
return value;
|
|
322
340
|
}
|
|
323
341
|
|
|
324
342
|
export async function updateExecutionLink(projectRoot, taskId, link) {
|
|
325
343
|
const paths = await prepareTaskDirectory(projectRoot, taskId);
|
|
326
|
-
const value = { ...link, schema: EXECUTION_SCHEMA, taskId, provider:
|
|
344
|
+
const value = { ...link, schema: EXECUTION_SCHEMA, taskId, provider: resolveExecutionProvider(link) };
|
|
327
345
|
await writeAtomicJson(paths.executionPath, value);
|
|
328
346
|
return value;
|
|
329
347
|
}
|
|
@@ -89,7 +89,7 @@ export async function readCodexModels({
|
|
|
89
89
|
child.once?.("close", () => { if (!finished) finish(unknown("codex app-server closed before model list")); });
|
|
90
90
|
|
|
91
91
|
writeRequest(child, 1, "initialize", {
|
|
92
|
-
clientInfo: { name: "kairo", title: "Kairo", version: "0.22.
|
|
92
|
+
clientInfo: { name: "kairo", title: "Kairo", version: "0.22.1" },
|
|
93
93
|
capabilities: {}
|
|
94
94
|
});
|
|
95
95
|
});
|
|
@@ -151,7 +151,7 @@ export async function readCodexUsage({
|
|
|
151
151
|
child.once?.("close", () => { if (!finished) finish(unknown("codex app-server closed before rate limits")); });
|
|
152
152
|
|
|
153
153
|
writeRequest(child, 1, "initialize", {
|
|
154
|
-
clientInfo: { name: "kairo", title: "Kairo", version: "0.22.
|
|
154
|
+
clientInfo: { name: "kairo", title: "Kairo", version: "0.22.1" },
|
|
155
155
|
capabilities: {}
|
|
156
156
|
});
|
|
157
157
|
});
|