@raquezha/notrace 0.1.2 → 0.2.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 (75) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/notrace/index.js +2 -1
  3. package/dist/notrace/report-app/__tests__/analytics.test.d.ts +1 -0
  4. package/dist/notrace/report-app/__tests__/analytics.test.js +35 -0
  5. package/dist/notrace/report-app/__tests__/card.test.d.ts +1 -0
  6. package/dist/notrace/report-app/__tests__/card.test.js +26 -0
  7. package/dist/notrace/report-app/__tests__/event.test.d.ts +1 -0
  8. package/dist/notrace/report-app/__tests__/event.test.js +20 -0
  9. package/dist/notrace/report-app/__tests__/format.test.d.ts +1 -0
  10. package/dist/notrace/report-app/__tests__/format.test.js +41 -0
  11. package/dist/notrace/report-app/__tests__/report.test.d.ts +1 -0
  12. package/dist/notrace/report-app/__tests__/report.test.js +31 -0
  13. package/dist/notrace/report-app/analytics.d.ts +3 -0
  14. package/dist/notrace/report-app/analytics.js +78 -0
  15. package/dist/notrace/report-app/client.d.ts +2 -0
  16. package/dist/notrace/report-app/client.js +105 -0
  17. package/dist/notrace/report-app/components/card.d.ts +4 -0
  18. package/dist/notrace/report-app/components/card.js +36 -0
  19. package/dist/notrace/report-app/components/dashboard.d.ts +1 -0
  20. package/dist/notrace/report-app/components/dashboard.js +16 -0
  21. package/dist/notrace/report-app/components/event.d.ts +5 -0
  22. package/dist/notrace/report-app/components/event.js +42 -0
  23. package/dist/notrace/report-app/components/message.d.ts +2 -0
  24. package/dist/notrace/report-app/components/message.js +43 -0
  25. package/dist/notrace/report-app/dashboard-report.d.ts +1 -0
  26. package/dist/notrace/report-app/dashboard-report.js +6 -0
  27. package/dist/notrace/report-app/escape.d.ts +1 -0
  28. package/dist/notrace/report-app/escape.js +10 -0
  29. package/dist/notrace/report-app/format.d.ts +13 -0
  30. package/dist/notrace/report-app/format.js +102 -0
  31. package/dist/notrace/report-app/report.d.ts +1 -0
  32. package/dist/notrace/report-app/report.js +29 -0
  33. package/dist/notrace/report-app/shell.d.ts +5 -0
  34. package/dist/notrace/report-app/shell.js +19 -0
  35. package/dist/notrace/report-app/styles.d.ts +1 -0
  36. package/dist/notrace/report-app/styles.js +431 -0
  37. package/dist/notrace/report-app/types.d.ts +28 -0
  38. package/dist/notrace/report-app/types.js +1 -0
  39. package/extensions/notrace/index.ts +2 -1
  40. package/extensions/notrace/report-app/__tests__/analytics.test.ts +41 -0
  41. package/extensions/notrace/report-app/__tests__/card.test.ts +29 -0
  42. package/extensions/notrace/report-app/__tests__/event.test.ts +23 -0
  43. package/extensions/notrace/report-app/__tests__/format.test.ts +46 -0
  44. package/extensions/notrace/report-app/__tests__/report.test.ts +33 -0
  45. package/extensions/notrace/report-app/analytics.ts +79 -0
  46. package/extensions/notrace/report-app/client.ts +106 -0
  47. package/extensions/notrace/report-app/components/card.ts +38 -0
  48. package/extensions/notrace/report-app/components/dashboard.ts +17 -0
  49. package/extensions/notrace/report-app/components/event.ts +39 -0
  50. package/extensions/notrace/report-app/components/message.ts +39 -0
  51. package/extensions/notrace/report-app/dashboard-report.ts +7 -0
  52. package/extensions/notrace/report-app/escape.ts +10 -0
  53. package/extensions/notrace/report-app/format.ts +107 -0
  54. package/extensions/notrace/report-app/report.ts +33 -0
  55. package/extensions/notrace/report-app/shell.ts +24 -0
  56. package/extensions/notrace/report-app/styles.ts +431 -0
  57. package/extensions/notrace/report-app/types.ts +35 -0
  58. package/package.json +1 -1
  59. package/templates/dashboard.sample.html +103 -63
  60. package/templates/dashboard.sample.json +73 -10
  61. package/templates/render-samples.mjs +119 -1
  62. package/templates/session.sample.html +125 -168
  63. package/templates/session.sample.json +66 -7
  64. package/templates/sessions/019ed2ee-1000-76ee-b353-000000000001/notrace.html +125 -163
  65. package/templates/sessions/019ed2ee-1000-76ee-b353-000000000001/notrace.json +50 -0
  66. package/templates/sessions/019ed2ee-1001-76ee-b353-000000000002/notrace.html +125 -162
  67. package/templates/sessions/019ed2ee-1001-76ee-b353-000000000002/notrace.json +50 -0
  68. package/templates/sessions/019ed2ee-1002-76ee-b353-000000000003/notrace.html +125 -163
  69. package/templates/sessions/019ed2ee-1002-76ee-b353-000000000003/notrace.json +50 -0
  70. package/templates/sessions/019ed2ee-massive/notrace.html +498 -0
  71. package/templates/sessions/019ed2ee-massive/notrace.json +14660 -0
  72. package/tsconfig.json +1 -1
  73. package/dist/notrace/renderer.d.ts +0 -4
  74. package/dist/notrace/renderer.js +0 -800
  75. package/extensions/notrace/renderer.ts +0 -810
