@matt82198/aesop 0.1.0-beta.3 → 0.1.0-beta.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 (234) hide show
  1. package/CHANGELOG.md +79 -95
  2. package/CLAUDE-TEMPLATE.md +115 -0
  3. package/README.md +126 -245
  4. package/aesop.config.example.json +34 -26
  5. package/bin/CLAUDE.md +67 -0
  6. package/bin/cli.js +593 -36
  7. package/daemons/CLAUDE.md +36 -0
  8. package/daemons/backup-fleet.sh +92 -21
  9. package/daemons/run-watchdog.sh +95 -12
  10. package/dash/CLAUDE.md +32 -0
  11. package/dash/dash-extra.mjs +194 -21
  12. package/dash/watchdog-gui.sh +23 -6
  13. package/docs/BEHAVIORAL-PR-REVIEW.md +86 -0
  14. package/docs/CHECKPOINTING.md +100 -0
  15. package/docs/DISPATCH-MODEL.md +11 -7
  16. package/docs/FORENSICS.md +204 -0
  17. package/docs/GOVERNANCE.md +4 -2
  18. package/docs/HOOK-INSTALL.md +307 -0
  19. package/docs/HOW-THE-LOOP-WORKS.md +175 -0
  20. package/docs/MEMORY-TEMPLATE.md +61 -0
  21. package/docs/README.md +44 -0
  22. package/docs/RELEASING.md +159 -0
  23. package/docs/RELIABILITY.md +61 -0
  24. package/docs/RESTORE.md +397 -0
  25. package/docs/SCRIPTS-POLICY.md +97 -0
  26. package/docs/archive/README.md +3 -0
  27. package/docs/archive/spikes/tiered-cognition/ACTIVATION.md +125 -0
  28. package/docs/archive/spikes/tiered-cognition/DESIGN.md +287 -0
  29. package/docs/archive/spikes/tiered-cognition/FINDINGS.md +113 -0
  30. package/docs/archive/spikes/tiered-cognition/README.md +27 -0
  31. package/docs/archive/spikes/tiered-cognition/aesop-cognition.example.md +32 -0
  32. package/docs/archive/spikes/tiered-cognition/force-model-policy.merged.mjs +673 -0
  33. package/docs/archive/spikes/tiered-cognition/strip-tools-hook.mjs +434 -0
  34. package/docs/case-study-portfolio.md +61 -0
  35. package/docs/self-stats-data.json +11 -0
  36. package/docs/templates/FLEET-OPS-ANALYSIS.example.md +27 -0
  37. package/docs/templates/FLEET-OPS-RECOMMENDATIONS.example.md +24 -0
  38. package/docs/templates/PROPOSALS-LOG.example.md +64 -0
  39. package/hooks/CLAUDE.md +61 -0
  40. package/hooks/claude/force-model-policy.mjs +159 -0
  41. package/hooks/pre-push-policy.sh +753 -0
  42. package/mcp/CLAUDE.md +213 -0
  43. package/mcp/package.json +26 -0
  44. package/mcp/server.mjs +543 -0
  45. package/monitor/.signal-state.json +3 -0
  46. package/monitor/ACTIONS.log +1 -0
  47. package/monitor/BRIEF.md +24 -0
  48. package/monitor/CHARTER.md +75 -88
  49. package/monitor/CLAUDE.md +40 -0
  50. package/monitor/SIGNALS.json +54 -0
  51. package/monitor/collect-signals.mjs +613 -61
  52. package/package.json +15 -3
  53. package/scan/fleet-scan.example.mjs +292 -0
  54. package/skills/CLAUDE.md +3 -0
  55. package/skills/healthcheck/SKILL.md +44 -0
  56. package/skills/power/SKILL.md +161 -0
  57. package/state_store/CLAUDE.md +39 -0
  58. package/state_store/__init__.py +24 -0
  59. package/state_store/__pycache__/__init__.cpython-314.pyc +0 -0
  60. package/state_store/__pycache__/api.cpython-314.pyc +0 -0
  61. package/state_store/__pycache__/export.cpython-314.pyc +0 -0
  62. package/state_store/__pycache__/ingest.cpython-314.pyc +0 -0
  63. package/state_store/__pycache__/projections.cpython-314.pyc +0 -0
  64. package/state_store/__pycache__/store.cpython-314.pyc +0 -0
  65. package/state_store/api.py +35 -0
  66. package/state_store/export.py +19 -0
  67. package/state_store/ingest.py +24 -0
  68. package/state_store/projections.py +52 -0
  69. package/state_store/store.py +102 -0
  70. package/tools/CLAUDE.md +72 -0
  71. package/tools/__pycache__/alert_bridge.cpython-314.pyc +0 -0
  72. package/tools/__pycache__/buildlog.cpython-314.pyc +0 -0
  73. package/tools/__pycache__/ci_merge_wait.cpython-314.pyc +0 -0
  74. package/tools/__pycache__/ensure_state.cpython-314.pyc +0 -0
  75. package/tools/__pycache__/eod_sweep.cpython-314.pyc +0 -0
  76. package/tools/__pycache__/fleet_ledger.cpython-314.pyc +0 -0
  77. package/tools/__pycache__/fleet_prompt_extractor.cpython-314.pyc +0 -0
  78. package/tools/__pycache__/healthcheck.cpython-314.pyc +0 -0
  79. package/tools/__pycache__/heartbeat.cpython-314.pyc +0 -0
  80. package/tools/__pycache__/inbox_drain.cpython-314.pyc +0 -0
  81. package/tools/__pycache__/launch_tui.cpython-314.pyc +0 -0
  82. package/tools/__pycache__/metrics_gate.cpython-314.pyc +0 -0
  83. package/tools/__pycache__/orchestrator_status.cpython-314.pyc +0 -0
  84. package/tools/__pycache__/power_selftest.cpython-314.pyc +0 -0
  85. package/tools/__pycache__/prepublish_scan.cpython-314.pyc +0 -0
  86. package/tools/__pycache__/rotate_logs.cpython-314.pyc +0 -0
  87. package/tools/__pycache__/scanner_selftest.cpython-314.pyc +0 -0
  88. package/tools/__pycache__/secret_scan.cpython-314.pyc +0 -0
  89. package/tools/__pycache__/self_stats.cpython-314.pyc +0 -0
  90. package/tools/__pycache__/session_usage_summary.cpython-314.pyc +0 -0
  91. package/tools/__pycache__/stall_check.cpython-314.pyc +0 -0
  92. package/tools/__pycache__/transcript_replay.cpython-314.pyc +0 -0
  93. package/tools/__pycache__/transcript_timeline.cpython-314.pyc +0 -0
  94. package/tools/__pycache__/verify_dash.cpython-314.pyc +0 -0
  95. package/tools/__pycache__/verify_submit_encoding.cpython-314.pyc +0 -0
  96. package/tools/agent-forensics.sh +186 -0
  97. package/tools/alert_bridge.py +449 -0
  98. package/tools/buildlog.py +182 -0
  99. package/tools/ci_merge_wait.py +317 -0
  100. package/tools/ensure_state.py +94 -0
  101. package/tools/eod_sweep.py +239 -0
  102. package/tools/fleet_ledger.py +272 -0
  103. package/tools/fleet_prompt_extractor.py +134 -0
  104. package/tools/healthcheck.py +296 -0
  105. package/tools/heartbeat.py +131 -0
  106. package/tools/inbox_drain.py +249 -0
  107. package/tools/launch_tui.py +51 -3
  108. package/tools/lock.mjs +211 -0
  109. package/tools/metrics_gate.py +205 -0
  110. package/tools/orchestrator_status.py +99 -0
  111. package/tools/power_selftest.py +386 -0
  112. package/tools/prepublish_scan.py +84 -0
  113. package/tools/proposals.mjs +248 -0
  114. package/tools/reconstitute.sh +467 -0
  115. package/tools/rotate_logs.py +228 -0
  116. package/tools/scanner_selftest.py +303 -0
  117. package/tools/secret_scan.py +138 -31
  118. package/tools/self_stats.py +509 -0
  119. package/tools/session_usage_summary.py +198 -0
  120. package/tools/stall_check.py +172 -0
  121. package/tools/svg_to_png.mjs +50 -0
  122. package/tools/transcript_replay.py +236 -0
  123. package/tools/transcript_timeline.py +184 -0
  124. package/tools/verify_dash.py +513 -0
  125. package/tools/verify_submit_encoding.py +202 -0
  126. package/ui/CLAUDE.md +125 -0
  127. package/ui/__pycache__/agents.cpython-314.pyc +0 -0
  128. package/ui/__pycache__/collectors.cpython-314.pyc +0 -0
  129. package/ui/__pycache__/config.cpython-314.pyc +0 -0
  130. package/ui/__pycache__/cost.cpython-314.pyc +0 -0
  131. package/ui/__pycache__/csrf.cpython-314.pyc +0 -0
  132. package/ui/__pycache__/handler.cpython-314.pyc +0 -0
  133. package/ui/__pycache__/render.cpython-314.pyc +0 -0
  134. package/ui/__pycache__/serve.cpython-314.pyc +0 -0
  135. package/ui/__pycache__/sse.cpython-314.pyc +0 -0
  136. package/ui/agents.py +183 -0
  137. package/ui/api/__init__.py +84 -0
  138. package/ui/api/__pycache__/__init__.cpython-314.pyc +0 -0
  139. package/ui/api/__pycache__/submit.cpython-314.pyc +0 -0
  140. package/ui/api/__pycache__/tracker.cpython-314.pyc +0 -0
  141. package/ui/api/submit.py +97 -0
  142. package/ui/api/tracker.py +116 -0
  143. package/ui/collectors.py +735 -0
  144. package/ui/config.py +123 -0
  145. package/ui/cost.py +260 -0
  146. package/ui/csrf.py +144 -0
  147. package/ui/handler.py +676 -0
  148. package/ui/render.py +49 -0
  149. package/ui/serve.py +68 -796
  150. package/ui/sse.py +183 -0
  151. package/ui/web/.gitattributes +13 -0
  152. package/ui/web/dist/assets/index-2LZDQirC.js +9 -0
  153. package/ui/web/dist/assets/index-D4M1qyOv.css +1 -0
  154. package/ui/web/dist/index.html +14 -0
  155. package/ui/web/index.html +13 -0
  156. package/ui/web/package-lock.json +2225 -0
  157. package/ui/web/package.json +26 -0
  158. package/ui/web/src/App.test.tsx +74 -0
  159. package/ui/web/src/App.tsx +142 -0
  160. package/ui/web/src/CONTRIBUTING-UI.md +49 -0
  161. package/ui/web/src/components/AgentRow.css +187 -0
  162. package/ui/web/src/components/AgentRow.test.tsx +209 -0
  163. package/ui/web/src/components/AgentRow.tsx +207 -0
  164. package/ui/web/src/components/AgentsPanel.css +108 -0
  165. package/ui/web/src/components/AgentsPanel.test.tsx +41 -0
  166. package/ui/web/src/components/AgentsPanel.tsx +58 -0
  167. package/ui/web/src/components/AlertsPanel.css +88 -0
  168. package/ui/web/src/components/AlertsPanel.test.tsx +51 -0
  169. package/ui/web/src/components/AlertsPanel.tsx +67 -0
  170. package/ui/web/src/components/BacklogPanel.test.tsx +126 -0
  171. package/ui/web/src/components/BacklogPanel.tsx +122 -0
  172. package/ui/web/src/components/CostChart.css +110 -0
  173. package/ui/web/src/components/CostChart.test.tsx +144 -0
  174. package/ui/web/src/components/CostChart.tsx +152 -0
  175. package/ui/web/src/components/CostTable.css +93 -0
  176. package/ui/web/src/components/CostTable.test.tsx +165 -0
  177. package/ui/web/src/components/CostTable.tsx +94 -0
  178. package/ui/web/src/components/EventsFeed.css +68 -0
  179. package/ui/web/src/components/EventsFeed.test.tsx +36 -0
  180. package/ui/web/src/components/EventsFeed.tsx +31 -0
  181. package/ui/web/src/components/HealthHeader.css +137 -0
  182. package/ui/web/src/components/HealthHeader.test.tsx +278 -0
  183. package/ui/web/src/components/HealthHeader.tsx +281 -0
  184. package/ui/web/src/components/InboxForm.css +135 -0
  185. package/ui/web/src/components/InboxForm.test.tsx +208 -0
  186. package/ui/web/src/components/InboxForm.tsx +116 -0
  187. package/ui/web/src/components/MessagesTail.module.css +144 -0
  188. package/ui/web/src/components/MessagesTail.test.tsx +176 -0
  189. package/ui/web/src/components/MessagesTail.tsx +94 -0
  190. package/ui/web/src/components/ReposPanel.css +90 -0
  191. package/ui/web/src/components/ReposPanel.test.tsx +45 -0
  192. package/ui/web/src/components/ReposPanel.tsx +67 -0
  193. package/ui/web/src/components/Scorecard.css +106 -0
  194. package/ui/web/src/components/Scorecard.test.tsx +117 -0
  195. package/ui/web/src/components/Scorecard.tsx +85 -0
  196. package/ui/web/src/components/Timeline.module.css +151 -0
  197. package/ui/web/src/components/Timeline.test.tsx +215 -0
  198. package/ui/web/src/components/Timeline.tsx +99 -0
  199. package/ui/web/src/components/TrackerBoard.test.tsx +121 -0
  200. package/ui/web/src/components/TrackerBoard.tsx +107 -0
  201. package/ui/web/src/components/TrackerCard.test.tsx +180 -0
  202. package/ui/web/src/components/TrackerCard.tsx +160 -0
  203. package/ui/web/src/components/TrackerForm.test.tsx +189 -0
  204. package/ui/web/src/components/TrackerForm.tsx +144 -0
  205. package/ui/web/src/lib/api.ts +218 -0
  206. package/ui/web/src/lib/format.test.ts +89 -0
  207. package/ui/web/src/lib/format.ts +103 -0
  208. package/ui/web/src/lib/sanitizeUrl.test.ts +84 -0
  209. package/ui/web/src/lib/sanitizeUrl.ts +38 -0
  210. package/ui/web/src/lib/types.ts +230 -0
  211. package/ui/web/src/lib/useHashRoute.test.ts +60 -0
  212. package/ui/web/src/lib/useHashRoute.ts +23 -0
  213. package/ui/web/src/lib/useSSE.ts +175 -0
  214. package/ui/web/src/main.tsx +10 -0
  215. package/ui/web/src/styles/global.css +179 -0
  216. package/ui/web/src/styles/theme.css +184 -0
  217. package/ui/web/src/styles/work.css +572 -0
  218. package/ui/web/src/test/fixtures.ts +385 -0
  219. package/ui/web/src/test/setup.ts +49 -0
  220. package/ui/web/src/views/Activity.module.css +43 -0
  221. package/ui/web/src/views/Activity.test.tsx +89 -0
  222. package/ui/web/src/views/Activity.tsx +31 -0
  223. package/ui/web/src/views/Cost.css +87 -0
  224. package/ui/web/src/views/Cost.test.tsx +142 -0
  225. package/ui/web/src/views/Cost.tsx +54 -0
  226. package/ui/web/src/views/Overview.css +51 -0
  227. package/ui/web/src/views/Overview.test.tsx +76 -0
  228. package/ui/web/src/views/Overview.tsx +46 -0
  229. package/ui/web/src/views/Work.test.tsx +82 -0
  230. package/ui/web/src/views/Work.tsx +79 -0
  231. package/ui/web/src/vite-env.d.ts +10 -0
  232. package/ui/web/tsconfig.json +22 -0
  233. package/ui/web/vite.config.ts +25 -0
  234. package/ui/web/vitest.config.ts +12 -0
