agent-replay 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 (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +113 -0
  3. package/bin/agent-replay.js +20 -0
  4. package/build/client/_app/immutable/assets/0.D9-tUsfl.css +1 -0
  5. package/build/client/_app/immutable/assets/0.D9-tUsfl.css.br +0 -0
  6. package/build/client/_app/immutable/assets/0.D9-tUsfl.css.gz +0 -0
  7. package/build/client/_app/immutable/assets/2.Ch4de4ty.css +1 -0
  8. package/build/client/_app/immutable/assets/2.Ch4de4ty.css.br +0 -0
  9. package/build/client/_app/immutable/assets/2.Ch4de4ty.css.gz +0 -0
  10. package/build/client/_app/immutable/assets/3.BP1aEJ1A.css +1 -0
  11. package/build/client/_app/immutable/assets/3.BP1aEJ1A.css.br +0 -0
  12. package/build/client/_app/immutable/assets/3.BP1aEJ1A.css.gz +0 -0
  13. package/build/client/_app/immutable/chunks/8LyLqy0e.js +1 -0
  14. package/build/client/_app/immutable/chunks/8LyLqy0e.js.br +3 -0
  15. package/build/client/_app/immutable/chunks/8LyLqy0e.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/BmaMsIzI.js +3 -0
  17. package/build/client/_app/immutable/chunks/BmaMsIzI.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/BmaMsIzI.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/BoUXsunA.js +1 -0
  20. package/build/client/_app/immutable/chunks/BoUXsunA.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/BoUXsunA.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/CCa20sJM.js +1 -0
  23. package/build/client/_app/immutable/chunks/CCa20sJM.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/CCa20sJM.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/CP-o74wi.js +2 -0
  26. package/build/client/_app/immutable/chunks/CP-o74wi.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/CP-o74wi.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/CZWwZlGk.js +1 -0
  29. package/build/client/_app/immutable/chunks/CZWwZlGk.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/CZWwZlGk.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/D6SnDtAs.js +1 -0
  32. package/build/client/_app/immutable/chunks/D6SnDtAs.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/D6SnDtAs.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/DApgqo7x.js +1 -0
  35. package/build/client/_app/immutable/chunks/DApgqo7x.js.br +0 -0
  36. package/build/client/_app/immutable/chunks/DApgqo7x.js.gz +0 -0
  37. package/build/client/_app/immutable/chunks/DCcb0kkP.js +1 -0
  38. package/build/client/_app/immutable/chunks/DCcb0kkP.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/DCcb0kkP.js.gz +0 -0
  40. package/build/client/_app/immutable/entry/app.CelDjTDX.js +2 -0
  41. package/build/client/_app/immutable/entry/app.CelDjTDX.js.br +0 -0
  42. package/build/client/_app/immutable/entry/app.CelDjTDX.js.gz +0 -0
  43. package/build/client/_app/immutable/entry/start.Bo8U6P_2.js +1 -0
  44. package/build/client/_app/immutable/entry/start.Bo8U6P_2.js.br +2 -0
  45. package/build/client/_app/immutable/entry/start.Bo8U6P_2.js.gz +0 -0
  46. package/build/client/_app/immutable/nodes/0.DdgnJbSm.js +1 -0
  47. package/build/client/_app/immutable/nodes/0.DdgnJbSm.js.br +0 -0
  48. package/build/client/_app/immutable/nodes/0.DdgnJbSm.js.gz +0 -0
  49. package/build/client/_app/immutable/nodes/1.DUCL1Cc_.js +1 -0
  50. package/build/client/_app/immutable/nodes/1.DUCL1Cc_.js.br +0 -0
  51. package/build/client/_app/immutable/nodes/1.DUCL1Cc_.js.gz +0 -0
  52. package/build/client/_app/immutable/nodes/2.FNRc_Nvw.js +1 -0
  53. package/build/client/_app/immutable/nodes/2.FNRc_Nvw.js.br +0 -0
  54. package/build/client/_app/immutable/nodes/2.FNRc_Nvw.js.gz +0 -0
  55. package/build/client/_app/immutable/nodes/3.CaEmUkA2.js +29 -0
  56. package/build/client/_app/immutable/nodes/3.CaEmUkA2.js.br +0 -0
  57. package/build/client/_app/immutable/nodes/3.CaEmUkA2.js.gz +0 -0
  58. package/build/client/_app/version.json +1 -0
  59. package/build/client/_app/version.json.br +0 -0
  60. package/build/client/_app/version.json.gz +0 -0
  61. package/build/client/favicon.svg +13 -0
  62. package/build/client/favicon.svg.br +0 -0
  63. package/build/client/favicon.svg.gz +0 -0
  64. package/build/client/robots.txt +3 -0
  65. package/build/client/screenshot.png +0 -0
  66. package/build/env.js +94 -0
  67. package/build/handler.js +1494 -0
  68. package/build/index.js +345 -0
  69. package/build/server/chunks/0-CkGitm9W.js +9 -0
  70. package/build/server/chunks/0-CkGitm9W.js.map +1 -0
  71. package/build/server/chunks/1-BU8Hl3FY.js +9 -0
  72. package/build/server/chunks/1-BU8Hl3FY.js.map +1 -0
  73. package/build/server/chunks/2-DenZJmTh.js +27 -0
  74. package/build/server/chunks/2-DenZJmTh.js.map +1 -0
  75. package/build/server/chunks/3-Df2VKXDy.js +73 -0
  76. package/build/server/chunks/3-Df2VKXDy.js.map +1 -0
  77. package/build/server/chunks/_layout.svelte-BK7oCPlN.js +26 -0
  78. package/build/server/chunks/_layout.svelte-BK7oCPlN.js.map +1 -0
  79. package/build/server/chunks/_page.svelte-BMqbzglq.js +178 -0
  80. package/build/server/chunks/_page.svelte-BMqbzglq.js.map +1 -0
  81. package/build/server/chunks/_page.svelte-C2kNC2pi.js +504 -0
  82. package/build/server/chunks/_page.svelte-C2kNC2pi.js.map +1 -0
  83. package/build/server/chunks/context-JUYyv6NC.js +74 -0
  84. package/build/server/chunks/context-JUYyv6NC.js.map +1 -0
  85. package/build/server/chunks/error.svelte-Epasb48G.js +46 -0
  86. package/build/server/chunks/error.svelte-Epasb48G.js.map +1 -0
  87. package/build/server/chunks/escaping-CqgfEcN3.js +19 -0
  88. package/build/server/chunks/escaping-CqgfEcN3.js.map +1 -0
  89. package/build/server/chunks/exports-CURVw3-F.js +303 -0
  90. package/build/server/chunks/exports-CURVw3-F.js.map +1 -0
  91. package/build/server/chunks/format-dOzJq-yD.js +59 -0
  92. package/build/server/chunks/format-dOzJq-yD.js.map +1 -0
  93. package/build/server/chunks/index-C0L7m6Jv.js +1497 -0
  94. package/build/server/chunks/index-C0L7m6Jv.js.map +1 -0
  95. package/build/server/chunks/index-CoD1IJuy.js +190 -0
  96. package/build/server/chunks/index-CoD1IJuy.js.map +1 -0
  97. package/build/server/chunks/index2-f44F-4KW.js +614 -0
  98. package/build/server/chunks/index2-f44F-4KW.js.map +1 -0
  99. package/build/server/chunks/shared-server-DaWdgxVh.js +11 -0
  100. package/build/server/chunks/shared-server-DaWdgxVh.js.map +1 -0
  101. package/build/server/index.js +8152 -0
  102. package/build/server/index.js.map +1 -0
  103. package/build/server/manifest.js +54 -0
  104. package/build/server/manifest.js.map +1 -0
  105. package/build/shims.js +32 -0
  106. package/package.json +71 -0
  107. package/static/favicon.svg +13 -0
  108. package/static/robots.txt +3 -0
  109. package/static/screenshot.png +0 -0
@@ -0,0 +1,504 @@
1
+ import { N as head, Q as attr_class, O as attr, V as attr_style, P as ensure_array_like, X as bind_props, T as stringify } from './index-C0L7m6Jv.js';
2
+ import { s as shortModel, a as formatDurationBetween, b as formatNumber, c as formatCostWithPlan, t as truncate } from './format-dOzJq-yD.js';
3
+ import { e as escape_html } from './escaping-CqgfEcN3.js';
4
+ import { createPatch } from 'diff';
5
+ import './context-JUYyv6NC.js';
6
+
7
+ function EventCard($$renderer, $$props) {
8
+ $$renderer.component(($$renderer2) => {
9
+ let { event, selected = false } = $$props;
10
+ const toolColors = {
11
+ Bash: "border-green-500/50 bg-green-500/5",
12
+ Read: "border-blue-500/50 bg-blue-500/5",
13
+ Write: "border-amber-500/50 bg-amber-500/5",
14
+ Edit: "border-amber-500/50 bg-amber-500/5",
15
+ Glob: "border-purple-500/50 bg-purple-500/5",
16
+ Grep: "border-purple-500/50 bg-purple-500/5",
17
+ Task: "border-cyan-500/50 bg-cyan-500/5",
18
+ WebFetch: "border-indigo-500/50 bg-indigo-500/5",
19
+ WebSearch: "border-indigo-500/50 bg-indigo-500/5"
20
+ };
21
+ const dotColors = {
22
+ Bash: "bg-green-500",
23
+ Read: "bg-blue-500",
24
+ Write: "bg-amber-500",
25
+ Edit: "bg-amber-500",
26
+ Glob: "bg-purple-500",
27
+ Grep: "bg-purple-500",
28
+ Task: "bg-cyan-500",
29
+ WebFetch: "bg-indigo-500",
30
+ WebSearch: "bg-indigo-500"
31
+ };
32
+ const pulseColors = {
33
+ Bash: "text-green-500",
34
+ Read: "text-blue-500",
35
+ Write: "text-amber-500",
36
+ Edit: "text-amber-500",
37
+ Glob: "text-purple-500",
38
+ Grep: "text-purple-500",
39
+ Task: "text-cyan-500",
40
+ WebFetch: "text-indigo-500",
41
+ WebSearch: "text-indigo-500"
42
+ };
43
+ function getSummary(event2) {
44
+ const d = event2.data;
45
+ switch (d.eventType) {
46
+ case "user_message":
47
+ return truncate(d.text, 80);
48
+ case "assistant_text":
49
+ return truncate(d.text, 80);
50
+ case "thinking":
51
+ return truncate(d.thinking, 60);
52
+ case "tool_call": {
53
+ const input = d.input;
54
+ if (d.toolName === "Bash") return truncate(String(input.command || ""), 60);
55
+ if (d.toolName === "Read") return truncate(String(input.file_path || ""), 60);
56
+ if (d.toolName === "Edit") return truncate(String(input.file_path || ""), 60);
57
+ if (d.toolName === "Write") return truncate(String(input.file_path || ""), 60);
58
+ if (d.toolName === "Glob") return truncate(String(input.pattern || ""), 60);
59
+ if (d.toolName === "Grep") return truncate(String(input.pattern || ""), 60);
60
+ if (d.toolName === "Task") return truncate(String(input.description || ""), 60);
61
+ return d.toolName;
62
+ }
63
+ case "system":
64
+ return d.subtype;
65
+ case "compact_boundary":
66
+ return "Context compacted";
67
+ default:
68
+ return "";
69
+ }
70
+ }
71
+ function getLabel(event2) {
72
+ const d = event2.data;
73
+ switch (d.eventType) {
74
+ case "user_message":
75
+ return "User";
76
+ case "assistant_text":
77
+ return "Claude";
78
+ case "thinking":
79
+ return "Thinking";
80
+ case "tool_call":
81
+ return d.toolName;
82
+ case "system":
83
+ return "System";
84
+ case "compact_boundary":
85
+ return "Compact";
86
+ default:
87
+ return "";
88
+ }
89
+ }
90
+ function getDotColor(event2) {
91
+ const d = event2.data;
92
+ if (d.eventType === "user_message") return "bg-sky-500";
93
+ if (d.eventType === "assistant_text") return "bg-surface-400";
94
+ if (d.eventType === "thinking") return "bg-yellow-500";
95
+ if (d.eventType === "tool_call") return dotColors[d.toolName] || "bg-surface-500";
96
+ if (d.eventType === "system") return "bg-surface-600";
97
+ if (d.eventType === "compact_boundary") return "bg-orange-500";
98
+ return "bg-surface-600";
99
+ }
100
+ function getPulseColor(event2) {
101
+ const d = event2.data;
102
+ if (d.eventType === "user_message") return "text-sky-500";
103
+ if (d.eventType === "assistant_text") return "text-surface-400";
104
+ if (d.eventType === "thinking") return "text-yellow-500";
105
+ if (d.eventType === "tool_call") return pulseColors[d.toolName] || "text-surface-500";
106
+ if (d.eventType === "compact_boundary") return "text-orange-500";
107
+ return "text-surface-600";
108
+ }
109
+ function getBorderColor(event2) {
110
+ const d = event2.data;
111
+ if (d.eventType === "user_message") return "border-sky-500/50 bg-sky-500/5";
112
+ if (d.eventType === "assistant_text") return "border-surface-600 bg-surface-800/50";
113
+ if (d.eventType === "thinking") return "border-yellow-500/30 bg-yellow-500/5";
114
+ if (d.eventType === "tool_call") return toolColors[d.toolName] || "border-surface-600 bg-surface-800/50";
115
+ if (d.eventType === "compact_boundary") return "border-orange-500/30 bg-orange-500/5";
116
+ return "border-surface-700 bg-surface-800/50";
117
+ }
118
+ function hasError(event2) {
119
+ return event2.data.eventType === "tool_call" && !!event2.data.result?.isError;
120
+ }
121
+ $$renderer2.push(`<button class="w-full text-left relative pl-6 group"><div${attr_class(`absolute left-0 top-3 w-3 h-3 rounded-full ${stringify(getDotColor(event))} ring-2 ring-surface-950 z-10 ${stringify(selected ? "scale-125" : "group-hover:scale-110")} transition-transform`, "svelte-1z0u85a")}></div> `);
122
+ if (selected) {
123
+ $$renderer2.push("<!--[-->");
124
+ $$renderer2.push(`<div${attr_class(`absolute left-0 top-3 w-3 h-3 rounded-full z-[9] ${stringify(getPulseColor(event))} animate-pulse-ring`, "svelte-1z0u85a")}></div>`);
125
+ } else {
126
+ $$renderer2.push("<!--[!-->");
127
+ }
128
+ $$renderer2.push(`<!--]--> <div${attr_class(
129
+ `ml-2 px-3 py-2 rounded-md border transition-all text-sm ${stringify(getBorderColor(event))} ${stringify(selected ? "ring-1 ring-surface-500 !bg-surface-800" : "hover:bg-surface-800/80")} ${stringify(hasError(event) ? "!border-red-500/50" : "")}`,
130
+ "svelte-1z0u85a"
131
+ )}><div class="flex items-center gap-2 mb-0.5"><span class="text-xs font-medium text-surface-400">${escape_html(getLabel(event))}</span> `);
132
+ if (hasError(event)) {
133
+ $$renderer2.push("<!--[-->");
134
+ $$renderer2.push(`<span class="text-xs text-red-400">error</span>`);
135
+ } else {
136
+ $$renderer2.push("<!--[!-->");
137
+ }
138
+ $$renderer2.push(`<!--]--></div> <div class="text-surface-300 text-xs leading-relaxed truncate">${escape_html(getSummary(event))}</div></div></button>`);
139
+ });
140
+ }
141
+ function Timeline($$renderer, $$props) {
142
+ $$renderer.component(($$renderer2) => {
143
+ let { events, selectedIndex = 0, onselect } = $$props;
144
+ function scrollToEvent(index) {
145
+ return;
146
+ }
147
+ $$renderer2.push(`<div class="relative"><div class="absolute left-[5px] top-0 bottom-0 w-px bg-surface-800"></div> <div class="space-y-1"><!--[-->`);
148
+ const each_array = ensure_array_like(events);
149
+ for (let i = 0, $$length = each_array.length; i < $$length; i++) {
150
+ let event = each_array[i];
151
+ $$renderer2.push(`<div${attr("data-event-index", i)}>`);
152
+ EventCard($$renderer2, {
153
+ event,
154
+ selected: i === selectedIndex
155
+ });
156
+ $$renderer2.push(`<!----></div>`);
157
+ }
158
+ $$renderer2.push(`<!--]--></div></div>`);
159
+ bind_props($$props, { scrollToEvent });
160
+ });
161
+ }
162
+ function DiffView($$renderer, $$props) {
163
+ $$renderer.component(($$renderer2) => {
164
+ let { filePath, oldString, newString } = $$props;
165
+ let patch = createPatch(filePath, oldString, newString, "", "", { context: 3 });
166
+ let lines = (() => {
167
+ const result = [];
168
+ for (const line of patch.split("\n")) {
169
+ if (line.startsWith("@@")) {
170
+ result.push({ type: "header", content: line });
171
+ } else if (line.startsWith("+") && !line.startsWith("+++")) {
172
+ result.push({ type: "add", content: line.slice(1) });
173
+ } else if (line.startsWith("-") && !line.startsWith("---")) {
174
+ result.push({ type: "remove", content: line.slice(1) });
175
+ } else if (line.startsWith(" ")) {
176
+ result.push({ type: "context", content: line.slice(1) });
177
+ }
178
+ }
179
+ return result;
180
+ })();
181
+ $$renderer2.push(`<div class="rounded-md border border-surface-800 overflow-hidden"><div class="bg-surface-900 px-3 py-1.5 border-b border-surface-800 flex items-center gap-2"><span class="text-amber-400 text-xs">${escape_html(filePath)}</span></div> <div class="overflow-x-auto text-xs font-mono"><!--[-->`);
182
+ const each_array = ensure_array_like(lines);
183
+ for (let i = 0, $$length = each_array.length; i < $$length; i++) {
184
+ let line = each_array[i];
185
+ $$renderer2.push(`<div${attr_class(`px-3 py-0.5 whitespace-pre ${stringify(line.type === "add" ? "bg-green-500/10 text-green-300" : "")} ${stringify(line.type === "remove" ? "bg-red-500/10 text-red-300" : "")} ${stringify(line.type === "context" ? "text-surface-400" : "")} ${stringify(line.type === "header" ? "bg-surface-800 text-purple-400 py-1" : "")}`)}>`);
186
+ if (line.type === "add") {
187
+ $$renderer2.push("<!--[-->");
188
+ $$renderer2.push(`+`);
189
+ } else if (line.type === "remove") {
190
+ $$renderer2.push("<!--[1-->");
191
+ $$renderer2.push(`-`);
192
+ } else if (line.type === "context") {
193
+ $$renderer2.push("<!--[2-->");
194
+ $$renderer2.push(` `);
195
+ } else {
196
+ $$renderer2.push("<!--[!-->");
197
+ }
198
+ $$renderer2.push(`<!--]-->${escape_html(line.content)}</div>`);
199
+ }
200
+ $$renderer2.push(`<!--]--></div></div>`);
201
+ });
202
+ }
203
+ function BashOutput($$renderer, $$props) {
204
+ $$renderer.component(($$renderer2) => {
205
+ let { command, description, output, isError } = $$props;
206
+ $$renderer2.push(`<div class="rounded-md border border-surface-800 overflow-hidden"><div class="bg-surface-900 px-3 py-1.5 border-b border-surface-800 flex items-center gap-2"><div class="flex gap-1"><div class="w-2.5 h-2.5 rounded-full bg-red-500/60"></div> <div class="w-2.5 h-2.5 rounded-full bg-yellow-500/60"></div> <div class="w-2.5 h-2.5 rounded-full bg-green-500/60"></div></div> `);
207
+ if (description) {
208
+ $$renderer2.push("<!--[-->");
209
+ $$renderer2.push(`<span class="text-surface-500 text-xs ml-1">${escape_html(description)}</span>`);
210
+ } else {
211
+ $$renderer2.push("<!--[!-->");
212
+ }
213
+ $$renderer2.push(`<!--]--></div> <div class="bg-surface-950 px-3 py-2 font-mono text-xs"><span class="text-green-400">$</span> <span class="text-surface-200 ml-2 whitespace-pre-wrap">${escape_html(command)}</span></div> `);
214
+ if (output) {
215
+ $$renderer2.push("<!--[-->");
216
+ $$renderer2.push(`<button class="w-full text-left px-3 py-1 bg-surface-900/50 text-surface-500 text-xs hover:text-surface-400 border-t border-surface-800">${escape_html("▾")} Output (${escape_html(output.split("\n").length)} lines)</button> `);
217
+ {
218
+ $$renderer2.push("<!--[-->");
219
+ $$renderer2.push(`<div${attr_class(`bg-surface-950 px-3 py-2 font-mono text-xs max-h-96 overflow-y-auto ${stringify(isError ? "text-red-300" : "text-surface-400")}`)}><pre class="whitespace-pre-wrap">${escape_html(output)}</pre></div>`);
220
+ }
221
+ $$renderer2.push(`<!--]-->`);
222
+ } else {
223
+ $$renderer2.push("<!--[!-->");
224
+ }
225
+ $$renderer2.push(`<!--]--></div>`);
226
+ });
227
+ }
228
+ function CodeBlock($$renderer, $$props) {
229
+ $$renderer.component(($$renderer2) => {
230
+ let { content, maxHeight = "24rem" } = $$props;
231
+ let lines = content.split("\n");
232
+ $$renderer2.push(`<div class="rounded-md border border-surface-800 overflow-hidden"><div class="overflow-x-auto font-mono text-xs"${attr_style(`max-height: ${stringify(maxHeight)}; overflow-y: auto;`)}><table class="w-full"><tbody><!--[-->`);
233
+ const each_array = ensure_array_like(lines);
234
+ for (let i = 0, $$length = each_array.length; i < $$length; i++) {
235
+ let line = each_array[i];
236
+ $$renderer2.push(`<tr class="hover:bg-surface-800/30"><td class="text-surface-600 text-right px-2 py-0 select-none w-1 whitespace-nowrap border-r border-surface-800">${escape_html(i + 1)}</td><td class="text-surface-300 px-3 py-0 whitespace-pre">${escape_html(line)}</td></tr>`);
237
+ }
238
+ $$renderer2.push(`<!--]--></tbody></table></div></div>`);
239
+ });
240
+ }
241
+ function DetailPanel($$renderer, $$props) {
242
+ $$renderer.component(($$renderer2) => {
243
+ let { event } = $$props;
244
+ if (!event) {
245
+ $$renderer2.push("<!--[-->");
246
+ $$renderer2.push(`<div class="flex items-center justify-center h-full text-surface-600 text-sm">Select an event to view details</div>`);
247
+ } else {
248
+ $$renderer2.push("<!--[!-->");
249
+ $$renderer2.push(`<div class="h-full overflow-y-auto p-4 space-y-4">`);
250
+ if (event.data.eventType === "user_message") {
251
+ $$renderer2.push("<!--[-->");
252
+ $$renderer2.push(`<div><h3 class="text-xs font-medium text-sky-400 mb-3 uppercase tracking-wider">User Message</h3> <div class="text-surface-200 text-sm whitespace-pre-wrap leading-relaxed">${escape_html(event.data.text)}</div></div>`);
253
+ } else if (event.data.eventType === "assistant_text") {
254
+ $$renderer2.push("<!--[1-->");
255
+ $$renderer2.push(`<div><h3 class="text-xs font-medium text-surface-400 mb-3 uppercase tracking-wider">Claude</h3> <div class="text-surface-200 text-sm whitespace-pre-wrap leading-relaxed">${escape_html(event.data.text)}</div></div>`);
256
+ } else if (event.data.eventType === "thinking") {
257
+ $$renderer2.push("<!--[2-->");
258
+ $$renderer2.push(`<div><h3 class="text-xs font-medium text-yellow-400 mb-3 uppercase tracking-wider">Thinking</h3> <div class="text-surface-400 text-sm whitespace-pre-wrap leading-relaxed italic">${escape_html(event.data.thinking)}</div></div>`);
259
+ } else if (event.data.eventType === "tool_call") {
260
+ $$renderer2.push("<!--[3-->");
261
+ const tc = event.data;
262
+ $$renderer2.push(`<div><h3 class="text-xs font-medium text-surface-400 mb-3 uppercase tracking-wider">${escape_html(tc.toolName)} `);
263
+ if (tc.result?.isError) {
264
+ $$renderer2.push("<!--[-->");
265
+ $$renderer2.push(`<span class="text-red-400 ml-2">Error</span>`);
266
+ } else {
267
+ $$renderer2.push("<!--[!-->");
268
+ }
269
+ $$renderer2.push(`<!--]--></h3> `);
270
+ if (tc.toolName === "Edit") {
271
+ $$renderer2.push("<!--[-->");
272
+ DiffView($$renderer2, {
273
+ filePath: String(tc.input.file_path || ""),
274
+ oldString: String(tc.input.old_string || ""),
275
+ newString: String(tc.input.new_string || "")
276
+ });
277
+ } else if (tc.toolName === "Bash") {
278
+ $$renderer2.push("<!--[1-->");
279
+ BashOutput($$renderer2, {
280
+ command: String(tc.input.command || ""),
281
+ description: String(tc.input.description || ""),
282
+ output: tc.result?.content || "",
283
+ isError: tc.result?.isError || false
284
+ });
285
+ } else if (tc.toolName === "Read") {
286
+ $$renderer2.push("<!--[2-->");
287
+ $$renderer2.push(`<div class="mb-2"><span class="text-blue-400 text-xs">${escape_html(tc.input.file_path)}</span> `);
288
+ if (tc.input.offset) {
289
+ $$renderer2.push("<!--[-->");
290
+ $$renderer2.push(`<span class="text-surface-500 text-xs ml-2">from line ${escape_html(tc.input.offset)}</span>`);
291
+ } else {
292
+ $$renderer2.push("<!--[!-->");
293
+ }
294
+ $$renderer2.push(`<!--]--></div> `);
295
+ if (tc.result?.isError) {
296
+ $$renderer2.push("<!--[-->");
297
+ $$renderer2.push(`<div class="rounded-md border border-red-500/30 bg-red-500/5 px-3 py-2"><p class="text-red-400 text-xs font-medium mb-1">Tool returned an error during this session</p> <pre class="text-red-300/80 text-xs whitespace-pre-wrap">${escape_html(tc.result.content)}</pre></div>`);
298
+ } else {
299
+ $$renderer2.push("<!--[!-->");
300
+ CodeBlock($$renderer2, { content: tc.result?.content || "No content" });
301
+ }
302
+ $$renderer2.push(`<!--]-->`);
303
+ } else if (tc.toolName === "Write") {
304
+ $$renderer2.push("<!--[3-->");
305
+ $$renderer2.push(`<div class="mb-2"><span class="text-amber-400 text-xs">${escape_html(tc.input.file_path)}</span></div> `);
306
+ CodeBlock($$renderer2, { content: String(tc.input.content || "") });
307
+ $$renderer2.push(`<!---->`);
308
+ } else if (tc.toolName === "Glob") {
309
+ $$renderer2.push("<!--[4-->");
310
+ $$renderer2.push(`<div class="mb-2"><span class="text-purple-400 text-xs">Pattern: ${escape_html(tc.input.pattern)}</span> `);
311
+ if (tc.input.path) {
312
+ $$renderer2.push("<!--[-->");
313
+ $$renderer2.push(`<span class="text-surface-500 text-xs ml-2">in ${escape_html(tc.input.path)}</span>`);
314
+ } else {
315
+ $$renderer2.push("<!--[!-->");
316
+ }
317
+ $$renderer2.push(`<!--]--></div> `);
318
+ CodeBlock($$renderer2, { content: tc.result?.content || "No results" });
319
+ $$renderer2.push(`<!---->`);
320
+ } else if (tc.toolName === "Grep") {
321
+ $$renderer2.push("<!--[5-->");
322
+ $$renderer2.push(`<div class="mb-2"><span class="text-purple-400 text-xs">/${escape_html(tc.input.pattern)}/</span> `);
323
+ if (tc.input.path) {
324
+ $$renderer2.push("<!--[-->");
325
+ $$renderer2.push(`<span class="text-surface-500 text-xs ml-2">in ${escape_html(tc.input.path)}</span>`);
326
+ } else {
327
+ $$renderer2.push("<!--[!-->");
328
+ }
329
+ $$renderer2.push(`<!--]--></div> `);
330
+ CodeBlock($$renderer2, { content: tc.result?.content || "No results" });
331
+ $$renderer2.push(`<!---->`);
332
+ } else if (tc.toolName === "Task") {
333
+ $$renderer2.push("<!--[6-->");
334
+ $$renderer2.push(`<div class="space-y-2"><div class="text-surface-300 text-sm"><span class="text-cyan-400">Description:</span> ${escape_html(tc.input.description || "")}</div> `);
335
+ if (tc.input.prompt) {
336
+ $$renderer2.push("<!--[-->");
337
+ $$renderer2.push(`<div class="text-surface-400 text-xs whitespace-pre-wrap bg-surface-900 rounded p-3 border border-surface-800">${escape_html(tc.input.prompt)}</div>`);
338
+ } else {
339
+ $$renderer2.push("<!--[!-->");
340
+ }
341
+ $$renderer2.push(`<!--]--> `);
342
+ if (tc.result) {
343
+ $$renderer2.push("<!--[-->");
344
+ $$renderer2.push(`<div class="mt-3"><span class="text-xs text-surface-500">Result:</span> `);
345
+ CodeBlock($$renderer2, { content: tc.result.content });
346
+ $$renderer2.push(`<!----></div>`);
347
+ } else {
348
+ $$renderer2.push("<!--[!-->");
349
+ }
350
+ $$renderer2.push(`<!--]--></div>`);
351
+ } else {
352
+ $$renderer2.push("<!--[!-->");
353
+ $$renderer2.push(`<div class="space-y-3"><div class="text-xs text-surface-500">Input</div> <pre class="text-xs text-surface-300 bg-surface-900 rounded p-3 border border-surface-800 overflow-x-auto">${escape_html(JSON.stringify(tc.input, null, 2))}</pre> `);
354
+ if (tc.result?.isError) {
355
+ $$renderer2.push("<!--[-->");
356
+ $$renderer2.push(`<div class="text-xs text-surface-500">Result</div> <div class="rounded-md border border-red-500/30 bg-red-500/5 px-3 py-2"><p class="text-red-400 text-xs font-medium mb-1">Tool returned an error during this session</p> <pre class="text-red-300/80 text-xs whitespace-pre-wrap">${escape_html(tc.result.content)}</pre></div>`);
357
+ } else if (tc.result) {
358
+ $$renderer2.push("<!--[1-->");
359
+ $$renderer2.push(`<div class="text-xs text-surface-500">Result</div> `);
360
+ CodeBlock($$renderer2, { content: tc.result.content });
361
+ $$renderer2.push(`<!---->`);
362
+ } else {
363
+ $$renderer2.push("<!--[!-->");
364
+ }
365
+ $$renderer2.push(`<!--]--></div>`);
366
+ }
367
+ $$renderer2.push(`<!--]--></div>`);
368
+ } else if (event.data.eventType === "system") {
369
+ $$renderer2.push("<!--[4-->");
370
+ $$renderer2.push(`<div><h3 class="text-xs font-medium text-surface-500 mb-3 uppercase tracking-wider">System</h3> <p class="text-surface-400 text-sm">${escape_html(event.data.subtype)}</p> `);
371
+ if (event.data.durationMs) {
372
+ $$renderer2.push("<!--[-->");
373
+ $$renderer2.push(`<p class="text-surface-500 text-xs mt-1">Duration: ${escape_html((event.data.durationMs / 1e3).toFixed(1))}s</p>`);
374
+ } else {
375
+ $$renderer2.push("<!--[!-->");
376
+ }
377
+ $$renderer2.push(`<!--]--></div>`);
378
+ } else if (event.data.eventType === "compact_boundary") {
379
+ $$renderer2.push("<!--[5-->");
380
+ $$renderer2.push(`<div class="text-center py-8"><div class="text-orange-400 text-sm font-medium">Context Compacted</div> <p class="text-surface-500 text-xs mt-2">The conversation was summarized to fit the context window</p></div>`);
381
+ } else {
382
+ $$renderer2.push("<!--[!-->");
383
+ }
384
+ $$renderer2.push(`<!--]--></div>`);
385
+ }
386
+ $$renderer2.push(`<!--]-->`);
387
+ });
388
+ }
389
+ function PlaybackControls($$renderer, $$props) {
390
+ $$renderer.component(($$renderer2) => {
391
+ let {
392
+ currentIndex = 0,
393
+ totalEvents = 0,
394
+ isPlaying = false,
395
+ speed = 1,
396
+ onspeedchange
397
+ } = $$props;
398
+ const speeds = [1, 2, 4, 8];
399
+ let progress = totalEvents > 1 ? currentIndex / (totalEvents - 1) * 100 : 0;
400
+ $$renderer2.push(`<div class="playback-controls flex items-center gap-3"><button${attr("disabled", currentIndex <= 0, true)} class="text-surface-400 hover:text-surface-200 disabled:text-surface-700 disabled:cursor-not-allowed transition-colors p-1 min-w-[44px] min-h-[44px] sm:min-w-0 sm:min-h-0 flex items-center justify-center" title="Previous (Left Arrow)">◀</button> <button class="text-surface-200 hover:text-white transition-colors p-1 text-lg min-w-[44px] min-h-[44px] sm:min-w-0 sm:min-h-0 flex items-center justify-center" title="Play/Pause (Space)">`);
401
+ if (isPlaying) {
402
+ $$renderer2.push("<!--[-->");
403
+ $$renderer2.push(`❚❚`);
404
+ } else {
405
+ $$renderer2.push("<!--[!-->");
406
+ $$renderer2.push(`▶`);
407
+ }
408
+ $$renderer2.push(`<!--]--></button> <button${attr("disabled", currentIndex >= totalEvents - 1, true)} class="text-surface-400 hover:text-surface-200 disabled:text-surface-700 disabled:cursor-not-allowed transition-colors p-1 min-w-[44px] min-h-[44px] sm:min-w-0 sm:min-h-0 flex items-center justify-center" title="Next (Right Arrow)">▶</button> <button class="flex-1 h-1.5 bg-surface-800 rounded-full relative cursor-pointer group" aria-label="Seek to position"><div class="absolute inset-y-0 left-0 bg-surface-500 group-hover:bg-surface-400 rounded-full transition-all"${attr_style(`width: ${stringify(progress)}%`)}></div> <div class="absolute top-1/2 -translate-y-1/2 w-3 h-3 bg-surface-300 rounded-full opacity-0 group-hover:opacity-100 transition-opacity"${attr_style(`left: ${stringify(progress)}%`)}></div></button> <span class="counter text-surface-500 text-xs tabular-nums min-w-[4rem] text-right svelte-167mial"><span class="counter-full svelte-167mial">${escape_html(currentIndex + 1)} / ${escape_html(totalEvents)}</span> <span class="counter-short hidden svelte-167mial">${escape_html(currentIndex + 1)}/${escape_html(totalEvents)}</span></span> <div class="speed-buttons flex items-center gap-1 svelte-167mial"><!--[-->`);
409
+ const each_array = ensure_array_like(speeds);
410
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
411
+ let s = each_array[$$index];
412
+ $$renderer2.push(`<button${attr_class(`text-xs px-1.5 py-0.5 rounded transition-colors ${stringify(speed === s ? "bg-surface-700 text-surface-200" : "text-surface-500 hover:text-surface-300")}`)}>${escape_html(s)}x</button>`);
413
+ }
414
+ $$renderer2.push(`<!--]--></div> <div class="speed-select hidden svelte-167mial">`);
415
+ $$renderer2.select(
416
+ {
417
+ value: speed,
418
+ onchange: (e) => onspeedchange(Number(e.target.value)),
419
+ class: "bg-surface-800 border border-surface-700 rounded text-xs text-surface-300 px-1.5 py-1 min-h-[44px]"
420
+ },
421
+ ($$renderer3) => {
422
+ $$renderer3.push(`<!--[-->`);
423
+ const each_array_1 = ensure_array_like(speeds);
424
+ for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
425
+ let s = each_array_1[$$index_1];
426
+ $$renderer3.option({ value: s }, ($$renderer4) => {
427
+ $$renderer4.push(`${escape_html(s)}x`);
428
+ });
429
+ }
430
+ $$renderer3.push(`<!--]-->`);
431
+ }
432
+ );
433
+ $$renderer2.push(`</div></div>`);
434
+ });
435
+ }
436
+ function StatsBar($$renderer, $$props) {
437
+ $$renderer.component(($$renderer2) => {
438
+ let { summary } = $$props;
439
+ function getModelColor(model) {
440
+ if (model.includes("opus")) return "text-purple-300";
441
+ if (model.includes("sonnet")) return "text-blue-300";
442
+ if (model.includes("haiku")) return "text-green-300";
443
+ return "text-surface-200";
444
+ }
445
+ $$renderer2.push(`<div class="stats-bar-container" style="container-type: inline-size;"><div class="stats-bar flex items-center gap-4 text-xs text-surface-400 flex-wrap svelte-1cc6v80"><div class="flex items-center gap-1.5"><span class="text-surface-500">Model</span> <span${attr_class(getModelColor(summary.model), "svelte-1cc6v80")}>${escape_html(shortModel(summary.model))}</span></div> <span class="stats-sep text-surface-700 svelte-1cc6v80">|</span> <div class="flex items-center gap-1.5"><span class="text-surface-500">Duration</span> <span class="text-surface-200">${escape_html(formatDurationBetween(summary.startedAt, summary.lastActiveAt))}</span></div> <span class="stats-sep text-surface-700 svelte-1cc6v80">|</span> <div class="flex items-center gap-1.5"><span class="text-surface-500">Tools</span> <span class="text-cyan-300">${escape_html(summary.toolCallCount)}</span></div> <span class="stats-sep text-surface-700 svelte-1cc6v80">|</span> <div class="flex items-center gap-1.5"><span class="text-surface-500">Tokens</span> <span><span class="text-amber-300">${escape_html(formatNumber(summary.inputTokens))} in</span> / <span class="text-blue-300">${escape_html(formatNumber(summary.outputTokens))} out</span></span></div> <span class="stats-sep text-surface-700 svelte-1cc6v80">|</span> <div class="flex items-center gap-1.5"${attr("title", "Estimated API cost")}><span class="text-surface-500">Cost</span> <span${attr_class("text-emerald-300")}>${escape_html(formatCostWithPlan(summary.estimatedCost))}</span> `);
446
+ {
447
+ $$renderer2.push("<!--[!-->");
448
+ }
449
+ $$renderer2.push(`<!--]--></div></div></div>`);
450
+ });
451
+ }
452
+ function _page($$renderer, $$props) {
453
+ $$renderer.component(($$renderer2) => {
454
+ let { data } = $$props;
455
+ let selectedIndex = 0;
456
+ let isPlaying = false;
457
+ let speed = 1;
458
+ let mobileTab = "timeline";
459
+ let selectedEvent = data.timeline.events[selectedIndex] || null;
460
+ function goTo(index) {
461
+ if (index < 0 || index >= data.timeline.events.length) return;
462
+ selectedIndex = index;
463
+ mobileTab = "details";
464
+ }
465
+ function setSpeed(s) {
466
+ speed = s;
467
+ }
468
+ head("y8uck8", $$renderer2, ($$renderer3) => {
469
+ $$renderer3.title(($$renderer4) => {
470
+ $$renderer4.push(`<title>${escape_html(data.timeline.summary.slug || data.timeline.summary.sessionId.slice(0, 8))} — Agent Replay</title>`);
471
+ });
472
+ });
473
+ $$renderer2.push(`<div class="h-[calc(100vh-3.5rem-2px)] flex flex-col"><div class="border-b border-surface-800 bg-surface-900/50 px-3 sm:px-4 py-2 space-y-2"><div class="flex items-center gap-3"><a href="/" class="text-surface-500 hover:text-blue-400 transition-colors text-xs">← Sessions</a> <span class="text-surface-700">|</span> <h1 class="text-surface-100 text-sm font-medium truncate">${escape_html(data.timeline.summary.slug || data.timeline.summary.sessionId.slice(0, 8))}</h1> <span class="text-surface-600 text-xs truncate hidden sm:inline">${escape_html(data.timeline.summary.project)}</span></div> `);
474
+ StatsBar($$renderer2, { summary: data.timeline.summary });
475
+ $$renderer2.push(`<!----> `);
476
+ PlaybackControls($$renderer2, {
477
+ currentIndex: selectedIndex,
478
+ totalEvents: data.timeline.events.length,
479
+ isPlaying,
480
+ speed,
481
+ onspeedchange: setSpeed
482
+ });
483
+ $$renderer2.push(`<!----></div> <div class="mobile-tabs flex border-b border-surface-800 lg:hidden"><button${attr_class(`flex-1 px-4 py-2.5 text-xs font-medium transition-colors ${stringify(mobileTab === "timeline" ? "text-surface-100 border-b-2 border-blue-500" : "text-surface-500 hover:text-surface-300")}`)}>Timeline</button> <button${attr_class(`flex-1 px-4 py-2.5 text-xs font-medium transition-colors ${stringify(mobileTab === "details" ? "text-surface-100 border-b-2 border-blue-500" : "text-surface-500 hover:text-surface-300")}`)}>Details</button></div> <div class="desktop-layout flex-1 hidden lg:flex overflow-hidden"><div class="w-[400px] xl:w-[400px] lg:w-[280px] min-w-[240px] border-r border-surface-800 overflow-y-auto p-3">`);
484
+ Timeline($$renderer2, { events: data.timeline.events, selectedIndex, onselect: goTo });
485
+ $$renderer2.push(`<!----></div> <div class="flex-1 overflow-hidden">`);
486
+ DetailPanel($$renderer2, { event: selectedEvent });
487
+ $$renderer2.push(`<!----></div></div> <div class="mobile-layout flex-1 lg:hidden overflow-hidden">`);
488
+ if (mobileTab === "timeline") {
489
+ $$renderer2.push("<!--[-->");
490
+ $$renderer2.push(`<div class="h-full overflow-y-auto p-3">`);
491
+ Timeline($$renderer2, { events: data.timeline.events, selectedIndex, onselect: goTo });
492
+ $$renderer2.push(`<!----></div>`);
493
+ } else {
494
+ $$renderer2.push("<!--[!-->");
495
+ $$renderer2.push(`<div class="h-full overflow-hidden flex flex-col"><button class="px-3 py-2 text-xs text-surface-500 hover:text-blue-400 transition-colors text-left sm:hidden">← Back to timeline</button> <div class="flex-1 overflow-hidden">`);
496
+ DetailPanel($$renderer2, { event: selectedEvent });
497
+ $$renderer2.push(`<!----></div></div>`);
498
+ }
499
+ $$renderer2.push(`<!--]--></div></div>`);
500
+ });
501
+ }
502
+
503
+ export { _page as default };
504
+ //# sourceMappingURL=_page.svelte-C2kNC2pi.js.map