@@ -1,12 +1,4 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>notrace - 019ed2ee-1000-76ee-b353-000000000001</title>
7
- <link rel="icon" href="data:image/svg+xml,%3Csvg%20width%3D%22100%22%20height%3D%22100%22%20viewBox%3D%220%200%20100%20100%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20role%3D%22img%22%3E%3Ctitle%3Enotrace%20logo%20mark%3C%2Ftitle%3E%3Cdesc%3EA%20wave%20that%20smooths%20into%20a%20flat%20line%2C%20then%20fades%20into%20dots%20%E2%80%94%20color%20shifts%20from%20trace%20orange%20to%20no%20cream%20as%20it%20dissolves.%3C%2Fdesc%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22fadeGrad%22%20x1%3D%220%25%22%20y1%3D%220%25%22%20x2%3D%22100%25%22%20y2%3D%220%25%22%3E%3Cstop%20offset%3D%220%25%22%20stop-color%3D%22%23E2754A%22%2F%3E%3Cstop%20offset%3D%22100%25%22%20stop-color%3D%22%23EDE2D2%22%2F%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Cg%20id%3D%22trace-icon%22%3E%3Cpath%20d%3D%22M6%2C50%20C16%2C18%2026%2C18%2036%2C50%20C46%2C82%2054%2C82%2060%2C50%20C64%2C30%2068%2C30%2071%2C50%22%20fill%3D%22none%22%20stroke%3D%22url(%23fadeGrad)%22%20stroke-width%3D%224%22%20stroke-linecap%3D%22round%22%2F%3E%3Cline%20x1%3D%2274%22%20y1%3D%2250%22%20x2%3D%2279%22%20y2%3D%2250%22%20stroke%3D%22%23D9C9B5%22%20stroke-width%3D%224%22%20stroke-linecap%3D%22round%22%20stroke-opacity%3D%220.6%22%2F%3E%3Ccircle%20cx%3D%2285%22%20cy%3D%2250%22%20r%3D%222.2%22%20fill%3D%22%23D9C9B5%22%20opacity%3D%220.5%22%2F%3E%3Ccircle%20cx%3D%2290%22%20cy%3D%2250%22%20r%3D%221.4%22%20fill%3D%22%23EDE2D2%22%20opacity%3D%220.32%22%2F%3E%3Ccircle%20cx%3D%2294%22%20cy%3D%2250%22%20r%3D%220.9%22%20fill%3D%22%23EDE2D2%22%20opacity%3D%220.15%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
8
- <style>
9
- :root {
1
+ <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>notrace - 019ed2ee-1000-76ee-b353-000000000001</title><link rel="icon" href="data:image/svg+xml,%3Csvg%20width%3D%22100%22%20height%3D%22100%22%20viewBox%3D%220%200%20100%20100%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20role%3D%22img%22%3E%3Ctitle%3Enotrace%20logo%20mark%3C%2Ftitle%3E%3Cdesc%3EA%20wave%20that%20smooths%20into%20a%20flat%20line%2C%20then%20fades%20into%20dots%20%E2%80%94%20color%20shifts%20from%20trace%20orange%20to%20no%20cream%20as%20it%20dissolves.%3C%2Fdesc%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22fadeGrad%22%20x1%3D%220%25%22%20y1%3D%220%25%22%20x2%3D%22100%25%22%20y2%3D%220%25%22%3E%3Cstop%20offset%3D%220%25%22%20stop-color%3D%22%23E2754A%22%2F%3E%3Cstop%20offset%3D%22100%25%22%20stop-color%3D%22%23EDE2D2%22%2F%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Cg%20id%3D%22trace-icon%22%3E%3Cpath%20d%3D%22M6%2C50%20C16%2C18%2026%2C18%2036%2C50%20C46%2C82%2054%2C82%2060%2C50%20C64%2C30%2068%2C30%2071%2C50%22%20fill%3D%22none%22%20stroke%3D%22url(%23fadeGrad)%22%20stroke-width%3D%224%22%20stroke-linecap%3D%22round%22%2F%3E%3Cline%20x1%3D%2274%22%20y1%3D%2250%22%20x2%3D%2279%22%20y2%3D%2250%22%20stroke%3D%22%23D9C9B5%22%20stroke-width%3D%224%22%20stroke-linecap%3D%22round%22%20stroke-opacity%3D%220.6%22%2F%3E%3Ccircle%20cx%3D%2285%22%20cy%3D%2250%22%20r%3D%222.2%22%20fill%3D%22%23D9C9B5%22%20opacity%3D%220.5%22%2F%3E%3Ccircle%20cx%3D%2290%22%20cy%3D%2250%22%20r%3D%221.4%22%20fill%3D%22%23EDE2D2%22%20opacity%3D%220.32%22%2F%3E%3Ccircle%20cx%3D%2294%22%20cy%3D%2250%22%20r%3D%220.9%22%20fill%3D%22%23EDE2D2%22%20opacity%3D%220.15%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"><style>:root {
10
2
  --bg: #0c0b0a;
11
3
  --panel: rgba(255,255,255,0.04);
12
4
  --panel-strong: rgba(255,255,255,0.06);
@@ -55,6 +47,30 @@
55
47
  gap: 16px;
56
48
  align-items: start;
57
49
  }
50
+ .hero-split {
51
+ display: grid;
52
+ grid-template-columns: minmax(0, 1fr) auto;
53
+ gap: 16px;
54
+ align-items: start;
55
+ }
56
+ .hero-right {
57
+ display: grid;
58
+ gap: 12px;
59
+ justify-items: end;
60
+ min-width: 0;
61
+ }
62
+ .hero-session {
63
+ display: grid;
64
+ gap: 4px;
65
+ text-align: right;
66
+ min-width: 0;
67
+ }
68
+ .hero-meta {
69
+ display: flex;
70
+ flex-wrap: wrap;
71
+ gap: 8px;
72
+ justify-content: flex-end;
73
+ }
58
74
  .brand { margin-bottom: 10px; }
59
75
  .brand-link {
60
76
  display: inline-flex;
@@ -133,11 +149,52 @@
133
149
  border: 1px solid var(--border);
134
150
  border-radius: 18px;
135
151
  padding: 18px;
152
+ min-width: 0;
136
153
  }
137
154
  .metric-card small { display: block; color: var(--accent); text-transform: uppercase; letter-spacing: 0.08em; font-size: 0.72rem; font-weight: 700; }
138
- .metric-card strong { display: block; margin-top: 8px; font-size: 1.55rem; }
155
+ .metric-card strong { display: block; margin-top: 8px; font-size: clamp(1rem, 2vw, 1.55rem); overflow-wrap: anywhere; }
139
156
  .panel { padding: 0; overflow: hidden; }
140
157
  .section-title { margin: 0; padding: 20px 22px; border-bottom: 1px solid var(--border); font-size: 1rem; }
158
+ .summary-pills { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
159
+ .kv-grid {
160
+ display: grid;
161
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
162
+ gap: 16px;
163
+ }
164
+ .kv-card {
165
+ background: rgba(0,0,0,0.18);
166
+ border: 1px solid var(--border);
167
+ border-radius: 16px;
168
+ padding: 16px;
169
+ }
170
+ .kv-title {
171
+ font-size: 0.72rem;
172
+ text-transform: uppercase;
173
+ color: var(--accent);
174
+ font-weight: 700;
175
+ letter-spacing: 0.08em;
176
+ margin-bottom: 10px;
177
+ }
178
+ .kv-list { display: grid; gap: 8px; }
179
+ .kv-row { display: flex; justify-content: space-between; gap: 12px; align-items: start; }
180
+ .kv-key { color: var(--muted); }
181
+ .kv-value { color: var(--text); text-align: right; word-break: break-word; }
182
+ .tiny-breakdown {
183
+ margin-top: -10px;
184
+ margin-bottom: 8px;
185
+ color: var(--muted);
186
+ font-size: 0.82rem;
187
+ display: flex;
188
+ flex-wrap: wrap;
189
+ gap: 8px 14px;
190
+ }
191
+ .tiny-breakdown strong { color: var(--text); font-size: inherit; font-weight: 600; }
192
+ .collapsible { margin-top: 24px; }
193
+ .collapsible > summary { list-style: none; cursor: pointer; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 18px 22px; font-size: 1rem; font-weight: 700; }
194
+ .collapsible > summary::-webkit-details-marker { display: none; }
195
+ .collapsible > summary:hover { background: rgba(255,255,255,0.02); }
196
+ .collapsible > summary::after { content: "▾"; color: var(--muted); font-size: 0.9rem; }
197
+ .collapsible:not([open]) > summary::after { content: "▸"; }
141
198
  .empty { padding: 32px 22px; color: var(--muted); }
142
199
  table { width: 100%; border-collapse: collapse; }
143
200
  th, td { padding: 14px 18px; text-align: left; border-bottom: 1px solid var(--border); vertical-align: top; }
@@ -279,6 +336,8 @@
279
336
  margin: 0;
280
337
  background: transparent;
281
338
  border: none;
339
+ max-height: 400px;
340
+ overflow-y: auto;
282
341
  }
283
342
  .footer-note {
284
343
  margin-top: 22px;
@@ -333,104 +392,43 @@
333
392
  border-color: rgba(216,132,98,0.45);
334
393
  background: var(--accent-soft);
335
394
  }
395
+ .back-to-top {
396
+ position: fixed;
397
+ right: 20px;
398
+ bottom: 20px;
399
+ z-index: 20;
400
+ display: inline-flex;
401
+ align-items: center;
402
+ gap: 8px;
403
+ padding: 10px 14px;
404
+ border: 1px solid var(--border);
405
+ border-radius: 999px;
406
+ background: rgba(12,11,10,0.88);
407
+ color: var(--text);
408
+ text-decoration: none;
409
+ box-shadow: var(--shadow);
410
+ backdrop-filter: blur(10px);
411
+ opacity: 0;
412
+ pointer-events: none;
413
+ transform: translateY(8px);
414
+ transition: opacity 160ms ease, transform 160ms ease, border-color 120ms ease, background 120ms ease;
415
+ }
416
+ .back-to-top.visible {
417
+ opacity: 1;
418
+ pointer-events: auto;
419
+ transform: translateY(0);
420
+ }
421
+ .back-to-top:hover { border-color: rgba(216,132,98,0.45); background: rgba(216,132,98,0.12); }
336
422
  .container { padding: 20px 14px 48px; }
337
423
  .hero { padding: 20px; }
338
- .hero-top { grid-template-columns: 1fr; }
339
- .meta { justify-content: flex-start; margin-top: 8px; }
340
- .wordmark { width: 280px; height: 92px; }
424
+ .hero-top, .hero-split { grid-template-columns: 1fr; }
425
+ .meta, .hero-meta { justify-content: flex-start; margin-top: 8px; }
426
+ .hero-right, .hero-session { justify-items: start; text-align: left; }
427
+ .wordmark { width: min(280px, 100%); height: auto; }
428
+ .metrics { grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); }
341
429
  th:nth-child(5), td:nth-child(5) { display: none; }
