@webywz/agent-trace 0.0.0-stage → 0.1.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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +116 -2
  3. package/dist/args.d.ts +16 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +120 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/cli.d.ts +4 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +107 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/color.d.ts +15 -0
  12. package/dist/color.d.ts.map +1 -0
  13. package/dist/color.js +29 -0
  14. package/dist/color.js.map +1 -0
  15. package/dist/index.d.ts +10 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +9 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/parse/event.d.ts +5 -0
  20. package/dist/parse/event.d.ts.map +1 -0
  21. package/dist/parse/event.js +204 -0
  22. package/dist/parse/event.js.map +1 -0
  23. package/dist/parse/generic.d.ts +4 -0
  24. package/dist/parse/generic.d.ts.map +1 -0
  25. package/dist/parse/generic.js +62 -0
  26. package/dist/parse/generic.js.map +1 -0
  27. package/dist/parse/index.d.ts +8 -0
  28. package/dist/parse/index.d.ts.map +1 -0
  29. package/dist/parse/index.js +71 -0
  30. package/dist/parse/index.js.map +1 -0
  31. package/dist/parse/jsonl.d.ts +8 -0
  32. package/dist/parse/jsonl.d.ts.map +1 -0
  33. package/dist/parse/jsonl.js +85 -0
  34. package/dist/parse/jsonl.js.map +1 -0
  35. package/dist/parse/langchain.d.ts +4 -0
  36. package/dist/parse/langchain.d.ts.map +1 -0
  37. package/dist/parse/langchain.js +348 -0
  38. package/dist/parse/langchain.js.map +1 -0
  39. package/dist/parse/openai.d.ts +4 -0
  40. package/dist/parse/openai.d.ts.map +1 -0
  41. package/dist/parse/openai.js +344 -0
  42. package/dist/parse/openai.js.map +1 -0
  43. package/dist/read-input.d.ts +5 -0
  44. package/dist/read-input.d.ts.map +1 -0
  45. package/dist/read-input.js +20 -0
  46. package/dist/read-input.js.map +1 -0
  47. package/dist/render/spicy.d.ts +4 -0
  48. package/dist/render/spicy.d.ts.map +1 -0
  49. package/dist/render/spicy.js +144 -0
  50. package/dist/render/spicy.js.map +1 -0
  51. package/dist/render/timeline.d.ts +4 -0
  52. package/dist/render/timeline.d.ts.map +1 -0
  53. package/dist/render/timeline.js +179 -0
  54. package/dist/render/timeline.js.map +1 -0
  55. package/dist/stats.d.ts +3 -0
  56. package/dist/stats.d.ts.map +1 -0
  57. package/dist/stats.js +64 -0
  58. package/dist/stats.js.map +1 -0
  59. package/dist/types.d.ts +49 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +2 -0
  62. package/dist/types.js.map +1 -0
  63. package/dist/util.d.ts +17 -0
  64. package/dist/util.d.ts.map +1 -0
  65. package/dist/util.js +185 -0
  66. package/dist/util.js.map +1 -0
  67. package/examples/generic.json +29 -0
  68. package/examples/langchain.json +55 -0
  69. package/examples/openai.json +29 -0
  70. package/examples/run.jsonl +19 -0
  71. package/package.json +59 -4