@@ -0,0 +1 @@
1
+ .health-header{z-index:100;background:var(--color-surface);border-bottom:1px solid var(--color-border);padding:var(--space-3) var(--space-5);position:sticky;top:0}.health-header__cells{gap:var(--space-4);max-width:var(--content-max-width);flex-wrap:wrap;align-items:center;margin:0 auto;display:flex}.health-header__cell{align-items:flex-start;gap:var(--space-2);padding:var(--space-2) var(--space-3);background:var(--color-bg-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);font-size:var(--font-size-sm);cursor:pointer;transition:background-color var(--transition-fast), border-color var(--transition-fast), box-shadow var(--transition-fast);flex-direction:column;display:flex}.health-header__cell:hover{background:var(--color-bg-inset);border-color:var(--color-border)}.health-header__cell:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}.health-header__label{font-size:var(--font-size-xs);color:var(--color-text-muted);font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:.05em}.health-header__status{font-family:var(--font-mono);font-size:var(--font-size-sm);font-weight:var(--font-weight-bold);color:var(--color-text)}.health-header__count{font-family:var(--font-mono);font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-accent)}.health-header__badge{padding:var(--space-1) var(--space-2);background:var(--color-status-warn-bg);color:var(--color-status-warn);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);display:inline-block}.health-header__icon{font-size:var(--font-size-lg);line-height:1}.health-header__cell--sse{cursor:default}.health-header__cell--sse:hover{background:var(--color-bg-subtle);border-color:var(--color-border-subtle)}.health-header__cell--timestamp{cursor:default}.health-header__cell--timestamp:hover{background:var(--color-bg-subtle);border-color:var(--color-border-subtle)}.health-header__cell--stale,.health-header__cell--stale:hover{background:var(--color-status-warn-bg);border-color:var(--color-status-warn)}.health-header__cell--theme,.health-header__cell--refresh{margin-left:auto}@media (width<=768px){.health-header{padding:var(--space-2) var(--space-3)}.health-header__cells{gap:var(--space-3)}.health-header__cell{padding:var(--space-2);font-size:var(--font-size-xs)}.health-header__count{font-size:var(--font-size-md)}}@media (prefers-reduced-motion:reduce){.health-header__cell{transition:none}}.agent-row{border-bottom:1px solid var(--color-border-subtle);padding:var(--space-3) 0;list-style:none}.agent-row:last-child{border-bottom:none}.agent-row__toggle{width:var(--space-5);height:var(--space-5);margin-right:var(--space-2);cursor:pointer;color:var(--color-text-muted);transition:color var(--transition-fast);background:0 0;border:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.agent-row__toggle:hover{color:var(--color-accent)}.agent-row__toggle:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px;border-radius:var(--radius-sm)}.agent-row__toggle-icon{font-size:var(--font-size-xs);line-height:1;display:inline-block}.agent-row__header{align-items:center;gap:var(--space-3);font-size:var(--font-size-sm);line-height:var(--line-height-normal);display:flex}.agent-row__status-icon{font-size:var(--font-size-lg);flex-shrink:0;display:inline-block}.agent-row__id{font-family:var(--font-mono);font-weight:var(--font-weight-bold);color:var(--color-accent);flex-shrink:0;min-width:100px}.agent-row__age{font-family:var(--font-mono);font-size:var(--font-size-xs);color:var(--color-text-muted);flex-shrink:0;min-width:50px}.agent-row__hint{color:var(--color-text);word-break:break-word;flex-grow:1}.agent-row__detail{margin-top:var(--space-3);margin-left:calc(var(--space-5) + var(--space-2));padding:var(--space-3);background:var(--color-bg-subtle);border-left:2px solid var(--color-accent);border-radius:var(--radius-md);animation:.15s expand-in}@keyframes expand-in{0%{opacity:0;max-height:0}to{opacity:1;max-height:100vh}}@media (prefers-reduced-motion:reduce){.agent-row__detail{animation:none}}.agent-row__detail-row{gap:var(--space-3);margin-bottom:var(--space-2);font-size:var(--font-size-sm);line-height:var(--line-height-normal);grid-template-columns:120px 1fr;align-items:baseline;display:grid}.agent-row__detail-label{font-weight:var(--font-weight-bold);color:var(--color-text-muted);text-align:right}.agent-row__detail-value{color:var(--color-text);font-family:var(--font-mono);word-break:break-word}.agent-row__prompt{margin-top:var(--space-4);padding-top:var(--space-3);border-top:1px solid var(--color-border-subtle)}.agent-row__prompt-label{margin-bottom:var(--space-2);font-weight:var(--font-weight-bold);color:var(--color-text-muted);font-size:var(--font-size-xs);text-transform:uppercase;letter-spacing:.05em;display:block}.agent-row__prompt-text{background:var(--color-bg-inset);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);font-size:var(--font-size-xs);line-height:var(--line-height-normal);color:var(--color-text);font-family:var(--font-mono);white-space:pre-wrap;word-break:break-word;max-height:300px;margin:0;overflow-y:auto}.agent-row__prompt-loading,.agent-row__prompt-error{background:var(--color-bg-inset);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);font-family:var(--font-mono);font-size:var(--font-size-sm)}.agent-row__prompt-loading{color:var(--color-text-muted)}.agent-row__prompt-error{color:var(--color-status-error)}@media (width<=768px){.agent-row__detail-row{gap:var(--space-2);grid-template-columns:1fr}.agent-row__detail-label{text-align:left;font-weight:var(--font-weight-bold)}}.agents-panel{min-width:0;padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex:1}.agents-panel h2{margin:0 0 var(--space-4) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text)}.agents-panel__summaries{gap:var(--space-3);margin-bottom:var(--space-4);padding:var(--space-3);background:var(--color-bg-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);grid-template-columns:repeat(auto-fill,minmax(200px,1fr));display:grid}.agent-summary{align-items:center;gap:var(--space-2);padding:var(--space-2);background:var(--color-surface);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);font-size:var(--font-size-sm);display:flex}.agent-summary__project{font-weight:var(--font-weight-medium);color:var(--color-text);flex:none;min-width:fit-content}.agent-summary__status{padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);text-transform:uppercase;white-space:nowrap;flex:none}.agent-summary__status--running{background:var(--color-status-ok-bg);color:var(--color-status-ok)}.agent-summary__status--idle{background:var(--color-status-info-bg);color:var(--color-status-info)}.agent-summary__status--SUSPICIOUS,.agent-summary__status--HIGH{background:var(--color-status-error-bg);color:var(--color-status-error)}.agent-summary__status--MED,.agent-summary__status--DRIFT{background:var(--color-status-warn-bg);color:var(--color-status-warn)}.agent-summary__runtime{text-align:right;font-family:var(--font-mono);color:var(--color-text-muted);flex:1;min-width:fit-content}.agents-panel__list{margin:0;margin-top:var(--space-4);padding:0;list-style:none}@media (width<=768px){.agents-panel{padding:var(--space-3)}.agents-panel h2{font-size:var(--font-size-md)}}.alerts-panel{min-width:0;padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex:1}.alerts-panel h2{margin:0 0 var(--space-4) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text)}.alerts-panel__list{gap:var(--space-3);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.alerts-panel__item{gap:var(--space-3);padding:var(--space-3);background:var(--color-bg-subtle);border-left:4px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--font-size-sm);line-height:var(--line-height-normal);word-break:break-word;align-items:flex-start;display:flex}.alerts-panel__item[data-severity=error]{background:var(--color-status-error-bg)}.alerts-panel__item[data-severity=warn]{background:var(--color-status-warn-bg)}.alerts-panel__item[data-severity=info]{background:var(--color-status-info-bg)}.alerts-panel__severity{min-width:50px;font-weight:var(--font-weight-bold);font-size:var(--font-size-xs);text-transform:uppercase;letter-spacing:.05em;flex-shrink:0;display:inline-block}.alerts-panel__text{color:var(--color-text);font-family:var(--font-mono);font-size:var(--font-size-xs);flex-grow:1}@media (width<=768px){.alerts-panel{padding:var(--space-3)}.alerts-panel h2{font-size:var(--font-size-md)}.alerts-panel__item{padding:var(--space-2);gap:var(--space-2)}}.events-feed{min-width:0;padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex:1}.events-feed h2{margin:0 0 var(--space-4) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text)}.events-feed__list{gap:var(--space-2);flex-direction:column;max-height:300px;margin:0;padding:0;list-style:none;display:flex;overflow-y:auto}.events-feed__item{padding:var(--space-2) var(--space-3);background:var(--color-bg-inset);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);font-size:var(--font-size-xs);line-height:var(--line-height-normal);color:var(--color-text-muted)}.events-feed__item code{font-family:var(--font-mono);color:var(--color-text);word-break:break-word}@media (width<=768px){.events-feed{padding:var(--space-3)}.events-feed h2{font-size:var(--font-size-md)}.events-feed__list{max-height:200px}.events-feed__item{padding:var(--space-2);font-size:var(--font-size-xs)}}.repos-panel{min-width:0;padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex:1}.repos-panel h2{margin:0 0 var(--space-4) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text)}.repos-panel__list{gap:var(--space-3);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.repos-panel__item{justify-content:space-between;align-items:center;gap:var(--space-3);padding:var(--space-3);background:var(--color-bg-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);font-size:var(--font-size-sm);display:flex}.repos-panel__item[data-severity=ok]{background:var(--color-status-ok-bg);border-color:var(--color-status-ok)}.repos-panel__item[data-severity=warn]{background:var(--color-status-warn-bg);border-color:var(--color-status-warn)}.repos-panel__item[data-severity=error]{background:var(--color-status-error-bg);border-color:var(--color-status-error)}.repos-panel__name{font-weight:var(--font-weight-bold);color:var(--color-text);font-family:var(--font-mono)}.repos-panel__state{font-family:var(--font-mono);font-size:var(--font-size-xs);text-align:right}.empty-state{padding:var(--space-4);text-align:center;color:var(--color-text-muted);font-size:var(--font-size-sm)}@media (width<=768px){.repos-panel{padding:var(--space-3)}.repos-panel h2{font-size:var(--font-size-md)}.repos-panel__item{padding:var(--space-2);flex-direction:column;align-items:flex-start}.repos-panel__state{text-align:left}}.inbox-form{padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md)}.inbox-form h2{margin:0 0 var(--space-4) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text)}.inbox-form__form{gap:var(--space-3);flex-direction:column;display:flex}.inbox-form__group{gap:var(--space-2);align-items:stretch;display:flex}.inbox-form__input{min-width:0;padding:var(--space-3) var(--space-4);background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--font-size-sm);font-family:var(--font-sans);color:var(--color-text);line-height:var(--line-height-normal);transition:border-color var(--transition-fast), box-shadow var(--transition-fast);flex:1}.inbox-form__input:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px;border-color:var(--color-accent)}.inbox-form__input::placeholder{color:var(--color-text-muted)}.inbox-form__input:disabled{opacity:.6;cursor:not-allowed}.inbox-form__submit{padding:var(--space-3) var(--space-5);background:var(--color-accent);color:var(--color-text-inverse);border-radius:var(--radius-md);font-size:var(--font-size-sm);font-weight:var(--font-weight-bold);cursor:pointer;transition:background-color var(--transition-fast);border:none}.inbox-form__submit:hover:not(:disabled){background:var(--color-accent-emphasis)}.inbox-form__submit:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}.inbox-form__submit:disabled{opacity:.5;cursor:not-allowed}.inbox-form__error{padding:var(--space-3);background:var(--color-status-error-bg);color:var(--color-status-error);border-left:4px solid var(--color-status-error);border-radius:var(--radius-md);font-size:var(--font-size-sm)}.inbox-form__success{padding:var(--space-3);background:var(--color-status-ok-bg);color:var(--color-status-ok);border-left:4px solid var(--color-status-ok);border-radius:var(--radius-md);font-size:var(--font-size-sm)}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@media (width<=768px){.inbox-form{padding:var(--space-3)}.inbox-form h2{font-size:var(--font-size-md)}.inbox-form__group{flex-direction:column}.inbox-form__submit{width:100%}}@media (prefers-reduced-motion:reduce){.inbox-form__input,.inbox-form__submit{transition:none}}.overview{gap:var(--space-6);padding:var(--space-6);max-width:var(--content-max-width);flex-direction:column;width:100%;margin:0 auto;display:flex}.overview__section{gap:var(--space-5);display:flex}.overview__section--full{width:100%}.overview__section--row{gap:var(--space-5);grid-template-columns:repeat(3,1fr);display:grid}@media (width<=1200px){.overview__section--row{grid-template-columns:repeat(2,1fr)}}@media (width<=768px){.overview{gap:var(--space-4);padding:var(--space-4)}.overview__section{gap:var(--space-3)}.overview__section--row{grid-template-columns:1fr}}@media (prefers-reduced-motion:reduce){.overview{scroll-behavior:auto}}.work-view{padding:var(--space-4)}.work-container{gap:var(--space-6);max-width:var(--content-max-width);grid-template-columns:1fr 300px;margin:0 auto;display:grid}@media (width<=1200px){.work-container{grid-template-columns:1fr}.work-sidebar{order:2}}.board-header{margin-bottom:var(--space-4);justify-content:space-between;align-items:center;display:flex}.board-header h2{font-size:var(--font-size-lg);font-weight:var(--font-weight-bold)}.add-item-button{padding:var(--space-2) var(--space-3);background:var(--color-accent);color:var(--color-text-inverse);border-radius:var(--radius-sm);font-weight:var(--font-weight-medium);cursor:pointer;transition:background-color var(--transition-normal);border:none}.add-item-button:hover{background:var(--color-accent-emphasis)}.add-item-button:disabled{opacity:.5;cursor:not-allowed}.form-container{background:var(--color-bg-subtle);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-4);margin-bottom:var(--space-4)}.tracker-form{gap:var(--space-3);flex-direction:column;display:flex}.form-group{gap:var(--space-1);flex-direction:column;display:flex}.form-group label{font-weight:var(--font-weight-medium);font-size:var(--font-size-sm);color:var(--color-text)}.form-group input,.form-group select,.form-group textarea{padding:var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-surface);color:var(--color-text);font-size:var(--font-size-sm)}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{border-color:var(--color-accent)}.form-group input:disabled,.form-group select:disabled,.form-group textarea:disabled{opacity:.6;cursor:not-allowed}.tracker-form button{padding:var(--space-2) var(--space-3);background:var(--color-accent);color:var(--color-text-inverse);border-radius:var(--radius-sm);font-weight:var(--font-weight-medium);cursor:pointer;transition:background-color var(--transition-normal);border:none}.tracker-form button:hover:not(:disabled){background:var(--color-accent-emphasis)}.tracker-form button:disabled{opacity:.5;cursor:not-allowed}.form-error{padding:var(--space-2) var(--space-3);background:var(--color-status-error-bg);color:var(--color-status-error);border-radius:var(--radius-sm);border-left:3px solid var(--color-status-error)}.form-success{padding:var(--space-2) var(--space-3);background:var(--color-status-ok-bg);color:var(--color-status-ok);border-radius:var(--radius-sm);border-left:3px solid var(--color-status-ok)}.tracker-board{gap:var(--space-4);flex-direction:column;display:flex}.lanes-container{gap:var(--space-3);grid-template-columns:repeat(4,1fr);display:grid}@media (width<=1600px){.lanes-container{grid-template-columns:repeat(2,1fr)}}@media (width<=768px){.lanes-container{grid-template-columns:1fr}}.tracker-lane{background:var(--color-bg-subtle);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);min-height:300px}.lane-header{margin-bottom:var(--space-3);font-size:var(--font-size-md);font-weight:var(--font-weight-bold);justify-content:space-between;align-items:center;display:flex}.lane-count{padding:var(--space-1) var(--space-2);background:var(--color-accent);color:var(--color-text-inverse);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);display:inline-block}.lane-badge{padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);white-space:nowrap;display:inline-block}.lane-badge--active{background:var(--color-accent);color:var(--color-text-inverse)}.lane-badge--empty{background:var(--color-bg-inset);color:var(--color-text-muted)}.lane-content{gap:var(--space-2);flex-direction:column;max-height:600px;display:flex;overflow-y:auto}.lane-empty{text-align:center;color:var(--color-text-muted);padding:var(--space-4);font-style:italic}.tracker-card{background:var(--color-surface);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);padding:var(--space-3);box-shadow:var(--shadow-sm);transition:box-shadow var(--transition-normal)}.tracker-card:hover{box-shadow:var(--shadow-md)}.tracker-card-header{justify-content:space-between;align-items:flex-start;gap:var(--space-2);margin-bottom:var(--space-2);display:flex}.tracker-card-title-row{align-items:flex-start;gap:var(--space-2);flex:1;display:flex}.priority-chip{padding:var(--space-1) var(--space-2);color:var(--color-text-inverse);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);border-radius:var(--radius-sm);white-space:nowrap;flex-shrink:0;display:inline-block}.tracker-card-title{font-size:var(--font-size-md);font-weight:var(--font-weight-medium);line-height:var(--line-height-tight);margin:0}.expand-button{padding:var(--space-1);cursor:pointer;color:var(--color-text-muted);font-size:var(--font-size-sm);background:0 0;border:none}.expand-button:hover{color:var(--color-text)}.tracker-card-tags{gap:var(--space-1);margin-bottom:var(--space-2);flex-wrap:wrap;display:flex}.tag{padding:var(--space-1) var(--space-2);background:var(--color-bg-inset);border:1px solid var(--color-border);border-radius:var(--radius-sm);font-size:var(--font-size-xs);color:var(--color-text-muted);display:inline-block}.tracker-card-details{background:var(--color-bg-inset);border-top:1px solid var(--color-border);margin:var(--space-2) 0;padding:var(--space-2) 0}.detail-section{padding:var(--space-2) 0;border-bottom:1px solid var(--color-border-subtle)}.detail-section:last-child{border-bottom:none}.detail-label{font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);color:var(--color-text-muted);text-transform:uppercase;margin-bottom:var(--space-1);display:block}.detail-section p,.detail-section time,.detail-section a,.detail-section code{font-size:var(--font-size-sm);color:var(--color-text)}.detail-section a{word-break:break-all}.pr-link-inert{padding:var(--space-1) var(--space-2);background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--font-size-xs);color:var(--color-status-error);word-break:break-all;white-space:pre-wrap;display:block}.tracker-card-actions{gap:var(--space-1);margin-top:var(--space-2);display:flex}.tracker-card-actions button{padding:var(--space-1) var(--space-2);background:var(--color-accent);color:var(--color-text-inverse);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);cursor:pointer;transition:background-color var(--transition-normal);border:none;flex:1}.tracker-card-actions button:hover:not(:disabled){background:var(--color-accent-emphasis)}.tracker-card-actions button:disabled{opacity:.5;cursor:not-allowed}.card-error{padding:var(--space-2);background:var(--color-status-error-bg);color:var(--color-status-error);border-radius:var(--radius-sm);border-left:3px solid var(--color-status-error);margin-top:var(--space-2);font-size:var(--font-size-sm)}.archived-summary{background:var(--color-bg-subtle);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);margin-top:var(--space-4)}.archived-summary h3{font-size:var(--font-size-md);font-weight:var(--font-weight-bold);margin-bottom:var(--space-2)}.archived-list{gap:var(--space-1);flex-direction:column;max-height:200px;list-style:none;display:flex;overflow-y:auto}.archived-item{gap:var(--space-2);padding:var(--space-2);background:var(--color-surface);border-radius:var(--radius-sm);font-size:var(--font-size-sm);align-items:center;display:flex}.archived-title{color:var(--color-text-muted);flex:1;text-decoration:line-through}.archived-priority{padding:var(--space-1) var(--space-2);background:var(--color-bg-inset);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);color:var(--color-text-muted)}.backlog-panel{background:var(--color-bg-subtle);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);top:calc(var(--header-height) + var(--space-3));position:sticky}.backlog-panel h3{font-size:var(--font-size-md);font-weight:var(--font-weight-bold);margin-bottom:var(--space-3)}.empty-state{color:var(--color-text-muted);text-align:center;padding:var(--space-3);font-style:italic}.backlog-tier{margin-bottom:var(--space-3)}.tier-header{margin-bottom:var(--space-2);justify-content:space-between;align-items:center;display:flex}.tier-header h4{font-size:var(--font-size-sm);font-weight:var(--font-weight-bold);margin:0}.tier-counts{font-size:var(--font-size-xs);color:var(--color-text-muted)}.tier-progress-bar{background:var(--color-bg-inset);border-radius:var(--radius-sm);height:6px;margin-bottom:var(--space-2);display:flex;overflow:hidden}.progress-segment{height:100%;transition:width var(--transition-normal);flex:none}.progress-segment.done{background:var(--color-status-ok)}.progress-segment.inflight{background:var(--color-status-warn)}.progress-segment.todo{background:var(--color-status-neutral)}.tier-items-list{gap:var(--space-1);flex-direction:column;max-height:250px;display:flex;position:relative;overflow-y:auto}.tier-items-list:after{background:linear-gradient(to bottom, transparent, var(--color-bg-subtle));pointer-events:none;height:20px;position:absolute;bottom:0;left:0;right:0}.backlog-item{gap:var(--space-2);padding:var(--space-1) var(--space-2);font-size:var(--font-size-xs);background:var(--color-surface);border-radius:var(--radius-sm);word-break:break-word;align-items:flex-start;display:flex}.item-status{font-size:var(--font-size-sm);flex-shrink:0}.item-tag{font-weight:var(--font-weight-bold);color:var(--color-accent);flex-shrink:0;min-width:fit-content}.item-title{color:var(--color-text);flex:1}._container_ohxgv_5{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg-subtle);padding:var(--space-4)}._title_ohxgv_12{margin:0 0 var(--space-4) 0;font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--color-text)}._timelineContent_ohxgv_19{gap:var(--space-4);flex-direction:column;display:flex}._row_ohxgv_25{gap:var(--space-3);grid-template-columns:160px 1fr 80px;align-items:center;display:grid}._rowLabel_ohxgv_32{gap:var(--space-1);font-size:var(--font-size-sm);flex-direction:column;display:flex;overflow:hidden}._agentId_ohxgv_40{font-family:var(--font-mono);font-weight:var(--font-weight-bold);color:var(--color-text);word-break:break-all}._agentStatus_ohxgv_47{font-size:var(--font-size-xs);color:var(--color-text-muted);text-transform:uppercase}._barContainer_ohxgv_53{background:var(--color-bg);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);height:24px;position:relative;overflow:hidden}._bar_ohxgv_53{border-radius:var(--radius-sm);height:100%;transition:width var(--transition-normal);min-width:5%;max-width:100%;padding-right:var(--space-2);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);color:var(--color-text-inverse);white-space:nowrap;justify-content:flex-end;align-items:center;display:flex;overflow:hidden}._status-ok_ohxgv_80{background:var(--color-status-ok)}._status-info_ohxgv_84{background:var(--color-status-info)}._status-warn_ohxgv_88{background:var(--color-status-warn)}._status-error_ohxgv_92{background:var(--color-status-error)}._status-neutral_ohxgv_96{background:var(--color-status-neutral)}._rowDuration_ohxgv_100{text-align:right;font-size:var(--font-size-sm);font-family:var(--font-mono);color:var(--color-text-muted);min-width:60px}._footer_ohxgv_108{margin-top:var(--space-4);padding-top:var(--space-4);border-top:1px solid var(--color-border-subtle);font-size:var(--font-size-xs);color:var(--color-text-muted)}._legend_ohxgv_116{line-height:var(--line-height-normal);display:inline-block}@media (width<=768px){._row_ohxgv_25{gap:var(--space-2);grid-template-columns:1fr}._rowLabel_ohxgv_32{gap:var(--space-2);flex-direction:row;align-items:baseline;display:flex}._barContainer_ohxgv_53{order:3;grid-column:1}._rowDuration_ohxgv_100{text-align:left;order:2}}@media (prefers-reduced-motion:reduce){._bar_ohxgv_53{transition:none}}._container_jryat_5{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg-subtle);flex-direction:column;height:100%;display:flex;overflow:hidden}._header_jryat_15{padding:var(--space-4);border-bottom:1px solid var(--color-border-subtle);background:var(--color-bg);justify-content:space-between;align-items:center;display:flex}._title_jryat_24{font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--color-text);margin:0}._toggleButton_jryat_31{padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-bg);color:var(--color-text-muted);font-size:var(--font-size-sm);cursor:pointer;transition:all var(--transition-fast)}._toggleButton_jryat_31:hover{background:var(--color-bg-inset);color:var(--color-text)}._toggleButton_jryat_31:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}._toggleButton_jryat_31[aria-pressed=true]{background:var(--color-status-ok-bg);color:var(--color-status-ok);border-color:var(--color-status-ok)}._messagesBox_jryat_58{padding:var(--space-4);gap:var(--space-3);scroll-behavior:smooth;flex-direction:column;flex:1;display:flex;overflow-y:auto}._emptyState_jryat_68{color:var(--color-text-muted);font-size:var(--font-size-sm);text-align:center;padding:var(--space-8) var(--space-4)}._message_jryat_58{padding:var(--space-3) var(--space-4);border-left:3px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-bg);font-size:var(--font-size-sm)}._role-user_jryat_84{border-left-color:var(--color-status-info);background:#0969da0a}._role-assistant_jryat_89{border-left-color:var(--color-status-ok);background:#1a7f370a}._role_jryat_84{font-weight:var(--font-weight-bold);text-transform:uppercase;font-size:var(--font-size-xs);margin-right:var(--space-2);display:inline-block}._role-user_jryat_84 ._role_jryat_84{color:var(--color-status-info)}._role-assistant_jryat_89 ._role_jryat_84{color:var(--color-status-ok)}._timestamp_jryat_110{color:var(--color-text-muted);font-size:var(--font-size-xs);font-family:var(--font-mono);margin-left:var(--space-2);display:inline-block}._text_jryat_118{margin-top:var(--space-2);color:var(--color-text);line-height:var(--line-height-normal);word-wrap:break-word;white-space:pre-wrap}._footer_jryat_126{padding:var(--space-2) var(--space-4);border-top:1px solid var(--color-border-subtle);background:var(--color-bg);text-align:right;font-size:var(--font-size-xs)}._footerTimestamp_jryat_134{color:var(--color-text-muted);font-family:var(--font-mono)}@media (prefers-reduced-motion:reduce){._messagesBox_jryat_58{scroll-behavior:auto}}._container_lfdfx_5{gap:var(--space-6);flex-direction:column;height:100%;display:flex;overflow-y:auto}._section_lfdfx_13{flex-direction:column;flex:0 auto;min-height:200px;display:flex}._section_lfdfx_13:first-child{flex:0 40%}._section_lfdfx_13:last-child{flex:60%}@media (width<=768px){._container_lfdfx_5{gap:var(--space-4)}._section_lfdfx_13:first-child{flex:0 auto;min-height:auto}._section_lfdfx_13:last-child{flex:auto;min-height:250px}}.cost-table{border-collapse:collapse;width:100%;font-size:var(--font-size-sm);background:var(--color-surface)}.cost-table caption{text-align:left;padding:var(--space-2);font-size:var(--font-size-sm);color:var(--color-text-muted);caption-side:top}.cost-table thead{background:var(--color-bg-inset);border-bottom:2px solid var(--color-border)}.cost-table th{padding:var(--space-2) var(--space-3);text-align:left;font-weight:var(--font-weight-bold);color:var(--color-text)}.cost-table th.col-numeric{text-align:right}.cost-table tbody tr{border-bottom:1px solid var(--color-border-subtle)}.cost-table tbody tr:hover{background:var(--color-bg-subtle)}.cost-table td{padding:var(--space-2) var(--space-3);text-align:left;color:var(--color-text)}.cost-table td.col-numeric{text-align:right;font-family:var(--font-mono)}.cost-table .model-name{font-weight:var(--font-weight-medium);font-family:var(--font-mono);font-size:var(--font-size-xs);word-break:break-word;max-width:180px}.cost-table .verdict-failed{color:var(--color-status-error)}.cost-table .verdict-empty{color:var(--color-status-warn)}.cost-table .verdict-hung{color:var(--color-status-error)}.cost-table .col-total{font-weight:var(--font-weight-bold)}@media (width<=768px){.cost-table{font-size:var(--font-size-xs)}.cost-table th,.cost-table td{padding:var(--space-1) var(--space-2)}.cost-table .model-name{max-width:100px}}.chart-container{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);flex-direction:column;display:flex;overflow:hidden}.chart-empty{min-height:250px;padding:var(--space-6);text-align:center;flex-direction:column;justify-content:center;align-items:center;display:flex}.chart-empty-message{margin:0 0 var(--space-2) 0;font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--color-text)}.chart-empty-hint{font-size:var(--font-size-sm);color:var(--color-text-muted);margin:0}.cost-chart-svg{max-width:100%;height:auto;display:block;overflow:visible}.chart-footer{padding:var(--space-2) var(--space-4);border-top:1px solid var(--color-border-subtle);background:var(--color-bg);text-align:right;font-size:var(--font-size-xs)}.chart-footer-timestamp{color:var(--color-text-muted);font-family:var(--font-mono)}.chart-axis{stroke:var(--color-border);stroke-width:2px}.chart-label-x,.chart-label-y{fill:var(--color-text-muted);font-size:12px;font-family:var(--font-sans)}.bar-segment{stroke:var(--color-border-subtle);stroke-width:.5px;transition:opacity var(--transition-fast);cursor:pointer}.bar-segment:hover{opacity:.8}.bar-input{fill:var(--color-status-info)}.bar-output{fill:var(--color-accent)}.chart-legend{font-size:12px}.legend-text{fill:var(--color-text-muted);font-family:var(--font-sans);font-size:12px}@media (width<=768px){.cost-chart-svg{width:100%}.chart-label-x,.chart-label-y,.legend-text{font-size:10px}}.scorecard{padding:var(--space-5);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface)}.scorecard-header{margin-bottom:var(--space-4)}.scorecard-header h3{margin:0 0 var(--space-2) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-medium);color:var(--color-text)}.scorecard-total{font-size:var(--font-size-sm);color:var(--color-text-muted)}.scorecard-tiles{gap:var(--space-3);margin-bottom:var(--space-4);grid-template-columns:repeat(auto-fit,minmax(120px,1fr));display:grid}.scorecard-tile{padding:var(--space-3);border-radius:var(--radius-md);text-align:center;border:1px solid var(--color-border);background:var(--color-bg-subtle)}.tile-label{font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);margin-bottom:var(--space-1)}.tile-percent{font-size:var(--font-size-xl);font-weight:var(--font-weight-bold);margin-bottom:var(--space-1)}.tile-count{font-size:var(--font-size-xs);color:var(--color-text-muted)}.scorecard-tile--ok{border-color:var(--color-status-ok);background:var(--color-status-ok-bg)}.scorecard-tile--ok .tile-label,.scorecard-tile--ok .tile-percent{color:var(--color-status-ok)}.scorecard-tile--error{border-color:var(--color-status-error);background:var(--color-status-error-bg)}.scorecard-tile--error .tile-label,.scorecard-tile--error .tile-percent{color:var(--color-status-error)}.scorecard-tile--warn{border-color:var(--color-status-warn);background:var(--color-status-warn-bg)}.scorecard-tile--warn .tile-label,.scorecard-tile--warn .tile-percent{color:var(--color-status-warn)}.scorecard-tile--neutral{border-color:var(--color-status-neutral)}.scorecard-tile--neutral .tile-label,.scorecard-tile--neutral .tile-percent{color:var(--color-status-neutral)}.scorecard-footer{border-top:1px solid var(--color-border-subtle);padding-top:var(--space-3)}.scorecard-footer small{color:var(--color-text-muted);font-size:var(--font-size-xs)}.view-cost{padding:var(--space-5);max-width:var(--content-max-width)}.view-cost h2{margin-top:0;margin-bottom:var(--space-5);font-size:var(--font-size-xl);color:var(--color-text)}.view-cost h3{font-size:var(--font-size-lg);color:var(--color-text);margin-top:var(--space-5);margin-bottom:var(--space-3)}.cost-callout{padding:var(--space-4);border-left:4px solid var(--color-accent);border-radius:var(--radius-md);background:var(--color-bg-subtle);margin-bottom:var(--space-5)}.cost-callout h3{margin-top:0;margin-bottom:var(--space-2);font-size:var(--font-size-md)}.cost-callout p{color:var(--color-text);font-size:var(--font-size-sm);line-height:var(--line-height-normal);margin:0}.cost-callout code{background:var(--color-bg-inset);font-family:var(--font-mono);border-radius:3px;padding:.2em .4em;font-size:.9em}.cost-callout--info{border-left-color:var(--color-status-info)}.cost-layout{gap:var(--space-5);display:grid}.cost-section{border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-4);background:var(--color-surface)}.cost-section h3{margin-top:0;margin-bottom:var(--space-3)}@media (width<=768px){.view-cost{padding:var(--space-3)}.cost-layout{gap:var(--space-4)}.cost-section{padding:var(--space-3)}}:root{--color-bg:#fff;--color-bg-subtle:#f6f8fa;--color-bg-inset:#eff2f5;--color-surface:#fff;--color-border:#d0d7de;--color-border-subtle:#e4e8ec;--color-text:#1f2328;--color-text-muted:#59636e;--color-text-inverse:#fff;--color-accent:#0969da;--color-accent-emphasis:#0550ae;--color-status-ok:#1a7f37;--color-status-warn:#9a6700;--color-status-error:#cf222e;--color-status-info:#0969da;--color-status-neutral:#59636e;--color-status-ok-bg:#dafbe1;--color-status-warn-bg:#fff8c5;--color-status-error-bg:#ffebe9;--color-status-info-bg:#ddf4ff;--color-focus-ring:#0969da;--space-1:.25rem;--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-5:1.5rem;--space-6:2rem;--space-7:3rem;--font-sans:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono:ui-monospace, SFMono-Regular, "Cascadia Mono", Consolas, "Liberation Mono", Menlo, monospace;--font-size-xs:.75rem;--font-size-sm:.875rem;--font-size-md:1rem;--font-size-lg:1.125rem;--font-size-xl:1.375rem;--line-height-tight:1.25;--line-height-normal:1.5;--font-weight-normal:400;--font-weight-medium:500;--font-weight-bold:600;--radius-sm:4px;--radius-md:6px;--radius-lg:10px;--shadow-sm:0 1px 2px #1f232814;--shadow-md:0 3px 8px #1f23281f;--header-height:3rem;--content-max-width:90rem;--transition-fast:.12s ease;--transition-normal:.2s ease;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}.text-status-ok{color:var(--color-status-ok)}.text-status-warn{color:var(--color-status-warn)}.text-status-error{color:var(--color-status-error)}.text-status-info{color:var(--color-status-info)}.text-status-neutral{color:var(--color-status-neutral)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--color-bg:#0d1117;--color-bg-subtle:#161b22;--color-bg-inset:#010409;--color-surface:#161b22;--color-border:#30363d;--color-border-subtle:#21262d;--color-text:#e6edf3;--color-text-muted:#9198a1;--color-text-inverse:#0d1117;--color-accent:#4493f8;--color-accent-emphasis:#79b8ff;--color-status-ok:#3fb950;--color-status-warn:#d29922;--color-status-error:#f85149;--color-status-info:#58a6ff;--color-status-neutral:#9198a1;--color-status-ok-bg:#12261e;--color-status-warn-bg:#272115;--color-status-error-bg:#2d1517;--color-status-info-bg:#121d2f;--color-focus-ring:#58a6ff;--shadow-sm:0 1px 2px #01040999;--shadow-md:0 3px 8px #010409b3;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}:root[data-theme=dark]{--color-bg:#0d1117;--color-bg-subtle:#161b22;--color-bg-inset:#010409;--color-surface:#161b22;--color-border:#30363d;--color-border-subtle:#21262d;--color-text:#e6edf3;--color-text-muted:#9198a1;--color-text-inverse:#0d1117;--color-accent:#4493f8;--color-accent-emphasis:#79b8ff;--color-status-ok:#3fb950;--color-status-warn:#d29922;--color-status-error:#f85149;--color-status-info:#58a6ff;--color-status-neutral:#9198a1;--color-status-ok-bg:#12261e;--color-status-warn-bg:#272115;--color-status-error-bg:#2d1517;--color-status-info-bg:#121d2f;--color-focus-ring:#58a6ff;--shadow-sm:0 1px 2px #01040999;--shadow-md:0 3px 8px #010409b3;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html{-webkit-text-size-adjust:100%}body{font-family:var(--font-sans);font-size:var(--font-size-md);line-height:var(--line-height-normal);color:var(--color-text);background:var(--color-bg)}img,svg{max-width:100%;display:block}button,input,select,textarea{font:inherit;color:inherit}a{color:var(--color-accent)}:focus{outline:none}:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px;border-radius:var(--radius-sm)}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.app-header{z-index:100;align-items:center;gap:var(--space-3);min-height:var(--header-height);padding:0 var(--space-4);background:var(--color-bg-subtle);border-bottom:1px solid var(--color-border);display:flex;position:sticky;top:0}.app-title{font-size:var(--font-size-md);font-weight:var(--font-weight-bold);white-space:nowrap}.app-nav{gap:var(--space-1);display:flex}.app-nav a{padding:var(--space-2) var(--space-3);color:var(--color-text-muted);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);border-bottom:2px solid #0000;text-decoration:none;display:inline-block}.app-nav a[aria-current=page]{color:var(--color-text);border-bottom-color:var(--color-accent)}.app-nav a:hover{color:var(--color-text)}.app-main{max-width:var(--content-max-width);padding:var(--space-4);margin:0 auto}.view-placeholder{padding:var(--space-6);border:1px dashed var(--color-border);border-radius:var(--radius-md);color:var(--color-text-muted);text-align:center}.theme-toggle{padding:var(--space-1) var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-sm);cursor:pointer;font-size:var(--font-size-sm);color:var(--color-text-muted);background:0 0;margin-left:auto}.theme-toggle:hover{color:var(--color-text);background:var(--color-bg-inset)}.sse-status{font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);white-space:nowrap}.sse-status[data-status=live]{color:var(--color-status-ok);background:var(--color-status-ok-bg)}.sse-status[data-status=reconnecting]{color:var(--color-status-warn);background:var(--color-status-warn-bg)}.sse-status[data-status=error]{color:var(--color-status-error);background:var(--color-status-error-bg)}
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Aesop Fleet Dashboard</title>
7
+ <script>window.__AESOP_CSRF_TOKEN__ = __AESOP_CSRF_SENTINEL__;</script>
8
+ <script type="module" crossorigin src="/assets/index-2LZDQirC.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-D4M1qyOv.css">
10
+ </head>
11
+ <body>
12
+ <div id="root"></div>
13
+ </body>
14
+ </html>
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Aesop Fleet Dashboard</title>
7
+ <script>window.__AESOP_CSRF_TOKEN__ = __AESOP_CSRF_SENTINEL__;</script>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.tsx"></script>
12
+ </body>
13
+ </html>