342
430
  .event summary { align-items: flex-start; }
343
- }
344
- </style>
345
- </head>
346
- <body><div class="container">
347
- <section class="hero">
348
- <div class="hero-top">
349
- <div>
350
- <div class="brand"><a class="brand-link" href="../../dashboard.sample.html" onclick="if (window.history.length > 1) { window.history.back(); return false; }"><svg class="wordmark" viewBox="0 0 420 138" aria-label="notrace" role="img" xmlns="http://www.w3.org/2000/svg">
351
- <defs>
352
- <linearGradient id="fadeGrad" x1="0%" y1="0%" x2="100%" y2="0%">
353
- <stop offset="0%" stop-color="#E2754A"/>
354
- <stop offset="100%" stop-color="#EDE2D2"/>
355
- </linearGradient>
356
- </defs>
357
- <g id="trace-icon" transform="translate(1 -18) scale(0.93)">
358
- <path d="M6,50 C16,18 26,18 36,50 C46,82 54,82 60,50 C64,30 68,30 71,50"
359
- fill="none" stroke="url(#fadeGrad)" stroke-width="4" stroke-linecap="round"/>
360
- <line x1="74" y1="50" x2="79" y2="50" stroke="#D9C9B5" stroke-width="4" stroke-linecap="round" stroke-opacity="0.6"/>
361
- <circle cx="85" cy="50" r="2.2" fill="#D9C9B5" opacity="0.5"/>
362
- <circle cx="90" cy="50" r="1.4" fill="#EDE2D2" opacity="0.32"/>
363
- <circle cx="94" cy="50" r="0.9" fill="#EDE2D2" opacity="0.15"/>
364
- </g>
365
- <text x="0" y="114" fill="#ECE3DA" style="fill:#ECE3DA" font-family="Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" font-size="96" font-weight="900" letter-spacing="-7">no</text>
366
- <text x="82" y="114" fill="#d88462" font-family="Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" font-size="96" font-weight="900" letter-spacing="-7">trace</text>
367
- </svg></a><p class="subtitle session-subtitle"><span>Session retrospective</span><span class="session-id-chip"><span>019ed2ee-1000-76ee-b353-000000000001</span><button class="copy-btn" type="button" data-copy-value="019ed2ee-1000-76ee-b353-000000000001" aria-label="Copy session ID" title="Copy session ID"><svg width="14" height="14" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></button></span></p></div>
368
- </div>
369
- <div class="meta">
370
- <span class="pill">nothing</span>
371
- <span class="pill">Started 2026-06-17 17:00</span>
372
- <span class="pill">Mode: full</span>
373
- <button class="export-btn" type="button" data-copy-value="{&quot;kind&quot;:&quot;notrace-export&quot;,&quot;traceId&quot;:&quot;019ed2ee-1000-76ee-b353-000000000001&quot;,&quot;repository&quot;:&quot;nothing&quot;,&quot;task&quot;:{&quot;workflow&quot;:&quot;norpiv&quot;,&quot;id&quot;:&quot;NR-101&quot;,&quot;path&quot;:&quot;.workflow/tasks/NR-101&quot;,&quot;dir&quot;:&quot;/repo/.workflow/tasks/NR-101&quot;},&quot;metrics&quot;:{&quot;inputTokens&quot;:3100,&quot;outputTokens&quot;:410,&quot;cacheReadTokens&quot;:0,&quot;cacheWriteTokens&quot;:0,&quot;totalTokens&quot;:3510,&quot;totalCostUsd&quot;:0.0204},&quot;summary&quot;:&quot;compressed 24,110 to 18,332 tokens; saved 5,778 tokens across 3 tool results&quot;,&quot;events&quot;:[{&quot;model&quot;:&quot;claude-sonnet-4&quot;,&quot;input&quot;:[{&quot;role&quot;:&quot;user&quot;,&quot;content&quot;:&quot;Polish notrace HTML output and unify dashboard/session design.&quot;}],&quot;output&quot;:&quot;Found renderer split. Will move both pages to one shared shell and standardize styles.&quot;}]}" title="Copy session data for LLM/Agent context"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg><span>Export</span></button>
374
- </div>
375
- </div>
376
- <div class="metrics">
377
- <div class="metric-card"><small>Total Cost</small><strong>$0.02040</strong></div>
378
- <div class="metric-card"><small>Total Tokens</small><strong>3,510</strong></div>
379
- <div class="metric-card"><small>Input Tokens</small><strong>3,100</strong></div>
380
- <div class="metric-card"><small>Output Tokens</small><strong>410</strong></div>
381
- <div class="metric-card"><small>Tool Calls</small><strong>3</strong></div>
382
- <div class="metric-card"><small>Events</small><strong>3</strong></div>
383
- </div>
384
- </section>
385
- <section class="panel">
386
- <h2 class="section-title">Run Summary</h2>
387
- <div style="padding: 16px;" class="stack">
388
- <section class="block"><h4>Session</h4><pre>{
389
- &quot;id&quot;: &quot;019ed2ee-1000-76ee-b353-000000000001&quot;,
390
- &quot;startedAt&quot;: &quot;2026-06-17T09:00:00.000Z&quot;,
391
- &quot;endedAt&quot;: &quot;2026-06-17T09:18:00.000Z&quot;,
392
- &quot;durationMs&quot;: 1080000,
393
- &quot;shutdownReason&quot;: &quot;quit&quot;
394
- }</pre></section>
395
- <section class="block"><h4>Task</h4><pre>{
396
- &quot;workflow&quot;: &quot;norpiv&quot;,
397
- &quot;id&quot;: &quot;NR-101&quot;,
398
- &quot;path&quot;: &quot;.workflow/tasks/NR-101&quot;,
399
- &quot;dir&quot;: &quot;/repo/.workflow/tasks/NR-101&quot;
400
- }</pre></section>
401
- <section class="block"><h4>Conditions</h4><pre>{
402
- &quot;models&quot;: [
403
- &quot;gpt-5.4&quot;
404
- ],
405
- &quot;providers&quot;: [
406
- &quot;openai&quot;
407
- ],
408
- &quot;extensions&quot;: [
409
- &quot;notrace&quot;,
410
- &quot;noheadroom&quot;
411
- ]
412
- }</pre></section>
413
- <section class="block"><h4>Activity</h4><pre>{
414
- &quot;turnCount&quot;: 4,
415
- &quot;llmCallCount&quot;: 4,
416
- &quot;toolCallCount&quot;: 3,
417
- &quot;toolErrorCount&quot;: 0,
418
- &quot;durationMs&quot;: 1080000,
419
- &quot;totals&quot;: {
420
- &quot;inputTokens&quot;: 3100,
421
- &quot;outputTokens&quot;: 410,
422
- &quot;cacheReadTokens&quot;: 0,
423
- &quot;cacheWriteTokens&quot;: 0,
424
- &quot;totalTokens&quot;: 3510,
425
- &quot;totalCostUsd&quot;: 0.0204
426
- }
427
- }</pre></section>
428
- </div>
429
- </section>
430
- <section class="panel" style="margin-top: 24px;">
431
- <h2 class="section-title">Dynamic Extension Telemetry</h2>
432
- <div style="padding: 16px;" class="stack">
433
- <section class="block"><h4>noheadroom (Active)</h4><pre>{
431
+ }</style></head><body><div class="container" id="top"><section class="hero"><div class="hero-top"><div><div class="brand"><a class="brand-link" href="../../dashboard.sample.html" onclick="if (window.history.length > 1) { window.history.back(); return false; }"><svg class="wordmark" viewBox="0 0 420 138" aria-label="notrace" role="img" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="fadeGrad" x1="0%" y1="0%" x2="100%" y2="0%"><stop offset="0%" stop-color="#E2754A"/><stop offset="100%" stop-color="#EDE2D2"/></linearGradient></defs><g id="trace-icon" transform="translate(1 -18) scale(0.93)"><path d="M6,50 C16,18 26,18 36,50 C46,82 54,82 60,50 C64,30 68,30 71,50" fill="none" stroke="url(#fadeGrad)" stroke-width="4" stroke-linecap="round"/><line x1="74" y1="50" x2="79" y2="50" stroke="#D9C9B5" stroke-width="4" stroke-linecap="round" stroke-opacity="0.6"/><circle cx="85" cy="50" r="2.2" fill="#D9C9B5" opacity="0.5"/><circle cx="90" cy="50" r="1.4" fill="#EDE2D2" opacity="0.32"/><circle cx="94" cy="50" r="0.9" fill="#EDE2D2" opacity="0.15"/></g><text x="0" y="114" fill="#ECE3DA" style="fill:#ECE3DA" font-family="Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" font-size="96" font-weight="900" letter-spacing="-7">no</text><text x="82" y="114" fill="#d88462" font-family="Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" font-size="96" font-weight="900" letter-spacing="-7">trace</text></svg></a><p class="subtitle session-subtitle"><span>Session retrospective</span><span class="session-id-chip"><span>019ed2ee-1000-76ee-b353-000000000001</span><button class="copy-btn" type="button" data-copy-value="019ed2ee-1000-76ee-b353-000000000001" aria-label="Copy session ID" title="Copy session ID"><svg width="14" height="14" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></button></span></p></div></div><div class="meta"><span class="pill">nothing</span><span class="pill">Started 2026-06-17 17:00</span><span class="pill">Mode: full</span><button class="export-btn" type="button" data-copy-value="{&quot;kind&quot;:&quot;notrace-export&quot;,&quot;traceId&quot;:&quot;019ed2ee-1000-76ee-b353-000000000001&quot;,&quot;repository&quot;:&quot;nothing&quot;,&quot;task&quot;:{&quot;workflow&quot;:&quot;norpiv&quot;,&quot;id&quot;:&quot;NR-101&quot;,&quot;path&quot;:&quot;.workflow/tasks/NR-101&quot;,&quot;dir&quot;:&quot;/repo/.workflow/tasks/NR-101&quot;},&quot;metrics&quot;:{&quot;inputTokens&quot;:3100,&quot;outputTokens&quot;:410,&quot;cacheReadTokens&quot;:0,&quot;cacheWriteTokens&quot;:0,&quot;totalTokens&quot;:3510,&quot;totalCostUsd&quot;:0.0204},&quot;summary&quot;:&quot;compressed 24,110 to 18,332 tokens; saved 5,778 tokens across 3 tool results&quot;,&quot;events&quot;:[{&quot;model&quot;:&quot;claude-sonnet-4&quot;,&quot;input&quot;:[{&quot;role&quot;:&quot;user&quot;,&quot;content&quot;:&quot;Polish notrace HTML output and unify dashboard/session design.&quot;}],&quot;output&quot;:&quot;Found renderer split. Will move both pages to one shared shell and standardize styles.&quot;},{&quot;model&quot;:&quot;gpt-4o&quot;,&quot;input&quot;:[{&quot;role&quot;:&quot;user&quot;,&quot;content&quot;:&quot;massive analysis&quot;}],&quot;output&quot;:&quot;done.&quot;},{&quot;model&quot;:&quot;claude-sonnet-4&quot;,&quot;input&quot;:[{&quot;role&quot;:&quot;user&quot;,&quot;content&quot;:&quot;polish&quot;}],&quot;output&quot;:&quot;done.&quot;}]}" title="Copy session data for LLM/Agent context"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg><span>Export</span></button></div></div><div class="metrics"><div class="metric-card"><small>Total Cost</small><strong>$0.02040</strong></div><div class="metric-card"><small>Total Tokens</small><strong>3,510</strong></div><div class="metric-card"><small>Duration</small><strong>18m 0s</strong></div></div><div class="tiny-breakdown"><span>Input <strong>3.1k</strong></span><span>Output <strong>410</strong></span><span>Cache Read <strong>0</strong></span><span>Cache Write <strong>0</strong></span><span>Switches <strong>2</strong></span><span>Unique Models <strong>2</strong></span><span>Tool Calls <strong>3</strong></span><span>Events <strong>5</strong></span></div></section><details class="panel collapsible"><summary>Run Summary</summary><div><div style="padding: 18px 20px; display: grid; gap: 14px;"><div style="color: var(--muted); line-height: 1.7;"><strong style="color: var(--text);">NR-101</strong> ran for <strong style="color: var(--text);">18m 0s</strong>, used <strong style="color: var(--text);">3.5k</strong> tokens, cost <strong style="color: var(--text);">$0.02040</strong>.</div><div class="tiny-breakdown" style="margin: 0;"><span>Session <strong>019ed2ee-1000-76ee-b353-000000000001</strong></span><span>Started <strong>2026-06-17 17:00</strong></span><span>Workflow <strong>norpiv</strong></span><span>LLM Calls <strong>4</strong></span><span>Tool Errors <strong>0</strong></span><span>Providers <strong>openai</strong></span></div></div></div></details><details class="panel collapsible"><summary>Timeline</summary><div><div style="padding: 16px;"><div class="timeline"><details class="event" data-lazy-event-body="%3Cdiv%20class%3D%22event-body%22%3E%3Cdiv%20class%3D%22stack%22%3E%3Csection%20class%3D%22block%22%3E%3Ch4%3EArguments%3C%2Fh4%3E%3Cdiv%20class%3D%22msg-content%22%3E%3Cdiv%20class%3D%22chat-tool-use%22%3E%3Cdiv%20class%3D%22chat-tool-header%22%3E%3Csvg%20width%3D%2214%22%20height%3D%2214%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M14.7%206.3a1%201%200%200%200%200%201.4l1.6%201.6a1%201%200%200%200%201.4%200l3.77-3.77a6%206%200%200%201-7.94%207.94l-6.91%206.91a2.12%202.12%200%200%201-3-3l6.91-6.91a6%206%200%200%201%207.94-7.94l-3.76%203.76z%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E%20Execution%20Input%3C%2Fdiv%3E%3Cpre%20class%3D%22chat-tool-body%22%3E%7B%0A%20%20%26quot%3Bcommand%26quot%3B%3A%20%26quot%3Bfind%20packages%2Fnotrace%20-maxdepth%203%20-type%20f%26quot%3B%0A%7D%3C%2Fpre%3E%3C%2Fdiv%3E%3C%2Fdiv%3E%3C%2Fsection%3E%3C%2Fdiv%3E%3C%2Fdiv%3E"><summary><div class="event-main"><span class="badge badge-tool">tool_start</span><span class="event-title">functions.bash</span></div><span class="event-time">22:05:04</span></summary></details><details class="event" data-lazy-event-body="%3Cdiv%20class%3D%22event-body%22%3E%3Cdiv%20class%3D%22stack%22%3E%3Csection%20class%3D%22block%22%3E%3Ch4%3EResult%3C%2Fh4%3E%3Cdiv%20class%3D%22msg-content%22%3E%3Cdiv%20class%3D%22chat-tool-use%22%20style%3D%22%22%3E%3Cdiv%20class%3D%22chat-tool-header%22%20style%3D%22color%3A%20var(--muted)%3B%22%3E%3Csvg%20width%3D%2214%22%20height%3D%2214%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpolyline%20points%3D%229%2010%204%2015%209%2020%22%3E%3C%2Fpolyline%3E%3Cpath%20d%3D%22M20%204v7a4%204%200%200%201-4%204H4%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E%20Execution%20Output%3C%2Fdiv%3E%3Cpre%20class%3D%22chat-tool-body%22%3E%7B%0A%20%20%26quot%3Bstdout%26quot%3B%3A%20%26quot%3Bpackages%2Fnotrace%2Fextensions%2Fnotrace%2Findex.ts%5Cnpackages%2Fnotrace%2Fextensions%2Fnotrace%2Frenderer.ts%5Cnpackages%2Fnotrace%2Fpackage.json%26quot%3B%2C%0A%20%20%26quot%3Bstderr%26quot%3B%3A%20%26quot%3B%26quot%3B%2C%0A%20%20%26quot%3BexitCode%26quot%3B%3A%200%0A%7D%3C%2Fpre%3E%3C%2Fdiv%3E%3C%2Fdiv%3E%3C%2Fsection%3E%3C%2Fdiv%3E%3C%2Fdiv%3E"><summary><div class="event-main"><span class="badge badge-tool">tool_end</span><span class="event-title">functions.bash</span></div><span class="event-time">22:05:05</span></summary></details><details class="event" data-lazy-event-body="%3Cdiv%20class%3D%22event-body%22%3E%3Cdiv%20class%3D%22stack%22%3E%3Csection%20class%3D%22block%22%3E%3Ch4%3EInput%20Messages%3C%2Fh4%3E%3Cdiv%20class%3D%22msg%20user%20%22%3E%3Cdiv%20class%3D%22msg-head%22%3E%3Cspan%20class%3D%22msg-role%22%3Euser%3C%2Fspan%3E%3C%2Fdiv%3E%3Cdiv%20class%3D%22msg-content%22%3E%3Cdiv%20class%3D%22chat-text%22%3EPolish%20notrace%20HTML%20output%20and%20unify%20dashboard%2Fsession%20design.%3C%2Fdiv%3E%3C%2Fdiv%3E%3C%2Fdiv%3E%3C%2Fsection%3E%3Csection%20class%3D%22block%22%3E%3Ch4%3EOutput%3C%2Fh4%3E%3Cdiv%20class%3D%22msg-content%22%3E%3Cdiv%20class%3D%22chat-text%22%3EFound%20renderer%20split.%20Will%20move%20both%20pages%20to%20one%20shared%20shell%20and%20standardize%20styles.%3C%2Fdiv%3E%3C%2Fdiv%3E%3C%2Fsection%3E%3Csection%20class%3D%22block%22%3E%3Ch4%3EUsage%3C%2Fh4%3E%3Cpre%3E%7B%0A%20%20%26quot%3Binput%26quot%3B%3A%202140%2C%0A%20%20%26quot%3Boutput%26quot%3B%3A%20116%2C%0A%20%20%26quot%3BcacheRead%26quot%3B%3A%200%2C%0A%20%20%26quot%3BcacheWrite%26quot%3B%3A%200%2C%0A%20%20%26quot%3BtotalTokens%26quot%3B%3A%202256%2C%0A%20%20%26quot%3Bcost%26quot%3B%3A%20%7B%0A%20%20%20%20%26quot%3Btotal%26quot%3B%3A%200.01451%0A%20%20%7D%0A%7D%3C%2Fpre%3E%3C%2Fsection%3E%3C%2Fdiv%3E%3C%2Fdiv%3E"><summary><div class="event-main"><span class="badge badge-llm">llm_completion</span><span class="event-title">claude-sonnet-4</span></div><span class="event-time">22:05:11</span></summary></details><details class="event" data-lazy-event-body="%3Cdiv%20class%3D%22event-body%22%3E%3Cdiv%20class%3D%22stack%22%3E%3Csection%20class%3D%22block%22%3E%3Ch4%3EInput%20Messages%3C%2Fh4%3E%3Cdiv%20class%3D%22msg%20user%20%22%3E%3Cdiv%20class%3D%22msg-head%22%3E%3Cspan%20class%3D%22msg-role%22%3Euser%3C%2Fspan%3E%3C%2Fdiv%3E%3Cdiv%20class%3D%22msg-content%22%3E%3Cdiv%20class%3D%22chat-text%22%3Emassive%20analysis%3C%2Fdiv%3E%3C%2Fdiv%3E%3C%2Fdiv%3E%3C%2Fsection%3E%3Csection%20class%3D%22block%22%3E%3Ch4%3EOutput%3C%2Fh4%3E%3Cdiv%20class%3D%22msg-content%22%3E%3Cdiv%20class%3D%22chat-text%22%3Edone.%3C%2Fdiv%3E%3C%2Fdiv%3E%3C%2Fsection%3E%3Csection%20class%3D%22block%22%3E%3Ch4%3EUsage%3C%2Fh4%3E%3Cpre%3E%7B%0A%20%20%26quot%3Binput%26quot%3B%3A%201540000%2C%0A%20%20%26quot%3Boutput%26quot%3B%3A%20450%2C%0A%20%20%26quot%3BcacheRead%26quot%3B%3A%200%2C%0A%20%20%26quot%3BcacheWrite%26quot%3B%3A%200%2C%0A%20%20%26quot%3BtotalTokens%26quot%3B%3A%201540450%2C%0A%20%20%26quot%3Bcost%26quot%3B%3A%20%7B%0A%20%20%20%20%26quot%3Btotal%26quot%3B%3A%207.70225%0A%20%20%7D%0A%7D%3C%2Fpre%3E%3C%2Fsection%3E%3C%2Fdiv%3E%3C%2Fdiv%3E"><summary><div class="event-main"><span class="badge badge-llm">llm_completion</span><span class="event-title">gpt-4o</span></div><span class="event-time">22:05:50</span></summary></details><details class="event" data-lazy-event-body="%3Cdiv%20class%3D%22event-body%22%3E%3Cdiv%20class%3D%22stack%22%3E%3Csection%20class%3D%22block%22%3E%3Ch4%3EInput%20Messages%3C%2Fh4%3E%3Cdiv%20class%3D%22msg%20user%20%22%3E%3Cdiv%20class%3D%22msg-head%22%3E%3Cspan%20class%3D%22msg-role%22%3Euser%3C%2Fspan%3E%3C%2Fdiv%3E%3Cdiv%20class%3D%22msg-content%22%3E%3Cdiv%20class%3D%22chat-text%22%3Epolish%3C%2Fdiv%3E%3C%2Fdiv%3E%3C%2Fdiv%3E%3C%2Fsection%3E%3Csection%20class%3D%22block%22%3E%3Ch4%3EOutput%3C%2Fh4%3E%3Cdiv%20class%3D%22msg-content%22%3E%3Cdiv%20class%3D%22chat-text%22%3Edone.%3C%2Fdiv%3E%3C%2Fdiv%3E%3C%2Fsection%3E%3Csection%20class%3D%22block%22%3E%3Ch4%3EUsage%3C%2Fh4%3E%3Cpre%3E%7B%0A%20%20%26quot%3Binput%26quot%3B%3A%2084000%2C%0A%20%20%26quot%3Boutput%26quot%3B%3A%20250%2C%0A%20%20%26quot%3BcacheRead%26quot%3B%3A%200%2C%0A%20%20%26quot%3BcacheWrite%26quot%3B%3A%200%2C%0A%20%20%26quot%3BtotalTokens%26quot%3B%3A%2084250%2C%0A%20%20%26quot%3Bcost%26quot%3B%3A%20%7B%0A%20%20%20%20%26quot%3Btotal%26quot%3B%3A%200.42%0A%20%20%7D%0A%7D%3C%2Fpre%3E%3C%2Fsection%3E%3C%2Fdiv%3E%3C%2Fdiv%3E"><summary><div class="event-main"><span class="badge badge-llm">llm_completion</span><span class="event-title">claude-sonnet-4</span></div><span class="event-time">22:06:40</span></summary></details></div></div></div></details><details class="panel collapsible"><summary>Models</summary><div><div style="padding: 16px; border-bottom: 1px solid var(--border); display: grid; gap: 8px;"><div style="color: var(--muted);">Top spender: <strong style="color: var(--text);">gpt-4o</strong></div><div style="color: var(--muted);">Most used: <strong style="color: var(--text);">claude-sonnet-4</strong></div></div><div style="overflow-x: auto;"><table><thead><tr><th>Model</th><th class="num-cell">Calls</th><th class="num-cell">Input</th><th class="num-cell">Output</th><th class="num-cell">Tokens</th><th class="num-cell">Cost</th><th class="num-cell">Avg Cost/Call</th><th class="num-cell">Avg Tokens/Call</th><th class="num-cell">Errors</th></tr></thead><tbody><tr><td><strong>gpt-4o</strong> <span class="badge badge-llm">top spend</span></td><td class="num-cell">1</td><td class="num-cell">1.54M</td><td class="num-cell">450</td><td class="num-cell">1.54M</td><td class="num-cell">$7.70225</td><td class="num-cell">$7.70225</td><td class="num-cell">1.54M</td><td class="num-cell">0</td></tr><tr><td><strong>claude-sonnet-4</strong> <span class="badge badge-tool">most used</span></td><td class="num-cell">2</td><td class="num-cell">86.1k</td><td class="num-cell">366</td><td class="num-cell">86.5k</td><td class="num-cell">$0.43451</td><td class="num-cell">$0.21726</td><td class="num-cell">43.3k</td><td class="num-cell">0</td></tr></tbody></table></div></div></details><details class="panel collapsible"><summary>Model Switches</summary><div><div style="padding: 16px; border-bottom: 1px solid var(--border); color: var(--muted);">Biggest switch cost: <strong style="color: var(--text);">claude-sonnet-4 → gpt-4o ($7.70225)</strong></div><div style="overflow-x: auto;"><table><thead><tr><th>Switch</th><th class="num-cell">Cost Impact</th><th class="num-cell">New Context Tokens</th><th class="num-cell">Provider Changed</th><th>Details</th></tr></thead><tbody><tr><td><span class="badge badge-system">claude-sonnet-4</span> → <span class="badge badge-llm">gpt-4o</span></td><td class="num-cell">$7.70225</td><td class="num-cell">1.54M</td><td class="num-cell">Yes</td><td><span class="session-sub">#2 • 22:05:50 • 39s since previous completion</span></td></tr><tr><td><span class="badge badge-system">gpt-4o</span> → <span class="badge badge-llm">claude-sonnet-4</span></td><td class="num-cell">$0.42000</td><td class="num-cell">84.3k</td><td class="num-cell">Yes</td><td><span class="session-sub">#3 • 22:06:40 • 50s since previous completion</span></td></tr></tbody></table></div></div></details><details class="panel collapsible"><summary>Dynamic Extension Telemetry</summary><div><div style="padding: 16px;" class="stack"><section class="block"><h4>noheadroom (Active)</h4><pre>{
434
432
  &quot;summary&quot;: &quot;compressed 24,110 to 18,332 tokens; saved 5,778 tokens across 3 tool results&quot;,
