@koda-sl/baker-bridge 0.154.0-dev.eb1bb1bf7 → 0.155.0-dev.d0f8a7fd4
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 +1 -13
- package/dist/hono/agent.d.ts.map +1 -1
- package/dist/hono/agent.js +1 -3
- package/dist/hono/agent.js.map +1 -1
- package/dist/hono/agent.test.js +0 -24
- package/dist/hono/agent.test.js.map +1 -1
- package/dist/hono/bridge-job.d.ts +1 -5
- package/dist/hono/bridge-job.d.ts.map +1 -1
- package/dist/hono/bridge-job.js +1 -2
- package/dist/hono/bridge-job.js.map +1 -1
- package/dist/hono/publish-handoff.d.ts +1 -12
- package/dist/hono/publish-handoff.d.ts.map +1 -1
- package/dist/hono/publish-handoff.js +0 -86
- package/dist/hono/publish-handoff.js.map +1 -1
- package/dist/hono/publish-handoff.test.js +1 -76
- package/dist/hono/publish-handoff.test.js.map +1 -1
- package/dist/hono/types.d.ts +0 -26
- package/dist/hono/types.d.ts.map +1 -1
- package/dist/review/digest.d.ts +10 -1
- package/dist/review/digest.d.ts.map +1 -1
- package/dist/review/digest.js +214 -36
- package/dist/review/digest.js.map +1 -1
- package/dist/review/digest.test.js +105 -0
- package/dist/review/digest.test.js.map +1 -1
- package/dist/review/evidence.d.ts.map +1 -1
- package/dist/review/evidence.js +1 -1
- package/dist/review/evidence.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { publishLanguageReminder, publishRunReminder
|
|
2
|
+
import { publishLanguageReminder, publishRunReminder } from "./publish-handoff.js";
|
|
3
3
|
function history(entries) {
|
|
4
4
|
return {
|
|
5
5
|
entries: entries.map((entry, index) => ({ ...entry, createdAt: index })),
|
|
@@ -55,79 +55,4 @@ describe("publishRunReminder", () => {
|
|
|
55
55
|
expect(reminder).toContain("`git status` and `git diff`");
|
|
56
56
|
});
|
|
57
57
|
});
|
|
58
|
-
describe("publishStandingReminder", () => {
|
|
59
|
-
it("tells the turn after a failed publish that nothing is live, and why Baker recorded it failed", () => {
|
|
60
|
-
const reminder = publishStandingReminder({
|
|
61
|
-
publishStanding: {
|
|
62
|
-
status: "publish_failed",
|
|
63
|
-
publishFailureReason: "Verify failed (exit 1). Verify-gate token NOT written.",
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
expect(reminder).toContain("this chat's last publish failed");
|
|
67
|
-
expect(reminder).toContain('"Verify failed (exit 1). Verify-gate token NOT written."');
|
|
68
|
-
expect(reminder).toContain("Nothing from this chat is live");
|
|
69
|
-
});
|
|
70
|
-
it("tells a continued chat that the chat it continues was published after its conversation ended", () => {
|
|
71
|
-
const reminder = publishStandingReminder({
|
|
72
|
-
publishStanding: { status: "in_progress" },
|
|
73
|
-
sourcePublishStanding: {
|
|
74
|
-
status: "completed",
|
|
75
|
-
chatId: "chat_source",
|
|
76
|
-
publishedAt: Date.UTC(2026, 9, 22, 10, 0),
|
|
77
|
-
deployedAt: Date.UTC(2026, 9, 22, 10, 4),
|
|
78
|
-
},
|
|
79
|
-
});
|
|
80
|
-
expect(reminder).toContain("Baker: how the chat this one continues ended.");
|
|
81
|
-
expect(reminder).toContain("It was published at 2026-10-22T10:00:00.000Z, so what it made is live now.");
|
|
82
|
-
expect(reminder).not.toContain("this chat's last publish failed");
|
|
83
|
-
});
|
|
84
|
-
it("does not say a continued chat's source is live while its deploy has not finished", () => {
|
|
85
|
-
const reminder = publishStandingReminder({
|
|
86
|
-
publishStanding: { status: "in_progress" },
|
|
87
|
-
sourcePublishStanding: {
|
|
88
|
-
status: "completed",
|
|
89
|
-
chatId: "chat_source",
|
|
90
|
-
publishedAt: Date.UTC(2026, 9, 22, 10, 0),
|
|
91
|
-
externalChanges: { applying: true, notApplied: 0, failures: [] },
|
|
92
|
-
},
|
|
93
|
-
});
|
|
94
|
-
expect(reminder).not.toContain("live now");
|
|
95
|
-
expect(reminder).toContain("Baker has no record yet that the site update finished");
|
|
96
|
-
expect(reminder).toContain("still being applied");
|
|
97
|
-
expect(reminder).toContain("`baker chats view chat_source`");
|
|
98
|
-
});
|
|
99
|
-
it("names what of a continued chat's source did not go through", () => {
|
|
100
|
-
const reminder = publishStandingReminder({
|
|
101
|
-
publishStanding: { status: "in_progress" },
|
|
102
|
-
sourcePublishStanding: {
|
|
103
|
-
status: "completed",
|
|
104
|
-
chatId: "chat_source",
|
|
105
|
-
publishedAt: Date.UTC(2026, 9, 22, 10, 0),
|
|
106
|
-
deployedAt: Date.UTC(2026, 9, 22, 10, 4),
|
|
107
|
-
externalChanges: {
|
|
108
|
-
applying: false,
|
|
109
|
-
notApplied: 2,
|
|
110
|
-
failures: ["Meta Ads: Create ad 1", "Meta Ads: Create ad 2"],
|
|
111
|
-
},
|
|
112
|
-
},
|
|
113
|
-
});
|
|
114
|
-
expect(reminder).not.toContain("live now");
|
|
115
|
-
expect(reminder).toContain("2 of its changes outside the site did not go through and are not live");
|
|
116
|
-
expect(reminder).toContain('"Meta Ads: Create ad 1"');
|
|
117
|
-
});
|
|
118
|
-
it("does not deny a publish whose failure is only a missing callback", () => {
|
|
119
|
-
const reminder = publishStandingReminder({
|
|
120
|
-
publishStanding: {
|
|
121
|
-
status: "publish_failed",
|
|
122
|
-
publishFailureReason: "Publish ended before Baker received a completion callback from the publish command.",
|
|
123
|
-
outcomeUnknown: true,
|
|
124
|
-
},
|
|
125
|
-
});
|
|
126
|
-
expect(reminder).not.toContain("Nothing from this chat is live");
|
|
127
|
-
expect(reminder).toContain("whether it reached the live site is not known");
|
|
128
|
-
});
|
|
129
|
-
it("says nothing on a turn whose chat has no publish to report", () => {
|
|
130
|
-
expect(publishStandingReminder({ publishStanding: { status: "in_progress" } })).toBeUndefined();
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
58
|
//# sourceMappingURL=publish-handoff.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-handoff.test.js","sourceRoot":"","sources":["../../src/hono/publish-handoff.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"publish-handoff.test.js","sourceRoot":"","sources":["../../src/hono/publish-handoff.test.ts"],"names":[],"mappings":"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"}
|
package/dist/hono/types.d.ts
CHANGED
|
@@ -42,28 +42,6 @@ export interface DispatchHistorySnapshot {
|
|
|
42
42
|
maxTextChars: number;
|
|
43
43
|
renderedContext: string;
|
|
44
44
|
}
|
|
45
|
-
/**
|
|
46
|
-
* Where a chat's publishing stands, as Convex recorded it at dispatch — the
|
|
47
|
-
* authority on whether its work is live. A rebuilt history never carries a
|
|
48
|
-
* publish outcome, and a failed publish leaves its squash commit on the branch.
|
|
49
|
-
*/
|
|
50
|
-
export interface PublishStanding {
|
|
51
|
-
status: string;
|
|
52
|
-
publishedAt?: number;
|
|
53
|
-
publishFailureReason?: string;
|
|
54
|
-
/** The recorded failure is a callback that never came, which can follow a push that landed. */
|
|
55
|
-
outcomeUnknown?: true;
|
|
56
|
-
/** A continuation source's own id, for `baker chats view`. */
|
|
57
|
-
chatId?: string;
|
|
58
|
-
/** When the site's deploy of the source's Publish finished; absent while it has not. */
|
|
59
|
-
deployedAt?: number;
|
|
60
|
-
/** A continuation source's changes outside the site still applying or that did not go through. */
|
|
61
|
-
externalChanges?: {
|
|
62
|
-
applying: boolean;
|
|
63
|
-
notApplied: number;
|
|
64
|
-
failures: string[];
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
45
|
/**
|
|
68
46
|
* The output the user is currently viewing in the dashboard preview pane when
|
|
69
47
|
* they send a turn. A lightweight pointer (no content) — the agent reads the
|
|
@@ -99,10 +77,6 @@ export interface AsyncMessageRequest {
|
|
|
99
77
|
/** The saved credentials the message names as `{{credential:NAME}}`: metadata only, never a value. */
|
|
100
78
|
credentials?: PromptCredential[];
|
|
101
79
|
currentSender?: DispatchSender;
|
|
102
|
-
/** This chat's publishing, sent on every ordinary turn. */
|
|
103
|
-
publishStanding?: PublishStanding;
|
|
104
|
-
/** The publishing of the chat a "Continue" chat continues, sent on the turn its conversation is folded into. */
|
|
105
|
-
sourcePublishStanding?: PublishStanding;
|
|
106
80
|
planMode?: boolean;
|
|
107
81
|
/**
|
|
108
82
|
* Nobody is watching this turn — it was started by a schedule, not a person.
|
package/dist/hono/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hono/types.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,8GAA8G;IAC9G,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,yBAAyB;IACjC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yGAAyG;IACzG,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,yBAAyB,EAAE,CAAC;IAC1C,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,iHAAiH;IACjH,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,6FAA6F;IAC7F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hono/types.ts"],"names":[],"mappings":"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"}
|
package/dist/review/digest.d.ts
CHANGED
|
@@ -318,6 +318,8 @@ export type TranscriptDigest = {
|
|
|
318
318
|
slowest: ToolCall[];
|
|
319
319
|
/** Failures by class and tool: the evidence lens J is built on. */
|
|
320
320
|
failures: FailureAggregate[];
|
|
321
|
+
/** Failed `baker` calls the CLI recorded that no one running Bash call in the transcript ran. */
|
|
322
|
+
unplacedCliFailures: string[];
|
|
321
323
|
/** The same call, run twice, answering differently. Computed, never judged. */
|
|
322
324
|
flaky: FlakyCall[];
|
|
323
325
|
introspectionCalls: ToolCall[];
|
|
@@ -403,7 +405,7 @@ export declare function flagPlumbing(text: string): string[];
|
|
|
403
405
|
* hook file tells you which rule to go and read, "blocked" tells you nothing.
|
|
404
406
|
*/
|
|
405
407
|
export declare function namedGuard(message: string): string | undefined;
|
|
406
|
-
export declare function buildTranscriptDigest(lines: readonly TranscriptLine[]): TranscriptDigest;
|
|
408
|
+
export declare function buildTranscriptDigest(lines: readonly TranscriptLine[], cli?: readonly CliInvocation[]): TranscriptDigest;
|
|
407
409
|
export type DebugLogLine = {
|
|
408
410
|
ts?: string;
|
|
409
411
|
session?: string;
|
|
@@ -424,7 +426,14 @@ export type CliInvocation = {
|
|
|
424
426
|
session: string;
|
|
425
427
|
argv: string[];
|
|
426
428
|
verb?: string;
|
|
429
|
+
/** When it started, by the sandbox clock the transcript is stamped with too. */
|
|
430
|
+
startedAt?: string;
|
|
427
431
|
exitCode?: number;
|
|
432
|
+
/** The `ok: false` envelope it printed, when it printed one. */
|
|
433
|
+
error?: {
|
|
434
|
+
code: string;
|
|
435
|
+
message: string;
|
|
436
|
+
};
|
|
428
437
|
durationMs?: number;
|
|
429
438
|
httpCalls: {
|
|
430
439
|
method: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../src/review/digest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
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
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import { createHash } from "node:crypto";
|
|
19
19
|
import { imageSize } from "image-size";
|
|
20
|
+
import { parse } from "unbash";
|
|
20
21
|
import { languageMismatch, marketerWords, messageLanguage } from "./reply-language.js";
|
|
21
22
|
/** Parse a `.jsonl` body, dropping lines that are not JSON rather than failing. */
|
|
22
23
|
export function parseTranscript(body) {
|
|
@@ -465,15 +466,21 @@ export function namedGuard(message) {
|
|
|
465
466
|
}
|
|
466
467
|
return undefined;
|
|
467
468
|
}
|
|
468
|
-
/**
|
|
469
|
-
|
|
469
|
+
/**
|
|
470
|
+
* Ledger a failure: its class, the guard row, and the turn's denial count when a
|
|
471
|
+
* guard refused it. A call can fail more than once — each `baker` call one
|
|
472
|
+
* command line ran — and its own class and message are its first failure's.
|
|
473
|
+
*/
|
|
474
|
+
function absorbFailure(acc, call, message, failureClass = classifyFailure(message)) {
|
|
470
475
|
const turn = acc.turns[call.turn];
|
|
471
|
-
|
|
472
|
-
call.failureClass
|
|
473
|
-
if (turn &&
|
|
476
|
+
call.isError = true;
|
|
477
|
+
call.failureClass ??= failureClass;
|
|
478
|
+
if (turn && failureClass === "refused") {
|
|
474
479
|
turn.denials += 1;
|
|
475
480
|
}
|
|
476
|
-
acc.failureMessages.
|
|
481
|
+
if (!acc.failureMessages.has(call.toolUseId)) {
|
|
482
|
+
acc.failureMessages.set(call.toolUseId, clip(message, 400));
|
|
483
|
+
}
|
|
477
484
|
const guard = namedGuard(message);
|
|
478
485
|
// A subagent's words, never the turn's: the turn's are its parent's.
|
|
479
486
|
const intent = call.isSidechain
|
|
@@ -487,7 +494,7 @@ function absorbFailure(acc, call, block) {
|
|
|
487
494
|
attempted: call.summary,
|
|
488
495
|
inputKey: call.inputKey,
|
|
489
496
|
message: clip(message, 400),
|
|
490
|
-
refusal:
|
|
497
|
+
refusal: failureClass === "refused",
|
|
491
498
|
...(guard === undefined ? {} : { guard }),
|
|
492
499
|
...(intent ? { intent: clip(intent, 300) } : {}),
|
|
493
500
|
...(call.isSidechain && call.agentId !== undefined ? { agentId: call.agentId } : {}),
|
|
@@ -508,12 +515,11 @@ function absorbToolResults(acc, line) {
|
|
|
508
515
|
const seen = measureToolResult(block.content);
|
|
509
516
|
call.resultBytes = seen.bytes;
|
|
510
517
|
call.resultTokens = seen.tokens;
|
|
511
|
-
call.isError = block.is_error === true;
|
|
512
518
|
if (line.timestamp !== undefined) {
|
|
513
519
|
acc.answeredAt.set(call.toolUseId, line.timestamp);
|
|
514
520
|
}
|
|
515
|
-
if (
|
|
516
|
-
absorbFailure(acc, call, block);
|
|
521
|
+
if (block.is_error === true) {
|
|
522
|
+
absorbFailure(acc, call, typeof block.content === "string" ? block.content : String(block.content ?? ""));
|
|
517
523
|
}
|
|
518
524
|
}
|
|
519
525
|
}
|
|
@@ -646,6 +652,12 @@ function userFacingMessage(turn, text, marketerLanguage) {
|
|
|
646
652
|
...(mismatch === undefined ? {} : { languageMismatch: mismatch }),
|
|
647
653
|
};
|
|
648
654
|
}
|
|
655
|
+
/** A Bash call's whole command, which placing a failed `baker` call on it reads. */
|
|
656
|
+
function rememberCommand(acc, call, use) {
|
|
657
|
+
if (call.tool === "Bash" && typeof use.input?.command === "string") {
|
|
658
|
+
acc.commands.set(call.toolUseId, use.input.command);
|
|
659
|
+
}
|
|
660
|
+
}
|
|
649
661
|
/** Ledger each tool call a response asked for, under the response it came in. */
|
|
650
662
|
function absorbToolUses(acc, line, turnAt, isSidechain) {
|
|
651
663
|
const uses = blocks(line).filter((block) => block.type === "tool_use");
|
|
@@ -662,6 +674,7 @@ function absorbToolUses(acc, line, turnAt, isSidechain) {
|
|
|
662
674
|
});
|
|
663
675
|
acc.toolCalls.push(call);
|
|
664
676
|
acc.pending.set(call.toolUseId, call);
|
|
677
|
+
rememberCommand(acc, call, use);
|
|
665
678
|
if (requestId !== undefined) {
|
|
666
679
|
acc.batches.set(requestId, [...(acc.batches.get(requestId) ?? []), call]);
|
|
667
680
|
}
|
|
@@ -736,6 +749,122 @@ function timeCalls(acc) {
|
|
|
736
749
|
call.durationMs = took;
|
|
737
750
|
}
|
|
738
751
|
}
|
|
752
|
+
return startOf;
|
|
753
|
+
}
|
|
754
|
+
/** Whether the CLI says an invocation failed: a non-zero exit, or an `ok: false` envelope it printed. */
|
|
755
|
+
function cliFailed(invocation) {
|
|
756
|
+
return (invocation.exitCode !== undefined && invocation.exitCode !== 0) || invocation.error !== undefined;
|
|
757
|
+
}
|
|
758
|
+
/**
|
|
759
|
+
* What the CLI said about a failed invocation, and nothing the agent typed: the
|
|
760
|
+
* class is read from this, so `--title "Fix checkout timeout"` is not a timeout.
|
|
761
|
+
*/
|
|
762
|
+
function cliErrorOf(invocation) {
|
|
763
|
+
const exit = invocation.exitCode === undefined ? "failed" : `exited ${invocation.exitCode}`;
|
|
764
|
+
return invocation.error === undefined ? exit : `${invocation.error.code}: ${invocation.error.message} — ${exit}`;
|
|
765
|
+
}
|
|
766
|
+
/** The error first, so clipping a long command never takes the code with it. */
|
|
767
|
+
function describeCliFailure(invocation) {
|
|
768
|
+
return invocation.error === undefined
|
|
769
|
+
? `\`baker ${invocation.argv.join(" ")}\` ${cliErrorOf(invocation)}`
|
|
770
|
+
: `${cliErrorOf(invocation)} — \`baker ${invocation.argv.join(" ")}\``;
|
|
771
|
+
}
|
|
772
|
+
/**
|
|
773
|
+
* The arguments of every `baker` command a shell command line runs, read the way
|
|
774
|
+
* the shell reads it: dequoted, inside pipes, lists, loops and substitutions,
|
|
775
|
+
* never inside a heredoc body or a quoted string.
|
|
776
|
+
*/
|
|
777
|
+
function bakerArgvsOf(command) {
|
|
778
|
+
const script = parse(command);
|
|
779
|
+
if (script.errors && script.errors.length > 0) {
|
|
780
|
+
return [];
|
|
781
|
+
}
|
|
782
|
+
const argvs = [];
|
|
783
|
+
// Serialised because unbash materialises a word's parts only in `toJSON`.
|
|
784
|
+
JSON.stringify(script, (_key, value) => {
|
|
785
|
+
const node = value;
|
|
786
|
+
if (node?.type === "Command" && typeof node.name?.value === "string" && /(?:^|\/)baker$/.test(node.name.value)) {
|
|
787
|
+
argvs.push((node.suffix ?? []).map((word) => String(word.value ?? "")));
|
|
788
|
+
}
|
|
789
|
+
return value;
|
|
790
|
+
});
|
|
791
|
+
return argvs;
|
|
792
|
+
}
|
|
793
|
+
/** A word the shell expands before `baker` sees it, and so matches whatever argument it became. */
|
|
794
|
+
const EXPANDED_WORD = /[$*?[`]/;
|
|
795
|
+
/** Whether a command's own `baker` words are the ones an invocation received. */
|
|
796
|
+
function ranInvocation(words, argv) {
|
|
797
|
+
return words.length === argv.length && words.every((word, index) => word === argv[index] || EXPANDED_WORD.test(word));
|
|
798
|
+
}
|
|
799
|
+
/**
|
|
800
|
+
* The Bash call a `baker` invocation ran inside: the one running when it
|
|
801
|
+
* started whose command runs exactly that `baker` call.
|
|
802
|
+
*
|
|
803
|
+
* Nothing else places it. Subagents run side by side, so two running calls can
|
|
804
|
+
* share a platform (`baker ads meta campaigns`, `baker ads meta ads pause`), and
|
|
805
|
+
* a watcher or a hook calls `baker` while an unrelated command runs; a failure
|
|
806
|
+
* pinned on whichever call was running reports a success as failed and the
|
|
807
|
+
* failed call as a success. When no running call ran it, or more than one did,
|
|
808
|
+
* it is left unplaced.
|
|
809
|
+
*/
|
|
810
|
+
function callRunning(invocation, acc, startOf, argvsOf) {
|
|
811
|
+
const at = stampOf(invocation.startedAt);
|
|
812
|
+
if (at === undefined) {
|
|
813
|
+
return undefined;
|
|
814
|
+
}
|
|
815
|
+
const ran = acc.toolCalls.filter((call) => {
|
|
816
|
+
const from = stampOf(startOf.get(call.toolUseId));
|
|
817
|
+
const to = stampOf(acc.answeredAt.get(call.toolUseId));
|
|
818
|
+
return (call.tool === "Bash" &&
|
|
819
|
+
from !== undefined &&
|
|
820
|
+
to !== undefined &&
|
|
821
|
+
from <= at &&
|
|
822
|
+
at <= to &&
|
|
823
|
+
argvsOf(call).some((words) => ranInvocation(words, invocation.argv)));
|
|
824
|
+
});
|
|
825
|
+
return ran.length === 1 ? ran[0] : undefined;
|
|
826
|
+
}
|
|
827
|
+
/**
|
|
828
|
+
* Count a `baker` call that failed as a failure, whatever its shell returned.
|
|
829
|
+
*
|
|
830
|
+
* A Bash result is an error only when the whole command line exited non-zero,
|
|
831
|
+
* and `| head`, `> file` or a later `; echo` make that zero. Read from the tool
|
|
832
|
+
* result alone, a Session whose every refused or timed-out `baker` call was
|
|
833
|
+
* piped reported "none of them failed" — while the CLI's own record said why
|
|
834
|
+
* each one did. A failure no call can be placed on is returned, never dropped.
|
|
835
|
+
*/
|
|
836
|
+
function absorbCliFailures(acc, cli, startOf) {
|
|
837
|
+
const unplaced = [];
|
|
838
|
+
const failedIn = new Map();
|
|
839
|
+
const argvs = new Map();
|
|
840
|
+
const argvsOf = (call) => {
|
|
841
|
+
const known = argvs.get(call.toolUseId) ?? bakerArgvsOf(acc.commands.get(call.toolUseId) ?? "");
|
|
842
|
+
argvs.set(call.toolUseId, known);
|
|
843
|
+
return known;
|
|
844
|
+
};
|
|
845
|
+
for (const invocation of cli.filter(cliFailed)) {
|
|
846
|
+
const call = callRunning(invocation, acc, startOf, argvsOf);
|
|
847
|
+
if (call === undefined) {
|
|
848
|
+
unplaced.push(invocation);
|
|
849
|
+
}
|
|
850
|
+
else if (!call.isError) {
|
|
851
|
+
failedIn.set(call, [...(failedIn.get(call) ?? []), invocation]);
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
for (const [call, invocations] of failedIn) {
|
|
855
|
+
const failures = invocations.map((invocation) => ({
|
|
856
|
+
failureClass: classifyFailure(cliErrorOf(invocation)),
|
|
857
|
+
message: clip(describeCliFailure(invocation), 400),
|
|
858
|
+
durationMs: invocation.durationMs ?? 0,
|
|
859
|
+
}));
|
|
860
|
+
for (const failure of failures) {
|
|
861
|
+
absorbFailure(acc, call, failure.message, failure.failureClass);
|
|
862
|
+
}
|
|
863
|
+
acc.cliFailures.set(call.toolUseId, failures);
|
|
864
|
+
}
|
|
865
|
+
const order = new Map(acc.toolCalls.map((call, index) => [call.toolUseId, index]));
|
|
866
|
+
acc.guards.sort((a, b) => (order.get(a.toolUseId) ?? 0) - (order.get(b.toolUseId) ?? 0));
|
|
867
|
+
return unplaced;
|
|
739
868
|
}
|
|
740
869
|
/** The latest of some ISO timestamps, or nothing when none is given. */
|
|
741
870
|
function latest(stamps) {
|
|
@@ -792,7 +921,7 @@ function countGuardRepeats(guards) {
|
|
|
792
921
|
guard.repeats = counts.get(key) ?? 1;
|
|
793
922
|
}
|
|
794
923
|
}
|
|
795
|
-
export function buildTranscriptDigest(lines) {
|
|
924
|
+
export function buildTranscriptDigest(lines, cli = []) {
|
|
796
925
|
const acc = {
|
|
797
926
|
turns: [],
|
|
798
927
|
toolCalls: [],
|
|
@@ -810,6 +939,8 @@ export function buildTranscriptDigest(lines) {
|
|
|
810
939
|
answeredAt: new Map(),
|
|
811
940
|
subagentTurns: new Map(),
|
|
812
941
|
subagentWords: new Map(),
|
|
942
|
+
commands: new Map(),
|
|
943
|
+
cliFailures: new Map(),
|
|
813
944
|
};
|
|
814
945
|
for (const line of lines) {
|
|
815
946
|
const openTurns = acc.turns.length;
|
|
@@ -841,7 +972,8 @@ export function buildTranscriptDigest(lines) {
|
|
|
841
972
|
call.failureClass = "timeout";
|
|
842
973
|
acc.failureMessages.set(call.toolUseId, "No result was ever recorded for this call.");
|
|
843
974
|
}
|
|
844
|
-
timeCalls(acc);
|
|
975
|
+
const startOf = timeCalls(acc);
|
|
976
|
+
const unplacedCliFailures = absorbCliFailures(acc, cli, startOf);
|
|
845
977
|
attributeGuardFollowUps(acc.guards, acc.toolCalls);
|
|
846
978
|
countGuardRepeats(acc.guards);
|
|
847
979
|
const threadStamps = stampsByThread(lines);
|
|
@@ -860,7 +992,8 @@ export function buildTranscriptDigest(lines) {
|
|
|
860
992
|
.filter((call) => call.durationMs !== undefined)
|
|
861
993
|
.sort((a, b) => (b.durationMs ?? 0) - (a.durationMs ?? 0))
|
|
862
994
|
.slice(0, 15),
|
|
863
|
-
failures: aggregateFailures(acc.toolCalls, acc.failureMessages),
|
|
995
|
+
failures: aggregateFailures(acc.toolCalls, acc.failureMessages, acc.cliFailures),
|
|
996
|
+
unplacedCliFailures: unplacedCliFailures.map(describeCliFailure),
|
|
864
997
|
flaky: findFlakyCalls(acc.toolCalls),
|
|
865
998
|
introspectionCalls: acc.toolCalls.filter((call) => call.bakerVerb?.startsWith("baker schema") || /--help\b/.test(call.summary)),
|
|
866
999
|
hooks: [...acc.hooks.values()].sort((a, b) => b.fired - a.fired),
|
|
@@ -880,30 +1013,37 @@ export function buildTranscriptDigest(lines) {
|
|
|
880
1013
|
* a bad moment, eleven of them at the same bound is a default set for a network
|
|
881
1014
|
* this sandbox does not have.
|
|
882
1015
|
*/
|
|
883
|
-
function
|
|
1016
|
+
function ownFailure(call, failureClass, messages) {
|
|
1017
|
+
return { failureClass, message: messages.get(call.toolUseId) ?? "", durationMs: call.durationMs ?? 0 };
|
|
1018
|
+
}
|
|
1019
|
+
function aggregateFailures(calls, messages, cliFailures) {
|
|
884
1020
|
const map = new Map();
|
|
885
1021
|
for (const call of calls) {
|
|
886
1022
|
if (!call.isError || call.failureClass === undefined) {
|
|
887
1023
|
continue;
|
|
888
1024
|
}
|
|
889
|
-
|
|
890
|
-
const
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
entry.
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
1025
|
+
// A command line that ran several failed `baker` calls counts each of them.
|
|
1026
|
+
const failures = cliFailures.get(call.toolUseId) ?? [ownFailure(call, call.failureClass, messages)];
|
|
1027
|
+
for (const failure of failures) {
|
|
1028
|
+
const key = `${failure.failureClass}::${call.tool}`;
|
|
1029
|
+
const entry = map.get(key) ?? {
|
|
1030
|
+
failureClass: failure.failureClass,
|
|
1031
|
+
tool: call.tool,
|
|
1032
|
+
calls: 0,
|
|
1033
|
+
totalMs: 0,
|
|
1034
|
+
example: failure.message,
|
|
1035
|
+
turns: [],
|
|
1036
|
+
};
|
|
1037
|
+
entry.calls += 1;
|
|
1038
|
+
entry.totalMs += failure.durationMs;
|
|
1039
|
+
if (entry.example.length === 0) {
|
|
1040
|
+
entry.example = failure.message;
|
|
1041
|
+
}
|
|
1042
|
+
if (!entry.turns.includes(call.turn)) {
|
|
1043
|
+
entry.turns.push(call.turn);
|
|
1044
|
+
}
|
|
1045
|
+
map.set(key, entry);
|
|
905
1046
|
}
|
|
906
|
-
map.set(key, entry);
|
|
907
1047
|
}
|
|
908
1048
|
return [...map.values()].sort((a, b) => b.calls - a.calls);
|
|
909
1049
|
}
|
|
@@ -1117,6 +1257,9 @@ function absorbInvocation(entry, line) {
|
|
|
1117
1257
|
return;
|
|
1118
1258
|
}
|
|
1119
1259
|
entry.argv = line.argv;
|
|
1260
|
+
if (line.ts !== undefined) {
|
|
1261
|
+
entry.startedAt = line.ts;
|
|
1262
|
+
}
|
|
1120
1263
|
const verb = bakerVerbOf(`baker ${line.argv.join(" ")}`);
|
|
1121
1264
|
if (verb) {
|
|
1122
1265
|
entry.verb = verb;
|
|
@@ -1141,14 +1284,38 @@ function absorbExit(entry, line) {
|
|
|
1141
1284
|
entry.durationMs = line.durationMs;
|
|
1142
1285
|
}
|
|
1143
1286
|
}
|
|
1287
|
+
/** What it printed, and the error it reported when the text is an `ok: false` envelope. */
|
|
1288
|
+
function absorbOutput(entry, line) {
|
|
1289
|
+
if (typeof line.text !== "string") {
|
|
1290
|
+
return;
|
|
1291
|
+
}
|
|
1292
|
+
entry.printedBytes += Buffer.byteLength(line.text);
|
|
1293
|
+
const error = printedError(line.text);
|
|
1294
|
+
if (error !== undefined && entry.error === undefined) {
|
|
1295
|
+
entry.error = error;
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
function printedError(text) {
|
|
1299
|
+
let parsed;
|
|
1300
|
+
try {
|
|
1301
|
+
parsed = JSON.parse(text);
|
|
1302
|
+
}
|
|
1303
|
+
catch {
|
|
1304
|
+
return undefined;
|
|
1305
|
+
}
|
|
1306
|
+
if (typeof parsed !== "object" || parsed === null || parsed.ok !== false) {
|
|
1307
|
+
return undefined;
|
|
1308
|
+
}
|
|
1309
|
+
const error = parsed.error;
|
|
1310
|
+
return {
|
|
1311
|
+
code: typeof error?.code === "string" ? error.code : "ERROR",
|
|
1312
|
+
message: typeof error?.message === "string" ? error.message : "",
|
|
1313
|
+
};
|
|
1314
|
+
}
|
|
1144
1315
|
const DEBUG_LINE_HANDLERS = {
|
|
1145
1316
|
invocation: absorbInvocation,
|
|
1146
1317
|
http: absorbHttpCall,
|
|
1147
|
-
output:
|
|
1148
|
-
if (typeof line.text === "string") {
|
|
1149
|
-
entry.printedBytes += Buffer.byteLength(line.text);
|
|
1150
|
-
}
|
|
1151
|
-
},
|
|
1318
|
+
output: absorbOutput,
|
|
1152
1319
|
exit: absorbExit,
|
|
1153
1320
|
};
|
|
1154
1321
|
/**
|
|
@@ -1397,6 +1564,17 @@ export function renderFailures(digest) {
|
|
|
1397
1564
|
clip(entry.example, 160),
|
|
1398
1565
|
])),
|
|
1399
1566
|
"",
|
|
1567
|
+
...(digest.unplacedCliFailures.length === 0
|
|
1568
|
+
? []
|
|
1569
|
+
: [
|
|
1570
|
+
"## Failed `baker` calls no tool call can be placed on",
|
|
1571
|
+
"",
|
|
1572
|
+
"The CLI recorded these as failed, and when each started no loaded transcript",
|
|
1573
|
+
"had exactly one running Bash call whose command ran that `baker` call.",
|
|
1574
|
+
"",
|
|
1575
|
+
...digest.unplacedCliFailures.map((failure) => `- ${clip(failure, 300)}`),
|
|
1576
|
+
"",
|
|
1577
|
+
]),
|
|
1400
1578
|
"## The same call, two answers",
|
|
1401
1579
|
"",
|
|
1402
1580
|
"Identical tool and input, one attempt failing and another succeeding, with",
|