@relayflows/sdk 2.0.21 → 2.0.22

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 (97) hide show
  1. package/dist/agent-transcript.d.ts +186 -0
  2. package/dist/agent-transcript.d.ts.map +1 -0
  3. package/dist/agent-transcript.js +585 -0
  4. package/dist/agent-transcript.js.map +1 -0
  5. package/dist/cli/run.js +2 -1
  6. package/dist/cli/run.js.map +1 -1
  7. package/dist/cli/status.d.ts +34 -0
  8. package/dist/cli/status.d.ts.map +1 -0
  9. package/dist/cli/status.js +307 -0
  10. package/dist/cli/status.js.map +1 -0
  11. package/dist/cli/step-failure.js +31 -7
  12. package/dist/cli/step-failure.js.map +1 -1
  13. package/dist/cli-commands.d.ts +13 -0
  14. package/dist/cli-commands.d.ts.map +1 -1
  15. package/dist/cli-commands.js +11 -0
  16. package/dist/cli-commands.js.map +1 -1
  17. package/dist/cli.d.ts +2 -1
  18. package/dist/cli.d.ts.map +1 -1
  19. package/dist/cli.js +9 -0
  20. package/dist/cli.js.map +1 -1
  21. package/dist/failure-kinds.d.ts +15 -2
  22. package/dist/failure-kinds.d.ts.map +1 -1
  23. package/dist/failure-kinds.js +8 -0
  24. package/dist/failure-kinds.js.map +1 -1
  25. package/dist/journal-reader.d.ts +1 -1
  26. package/dist/journal-reader.d.ts.map +1 -1
  27. package/dist/journal-reader.js +3 -1
  28. package/dist/journal-reader.js.map +1 -1
  29. package/dist/llm-worker.d.ts.map +1 -1
  30. package/dist/llm-worker.js +12 -1
  31. package/dist/llm-worker.js.map +1 -1
  32. package/dist/permissions-preflight.d.ts +22 -0
  33. package/dist/permissions-preflight.d.ts.map +1 -0
  34. package/dist/permissions-preflight.js +49 -0
  35. package/dist/permissions-preflight.js.map +1 -0
  36. package/dist/preflight.d.ts.map +1 -1
  37. package/dist/preflight.js +6 -0
  38. package/dist/preflight.js.map +1 -1
  39. package/dist/pty-sidechannel.d.ts +7 -0
  40. package/dist/pty-sidechannel.d.ts.map +1 -1
  41. package/dist/pty-sidechannel.js.map +1 -1
  42. package/dist/redact.d.ts +16 -0
  43. package/dist/redact.d.ts.map +1 -0
  44. package/dist/redact.js +104 -0
  45. package/dist/redact.js.map +1 -0
  46. package/dist/run-state.d.ts +124 -0
  47. package/dist/run-state.d.ts.map +1 -0
  48. package/dist/run-state.js +368 -0
  49. package/dist/run-state.js.map +1 -0
  50. package/dist/spec.d.ts +16 -1
  51. package/dist/spec.d.ts.map +1 -1
  52. package/dist/spec.js.map +1 -1
  53. package/dist/step-env.d.ts +25 -0
  54. package/dist/step-env.d.ts.map +1 -0
  55. package/dist/step-env.js +34 -0
  56. package/dist/step-env.js.map +1 -0
  57. package/dist/transcript-tail.d.ts +54 -0
  58. package/dist/transcript-tail.d.ts.map +1 -0
  59. package/dist/transcript-tail.js +176 -0
  60. package/dist/transcript-tail.js.map +1 -0
  61. package/dist/worker-cli.d.ts +10 -0
  62. package/dist/worker-cli.d.ts.map +1 -1
  63. package/dist/worker-cli.js +158 -16
  64. package/dist/worker-cli.js.map +1 -1
  65. package/dist/worker-usage.d.ts +7 -2
  66. package/dist/worker-usage.d.ts.map +1 -1
  67. package/dist/worker-usage.js +21 -3
  68. package/dist/worker-usage.js.map +1 -1
  69. package/dist/worker.d.ts.map +1 -1
  70. package/dist/worker.js +31 -6
  71. package/dist/worker.js.map +1 -1
  72. package/dist/wrapper-runtime.d.ts +7 -1
  73. package/dist/wrapper-runtime.d.ts.map +1 -1
  74. package/dist/wrapper-runtime.js +7 -1
  75. package/dist/wrapper-runtime.js.map +1 -1
  76. package/package.json +2 -2
  77. package/src/agent-transcript.ts +651 -0
  78. package/src/cli/run.ts +2 -1
  79. package/src/cli/status.ts +329 -0
  80. package/src/cli/step-failure.ts +32 -7
  81. package/src/cli-commands.ts +11 -0
  82. package/src/cli.ts +8 -0
  83. package/src/failure-kinds.ts +15 -1
  84. package/src/journal-reader.ts +4 -2
  85. package/src/llm-worker.ts +12 -1
  86. package/src/permissions-preflight.ts +53 -0
  87. package/src/preflight.ts +6 -0
  88. package/src/pty-sidechannel.ts +7 -0
  89. package/src/redact.ts +106 -0
  90. package/src/run-state.ts +468 -0
  91. package/src/spec.ts +16 -1
  92. package/src/step-env.ts +47 -0
  93. package/src/transcript-tail.ts +193 -0
  94. package/src/worker-cli.ts +157 -17
  95. package/src/worker-usage.ts +26 -3
  96. package/src/worker.ts +32 -6
  97. package/src/wrapper-runtime.ts +7 -1
@@ -0,0 +1,585 @@
1
+ import { constants as fsConstants } from 'node:fs';
2
+ import { createHash } from 'node:crypto';
3
+ import { mkdir, open, unlink } from 'node:fs/promises';
4
+ import { dirname, join } from 'node:path';
5
+ import { ptySocketPath } from './pty-sidechannel.js';
6
+ /**
7
+ * Per-attempt agent transcript: the redacted, capped `stream-json` file the
8
+ * worker writes beside the PTY socket, and the ≤ 8 KiB digest of it that rides
9
+ * in `trajectory_tail` on every completion.
10
+ *
11
+ * Every bound below is enforced here and stated in what it produces — a
12
+ * marker line at a seam, a suffix on a cut string, a boolean on the digest —
13
+ * so a reader is told what was dropped rather than left to guess.
14
+ */
15
+ /** Cap on one attempt's transcript file: the first 128 KiB whole, then a rolling tail. */
16
+ export const TRANSCRIPT_FILE_MAX_BYTES = 1024 * 1024;
17
+ export const TRANSCRIPT_HEAD_BYTES = 128 * 1024;
18
+ export const TRANSCRIPT_TAIL_BYTES = TRANSCRIPT_FILE_MAX_BYTES - TRANSCRIPT_HEAD_BYTES;
19
+ /** Cap on any one string leaf inside a frame (tool results, thinking, text). */
20
+ export const TRANSCRIPT_STRING_MAX_BYTES = 64 * 1024;
21
+ /**
22
+ * Cap on the serialized digest. Half the kernel's 16 KiB `trajectory_tail`
23
+ * boundary (relayflowd/src/server.rs), leaving room for the `relay_task`
24
+ * sibling the worker already journals.
25
+ */
26
+ export const TRANSCRIPT_DIGEST_MAX_BYTES = 8 * 1024;
27
+ /** Cap on an llm step's `trajectory_tail.error`; over 16 KiB the kernel refuses the completion. */
28
+ export const LLM_ERROR_MAX_BYTES = 4 * 1024;
29
+ export const FINAL_TEXT_MAX_BYTES = 2 * 1024;
30
+ export const FAILURE_EXCERPT_MAX_BYTES = 1024;
31
+ export const TOOL_INPUT_EXCERPT_MAX_CHARS = 120;
32
+ /**
33
+ * Cap on any single provider-supplied identifier copied into `result`
34
+ * (`model`, `session_id`, `stop_reason`, `subtype`, `claude_code_version`) and
35
+ * on a tool name. These are attacker-influenceable strings that no reduction
36
+ * step in `boundTranscriptDigest` trims, so they are bounded where they enter.
37
+ */
38
+ export const DIGEST_LABEL_MAX_BYTES = 256;
39
+ /**
40
+ * Bytes reserved inside `TRANSCRIPT_FILE_MAX_BYTES` for the
41
+ * `relayflow.truncated` marker, so a full head plus a full tail plus the
42
+ * marker still fits the stated per-attempt cap. The marker serializes to
43
+ * well under this even with 20-digit counters.
44
+ */
45
+ export const TRUNCATION_MARKER_RESERVE = 256;
46
+ export const TOOL_COUNTS_MAX = 32;
47
+ export const TOOL_LAST_CALLS_MAX = 20;
48
+ export const ARTIFACT_PATHS_MAX = 50;
49
+ /** The `system/init` keys kept; everything else on that frame is local paths and inventory. */
50
+ const INIT_KEEP = ['type', 'subtype', 'model', 'claude_code_version', 'permissionMode', 'session_id'];
51
+ const record = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
52
+ /** `…/runs/<runId>/steps/<stepId>/attempt-<n>.transcript.jsonl`, beside the PTY socket. */
53
+ export function transcriptPath(context, attempt) {
54
+ if (!Number.isSafeInteger(attempt) || attempt < 1)
55
+ throw new Error('Invalid transcript attempt');
56
+ return join(dirname(ptySocketPath(context)), `attempt-${attempt}.transcript.jsonl`);
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Redaction
60
+ // ---------------------------------------------------------------------------
61
+ const SECRET_NAME = /(TOKEN|SECRET|KEY|PASSWORD|PASSWD|CREDENTIAL|AUTH|COOKIE|SESSION|PRIVATE)/i;
62
+ /**
63
+ * Relay-issued token prefixes, shared with `redactRelayError` (worker-cli.ts).
64
+ * The tail must be at least 8 characters so journal keys such as `at_ms` are
65
+ * not mistaken for tokens.
66
+ */
67
+ export const RELAY_TOKEN_PATTERN = /\b(?:at|rk|nt|ot|br|arr)_(?:live_)?[A-Za-z0-9_-]{8,}/g;
68
+ const TOKEN_PATTERNS = [
69
+ RELAY_TOKEN_PATTERN,
70
+ /\bsk-ant-[A-Za-z0-9_-]{8,}/g,
71
+ /\b(?:ghp|gho|ghs|ghu|ghr)_[A-Za-z0-9]{16,}/g,
72
+ /\bgithub_pat_[A-Za-z0-9_]{16,}/g,
73
+ /\bxox[abps]-[A-Za-z0-9-]{8,}/g,
74
+ /\bAKIA[0-9A-Z]{16}\b/g,
75
+ ];
76
+ const PEM_BLOCK = /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g;
77
+ // Header forms, in prose or inside a JSON-encoded object: the header name and
78
+ // any `Bearer`/`Basic` scheme stay, the value goes. Cookies are redacted to the
79
+ // end of the line, since every pair in them is a credential.
80
+ const HEADER_VALUE = /\b(authorization|x-api-key|x-callback-token)("?\s*[:=]\s*"?)((?:Bearer|Basic)\s+)?(?!\[redacted)([^\s"',;\\]+)/gi;
81
+ const COOKIE_VALUE = /\b(cookie|set-cookie)("?\s*[:=]\s*"?)(?!\[redacted)([^\n"\\]+)/gi;
82
+ const BEARER = /\bBearer\s+(?!\[redacted)[A-Za-z0-9._~+/=-]{8,}/g;
83
+ const ENV_LINE = /^([A-Za-z_][A-Za-z0-9_]*)=(.+)$/gm;
84
+ /**
85
+ * One redactor for one environment: the values of secret-named variables are
86
+ * resolved once, so a writer redacting thousands of strings does not rescan
87
+ * `process.env` for each.
88
+ */
89
+ export function createRedactor(env = process.env) {
90
+ const byName = [];
91
+ for (const [name, value] of Object.entries(env)) {
92
+ if (typeof value === 'string' && value.length >= 8 && SECRET_NAME.test(name))
93
+ byName.push([name, value]);
94
+ }
95
+ // Longest first, so a value that is a prefix of another cannot leave the
96
+ // longer one half-redacted.
97
+ byName.sort((a, b) => b[1].length - a[1].length);
98
+ return (text) => {
99
+ if (text.length === 0)
100
+ return text;
101
+ // Rule 3 — env dumps by shape: `NAME=VALUE` where VALUE is that variable's
102
+ // value, whatever the name. Catches `env`/`printenv` output of variables
103
+ // whose names look harmless.
104
+ let out = text.replace(ENV_LINE, (line, name, value) => env[name] === value ? `${name}=[redacted:${name}]` : line);
105
+ // Rule 2 — secret-named variables' values, wherever they appear.
106
+ for (const [name, value] of byName)
107
+ out = out.replaceAll(value, `[redacted:${name}]`);
108
+ // Rule 4 — well-known token shapes and header forms; the header name stays.
109
+ out = out.replace(PEM_BLOCK, '[redacted:private-key]');
110
+ for (const pattern of TOKEN_PATTERNS)
111
+ out = out.replace(pattern, '[redacted]');
112
+ out = out.replace(HEADER_VALUE, (_m, name, sep, scheme) => `${name}${sep}${scheme ?? ''}[redacted]`);
113
+ out = out.replace(COOKIE_VALUE, (_m, name, sep) => `${name}${sep}[redacted]`);
114
+ out = out.replace(BEARER, 'Bearer [redacted]');
115
+ return out;
116
+ };
117
+ }
118
+ /** Redact one string against `env` (D6 rules 2–4). */
119
+ export function redactText(text, env = process.env) {
120
+ return createRedactor(env)(text);
121
+ }
122
+ // ---------------------------------------------------------------------------
123
+ // Bounded strings
124
+ // ---------------------------------------------------------------------------
125
+ /** Cut `text` to at most `maxBytes` of UTF-8 on a code-point boundary. */
126
+ export function utf8Head(text, maxBytes) {
127
+ const bytes = Buffer.from(text, 'utf8');
128
+ if (bytes.length <= maxBytes)
129
+ return text;
130
+ let end = maxBytes;
131
+ while (end > 0 && (bytes[end] & 0xc0) === 0x80)
132
+ end -= 1;
133
+ return bytes.subarray(0, end).toString('utf8');
134
+ }
135
+ /** The last `maxBytes` of `text`, on a code-point boundary. */
136
+ export function utf8Tail(text, maxBytes) {
137
+ const bytes = Buffer.from(text, 'utf8');
138
+ if (bytes.length <= maxBytes)
139
+ return text;
140
+ let start = bytes.length - maxBytes;
141
+ while (start < bytes.length && (bytes[start] & 0xc0) === 0x80)
142
+ start += 1;
143
+ return bytes.subarray(start).toString('utf8');
144
+ }
145
+ /** Head-cut with the truncation stated in the value itself. */
146
+ export function boundedText(text, maxBytes, label = '') {
147
+ const total = Buffer.byteLength(text, 'utf8');
148
+ if (total <= maxBytes)
149
+ return { text, truncated: false };
150
+ const head = utf8Head(text, maxBytes);
151
+ return { text: `${head}…[${label}${total - Buffer.byteLength(head, 'utf8')} bytes truncated]`, truncated: true };
152
+ }
153
+ // ---------------------------------------------------------------------------
154
+ // Frame reduction
155
+ // ---------------------------------------------------------------------------
156
+ /**
157
+ * Redact and bound every string leaf of a parsed frame, and reduce the
158
+ * `system/init` frame to its whitelist. Unknown frame types are kept as they
159
+ * are, minus the same string treatment.
160
+ */
161
+ export function reduceFrame(frame, redact) {
162
+ if (record(frame) && frame.type === 'system' && frame.subtype === 'init') {
163
+ const kept = { relayflow_reduced: true };
164
+ for (const key of INIT_KEEP)
165
+ if (frame[key] !== undefined)
166
+ kept[key] = frame[key];
167
+ if (Array.isArray(frame.tools))
168
+ kept.tools_count = frame.tools.length;
169
+ if (Array.isArray(frame.mcp_servers))
170
+ kept.mcp_servers_count = frame.mcp_servers.length;
171
+ return reduceValue(kept, redact);
172
+ }
173
+ return reduceValue(frame, redact);
174
+ }
175
+ function reduceValue(value, redact) {
176
+ if (typeof value === 'string')
177
+ return boundedText(redact(value), TRANSCRIPT_STRING_MAX_BYTES, 'relayflow: ').text;
178
+ if (Array.isArray(value))
179
+ return value.map(item => reduceValue(item, redact));
180
+ if (record(value)) {
181
+ const out = {};
182
+ for (const [key, item] of Object.entries(value))
183
+ out[key] = reduceValue(item, redact);
184
+ return out;
185
+ }
186
+ return value;
187
+ }
188
+ /**
189
+ * Open the per-attempt transcript file. The first `TRANSCRIPT_HEAD_BYTES` are
190
+ * written as they arrive, so a crash mid-run still leaves the start of the
191
+ * transcript on disk; past that a ring of the last `TRANSCRIPT_TAIL_BYTES`
192
+ * is kept and flushed on close, behind one `relayflow.truncated` marker line
193
+ * that says how much fell between them.
194
+ */
195
+ export async function openTranscriptWriter(path, env = process.env) {
196
+ let handle;
197
+ try {
198
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
199
+ // The agent runs as this OS user, so it can plant a symlink at the
200
+ // transcript path; `open(path, 'w')` would follow it and truncate whatever
201
+ // it points at. Remove whatever is there without following it, then create
202
+ // the file exclusively so a re-planted symlink loses the race rather than
203
+ // being followed. O_NOFOLLOW is belt to O_EXCL's braces.
204
+ try {
205
+ await unlink(path);
206
+ }
207
+ catch { /* absent, or not ours to remove */ }
208
+ handle = await open(path,
209
+ // eslint-disable-next-line no-bitwise
210
+ fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | fsConstants.O_NOFOLLOW, 0o600);
211
+ }
212
+ catch {
213
+ return undefined;
214
+ }
215
+ const redact = createRedactor(env);
216
+ const hash = createHash('sha256');
217
+ const tail = [];
218
+ let pending = Promise.resolve();
219
+ let failed = false;
220
+ let headBytes = 0;
221
+ let tailBytes = 0;
222
+ let bytesTotal = 0;
223
+ let bytesDropped = 0;
224
+ let framesTotal = 0;
225
+ let framesDropped = 0;
226
+ let closed = false;
227
+ const append = (bytes) => {
228
+ hash.update(bytes);
229
+ pending = pending.then(async () => { if (!failed)
230
+ await handle.write(bytes); }).catch(() => { failed = true; });
231
+ };
232
+ return {
233
+ write(line) {
234
+ if (closed || line.length === 0)
235
+ return;
236
+ let reduced;
237
+ try {
238
+ const frame = JSON.parse(line);
239
+ reduced = JSON.stringify(reduceFrame(frame, redact));
240
+ }
241
+ catch {
242
+ // Not a frame: kept opaque, still redacted and bounded.
243
+ reduced = boundedText(redact(line), TRANSCRIPT_STRING_MAX_BYTES, 'relayflow: ').text;
244
+ }
245
+ const bytes = Buffer.from(`${reduced}\n`, 'utf8');
246
+ framesTotal += 1;
247
+ bytesTotal += bytes.length;
248
+ if (tail.length === 0 && headBytes + bytes.length <= TRANSCRIPT_HEAD_BYTES) {
249
+ headBytes += bytes.length;
250
+ append(bytes);
251
+ return;
252
+ }
253
+ tail.push(bytes);
254
+ tailBytes += bytes.length;
255
+ // Once anything has been dropped, `close` will write a truncation marker
256
+ // that is part of the file too, so the tail budget shrinks by its
257
+ // reservation — otherwise a full head plus a full tail plus the marker
258
+ // puts the file over TRANSCRIPT_FILE_MAX_BYTES.
259
+ const tailLimit = () => TRANSCRIPT_TAIL_BYTES - (bytesDropped > 0 ? TRUNCATION_MARKER_RESERVE : 0);
260
+ while (tailBytes > tailLimit() && tail.length > 0) {
261
+ const dropped = tail.shift();
262
+ tailBytes -= dropped.length;
263
+ bytesDropped += dropped.length;
264
+ framesDropped += 1;
265
+ }
266
+ },
267
+ async close() {
268
+ if (closed)
269
+ return undefined;
270
+ closed = true;
271
+ if (bytesDropped > 0) {
272
+ append(Buffer.from(`${JSON.stringify({
273
+ type: 'relayflow.truncated', bytes_dropped: bytesDropped, frames_dropped: framesDropped,
274
+ })}\n`, 'utf8'));
275
+ }
276
+ for (const bytes of tail)
277
+ append(bytes);
278
+ await pending;
279
+ try {
280
+ await handle.close();
281
+ }
282
+ catch {
283
+ failed = true;
284
+ }
285
+ if (failed)
286
+ return undefined;
287
+ return {
288
+ path,
289
+ bytes_total: bytesTotal,
290
+ bytes_kept: headBytes + tailBytes,
291
+ frames_total: framesTotal,
292
+ frames_kept: framesTotal - framesDropped,
293
+ truncated: bytesDropped > 0,
294
+ sha256: hash.digest('hex'),
295
+ };
296
+ },
297
+ };
298
+ }
299
+ // ---------------------------------------------------------------------------
300
+ // Digest
301
+ // ---------------------------------------------------------------------------
302
+ const num = (value) => typeof value === 'number' && Number.isFinite(value) ? value : undefined;
303
+ const str = (value) => typeof value === 'string' ? value : undefined;
304
+ /**
305
+ * Build the digest from the frames `decodeProviderResult` already parsed.
306
+ * Claude: `tool_use` blocks are paired with `tool_result` blocks by
307
+ * `tool_use_id`; `init` supplies model and version. Codex: `item.completed`
308
+ * items are counted by `item.type` only, so `tools.complete` is false.
309
+ * `failure` is filled only when the attempt did not succeed.
310
+ */
311
+ export function buildTranscriptDigest(frames, kind, outcome, env = process.env) {
312
+ const redact = createRedactor(env);
313
+ const digest = {};
314
+ const bounded = (text, max) => boundedText(redact(text), max);
315
+ if (kind === 'claude') {
316
+ const init = frames.find(f => f.type === 'system' && f.subtype === 'init');
317
+ const terminal = [...frames].reverse().find(f => f.type === 'result');
318
+ const usage = record(terminal?.usage) ? terminal.usage : undefined;
319
+ const details = record(usage?.output_tokens_details) ? usage.output_tokens_details : undefined;
320
+ const model = label(str(init?.model) ?? frames.flatMap(f => f.type === 'assistant' && record(f.message) ? [str(f.message.model)] : []).find(Boolean));
321
+ const version = label(str(init?.claude_code_version));
322
+ const session = label(str(terminal?.session_id ?? init?.session_id));
323
+ const subtype = label(str(terminal?.subtype));
324
+ const stopReason = label(str(terminal?.stop_reason));
325
+ digest.result = {
326
+ provider: 'claude',
327
+ ...(model === undefined ? {} : { model }),
328
+ ...(version === undefined ? {} : { claude_code_version: version }),
329
+ ...(session === undefined ? {} : { session_id: session }),
330
+ ...(subtype === undefined ? {} : { subtype }),
331
+ ...(typeof terminal?.is_error === 'boolean' ? { is_error: terminal.is_error } : {}),
332
+ ...(stopReason === undefined ? {} : { stop_reason: stopReason }),
333
+ ...(num(terminal?.num_turns) === undefined ? {} : { num_turns: num(terminal?.num_turns) }),
334
+ ...(num(terminal?.duration_ms) === undefined ? {} : { duration_ms: num(terminal?.duration_ms) }),
335
+ ...(num(terminal?.duration_api_ms) === undefined ? {} : { duration_api_ms: num(terminal?.duration_api_ms) }),
336
+ ...(num(terminal?.total_cost_usd) === undefined ? {} : { total_cost_usd: num(terminal?.total_cost_usd) }),
337
+ ...(usage === undefined ? {} : { usage: {
338
+ ...(num(usage.input_tokens) === undefined ? {} : { input: num(usage.input_tokens) }),
339
+ ...(num(usage.output_tokens) === undefined ? {} : { output: num(usage.output_tokens) }),
340
+ ...(num(usage.cache_read_input_tokens) === undefined ? {} : { cache_read: num(usage.cache_read_input_tokens) }),
341
+ ...(num(usage.cache_creation_input_tokens) === undefined ? {} : { cache_creation: num(usage.cache_creation_input_tokens) }),
342
+ ...(num(details?.thinking_tokens) === undefined ? {} : { thinking: num(details?.thinking_tokens) }),
343
+ } }),
344
+ ...(Array.isArray(terminal?.permission_denials) ? { permission_denials: terminal.permission_denials.length } : {}),
345
+ };
346
+ const calls = [];
347
+ const byId = new Map();
348
+ let lastToolError;
349
+ for (const frame of frames) {
350
+ const content = record(frame.message) && Array.isArray(frame.message.content) ? frame.message.content : [];
351
+ for (const block of content) {
352
+ if (!record(block))
353
+ continue;
354
+ if (frame.type === 'assistant' && block.type === 'tool_use') {
355
+ const excerpt = redact(block.input === undefined ? '' : JSON.stringify(block.input));
356
+ const call = {
357
+ seq: calls.length + 1, name: label(str(block.name)) ?? '?',
358
+ input_excerpt: excerpt.length > TOOL_INPUT_EXCERPT_MAX_CHARS ? `${excerpt.slice(0, TOOL_INPUT_EXCERPT_MAX_CHARS - 1)}…` : excerpt,
359
+ };
360
+ calls.push(call);
361
+ if (typeof block.id === 'string')
362
+ byId.set(block.id, call);
363
+ }
364
+ else if (frame.type === 'user' && block.type === 'tool_result') {
365
+ const call = typeof block.tool_use_id === 'string' ? byId.get(block.tool_use_id) : undefined;
366
+ const text = typeof block.content === 'string' ? block.content : JSON.stringify(block.content ?? '');
367
+ if (call !== undefined) {
368
+ call.result_bytes = Buffer.byteLength(text, 'utf8');
369
+ if (block.is_error === true)
370
+ call.is_error = true;
371
+ }
372
+ if (block.is_error === true)
373
+ lastToolError = text;
374
+ }
375
+ }
376
+ }
377
+ if (calls.length > 0) {
378
+ const counts = new Map();
379
+ for (const call of calls) {
380
+ const entry = counts.get(call.name) ?? { name: call.name, calls: 0, errors: 0 };
381
+ entry.calls += 1;
382
+ if (call.is_error === true)
383
+ entry.errors += 1;
384
+ counts.set(call.name, entry);
385
+ }
386
+ const last = calls.slice(-TOOL_LAST_CALLS_MAX).map(({ id: _id, ...call }) => call);
387
+ digest.tools = {
388
+ counts: [...counts.values()].sort((a, b) => b.calls - a.calls).slice(0, TOOL_COUNTS_MAX),
389
+ last_calls: last, total_calls: calls.length, shown_calls: last.length, complete: true,
390
+ };
391
+ }
392
+ if (typeof terminal?.result === 'string') {
393
+ const text = bounded(terminal.result, FINAL_TEXT_MAX_BYTES);
394
+ digest.final_text = text.text;
395
+ if (text.truncated)
396
+ digest.final_text_truncated = true;
397
+ }
398
+ if (outcome.exit_code !== 0) {
399
+ const failedResult = terminal !== undefined
400
+ && (terminal.is_error === true || (typeof terminal.subtype === 'string' && terminal.subtype !== 'success'));
401
+ if (failedResult) {
402
+ digest.failure = failure('result', typeof terminal.result === 'string' ? terminal.result : JSON.stringify(terminal), bounded);
403
+ }
404
+ else if (lastToolError !== undefined) {
405
+ digest.failure = failure('tool_result', lastToolError, bounded);
406
+ }
407
+ else if (outcome.stderr_tail.length > 0) {
408
+ digest.failure = failure('stderr', stderrExcerpt(outcome.stderr_tail, redact), bounded);
409
+ }
410
+ }
411
+ return digest;
412
+ }
413
+ // Codex: only `turn.completed` and `item.completed{agent_message}` are
414
+ // consumed today; tool activity is counted by item type until a fixture
415
+ // pins the frame shapes (plan U3).
416
+ const terminal = [...frames].reverse().find(f => f.type === 'turn.completed');
417
+ const usage = record(terminal?.usage) ? terminal.usage : undefined;
418
+ digest.result = {
419
+ provider: 'codex',
420
+ ...(usage === undefined ? {} : { usage: {
421
+ ...(num(usage.input_tokens) === undefined ? {} : { input: num(usage.input_tokens) }),
422
+ ...(num(usage.output_tokens) === undefined ? {} : { output: num(usage.output_tokens) }),
423
+ ...(num(usage.cached_input_tokens) === undefined ? {} : { cache_read: num(usage.cached_input_tokens) }),
424
+ } }),
425
+ };
426
+ const counts = new Map();
427
+ const texts = [];
428
+ for (const frame of frames) {
429
+ if (frame.type !== 'item.completed' || !record(frame.item))
430
+ continue;
431
+ const type = label(str(frame.item.type)) ?? '?';
432
+ if (type === 'agent_message') {
433
+ if (typeof frame.item.text === 'string')
434
+ texts.push(frame.item.text);
435
+ continue;
436
+ }
437
+ const entry = counts.get(type) ?? { name: type, calls: 0, errors: 0 };
438
+ entry.calls += 1;
439
+ counts.set(type, entry);
440
+ }
441
+ if (counts.size > 0) {
442
+ const total = [...counts.values()].reduce((sum, entry) => sum + entry.calls, 0);
443
+ digest.tools = {
444
+ counts: [...counts.values()].sort((a, b) => b.calls - a.calls).slice(0, TOOL_COUNTS_MAX),
445
+ last_calls: [], total_calls: total, shown_calls: 0, complete: false,
446
+ };
447
+ }
448
+ if (texts.length > 0) {
449
+ const text = bounded(texts.join('\n'), FINAL_TEXT_MAX_BYTES);
450
+ digest.final_text = text.text;
451
+ if (text.truncated)
452
+ digest.final_text_truncated = true;
453
+ }
454
+ if (outcome.exit_code !== 0 && outcome.stderr_tail.length > 0) {
455
+ digest.failure = failure('stderr', stderrExcerpt(outcome.stderr_tail, redact), bounded);
456
+ }
457
+ return digest;
458
+ }
459
+ /**
460
+ * Redact the whole stderr tail *before* cutting it. Cutting first splits a
461
+ * secret that straddles the boundary, and neither `replaceAll` on a known
462
+ * value nor a token-prefix pattern matches half a secret — so the fragment
463
+ * reached the journal. The decoder-refusal path already ordered it this way.
464
+ */
465
+ function stderrExcerpt(stderrTail, redact) {
466
+ return utf8Tail(redact(stderrTail), FAILURE_EXCERPT_MAX_BYTES);
467
+ }
468
+ /**
469
+ * Provider-supplied identifiers are copied into `result` verbatim and no
470
+ * reduction step in `boundTranscriptDigest` trims them, so an oversized one
471
+ * (a 20 KiB `model`, say) would push the digest past the kernel's
472
+ * `trajectory_tail` bound and fail the completion outright. Bound them here.
473
+ */
474
+ function label(value) {
475
+ return value === undefined ? undefined : boundedText(value, DIGEST_LABEL_MAX_BYTES).text;
476
+ }
477
+ function failure(kind, text, bounded) {
478
+ const excerpt = bounded(text, FAILURE_EXCERPT_MAX_BYTES);
479
+ return { kind, excerpt: excerpt.text, ...(excerpt.truncated ? { truncated: true } : {}) };
480
+ }
481
+ /** Serialized size of the digest as it will be journaled. */
482
+ export function digestBytes(digest) {
483
+ return Buffer.byteLength(JSON.stringify(digest), 'utf8');
484
+ }
485
+ /**
486
+ * Shrink the digest until it serializes to at most `TRANSCRIPT_DIGEST_MAX_BYTES`,
487
+ * in a fixed order: recent tool calls, artifact paths, final text, failure
488
+ * excerpt, tool counts. Each cut leaves its mark — `shown_calls` under
489
+ * `total_calls`, `artifacts.count` above `paths.length`, `final_text_truncated`,
490
+ * `failure.truncated` — so a reader knows the digest is not the whole account.
491
+ */
492
+ export function boundTranscriptDigest(digest) {
493
+ let out = digest;
494
+ const steps = [
495
+ d => keepLastCalls(d, 10),
496
+ d => keepArtifactPaths(d, 10),
497
+ d => cutFinalText(d, 512),
498
+ d => cutFailure(d, 256),
499
+ d => keepLastCalls(d, 0),
500
+ d => keepArtifactPaths(d, 0),
501
+ d => d.tools === undefined ? d : { ...d, tools: { ...d.tools, counts: d.tools.counts.slice(0, 8) } },
502
+ d => cutFinalText(d, 0),
503
+ d => cutFailure(d, 0),
504
+ ];
505
+ for (const step of steps) {
506
+ if (digestBytes(out) <= TRANSCRIPT_DIGEST_MAX_BYTES)
507
+ return out;
508
+ out = step(out);
509
+ }
510
+ if (digestBytes(out) <= TRANSCRIPT_DIGEST_MAX_BYTES)
511
+ return out;
512
+ // Last resort. Every step above trims a string this module produced; none of
513
+ // them touches a provider-supplied identifier, so a pathological `model`,
514
+ // `session_id` or set of tool names can still hold the digest over its cap —
515
+ // and the kernel refuses the whole completion when `trajectory_tail` is
516
+ // oversized (kernel/relayflowd/src/server.rs, step.complete). Falling back to
517
+ // fixed-size fields keeps the attempt recorded.
518
+ return coreDigest(out);
519
+ }
520
+ /**
521
+ * The digest reduced to fields whose size this module controls: numbers, the
522
+ * provider tag, a bounded path and a fixed-width hash. Nothing a provider can
523
+ * make arbitrarily long survives, so the result is bounded by construction.
524
+ */
525
+ function coreDigest(d) {
526
+ const core = { core_only: true };
527
+ if (d.attempt !== undefined)
528
+ core.attempt = d.attempt;
529
+ if (d.exit_code !== undefined)
530
+ core.exit_code = d.exit_code;
531
+ if (d.file !== undefined) {
532
+ core.file = { ...d.file, path: utf8Head(d.file.path, DIGEST_LABEL_MAX_BYTES) };
533
+ }
534
+ if (d.result !== undefined) {
535
+ const { provider, usage, is_error, num_turns, duration_ms, duration_api_ms, total_cost_usd, permission_denials } = d.result;
536
+ core.result = {
537
+ provider,
538
+ ...(is_error === undefined ? {} : { is_error }),
539
+ ...(num_turns === undefined ? {} : { num_turns }),
540
+ ...(duration_ms === undefined ? {} : { duration_ms }),
541
+ ...(duration_api_ms === undefined ? {} : { duration_api_ms }),
542
+ ...(total_cost_usd === undefined ? {} : { total_cost_usd }),
543
+ ...(permission_denials === undefined ? {} : { permission_denials }),
544
+ ...(usage === undefined ? {} : { usage }),
545
+ };
546
+ }
547
+ if (d.tools !== undefined) {
548
+ core.tools = {
549
+ counts: [], last_calls: [], total_calls: d.tools.total_calls, shown_calls: 0, complete: d.tools.complete,
550
+ };
551
+ }
552
+ if (d.artifacts !== undefined)
553
+ core.artifacts = { count: d.artifacts.count, paths: [] };
554
+ if (d.final_text !== undefined || d.final_text_truncated === true)
555
+ core.final_text_truncated = true;
556
+ if (d.failure !== undefined)
557
+ core.failure = { kind: d.failure.kind, excerpt: '', truncated: true };
558
+ return core;
559
+ }
560
+ function keepLastCalls(d, n) {
561
+ if (d.tools === undefined || d.tools.last_calls.length <= n)
562
+ return d;
563
+ const last = n === 0 ? [] : d.tools.last_calls.slice(-n);
564
+ return { ...d, tools: { ...d.tools, last_calls: last, shown_calls: last.length } };
565
+ }
566
+ function keepArtifactPaths(d, n) {
567
+ if (d.artifacts === undefined || d.artifacts.paths.length <= n)
568
+ return d;
569
+ return { ...d, artifacts: { count: d.artifacts.count, paths: d.artifacts.paths.slice(0, n) } };
570
+ }
571
+ function cutFinalText(d, maxBytes) {
572
+ if (d.final_text === undefined || Buffer.byteLength(d.final_text, 'utf8') <= maxBytes)
573
+ return d;
574
+ if (maxBytes === 0) {
575
+ const { final_text: _t, ...rest } = d;
576
+ return { ...rest, final_text_truncated: true };
577
+ }
578
+ return { ...d, final_text: boundedText(d.final_text, maxBytes).text, final_text_truncated: true };
579
+ }
580
+ function cutFailure(d, maxBytes) {
581
+ if (d.failure === undefined || Buffer.byteLength(d.failure.excerpt, 'utf8') <= maxBytes)
582
+ return d;
583
+ return { ...d, failure: { ...d.failure, excerpt: boundedText(d.failure.excerpt, maxBytes).text, truncated: true } };
584
+ }
585
+ //# sourceMappingURL=agent-transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-transcript.js","sourceRoot":"","sources":["../src/agent-transcript.ts"],"names":[],"mappings":"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"}
package/dist/cli/run.js CHANGED
@@ -634,7 +634,8 @@ function renderStepEvidence(details) {
634
634
  + '.'
635
635
  + (details.detail === undefined ? '' : `\nDetail: ${details.detail}`)
636
636
  + (details.stdoutTail ? `\nStdout (last 1,024 bytes):\n${details.stdoutTail}` : '')
637
- + (details.stderrTail ? `\nStderr (last 1,024 bytes):\n${details.stderrTail}` : '');
637
+ + (details.stderrTail ? `\nStderr (last 1,024 bytes):\n${details.stderrTail}` : '')
638
+ + (details.transcriptPath === undefined ? '' : `\nTranscript: ${details.transcriptPath}`);
638
639
  }
639
640
  function throwIfCanceled(signal, stepId) {
640
641
  if (signal?.aborted === true)