435
433
  &quot;attempts&quot;: 2,
436
434
  &quot;applied&quot;: 1,
@@ -446,63 +444,7 @@
446
444
  &quot;tool-result-compression&quot;
447
445
  ]
448
446
  }
449
- }</pre></section>
450
- </div>
451
- </section>
452
- <section class="panel" style="margin-top: 24px;">
453
- <h2 class="section-title">Timeline</h2>
454
- <div style="padding: 16px;">
455
- <div class="timeline"><details class="event">
456
- <summary>
457
- <div class="event-main">
458
- <span class="badge badge-tool">tool_start</span>
459
- <span class="event-title">functions.bash</span>
460
- </div>
461
- <span class="event-time">22:05:04</span>
462
- </summary>
463
- <div class="event-body"><div class="stack"><section class="block"><h4>Arguments</h4><div class="msg-content"><div class="chat-tool-use"><div class="chat-tool-header"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"></path></svg> Execution Input</div><pre class="chat-tool-body">{
464
- &quot;command&quot;: &quot;find packages/notrace -maxdepth 3 -type f&quot;
465
- }</pre></div></div></section></div></div>
466
- </details><details class="event">
467
- <summary>
468
- <div class="event-main">
469
- <span class="badge badge-tool">tool_end</span>
470
- <span class="event-title">functions.bash</span>
471
- </div>
472
- <span class="event-time">22:05:05</span>
473
- </summary>
474
- <div class="event-body"><div class="stack"><section class="block"><h4>Result</h4><div class="msg-content"><div class="chat-tool-use" style=""><div class="chat-tool-header" style="color: var(--muted);"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 10 4 15 9 20"></polyline><path d="M20 4v7a4 4 0 0 1-4 4H4"></path></svg> Execution Output</div><pre class="chat-tool-body">{
475
- &quot;stdout&quot;: &quot;packages/notrace/extensions/notrace/index.ts\npackages/notrace/extensions/notrace/renderer.ts\npackages/notrace/package.json&quot;,
476
- &quot;stderr&quot;: &quot;&quot;,
477
- &quot;exitCode&quot;: 0
478
- }</pre></div></div></section></div></div>
479
- </details><details class="event">
480
- <summary>
481
- <div class="event-main">
482
- <span class="badge badge-llm">llm_completion</span>
483
- <span class="event-title">claude-sonnet-4</span>
484
- </div>
485
- <span class="event-time">22:05:11</span>
486
- </summary>
487
- <div class="event-body"><div class="stack"><section class="block"><h4>Input Messages</h4><div class="msg user"><div class="msg-head"><span class="msg-role">user</span></div><div class="msg-content"><div class="chat-text">Polish notrace HTML output and unify dashboard/session design.</div></div></div></section><section class="block"><h4>Output</h4><div class="msg-content"><div class="chat-text">Found renderer split. Will move both pages to one shared shell and standardize styles.</div></div></section><section class="block"><h4>Usage</h4><pre>{
488
- &quot;input&quot;: 2140,
489
- &quot;output&quot;: 116,
490
- &quot;cacheRead&quot;: 0,
491
- &quot;cacheWrite&quot;: 0,
492
- &quot;totalTokens&quot;: 2256,
493
- &quot;cost&quot;: {
494
- &quot;total&quot;: 0.01451
495
- }
496
- }</pre></section></div></div>
497
- </details></div>
498
- </div>
499
- </section>
500
- <footer class="footer-note stack">
501
- <div class="footer-brand">notrace</div>
502
- <div class="footer-tagline">Local-first retrospective engine</div>
503
- <div class="footer-meta"><a href="https://opensource.org/licenses/MIT">MIT</a></div>
504
- </footer>
505
- </div><script>(() => {
447
+ }</pre></section></div></div></details><footer class="footer-note stack"><div class="footer-brand">notrace</div><div class="footer-tagline">Local-first retrospective engine</div><div class="footer-meta"><a href="https://opensource.org/licenses/MIT">MIT</a></div></footer></div><script>(() => {
506
448
  document.querySelectorAll('[data-copy-value]').forEach((button) => {
507
449
  button.addEventListener('click', async () => {
508
450
  const value = button.getAttribute('data-copy-value') || '';
@@ -532,5 +474,25 @@
532
474
  }
533
475
  });
534
476
  });
535
- })();</script></body>
536
- </html>
477
+
478
+ document.querySelectorAll('details[data-lazy-event-body]').forEach((details) => {
479
+ details.addEventListener('toggle', () => {
480
+ if (!details.open) return;
481
+ if (details.querySelector('.event-body')) return;
482
+ const html = decodeURIComponent(details.getAttribute('data-lazy-event-body') || '');
483
+ details.insertAdjacentHTML('beforeend', html);
484
+ }, { once: false });
485
+ });
486
+
487
+ const topBtn = document.querySelector('.back-to-top');
488
+ if (topBtn) {
489
+ const syncTopButton = () => {
490
+ const scrollable = document.documentElement.scrollHeight > window.innerHeight + 24;
491
+ const show = scrollable && window.scrollY > 200;
492
+ topBtn.classList.toggle('visible', show);
493
+ };
494
+ window.addEventListener('scroll', syncTopButton, { passive: true });
495
+ window.addEventListener('resize', syncTopButton);
496
+ syncTopButton();
497
+ }
498
+ })();</script></body></html>
@@ -126,6 +126,56 @@
126
126
  }