@@ -0,0 +1,344 @@
1
+ import { computeStats } from "../stats.js";
2
+ import { asArray, coerceJson, compactJson, flattenText, isRecord, parseTimestamp, pickNumber, pickString, } from "../util.js";
3
+ import { reindex, titleFor } from "./event.js";
4
+ export function parseOpenAI(input, source) {
5
+ const warnings = [];
6
+ const steps = [];
7
+ let tokensIn;
8
+ let tokensOut;
9
+ const applyUsage = (usage) => {
10
+ if (!isRecord(usage))
11
+ return;
12
+ const inn = pickNumber(usage, ["prompt_tokens", "input_tokens", "tokens_in"]);
13
+ const out = pickNumber(usage, ["completion_tokens", "output_tokens", "tokens_out"]);
14
+ if (inn != null)
15
+ tokensIn = (tokensIn ?? 0) + inn;
16
+ if (out != null)
17
+ tokensOut = (tokensOut ?? 0) + out;
18
+ };
19
+ if (Array.isArray(input)) {
20
+ if (input.every((item) => isRecord(item) && (item.delta != null || item.choices != null))) {
21
+ const merged = mergeStreamingChunks(input, warnings);
22
+ steps.push(...merged.steps);
23
+ applyUsage(merged.usage);
24
+ }
25
+ else {
26
+ steps.push(...messagesToSteps(input, warnings));
27
+ }
28
+ }
29
+ else if (isRecord(input)) {
30
+ applyUsage(input.usage);
31
+ if (Array.isArray(input.messages)) {
32
+ steps.push(...messagesToSteps(input.messages, warnings));
33
+ }
34
+ if (Array.isArray(input.choices)) {
35
+ for (const choice of input.choices) {
36
+ if (!isRecord(choice))
37
+ continue;
38
+ if (isRecord(choice.message)) {
39
+ steps.push(...messagesToSteps([choice.message], warnings));
40
+ }
41
+ else if (isRecord(choice.delta)) {
42
+ steps.push(...messagesToSteps([{ role: "assistant", ...choice.delta }], warnings));
43
+ }
44
+ }
45
+ }
46
+ if (Array.isArray(input.output)) {
47
+ steps.push(...responsesOutputToSteps(input.output, warnings));
48
+ }
49
+ if (isRecord(input.message)) {
50
+ steps.push(...messagesToSteps([input.message], warnings));
51
+ }
52
+ if (input.object === "trace" && Array.isArray(input.spans)) {
53
+ steps.push(...spansToSteps(input.spans, warnings));
54
+ }
55
+ if (Array.isArray(input.data) && input.object === "list") {
56
+ return parseOpenAI(input.data, source);
57
+ }
58
+ }
59
+ else {
60
+ warnings.push("openai parser expected an object or array");
61
+ }
62
+ const indexed = reindex(steps.filter(Boolean));
63
+ if (indexed.length === 0) {
64
+ warnings.push("openai parser produced no steps");
65
+ }
66
+ const stats = computeStats(indexed);
67
+ if (tokensIn != null)
68
+ stats.tokensIn = tokensIn;
69
+ if (tokensOut != null)
70
+ stats.tokensOut = tokensOut;
71
+ const trace = {
72
+ format: "openai",
73
+ steps: indexed,
74
+ stats,
75
+ warnings,
76
+ };
77
+ if (source)
78
+ trace.source = source;
79
+ return trace;
80
+ }
81
+ function messagesToSteps(messages, warnings) {
82
+ const steps = [];
83
+ for (const raw of messages) {
84
+ if (!isRecord(raw)) {
85
+ warnings.push("skipped non-object message");
86
+ continue;
87
+ }
88
+ const role = String(raw.role ?? "assistant").toLowerCase();
89
+ const ts = parseTimestamp(raw.ts ?? raw.timestamp ?? raw.created_at);
90
+ const toolCalls = asArray(raw.tool_calls);
91
+ const content = flattenText(raw.content);
92
+ if (role === "tool" || role === "function") {
93
+ const name = pickString(raw, ["name", "tool", "tool_name"]);
94
+ const err = flattenText(raw.error);
95
+ steps.push({
96
+ index: 0,
97
+ kind: err ? "error" : "tool_result",
98
+ title: titleFor(err ? "error" : "tool_result", name),
99
+ name,
100
+ content: content ?? compactJson(raw.content),
101
+ result: coerceJson(raw.content),
102
+ error: err,
103
+ ts,
104
+ toolCallId: pickString(raw, ["tool_call_id", "id"]),
105
+ });
106
+ continue;
107
+ }
108
+ if (role === "user") {
109
+ steps.push({
110
+ index: 0,
111
+ kind: "user",
112
+ title: "user",
113
+ content,
114
+ ts,
115
+ });
116
+ continue;
117
+ }
118
+ if (role === "system" || role === "developer") {
119
+ if (content) {
120
+ steps.push({
121
+ index: 0,
122
+ kind: "system",
123
+ title: "system",
124
+ content,
125
+ ts,
126
+ });
127
+ }
128
+ continue;
129
+ }
130
+ if (content) {
131
+ steps.push({
132
+ index: 0,
133
+ kind: toolCalls.length ? "thought" : "assistant",
134
+ title: toolCalls.length ? "thought" : "assistant",
135
+ content,
136
+ ts,
137
+ });
138
+ }
139
+ if (isRecord(raw.function_call)) {
140
+ steps.push(toolCallStep(raw.function_call, ts));
141
+ }
142
+ for (const call of toolCalls) {
143
+ if (!isRecord(call))
144
+ continue;
145
+ const fn = isRecord(call.function) ? call.function : call;
146
+ steps.push({
147
+ ...toolCallStep(fn, ts),
148
+ toolCallId: pickString(call, ["id", "tool_call_id"]),
149
+ });
150
+ }
151
+ }
152
+ return steps;
153
+ }
154
+ function toolCallStep(fn, ts) {
155
+ const name = pickString(fn, ["name", "tool", "function"]) ?? "function";
156
+ const args = coerceJson(fn.arguments ?? fn.args ?? fn.input ?? fn.parameters);
157
+ return {
158
+ index: 0,
159
+ kind: "tool_call",
160
+ title: titleFor("tool_call", name),
161
+ name,
162
+ args,
163
+ content: typeof args === "string" ? args : compactJson(args),
164
+ ts,
165
+ };
166
+ }
167
+ function responsesOutputToSteps(output, warnings) {
168
+ const steps = [];
169
+ for (const item of output) {
170
+ if (!isRecord(item)) {
171
+ warnings.push("skipped non-object Responses output item");
172
+ continue;
173
+ }
174
+ const type = String(item.type ?? "");
175
+ const ts = parseTimestamp(item.ts ?? item.timestamp);
176
+ if (type === "message" || item.role === "assistant" || item.role === "user") {
177
+ const role = String(item.role ?? "assistant");
178
+ const content = flattenText(item.content) ?? flattenText(item.text);
179
+ const kind = role === "user" ? "user" : "assistant";
180
+ if (content) {
181
+ steps.push({ index: 0, kind, title: kind, content, ts });
182
+ }
183
+ continue;
184
+ }
185
+ if (type === "function_call" || type === "tool_call" || type === "custom_tool_call") {
186
+ const name = pickString(item, ["name", "tool"]) ?? "function";
187
+ const args = coerceJson(item.arguments ?? item.input);
188
+ steps.push({
189
+ index: 0,
190
+ kind: "tool_call",
191
+ title: titleFor("tool_call", name),
192
+ name,
193
+ args,
194
+ content: compactJson(args),
195
+ ts,
196
+ toolCallId: pickString(item, ["call_id", "id"]),
197
+ });
198
+ continue;
199
+ }
200
+ if (type === "function_call_output" || type === "tool_result" || type === "custom_tool_call_output") {
201
+ const err = flattenText(item.error);
202
+ steps.push({
203
+ index: 0,
204
+ kind: err ? "error" : "tool_result",
205
+ title: titleFor(err ? "error" : "tool_result", pickString(item, ["name"])),
206
+ name: pickString(item, ["name"]),
207
+ content: flattenText(item.output ?? item.content) ?? compactJson(item.output),
208
+ result: coerceJson(item.output ?? item.content),
209
+ error: err,
210
+ ts,
211
+ toolCallId: pickString(item, ["call_id", "id"]),
212
+ });
213
+ continue;
214
+ }
215
+ if (type === "reasoning") {
216
+ const content = flattenText(item.summary ?? item.content);
217
+ if (content) {
218
+ steps.push({ index: 0, kind: "thought", title: "thought", content, ts });
219
+ }
220
+ }
221
+ }
222
+ return steps;
223
+ }
224
+ function spansToSteps(spans, warnings) {
225
+ const steps = [];
226
+ for (const span of spans) {
227
+ if (!isRecord(span))
228
+ continue;
229
+ const type = String(span.type ?? span.span_type ?? "");
230
+ const ts = parseTimestamp(span.started_at ?? span.start_time ?? span.ts);
231
+ const name = pickString(span, ["name", "tool"]);
232
+ if (type === "function" || type === "tool") {
233
+ const err = flattenText(span.error);
234
+ steps.push({
235
+ index: 0,
236
+ kind: "tool_call",
237
+ title: titleFor("tool_call", name),
238
+ name,
239
+ args: span.input ?? span.arguments,
240
+ content: compactJson(span.input ?? span.arguments),
241
+ ts,
242
+ });
243
+ steps.push({
244
+ index: 0,
245
+ kind: err ? "error" : "tool_result",
246
+ title: titleFor(err ? "error" : "tool_result", name),
247
+ name,
248
+ content: flattenText(span.output) ?? compactJson(span.output),
249
+ result: span.output,
250
+ error: err,
251
+ ts: parseTimestamp(span.ended_at ?? span.end_time) ?? ts,
252
+ });
253
+ }
254
+ else if (type === "generation" || type === "llm" || type === "response") {
255
+ const content = flattenText(span.output) ?? flattenText(span.content);
256
+ if (content) {
257
+ steps.push({ index: 0, kind: "assistant", title: "assistant", content, ts });
258
+ }
259
+ }
260
+ else if (Array.isArray(span.spans)) {
261
+ steps.push(...spansToSteps(span.spans, warnings));
262
+ }
263
+ }
264
+ return steps;
265
+ }
266
+ function mergeStreamingChunks(chunks, warnings) {
267
+ let content = "";
268
+ const toolArgs = {};
269
+ let usage;
270
+ let role = "assistant";
271
+ for (const chunk of chunks) {
272
+ if (!isRecord(chunk))
273
+ continue;
274
+ if (chunk.usage)
275
+ usage = chunk.usage;
276
+ const choices = asArray(chunk.choices);
277
+ const delta = isRecord(choices[0])
278
+ ? (choices[0].delta ?? choices[0].message)
279
+ : isRecord(chunk.delta)
280
+ ? chunk.delta
281
+ : chunk;
282
+ if (!isRecord(delta))
283
+ continue;
284
+ if (typeof delta.role === "string")
285
+ role = delta.role;
286
+ if (typeof delta.content === "string")
287
+ content += delta.content;
288
+ for (const call of asArray(delta.tool_calls)) {
289
+ if (!isRecord(call))
290
+ continue;
291
+ const index = typeof call.index === "number" ? call.index : 0;
292
+ const slot = (toolArgs[index] ??= { arguments: "", id: pickString(call, ["id"]) });
293
+ const fn = isRecord(call.function) ? call.function : call;
294
+ if (typeof fn.name === "string")
295
+ slot.name = fn.name;
296
+ if (typeof fn.arguments === "string")
297
+ slot.arguments += fn.arguments;
298
+ }
299
+ }
300
+ const messages = [];
301
+ if (content || Object.keys(toolArgs).length === 0) {
302
+ messages.push({ role, content });
303
+ }
304
+ else if (content) {
305
+ messages.push({ role, content });
306
+ }
307
+ const tool_calls = Object.values(toolArgs).map((slot, i) => ({
308
+ id: slot.id,
309
+ index: i,
310
+ function: { name: slot.name, arguments: slot.arguments },
311
+ }));
312
+ if (tool_calls.length) {
313
+ if (!messages.length)
314
+ messages.push({ role: "assistant", content: "" });
315
+ const last = messages[messages.length - 1];
316
+ if (last)
317
+ last.tool_calls = tool_calls;
318
+ }
319
+ if (!content && !tool_calls.length)
320
+ warnings.push("streaming chunks had no content");
321
+ return { steps: messagesToSteps(messages, warnings), usage };
322
+ }
323
+ export function looksLikeOpenAI(value) {
324
+ if (Array.isArray(value)) {
325
+ const sample = value.slice(0, 8).filter(isRecord);
326
+ if (!sample.length)
327
+ return false;
328
+ const hits = sample.filter((item) => typeof item.role === "string" ||
329
+ item.tool_calls != null ||
330
+ item.delta != null ||
331
+ (item.choices != null && Array.isArray(item.choices))).length;
332
+ return hits >= Math.ceil(sample.length / 2);
333
+ }
334
+ if (!isRecord(value))
335
+ return false;
336
+ if (value.object === "chat.completion" || value.object === "response" || value.object === "thread") {
337
+ return true;
338
+ }
339
+ if (Array.isArray(value.choices) || Array.isArray(value.messages) || Array.isArray(value.output)) {
340
+ return true;
341
+ }
342
+ return typeof value.role === "string" && (value.content != null || value.tool_calls != null);
343
+ }
344
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/parse/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function readInput(file: string | undefined): Promise<{
2
+ text: string;
3
+ source: string;
4
+ }>;
5
+ //# sourceMappingURL=read-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-input.d.ts","sourceRoot":"","sources":["../src/read-input.ts"],"names":[],"mappings":"AAEA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAUnG"}
@@ -0,0 +1,20 @@
1
+ import { readFile } from "node:fs/promises";
2
+ export async function readInput(file) {
3
+ if (!file || file === "-") {
4
+ if (process.stdin.isTTY && file !== "-") {
5
+ throw new Error("missing file (pass a path, or '-' for stdin)");
6
+ }
7
+ const text = await readStdin();
8
+ return { text, source: "stdin" };
9
+ }
10
+ const text = await readFile(file, "utf8");
11
+ return { text, source: file };
12
+ }
13
+ async function readStdin() {
14
+ const chunks = [];
15
+ for await (const chunk of process.stdin) {
16
+ chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
17
+ }
18
+ return Buffer.concat(chunks).toString("utf8");
19
+ }
20
+ //# sourceMappingURL=read-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-input.js","sourceRoot":"","sources":["../src/read-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAwB;IACtD,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC;QAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACnC,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { SpicyOptions, Trace } from "../types.js";
2
+ export declare function spicyNarrative(trace: Trace, options?: SpicyOptions): Promise<string>;
3
+ export declare function localSpicy(trace: Trace): string;
4
+ //# sourceMappingURL=spicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spicy.d.ts","sourceRoot":"","sources":["../../src/render/spicy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAa,MAAM,aAAa,CAAC;AAGlE,wBAAsB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB9F;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAiC/C"}
@@ -0,0 +1,144 @@
1
+ import { collapseWs, compactJson, truncate } from "../util.js";
2
+ export async function spicyNarrative(trace, options = {}) {
3
+ const local = localSpicy(trace);
4
+ if (options.localOnly)
5
+ return local;
6
+ const openaiKey = process.env.OPENAI_API_KEY;
7
+ const anthropicKey = process.env.ANTHROPIC_API_KEY;
8
+ if (!openaiKey && !anthropicKey)
9
+ return local;
10
+ try {
11
+ const fromLlm = openaiKey
12
+ ? await callOpenAI(trace, openaiKey, options)
13
+ : await callAnthropic(trace, anthropicKey, options);
14
+ const text = collapseWs(fromLlm);
15
+ if (text)
16
+ return text;
17
+ }
18
+ catch {
19
+ return `${local}\n(spicy LLM call failed — used the local recap)`;
20
+ }
21
+ return local;
22
+ }
23
+ export function localSpicy(trace) {
24
+ const user = firstContent(trace.steps, "user");
25
+ const final = lastContent(trace.steps, "assistant") ?? lastContent(trace.steps, "thought");
26
+ const tools = unique(trace.steps.filter((s) => s.kind === "tool_call").map((s) => s.name ?? "tool"));
27
+ const fails = trace.steps.filter((s) => s.kind === "error" || s.error);
28
+ const failNames = unique(fails.map((s) => s.name ?? "unknown"));
29
+ const firstFail = fails[0];
30
+ const brief = user ? quote(truncate(collapseWs(user), 88)) : "an unspecified brief";
31
+ const toolBit = tools.length
32
+ ? `Tools: ${tools.slice(0, 6).join(", ")}${tools.length > 6 ? "…" : ""}.`
33
+ : "No tools were called — pure vibes.";
34
+ let take;
35
+ if (!trace.steps.length) {
36
+ take = "Empty trace. Either the agent never woke up, or the log is in a dialect we don't speak yet.";
37
+ }
38
+ else if (fails.length === 0 && final) {
39
+ take = `Clean run. Asked for ${brief}, finished in ${trace.stats.steps} steps without a face-plant. ${toolBit} Landed on: ${quote(truncate(collapseWs(final), 120))}`;
40
+ }
41
+ else if (fails.length === 0) {
42
+ take = `Quietly competent: ${brief}. ${toolBit} ${trace.stats.steps} steps, no errors — or at least none the log admitted to.`;
43
+ }
44
+ else if (fails.length === 1) {
45
+ const where = firstFail?.name ? `\`${firstFail.name}\`` : "a tool call";
46
+ const why = firstFail?.error ?? firstFail?.content ?? "unknown error";
47
+ take = `The brief was ${brief}. ${toolBit} Then ${where} blew up: ${quote(truncate(collapseWs(why), 100))}. ${final ? `The agent recovered with: ${quote(truncate(collapseWs(final), 100))}` : "No recovery message. Fade to black."}`;
48
+ }
49
+ else {
50
+ take = `Rough ride. ${fails.length} failures (${failNames.join(", ") || "unnamed"}) on ${brief}. ${toolBit} ${final ? `Final word: ${quote(truncate(collapseWs(final), 110))}` : "It never really stuck the landing."}`;
51
+ }
52
+ return take;
53
+ }
54
+ async function callOpenAI(trace, apiKey, options) {
55
+ const base = (process.env.OPENAI_BASE_URL ?? "https://api.openai.com/v1").replace(/\/$/, "");
56
+ const model = options.model ?? process.env.OPENAI_MODEL ?? "gpt-4o-mini";
57
+ const response = await fetchWithTimeout(`${base}/chat/completions`, {
58
+ method: "POST",
59
+ headers: {
60
+ authorization: `Bearer ${apiKey}`,
61
+ "content-type": "application/json",
62
+ },
63
+ body: JSON.stringify({
64
+ model,
65
+ temperature: 0.7,
66
+ max_tokens: 280,
67
+ messages: [
68
+ { role: "system", content: SPICY_SYSTEM },
69
+ { role: "user", content: spicyPrompt(trace) },
70
+ ],
71
+ }),
72
+ }, options.timeoutMs ?? 15_000);
73
+ const json = (await response.json());
74
+ if (!response.ok)
75
+ throw new Error(json.error?.message ?? `openai ${response.status}`);
76
+ return json.choices?.[0]?.message?.content ?? "";
77
+ }
78
+ async function callAnthropic(trace, apiKey, options) {
79
+ const model = options.model ?? process.env.ANTHROPIC_MODEL ?? "claude-3-5-haiku-latest";
80
+ const response = await fetchWithTimeout("https://api.anthropic.com/v1/messages", {
81
+ method: "POST",
82
+ headers: {
83
+ "x-api-key": apiKey,
84
+ "anthropic-version": "2023-06-01",
85
+ "content-type": "application/json",
86
+ },
87
+ body: JSON.stringify({
88
+ model,
89
+ max_tokens: 280,
90
+ temperature: 0.7,
91
+ system: SPICY_SYSTEM,
92
+ messages: [{ role: "user", content: spicyPrompt(trace) }],
93
+ }),
94
+ }, options.timeoutMs ?? 15_000);
95
+ const json = (await response.json());
96
+ if (!response.ok)
97
+ throw new Error(json.error?.message ?? `anthropic ${response.status}`);
98
+ return json.content?.map((part) => part.text ?? "").join("") ?? "";
99
+ }
100
+ const SPICY_SYSTEM = "You recap an AI agent trace in 4-6 sharp sentences. Name the tools. Call out the turning point and any dumb or failed call. No markdown headings, no bullet lists, no preamble.";
101
+ function spicyPrompt(trace) {
102
+ const compact = trace.steps.slice(0, 40).map((step) => ({
103
+ n: step.index,
104
+ kind: step.kind,
105
+ name: step.name,
106
+ text: redact(truncate(collapseWs(step.error ?? step.content ?? compactJson(step.args ?? step.result)), 400)),
107
+ }));
108
+ return JSON.stringify({
109
+ format: trace.format,
110
+ stats: trace.stats,
111
+ steps: compact,
112
+ });
113
+ }
114
+ function redact(text) {
115
+ return text.replace(/(api[_-]?key|token|secret|password|authorization)\s*[:=]\s*["']?[^"'\s,]+/gi, "$1=***");
116
+ }
117
+ function firstContent(steps, kind) {
118
+ return steps.find((step) => step.kind === kind)?.content;
119
+ }
120
+ function lastContent(steps, kind) {
121
+ for (let i = steps.length - 1; i >= 0; i -= 1) {
122
+ const step = steps[i];
123
+ if (step?.kind === kind && step.content)
124
+ return step.content;
125
+ }
126
+ return undefined;
127
+ }
128
+ function unique(items) {
129
+ return [...new Set(items.filter(Boolean))];
130
+ }
131
+ function quote(text) {
132
+ return `“${text}”`;
133
+ }
134
+ async function fetchWithTimeout(url, init, timeoutMs) {
135
+ const controller = new AbortController();
136
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
137
+ try {
138
+ return await fetch(url, { ...init, signal: controller.signal });
139
+ }
140
+ finally {
141
+ clearTimeout(timer);
142
+ }
143
+ }
144
+ //# sourceMappingURL=spicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spicy.js","sourceRoot":"","sources":["../../src/render/spicy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { RenderOptions, Trace } from "../types.js";
2
+ export declare function renderTimeline(trace: Trace, options?: RenderOptions): string;
3
+ export declare function summaryLine(trace: Trace, dot?: string): string;
4
+ //# sourceMappingURL=timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../src/render/timeline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAY,KAAK,EAAa,MAAM,aAAa,CAAC;AAK7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CA8ChF;AAaD,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,SAAM,GAAG,MAAM,CAY3D"}