@0xmaxma/claude-gateway 2.0.3 → 2.0.5

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 (254) hide show
  1. package/README.md +11 -1
  2. package/dist/agent/builtin-commands.d.ts +1 -1
  3. package/dist/agent/builtin-commands.d.ts.map +1 -1
  4. package/dist/agent/builtin-commands.js +3 -2
  5. package/dist/agent/builtin-commands.js.map +1 -1
  6. package/dist/agent/runner.d.ts +109 -9
  7. package/dist/agent/runner.d.ts.map +1 -1
  8. package/dist/agent/runner.js +211 -135
  9. package/dist/agent/runner.js.map +1 -1
  10. package/dist/agent/skill-learning/index.d.ts.map +1 -1
  11. package/dist/agent/skill-learning/index.js +27 -8
  12. package/dist/agent/skill-learning/index.js.map +1 -1
  13. package/dist/agent/skill-learning/reviewer.d.ts +3 -1
  14. package/dist/agent/skill-learning/reviewer.d.ts.map +1 -1
  15. package/dist/agent/skill-learning/reviewer.js +6 -2
  16. package/dist/agent/skill-learning/reviewer.js.map +1 -1
  17. package/dist/agent/turn-stream.d.ts +3 -1
  18. package/dist/agent/turn-stream.d.ts.map +1 -1
  19. package/dist/agent/turn-stream.js +8 -4
  20. package/dist/agent/turn-stream.js.map +1 -1
  21. package/dist/api/gateway-router.d.ts +2 -0
  22. package/dist/api/gateway-router.d.ts.map +1 -1
  23. package/dist/api/gateway-router.js +229 -12
  24. package/dist/api/gateway-router.js.map +1 -1
  25. package/dist/api/router.js +11 -11
  26. package/dist/api/router.js.map +1 -1
  27. package/dist/api/slack-webhook-router.js +1 -1
  28. package/dist/api/slack-webhook-router.js.map +1 -1
  29. package/dist/api/voice-router.d.ts +1 -0
  30. package/dist/api/voice-router.d.ts.map +1 -1
  31. package/dist/api/voice-router.js +129 -7
  32. package/dist/api/voice-router.js.map +1 -1
  33. package/dist/config/claude-settings.d.ts +14 -0
  34. package/dist/config/claude-settings.d.ts.map +1 -1
  35. package/dist/config/claude-settings.js +20 -0
  36. package/dist/config/claude-settings.js.map +1 -1
  37. package/dist/orchestration/agent-cli-session.d.ts +46 -0
  38. package/dist/orchestration/agent-cli-session.d.ts.map +1 -0
  39. package/dist/orchestration/agent-cli-session.js +121 -0
  40. package/dist/orchestration/agent-cli-session.js.map +1 -0
  41. package/dist/orchestration/agent-tool-schemas.d.ts +6 -0
  42. package/dist/orchestration/agent-tool-schemas.d.ts.map +1 -0
  43. package/dist/orchestration/agent-tool-schemas.js +23 -0
  44. package/dist/orchestration/agent-tool-schemas.js.map +1 -0
  45. package/dist/orchestration/bridge.d.ts +7 -3
  46. package/dist/orchestration/bridge.d.ts.map +1 -1
  47. package/dist/orchestration/bridge.js +93 -66
  48. package/dist/orchestration/bridge.js.map +1 -1
  49. package/dist/orchestration/browser-voice.d.ts +14 -0
  50. package/dist/orchestration/browser-voice.d.ts.map +1 -0
  51. package/dist/orchestration/browser-voice.js +30 -0
  52. package/dist/orchestration/browser-voice.js.map +1 -0
  53. package/dist/orchestration/channel-input-media.d.ts +6 -0
  54. package/dist/orchestration/channel-input-media.d.ts.map +1 -1
  55. package/dist/orchestration/channel-input-media.js +35 -11
  56. package/dist/orchestration/channel-input-media.js.map +1 -1
  57. package/dist/orchestration/channel-media-error.d.ts +11 -0
  58. package/dist/orchestration/channel-media-error.d.ts.map +1 -0
  59. package/dist/orchestration/channel-media-error.js +38 -0
  60. package/dist/orchestration/channel-media-error.js.map +1 -0
  61. package/dist/orchestration/channel-media.d.ts +1 -1
  62. package/dist/orchestration/channel-media.d.ts.map +1 -1
  63. package/dist/orchestration/channel-media.js +37 -7
  64. package/dist/orchestration/channel-media.js.map +1 -1
  65. package/dist/orchestration/context-footprint.d.ts +14 -0
  66. package/dist/orchestration/context-footprint.d.ts.map +1 -0
  67. package/dist/orchestration/context-footprint.js +57 -0
  68. package/dist/orchestration/context-footprint.js.map +1 -0
  69. package/dist/orchestration/conversation-intake.d.ts +1 -1
  70. package/dist/orchestration/conversation-intake.d.ts.map +1 -1
  71. package/dist/orchestration/conversation-intake.js +1 -1
  72. package/dist/orchestration/dashboard-reader-worker.d.ts +2 -0
  73. package/dist/orchestration/dashboard-reader-worker.d.ts.map +1 -0
  74. package/dist/orchestration/dashboard-reader-worker.js +155 -0
  75. package/dist/orchestration/dashboard-reader-worker.js.map +1 -0
  76. package/dist/orchestration/dashboard-reader.d.ts +15 -0
  77. package/dist/orchestration/dashboard-reader.d.ts.map +1 -0
  78. package/dist/orchestration/dashboard-reader.js +87 -0
  79. package/dist/orchestration/dashboard-reader.js.map +1 -0
  80. package/dist/orchestration/decision-context.d.ts +15 -0
  81. package/dist/orchestration/decision-context.d.ts.map +1 -0
  82. package/dist/orchestration/decision-context.js +57 -0
  83. package/dist/orchestration/decision-context.js.map +1 -0
  84. package/dist/orchestration/delivery.d.ts +3 -0
  85. package/dist/orchestration/delivery.d.ts.map +1 -1
  86. package/dist/orchestration/delivery.js +14 -5
  87. package/dist/orchestration/delivery.js.map +1 -1
  88. package/dist/orchestration/display-stream.d.ts +21 -2
  89. package/dist/orchestration/display-stream.d.ts.map +1 -1
  90. package/dist/orchestration/display-stream.js +61 -8
  91. package/dist/orchestration/display-stream.js.map +1 -1
  92. package/dist/orchestration/inference-errors.d.ts.map +1 -1
  93. package/dist/orchestration/inference-errors.js +56 -3
  94. package/dist/orchestration/inference-errors.js.map +1 -1
  95. package/dist/orchestration/mutation-recovery.d.ts +12 -0
  96. package/dist/orchestration/mutation-recovery.d.ts.map +1 -0
  97. package/dist/orchestration/mutation-recovery.js +41 -0
  98. package/dist/orchestration/mutation-recovery.js.map +1 -0
  99. package/dist/orchestration/native-compact.d.ts +5 -0
  100. package/dist/orchestration/native-compact.d.ts.map +1 -0
  101. package/dist/orchestration/native-compact.js +29 -0
  102. package/dist/orchestration/native-compact.js.map +1 -0
  103. package/dist/orchestration/notification-mailbox.d.ts +3 -1
  104. package/dist/orchestration/notification-mailbox.d.ts.map +1 -1
  105. package/dist/orchestration/notification-mailbox.js +4 -2
  106. package/dist/orchestration/notification-mailbox.js.map +1 -1
  107. package/dist/orchestration/process-turn.d.ts +15 -2
  108. package/dist/orchestration/process-turn.d.ts.map +1 -1
  109. package/dist/orchestration/process-turn.js +103 -16
  110. package/dist/orchestration/process-turn.js.map +1 -1
  111. package/dist/orchestration/progress-review.d.ts +8 -18
  112. package/dist/orchestration/progress-review.d.ts.map +1 -1
  113. package/dist/orchestration/progress-review.js +12 -14
  114. package/dist/orchestration/progress-review.js.map +1 -1
  115. package/dist/orchestration/provider-message.d.ts +7 -0
  116. package/dist/orchestration/provider-message.d.ts.map +1 -0
  117. package/dist/orchestration/provider-message.js +63 -0
  118. package/dist/orchestration/provider-message.js.map +1 -0
  119. package/dist/orchestration/response-errors.d.ts +6 -0
  120. package/dist/orchestration/response-errors.d.ts.map +1 -0
  121. package/dist/orchestration/response-errors.js +88 -0
  122. package/dist/orchestration/response-errors.js.map +1 -0
  123. package/dist/orchestration/response-schema.d.ts +33 -0
  124. package/dist/orchestration/response-schema.d.ts.map +1 -0
  125. package/dist/orchestration/response-schema.js +61 -0
  126. package/dist/orchestration/response-schema.js.map +1 -0
  127. package/dist/orchestration/runtime.d.ts +69 -0
  128. package/dist/orchestration/runtime.d.ts.map +1 -1
  129. package/dist/orchestration/runtime.js +347 -98
  130. package/dist/orchestration/runtime.js.map +1 -1
  131. package/dist/orchestration/skills.d.ts.map +1 -1
  132. package/dist/orchestration/skills.js +3 -2
  133. package/dist/orchestration/skills.js.map +1 -1
  134. package/dist/orchestration/source-policy.d.ts +1 -1
  135. package/dist/orchestration/source-policy.d.ts.map +1 -1
  136. package/dist/orchestration/source-policy.js +1 -1
  137. package/dist/orchestration/speech.d.ts +15 -17
  138. package/dist/orchestration/speech.d.ts.map +1 -1
  139. package/dist/orchestration/speech.js +90 -30
  140. package/dist/orchestration/speech.js.map +1 -1
  141. package/dist/orchestration/store.d.ts +19 -0
  142. package/dist/orchestration/store.d.ts.map +1 -1
  143. package/dist/orchestration/store.js +44 -1
  144. package/dist/orchestration/store.js.map +1 -1
  145. package/dist/orchestration/tasks/driver.d.ts.map +1 -1
  146. package/dist/orchestration/tasks/driver.js +8 -3
  147. package/dist/orchestration/tasks/driver.js.map +1 -1
  148. package/dist/orchestration/tasks/pool.d.ts.map +1 -1
  149. package/dist/orchestration/tasks/pool.js +8 -4
  150. package/dist/orchestration/tasks/pool.js.map +1 -1
  151. package/dist/orchestration/tasks/service.d.ts +48 -1
  152. package/dist/orchestration/tasks/service.d.ts.map +1 -1
  153. package/dist/orchestration/tasks/service.js +41 -17
  154. package/dist/orchestration/tasks/service.js.map +1 -1
  155. package/dist/orchestration/token-ledger.d.ts +125 -0
  156. package/dist/orchestration/token-ledger.d.ts.map +1 -0
  157. package/dist/orchestration/token-ledger.js +232 -0
  158. package/dist/orchestration/token-ledger.js.map +1 -0
  159. package/dist/orchestration/token-usage.d.ts +46 -0
  160. package/dist/orchestration/token-usage.d.ts.map +1 -0
  161. package/dist/orchestration/token-usage.js +102 -0
  162. package/dist/orchestration/token-usage.js.map +1 -0
  163. package/dist/orchestration/tool-activity.d.ts.map +1 -1
  164. package/dist/orchestration/tool-activity.js +5 -3
  165. package/dist/orchestration/tool-activity.js.map +1 -1
  166. package/dist/orchestration/tool-name.d.ts +10 -0
  167. package/dist/orchestration/tool-name.d.ts.map +1 -0
  168. package/dist/orchestration/tool-name.js +14 -0
  169. package/dist/orchestration/tool-name.js.map +1 -0
  170. package/dist/orchestration/transcript-checkpoint.d.ts +14 -0
  171. package/dist/orchestration/transcript-checkpoint.d.ts.map +1 -0
  172. package/dist/orchestration/transcript-checkpoint.js +83 -0
  173. package/dist/orchestration/transcript-checkpoint.js.map +1 -0
  174. package/dist/orchestration/unanswered-inputs.d.ts +6 -0
  175. package/dist/orchestration/unanswered-inputs.d.ts.map +1 -0
  176. package/dist/orchestration/unanswered-inputs.js +18 -0
  177. package/dist/orchestration/unanswered-inputs.js.map +1 -0
  178. package/dist/session/process.d.ts +10 -0
  179. package/dist/session/process.d.ts.map +1 -1
  180. package/dist/session/process.js +91 -9
  181. package/dist/session/process.js.map +1 -1
  182. package/dist/session/request-tool-capture.d.ts +31 -0
  183. package/dist/session/request-tool-capture.d.ts.map +1 -0
  184. package/dist/session/request-tool-capture.js +194 -0
  185. package/dist/session/request-tool-capture.js.map +1 -0
  186. package/dist/session/runtime-profile.d.ts +7 -3
  187. package/dist/session/runtime-profile.d.ts.map +1 -1
  188. package/dist/session/runtime-profile.js +3 -1
  189. package/dist/session/runtime-profile.js.map +1 -1
  190. package/dist/session/store.d.ts +7 -0
  191. package/dist/session/store.d.ts.map +1 -1
  192. package/dist/session/store.js +27 -0
  193. package/dist/session/store.js.map +1 -1
  194. package/dist/shell/tailer.d.ts +7 -5
  195. package/dist/shell/tailer.d.ts.map +1 -1
  196. package/dist/shell/tailer.js +6 -17
  197. package/dist/shell/tailer.js.map +1 -1
  198. package/dist/ui/cli-viewer-ui.js +1 -1
  199. package/dist/ui/dashboard-client.d.ts +3 -0
  200. package/dist/ui/dashboard-client.d.ts.map +1 -0
  201. package/dist/ui/dashboard-client.js +188 -0
  202. package/dist/ui/dashboard-client.js.map +1 -0
  203. package/dist/ui/dashboard-presentation.d.ts +9 -0
  204. package/dist/ui/dashboard-presentation.d.ts.map +1 -0
  205. package/dist/ui/dashboard-presentation.js +56 -0
  206. package/dist/ui/dashboard-presentation.js.map +1 -0
  207. package/dist/ui/dashboard-range.d.ts +5 -0
  208. package/dist/ui/dashboard-range.d.ts.map +1 -0
  209. package/dist/ui/dashboard-range.js +20 -0
  210. package/dist/ui/dashboard-range.js.map +1 -0
  211. package/dist/ui/dashboard-theme.d.ts +4 -0
  212. package/dist/ui/dashboard-theme.d.ts.map +1 -0
  213. package/dist/ui/dashboard-theme.js +485 -0
  214. package/dist/ui/dashboard-theme.js.map +1 -0
  215. package/dist/ui/token-report-client.d.ts +3 -0
  216. package/dist/ui/token-report-client.d.ts.map +1 -0
  217. package/dist/ui/token-report-client.js +34 -0
  218. package/dist/ui/token-report-client.js.map +1 -0
  219. package/dist/ui/token-report.d.ts +89 -0
  220. package/dist/ui/token-report.d.ts.map +1 -0
  221. package/dist/ui/token-report.js +200 -0
  222. package/dist/ui/token-report.js.map +1 -0
  223. package/dist/ui/web-ui.d.ts.map +1 -1
  224. package/dist/ui/web-ui.js +124 -181
  225. package/dist/ui/web-ui.js.map +1 -1
  226. package/dist/voice/replay.d.ts +8 -0
  227. package/dist/voice/replay.d.ts.map +1 -0
  228. package/dist/voice/replay.js +48 -0
  229. package/dist/voice/replay.js.map +1 -0
  230. package/dist/voice/session.d.ts +9 -0
  231. package/dist/voice/session.d.ts.map +1 -1
  232. package/dist/voice/session.js +72 -14
  233. package/dist/voice/session.js.map +1 -1
  234. package/mcp/lazy-connector.test.ts +58 -0
  235. package/mcp/lazy-connector.ts +67 -0
  236. package/mcp/lazy-tools.test.ts +152 -0
  237. package/mcp/lazy-tools.ts +41 -0
  238. package/mcp/server.ts +53 -34
  239. package/mcp/tools/discord/commands.ts +2 -0
  240. package/mcp/tools/discord/inbound.ts +1 -1
  241. package/mcp/tools/discord/receiver-server.ts +1 -1
  242. package/mcp/tools/discord/types.ts +1 -1
  243. package/mcp/tools/receiver-spool.test.ts +8 -2
  244. package/mcp/tools/receiver-spool.ts +198 -25
  245. package/mcp/tools/tasks/module.ts +1 -12
  246. package/mcp/tools/telegram/media-group.ts +3 -3
  247. package/mcp/tools/telegram/receiver-server.ts +15 -15
  248. package/mcp/types.ts +1 -1
  249. package/package.json +2 -1
  250. package/resource/dashboard/OFL.txt +93 -0
  251. package/resource/dashboard/poppins-300.woff2 +0 -0
  252. package/resource/dashboard/poppins-400.woff2 +0 -0
  253. package/resource/dashboard/poppins-500.woff2 +0 -0
  254. package/resource/dashboard/poppins-600.woff2 +0 -0
