@koda-sl/baker-bridge 0.149.0 → 0.150.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/dist/hono/bridge-job.d.ts +1 -0
- package/dist/hono/bridge-job.d.ts.map +1 -1
- package/dist/hono/bridge-job.js +13 -2
- package/dist/hono/bridge-job.js.map +1 -1
- package/dist/hono/bridge-job.test.js +34 -0
- package/dist/hono/bridge-job.test.js.map +1 -1
- package/dist/hono/served-model.d.ts +23 -0
- package/dist/hono/served-model.d.ts.map +1 -0
- package/dist/hono/served-model.js +82 -0
- package/dist/hono/served-model.js.map +1 -0
- package/dist/hono/served-model.test.d.ts +2 -0
- package/dist/hono/served-model.test.d.ts.map +1 -0
- package/dist/hono/served-model.test.js +29 -0
- package/dist/hono/served-model.test.js.map +1 -0
- package/dist/hono/session-usage-baseline.d.ts +1 -0
- package/dist/hono/session-usage-baseline.d.ts.map +1 -1
- package/dist/hono/session-usage-baseline.js +17 -4
- package/dist/hono/session-usage-baseline.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keeps a resumed conversation's earlier thinking, so a new turn re-reads the
|
|
3
|
+
* cached conversation instead of writing it again.
|
|
4
|
+
*
|
|
5
|
+
* The turn asks for the Anthropic-native id (`claude-opus-5-5`) and OpenRouter
|
|
6
|
+
* answers under its own slug (`anthropic/claude-opus-5.5`); the CLI stores the
|
|
7
|
+
* answer's `message.model`. It treats thinking from a model other than the one
|
|
8
|
+
* it is calling as foreign and leaves it out, and learns that the slug is the
|
|
9
|
+
* same model only from a response it received itself, in memory. Every turn here
|
|
10
|
+
* resumes in a new CLI, so its first request left out every earlier thinking
|
|
11
|
+
* block and the second put them back: the prompt cache broke right after the
|
|
12
|
+
* system prompt twice a turn (measured against the CLI bundled in SDK 0.3.295).
|
|
13
|
+
*
|
|
14
|
+
* Only a spelling of the requested model is rewritten. A response a different
|
|
15
|
+
* model really served keeps its name, so the CLI still drops its thinking.
|
|
16
|
+
*/
|
|
17
|
+
export declare function withRequestedModels(transcript: string): string | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Rewrites `sessionId`'s transcript before a CLI resumes it. Best effort: a
|
|
20
|
+
* transcript it cannot read or write costs the cache, never the turn.
|
|
21
|
+
*/
|
|
22
|
+
export declare function alignServedModels(sessionId: string, configDir: string): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=served-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"served-model.d.ts","sourceRoot":"","sources":["../../src/hono/served-model.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAc1E;AAuBD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB3F"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { readFile, rename, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import { normalizeModel } from "./model-capabilities.js";
|
|
3
|
+
import { sessionTranscriptPath } from "./session-usage-baseline.js";
|
|
4
|
+
/**
|
|
5
|
+
* Keeps a resumed conversation's earlier thinking, so a new turn re-reads the
|
|
6
|
+
* cached conversation instead of writing it again.
|
|
7
|
+
*
|
|
8
|
+
* The turn asks for the Anthropic-native id (`claude-opus-5-5`) and OpenRouter
|
|
9
|
+
* answers under its own slug (`anthropic/claude-opus-5.5`); the CLI stores the
|
|
10
|
+
* answer's `message.model`. It treats thinking from a model other than the one
|
|
11
|
+
* it is calling as foreign and leaves it out, and learns that the slug is the
|
|
12
|
+
* same model only from a response it received itself, in memory. Every turn here
|
|
13
|
+
* resumes in a new CLI, so its first request left out every earlier thinking
|
|
14
|
+
* block and the second put them back: the prompt cache broke right after the
|
|
15
|
+
* system prompt twice a turn (measured against the CLI bundled in SDK 0.3.295).
|
|
16
|
+
*
|
|
17
|
+
* Only a spelling of the requested model is rewritten. A response a different
|
|
18
|
+
* model really served keeps its name, so the CLI still drops its thinking.
|
|
19
|
+
*/
|
|
20
|
+
export function withRequestedModels(transcript) {
|
|
21
|
+
let changed = false;
|
|
22
|
+
const lines = transcript.split("\n").map((line) => {
|
|
23
|
+
if (!line.includes('"requestedModel"')) {
|
|
24
|
+
return line;
|
|
25
|
+
}
|
|
26
|
+
const aligned = alignedLine(line);
|
|
27
|
+
if (aligned === undefined) {
|
|
28
|
+
return line;
|
|
29
|
+
}
|
|
30
|
+
changed = true;
|
|
31
|
+
return aligned;
|
|
32
|
+
});
|
|
33
|
+
return changed ? lines.join("\n") : undefined;
|
|
34
|
+
}
|
|
35
|
+
function alignedLine(line) {
|
|
36
|
+
let entry;
|
|
37
|
+
try {
|
|
38
|
+
entry = JSON.parse(line);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
if (!isRecord(entry) || entry.type !== "assistant" || typeof entry.requestedModel !== "string") {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const message = entry.message;
|
|
47
|
+
if (!isRecord(message) || typeof message.model !== "string") {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
const requested = entry.requestedModel;
|
|
51
|
+
if (message.model === requested || normalizeModel(message.model) !== normalizeModel(requested)) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
return JSON.stringify({ ...entry, message: { ...message, model: requested } });
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Rewrites `sessionId`'s transcript before a CLI resumes it. Best effort: a
|
|
58
|
+
* transcript it cannot read or write costs the cache, never the turn.
|
|
59
|
+
*/
|
|
60
|
+
export async function alignServedModels(sessionId, configDir) {
|
|
61
|
+
const path = await sessionTranscriptPath(sessionId, configDir);
|
|
62
|
+
if (!path) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
const aligned = withRequestedModels(await readFile(path, "utf8"));
|
|
67
|
+
if (aligned === undefined) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const staged = `${path}.served-model.tmp`;
|
|
71
|
+
// The CLI keeps its transcripts private (0600); the rewrite does too.
|
|
72
|
+
await writeFile(staged, aligned, { encoding: "utf8", mode: (await stat(path)).mode });
|
|
73
|
+
await rename(staged, path);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.warn(`[BridgeJob] could not align the served model in ${sessionId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function isRecord(value) {
|
|
80
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=served-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"served-model.js","sourceRoot":"","sources":["../../src/hono/served-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"served-model.test.d.ts","sourceRoot":"","sources":["../../src/hono/served-model.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { withRequestedModels } from "./served-model.js";
|
|
3
|
+
// The shape the CLI writes for a response OpenRouter served: the request named
|
|
4
|
+
// the Anthropic-native id, the response came back under OpenRouter's slug.
|
|
5
|
+
function assistantLine(model, requestedModel, content) {
|
|
6
|
+
return JSON.stringify({
|
|
7
|
+
type: "assistant",
|
|
8
|
+
uuid: `u_${content.length}`,
|
|
9
|
+
requestedModel,
|
|
10
|
+
message: { id: "msg_1", role: "assistant", model, content },
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
const THINKING = { type: "thinking", thinking: "plan the page", signature: "EqQBCkgIARAB" };
|
|
14
|
+
describe("withRequestedModels", () => {
|
|
15
|
+
it("records a response OpenRouter served under its own slug as the model the turn asked for", () => {
|
|
16
|
+
const user = JSON.stringify({ type: "user", message: { role: "user", content: "make a landing" } });
|
|
17
|
+
const transcript = [user, assistantLine("anthropic/claude-opus-5.5", "claude-opus-5-5", [THINKING]), ""].join("\n");
|
|
18
|
+
const aligned = withRequestedModels(transcript);
|
|
19
|
+
const lines = aligned?.split("\n") ?? [];
|
|
20
|
+
expect(lines[0]).toBe(user);
|
|
21
|
+
expect(JSON.parse(lines[1] ?? "{}").message.model).toBe("claude-opus-5-5");
|
|
22
|
+
expect(lines[2]).toBe("");
|
|
23
|
+
});
|
|
24
|
+
it("leaves a response another model served under its own name, so its thinking stays out", () => {
|
|
25
|
+
const transcript = assistantLine("anthropic/claude-sonnet-5.5", "claude-opus-5-5", [THINKING]);
|
|
26
|
+
expect(withRequestedModels(transcript)).toBeUndefined();
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=served-model.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"served-model.test.js","sourceRoot":"","sources":["../../src/hono/served-model.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,+EAA+E;AAC/E,2EAA2E;AAC3E,SAAS,aAAa,CAAC,KAAa,EAAE,cAAsB,EAAE,OAAkB;IAC9E,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,KAAK,OAAO,CAAC,MAAM,EAAE;QAC3B,cAAc;QACd,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE;KAC5D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;AAE5F,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,yFAAyF,EAAE,GAAG,EAAE;QACjG,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACpG,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,2BAA2B,EAAE,iBAAiB,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpH,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAEhD,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3E,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;QAC9F,MAAM,UAAU,GAAG,aAAa,CAAC,6BAA6B,EAAE,iBAAiB,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE/F,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -32,6 +32,7 @@ export declare function parseUsageBaseline(transcript: string, sessionId: string
|
|
|
32
32
|
* The project directory is found rather than derived, so the CLI's cwd-to-name
|
|
33
33
|
* encoding stays the CLI's.
|
|
34
34
|
*/
|
|
35
|
+
export declare function sessionTranscriptPath(sessionId: string, configDir: string): Promise<string | undefined>;
|
|
35
36
|
export declare function readUsageBaseline(sessionId: string, configDir: string): Promise<UsageBaseline | undefined>;
|
|
36
37
|
/**
|
|
37
38
|
* A result's totals minus the baseline its session restored.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-usage-baseline.d.ts","sourceRoot":"","sources":["../../src/hono/session-usage-baseline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAEjE;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAChD,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,EAAE,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAOF,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAYnG;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"session-usage-baseline.d.ts","sourceRoot":"","sources":["../../src/hono/session-usage-baseline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAEjE;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAChD,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,EAAE,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAOF,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAYnG;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAkB7G;AAED,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAUhH;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,CAAA;CAAE,EACpF,QAAQ,EAAE,aAAa,GAAG,SAAS,GAClC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,CAAA;CAAE,CAazE"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readdir, readFile } from "node:fs/promises";
|
|
1
|
+
import { access, readdir, readFile } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
const TOKEN_FIELDS = ["inputTokens", "outputTokens", "cacheReadInputTokens", "cacheCreationInputTokens"];
|
|
4
4
|
// Floating-point slack when deciding whether a total is below its baseline.
|
|
@@ -22,7 +22,7 @@ export function parseUsageBaseline(transcript, sessionId) {
|
|
|
22
22
|
* The project directory is found rather than derived, so the CLI's cwd-to-name
|
|
23
23
|
* encoding stays the CLI's.
|
|
24
24
|
*/
|
|
25
|
-
export async function
|
|
25
|
+
export async function sessionTranscriptPath(sessionId, configDir) {
|
|
26
26
|
const projectsDir = join(configDir, "projects");
|
|
27
27
|
let projects;
|
|
28
28
|
try {
|
|
@@ -32,9 +32,10 @@ export async function readUsageBaseline(sessionId, configDir) {
|
|
|
32
32
|
return undefined;
|
|
33
33
|
}
|
|
34
34
|
for (const project of projects) {
|
|
35
|
+
const path = join(projectsDir, project, `${sessionId}.jsonl`);
|
|
35
36
|
try {
|
|
36
|
-
|
|
37
|
-
return
|
|
37
|
+
await access(path);
|
|
38
|
+
return path;
|
|
38
39
|
}
|
|
39
40
|
catch {
|
|
40
41
|
// Not in this project directory.
|
|
@@ -42,6 +43,18 @@ export async function readUsageBaseline(sessionId, configDir) {
|
|
|
42
43
|
}
|
|
43
44
|
return undefined;
|
|
44
45
|
}
|
|
46
|
+
export async function readUsageBaseline(sessionId, configDir) {
|
|
47
|
+
const path = await sessionTranscriptPath(sessionId, configDir);
|
|
48
|
+
if (!path) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
return parseUsageBaseline(await readFile(path, "utf8"), sessionId);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
45
58
|
/**
|
|
46
59
|
* A result's totals minus the baseline its session restored.
|
|
47
60
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-usage-baseline.js","sourceRoot":"","sources":["../../src/hono/session-usage-baseline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-usage-baseline.js","sourceRoot":"","sources":["../../src/hono/session-usage-baseline.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED