@koda-sl/baker-bridge 0.164.0-dev.d9feffe34 → 0.168.0-dev.d78500250
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/README.md +40 -19
- package/dist/hono/bridge-job.d.ts +17 -0
- package/dist/hono/bridge-job.d.ts.map +1 -1
- package/dist/hono/bridge-job.js +110 -19
- package/dist/hono/bridge-job.js.map +1 -1
- package/dist/hono/bridge-job.test.js +184 -13
- package/dist/hono/bridge-job.test.js.map +1 -1
- package/dist/hono/effort-route.d.ts +43 -0
- package/dist/hono/effort-route.d.ts.map +1 -0
- package/dist/hono/effort-route.js +36 -0
- package/dist/hono/effort-route.js.map +1 -0
- package/dist/hono/effort-route.test.d.ts +2 -0
- package/dist/hono/effort-route.test.d.ts.map +1 -0
- package/dist/hono/effort-route.test.js +54 -0
- package/dist/hono/effort-route.test.js.map +1 -0
- package/dist/hono/openrouter-session.d.ts +16 -13
- package/dist/hono/openrouter-session.d.ts.map +1 -1
- package/dist/hono/openrouter-session.js +16 -13
- package/dist/hono/openrouter-session.js.map +1 -1
- package/dist/hono/relay.d.ts +8 -0
- package/dist/hono/relay.d.ts.map +1 -1
- package/dist/hono/relay.js +2 -0
- package/dist/hono/relay.js.map +1 -1
- package/dist/hono/relay.test.js +24 -0
- package/dist/hono/relay.test.js.map +1 -1
- package/dist/hono/runtime-files.d.ts +1 -0
- package/dist/hono/runtime-files.d.ts.map +1 -1
- package/dist/hono/runtime-files.js +3 -0
- package/dist/hono/runtime-files.js.map +1 -1
- package/dist/hono/tool-result-ledger.d.ts +30 -0
- package/dist/hono/tool-result-ledger.d.ts.map +1 -0
- package/dist/hono/tool-result-ledger.js +63 -0
- package/dist/hono/tool-result-ledger.js.map +1 -0
- package/dist/hono/tool-result-ledger.test.d.ts +2 -0
- package/dist/hono/tool-result-ledger.test.d.ts.map +1 -0
- package/dist/hono/tool-result-ledger.test.js +61 -0
- package/dist/hono/tool-result-ledger.test.js.map +1 -0
- package/dist/hono/workspace-instructions.d.ts +43 -0
- package/dist/hono/workspace-instructions.d.ts.map +1 -0
- package/dist/hono/workspace-instructions.js +68 -0
- package/dist/hono/workspace-instructions.js.map +1 -0
- package/dist/hono/workspace-instructions.test.d.ts +2 -0
- package/dist/hono/workspace-instructions.test.d.ts.map +1 -0
- package/dist/hono/workspace-instructions.test.js +68 -0
- package/dist/hono/workspace-instructions.test.js.map +1 -0
- package/dist/review/digest.d.ts +13 -0
- package/dist/review/digest.d.ts.map +1 -1
- package/dist/review/digest.js +1 -1
- package/dist/review/digest.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What one tool's results put in a context during one turn.
|
|
3
|
+
*
|
|
4
|
+
* Tool results are most of what a turn writes to the prompt cache — on warm
|
|
5
|
+
* turns ~93% of the tokens written are not the model's own output — and every
|
|
6
|
+
* one is written once at the 1h-write price and re-read on each later request.
|
|
7
|
+
* Production recorded none of it (the review digest measures it, inside the
|
|
8
|
+
* sandbox only), so which command families to make compact was guesswork.
|
|
9
|
+
*
|
|
10
|
+
* A `baker` call is keyed by its command (`baker ads google query`), anything
|
|
11
|
+
* else by its tool name. A subagent's results land in its own context, so they
|
|
12
|
+
* are kept apart from the main agent's.
|
|
13
|
+
*/
|
|
14
|
+
export type ToolResultSize = {
|
|
15
|
+
tool: string;
|
|
16
|
+
agent: "main" | "subagent";
|
|
17
|
+
calls: number;
|
|
18
|
+
bytes: number;
|
|
19
|
+
/** Text at bytes/4, images by their pixels — the review digest's estimate. */
|
|
20
|
+
tokens: number;
|
|
21
|
+
};
|
|
22
|
+
export declare class ToolResultLedger {
|
|
23
|
+
private readonly keys;
|
|
24
|
+
private readonly totals;
|
|
25
|
+
/** Feed every SDK message of the turn, in order. */
|
|
26
|
+
observe(message: unknown): void;
|
|
27
|
+
/** The largest entries first. */
|
|
28
|
+
summary(limit?: number): ToolResultSize[];
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=tool-result-ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-result-ledger.d.ts","sourceRoot":"","sources":["../../src/hono/tool-result-ledger.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAgCF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6B;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAE5D,oDAAoD;IACpD,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8B9B;IAED,iCAAiC;IACjC,OAAO,CAAC,KAAK,SAAgB,GAAG,cAAc,EAAE,CAK/C;CACF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { bakerVerbOf, measureToolResult } from "../review/digest.js";
|
|
2
|
+
/** Enough to name every family that matters without growing the completion payload. */
|
|
3
|
+
const DEFAULT_LIMIT = 30;
|
|
4
|
+
function blocksOf(message) {
|
|
5
|
+
if (typeof message !== "object" || message === null) {
|
|
6
|
+
return [];
|
|
7
|
+
}
|
|
8
|
+
const content = message.message?.content;
|
|
9
|
+
return Array.isArray(content) ? content : [];
|
|
10
|
+
}
|
|
11
|
+
function keyOf(name, input) {
|
|
12
|
+
if (name === "Bash" && typeof input === "object" && input !== null) {
|
|
13
|
+
const command = input.command;
|
|
14
|
+
if (typeof command === "string") {
|
|
15
|
+
return bakerVerbOf(command) ?? "Bash";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return name;
|
|
19
|
+
}
|
|
20
|
+
export class ToolResultLedger {
|
|
21
|
+
keys = new Map();
|
|
22
|
+
totals = new Map();
|
|
23
|
+
/** Feed every SDK message of the turn, in order. */
|
|
24
|
+
observe(message) {
|
|
25
|
+
if (typeof message !== "object" || message === null) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const { type, parent_tool_use_id: parent } = message;
|
|
29
|
+
const agent = typeof parent === "string" && parent.length > 0 ? "subagent" : "main";
|
|
30
|
+
if (type === "assistant") {
|
|
31
|
+
for (const block of blocksOf(message)) {
|
|
32
|
+
if (block.type === "tool_use" && typeof block.id === "string" && typeof block.name === "string") {
|
|
33
|
+
this.keys.set(block.id, keyOf(block.name, block.input));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (type !== "user") {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
for (const block of blocksOf(message)) {
|
|
42
|
+
if (block.type !== "tool_result") {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const tool = (typeof block.tool_use_id === "string" && this.keys.get(block.tool_use_id)) || "unknown";
|
|
46
|
+
const { bytes, tokens } = measureToolResult(block.content);
|
|
47
|
+
const entryKey = `${agent}\u0000${tool}`;
|
|
48
|
+
const entry = this.totals.get(entryKey) ?? { tool, agent, calls: 0, bytes: 0, tokens: 0 };
|
|
49
|
+
entry.calls += 1;
|
|
50
|
+
entry.bytes += bytes;
|
|
51
|
+
entry.tokens += tokens;
|
|
52
|
+
this.totals.set(entryKey, entry);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** The largest entries first. */
|
|
56
|
+
summary(limit = DEFAULT_LIMIT) {
|
|
57
|
+
return [...this.totals.values()]
|
|
58
|
+
.sort((a, b) => b.tokens - a.tokens || b.bytes - a.bytes)
|
|
59
|
+
.slice(0, limit)
|
|
60
|
+
.map((entry) => ({ ...entry }));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=tool-result-ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-result-ledger.js","sourceRoot":"","sources":["../../src/hono/tool-result-ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-result-ledger.test.d.ts","sourceRoot":"","sources":["../../src/hono/tool-result-ledger.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { ToolResultLedger } from "./tool-result-ledger.js";
|
|
3
|
+
function toolUse(id, name, input, parent = null) {
|
|
4
|
+
return {
|
|
5
|
+
type: "assistant",
|
|
6
|
+
parent_tool_use_id: parent,
|
|
7
|
+
message: { content: [{ type: "tool_use", id, name, input }] },
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function toolResult(id, content, parent = null) {
|
|
11
|
+
return {
|
|
12
|
+
type: "user",
|
|
13
|
+
parent_tool_use_id: parent,
|
|
14
|
+
message: { content: [{ type: "tool_result", tool_use_id: id, content }] },
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
describe("ToolResultLedger", () => {
|
|
18
|
+
it("sums what each tool's results put in the context, a baker call by its family and verb", () => {
|
|
19
|
+
const ledger = new ToolResultLedger();
|
|
20
|
+
ledger.observe(toolUse("a", "Bash", { command: "baker ads google query --limit 5" }));
|
|
21
|
+
ledger.observe(toolResult("a", "x".repeat(4000)));
|
|
22
|
+
ledger.observe(toolUse("b", "Bash", { command: "cd /repo && baker ads google query --all" }));
|
|
23
|
+
ledger.observe(toolResult("b", [{ type: "text", text: "y".repeat(2000) }]));
|
|
24
|
+
ledger.observe(toolUse("c", "Read", { file_path: "/repo/CLAUDE.md" }));
|
|
25
|
+
ledger.observe(toolResult("c", "z".repeat(400)));
|
|
26
|
+
expect(ledger.summary()).toEqual([
|
|
27
|
+
{ tool: "baker ads google", agent: "main", calls: 2, bytes: 6000, tokens: 1500 },
|
|
28
|
+
{ tool: "Read", agent: "main", calls: 1, bytes: 400, tokens: 100 },
|
|
29
|
+
]);
|
|
30
|
+
});
|
|
31
|
+
it("keeps a subagent's results apart from the main agent's, since they land in another context", () => {
|
|
32
|
+
const ledger = new ToolResultLedger();
|
|
33
|
+
ledger.observe(toolUse("s1", "WebFetch", { url: "https://example.com" }, "agent_1"));
|
|
34
|
+
ledger.observe(toolResult("s1", "w".repeat(800), "agent_1"));
|
|
35
|
+
ledger.observe(toolUse("m1", "WebFetch", { url: "https://example.com" }));
|
|
36
|
+
ledger.observe(toolResult("m1", "w".repeat(80)));
|
|
37
|
+
expect(ledger.summary()).toEqual([
|
|
38
|
+
{ tool: "WebFetch", agent: "subagent", calls: 1, bytes: 800, tokens: 200 },
|
|
39
|
+
{ tool: "WebFetch", agent: "main", calls: 1, bytes: 80, tokens: 20 },
|
|
40
|
+
]);
|
|
41
|
+
});
|
|
42
|
+
it("counts a plain shell command as Bash and a result whose call it never saw as unknown", () => {
|
|
43
|
+
const ledger = new ToolResultLedger();
|
|
44
|
+
ledger.observe(toolUse("a", "Bash", { command: "ls -la" }));
|
|
45
|
+
ledger.observe(toolResult("a", "abcd"));
|
|
46
|
+
ledger.observe(toolResult("orphan", "abcdefgh"));
|
|
47
|
+
expect(ledger.summary()).toEqual([
|
|
48
|
+
{ tool: "unknown", agent: "main", calls: 1, bytes: 8, tokens: 2 },
|
|
49
|
+
{ tool: "Bash", agent: "main", calls: 1, bytes: 4, tokens: 1 },
|
|
50
|
+
]);
|
|
51
|
+
});
|
|
52
|
+
it("keeps the largest entries when there are more than the limit", () => {
|
|
53
|
+
const ledger = new ToolResultLedger();
|
|
54
|
+
for (let i = 0; i < 5; i++) {
|
|
55
|
+
ledger.observe(toolUse(`t${i}`, `mcp__tool_${i}`, {}));
|
|
56
|
+
ledger.observe(toolResult(`t${i}`, "q".repeat((i + 1) * 40)));
|
|
57
|
+
}
|
|
58
|
+
expect(ledger.summary(2).map((entry) => entry.tool)).toEqual(["mcp__tool_4", "mcp__tool_3"]);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=tool-result-ledger.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-result-ledger.test.js","sourceRoot":"","sources":["../../src/hono/tool-result-ledger.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the workspace's `CLAUDE.md` reaches the model so every chat shares one
|
|
3
|
+
* prompt cache for it.
|
|
4
|
+
*
|
|
5
|
+
* Loaded the usual way, the CLI puts `CLAUDE.md` in the first user message,
|
|
6
|
+
* after nothing but the tools and ahead of the marketer's own words, with no
|
|
7
|
+
* cache breakpoint at its end. So no chat can read another's copy: each one
|
|
8
|
+
* wrote its ~24k tokens cold, at the 1h-write price, although the scaffold's
|
|
9
|
+
* text is the same for every company on that scaffold version.
|
|
10
|
+
*
|
|
11
|
+
* Instead the shared text goes in the system prompt (`systemPrompt.append`),
|
|
12
|
+
* which ends on a breakpoint, and the one per-company line — the `@COMPANY.md`
|
|
13
|
+
* import — moves to a `CLAUDE.md` of its own in a directory outside the
|
|
14
|
+
* repository, loaded as an additional directory. Measured through the real CLI
|
|
15
|
+
* on Bedrock, a second chat with a different first message read 37,740 tokens
|
|
16
|
+
* and wrote 5,431, where it had written ~45k. Subagents still load COMPANY.md
|
|
17
|
+
* through that file; the scaffold's own instructions stay with the main agent,
|
|
18
|
+
* as the scaffold's subagents already ask (`omitClaudeMd`).
|
|
19
|
+
*/
|
|
20
|
+
export declare const CLIENT_CONTEXT_BLOCK = "## Client Context\n\nOne client per repo. Everything known about them:\n\n@COMPANY.md\n\n";
|
|
21
|
+
/**
|
|
22
|
+
* The scaffold `CLAUDE.md` without its per-company import, or null when the file
|
|
23
|
+
* is not shaped that way — an older scaffold, or one importing anything else,
|
|
24
|
+
* keeps loading as it always did.
|
|
25
|
+
*/
|
|
26
|
+
export declare function splitWorkspaceInstructions(claudeMd: string): {
|
|
27
|
+
shared: string;
|
|
28
|
+
} | null;
|
|
29
|
+
/**
|
|
30
|
+
* Reads the workspace's `CLAUDE.md`, writes the per-company import into
|
|
31
|
+
* `contextDir`, and returns the shared text — or null, in which case nothing
|
|
32
|
+
* changes and the CLI loads `CLAUDE.md` itself.
|
|
33
|
+
*
|
|
34
|
+
* `contextDir` must be the same path in every Runtime: it is named in the
|
|
35
|
+
* system prompt, so a per-sandbox path would split the shared cache again.
|
|
36
|
+
*/
|
|
37
|
+
export declare function prepareSharedInstructions({ projectRoot, contextDir, }: {
|
|
38
|
+
projectRoot: string;
|
|
39
|
+
contextDir: string;
|
|
40
|
+
}): Promise<{
|
|
41
|
+
shared: string;
|
|
42
|
+
} | null>;
|
|
43
|
+
//# sourceMappingURL=workspace-instructions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-instructions.d.ts","sourceRoot":"","sources":["../../src/hono/workspace-instructions.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,oBAAoB,8FAC4D,CAAC;AAK9F;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOtF;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAAC,EAC9C,WAAW,EACX,UAAU,GACX,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAmBrC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* How the workspace's `CLAUDE.md` reaches the model so every chat shares one
|
|
5
|
+
* prompt cache for it.
|
|
6
|
+
*
|
|
7
|
+
* Loaded the usual way, the CLI puts `CLAUDE.md` in the first user message,
|
|
8
|
+
* after nothing but the tools and ahead of the marketer's own words, with no
|
|
9
|
+
* cache breakpoint at its end. So no chat can read another's copy: each one
|
|
10
|
+
* wrote its ~24k tokens cold, at the 1h-write price, although the scaffold's
|
|
11
|
+
* text is the same for every company on that scaffold version.
|
|
12
|
+
*
|
|
13
|
+
* Instead the shared text goes in the system prompt (`systemPrompt.append`),
|
|
14
|
+
* which ends on a breakpoint, and the one per-company line — the `@COMPANY.md`
|
|
15
|
+
* import — moves to a `CLAUDE.md` of its own in a directory outside the
|
|
16
|
+
* repository, loaded as an additional directory. Measured through the real CLI
|
|
17
|
+
* on Bedrock, a second chat with a different first message read 37,740 tokens
|
|
18
|
+
* and wrote 5,431, where it had written ~45k. Subagents still load COMPANY.md
|
|
19
|
+
* through that file; the scaffold's own instructions stay with the main agent,
|
|
20
|
+
* as the scaffold's subagents already ask (`omitClaudeMd`).
|
|
21
|
+
*/
|
|
22
|
+
export const CLIENT_CONTEXT_BLOCK = "## Client Context\n\nOne client per repo. Everything known about them:\n\n@COMPANY.md\n\n";
|
|
23
|
+
/** An `@path` line, which only the CLI's memory loader expands — never a system prompt. */
|
|
24
|
+
const IMPORT_LINE = /^@\S/m;
|
|
25
|
+
/**
|
|
26
|
+
* The scaffold `CLAUDE.md` without its per-company import, or null when the file
|
|
27
|
+
* is not shaped that way — an older scaffold, or one importing anything else,
|
|
28
|
+
* keeps loading as it always did.
|
|
29
|
+
*/
|
|
30
|
+
export function splitWorkspaceInstructions(claudeMd) {
|
|
31
|
+
const at = claudeMd.indexOf(CLIENT_CONTEXT_BLOCK);
|
|
32
|
+
if (at === -1) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const shared = claudeMd.slice(0, at) + claudeMd.slice(at + CLIENT_CONTEXT_BLOCK.length);
|
|
36
|
+
return IMPORT_LINE.test(shared) ? null : { shared };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Reads the workspace's `CLAUDE.md`, writes the per-company import into
|
|
40
|
+
* `contextDir`, and returns the shared text — or null, in which case nothing
|
|
41
|
+
* changes and the CLI loads `CLAUDE.md` itself.
|
|
42
|
+
*
|
|
43
|
+
* `contextDir` must be the same path in every Runtime: it is named in the
|
|
44
|
+
* system prompt, so a per-sandbox path would split the shared cache again.
|
|
45
|
+
*/
|
|
46
|
+
export async function prepareSharedInstructions({ projectRoot, contextDir, }) {
|
|
47
|
+
let claudeMd;
|
|
48
|
+
try {
|
|
49
|
+
claudeMd = await readFile(join(projectRoot, "CLAUDE.md"), "utf8");
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const split = splitWorkspaceInstructions(claudeMd);
|
|
55
|
+
if (!split) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
await mkdir(contextDir, { recursive: true });
|
|
60
|
+
await writeFile(join(contextDir, "CLAUDE.md"), `@${join(projectRoot, "COMPANY.md")}\n`);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Without the import file COMPANY.md would not load at all: fall back.
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
return split;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=workspace-instructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-instructions.js","sourceRoot":"","sources":["../../src/hono/workspace-instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAC/B,2FAA2F,CAAC;AAE9F,2FAA2F;AAC3F,MAAM,WAAW,GAAG,OAAO,CAAC;AAE5B;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAAgB;IACzD,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClD,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACxF,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;AACtD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,EAC9C,WAAW,EACX,UAAU,GAIX;IACC,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1F,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-instructions.test.d.ts","sourceRoot":"","sources":["../../src/hono/workspace-instructions.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { mkdtemp, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { describe, expect, it } from "vitest";
|
|
6
|
+
import { prepareSharedInstructions, splitWorkspaceInstructions } from "./workspace-instructions.js";
|
|
7
|
+
const CLAUDE_MD = [
|
|
8
|
+
"# Project Instructions",
|
|
9
|
+
"",
|
|
10
|
+
"You are the go-to-market brain.",
|
|
11
|
+
"",
|
|
12
|
+
"## Client Context",
|
|
13
|
+
"",
|
|
14
|
+
"One client per repo. Everything known about them:",
|
|
15
|
+
"",
|
|
16
|
+
"@COMPANY.md",
|
|
17
|
+
"",
|
|
18
|
+
"## Talking to the User",
|
|
19
|
+
"",
|
|
20
|
+
"Write in their language.",
|
|
21
|
+
"",
|
|
22
|
+
].join("\n");
|
|
23
|
+
describe("splitWorkspaceInstructions", () => {
|
|
24
|
+
it("keeps everything but the per-company import, so every company shares the same text", () => {
|
|
25
|
+
expect(splitWorkspaceInstructions(CLAUDE_MD)).toEqual({
|
|
26
|
+
shared: [
|
|
27
|
+
"# Project Instructions",
|
|
28
|
+
"",
|
|
29
|
+
"You are the go-to-market brain.",
|
|
30
|
+
"",
|
|
31
|
+
"## Talking to the User",
|
|
32
|
+
"",
|
|
33
|
+
"Write in their language.",
|
|
34
|
+
"",
|
|
35
|
+
].join("\n"),
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
// The scaffold's file is what every client gets. An edit that reworded the
|
|
39
|
+
// block would turn the shared cache off for every company without an error.
|
|
40
|
+
it("splits the scaffold's own CLAUDE.md", async () => {
|
|
41
|
+
const scaffold = join(dirname(fileURLToPath(import.meta.url)), "../../../../apps/scaffold-template/CLAUDE.md");
|
|
42
|
+
expect(splitWorkspaceInstructions(await readFile(scaffold, "utf8"))).not.toBeNull();
|
|
43
|
+
});
|
|
44
|
+
it("declines a file without the client-context import, so an older scaffold loads as it always did", () => {
|
|
45
|
+
expect(splitWorkspaceInstructions("# Project Instructions\n\nNo company import here.\n")).toBeNull();
|
|
46
|
+
});
|
|
47
|
+
// A system prompt is sent verbatim: an `@path` line there is never expanded,
|
|
48
|
+
// so moving it would silently drop the file it names.
|
|
49
|
+
it("declines a file that imports anything else", () => {
|
|
50
|
+
expect(splitWorkspaceInstructions(`${CLAUDE_MD}\n@docs/extra.md\n`)).toBeNull();
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe("prepareSharedInstructions", () => {
|
|
54
|
+
it("writes an instructions file that imports the workspace's COMPANY.md and returns the shared text", async () => {
|
|
55
|
+
const projectRoot = await mkdtemp(join(tmpdir(), "baker-instructions-root-"));
|
|
56
|
+
const contextDir = await mkdtemp(join(tmpdir(), "baker-instructions-context-"));
|
|
57
|
+
await writeFile(join(projectRoot, "CLAUDE.md"), CLAUDE_MD);
|
|
58
|
+
const prepared = await prepareSharedInstructions({ projectRoot, contextDir });
|
|
59
|
+
expect(prepared?.shared).toBe(splitWorkspaceInstructions(CLAUDE_MD)?.shared);
|
|
60
|
+
expect(await readFile(join(contextDir, "CLAUDE.md"), "utf8")).toBe(`@${join(projectRoot, "COMPANY.md")}\n`);
|
|
61
|
+
});
|
|
62
|
+
it("returns null when the workspace has no CLAUDE.md", async () => {
|
|
63
|
+
const projectRoot = await mkdtemp(join(tmpdir(), "baker-instructions-empty-"));
|
|
64
|
+
const contextDir = await mkdtemp(join(tmpdir(), "baker-instructions-context-"));
|
|
65
|
+
expect(await prepareSharedInstructions({ projectRoot, contextDir })).toBeNull();
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=workspace-instructions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-instructions.test.js","sourceRoot":"","sources":["../../src/hono/workspace-instructions.test.ts"],"names":[],"mappings":"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"}
|
package/dist/review/digest.d.ts
CHANGED
|
@@ -90,6 +90,19 @@ export type TranscriptLine = {
|
|
|
90
90
|
};
|
|
91
91
|
/** Parse a `.jsonl` body, dropping lines that are not JSON rather than failing. */
|
|
92
92
|
export declare function parseTranscript(body: string): TranscriptLine[];
|
|
93
|
+
/**
|
|
94
|
+
* What one tool result cost the model, measured on the block it received.
|
|
95
|
+
*
|
|
96
|
+
* Never on the line's `toolUseResult`: that is the CLI's own record of the call
|
|
97
|
+
* and carries what the model never saw — an Edit's whole pre-edit file, a Read
|
|
98
|
+
* image at its original size. Text is counted in bytes (tokens ≈ bytes/4); an
|
|
99
|
+
* image is priced by its pixels, `width × height / 750`, the formula Anthropic
|
|
100
|
+
* documents, because its base64 length says nothing about what it costs.
|
|
101
|
+
*/
|
|
102
|
+
export declare function measureToolResult(content: unknown): {
|
|
103
|
+
bytes: number;
|
|
104
|
+
tokens: number;
|
|
105
|
+
};
|
|
93
106
|
export type ToolCall = {
|
|
94
107
|
turn: number;
|
|
95
108
|
toolUseId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../src/review/digest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAWH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf;;;;;;WAMG;QACH,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;QAClC,KAAK,CAAC,EAAE,eAAe,CAAC;KACzB,CAAC;IACF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,8FAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAc9D;
|
|
1
|
+
{"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../src/review/digest.ts"],"names":[],"mappings":"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"}
|
package/dist/review/digest.js
CHANGED
|
@@ -59,7 +59,7 @@ function textOf(line) {
|
|
|
59
59
|
* image is priced by its pixels, `width × height / 750`, the formula Anthropic
|
|
60
60
|
* documents, because its base64 length says nothing about what it costs.
|
|
61
61
|
*/
|
|
62
|
-
function measureToolResult(content) {
|
|
62
|
+
export function measureToolResult(content) {
|
|
63
63
|
if (content === undefined || content === null) {
|
|
64
64
|
return { bytes: 0, tokens: 0 };
|
|
65
65
|
}
|