@0xmaxma/claude-gateway 2.0.5 → 2.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/runner.d.ts +14 -0
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +75 -71
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/session-compaction-scheduler.d.ts +22 -0
- package/dist/agent/session-compaction-scheduler.d.ts.map +1 -0
- package/dist/agent/session-compaction-scheduler.js +40 -0
- package/dist/agent/session-compaction-scheduler.js.map +1 -0
- package/dist/api/gateway-router.d.ts.map +1 -1
- package/dist/api/gateway-router.js +100 -10
- package/dist/api/gateway-router.js.map +1 -1
- package/dist/api/memory-activity.d.ts +18 -0
- package/dist/api/memory-activity.d.ts.map +1 -0
- package/dist/api/memory-activity.js +97 -0
- package/dist/api/memory-activity.js.map +1 -0
- package/dist/orchestration/agent-tool-schemas.js +1 -1
- package/dist/orchestration/agent-tool-schemas.js.map +1 -1
- package/dist/orchestration/bridge.js +1 -1
- package/dist/orchestration/bridge.js.map +1 -1
- package/dist/orchestration/compact-measurements.d.ts +21 -0
- package/dist/orchestration/compact-measurements.d.ts.map +1 -0
- package/dist/orchestration/compact-measurements.js +62 -0
- package/dist/orchestration/compact-measurements.js.map +1 -0
- package/dist/orchestration/config.d.ts +4 -0
- package/dist/orchestration/config.d.ts.map +1 -1
- package/dist/orchestration/config.js +1 -1
- package/dist/orchestration/config.js.map +1 -1
- package/dist/orchestration/context-delivery.d.ts +32 -0
- package/dist/orchestration/context-delivery.d.ts.map +1 -0
- package/dist/orchestration/context-delivery.js +101 -0
- package/dist/orchestration/context-delivery.js.map +1 -0
- package/dist/orchestration/conversation-intake.d.ts +10 -6
- package/dist/orchestration/conversation-intake.d.ts.map +1 -1
- package/dist/orchestration/conversation-intake.js +22 -8
- package/dist/orchestration/conversation-intake.js.map +1 -1
- package/dist/orchestration/dashboard-charts.d.ts +32 -0
- package/dist/orchestration/dashboard-charts.d.ts.map +1 -0
- package/dist/orchestration/dashboard-charts.js +77 -0
- package/dist/orchestration/dashboard-charts.js.map +1 -0
- package/dist/orchestration/dashboard-reader-worker.js +21 -3
- package/dist/orchestration/dashboard-reader-worker.js.map +1 -1
- package/dist/orchestration/dashboard-reader.d.ts +1 -1
- package/dist/orchestration/dashboard-reader.d.ts.map +1 -1
- package/dist/orchestration/dashboard-reader.js +2 -2
- package/dist/orchestration/dashboard-reader.js.map +1 -1
- package/dist/orchestration/decision-context.d.ts +1 -1
- package/dist/orchestration/decision-context.d.ts.map +1 -1
- package/dist/orchestration/decision-context.js +2 -2
- package/dist/orchestration/decision-context.js.map +1 -1
- package/dist/orchestration/mutation-recovery.d.ts +3 -2
- package/dist/orchestration/mutation-recovery.d.ts.map +1 -1
- package/dist/orchestration/mutation-recovery.js +8 -0
- package/dist/orchestration/mutation-recovery.js.map +1 -1
- package/dist/orchestration/native-compact.d.ts +4 -1
- package/dist/orchestration/native-compact.d.ts.map +1 -1
- package/dist/orchestration/native-compact.js +6 -2
- package/dist/orchestration/native-compact.js.map +1 -1
- package/dist/orchestration/process-turn.d.ts +1 -0
- package/dist/orchestration/process-turn.d.ts.map +1 -1
- package/dist/orchestration/process-turn.js +1 -1
- package/dist/orchestration/process-turn.js.map +1 -1
- package/dist/orchestration/runtime.d.ts +13 -1
- package/dist/orchestration/runtime.d.ts.map +1 -1
- package/dist/orchestration/runtime.js +161 -18
- package/dist/orchestration/runtime.js.map +1 -1
- package/dist/orchestration/session-compaction.d.ts +59 -0
- package/dist/orchestration/session-compaction.d.ts.map +1 -0
- package/dist/orchestration/session-compaction.js +212 -0
- package/dist/orchestration/session-compaction.js.map +1 -0
- package/dist/orchestration/tasks/driver.js +1 -1
- package/dist/orchestration/tasks/driver.js.map +1 -1
- package/dist/orchestration/token-ledger.d.ts +7 -0
- package/dist/orchestration/token-ledger.d.ts.map +1 -1
- package/dist/orchestration/token-ledger.js +1 -0
- package/dist/orchestration/token-ledger.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/dashboard-charts.d.ts +3 -0
- package/dist/ui/dashboard-charts.d.ts.map +1 -0
- package/dist/ui/dashboard-charts.js +130 -0
- package/dist/ui/dashboard-charts.js.map +1 -0
- package/dist/ui/dashboard-client.d.ts.map +1 -1
- package/dist/ui/dashboard-client.js +10 -14
- package/dist/ui/dashboard-client.js.map +1 -1
- package/dist/ui/dashboard-controls.d.ts +4 -0
- package/dist/ui/dashboard-controls.d.ts.map +1 -0
- package/dist/ui/dashboard-controls.js +27 -0
- package/dist/ui/dashboard-controls.js.map +1 -0
- package/dist/ui/dashboard-presentation.d.ts +3 -0
- package/dist/ui/dashboard-presentation.d.ts.map +1 -1
- package/dist/ui/dashboard-presentation.js +11 -5
- package/dist/ui/dashboard-presentation.js.map +1 -1
- package/dist/ui/dashboard-range.d.ts +3 -3
- package/dist/ui/dashboard-range.d.ts.map +1 -1
- package/dist/ui/dashboard-range.js +21 -5
- package/dist/ui/dashboard-range.js.map +1 -1
- package/dist/ui/dashboard-theme.d.ts +3 -1
- package/dist/ui/dashboard-theme.d.ts.map +1 -1
- package/dist/ui/dashboard-theme.js +80 -3
- package/dist/ui/dashboard-theme.js.map +1 -1
- package/dist/ui/memory-activity.d.ts +4 -0
- package/dist/ui/memory-activity.d.ts.map +1 -0
- package/dist/ui/memory-activity.js +115 -0
- package/dist/ui/memory-activity.js.map +1 -0
- package/dist/ui/token-report-client.d.ts +1 -1
- package/dist/ui/token-report-client.d.ts.map +1 -1
- package/dist/ui/token-report-client.js +1 -1
- package/dist/ui/token-report.d.ts +1 -0
- package/dist/ui/token-report.d.ts.map +1 -1
- package/dist/ui/token-report.js +18 -15
- package/dist/ui/token-report.js.map +1 -1
- package/dist/ui/web-ui.d.ts +1 -1
- package/dist/ui/web-ui.d.ts.map +1 -1
- package/dist/ui/web-ui.js +15 -238
- package/dist/ui/web-ui.js.map +1 -1
- package/mcp/tools/telegram/receiver-server.ts +31 -17
- package/mcp/tools/telegram/session-browser.ts +10 -0
- package/package.json +1 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.dashboardFontLink = exports.dashboardTheme = void 0;
|
|
3
|
+
exports.dashboardFontLink = exports.dashboardTheme = exports.dashboardIconUrl = void 0;
|
|
4
|
+
/** Favicon rendered from the original main-branch brandmark (35px at 4x). */
|
|
5
|
+
exports.dashboardIconUrl = "data:image/png;base64,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";
|
|
4
6
|
/** Shared tokens from the approved pastel dashboard direction. */
|
|
5
7
|
exports.dashboardTheme = String.raw `
|
|
6
8
|
:root{color-scheme:dark;--bg:#101113;--side:#141517;--panel:#181a1d;--raised:#202226;--line:#2b2e33;--text:#eeeef0;--muted:#989da7;--accent:#ff935c;--accentbg:#35261f;--green:#78d5aa;--greenbg:#1e3029;--blue:#8dbdff;--bluebg:#202c3f;--yellow:#ebc978;--yellowbg:#342e20;--red:#efa19e;--redbg:#362426;--shadow:0 24px 100px #0008;--radius:14px}
|
|
@@ -190,7 +192,7 @@ to{opacity:1;transform:none}
|
|
|
190
192
|
|
|
191
193
|
|
|
192
194
|
/* V3: a white workspace with violet controls and pastel category surfaces. */
|
|
193
|
-
:root,[data-theme=light]{color-scheme:light;--bg:#f5f6f8;--side:#fff;--panel:#fff;--raised:#f5f6f8;--line:#dddfeb;--text:#333;--muted:#535768;--accent:#6161ff;--accentbg:#e7ecff;--green:#226149;--greenbg:#e5f6dc;--blue:#355a80;--bluebg:#dff4fc;--yellow:#785622;--yellowbg:#fff0d8;--red:#9c405d;--redbg:#fce8ef;--shadow:0 12px 42px #35386612;--radius:24px;--mint
|
|
195
|
+
:root,[data-theme=light]{color-scheme:light;--bg:#f5f6f8;--side:#fff;--panel:#fff;--raised:#f5f6f8;--line:#dddfeb;--text:#333;--muted:#535768;--accent:#6161ff;--accentbg:#e7ecff;--green:#226149;--greenbg:#e5f6dc;--blue:#355a80;--bluebg:#dff4fc;--yellow:#785622;--yellowbg:#fff0d8;--red:#9c405d;--redbg:#fce8ef;--shadow:0 12px 42px #35386612;--radius:24px;--mint:var(--palette-mint);--sky:var(--palette-sky);--peach:var(--palette-peach);--lavender:var(--palette-lavender);--pink:var(--palette-pink);--prism:conic-gradient(#8181ff,#4dc2cb,#a5db88,#f8e094,#f3a0d2,#8181ff)}
|
|
194
196
|
|
|
195
197
|
[data-theme=dark]{color-scheme:dark;--bg:#171824;--side:#1d1f2e;--panel:#222536;--raised:#2a2e42;--line:#393e57;--text:#f1f1f8;--muted:#b2b7cc;--accent:#a5a5ff;--accentbg:#353858;--green:#abd8b3;--greenbg:#293e33;--blue:#adcce9;--bluebg:#2b3b51;--yellow:#e4c792;--yellowbg:#443b2a;--red:#f1afc3;--redbg:#473044;--shadow:0 12px 42px #0002;--mint:#263b30;--sky:#253a4b;--peach:#423328;--lavender:#3a2f4b;--pink:#412a3b}
|
|
196
198
|
|
|
@@ -480,6 +482,81 @@ tr.session-row:hover td{background:var(--raised)}
|
|
|
480
482
|
.tool-name-list{list-style:none;padding:0;margin:10px 0;display:grid;gap:6px}.tool-name-list li{padding:7px 10px;background:var(--raised);border:1px solid var(--line);border-radius:7px;min-width:0}.tool-name-list code{font:12px/1.6 ui-monospace,monospace;color:var(--text);overflow-wrap:anywhere}
|
|
481
483
|
.status-badge{display:inline-flex;align-items:center;gap:6px;max-width:100%;padding:0;border:0;border-radius:0;min-height:0;background:transparent;color:var(--status-color);font-size:12px;font-weight:500;line-height:1.6;letter-spacing:0;white-space:normal;vertical-align:middle}.status-badge::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}
|
|
482
484
|
tr[data-dash-agent],.turn-row{cursor:pointer}tr[data-dash-agent]:hover,.turn-row:hover{background:var(--raised)}tr[data-dash-agent]:focus-visible,.turn-row:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.short-id,.session-id{overflow-wrap:anywhere;white-space:normal;color:var(--text);font-size:12px}.dash-tools{overflow-wrap:anywhere}.detail-block{padding:14px;border:1px solid var(--line);border-radius:10px;margin:12px 0}.detail-block h3{margin:0 0 8px}
|
|
485
|
+
/* Memory activity keeps column sizes stable as live records change. */
|
|
486
|
+
.memory-table{table-layout:fixed;width:100%}.memory-table th,.memory-table td{white-space:normal;overflow-wrap:anywhere;vertical-align:top;padding:14px 16px}.memory-table .identity-badge{max-width:100%;overflow:hidden;text-overflow:ellipsis}.memory-table .status-badge{white-space:normal}.memory-table button{white-space:nowrap}.memory-table tr[data-memory-id]{cursor:pointer}.memory-table tr[data-memory-id]:hover{background:var(--raised)}
|
|
487
|
+
#memory-drawer{overflow-x:hidden}#memory-drawer .table-wrap{max-width:100%;overflow-x:auto}#memory-drawer pre{white-space:pre-wrap;overflow-wrap:anywhere}#memory-stats{grid-template-columns:repeat(3,minmax(0,1fr))}#memory-stats .dash-stat{padding:18px}#memory-stats .dash-stat strong{font-size:26px;margin-top:6px}@media(max-width:520px){#memory-stats{grid-template-columns:1fr}}
|
|
488
|
+
#view-dreams .heading h2{color:var(--text)}.memory-schedules{margin:16px 0 20px;border:1px solid var(--line);border-radius:16px;background:var(--panel)}.memory-schedules>summary{padding:14px 18px;font-weight:500;color:var(--text);cursor:pointer}.memory-schedules[open]>summary{border-bottom:1px solid var(--line)}#memory-schedule-table{padding:0 12px 12px}#memory-schedule-table .table-wrap{margin-top:12px}#memory-error[hidden]{display:none}
|
|
489
|
+
|
|
490
|
+
.memory-activity-label{display:inline-flex;align-items:center;gap:7px;font-size:12px;font-weight:500;line-height:1.4;color:var(--activity-color)}
|
|
491
|
+
.memory-activity-label::before{content:"";width:5px;height:5px;border-radius:50%;background:currentColor;flex-shrink:0}
|
|
492
|
+
.memory-activity-label.memory-dream{--activity-color:var(--accent)}
|
|
493
|
+
.memory-activity-label.session-compaction{--activity-color:var(--blue)}
|
|
494
|
+
/* One filter component shared with the Turn details report. */
|
|
495
|
+
.turn-filters{display:flex;gap:12px;flex-wrap:wrap;align-items:stretch;font:15px/1.7 system-ui,-apple-system,"Noto Sans Thai",sans-serif}
|
|
496
|
+
.turn-filters .range-toggle button,.turn-filters select,.turn-filters input{font-size:12px}
|
|
497
|
+
.turn-filters input{flex:1;min-width:160px;max-width:380px}
|
|
498
|
+
.report-toolbar.turn-filters{align-items:stretch}
|
|
499
|
+
.turn-filters>select,.turn-filters>input{height:48px;margin:0;align-self:stretch}
|
|
500
|
+
.memory-filters{flex-wrap:nowrap;gap:12px;margin:20px 0 12px;max-width:100%;overflow-x:auto;padding:6px 6px 8px}
|
|
501
|
+
.memory-filters .range-toggle{flex:0 0 auto;flex-wrap:nowrap;white-space:nowrap}
|
|
502
|
+
.memory-filters #memory-agent{flex:0 0 auto;width:160px}
|
|
503
|
+
|
|
504
|
+
/* Drawer chrome must not inherit report section/card decoration. */
|
|
505
|
+
.dash-drawer{margin:0;border:0;border-radius:0;height:100%;max-height:100%;font:13px/1.6 Poppins,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}
|
|
506
|
+
.dash-drawer .drawer-actions{display:flex;justify-content:flex-end;margin:0 0 16px}
|
|
507
|
+
.dash-drawer .drawer-close{font:500 12px/1.5 Poppins,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;border-radius:160px;min-height:38px;padding:8px 14px}
|
|
508
|
+
.dash-drawer .drawer-actions+h1{margin-top:0}
|
|
509
|
+
.dash-drawer h3{font-size:14px;font-weight:600;margin:18px 0 8px}
|
|
510
|
+
.dash-drawer .muted{font-size:12px}
|
|
511
|
+
button.theme-toggle{width:38px;height:38px;min-height:38px;flex:0 0 38px;padding:9px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center}
|
|
512
|
+
.theme-toggle svg{display:block;flex-shrink:0}.theme-toggle .theme-sun{display:none}
|
|
513
|
+
[data-theme=dark] .theme-toggle .theme-moon{display:none}[data-theme=dark] .theme-toggle .theme-sun{display:block}
|
|
514
|
+
#report-theme{margin-left:auto}
|
|
515
|
+
|
|
516
|
+
/* Shared chart colors: distribution roles and the existing light-theme pastel palette. */
|
|
517
|
+
:root{--token-agent:#329eda;--token-worker:#9661d9;--token-report:#ea8a23;--palette-mint:#e2f8d3;--palette-sky:#dff6ff;--palette-peach:#fff0e3;--palette-lavender:#eddff7;--palette-pink:#fbe0ef;--palette-yellow:#fff0d8}
|
|
518
|
+
.identity-badge,.agent-column{--agent-fill:hsl(var(--agent-hue) 60% 94%);--agent-ink:hsl(var(--agent-hue) 55% 30%);--agent-border:hsl(var(--agent-hue) 45% 85%)}
|
|
519
|
+
[data-theme=dark] .identity-badge,[data-theme=dark] .agent-column{--agent-fill:hsl(var(--agent-hue) 30% 21%);--agent-ink:hsl(var(--agent-hue) 65% 80%);--agent-border:hsl(var(--agent-hue) 30% 35%)}
|
|
520
|
+
.identity-badge,[data-theme=dark] .identity-badge{background:var(--agent-fill);color:var(--agent-ink);border-color:var(--agent-border)}
|
|
521
|
+
/* Overview charts share card sizing, range controls and numeric typography. */
|
|
522
|
+
#overview-charts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;margin:24px 0}
|
|
523
|
+
#overview-charts .overview-chart-card{margin:0;padding:24px;min-width:0;overflow:visible}
|
|
524
|
+
.chart-card-header{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:14px}
|
|
525
|
+
.chart-card-header h2{margin:0;font-size:17px;font-weight:550;line-height:1.5}
|
|
526
|
+
.chart-range{margin-left:auto;flex-wrap:nowrap;font-size:12px}.chart-range button{padding:6px 9px;min-height:30px}
|
|
527
|
+
.chart-period{margin:0 0 22px;min-height:20px}.chart-content{min-height:274px;min-width:0}.chart-content>.empty{min-height:220px;display:flex;align-items:center;justify-content:center}
|
|
528
|
+
.chart-status{margin:4px 0 0!important;min-height:0}.chart-status:empty{display:none}
|
|
529
|
+
.activity-frame,.agent-column-plot{display:flex;gap:10px;height:216px;padding-top:16px}
|
|
530
|
+
.chart-y-labels{width:40px;flex:none;display:flex;flex-direction:column;justify-content:space-between;font-size:10px;color:var(--muted);font-variant-numeric:tabular-nums;text-align:right;height:180px;padding-top:4px}
|
|
531
|
+
.activity-plot{position:relative;flex:1;min-width:0;height:190px}.activity-plot>svg{display:block;width:100%;height:190px;overflow:visible}
|
|
532
|
+
.chart-hit-grid{position:absolute;inset:0;display:grid}.chart-hit{position:relative;outline:none;background:transparent}
|
|
533
|
+
.chart-line-dot{display:none;position:absolute;width:8px;height:8px;transform:translate(-50%,-50%);border:2px solid var(--panel);border-radius:50%;background:var(--dot-color);box-shadow:0 0 0 1px var(--dot-color);pointer-events:none}
|
|
534
|
+
.chart-hit:hover .chart-line-dot,.chart-hit:focus-visible .chart-line-dot{display:block}
|
|
535
|
+
.chart-popover{text-align:left;width:max-content;max-width:calc(100vw - 32px);display:none;position:absolute;z-index:5;top:10px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--panel);box-shadow:var(--shadow);font-size:12px;line-height:1.7;white-space:nowrap;pointer-events:none;color:var(--text)}
|
|
536
|
+
.chart-tooltip-row{display:grid;grid-template-columns:auto auto;gap:16px;align-items:baseline;margin-top:4px}.chart-tooltip-row>span{color:var(--muted)}.chart-tooltip-row>strong{font-weight:650;font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap}.chart-tooltip-detail{font-weight:400}.chart-popover>strong{display:block;margin-bottom:6px;color:var(--muted);font-weight:500}
|
|
537
|
+
.chart-popover.align-left{left:0}.chart-popover.align-right{right:0}
|
|
538
|
+
.chart-hit:hover .chart-popover,.chart-hit:focus-visible .chart-popover,.agent-bar-space:hover~.chart-popover,.agent-column:focus-visible .chart-popover{display:block}
|
|
539
|
+
.chart-x-labels{display:flex;justify-content:space-between;font-size:10px;color:var(--muted);margin-top:8px}
|
|
540
|
+
.chart-key{display:flex;gap:18px;font-size:12px;margin:18px 0 10px;color:var(--muted)}.chart-key span{display:inline-flex;align-items:center;gap:7px}
|
|
541
|
+
.chart-key i,.model-chart-legend i,.reuse-legend i{display:inline-block;width:8px;height:8px;border-radius:50%;flex:none}
|
|
542
|
+
.agent-columns{flex:1;min-width:0;display:flex;justify-content:space-evenly;gap:0;position:relative;border-bottom:1px solid var(--line);height:180px;background:repeating-linear-gradient(to top,transparent 0,transparent 88px,var(--line) 89px,transparent 90px)}
|
|
543
|
+
.agent-column{--agent-chart-color:hsl(var(--agent-hue) 55% 52%);min-width:0;flex:1;text-align:center;position:relative;outline-offset:3px}.agent-bar-space{width:32px;margin:0 auto;height:180px;display:flex;justify-content:center;align-items:flex-end}
|
|
544
|
+
.agent-bar{position:relative;width:32px;flex:none;display:flex;flex-direction:column;border-radius:5px 5px 0 0;background:var(--agent-chart-color);border:0}.agent-bar>span:not(.chart-popover):not(.agent-bar-total){display:block;flex-shrink:0}.agent-bar>span:first-child{border-radius:5px 5px 0 0}
|
|
545
|
+
.agent-bar-total{pointer-events:none;position:absolute;top:-22px;left:50%;transform:translateX(-50%);font-size:11px;font-weight:600;white-space:nowrap}
|
|
546
|
+
.agent-column>.chart-popover{left:50%;transform:translateX(-50%);top:4px}.agent-column:first-child>.chart-popover{left:0;transform:none}.agent-column:last-child>.chart-popover{left:auto;right:0;transform:none}.agent-column:only-child>.chart-popover{left:50%;right:auto;transform:translateX(-50%)}.agent-bar-label{display:flex;align-items:center;justify-content:center;gap:5px;padding:0 4px;margin-top:10px;min-width:0;font-size:11px;color:var(--muted)}.agent-bar-label>i{width:6px;height:6px;flex:none;border-radius:50%;background:var(--agent-chart-color)}.agent-bar-label>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
547
|
+
|
|
548
|
+
.model-donut-layout{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:20px;align-items:center;min-height:230px}.model-donut{position:relative;width:min(100%,220px);justify-self:center}.model-donut svg{display:block;width:100%;height:auto}.model-donut circle:hover,.model-donut circle:focus{filter:brightness(.82);outline:none}
|
|
549
|
+
.model-tooltip{top:0;left:50%;transform:translateX(-50%);width:max-content;max-width:240px;white-space:normal;overflow-wrap:anywhere}.donut-center{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;pointer-events:none}.donut-center strong{font-size:24px;font-weight:600}.donut-center span{font-size:11px;color:var(--muted)}
|
|
550
|
+
.model-chart-legend,.reuse-legend{list-style:none;margin:0;padding:0;min-width:0;flex:1}.model-chart-legend li{display:grid;grid-template-columns:8px minmax(0,1fr) auto;gap:4px 8px;align-items:center;margin:13px 0;font-size:11px}.model-chart-legend li>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.model-chart-legend li>small{grid-column:2/4;color:var(--muted)}.model-chart-legend i{border:1px solid var(--line)}.model-chart-legend strong,.reuse-legend strong{font-weight:600;font-variant-numeric:tabular-nums}
|
|
551
|
+
.reuse-key{gap:12px;flex-wrap:wrap}.reuse-summary{font-size:12px;margin:10px 0}.reuse-summary>strong{color:var(--token-agent);font-size:18px;font-weight:600}.chart-content>.live-note{margin-bottom:0;font-size:11px;line-height:1.7}
|
|
552
|
+
#overview-attention-panel[hidden]{display:none}
|
|
553
|
+
@media(max-width:1200px){.model-donut-layout{gap:8px}.donut-center strong{font-size:21px}.reuse-headline{gap:12px}.reuse-headline>strong{font-size:36px}}
|
|
554
|
+
@media(max-width:1000px){#overview-charts{grid-template-columns:1fr}}
|
|
555
|
+
@media(max-width:520px){#overview-charts .overview-chart-card{padding:18px}.chart-card-header h2{font-size:16px}.chart-card-header{gap:8px}.chart-range button{padding:5px 7px}.model-donut-layout{grid-template-columns:1fr;gap:0}.model-chart-legend{width:100%;max-width:none}.reuse-legend li{font-size:11px;gap:7px}.reuse-headline>strong{font-size:34px}.chart-period{font-size:10px}}
|
|
556
|
+
|
|
557
|
+
.kb-toolbar button{background:var(--panel);color:var(--text);border:1px solid var(--line);border-radius:160px;padding:8px 14px;font-size:12px;min-height:38px}
|
|
558
|
+
.kb-toolbar button:hover{background:var(--raised)}
|
|
559
|
+
#kb-source,#kb-demo-size,#kb-search{background:var(--panel);color:var(--text);border:1px solid var(--line);border-radius:6px;padding:8px 12px;font:12px/1.5 Poppins,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;min-height:38px}
|
|
483
560
|
`;
|
|
484
|
-
exports.dashboardFontLink = "<script>(function(){var i=location.pathname.lastIndexOf('/dashboard');if(i<0)return;var l=document.createElement('link');l.rel='stylesheet';l.href=location.pathname.slice(0,i)+'/dashboard/fonts.css';document.head.appendChild(l);})();</script>";
|
|
561
|
+
exports.dashboardFontLink = '<link rel="icon" type="image/png" href="' + exports.dashboardIconUrl + '">' + "<script>(function(){var i=location.pathname.lastIndexOf('/dashboard');if(i<0)return;var l=document.createElement('link');l.rel='stylesheet';l.href=location.pathname.slice(0,i)+'/dashboard/fonts.css';document.head.appendChild(l);})();</script>";
|
|
485
562
|
//# sourceMappingURL=dashboard-theme.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-theme.js","sourceRoot":"","sources":["../../src/ui/dashboard-theme.ts"],"names":[],"mappings":";;;AAAA,kEAAkE;AACrD,QAAA,cAAc,GAAG,MAAM,CAAC,GAAG,CAAA
|
|
1
|
+
{"version":3,"file":"dashboard-theme.js","sourceRoot":"","sources":["../../src/ui/dashboard-theme.ts"],"names":[],"mappings":";;;AAAA,6EAA6E;AAChE,QAAA,gBAAgB,GAAG,wsnBAAwsnB,CAAC;AACzunB,kEAAkE;AACrD,QAAA,cAAc,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyiBvC,CAAC;AACW,QAAA,iBAAiB,GAAG,0CAA0C,GAAC,wBAAgB,GAAC,IAAI,GAAG,oPAAoP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-activity.d.ts","sourceRoot":"","sources":["../../src/ui/memory-activity.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,QAY9B,CAAC;AACF,eAAO,MAAM,oBAAoB,QAgGhC,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.memoryActivityClient = exports.memoryActivityHtml = void 0;
|
|
4
|
+
/** Memory maintenance shares the dashboard theme, but owns its refresh and drawer state. */
|
|
5
|
+
exports.memoryActivityHtml = String.raw `
|
|
6
|
+
<div class="heading"><h2>Nightly dreaming</h2><p>Completed compactions and memory reports, newest first.</p></div>
|
|
7
|
+
<div class="dash-grid" id="memory-stats"></div>
|
|
8
|
+
<div class="report-toolbar turn-filters memory-filters">
|
|
9
|
+
<div id="memory-kind" class="range-toggle" role="group" aria-label="Activity"><button type="button" data-kind="all" aria-pressed="true">All</button><button type="button" data-kind="memory_dream" aria-pressed="false">Memory Dream</button><button type="button" data-kind="session_compaction" aria-pressed="false">Session Compaction</button></div>
|
|
10
|
+
<div id="memory-status" class="range-toggle" role="group" aria-label="Status"><button type="button" data-status="all" aria-pressed="false">All</button><button type="button" data-status="pending" aria-pressed="true">Pending</button><button type="button" data-status="running" aria-pressed="true">Running</button><button type="button" data-status="completed" aria-pressed="true">Completed</button><button type="button" data-status="failed" aria-pressed="true">Failed</button><button type="button" data-status="partial_failure" aria-pressed="true">Partially failed</button><button type="button" data-status="interrupted" aria-pressed="true">Interrupted</button><button type="button" data-status="skipped" aria-pressed="false">Skipped</button></div>
|
|
11
|
+
<select id="memory-agent" aria-label="Filter by agent"><option value="">All agents</option></select>
|
|
12
|
+
</div>
|
|
13
|
+
<p class="live-note"><span id="memory-updated" role="status"></span> · <span id="memory-range-note">Uses the date range above.</span> Up to 100 recorded runs per activity per agent. Only successful compactions are shown. Missing measurements are shown as —.</p>
|
|
14
|
+
<p id="memory-error" class="error" role="status" hidden></p>
|
|
15
|
+
<div id="memory-results"></div><div class="dash-pager"><span id="memory-page"></span><div class="row"><button id="memory-prev">← Previous</button><button id="memory-next">Next →</button></div>
|
|
16
|
+
<div id="memory-back" class="dash-drawer-back"><section id="memory-drawer" class="dash-drawer" role="dialog" aria-modal="true" aria-label="Memory activity details" tabindex="-1"></section></div>
|
|
17
|
+
`;
|
|
18
|
+
exports.memoryActivityClient = String.raw `
|
|
19
|
+
(function(){
|
|
20
|
+
const byId=id=>document.getElementById(id),txt=escHtml;
|
|
21
|
+
let page=0,generation=0,detailGeneration=0,busy=false,controller=null,selected=null,focus=null,detailBusy=false,applying=false;
|
|
22
|
+
const field=id=>byId('memory-'+id).value;
|
|
23
|
+
let activity='all';
|
|
24
|
+
const statuses=['pending','running','completed','failed','partial_failure','interrupted','skipped'];
|
|
25
|
+
const selectedStatuses=new Set(statuses.filter(s=>s!=='skipped'));
|
|
26
|
+
const number=compactNumber;
|
|
27
|
+
const time=n=>n==null?'—':new Date(n).toLocaleString('en-GB',{timeZone:dashboardTimezone});
|
|
28
|
+
const age=n=>{if(n==null)return '—';const seconds=Math.max(0,Math.floor((Date.now()-n)/1000));return seconds<60?seconds+'s ago':seconds<3600?Math.floor(seconds/60)+'m ago':seconds<86400?Math.floor(seconds/3600)+'h '+Math.floor(seconds%3600/60)+'m ago':Math.floor(seconds/86400)+'d ago';};
|
|
29
|
+
const timeCell=n=>txt(time(n))+'<br><span class="live-note">'+txt(age(n))+'</span>';
|
|
30
|
+
const percent=(value,total)=>value==null||!(total>0)?'—':(value/total*100).toFixed(2)+'%';
|
|
31
|
+
const tokens=(value,window)=>number(value)+(value!=null&&window>0?'<br><span class="live-note">'+percent(value,window)+' of window</span>':'');
|
|
32
|
+
const reduction=(before,after)=>before==null||after==null?'—':number(before-after)+'<br><span class="live-note">'+percent(before-after,before)+' reduction</span>';
|
|
33
|
+
const title=kind=>kind==='memory_dream'?'Memory Dream':'Session Compaction';
|
|
34
|
+
const activityBadge=kind=>'<span class="memory-activity-label '+(kind==='memory_dream'?'memory-dream':'session-compaction')+'">'+title(kind)+'</span>';
|
|
35
|
+
const badge=taskStatusBadge;
|
|
36
|
+
const reason=value=>{const labels={pending_input:'Pending input',active_tasks:'Active tasks',recent_activity:'Recently active',unchanged_measurement:'No new measurement',no_measurement:'No recorded measurement',already_compacted:'Already compacted',context_changed:'Context changed; awaiting a fresh measurement',below_threshold:'Below context threshold',run_limit:'Run limit reached',model_window_unavailable:'Context window unavailable',missing_transcript:'Session transcript unavailable',agent_busy:'Agent is responding',gateway_stopping:'Gateway is stopping',COMPACTION_FAILED:'Compaction failed',INTERRUPTED:'Interrupted'};return labels[value]||String(value||'—').replace(/_/g,' ').toLowerCase().replace(/^./,c=>c.toUpperCase());};
|
|
37
|
+
const showError=message=>{byId('memory-error').textContent=message;byId('memory-error').hidden=!message;};
|
|
38
|
+
const table=(head,rows)=>{const widths=head.length===6?[17,15,15,14,29,10]:[24,18,19,17,22];return '<div class="table-wrap"><table class="data-table memory-table" style="min-width:'+(head.length===6?900:660)+'px"><colgroup>'+widths.map(w=>'<col style="width:'+w+'%">').join('')+'</colgroup><thead><tr>'+head.map(h=>'<th>'+h+'</th>').join('')+'</tr></thead><tbody>'+rows.join('')+'</tbody></table></div>';};
|
|
39
|
+
const query=()=>new URLSearchParams({agentId:field('agent'),kind:activity,status:selectedStatuses.size===statuses.length?'all':[...selectedStatuses].join(',')||'none',scope:dashboardScope,page:String(page),completedOnly:'true'});
|
|
40
|
+
function close(){detailGeneration++;selected=null;byId('memory-back').classList.remove('open');document.body.style.overflow='';if(focus?.isConnected)focus.focus();}
|
|
41
|
+
async function load(force){
|
|
42
|
+
if(document.hidden||byId('view-dreams').style.display==='none')return;
|
|
43
|
+
if(force){controller?.abort();busy=false;page=0;}
|
|
44
|
+
if(busy)return;
|
|
45
|
+
busy=true;const version=++generation;controller=new AbortController();
|
|
46
|
+
byId('memory-updated').textContent='Updating…';
|
|
47
|
+
try{
|
|
48
|
+
const response=await fetch(apiUrl('/dashboard/memory-activity')+'?'+query(),{signal:controller.signal});
|
|
49
|
+
if(response.status===401){onUnauthorized();return;}if(!response.ok)throw Error('HTTP '+response.status);
|
|
50
|
+
const data=await response.json();if(version!==generation)return;
|
|
51
|
+
byId('memory-range-note').textContent=dashboardScope==='all'?'All recorded history.':'Since '+new Date(data.since).toLocaleString('en-GB',{timeZone:data.timezone})+' ('+data.timezone+').';
|
|
52
|
+
const previous=field('agent');byId('memory-agent').innerHTML='<option value="">All agents</option>'+data.agents.map(a=>'<option value="'+txt(a)+'">'+txt(a)+'</option>').join('');byId('memory-agent').value=previous;
|
|
53
|
+
byId('memory-stats').innerHTML=[['Recorded runs',data.counts.runs],['Proposals to review',data.counts.pendingProposals],['Failed runs',data.counts.failed]].map(([label,n])=>'<div class="dash-stat"><span>'+label+'</span><strong>'+number(n)+'</strong></div>').join('');
|
|
54
|
+
showError((data.unavailable||[]).join(' · '));
|
|
55
|
+
byId('memory-results').innerHTML=data.runs.length?table(['Time','Agent','Activity','Status','Summary','Details'],data.runs.map(r=>'<tr data-memory-id="'+txt(r.id)+'" data-memory-agent="'+txt(r.agent)+'">'+('<td>'+timeCell(r.startedAt)+'</td><td>'+agentBadge(r.agent)+'</td><td>'+activityBadge(r.kind)+'</td><td>'+badge(r.status)+'</td><td>'+(r.kind==='memory_dream'?txt(r.summary||r.outcome):'<strong>'+number(r.beforeTokens)+' → '+number(r.afterTokens)+'</strong><br>'+percent(r.beforeTokens,r.contextWindow)+' → '+percent(r.afterTokens,r.contextWindow)+' of window<br>'+reduction(r.beforeTokens,r.afterTokens))+'</td>')+'<td><button data-memory-open>Inspect</button></td></tr>')):'<p class="empty">No recorded activities match these filters.</p>';
|
|
56
|
+
byId('memory-page').textContent='Page '+(page+1)+' · '+number(data.total)+' runs';byId('memory-prev').disabled=page===0;byId('memory-next').disabled=(page+1)*25>=data.total;
|
|
57
|
+
byId('memory-updated').textContent='Updated '+new Date().toLocaleTimeString('en-GB',{timeZone:dashboardTimezone});
|
|
58
|
+
if(selected?.status==='running'&&!detailBusy&&!applying)void detail(selected.agent,selected.id,true);
|
|
59
|
+
}catch(error){if(error.name!=='AbortError'&&version===generation){showError('Unable to load activity: '+error.message);byId('memory-updated').textContent='Retrying…';}}
|
|
60
|
+
finally{if(version===generation)busy=false;}
|
|
61
|
+
}
|
|
62
|
+
async function detail(agent,id,refresh=false){
|
|
63
|
+
const version=++detailGeneration;detailBusy=true;
|
|
64
|
+
if(!refresh){dashClose();focus=document.activeElement;selected={agent,id};}
|
|
65
|
+
const panel=byId('memory-drawer');
|
|
66
|
+
if(!refresh){byId('memory-back').classList.add('open');document.body.style.overflow='hidden';panel.focus();panel.innerHTML=dashboardCloseButton('memory')+'<p>Loading recorded details…</p>';}
|
|
67
|
+
try{
|
|
68
|
+
const response=await fetch(apiUrl('/dashboard/memory-activity')+'?'+new URLSearchParams({agentId:agent,id,completedOnly:'true'}));
|
|
69
|
+
if(response.status===401){onUnauthorized();return;}if(!response.ok)throw Error('HTTP '+response.status);
|
|
70
|
+
const {run:r}=await response.json();if(version!==detailGeneration)return;
|
|
71
|
+
let body=dashboardCloseButton('memory')+'<h1>'+title(r.kind)+'</h1><p class="live-note">'+agentBadge(agent)+' · '+txt(time(r.startedAt))+'</p>'+badge(r.status)+'<p id="memory-apply-result" role="status"></p>';
|
|
72
|
+
if(r.kind==='memory_dream'){
|
|
73
|
+
body+='<h2>Summary</h2><p>'+txt(r.summary||'No summary recorded')+'</p><p class="live-note">Mode: '+txt(r.mode)+' · Outcome: '+txt(r.outcome)+' · Tokens: '+number(r.tokens)+' · Sessions: '+number(r.sessions)+'</p>';
|
|
74
|
+
if(r.pendingProposals)body+='<button data-memory-accept="all" data-memory-ts="'+Number(r.ts)+'">Accept all pending ('+number(r.pendingProposals)+')</button>';
|
|
75
|
+
body+='<h2>Memory proposals</h2>'+(r.proposals||[]).map(p=>'<section class="dash-panel"><h3>'+txt(p.op)+' · '+txt(p.file)+'</h3><p>'+txt(p.reason)+'</p>'+(p.target?'<h4>Current text</h4><pre>'+txt(p.target)+'</pre>':'')+(p.content?'<h4>Proposed text</h4><pre>'+txt(p.content)+'</pre>':'')+'<p class="live-note">Score: '+number(p.score)+' · Recall: '+number(p.recallCount)+'</p>'+(p.accepted?badge('accepted'):r.mode==='propose'?'<button data-memory-accept="'+Number(p.index)+'" data-memory-ts="'+Number(r.ts)+'">Accept proposal</button>':'')+'</section>').join('');
|
|
76
|
+
}else{
|
|
77
|
+
body+='<h2>Run settings</h2><p>Context threshold '+number(r.config.thresholdPercent)+'% · Quiet '+number(r.config.quietMinutes)+' minutes · Maximum '+number(r.config.maxSessionsPerRun)+' sessions</p><p class="live-note">Ended: '+txt(time(r.endedAt))+'. Native context compaction preserves canonical chat history. Token values describe context, not cost. Before/after percentages use the context window; reduction uses the before value. Measurements use saved CLI metadata only—no additional model requests.</p><h2>Sessions</h2><p class="live-note">Showing '+number((r.items||[]).length)+' of '+number(r.itemCount??(r.items||[]).length)+' recorded sessions.</p>';
|
|
78
|
+
body+=table(['Session','Before','After','Reduced','Duration'],(r.items||[]).map(item=>'<tr><td style="white-space:normal;overflow-wrap:anywhere">'+txt(item.sessionId)+'</td><td>'+tokens(item.beforeTokens,item.contextWindow)+'</td><td>'+tokens(item.afterTokens,item.contextWindow)+'</td><td>'+reduction(item.beforeTokens,item.afterTokens)+'</td><td>'+txt(item.endedAt!=null?Math.round((item.endedAt-item.startedAt)/1000)+'s':'—')+'</td></tr>'));
|
|
79
|
+
}
|
|
80
|
+
const signature=JSON.stringify(r);selected.status=r.status;
|
|
81
|
+
if(!refresh||panel.dataset.record!==signature){
|
|
82
|
+
const scroll=panel.scrollTop,active=document.activeElement,inside=panel.contains(active),accept=active?.dataset?.memoryAccept;
|
|
83
|
+
const previousNotice=byId('memory-apply-result')?.textContent||'';const notice=previousNotice==='Detail refresh unavailable; retrying.'?'':previousNotice;
|
|
84
|
+
panel.innerHTML=body;panel.dataset.record=signature;panel.scrollTop=scroll;
|
|
85
|
+
byId('memory-apply-result').textContent=notice;
|
|
86
|
+
if(inside){const replacement=accept!==undefined?[...panel.querySelectorAll('[data-memory-accept]')].find(b=>b.dataset.memoryAccept===accept):active?.hasAttribute('data-memory-close')?panel.querySelector('[data-memory-close]'):panel; (replacement||panel).focus({preventScroll:true});}
|
|
87
|
+
}
|
|
88
|
+
}catch(error){if(version===detailGeneration){if(refresh&&byId('memory-apply-result'))byId('memory-apply-result').textContent='Detail refresh unavailable; retrying.';else panel.innerHTML=dashboardCloseButton('memory')+'<p class="error">Unable to read details: '+txt(error.message)+'</p>';}}finally{if(version===detailGeneration)detailBusy=false;}
|
|
89
|
+
}
|
|
90
|
+
byId('memory-results').addEventListener('click',e=>{const row=e.target.closest('[data-memory-id]');if(row)detail(row.dataset.memoryAgent,row.dataset.memoryId);});
|
|
91
|
+
byId('memory-back').addEventListener('click',async e=>{
|
|
92
|
+
if(e.target.id==='memory-back'||e.target.closest('[data-memory-close]')){close();return;}
|
|
93
|
+
const button=e.target.closest('[data-memory-accept]');if(!button||!selected||applying)return;applying=true;
|
|
94
|
+
const target={...selected};const version=detailGeneration;
|
|
95
|
+
byId('memory-drawer').querySelectorAll('[data-memory-accept]').forEach(b=>b.disabled=true);
|
|
96
|
+
try{
|
|
97
|
+
const payload={agentId:target.agent,ts:Number(button.dataset.memoryTs)};if(button.dataset.memoryAccept!=='all')payload.indexes=[Number(button.dataset.memoryAccept)];
|
|
98
|
+
const response=await fetch(apiUrl('/knowledge/dreams/apply'),{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload)});
|
|
99
|
+
if(response.status===401){onUnauthorized();return;}const result=await response.json();if(!response.ok)throw Error(result.error||'Apply failed');
|
|
100
|
+
if(version!==detailGeneration)return;await detail(target.agent,target.id,true);
|
|
101
|
+
if(selected?.id===target.id&&selected?.agent===target.agent)byId('memory-apply-result')&&(byId('memory-apply-result').textContent='Applied '+number(result.applied)+' · Skipped '+number(result.skipped)+' · Already accepted '+number(result.alreadyAccepted));
|
|
102
|
+
load(false);
|
|
103
|
+
}catch(error){if(version===detailGeneration){byId('memory-apply-result').textContent=error.message;byId('memory-drawer').querySelectorAll('[data-memory-accept]').forEach(b=>b.disabled=false);}}finally{applying=false;if(selected?.id===target.id&&selected?.agent===target.agent)byId('memory-drawer').querySelectorAll('[data-memory-accept]').forEach(b=>b.disabled=false);}
|
|
104
|
+
});
|
|
105
|
+
document.addEventListener('keydown',e=>{if(!selected)return;if(e.key==='Escape')close();if(e.key==='Tab'){const nodes=[...byId('memory-drawer').querySelectorAll('button,a,summary')].filter(n=>n.getClientRects().length),first=nodes[0],last=nodes[nodes.length-1];if(e.shiftKey&&(document.activeElement===first||document.activeElement===byId('memory-drawer'))){e.preventDefault();last?.focus();}else if(!e.shiftKey&&document.activeElement===last){e.preventDefault();first?.focus();}}});
|
|
106
|
+
byId('memory-agent').addEventListener('change',()=>{close();load(true);});
|
|
107
|
+
byId('memory-kind').addEventListener('click',e=>{const button=e.target.closest('[data-kind]');if(!button)return;activity=button.dataset.kind;byId('memory-kind').querySelectorAll('[data-kind]').forEach(b=>b.setAttribute('aria-pressed',String(b.dataset.kind===activity)));close();load(true);});
|
|
108
|
+
byId('memory-status').addEventListener('click',e=>{const button=e.target.closest('[data-status]');if(!button)return;const status=button.dataset.status;if(status==='all'){statuses.forEach(s=>selectedStatuses.add(s));}else if(selectedStatuses.has(status)){selectedStatuses.delete(status);}else{selectedStatuses.add(status);}byId('memory-status').querySelectorAll('[data-status]').forEach(b=>b.setAttribute('aria-pressed',String(b.dataset.status==='all'?selectedStatuses.size===statuses.length:selectedStatuses.has(b.dataset.status))));close();load(true);});
|
|
109
|
+
byId('memory-prev').onclick=()=>{page=Math.max(0,page-1);controller?.abort();busy=false;load(false);};byId('memory-next').onclick=()=>{page++;controller?.abort();busy=false;load(false);};
|
|
110
|
+
document.addEventListener('click',e=>{if(e.target.closest('.tab')&&selected)close();});
|
|
111
|
+
document.addEventListener('visibilitychange',()=>{if(!document.hidden)load(false);});
|
|
112
|
+
setInterval(()=>load(false),15000);window.__loadDreams=force=>load(Boolean(force));
|
|
113
|
+
})();
|
|
114
|
+
`;
|
|
115
|
+
//# sourceMappingURL=memory-activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-activity.js","sourceRoot":"","sources":["../../src/ui/memory-activity.ts"],"names":[],"mappings":";;;AAAA,4FAA4F;AAC/E,QAAA,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;CAY3C,CAAC;AACW,QAAA,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgG7C,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/** Refresh rendered data only; keep filters, theme, scroll and the open turn-detail panel. */
|
|
2
|
-
export declare const tokenReportClient = "\nvar reportRefreshing=false;\nasync function refreshReport(){\n if(document.hidden||reportRefreshing)return;\n reportRefreshing=true;\n var status=document.getElementById('report-live');\n try{\n var response=await fetch(location.href,{cache:'no-store',headers:{Accept:'text/html'}});\n if(response.status===401){location.reload();return;}\n if(!response.ok)throw Error('Unavailable');\n var next=new DOMParser().parseFromString(await response.text(),'text/html');\n if(next.getElementById('login-form')){location.reload();return;}\n if(!next.getElementById('report-totals'))throw Error('Unavailable');\n var scrolls=Array.from(document.querySelectorAll('.table-scroll')).map(function(el){return el.scrollLeft;});\n var x=scrollX,y=scrollY;\n ['report-status','report-totals','report-footprint','report-distribution'].forEach(function(id){var old=document.getElementById(id),fresh=next.getElementById(id);if(old.innerHTML!==fresh.innerHTML)old.innerHTML=fresh.innerHTML;});\n var body=document.querySelector('.report-table tbody'),freshBody=next.querySelector('.report-table tbody');\n if(body.innerHTML!==freshBody.innerHTML)body.innerHTML=freshBody.innerHTML;\n var pagers=next.querySelectorAll('.report-pager');document.querySelectorAll('.report-pager').forEach(function(el,i){if(pagers[i])el.innerHTML=pagers[i].innerHTML;});\n var model=document.getElementById('turn-model'),freshModel=next.getElementById('turn-model'),selected=model.value;\n if(model.innerHTML!==freshModel.innerHTML){model.innerHTML=freshModel.innerHTML;if(selected&&!Array.from(model.options).some(function(o){return o.value===selected;})){var option=document.createElement('option');option.value=selected;option.textContent=selected+' (no turns on this page)';model.appendChild(option);}model.value=selected;}\n filter();if(typeof reportRenderDrawer==='function')reportRenderDrawer();document.querySelectorAll('.table-scroll').forEach(function(el,i){el.scrollLeft=scrolls[i]||0;});scrollTo(x,y);\n status.textContent='Live \u00B7 updated '+new Date().toLocaleTimeString();\n }catch(e){status.textContent='Reconnecting\u2026 \u00B7 data may be outdated';}\n finally{reportRefreshing=false;}\n}\nsetInterval(refreshReport,5000);\ndocument.addEventListener('visibilitychange',function(){if(!document.hidden)refreshReport();});\n";
|
|
2
|
+
export declare const tokenReportClient = "\nvar reportRefreshing=false;\nasync function refreshReport(){\n if(document.hidden||reportRefreshing)return;\n reportRefreshing=true;\n var status=document.getElementById('report-live');\n try{\n var response=await fetch(location.href,{cache:'no-store',headers:{Accept:'text/html'}});\n if(response.status===401){location.reload();return;}\n if(!response.ok)throw Error('Unavailable');\n var next=new DOMParser().parseFromString(await response.text(),'text/html');\n if(next.getElementById('login-form')){location.reload();return;}\n if(!next.getElementById('report-totals'))throw Error('Unavailable');\n var scrolls=Array.from(document.querySelectorAll('.table-scroll')).map(function(el){return el.scrollLeft;});\n var x=scrollX,y=scrollY;\n ['report-status','report-totals','report-footprint','report-distribution'].forEach(function(id){var old=document.getElementById(id),fresh=next.getElementById(id);if(old.innerHTML!==fresh.innerHTML)old.innerHTML=fresh.innerHTML;});\n var body=document.querySelector('.report-table tbody'),freshBody=next.querySelector('.report-table tbody');\n if(body.innerHTML!==freshBody.innerHTML)body.innerHTML=freshBody.innerHTML;\n var pagers=next.querySelectorAll('.report-pager');document.querySelectorAll('.report-pager').forEach(function(el,i){if(pagers[i])el.innerHTML=pagers[i].innerHTML;});\n var model=document.getElementById('turn-model'),freshModel=next.getElementById('turn-model'),selected=model.value;\n if(model.innerHTML!==freshModel.innerHTML){model.innerHTML=freshModel.innerHTML;if(selected&&!Array.from(model.options).some(function(o){return o.value===selected;})){var option=document.createElement('option');option.value=selected;option.textContent=selected+' (no turns on this page)';model.appendChild(option);}model.value=selected;}\n filter();if(typeof reportRenderDrawer==='function')reportRenderDrawer();document.querySelectorAll('.table-scroll').forEach(function(el,i){el.scrollLeft=scrolls[i]||0;});scrollTo(x,y);\n status.textContent='Live \u00B7 updated '+new Date().toLocaleTimeString('en-GB',{timeZone:dashboardTimezone});\n }catch(e){status.textContent='Reconnecting\u2026 \u00B7 data may be outdated';}\n finally{reportRefreshing=false;}\n}\nsetInterval(refreshReport,5000);\ndocument.addEventListener('visibilitychange',function(){if(!document.hidden)refreshReport();});\n";
|
|
3
3
|
//# sourceMappingURL=token-report-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-report-client.d.ts","sourceRoot":"","sources":["../../src/ui/token-report-client.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"token-report-client.d.ts","sourceRoot":"","sources":["../../src/ui/token-report-client.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,eAAO,MAAM,iBAAiB,wzEA4B7B,CAAC"}
|
|
@@ -24,7 +24,7 @@ async function refreshReport(){
|
|
|
24
24
|
var model=document.getElementById('turn-model'),freshModel=next.getElementById('turn-model'),selected=model.value;
|
|
25
25
|
if(model.innerHTML!==freshModel.innerHTML){model.innerHTML=freshModel.innerHTML;if(selected&&!Array.from(model.options).some(function(o){return o.value===selected;})){var option=document.createElement('option');option.value=selected;option.textContent=selected+' (no turns on this page)';model.appendChild(option);}model.value=selected;}
|
|
26
26
|
filter();if(typeof reportRenderDrawer==='function')reportRenderDrawer();document.querySelectorAll('.table-scroll').forEach(function(el,i){el.scrollLeft=scrolls[i]||0;});scrollTo(x,y);
|
|
27
|
-
status.textContent='Live · updated '+new Date().toLocaleTimeString();
|
|
27
|
+
status.textContent='Live · updated '+new Date().toLocaleTimeString('en-GB',{timeZone:dashboardTimezone});
|
|
28
28
|
}catch(e){status.textContent='Reconnecting… · data may be outdated';}
|
|
29
29
|
finally{reportRefreshing=false;}
|
|
30
30
|
}
|
|
@@ -2,6 +2,7 @@ import type { RequestToolSchemas } from '../session/request-tool-capture';
|
|
|
2
2
|
import type { ContextFootprint } from '../orchestration/context-footprint';
|
|
3
3
|
/** Read-only admin report. Escape all stored model/tool metadata as untrusted text. */
|
|
4
4
|
export interface TokenReportView {
|
|
5
|
+
timezone?: string;
|
|
5
6
|
contextFootprint?: ContextFootprint;
|
|
6
7
|
contextWindow?: {
|
|
7
8
|
used: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-report.d.ts","sourceRoot":"","sources":["../../src/ui/token-report.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token-report.d.ts","sourceRoot":"","sources":["../../src/ui/token-report.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/token-report.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateTokenReportHtml = generateTokenReportHtml;
|
|
4
|
+
const dashboard_controls_1 = require("./dashboard-controls");
|
|
4
5
|
const dashboard_range_1 = require("./dashboard-range");
|
|
5
6
|
const token_report_client_1 = require("./token-report-client");
|
|
6
7
|
const dashboard_presentation_1 = require("./dashboard-presentation");
|
|
@@ -67,15 +68,15 @@ function turnLabel(turn) {
|
|
|
67
68
|
return 'Attempt #' + turn.attemptGeneration;
|
|
68
69
|
return 'Unnumbered turn';
|
|
69
70
|
}
|
|
70
|
-
function time(value) {
|
|
71
|
+
function time(value, timezone = 'UTC') {
|
|
71
72
|
const date = new Date(value);
|
|
72
|
-
return Number.isFinite(date.getTime()) ? date.toLocaleString('en-GB', { timeZone:
|
|
73
|
+
return Number.isFinite(date.getTime()) ? date.toLocaleString('en-GB', { timeZone: timezone, day: '2-digit', month: 'short', hour: '2-digit', minute: '2-digit', second: '2-digit' }) + ' ' + timezone : '—';
|
|
73
74
|
}
|
|
74
75
|
/** Turn/Date display: "Xs/m/h ago" within the last 24h (full datetime on hover),
|
|
75
76
|
* switching to the full inline datetime once older than a day. */
|
|
76
|
-
function relativeTime(value) {
|
|
77
|
+
function relativeTime(value, timezone = 'UTC') {
|
|
77
78
|
const t = new Date(value).getTime();
|
|
78
|
-
const full = time(value);
|
|
79
|
+
const full = time(value, timezone);
|
|
79
80
|
if (!Number.isFinite(t))
|
|
80
81
|
return { label: '—', title: '' };
|
|
81
82
|
const diff = Date.now() - t, day = 86400000;
|
|
@@ -90,16 +91,17 @@ function relativeTime(value) {
|
|
|
90
91
|
label = Math.round(diff / 3600000) + 'h ago';
|
|
91
92
|
return { label, title: full };
|
|
92
93
|
}
|
|
93
|
-
function footprintHtml(footprint) {
|
|
94
|
+
function footprintHtml(footprint, timezone = 'UTC') {
|
|
94
95
|
const parts = (footprint?.rows || []).filter(r => (r.name.startsWith('↳ ') || r.name.startsWith('Agent gateway tool schemas')) && r.hasContent !== false && r.tokens != null && r.tokens > 0);
|
|
95
96
|
const total = parts.reduce((sum, r) => sum + r.tokens, 0);
|
|
96
|
-
const colors =
|
|
97
|
+
const colors = dashboard_presentation_1.dashboardChartPalette;
|
|
97
98
|
const names = ['AGENTS.md', 'IDENTITY.md', 'SOUL.md', 'USER.md', 'MEMORY.md', 'HEARTBEAT.md', 'Skill catalog', 'Memory rules', 'Memory retrieval instructions'];
|
|
98
99
|
const color = (name) => { const i = names.indexOf(name.replace(/^↳ /, '')); return colors[i < 0 ? 9 : i]; };
|
|
99
100
|
const items = parts.map(r => { const name = r.name.replace(/^↳ /, ''); const source = footprint?.rows.find(row => row.name === name + ' · source file'); return { name, tokens: r.tokens, color: color(r.name), note: source?.tokens != null ? 'Included in bootstrap: ' + n(r.tokens) + '; full source file: ' + n(source.tokens) + ' estimated tokens.' : r.note }; });
|
|
100
|
-
return `<section id="report-footprint"><div class="report-toolbar"><h2 style="margin:0">Context bootstrap</h2><strong style="margin-left:auto">${total ? n(total) + ' estimated tokens' : '—'}</strong></div>${total ? `<div class="stacked-distribution" aria-label="Estimated context tokens by source">${items.map(r => `<span class="segment" style="background:${r.color};width:${r.tokens / total * 100}%" title="${escape(r.name)}: ${n(r.tokens)} tokens"></span>`).join('')}</div><div class="distribution-legend">${items.map(r => `<div class="distribution-item" title="${escape(r.note)}"><i style="background:${r.color}"></i><span>${escape(r.name)}</span><strong>${n(r.tokens)}</strong></div>`).join('')}</div>` : '<p class="muted">—</p>'}<p class="muted">Current CLAUDE.md sections after context budgets, plus Agent gateway tool schemas. Hover a file to compare its included portion with the full source file; MEMORY.md may be longer on disk. Estimated with cl100k_base, not historical turn attribution or the selected model’s exact token count. Excludes section headers, conversation history, runtime overlays, CLI instructions/tools and provider framing. ${footprint ? 'Checked ' + escape(time(footprint.observedAt)) + ' · refreshes every 30s.' : ''}</p></section>`;
|
|
101
|
+
return `<section id="report-footprint"><div class="report-toolbar"><h2 style="margin:0">Context bootstrap</h2><strong style="margin-left:auto">${total ? n(total) + ' estimated tokens' : '—'}</strong></div>${total ? `<div class="stacked-distribution" aria-label="Estimated context tokens by source">${items.map(r => `<span class="segment" style="background:${r.color};width:${r.tokens / total * 100}%" title="${escape(r.name)}: ${n(r.tokens)} tokens"></span>`).join('')}</div><div class="distribution-legend">${items.map(r => `<div class="distribution-item" title="${escape(r.note)}"><i style="background:${r.color}"></i><span>${escape(r.name)}</span><strong>${n(r.tokens)}</strong></div>`).join('')}</div>` : '<p class="muted">—</p>'}<p class="muted">Current CLAUDE.md sections after context budgets, plus Agent gateway tool schemas. Hover a file to compare its included portion with the full source file; MEMORY.md may be longer on disk. Estimated with cl100k_base, not historical turn attribution or the selected model’s exact token count. Excludes section headers, conversation history, runtime overlays, CLI instructions/tools and provider framing. ${footprint ? 'Checked ' + escape(time(footprint.observedAt, timezone)) + ' · refreshes every 30s.' : ''}</p></section>`;
|
|
101
102
|
}
|
|
102
103
|
function generateTokenReportHtml(agentId, report) {
|
|
104
|
+
const timezone = report.timezone || 'UTC';
|
|
103
105
|
const labels = { input: 'Agent · User input', report: 'Agent · Progress / results', worker: 'Worker' };
|
|
104
106
|
const categories = new Map();
|
|
105
107
|
for (const turn of report.turns.filter(t => t.usage))
|
|
@@ -142,25 +144,26 @@ function generateTokenReportHtml(agentId, report) {
|
|
|
142
144
|
const title = turn.category === 'report' ? (turn.responseText || turn.taskTitle || 'Task progress / results') : (turn.taskTitle || turn.inputTexts?.find(t => t.trim()) || turn.responseText || 'No conversation text recorded');
|
|
143
145
|
const number = turnLabel(turn);
|
|
144
146
|
const badge = turn.category === 'input' ? modality : labels[turn.category] || turn.category;
|
|
145
|
-
const started = relativeTime(turn.startedAt);
|
|
147
|
+
const started = relativeTime(turn.startedAt, timezone);
|
|
146
148
|
// Turns run one at a time per session by design, so a message can sit accepted for
|
|
147
149
|
// minutes before its own turn starts. Show that wait rather than leaving a slow turn
|
|
148
150
|
// looking broken; below ~2s it is just noise.
|
|
149
151
|
const wait = waited(turn.queuedMs);
|
|
150
152
|
const waitLine = turn.pending
|
|
151
|
-
? `<small class="turn-wait" title="Accepted ${escape(time(turn.startedAt))}; waiting for the previous turn in this session to finish">Waiting ${escape(wait || '0s')}</small>`
|
|
153
|
+
? `<small class="turn-wait" title="Accepted ${escape(time(turn.startedAt, timezone))}; waiting for the previous turn in this session to finish">Waiting ${escape(wait || '0s')}</small>`
|
|
152
154
|
: (wait && (turn.queuedMs ?? 0) >= 2000 ? `<small class="turn-wait" title="Time between accepting this message and its turn starting; turns run one at a time per session">Queued ${escape(wait)}</small>` : '');
|
|
153
155
|
const pendingNote = turn.pending ? '<p class="muted">This message has been accepted and is waiting for the previous turn in this session to finish. Token usage is recorded once its own turn runs, so this row is not counted in any total.</p>' : '';
|
|
154
|
-
return `<tr class="turn-row${turn.pending ? ' turn-pending' : ''}" tabindex="0" aria-expanded="false" data-turn-id="${escape(turn.id)}" data-category="${escape(turn.category)}" data-model="${escape(turn.model || '')}" data-status="${escape(turn.state || '')}"><td><strong>${escape(number)}</strong><small title="${escape(started.title)}">${escape(started.label)}</small>${waitLine}<small class="cell-model" title="${escape(turn.model)}">${escape(turn.model || '—')}</small></td><td><span class="turn-kind ${escape(turn.category)}">${escape(badge)}</span><strong class="turn-excerpt" title="${escape(title.slice(0, 1000))}">${escape(title.slice(0, 180))}${title.length > 180 ? '…' : ''}</strong>${turn.state ? statusBadge(turn.state) : ''}</td><td>${n(turn.usage?.inputTokens)}</td><td>${cacheWrite(turn.usage)}</td><td>${n(turn.usage?.cacheReadTokens)}</td><td>${n(turn.usage?.outputTokens)}</td><td><strong>${n(turn.usage?.totalTokens)}</strong></td><td>${turn.usage ? '<strong>' + cachedRatio(turn.usage.inputTokens, turn.usage.cacheReadTokens, turn.usage.cacheCreationTokens).toFixed(2) + '%</strong>' : '—'}</td><td>${tools('Loaded', turn.contextTools)}${tools('Used', turn.usedTools)}</td></tr><tr class="turn-extra" hidden data-turn-id="${escape(turn.id)}" data-category="${escape(turn.category)}"><td colspan="9"><h3>Conversation & request details</h3><p class="muted">Role: ${escape(turn.role)} · Turn ${escape(turn.id)}${turn.taskId ? ' · Task ' + escape(turn.taskId) : ''}${turn.endedAt ? ' · Ended ' + escape(time(turn.endedAt)) : ''}${wait ? ' · ' + escape(turn.pending ? 'Waiting ' + wait : 'Queued ' + wait + ' before starting') : ''}</p>${pendingNote}${conversationDetails(turn)}${requestDetails(turn.requests, turn.usage)}${turn.contextTools ? '<h3>Loaded tools</h3>' + (0, dashboard_presentation_1.toolNameList)(turn.contextTools) : ''}<h3>Used tools</h3>${(0, dashboard_presentation_1.toolNameList)(turn.usedTools)}<p class="muted">Loaded counts distinct schemas observed in requests, including referenced deferred tools. Used counts distinct tool names executed. ${turn.schemaCoverage ? `Schema capture: ${turn.schemaCoverage.measured}/${turn.schemaCoverage.total} observed requests.` : 'Schema capture was not recorded for this turn.'}</p></td></tr>`;
|
|
156
|
+
return `<tr class="turn-row${turn.pending ? ' turn-pending' : ''}" tabindex="0" aria-expanded="false" data-turn-id="${escape(turn.id)}" data-category="${escape(turn.category)}" data-model="${escape(turn.model || '')}" data-status="${escape(turn.state || '')}"><td><strong>${escape(number)}</strong><small title="${escape(started.title)}">${escape(started.label)}</small>${waitLine}<small class="cell-model" title="${escape(turn.model)}">${escape(turn.model || '—')}</small></td><td><span class="turn-kind ${escape(turn.category)}">${escape(badge)}</span><strong class="turn-excerpt" title="${escape(title.slice(0, 1000))}">${escape(title.slice(0, 180))}${title.length > 180 ? '…' : ''}</strong>${turn.state ? statusBadge(turn.state) : ''}</td><td>${n(turn.usage?.inputTokens)}</td><td>${cacheWrite(turn.usage)}</td><td>${n(turn.usage?.cacheReadTokens)}</td><td>${n(turn.usage?.outputTokens)}</td><td><strong>${n(turn.usage?.totalTokens)}</strong></td><td>${turn.usage ? '<strong>' + cachedRatio(turn.usage.inputTokens, turn.usage.cacheReadTokens, turn.usage.cacheCreationTokens).toFixed(2) + '%</strong>' : '—'}</td><td>${tools('Loaded', turn.contextTools)}${tools('Used', turn.usedTools)}</td></tr><tr class="turn-extra" hidden data-turn-id="${escape(turn.id)}" data-category="${escape(turn.category)}"><td colspan="9"><h3>Conversation & request details</h3><p class="muted">Role: ${escape(turn.role)} · Turn ${escape(turn.id)}${turn.taskId ? ' · Task ' + escape(turn.taskId) : ''}${turn.endedAt ? ' · Ended ' + escape(time(turn.endedAt, timezone)) : ''}${wait ? ' · ' + escape(turn.pending ? 'Waiting ' + wait : 'Queued ' + wait + ' before starting') : ''}</p>${pendingNote}${conversationDetails(turn)}${requestDetails(turn.requests, turn.usage)}${turn.contextTools ? '<h3>Loaded tools</h3>' + (0, dashboard_presentation_1.toolNameList)(turn.contextTools) : ''}<h3>Used tools</h3>${(0, dashboard_presentation_1.toolNameList)(turn.usedTools)}<p class="muted">Loaded counts distinct schemas observed in requests, including referenced deferred tools. Used counts distinct tool names executed. ${turn.schemaCoverage ? `Schema capture: ${turn.schemaCoverage.measured}/${turn.schemaCoverage.total} observed requests.` : 'Schema capture was not recorded for this turn.'}</p></td></tr>`;
|
|
155
157
|
}).join('');
|
|
156
158
|
return `<!DOCTYPE html><html lang="en" data-theme="light"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Session token report · Claude Gateway</title>${dashboard_theme_1.dashboardFontLink}<style>${dashboard_theme_1.dashboardTheme}
|
|
157
|
-
body{padding:28px;background:var(--bg);color:var(--text);font:15px/1.7 system-ui,-apple-system,"Noto Sans Thai",sans-serif}main{max-width:1560px;margin:auto;min-width:0}h1{font-size:28px;margin:20px 0 12px}h2{font-size:17px;color:var(--text);margin:0 0 20px}.report-header{display:flex;gap:
|
|
159
|
+
body{padding:28px;background:var(--bg);color:var(--text);font:15px/1.7 system-ui,-apple-system,"Noto Sans Thai",sans-serif}main{max-width:1560px;margin:auto;min-width:0}h1{font-size:28px;margin:20px 0 12px}h2{font-size:17px;color:var(--text);margin:0 0 20px}.report-title{margin:24px 0 18px}.report-header{display:flex;gap:20px;align-items:center;justify-content:space-between;flex-wrap:wrap;margin-bottom:24px}.report-identity{display:flex;flex-direction:column;gap:10px;min-width:0}.report-identity-meta{display:flex;align-items:center;gap:16px;flex-wrap:wrap;font-size:13px}.report-session{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;font-size:13px;overflow-wrap:anywhere}.report-range{flex:0 0 auto}.report-range .range-toggle{flex-wrap:nowrap}.report-range .range-toggle button{min-width:44px}.report-toolbar{display:flex;gap:12px;flex-wrap:wrap;align-items:center}.cards{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:18px}.cards .card{padding:22px}.card strong{display:block;font-size:30px;font-weight:500;margin-top:10px}section{background:var(--panel);border:1px solid var(--line);border-radius:18px;padding:22px;margin-top:22px}.muted{font-size:11px;color:var(--muted);overflow-wrap:anywhere}pre{white-space:pre-wrap;overflow-wrap:anywhere;max-height:400px;overflow:auto;background:var(--raised);padding:16px;border-radius:10px;font:12px/1.7 ui-monospace,monospace}a{color:var(--accent)}.report-pager{display:flex;gap:16px;justify-content:space-between;flex-wrap:wrap;font-size:12px;padding:18px 0}.report-pager-nav{display:inline-flex;gap:8px;flex-wrap:wrap}.stacked-distribution{display:flex;height:24px;overflow:hidden;border-radius:8px;margin:14px 0 22px;background:var(--raised)}.segment{height:100%}.input{--category:var(--token-agent)}.report{--category:var(--token-report)}.worker{--category:var(--token-worker)}.segment+.segment{border-left:3px solid var(--panel)}.segment,.distribution-item i{background:var(--category)}.distribution-legend{display:flex;gap:24px;flex-wrap:wrap}.distribution-item{display:flex;gap:8px;align-items:center;font-size:11px}.distribution-item i{height:9px;width:9px;border-radius:3px}.turn-kind{display:inline-block;padding:3px 8px;border-radius:5px;background:color-mix(in srgb,var(--category) 12%,var(--panel));color:var(--category);font-size:10px;font-weight:550}.turn-excerpt{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;line-height:1.7;margin:7px 0;font-weight:500}.cache-write{display:inline-flex;flex-wrap:wrap;gap:0 4px;max-width:100%;white-space:normal}.cache-duration{font-size:11px;color:var(--muted);white-space:nowrap}.report-table{width:100%;min-width:1000px;table-layout:fixed}.report-table>thead>tr>th,.report-table>tbody>.turn-row>td{padding:12px 8px}.report-table>tbody>.turn-row>td:nth-child(n+3){white-space:nowrap;font-size:14px}.report-table td:not(:first-child){font-variant-numeric:tabular-nums}.report-table .turn-extra td{padding-top:0}.turn-extra summary{font-size:11px;color:var(--muted);cursor:pointer}.turn-extra table{min-width:760px}.turn-extra details{margin:8px 0}.report-table details p{max-width:100%;overflow-wrap:anywhere;white-space:normal}.report-table th{white-space:normal;line-height:1.4}.report-table td small{font-size:10px}.report-table .turn-row>td:first-child>strong,.report-table .turn-row>td:first-child>small{display:block}.cell-model{overflow-wrap:anywhere;white-space:normal}.report-table td{border-bottom:0}.turn-extra td{border-bottom:1px solid var(--line)!important}.report-table details{font-size:11px}body[data-theme=dark]{color:var(--text)}@media(max-width:700px){body{padding:16px}.cards{grid-template-columns:1fr}section{padding:16px}}
|
|
158
160
|
.report-table,.footprint-table{font-size:13px;line-height:1.7}.report-table td small,.muted{font-size:12px}.turn-kind,.report-table details,.turn-extra summary,.distribution-item{font-size:12px}.turn-excerpt{font-weight:650}.report-table td>strong,.distribution-item strong,.footprint-table td:first-child,.footprint-table td:nth-child(2){font-weight:700}.report-table th,.footprint-table th{font-size:12px;letter-spacing:.03em}.footprint-table{min-width:800px;table-layout:fixed}.footprint-table th:first-child{width:30%}.footprint-table th:nth-child(2),.footprint-table th:nth-child(3){width:15%}.footprint-table td{overflow-wrap:anywhere}
|
|
159
161
|
.report-table .turn-extra{font-size:13px;line-height:1.7}.report-table .turn-extra p,.report-table .turn-extra .muted,.report-table .turn-extra summary,.report-table .turn-extra pre,.report-table .turn-extra td{font-size:13px;line-height:1.7}.report-table .turn-extra h3{font-size:13px;font-weight:700;margin:18px 0 8px}.report-table .turn-extra pre{font-family:inherit;font-weight:400}.turn-status{display:flex;align-items:center;gap:8px}.turn-status .badge{font-size:12px;font-weight:500}.turn-extra>td>details>summary{font-weight:600}
|
|
160
|
-
.report-table .turn-row[aria-expanded=true]{background:color-mix(in srgb,var(--accent) 14%,var(--panel))}.report-table .turn-pending{background:color-mix(in srgb,#a16c11 9%,var(--panel))}.report-table .turn-pending>td:first-child{box-shadow:inset 3px 0 0 #a16c11}.turn-wait{color:#a16c11;font-weight:600;overflow-wrap:anywhere;white-space:normal}#report-drawer
|
|
161
|
-
</style></head><body><main><div class="report-toolbar"><a href="../dashboard">← Dashboard</a><span id="report-live" class="muted" role="status">Live · every 5s</span
|
|
162
|
+
.report-table .turn-row[aria-expanded=true]{background:color-mix(in srgb,var(--accent) 14%,var(--panel))}.report-table .turn-pending{background:color-mix(in srgb,#a16c11 9%,var(--panel))}.report-table .turn-pending>td:first-child{box-shadow:inset 3px 0 0 #a16c11}.turn-wait{color:#a16c11;font-weight:600;overflow-wrap:anywhere;white-space:normal}#report-drawer .muted{font-size:12px}#report-drawer table{width:100%;border-collapse:collapse;font-size:12px;margin:10px 0}#report-drawer th,#report-drawer td{padding:7px 8px;text-align:left;border-bottom:1px solid var(--line);vertical-align:top;overflow-wrap:anywhere}#report-drawer .request-details,#report-drawer .conversation-details{margin-top:10px}
|
|
163
|
+
</style></head><body><main><div class="report-toolbar"><a href="../dashboard">← Dashboard</a><span id="report-live" class="muted" role="status">Live · every 5s</span>${(0, dashboard_controls_1.themeButtonHtml)('report-theme')}</div><h1 class="report-title">Session token report</h1><div class="report-header"><div class="report-identity"><div class="report-identity-meta">${(0, dashboard_presentation_1.agentBadge)(agentId)}<span id="report-status">${statusBadge(headerStatus)}</span>${(0, dashboard_presentation_1.channelBadge)(report.source || '')}</div><div class="report-session"><span class="muted">Session</span><span>${escape(report.sessionId)}</span></div></div><div class="report-range turn-filters">${(0, dashboard_range_1.rangeButtons)("report-scope", scope, timezone)}</div></div><div class="cards" id="report-totals">${contextWindowBox}<div class="card box-agent">Agent tokens<strong>${roleMeasured('agent') ? n(report.totals.agentTokens) : '—'}</strong>${roleMeasured('agent') ? cachedLineFor(agentU) : ''}</div><div class="card box-worker">Worker tokens<strong>${roleMeasured('worker') ? n(report.totals.workerTokens) : '—'}</strong>${roleMeasured('worker') ? cachedLineFor(workerU) : ''}</div><div class="card box-total">Total tokens<strong>${measured ? n(report.totals.totalTokens) : '—'}</strong>${measured ? cachedLineFor(totalU) : ''}</div></div><p class="muted">${report.since ? 'Turns started since ' + escape(time(report.since, timezone)) + '.' : 'All recorded turns.'} Totals include all pages. Token volume includes input, cache creation, cache reads and output; these percentages are not monetary costs. Missing measurements are shown as —. Input is the uncached portion; cache write creates cached context; cache read reuses context; output includes reported thinking. Total tokens is the sum of input, cache write, cache read and output.</p>${footprintHtml(report.contextFootprint, timezone)}<section id="report-distribution"><h2>Token distribution</h2>${total ? `<div class="stacked-distribution">${distribution}</div><div class="distribution-legend">${legend}</div>` : '<p>No recorded token usage.</p>'}</section><section><h2>Turn details</h2><div class="report-toolbar turn-filters"><div id="turn-category" class="range-toggle" role="group" aria-label="Filter turns on this page by purpose">${[['', 'All'], ['input', 'User input'], ['report', 'Progress / result'], ['worker', 'Worker']].map(([value, label]) => `<button type="button" data-purpose="${value}" aria-pressed="${value === ''}">${label}</button>`).join('')}</div><div id="turn-status" class="range-toggle" role="group" aria-label="Filter turns on this page by status"><button type="button" data-status="" aria-pressed="true">All</button>${statusBuckets.map(([value, label]) => `<button type="button" data-status="${value}" aria-pressed="false">${label}</button>`).join('')}</div><select id="turn-model" aria-label="Filter turns on this page by model"><option value="">All models</option>${models.map(m => `<option value="${escape(m)}">${escape(m)}</option>`).join('')}</select><input id="turn-search" placeholder="Search this page's messages or models" aria-label="Search turns on this page"></div>${pager}<div class="table-scroll"><table class="data-table report-table"><colgroup>${[120, 0, 96, 96, 96, 96, 96, 96, 96].map(width => width ? `<col style="width:${width}px">` : '<col>').join('')}</colgroup><thead><tr><th>Turn / Date</th><th>Conversation / assignment</th><th title="Uncached input only. Total input = input + cache write + cache read.">Input</th><th>Cache write</th><th>Cache read</th><th>Output</th><th>Totals</th><th title="Cache read ÷ (input + cache read + cache write)">%Cached</th><th>Tools</th></tr></thead><tbody>${rows || '<tr><td colspan="9">No recorded turns in this scope.</td></tr>'}</tbody></table></div>${pager}</section></main><div id="report-drawer-back" class="dash-drawer-back"><section id="report-drawer" class="dash-drawer" role="dialog" aria-modal="true" aria-label="Recorded turn details" tabindex="-1"></section></div><script>
|
|
164
|
+
const dashboardTimezone=${JSON.stringify(timezone).replace(/</g, '\\u003c')};
|
|
162
165
|
document.getElementById('report-scope').onclick=function(e){var button=e.target.closest('[data-range]');if(!button)return;var url=new URL(location.href);url.searchParams.set('scope',button.dataset.range);url.searchParams.set('offset','0');location.href=url.href;};
|
|
163
|
-
|
|
166
|
+
${dashboard_controls_1.dashboardControlsClient}
|
|
164
167
|
var reportSelected=null,reportFocus=null;
|
|
165
168
|
function reportExtraFor(id){var found=null;document.querySelectorAll('.turn-extra').forEach(function(r){if(r.dataset.turnId===id)found=r;});return found;}
|
|
166
169
|
function reportRenderDrawer(){
|
|
@@ -168,7 +171,7 @@ function reportRenderDrawer(){
|
|
|
168
171
|
document.querySelectorAll('.turn-row').forEach(function(r){r.setAttribute('aria-expanded',String(Boolean(reportSelected)&&r.dataset.turnId===reportSelected));});
|
|
169
172
|
var extra=reportSelected?reportExtraFor(reportSelected):null,cell=extra?extra.querySelector('td'):null;
|
|
170
173
|
if(!reportSelected||!cell){reportSelected=null;back.classList.remove('open');document.body.style.overflow='';if(panel.dataset.turn!==undefined){panel.innerHTML='';delete panel.dataset.turn;delete panel.dataset.html;}document.querySelectorAll('.turn-row').forEach(function(r){r.setAttribute('aria-expanded','false');});return;}
|
|
171
|
-
var html='<
|
|
174
|
+
var html=dashboardCloseButton('report')+'<h1>Turn details</h1>'+cell.innerHTML;
|
|
172
175
|
back.classList.add('open');document.body.style.overflow='hidden';
|
|
173
176
|
if(panel.dataset.turn===reportSelected&&panel.dataset.html===html)return;
|
|
174
177
|
var sameTurn=panel.dataset.turn===reportSelected,scroll=panel.scrollTop,focused=panel.contains(document.activeElement),closeFocused=document.activeElement&&document.activeElement.hasAttribute('data-report-close');
|