127
127
  },
128
128
  "timestamp": 1781705111000
129
+ },
130
+ {
131
+ "type": "llm_completion",
132
+ "model": "gpt-4o",
133
+ "provider": "openai",
134
+ "inputPayload": {
135
+ "messages": [
136
+ {
137
+ "role": "user",
138
+ "content": "massive analysis"
139
+ }
140
+ ]
141
+ },
142
+ "outputContent": "done.",
143
+ "usage": {
144
+ "input": 1540000,
145
+ "output": 450,
146
+ "cacheRead": 0,
147
+ "cacheWrite": 0,
148
+ "totalTokens": 1540450,
149
+ "cost": {
150
+ "total": 7.70225
151
+ }
152
+ },
153
+ "timestamp": 1781705150000
154
+ },
155
+ {
156
+ "type": "llm_completion",
157
+ "model": "claude-sonnet-4",
158
+ "provider": "anthropic",
159
+ "inputPayload": {
160
+ "messages": [
161
+ {
162
+ "role": "user",
163
+ "content": "polish"
164
+ }
165
+ ]
166
+ },
167
+ "outputContent": "done.",
168
+ "usage": {
169
+ "input": 84000,
170
+ "output": 250,
171
+ "cacheRead": 0,
172
+ "cacheWrite": 0,
173
+ "totalTokens": 84250,
174
+ "cost": {
175
+ "total": 0.42
176
+ }
177
+ },
178
+ "timestamp": 1781705200000
129
179
  }
130
180
  ],
131
181
  "navigation": {