@@ -0,0 +1,485 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dashboardFontLink = exports.dashboardTheme = void 0;
4
+ /** Shared tokens from the approved pastel dashboard direction. */
5
+ exports.dashboardTheme = String.raw `
6
+ :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}
7
+
8
+ [data-theme=light]{color-scheme:light;--bg:#f5f5f4;--side:#fafaf9;--panel:#fff;--raised:#f0f1f2;--line:#e2e3e5;--text:#202226;--muted:#686d76;--accent:#b94815;--accentbg:#fff0e6;--green:#217451;--greenbg:#eaf7ef;--blue:#3264a7;--bluebg:#edf3fe;--yellow:#87621b;--yellowbg:#fff5de;--red:#a84140;--redbg:#fff0f0;--shadow:0 24px 100px #28282a22}
9
+
10
+ *{box-sizing:border-box}
11
+ body{margin:0;background:var(--bg);color:var(--text);font:14px/1.5 -apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;-webkit-font-smoothing:antialiased}
12
+ button,input,select{font:inherit}
13
+ button,a,input,select{ -webkit-tap-highlight-color:transparent}
14
+ button{cursor:pointer;color:inherit}
15
+ button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
16
+ button{border:1px solid var(--line);border-radius:8px;background:var(--panel);padding:8px 12px;display:inline-flex;gap:8px;align-items:center;justify-content:center}
17
+ button:hover{background:var(--raised)}
18
+ button:disabled{opacity:.4;cursor:not-allowed}
19
+ .primary{background:var(--accent);border-color:var(--accent);color:#1b130e;font-weight:650}
20
+ [data-theme=light] .primary{color:white}
21
+ .primary:hover{filter:brightness(1.08);background:var(--accent)}
22
+ .quiet{background:transparent;border-color:transparent}
23
+ .danger{color:var(--red)}
24
+ svg.icon{width:18px;height:18px;flex-shrink:0;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
25
+ .small{font-size:12px}
26
+ .muted{color:var(--muted)}
27
+ .mono{font:12px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace}
28
+ .row{display:flex;align-items:center;gap:10px}
29
+ .between{justify-content:space-between}
30
+ .wrap{flex-wrap:wrap}
31
+ .gap{gap:16px}
32
+ h1,h2,h3,p{margin:0}
33
+ h1{font-size:30px;letter-spacing:-1px;font-weight:650;line-height:1.2}
34
+ h2{font-size:16px;letter-spacing:-.2px;font-weight:620}
35
+ h3{font-size:14px;font-weight:600}
36
+ a{color:var(--accent);text-decoration:none}
37
+ .layout{display:grid;grid-template-columns:224px minmax(0,1fr);min-height:100vh}
38
+ .sidebar{background:var(--side);border-right:1px solid var(--line);padding:28px 16px 16px;display:flex;flex-direction:column;position:fixed;inset:0 auto 0 0;width:224px;z-index:20}
39
+ .brand{padding:0 10px 26px;gap:11px;line-height:1.2;letter-spacing:-.4px;font-size:16px;font-weight:680}
40
+ .brandmark{width:34px;height:34px;border-radius:10px;background:var(--accentbg);color:var(--accent);display:grid;place-items:center;border:1px solid color-mix(in srgb,var(--accent) 20%,transparent)}
41
+ .brand small{display:block;font-size:11px;color:var(--muted);font-weight:450;letter-spacing:.8px;margin-top:5px}
42
+ .navlabel{font-size:10px;color:var(--muted);letter-spacing:1.4px;font-weight:650;margin:24px 12px 10px}
43
+ .nav{display:flex;flex-direction:column;gap:5px}
44
+ .nav button{justify-content:flex-start;border-color:transparent;background:transparent;color:var(--muted);padding:11px 12px;font-weight:520}
45
+ .nav button:hover{background:var(--raised);color:var(--text)}
46
+ .nav button.active{background:var(--accentbg);color:var(--accent)}
47
+ .count{margin-left:auto;background:var(--raised);padding:0px 7px;border-radius:5px;font-size:11px;color:var(--muted)}
48
+ .sidebarfoot{margin-top:auto;padding-top:28px}
49
+ .instance{border:1px solid var(--line);padding:13px;border-radius:10px}
50
+ .dot{width:7px;height:7px;border-radius:50%;background:var(--green);display:inline-block;flex-shrink:0}
51
+ .main{grid-column:2;min-width:0}
52
+ .topbar{height:70px;padding:0 38px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--line);gap:12px}
53
+ .breadcrumb{color:var(--muted);font-size:12px}
54
+ .breadcrumb span{margin-left:12px;color:var(--text)}
55
+ .pill{display:inline-flex;align-items:center;gap:6px;padding:4px 8px;border-radius:6px;font-size:11px;white-space:nowrap;font-weight:550;background:var(--raised);color:var(--muted)}
56
+ .pill.green{color:var(--green);background:var(--greenbg)}
57
+ .pill.orange{color:var(--accent);background:var(--accentbg)}
58
+ .pill.blue{color:var(--blue);background:var(--bluebg)}
59
+ .pill.yellow{color:var(--yellow);background:var(--yellowbg)}
60
+ .pill.red{color:var(--red);background:var(--redbg)}
61
+ .page{max-width:1460px;margin:auto;padding:36px 38px 48px}
62
+ .heading{margin-bottom:26px}
63
+ .heading p{color:var(--muted);margin-top:9px}
64
+ .eyebrow{text-transform:uppercase;letter-spacing:1.6px;color:var(--accent);font-size:10px;font-weight:650;margin-bottom:10px}
65
+ .stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;margin-bottom:24px}
66
+ .card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);min-width:0;overflow:hidden}
67
+ .stat{padding:20px}
68
+ .stat-label{color:var(--muted);font-size:12px}
69
+ .statvalue{font-size:30px;font-weight:600;letter-spacing:-.8px;margin:12px 0 6px;line-height:1.2}
70
+ .statvalue small{font-size:13px;font-weight:450;letter-spacing:0;color:var(--muted)}
71
+ .stat-foot{font-size:11px;color:var(--muted)}
72
+ .spark{width:70px;height:26px;fill:none;stroke:var(--green);stroke-width:1.7}
73
+ .columns{display:grid;grid-template-columns:minmax(0,1.8fr) minmax(280px,1fr);gap:22px}
74
+ .cardhead{padding:20px 22px;display:flex;align-items:center;justify-content:space-between;gap:12px}
75
+ .cardhead p{color:var(--muted);font-size:12px;margin-top:4px}
76
+ .padded{padding:0 22px 22px}
77
+ .chart{position:relative}
78
+ .chart svg{display:block;width:100%;height:175px}
79
+ .legend{display:flex;gap:17px;font-size:11px;color:var(--muted)}
80
+ .legend i{display:inline-block;width:7px;height:7px;border-radius:3px;background:var(--accent);margin-right:5px}
81
+ .chartlabels{display:flex;justify-content:space-between;color:var(--muted);font-size:10px;margin-top:9px}
82
+ .notice{background:var(--yellowbg);border:1px solid color-mix(in srgb,var(--yellow) 20%,transparent);padding:15px;border-radius:10px}
83
+ .notice p{font-size:12px;margin:7px 0 12px;color:var(--muted)}
84
+ .separator{height:1px;background:var(--line);margin:20px 0}
85
+ .stack{display:grid;gap:12px}
86
+ .activity{display:flex;gap:12px;padding:13px 0;border-bottom:1px solid var(--line)}
87
+ .activity:last-child{border:0}
88
+ .avatar{height:32px;width:32px;border-radius:9px;background:var(--bluebg);color:var(--blue);display:grid;place-items:center;font-size:12px;font-weight:600;flex-shrink:0}
89
+ .avatar.orange{background:var(--accentbg);color:var(--accent)}
90
+ .activity p{font-size:12px;color:var(--muted);margin-top:4px}
91
+ .activity time{margin-left:auto;font-size:10px;color:var(--muted);white-space:nowrap}
92
+ .section{margin-top:24px}
93
+ .tablewrap{overflow:auto}
94
+ table{width:100%;border-collapse:collapse;text-align:left;white-space:nowrap}
95
+ th{font-size:10px;color:var(--muted);font-weight:550;letter-spacing:.6px;text-transform:uppercase;padding:11px 22px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--raised) 35%,transparent)}
96
+ td{padding:15px 22px;border-bottom:1px solid var(--line);font-size:12px}
97
+ tbody tr:last-child td{border:0}
98
+ tbody tr[data-detail]{cursor:pointer}
99
+ tbody tr[data-detail]:hover{background:var(--raised)}
100
+ td strong{font-weight:550}
101
+ td small{display:block;color:var(--muted);font-size:11px;margin-top:4px}
102
+ .tablefoot{padding:13px 22px;border-top:1px solid var(--line);color:var(--muted);font-size:11px}
103
+ .bar{height:6px;background:var(--raised);border-radius:4px;overflow:hidden}
104
+ .bar span{display:block;height:100%;background:var(--accent);border-radius:4px}
105
+ .progressrow{margin-bottom:19px}
106
+ .progressrow .row{margin-bottom:8px;font-size:12px}
107
+ .tabs{display:flex;gap:4px;border-bottom:1px solid var(--line);margin-bottom:24px}
108
+ .tabs button{border:none;background:transparent;border-radius:0;color:var(--muted);padding:12px 14px;border-bottom:2px solid transparent}
109
+ .tabs button.selected{color:var(--accent);border-bottom-color:var(--accent)}
110
+ input,select{border:1px solid var(--line);border-radius:8px;background:var(--panel);color:var(--text);padding:9px 12px;min-width:0}
111
+ .search{max-width:320px;width:100%}
112
+ .filters{margin-bottom:18px}
113
+ .empty{text-align:center;color:var(--muted);padding:40px}
114
+ .token-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
115
+ .swatches{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
116
+ .swatch{height:58px;border:1px solid var(--line);border-radius:9px;margin-bottom:8px}
117
+ .swatches p{font-size:11px}
118
+ .swatches code{font-size:10px;color:var(--muted)}
119
+ .spec{padding:22px}
120
+ .spec h2{margin-bottom:8px}
121
+ .spec>p{color:var(--muted);font-size:12px;margin-bottom:20px}
122
+ .type-line{border-bottom:1px solid var(--line);padding:12px 0;display:flex;justify-content:space-between;gap:20px;align-items:center}
123
+ .type-line:last-child{border:0}
124
+ .type-line code{color:var(--muted);font-size:11px}
125
+ .designgrid{display:grid;grid-template-columns:1fr 1fr;gap:20px}
126
+ .timeline{border-left:1px solid var(--line);margin-left:7px;padding-left:22px}
127
+ .step{padding-bottom:26px;position:relative}
128
+ .step:before{content:'';position:absolute;left:-27px;top:6px;width:8px;height:8px;border-radius:100%;background:var(--blue);border:2px solid var(--panel)}
129
+ .step p{color:var(--muted);font-size:12px;margin-top:6px}
130
+ .code{font:12px/1.6 ui-monospace,SFMono-Regular,monospace;background:var(--bg);border:1px solid var(--line);padding:12px;border-radius:8px;white-space:pre-wrap;margin-top:12px}
131
+ .drawerback{position:fixed;inset:0;background:#0006;z-index:50;display:none}
132
+ .drawerback.open{display:block}
133
+ .drawer{position:absolute;right:0;top:0;bottom:0;width:min(540px,100%);background:var(--panel);border-left:1px solid var(--line);box-shadow:var(--shadow);padding:26px;overflow:auto}
134
+ .drawer h1{font-size:24px;margin:24px 0 10px}
135
+ .drawer .pill{margin-bottom:24px}
136
+ .drawer dl{display:grid;grid-template-columns:100px 1fr;font-size:12px;gap:10px;margin:20px 0}
137
+ .drawer dt{color:var(--muted)}
138
+ .drawer dd{margin:0}
139
+ .toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);padding:12px 18px;background:var(--raised);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow);z-index:100;display:none}
140
+ .preview{font-size:10px;color:var(--muted);border:1px solid var(--line);border-radius:5px;padding:4px 8px;letter-spacing:.3px}
141
+ .mobilemenu{display:none}
142
+ .footer{display:flex;justify-content:space-between;margin-top:28px;color:var(--muted);font-size:10px}
143
+ .metric-note{border-left:2px solid var(--accent);padding-left:12px;font-size:12px;color:var(--muted);margin-top:20px}
144
+ .ds-spaces{display:flex;align-items:end;gap:20px;min-height:70px}
145
+ .ds-spaces span{display:block;background:var(--accentbg);border-top:2px solid var(--accent);width:28px}
146
+ .ds-spaces small{display:block;margin-top:8px;color:var(--muted);font-size:10px}
147
+ button.link{padding:0;border:0;background:none;color:var(--accent);font-size:12px}
148
+ .statuslist>.row{padding:14px 0;border-bottom:1px solid var(--line)}
149
+ .statuslist>.row:last-child{border:0}
150
+ .keycap{border:1px solid var(--line);padding:1px 5px;border-radius:4px;font-size:10px}
151
+ .memoryrow{padding:20px;border:1px solid var(--line);border-radius:10px;margin-bottom:12px}
152
+ .memoryrow p{color:var(--muted);font-size:12px;margin-top:5px}
153
+
154
+ @media(min-width:1600px){.page{padding-top:44px}
155
+ }
156
+ @media(max-width:1100px){.columns{grid-template-columns:1fr}
157
+ .stats{grid-template-columns:repeat(2,1fr)}
158
+ .page{padding:28px 24px}
159
+ .topbar{padding:0 24px}
160
+ .designgrid{grid-template-columns:1fr}
161
+ }
162
+ @media(max-width:760px){.layout{grid-template-columns:1fr}
163
+ .main{grid-column:1}
164
+ .sidebar{transform:translateX(-100%);box-shadow:var(--shadow)}
165
+ body.menuopen .sidebar{transform:translateX(0)}
166
+ .mobilemenu{display:inline-flex}
167
+ .topbar{padding:0 16px;height:62px}
168
+ .breadcrumb{display:none}
169
+ .page{padding:24px 16px}
170
+ .heading{align-items:flex-start}
171
+ .heading h1{font-size:26px}
172
+ .heading>.row{flex-wrap:wrap}
173
+ .stats{gap:10px}
174
+ .stat{padding:16px}
175
+ .statvalue{font-size:26px}
176
+ .token-grid{grid-template-columns:1fr}
177
+ .swatches{grid-template-columns:repeat(2,1fr)}
178
+ .preview{max-width:150px;text-align:center}
179
+ .footer{gap:12px}
180
+ .filters{flex-wrap:wrap}
181
+ .cardhead{padding:18px}
182
+ .topbar .pill{display:none}
183
+ }
184
+ @media(prefers-reduced-motion:no-preference){button,.sidebar{transition:background .15s,transform .2s}
185
+ .page{animation:reveal .22s ease}
186
+ @keyframes reveal{from{opacity:.5;transform:translateY(4px)}
187
+ to{opacity:1;transform:none}
188
+ }
189
+ }
190
+
191
+
192
+ /* 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:#e2f8d3;--sky:#dff6ff;--peach:#fff0e3;--lavender:#eddff7;--pink:#fbe0ef;--prism:conic-gradient(#8181ff,#4dc2cb,#a5db88,#f8e094,#f3a0d2,#8181ff)}
194
+
195
+ [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
+
197
+ body{font-family:Poppins,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:13px;letter-spacing:-.01em}
198
+ h1{font-size:44px;line-height:1.2;letter-spacing:-.035em;font-weight:400}
199
+ h2{font-size:17px;font-weight:500;letter-spacing:-.02em}
200
+ h3{font-weight:500}
201
+ .mono{font-variant-numeric:tabular-nums}
202
+ .layout{grid-template-columns:242px minmax(0,1fr)}
203
+ .sidebar{width:242px;padding:30px 18px 18px}
204
+ .brand{font-size:15px;font-weight:600;padding:0 8px 24px;gap:10px}
205
+ .brandmark{border:0;border-radius:12px;background:var(--prism);color:#333;width:35px;height:35px}
206
+ .brand small{font-size:9px;letter-spacing:1.1px;margin-top:6px}
207
+ .navlabel{font-weight:500;letter-spacing:1.5px;font-size:9px;margin-top:28px}
208
+ .nav{gap:6px}
209
+ .nav button{font-size:12px;font-weight:500;padding:12px 13px;border-radius:8px}
210
+ .nav button.active{background:var(--accentbg);color:var(--accent)}
211
+ .count{font-size:10px;border-radius:6px;background:var(--raised)}
212
+ .instance{border-radius:16px;background:var(--raised);border:0;padding:16px}
213
+ .avatar{border-radius:10px}
214
+ .topbar{height:80px;background:var(--panel);border:0;padding:0 36px}
215
+ .preview{border-radius:6px;padding:5px 9px;font-size:9px}
216
+ .breadcrumb{font-size:11px}
217
+ .page{max-width:1440px;padding:34px 36px 44px}
218
+ .heading{margin-bottom:28px;gap:20px}
219
+ .heading p{font-size:13px;line-height:1.7;max-width:690px;margin-top:13px}
220
+ .eyebrow{font-size:9px;letter-spacing:1.6px;color:var(--muted);font-weight:500;margin-bottom:12px}
221
+ .gradient-title{background:linear-gradient(95deg,#398ca8,#6161ff 58%,#8950ca);background-clip:text;-webkit-background-clip:text;color:transparent}
222
+ .heading>button{flex-shrink:0}
223
+
224
+ button{border-radius:160px;padding:10px 17px;font-size:12px;font-weight:500;min-height:38px}
225
+ .primary,[data-theme=light] .primary{color:#fff;background:#6161ff;border-color:#6161ff}
226
+ .primary:hover{background:#5050e7;filter:none}
227
+ .quiet{border-color:transparent}
228
+ .danger{color:var(--red)}
229
+ button.link{font-size:11px;min-height:32px}
230
+ .pill{border-radius:6px;font-size:10px;padding:5px 9px;font-weight:500}
231
+ .pill.orange{background:var(--accentbg);color:var(--accent)}
232
+ .pill.green{background:var(--greenbg)}
233
+
234
+ .stats{gap:16px;margin-bottom:28px}
235
+ .stats .stat{border:0;padding:24px;border-radius:24px}
236
+ .stats .stat:nth-child(1){background:var(--mint)}
237
+ .stats .stat:nth-child(2){background:var(--sky)}
238
+ .stats .stat:nth-child(3){background:var(--lavender)}
239
+ .stats .stat:nth-child(4){background:var(--peach)}
240
+ .stat-label{font-size:11px;color:var(--text)}
241
+ .stat .icon{width:17px;height:17px;color:var(--text);opacity:.65}
242
+ .statvalue{font-size:36px;font-weight:400;letter-spacing:-.03em;margin:13px 0 9px}
243
+ .statvalue small{font-size:12px}
244
+ .stat-foot{font-size:10px;line-height:1.7}
245
+ .spark{width:48px;stroke:var(--text);opacity:.5}
246
+ .columns{gap:24px;grid-template-columns:minmax(0,1.65fr) minmax(300px,1fr)}
247
+ .card{box-shadow:0 3px 14px #35386604}
248
+ .cardhead{padding:24px}
249
+ .cardhead p{font-size:11px;line-height:1.7}
250
+ .padded{padding:0 24px 24px}
251
+ .notice{background:var(--peach);border:0;border-radius:16px;padding:20px}
252
+ .notice p{font-size:12px;line-height:1.8;margin:10px 0 16px}
253
+ .notice button{background:#6161ff;color:white;border-color:#6161ff}
254
+ .separator{margin:22px 0}
255
+ .metric-note{font-size:11px;border-left:2px solid var(--accentbg);line-height:1.7}
256
+ .chart svg{height:180px}
257
+ .legend{font-size:10px}
258
+ .chartlabels{font-size:9px}
259
+ .section{margin-top:26px}
260
+ th{font-size:9px;padding:13px 24px;background:var(--raised);letter-spacing:.6px}
261
+ td{padding:18px 24px;font-size:11px}
262
+ td strong{font-weight:500}
263
+ td small{font-size:10px}
264
+ .tablefoot{padding:14px 24px;font-size:10px}
265
+ tbody tr[data-detail]:hover{background:var(--accentbg)}
266
+ .tabs{gap:6px;border:0;flex-wrap:wrap}
267
+ .tabs button{border:1px solid var(--line);border-radius:160px;padding:9px 16px}
268
+ .tabs button.selected{color:white;background:#6161ff;border-color:#6161ff}
269
+ input,select{border-radius:6px;padding:10px 13px;font-size:12px}
270
+ .spec{padding:26px}
271
+ .spec>p{font-size:12px;line-height:1.75}
272
+ .swatch{border-radius:12px;height:68px}
273
+ .type-line{flex-wrap:wrap}
274
+ .type-line code{white-space:nowrap}
275
+ .ds-spaces{flex-wrap:wrap}
276
+ .drawer{padding:30px}
277
+ .drawer h1{font-size:28px;font-weight:400;line-height:1.35}
278
+ .drawer dd{overflow-wrap:anywhere}
279
+ .drawer .pill{margin-bottom:16px}
280
+ .drawer .code{background:var(--raised);border-radius:12px;border:0;padding:16px}
281
+ .footer{font-size:10px;line-height:1.6}
282
+ .page{animation:none}
283
+ .design-link{text-decoration:underline;text-underline-offset:4px;font-size:12px}
284
+ .board-sample{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:16px 0}
285
+ .note{border-radius:16px;min-height:110px;padding:16px;background:var(--mint);font-size:12px;color:var(--text)}
286
+ .note:nth-child(2){background:var(--sky)}
287
+ .note:nth-child(3){background:var(--lavender)}
288
+ .note .icon{margin-bottom:12px;display:block}
289
+ .memoryrow{border-radius:16px}
290
+ .toast{border-radius:160px}
291
+
292
+ @media(max-width:1150px){.columns{grid-template-columns:1fr}
293
+ .page{padding:28px}
294
+ .topbar{padding:0 28px}
295
+ .stats{grid-template-columns:repeat(2,minmax(0,1fr))}
296
+ .designgrid{grid-template-columns:1fr}
297
+ .heading h1{font-size:38px}
298
+ }
299
+ @media(max-width:760px){.layout{grid-template-columns:1fr}
300
+ .main{grid-column:1}
301
+ .page{padding:24px 16px}
302
+ .topbar{padding:0 16px;height:64px}
303
+ .heading h1{font-size:34px}
304
+ .stats{gap:12px}
305
+ .stats .stat{padding:18px;border-radius:20px}
306
+ .statvalue{font-size:28px}
307
+ .stat-label{font-size:10px}
308
+ .spark{display:none}
309
+ .cardhead{padding:20px;flex-wrap:wrap}
310
+ .padded{padding:0 20px 22px}
311
+ .spec{padding:22px}
312
+ .columns{grid-template-columns:minmax(0,1fr)}
313
+ .designgrid{grid-template-columns:minmax(0,1fr)}
314
+ .preview{max-width:175px}
315
+ .drawer{padding:22px}
316
+ .token-grid{grid-template-columns:1fr}
317
+ .footer,.tablefoot{flex-wrap:wrap;gap:12px}
318
+ .board-sample{grid-template-columns:1fr}
319
+ .heading>button{align-self:flex-start}
320
+ }
321
+
322
+
323
+
324
+ body{padding:0}
325
+ .rainbow{background:none;-webkit-text-fill-color:var(--text);animation:none}
326
+ .shell-content{padding:32px 36px;max-width:1600px;margin:auto}
327
+ .sidebar .tabs{display:flex;flex-direction:column;border:0;margin:0;gap:6px}
328
+ .sidebar .tab{justify-content:flex-start;border:0;border-radius:8px;background:none;color:var(--muted);padding:12px 14px;font-size:12px}
329
+ .sidebar .tab.active{background:var(--accentbg);color:var(--accent)}
330
+ .sidebar .tab:focus-visible{outline:2px solid var(--accent)}
331
+ .topbar h1{font-size:16px;letter-spacing:0}
332
+ .meta{margin:0;font-size:11px;color:var(--muted)}
333
+ .meta span{color:var(--text)}
334
+ #top-right{float:none;display:flex;align-items:center;gap:12px}
335
+ #logout-btn{background:var(--panel);border:1px solid var(--line);color:var(--text);border-radius:160px;padding:8px 16px}
336
+ #refresh-indicator{color:var(--muted);font-size:10px}
337
+ .table-wrap{overflow:auto;border:1px solid var(--line);border-radius:24px;background:var(--panel)}
338
+ table{margin:0;white-space:normal}
339
+ th{background:var(--raised);color:var(--muted);border-color:var(--line)}
340
+ td,tr.session-row td{background:transparent;color:var(--text);border-color:var(--line)}
341
+ tr.session-row:hover td{background:var(--raised)}
342
+ .ts{color:var(--muted);overflow-wrap:anywhere}
343
+ .session-id{font-size:11px;overflow-wrap:anywhere;font-family:ui-monospace,monospace}
344
+ .badge{border-radius:6px;font-size:10px;font-weight:500}
345
+ .badge-green,.badge-haiku{background:var(--greenbg);color:var(--green)}
346
+ .badge-red{background:var(--redbg);color:var(--red)}
347
+ .badge-gray,.badge-model{background:var(--raised);color:var(--muted)}
348
+ .badge-blue,.badge-sonnet{background:var(--bluebg);color:var(--blue)}
349
+ .badge-purple,.badge-opus,.badge-fable{background:var(--accentbg);color:var(--accent)}
350
+ .btn-stream{border:1px solid var(--line);border-radius:160px;padding:7px 12px;color:var(--accent);background:var(--panel);font-size:11px;display:inline-flex;align-items:center;gap:6px}
351
+ .agent-badge{background:var(--panel);border:1px solid var(--line);color:var(--text);border-radius:12px}
352
+ .agent-name{color:var(--text)}
353
+ .proc-tree{background:var(--panel);border:1px solid var(--line);border-radius:24px;color:var(--text);padding:20px;overflow:auto}
354
+ .proc-row{color:var(--text)}
355
+ .kb-toolbar,.dreams-toolbar{background:var(--panel);color:var(--text);border-color:var(--line);padding:16px;border-radius:16px}
356
+ .kb-toolbar input,.kb-toolbar select,.dreams-toolbar select{background:var(--panel);color:var(--text);border-color:var(--line)}
357
+ .kb-container{background:var(--panel);border-color:var(--line)}
358
+ .kb-note,.dream-card{background:var(--panel);color:var(--text);border-color:var(--line)}
359
+ .empty{padding:32px;text-align:center;color:var(--muted)}
360
+ .dash-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;margin:24px 0}
361
+ .dash-stat{padding:24px;border-radius:24px;background:var(--mint)}
362
+ .dash-stat:nth-child(2){background:var(--sky)}
363
+ .dash-stat:nth-child(3){background:var(--lavender)}
364
+ .dash-stat:nth-child(4){background:var(--peach)}
365
+ /* Hard-locked summary-box colors, bound to the box by label (not by index) so
366
+ each box keeps its own color regardless of ordering or theme/state cycling. */
367
+ .cards .card.box-agent,.session-token-totals .dash-stat.box-agent{background:var(--mint)}
368
+ .cards .card.box-worker,.session-token-totals .dash-stat.box-worker{background:var(--sky)}
369
+ .cards .card.box-total,.session-token-totals .dash-stat.box-total{background:var(--lavender)}
370
+ .cards .card.box-context,.session-token-totals .dash-stat.box-context{background:var(--pink)}
371
+ .dash-stat strong{display:block;font-size:32px;font-weight:400;margin-top:12px}
372
+ .dash-stat span{font-size:11px}.card-cached{display:block;font-size:12px;font-weight:400;margin-top:6px;color:var(--muted);flex-basis:100%}.dash-drawer .session-token-totals{grid-template-columns:repeat(3,minmax(0,1fr))}.session-token-totals .dash-stat{padding:18px}.session-token-totals .dash-stat strong{font-size:28px}@media(max-width:520px){.dash-drawer .session-token-totals{grid-template-columns:1fr}.session-token-totals .dash-stat{display:flex;align-items:center;justify-content:space-between;gap:12px}.session-token-totals .dash-stat strong{margin-top:0}}
373
+ .dash-panel{background:var(--panel);border:1px solid var(--line);border-radius:24px;padding:24px;margin:24px 0}
374
+ .dash-panel h2{margin:0 0 16px;color:var(--text)}
375
+ .view>h2{margin:0 0 18px;color:var(--text)}
376
+ .dash-pager{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:18px 0;color:var(--muted);font-size:11px}
377
+ .dash-drawer-back{display:none;position:fixed;inset:0;z-index:100;background:#22253655}
378
+ .dash-drawer-back.open{display:block}
379
+ .dash-drawer{background:var(--panel);position:absolute;inset:0 0 0 auto;width:min(800px,100%);padding:28px;overflow:auto;box-shadow:var(--shadow)}
380
+ .dash-drawer h1{font-size:26px;margin:22px 0 10px}
381
+ .dash-drawer h2{margin:24px 0 12px;color:var(--text)}
382
+ .dash-drawer pre{white-space:pre-wrap;overflow-wrap:anywhere;background:var(--raised);padding:16px;border-radius:12px;font:12px/1.7 ui-monospace,monospace;max-height:480px;overflow:auto}
383
+ .dash-drawer details{border-bottom:1px solid var(--line);padding:16px 0}
384
+ .dash-drawer summary{cursor:pointer}.dash-drawer .turn-disclosure{padding:14px;border:1px solid var(--line)}.turn-disclosure>summary{font-size:13px;font-weight:600;line-height:1.6;overflow-wrap:anywhere}.turn-disclosure[open]>summary{margin-bottom:14px}.turn-disclosure>summary:focus-visible{outline:2px solid var(--accent);outline-offset:4px;border-radius:4px}
385
+ .dash-drawer p{overflow-wrap:anywhere}
386
+ .dash-drawer dl{display:grid;grid-template-columns:130px minmax(0,1fr);gap:10px;font-size:12px}
387
+ .dash-drawer dd{margin:0;overflow-wrap:anywhere}
388
+ .dash-drawer dt{color:var(--muted)}
389
+ .dash-task-title{font-weight:500;color:var(--text)}
390
+ .dash-tools{max-width:230px;overflow-wrap:anywhere}
391
+ .dash-tools summary{white-space:nowrap}
392
+ .dash-tools .ts{display:block;max-height:180px;overflow:auto}
393
+ .dash-page-title{margin:0 0 12px}
394
+ .dash-subtitle{color:var(--muted);line-height:1.7}
395
+ .dash-filter{margin:18px 0;display:flex;gap:12px;flex-wrap:wrap}
396
+ .dash-filter input{flex:1;min-width:160px;max-width:380px}
397
+ .error{background:var(--yellowbg);color:var(--yellow);border-radius:12px;padding:16px}
398
+ .live-note{font-size:11px;color:var(--muted);margin:18px 0}
399
+ .dash-mini-list{display:grid;gap:12px}.session-task-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px 20px;flex-wrap:wrap;padding:12px 0;border-bottom:1px solid var(--line)}.session-task-row:last-child{border-bottom:0}.session-task-title{flex:1 1 260px;min-width:0;overflow-wrap:anywhere;font-size:13px;line-height:1.6;font-weight:500}.session-task-row>.status-badge{flex:0 0 auto;margin-top:1px}.session-tasks .dash-mini-list{gap:0}
400
+ .dash-mini-list button{border-radius:12px;text-align:left;justify-content:space-between;width:100%}
401
+ .top-grid{display:block}
402
+ .top-grid>div{margin-bottom:24px}
403
+ .pty-viewer{margin:24px 0}
404
+ .theme-toggle{padding:8px 12px}
405
+ #dash-menu{display:none;align-items:center;justify-content:center;width:36px;height:36px;padding:8px;flex:none}
406
+ #dash-menu .icon{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.7}
407
+ #dashboard-sidebar,#sidebar-brand{cursor:pointer}
408
+ #sidebar-brand:focus-visible{outline:2px solid var(--accent);outline-offset:4px;border-radius:8px}
409
+ @media(min-width:761px){
410
+ [data-sidebar-collapsed=true] .layout{grid-template-columns:76px minmax(0,1fr)}
411
+ [data-sidebar-collapsed=true] .sidebar{width:76px;padding:30px 10px 18px}
412
+ [data-sidebar-collapsed=true] .sidebar .brand{padding:0 0 24px;justify-content:center}
413
+ [data-sidebar-collapsed=true] .sidebar .brand>div:not(.brandmark),[data-sidebar-collapsed=true] .sidebar .navlabel,[data-sidebar-collapsed=true] .sidebar .sidebarfoot{display:none}
414
+ [data-sidebar-collapsed=true] .sidebar .tab{justify-content:center;font-size:0;padding:14px 0;gap:0}
415
+ [data-sidebar-collapsed=true] .sidebar .tab .icon{width:20px;height:20px;flex:none}
416
+ }
417
+
418
+ .sidebarfoot{font-size:11px;color:var(--muted)}
419
+
420
+ @media(max-width:1100px){.dash-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
421
+ }
422
+ @media(max-width:760px){#dash-menu{display:inline-flex}.shell-content{padding:24px 16px}
423
+ .dash-grid{gap:12px}
424
+ .dash-stat{padding:18px}
425
+ .dash-stat strong{font-size:26px}
426
+ .meta{display:none}
427
+ .topbar{gap:6px}
428
+ .topbar h1{font-size:13px}
429
+ #top-right{gap:6px}
430
+ #refresh-indicator{max-width:88px}
431
+ .dash-drawer{padding:22px}
432
+ .dash-pager{flex-wrap:wrap}
433
+ .sidebar{z-index:90}
434
+ .topbar .mobilemenu{z-index:91}
435
+ }
436
+
437
+
438
+ /* Shared operational components: bounded columns and theme-aware legacy panels. */
439
+ [hidden]{display:none!important}
440
+ .identity-badge{display:inline-flex;align-items:center;max-width:100%;padding:4px 9px;border-radius:7px;font-size:11px;font-weight:550;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;background:hsl(var(--agent-hue) 60% 94%);color:hsl(var(--agent-hue) 55% 30%);border:1px solid hsl(var(--agent-hue) 45% 85%)}
441
+ [data-theme=dark] .identity-badge{background:hsl(var(--agent-hue) 30% 21%);color:hsl(var(--agent-hue) 65% 80%);border-color:hsl(var(--agent-hue) 30% 35%)}
442
+ .channel-badge{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:var(--muted);white-space:nowrap;margin-top:6px}
443
+ .channel-badge svg{width:14px;height:14px;flex:none;fill:currentColor}
444
+ .table-wrap,.table-scroll{width:100%;max-width:100%;overflow:auto;overscroll-behavior-x:contain;scrollbar-gutter:auto}
445
+ .data-table{table-layout:fixed;width:100%;white-space:normal}
446
+ .data-table td,.data-table th{padding:14px 16px;vertical-align:top;word-break:normal;overflow-wrap:break-word;font-size:12px}
447
+ .data-table th{font-size:10px;white-space:normal}
448
+ .data-table .btn-stream{font-size:11px;white-space:nowrap;padding:7px 10px}
449
+ .data-table .dash-task-title{white-space:normal;text-align:left;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;border:0;background:none;padding:0;font-size:12px;line-height:1.6;border-radius:0;margin-bottom:8px}
450
+ .cell-clip{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
451
+ .short-id{font:11px ui-monospace,monospace;white-space:nowrap;color:var(--muted)}
452
+ .data-table .session-id{word-break:normal;overflow-wrap:normal;font-family:inherit}
453
+ .data-table .ts{font-size:10px;line-height:1.6;color:var(--muted)}
454
+ .data-table td{font-variant-numeric:tabular-nums}
455
+ .dash-tools details{font-size:11px}.dash-tools details[open]{max-width:100%}
456
+ .dash-tools .ts{white-space:normal;overflow-wrap:anywhere}
457
+ .kb-toolbar,.dream-run,.dream-prop,.proc-tree{background:var(--panel);color:var(--text);border:1px solid var(--line);border-radius:14px;padding:16px}
458
+ .kb-toolbar{gap:14px;align-items:center;flex-wrap:wrap}
459
+ .kb-toolbar button,.kb-zoom button,.dream-accept-btn,.dream-accept-all,#kb-source,#kb-demo-size,#kb-search,#dreams-agent{font:inherit;font-size:12px;color:var(--text);background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:9px 12px;min-height:38px}
460
+ .kb-toolbar button:hover,.kb-zoom button:hover,.dream-accept-btn:hover{background:var(--raised);border-color:var(--accent)}
461
+ .kb-stage{background:radial-gradient(ellipse 70% 62% at 50% 42%,#16203a 0%,#0d1322 55%,#070a12 100%);border-color:var(--line);border-radius:16px}
462
+ .dream-run-head .agent,.dream-prop .file,.proc-tree .proc-orchestrator,.proc-tree .proc-mcp{color:var(--accent)}
463
+ .dream-run-head .when,.dream-meta,.dreams-empty,.dream-prop .score,.dream-prop .reason,.proc-tree .proc-label,#kb-search-count{color:var(--muted)}
464
+ .dream-summary,.dream-prop .content,.dream-prop .anchor{color:var(--text);background:var(--raised)}
465
+ .dream-badge.auto,.dream-badge.propose,.dream-badge.outcome{background:var(--raised);color:var(--text);border:1px solid var(--line);border-radius:6px;padding:3px 8px}
466
+ .proc-tree .proc-summary,.proc-tree .proc-claude{color:var(--text)}
467
+ .proc-tree .proc-pty,.proc-tree .proc-receiver{color:var(--green)}
468
+ .proc-tree .proc-orphan{color:var(--red)}
469
+ #view-system h2{color:var(--text)}
470
+ .proc-tree{white-space:pre-wrap;overflow-wrap:anywhere;font-size:12px;line-height:1.8}
471
+ .dream-run-head{gap:10px}.dream-run-head .when{font:11px inherit;margin-left:auto}
472
+
473
+ .dream-prop .op.add,.prop-status.applied,.prop-status.applied-auto{color:var(--green)}
474
+ .dream-prop .op.replace,.dream-prop .anchor,.prop-status.pending{color:var(--accent)}
475
+ .dream-prop .op.remove,.prop-status.failed{color:var(--red)}
476
+ .dream-accept-all:hover{background:var(--raised)}
477
+ .kb-note,.kb-note-head,.kb-note-body{background:var(--panel);color:var(--text);border-color:var(--line)}
478
+
479
+ .range-toggle{display:inline-flex;gap:3px;background:var(--raised);padding:4px;border:1px solid var(--line);border-radius:10px;flex-wrap:wrap}.range-toggle button{border:0;background:transparent;color:var(--muted);padding:7px 13px;border-radius:7px;font:inherit;cursor:pointer}.range-toggle button[aria-pressed=true]{background:var(--panel);color:var(--text);box-shadow:0 1px 4px #0001;font-weight:650}
480
+ .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
+ .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
+ 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}
483
+ `;
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>";
485
+ //# sourceMappingURL=dashboard-theme.js.map
@@ -0,0 +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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8dvC,CAAC;AACW,QAAA,iBAAiB,GAAG,oPAAoP,CAAC"}
@@ -0,0 +1,3 @@
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";
3
+ //# sourceMappingURL=token-report-client.d.ts.map
@@ -0,0 +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,oxEA4B7B,CAAC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tokenReportClient = void 0;
4
+ /** Refresh rendered data only; keep filters, theme, scroll and the open turn-detail panel. */
5
+ exports.tokenReportClient = `
6
+ var reportRefreshing=false;
7
+ async function refreshReport(){
8
+ if(document.hidden||reportRefreshing)return;
9
+ reportRefreshing=true;
10
+ var status=document.getElementById('report-live');
11
+ try{
12
+ var response=await fetch(location.href,{cache:'no-store',headers:{Accept:'text/html'}});
13
+ if(response.status===401){location.reload();return;}
14
+ if(!response.ok)throw Error('Unavailable');
15
+ var next=new DOMParser().parseFromString(await response.text(),'text/html');
16
+ if(next.getElementById('login-form')){location.reload();return;}
17
+ if(!next.getElementById('report-totals'))throw Error('Unavailable');
18
+ var scrolls=Array.from(document.querySelectorAll('.table-scroll')).map(function(el){return el.scrollLeft;});
19
+ var x=scrollX,y=scrollY;
20
+ ['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;});
21
+ var body=document.querySelector('.report-table tbody'),freshBody=next.querySelector('.report-table tbody');
22
+ if(body.innerHTML!==freshBody.innerHTML)body.innerHTML=freshBody.innerHTML;
23
+ var pagers=next.querySelectorAll('.report-pager');document.querySelectorAll('.report-pager').forEach(function(el,i){if(pagers[i])el.innerHTML=pagers[i].innerHTML;});
24
+ var model=document.getElementById('turn-model'),freshModel=next.getElementById('turn-model'),selected=model.value;
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
+ 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();
28
+ }catch(e){status.textContent='Reconnecting… · data may be outdated';}
29
+ finally{reportRefreshing=false;}
30
+ }
31
+ setInterval(refreshReport,5000);
32
+ document.addEventListener('visibilitychange',function(){if(!document.hidden)refreshReport();});
33
+ `;
34
+ //# sourceMappingURL=token-report-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-report-client.js","sourceRoot":"","sources":["../../src/ui/token-report-client.ts"],"names":[],"mappings":";;;AAAA,8FAA8F;AACjF,QAAA,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BhC,CAAC"}
@@ -0,0 +1,89 @@
1
+ import type { RequestToolSchemas } from '../session/request-tool-capture';
2
+ import type { ContextFootprint } from '../orchestration/context-footprint';
3
+ /** Read-only admin report. Escape all stored model/tool metadata as untrusted text. */
4
+ export interface TokenReportView {
5
+ contextFootprint?: ContextFootprint;
6
+ contextWindow?: {
7
+ used: number;
8
+ total: number | null;
9
+ model: string | null;
10
+ } | null;
11
+ sessionId: string;
12
+ sessionStatus?: 'running' | 'idle' | 'stopped';
13
+ activityStatus?: string;
14
+ scope?: string;
15
+ since?: number;
16
+ source?: string;
17
+ chatId?: string;
18
+ pagination?: {
19
+ offset: number;
20
+ limit: number;
21
+ total: number;
22
+ };
23
+ distribution?: Array<{
24
+ category: string;
25
+ tokens: number;
26
+ }>;
27
+ usageByRole?: Array<{
28
+ role: string;
29
+ inputTokens: number;
30
+ cacheCreationTokens: number;
31
+ cacheReadTokens: number;
32
+ outputTokens: number;
33
+ }>;
34
+ coverage: string;
35
+ totals: {
36
+ agentTokens: number | null;
37
+ workerTokens: number | null;
38
+ totalTokens: number | null;
39
+ };
40
+ backgroundReviews?: Array<{
41
+ ts: string | number;
42
+ outcome: string | null;
43
+ tokensSpent: number;
44
+ triggerReason: string | null;
45
+ }>;
46
+ turns: Array<{
47
+ id: string;
48
+ role: string;
49
+ category: string;
50
+ taskId?: string;
51
+ inputModalities?: string[];
52
+ inputSequences?: number[];
53
+ inputTexts?: string[];
54
+ responseText?: string;
55
+ taskTitle?: string;
56
+ state?: string;
57
+ failureCode?: string;
58
+ attemptGeneration?: number;
59
+ pending?: boolean;
60
+ queuedMs?: number;
61
+ startedAt: string | number;
62
+ endedAt?: string | number;
63
+ model?: string;
64
+ usage?: {
65
+ inputTokens: number;
66
+ cacheCreationTokens: number;
67
+ cacheReadTokens: number;
68
+ outputTokens: number;
69
+ totalTokens: number;
70
+ cacheCreation5mTokens?: number;
71
+ cacheCreation1hTokens?: number;
72
+ } | null;
73
+ requests?: Array<{
74
+ id: string;
75
+ model?: string;
76
+ toolSchemas?: RequestToolSchemas;
77
+ usage: NonNullable<TokenReportView['turns'][number]['usage']>;
78
+ }>;
79
+ contextTools?: string[] | null;
80
+ schemaCoverage?: {
81
+ measured: number;
82
+ total: number;
83
+ };
84
+ loadedTools?: string[] | null;
85
+ usedTools?: string[];
86
+ }>;
87
+ }
88
+ export declare function generateTokenReportHtml(agentId: string, report: TokenReportView): string;
89
+ //# sourceMappingURL=token-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-report.d.ts","sourceRoot":"","sources":["../../src/ui/token-report.ts"],"names":[],"mappings":"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"}