@ashlr/hub 3.7.0 → 3.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/CHANGELOG.md +257 -0
  2. package/dist/build-identity.json +2 -2
  3. package/dist/cli/resource-profile.js +95 -21
  4. package/dist/cli/resource-profile.js.map +1 -1
  5. package/dist/core/policy/local-only.d.ts +142 -2
  6. package/dist/core/policy/local-only.js +204 -15
  7. package/dist/core/policy/local-only.js.map +1 -1
  8. package/dist/core/resources/native-profile.d.ts +56 -0
  9. package/dist/core/resources/native-profile.js +368 -6
  10. package/dist/core/resources/native-profile.js.map +1 -1
  11. package/dist/core/run/budget.d.ts +22 -8
  12. package/dist/core/run/budget.js +80 -12
  13. package/dist/core/run/budget.js.map +1 -1
  14. package/dist/core/run/model-catalog.js +8 -1
  15. package/dist/core/run/model-catalog.js.map +1 -1
  16. package/dist/core/run/sandboxed-engine.js +3 -3
  17. package/dist/core/run/sandboxed-engine.js.map +1 -1
  18. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  19. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +69 -10
  20. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +68 -9
  21. package/dist/core/verse/adapters/claude.d.ts +49 -2
  22. package/dist/core/verse/adapters/claude.js +317 -56
  23. package/dist/core/verse/adapters/claude.js.map +1 -1
  24. package/dist/core/verse/adapters/codex.d.ts +81 -5
  25. package/dist/core/verse/adapters/codex.js +409 -47
  26. package/dist/core/verse/adapters/codex.js.map +1 -1
  27. package/dist/core/verse/adapters/grok.d.ts +13 -1
  28. package/dist/core/verse/adapters/grok.js +28 -2
  29. package/dist/core/verse/adapters/grok.js.map +1 -1
  30. package/dist/core/verse/adapters/index.d.ts +32 -0
  31. package/dist/core/verse/adapters/index.js +2 -0
  32. package/dist/core/verse/adapters/index.js.map +1 -1
  33. package/dist/core/verse/codex-rollout.d.ts +284 -0
  34. package/dist/core/verse/codex-rollout.js +786 -0
  35. package/dist/core/verse/codex-rollout.js.map +1 -0
  36. package/dist/core/verse/context-fit.d.ts +63 -0
  37. package/dist/core/verse/context-fit.js +355 -0
  38. package/dist/core/verse/context-fit.js.map +1 -0
  39. package/dist/core/verse/context-math.d.ts +215 -0
  40. package/dist/core/verse/context-math.js +365 -0
  41. package/dist/core/verse/context-math.js.map +1 -0
  42. package/dist/core/verse/local-models.d.ts +137 -1
  43. package/dist/core/verse/local-models.js +209 -5
  44. package/dist/core/verse/local-models.js.map +1 -1
  45. package/dist/core/verse/model-windows.d.ts +217 -0
  46. package/dist/core/verse/model-windows.js +616 -0
  47. package/dist/core/verse/model-windows.js.map +1 -0
  48. package/dist/core/verse/preferences.d.ts +123 -0
  49. package/dist/core/verse/preferences.js +403 -0
  50. package/dist/core/verse/preferences.js.map +1 -0
  51. package/dist/core/verse/project-memory.d.ts +112 -0
  52. package/dist/core/verse/project-memory.js +295 -0
  53. package/dist/core/verse/project-memory.js.map +1 -0
  54. package/dist/core/verse/seats.d.ts +106 -4
  55. package/dist/core/verse/seats.js +291 -89
  56. package/dist/core/verse/seats.js.map +1 -1
  57. package/dist/core/verse/session-engine.d.ts +117 -2
  58. package/dist/core/verse/session-engine.js +763 -65
  59. package/dist/core/verse/session-engine.js.map +1 -1
  60. package/dist/core/verse/session-handoff.d.ts +94 -0
  61. package/dist/core/verse/session-handoff.js +551 -0
  62. package/dist/core/verse/session-handoff.js.map +1 -0
  63. package/dist/core/verse/session-search.d.ts +63 -0
  64. package/dist/core/verse/session-search.js +213 -0
  65. package/dist/core/verse/session-search.js.map +1 -0
  66. package/dist/core/verse/session-store.d.ts +16 -2
  67. package/dist/core/verse/session-store.js +80 -6
  68. package/dist/core/verse/session-store.js.map +1 -1
  69. package/dist/core/verse/types.d.ts +333 -1
  70. package/dist/core/verse/types.js +54 -2
  71. package/dist/core/verse/types.js.map +1 -1
  72. package/dist/core/verse/verse-api.d.ts +40 -5
  73. package/dist/core/verse/verse-api.js +724 -25
  74. package/dist/core/verse/verse-api.js.map +1 -1
  75. package/dist/core/web/api.d.ts +14 -4
  76. package/dist/core/web/api.js +26 -11
  77. package/dist/core/web/api.js.map +1 -1
  78. package/dist/core/web/public/next/assets/{App-vtaHB9mp.js → App-XURmiAAp.js} +5 -5
  79. package/dist/core/web/public/next/assets/{App-vtaHB9mp.js.map → App-XURmiAAp.js.map} +1 -1
  80. package/dist/core/web/public/next/assets/{ApprovalsSection-B-bFJ0I9.js → ApprovalsSection-BriUzoZc.js} +2 -2
  81. package/dist/core/web/public/next/assets/{ApprovalsSection-B-bFJ0I9.js.map → ApprovalsSection-BriUzoZc.js.map} +1 -1
  82. package/dist/core/web/public/next/assets/AutonomySection-C4GBsQVc.js +2 -0
  83. package/dist/core/web/public/next/assets/{AutonomySection-DoqmsCjw.js.map → AutonomySection-C4GBsQVc.js.map} +1 -1
  84. package/dist/core/web/public/next/assets/ChatSection-BpOBOUvg.css +1 -0
  85. package/dist/core/web/public/next/assets/ChatSection-hlgPBRco.js +84 -0
  86. package/dist/core/web/public/next/assets/ChatSection-hlgPBRco.js.map +1 -0
  87. package/dist/core/web/public/next/assets/ConfirmDialog-BdQYI-Ng.js +2 -0
  88. package/dist/core/web/public/next/assets/ConfirmDialog-BdQYI-Ng.js.map +1 -0
  89. package/dist/core/web/public/next/assets/{Dialog-CPM9JxBc.js → Dialog-BxdIfmFH.js} +2 -2
  90. package/dist/core/web/public/next/assets/{Dialog-CPM9JxBc.js.map → Dialog-BxdIfmFH.js.map} +1 -1
  91. package/dist/core/web/public/next/assets/{DiffViewer-B84qVef9.js → DiffViewer-DmeRWuc4.js} +2 -2
  92. package/dist/core/web/public/next/assets/{DiffViewer-B84qVef9.js.map → DiffViewer-DmeRWuc4.js.map} +1 -1
  93. package/dist/core/web/public/next/assets/{McpSection-CEUpV_5X.js → McpSection-q34T7Tho.js} +2 -2
  94. package/dist/core/web/public/next/assets/{McpSection-CEUpV_5X.js.map → McpSection-q34T7Tho.js.map} +1 -1
  95. package/dist/core/web/public/next/assets/{MutationTokenDialog-DA8t97XT.js → MutationTokenDialog-CFAkwOEt.js} +2 -2
  96. package/dist/core/web/public/next/assets/{MutationTokenDialog-DA8t97XT.js.map → MutationTokenDialog-CFAkwOEt.js.map} +1 -1
  97. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-Bq7Vyud0.js → ResourcePoolConsoleApp-DHc8GFOY.js} +4 -4
  98. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-Bq7Vyud0.js.map → ResourcePoolConsoleApp-DHc8GFOY.js.map} +1 -1
  99. package/dist/core/web/public/next/assets/{RouteErrorBoundary-Badio_uO.js → RouteErrorBoundary-ZL9F4qUn.js} +2 -2
  100. package/dist/core/web/public/next/assets/{RouteErrorBoundary-Badio_uO.js.map → RouteErrorBoundary-ZL9F4qUn.js.map} +1 -1
  101. package/dist/core/web/public/next/assets/{Meter-CLcr-4wS.css → Segmented-8cf0Fypn.css} +1 -1
  102. package/dist/core/web/public/next/assets/{Meter--h3MmZS-.js → Segmented-DbRjVye3.js} +2 -2
  103. package/dist/core/web/public/next/assets/Segmented-DbRjVye3.js.map +1 -0
  104. package/dist/core/web/public/next/assets/SettingsSection-nJGGGYqv.js +2 -0
  105. package/dist/core/web/public/next/assets/{SettingsSection-BwrpQlpP.js.map → SettingsSection-nJGGGYqv.js.map} +1 -1
  106. package/dist/core/web/public/next/assets/UniverseConsoleApp-6GJydgo4.js +2 -0
  107. package/dist/core/web/public/next/assets/{UniverseConsoleApp-_FSohAdN.js.map → UniverseConsoleApp-6GJydgo4.js.map} +1 -1
  108. package/dist/core/web/public/next/assets/{UniverseView-DqcXbed4.js → UniverseView-DLDtNYL8.js} +2 -2
  109. package/dist/core/web/public/next/assets/{UniverseView-DqcXbed4.js.map → UniverseView-DLDtNYL8.js.map} +1 -1
  110. package/dist/core/web/public/next/assets/UsageSection-Cf9d9iFH.js +2 -0
  111. package/dist/core/web/public/next/assets/UsageSection-Cf9d9iFH.js.map +1 -0
  112. package/dist/core/web/public/next/assets/VerseConsoleApp-DsdKQoTH.css +1 -0
  113. package/dist/core/web/public/next/assets/VerseConsoleApp-y0uOHixd.js +3 -0
  114. package/dist/core/web/public/next/assets/VerseConsoleApp-y0uOHixd.js.map +1 -0
  115. package/dist/core/web/public/next/assets/{charts-CTZJ-JrH.js → charts-CVooqJWN.js} +2 -2
  116. package/dist/core/web/public/next/assets/{charts-CTZJ-JrH.js.map → charts-CVooqJWN.js.map} +1 -1
  117. package/dist/core/web/public/next/assets/context-model-Bqv8DVuH.js +2 -0
  118. package/dist/core/web/public/next/assets/context-model-Bqv8DVuH.js.map +1 -0
  119. package/dist/core/web/public/next/assets/global-eaY9GyX3.js +2 -0
  120. package/dist/core/web/public/next/assets/global-eaY9GyX3.js.map +1 -0
  121. package/dist/core/web/public/next/assets/{icons-D9vlf85u.js → icons-vex8rclC.js} +2 -2
  122. package/dist/core/web/public/next/assets/{icons-D9vlf85u.js.map → icons-vex8rclC.js.map} +1 -1
  123. package/dist/core/web/public/next/assets/{index-CZamKRUg.js → index-D2Eik-zt.js} +3 -3
  124. package/dist/core/web/public/next/assets/{index-CZamKRUg.js.map → index-D2Eik-zt.js.map} +1 -1
  125. package/dist/core/web/public/next/assets/{queries-B8eBnFox.js → queries-bAYU0VNy.js} +2 -2
  126. package/dist/core/web/public/next/assets/{queries-B8eBnFox.js.map → queries-bAYU0VNy.js.map} +1 -1
  127. package/dist/core/web/public/next/assets/use-guarded-action-C7QrP7Yp.js +2 -0
  128. package/dist/core/web/public/next/assets/{use-guarded-action-bzrVVAYq.js.map → use-guarded-action-C7QrP7Yp.js.map} +1 -1
  129. package/dist/core/web/public/next/assets/verse-model-TfDk9cky.js +2 -0
  130. package/dist/core/web/public/next/assets/verse-model-TfDk9cky.js.map +1 -0
  131. package/dist/core/web/public/next/assets/{workspace-model-v0a1gl-C.js → workspace-model-CHol5RVp.js} +2 -2
  132. package/dist/core/web/public/next/assets/{workspace-model-v0a1gl-C.js.map → workspace-model-CHol5RVp.js.map} +1 -1
  133. package/dist/core/web/public/next/index.html +1 -1
  134. package/dist/release-dependency-inventory.json +1 -1
  135. package/docs/README.md +1 -0
  136. package/package.json +1 -1
  137. package/dist/core/web/public/next/assets/AutonomySection-DoqmsCjw.js +0 -2
  138. package/dist/core/web/public/next/assets/ChatSection-BfnLe5dT.css +0 -1
  139. package/dist/core/web/public/next/assets/ChatSection-vNPIJffd.js +0 -80
  140. package/dist/core/web/public/next/assets/ChatSection-vNPIJffd.js.map +0 -1
  141. package/dist/core/web/public/next/assets/ConfirmDialog-Dd2APQhB.js +0 -2
  142. package/dist/core/web/public/next/assets/ConfirmDialog-Dd2APQhB.js.map +0 -1
  143. package/dist/core/web/public/next/assets/Meter--h3MmZS-.js.map +0 -1
  144. package/dist/core/web/public/next/assets/SettingsSection-BwrpQlpP.js +0 -2
  145. package/dist/core/web/public/next/assets/UniverseConsoleApp-_FSohAdN.js +0 -2
  146. package/dist/core/web/public/next/assets/UsageSection-Bq6Daaby.js +0 -2
  147. package/dist/core/web/public/next/assets/UsageSection-Bq6Daaby.js.map +0 -1
  148. package/dist/core/web/public/next/assets/VerseConsoleApp-CMkCizvL.css +0 -1
  149. package/dist/core/web/public/next/assets/VerseConsoleApp-CsIQv9id.js +0 -3
  150. package/dist/core/web/public/next/assets/VerseConsoleApp-CsIQv9id.js.map +0 -1
  151. package/dist/core/web/public/next/assets/global-D6bTxIRn.js +0 -2
  152. package/dist/core/web/public/next/assets/global-D6bTxIRn.js.map +0 -1
  153. package/dist/core/web/public/next/assets/use-guarded-action-bzrVVAYq.js +0 -2
  154. package/dist/core/web/public/next/assets/verse-model-CvtK6vP6.js +0 -2
  155. package/dist/core/web/public/next/assets/verse-model-CvtK6vP6.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AutonomySection-DoqmsCjw.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/autonomy/control-types.ts","../../../../../../src/web-ui/routes/verse/autonomy/autonomy.module.css","../../../../../../src/web-ui/routes/verse/autonomy/ActivityPanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/caps-spec.ts","../../../../../../src/web-ui/routes/verse/autonomy/CapsPanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/use-ticker.ts","../../../../../../src/web-ui/routes/verse/autonomy/StatusHeader.tsx","../../../../../../src/web-ui/routes/verse/autonomy/DaemonControls.tsx","../../../../../../src/web-ui/routes/verse/autonomy/FleetPanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/GoalsBacklogPanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/fleet-queries.ts","../../../../../../src/web-ui/routes/verse/autonomy/LocalOnlyPanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/LocalRuntimePanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/overnight-model.ts","../../../../../../src/web-ui/routes/verse/autonomy/overnight-queries.ts","../../../../../../src/web-ui/routes/verse/autonomy/overnight.module.css","../../../../../../src/web-ui/routes/verse/autonomy/OvernightPanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/SafetyPanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/ScopePanel.tsx","../../../../../../src/web-ui/routes/verse/sections/AutonomySection.module.css","../../../../../../src/web-ui/routes/verse/sections/AutonomySection.tsx"],"sourcesContent":["/**\n * routes/verse/autonomy/control-types.ts\n *\n * The V2 control-plane shapes, re-exported from the ONE declaration site:\n * `src/core/verse/control-types.ts` (owner B), by way of\n * `src/web-ui/data/api-types.ts`. This file used to hold a local\n * transcription of the contract prose because the backend module did not\n * exist yet; that block is gone and the cockpit is now typed by the same\n * declarations the routes serialize.\n *\n * Reconciliation notes — where the transcription had guessed wrong, and what\n * the real server sends:\n * - `VerseControlSnapshot.enrollment` → `.scope: VerseScope` (`.scope.repos`)\n * - `VerseControlSnapshot.todaySpendUsd` → `.spend: VerseSpend` (`.spend.todayUsd`)\n * - `VerseControlSnapshot.engines` → `.quota: FrontierEngineUsage[]`, whose\n * rows carry `callsToday`/`limit`/`limitWindow`, not `dispatchesRecent`\n * plus a precomputed `quota` word. `engineQuotaStanding()` below derives\n * that word on the client, so the UI copy is unchanged.\n * - `VerseCapsUpdateResult.applied` is `VerseCapKey[]` (which caps changed),\n * not the whole `VerseCaps`; the new caps come back on `.caps`.\n * - `maxConcurrent` and each `concurrency.*` are `number | null` — null\n * means \"not configured\", which is an honest state, not a zero.\n *\n * The local alias names the cockpit already used (`VerseCapsPatch`,\n * `VerseCapsApplyResult`, `VerseScopePatch`, `VerseAuditPage`) are kept as\n * aliases of the real types so call sites read the same.\n */\nimport type { FrontierEngineUsage } from '../../../../core/usage/frontier-usage.js';\nimport type { VerseFoundryLimit } from '../../../data/api-types.js';\n\nexport type {\n AuditEntry,\n VerseAuditResponse,\n VerseAuditResult,\n VerseCapKey,\n VerseCaps,\n VerseCapsConcurrency,\n VerseCapsUpdate,\n VerseCapsUpdateResult,\n VerseControlError,\n VerseControlErrorCode,\n VerseControlSnapshot,\n VerseDaemonAction,\n VerseDaemonActionResult,\n VerseDaemonStateProjection,\n VerseFleetEssentials,\n VerseFoundryLimit,\n VerseKillSwitch,\n VerseSafetyReport,\n VerseScope,\n VerseScopeAction,\n VerseScopeRepo,\n VerseScopeRequest,\n VerseScopeResult,\n VerseSpend,\n} from '../../../data/api-types.js';\nexport type { PublicDaemonObservation } from '../../../data/api-types.js';\nexport type { DaemonDispatchTrace, DaemonTick } from '../../../../core/types.js';\nexport type { FrontierEngineUsage };\n\n/**\n * Runtime constants from the same backend module. `control-types.ts` has only\n * type-only imports, so pulling these values into the bundle costs nothing and\n * removes the last place the client could disagree with the server about a\n * bound or the kill switch's wording.\n */\nexport {\n VERSE_AUDIT_MAX_LIMIT,\n VERSE_CAPS_BOUNDS,\n VERSE_DAEMON_PAUSE_NOTE,\n VERSE_KILL_SWITCH_NOTE,\n} from '../../../../core/verse/control-types.js';\n\n/**\n * The DAEMON-SCOPED pause (V2.1), taken straight from the backend contract\n * rather than through `data/api-types.ts`.\n *\n * Every other shape here routes through that barrel, and this one should join\n * it when the barrel is next edited. It is imported directly for now because\n * `api-types.ts` is being changed by another surface in the same build, and a\n * type-only re-export is the one place where the short path costs nothing:\n * it is the same declaration either way, and `VERSE_CAPS_BOUNDS` above already\n * reaches for the core module by this exact path.\n */\nexport type { VerseDaemonPause } from '../../../../core/verse/control-types.js';\n\nimport type {\n VerseAuditResponse,\n VerseAuditResult,\n VerseCapsUpdate,\n VerseCapsUpdateResult,\n VerseScopeRequest,\n} from '../../../data/api-types.js';\n\n/** Partial update body for `POST /api/verse/caps`. */\nexport type VerseCapsPatch = VerseCapsUpdate;\n/** `{ok, applied, live: true, caps}` — the \"takes effect live\" receipt. */\nexport type VerseCapsApplyResult = VerseCapsUpdateResult;\n/** `POST /api/verse/scope` body. */\nexport type VerseScopePatch = VerseScopeRequest;\n/** `GET /api/verse/audit` — one page of the audit trail. */\nexport type VerseAuditPage = VerseAuditResponse;\n\n/** Client-side filter state for `GET /api/verse/audit`. */\nexport interface VerseAuditFilters {\n limit?: number;\n action?: string;\n result?: VerseAuditResult;\n}\n\n/** How a quota row stands against its configured limit, as a single word. */\nexport type VerseQuotaStanding = 'ok' | 'warn' | 'over' | 'unlimited';\n\n/**\n * Derive the standing word from a real `FrontierEngineUsage` row.\n *\n * The server does not precompute this (the transcription assumed it did), and\n * it is a pure function of two numbers, so it belongs on the client rather\n * than in a new response field. No limit configured is `unlimited` — which\n * the UI must render as \"no limit configured\", never as headroom.\n */\nexport function engineQuotaStanding(row: FrontierEngineUsage): VerseQuotaStanding {\n const limit = row.limit;\n if (typeof limit !== 'number' || !Number.isFinite(limit) || limit <= 0) return 'unlimited';\n const used = typeof row.callsToday === 'number' && Number.isFinite(row.callsToday) ? row.callsToday : 0;\n if (used >= limit) return 'over';\n if (used >= limit * 0.8) return 'warn';\n return 'ok';\n}\n\n/** The configured foundry limit matching a quota row, when there is one. */\nexport function limitForEngine(\n engine: string,\n limits: readonly VerseFoundryLimit[] | undefined,\n): VerseFoundryLimit | null {\n return limits?.find((l) => l.engine === engine) ?? null;\n}\n","/**\n * routes/verse/autonomy/autonomy.module.css — one stylesheet for the whole\n * cockpit so the panels cannot drift apart.\n *\n * Design language (docs/VERSE-DESIGN-V2.md): monochrome, hairlines instead of\n * cards, no shadows outside true overlays, tight radii, Space Grotesk on every\n * numeral and micro-label, colour only where it carries meaning. Row heights\n * and padding derive from --density-row/--density-pad; both carry a fallback\n * so this renders correctly before owner A's token pass lands.\n */\n\n.panel { border-top: 1px solid var(--border-subtle); padding-block: var(--space-6); }\n.panel:first-of-type { border-top: 0; padding-top: var(--space-4); }\n\n.panelHead { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-3); margin-bottom: var(--space-4); }\n.panelTitle {\n font-family: var(--font-display);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n.panelHeadSpaced { margin-top: var(--space-6); }\n.panelNote { font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-tertiary); }\n.panelActions { display: flex; align-items: center; gap: var(--space-2); }\n\n/* --- status header ------------------------------------------------------ */\n.status { display: flex; flex-direction: column; gap: var(--space-4); }\n.statusTop { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-3) var(--space-5); }\n.runState { display: inline-flex; align-items: center; gap: var(--space-2); font-family: var(--font-display); font-size: var(--text-xl-size); line-height: var(--text-xl-line); font-weight: var(--font-weight-semibold); letter-spacing: var(--tracking-display, -0.02em); }\n.runDot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--status-neutral-solid); flex-shrink: 0; }\n.runState[data-state=\"running\"] .runDot { background: var(--status-running-solid); }\n.runState[data-state=\"stopped\"] .runDot { background: var(--status-neutral-solid); }\n.runState[data-state=\"unknown\"] .runDot { background: var(--status-unknown-solid); }\n.runState[data-state=\"killed\"] .runDot { background: var(--status-danger-solid); }\n\n.facts { display: flex; flex-wrap: wrap; gap: var(--space-3) var(--space-5); }\n.fact { display: flex; flex-direction: column; gap: 2px; min-width: 0; }\n.factLabel { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); }\n.factValue { font-family: var(--font-display); font-size: var(--text-sm-size); line-height: var(--text-sm-line); color: var(--text-primary); white-space: nowrap; }\n.factValue[data-tone=\"warning\"] { color: var(--status-warning-fg); }\n.factValue[data-tone=\"danger\"] { color: var(--status-danger-fg); }\n.factValue[data-tone=\"success\"] { color: var(--status-success-fg); }\n.factValue[data-tone=\"unknown\"] { color: var(--status-unknown-fg); }\n\n/* Budget: one line, never a labelled progress bar. */\n.budget { display: flex; flex-direction: column; gap: var(--space-2); }\n.budgetLine { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: var(--space-2); }\n.budgetLabel { font-family: var(--font-display); font-size: var(--text-sm-size); color: var(--text-primary); }\n.budgetNote { font-size: var(--text-xs-size); color: var(--text-tertiary); }\n.meter { --meter-color: var(--accent-500); height: 2px; background: var(--meter-track); overflow: hidden; }\n.meter[data-state=\"warn\"] { --meter-color: var(--status-warning-solid); }\n.meter[data-state=\"over\"] { --meter-color: var(--status-danger-solid); }\n.meter[data-state=\"stopped\"] { --meter-color: var(--status-danger-solid); }\n.meter[data-state=\"unknown\"] { --meter-color: var(--status-unknown-solid); }\n.meterFill { height: 100%; background: var(--meter-color); transition: width var(--duration-base) var(--ease-decelerate); }\n\n/* --- controls ----------------------------------------------------------- */\n.controls { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); }\n.button {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-surface);\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n}\n.button:hover:not(:disabled) { background: var(--bg-hover); border-color: var(--border-strong); }\n.button:disabled { color: var(--text-disabled); cursor: not-allowed; }\n.buttonPrimary { border-color: var(--accent-500); color: var(--accent-600); }\n.buttonPrimary:hover:not(:disabled) { background: var(--bg-selected); }\n\n/* The emergency stop is separated by a rule, not by colour alone. */\n.emergency { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-3); margin-top: var(--space-4); padding-top: var(--space-4); border-top: 1px solid var(--border-default); }\n.emergencyButton {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-4);\n border: 1px solid var(--status-danger-solid);\n border-radius: var(--radius-sm);\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n cursor: pointer;\n}\n/* Hover keeps the RESTING pair. `--accent-contrast` on `--status-danger-solid`\n measures 3.97:1 in light (#ffffff on #e5473a) — below the 4.5:1 floor, on\n the label of the most destructive control in the app, at the exact moment\n the operator is reading it to confirm what they are about to do. It also\n borrowed the accent system's foreground token for a danger ground, coupling\n this button to a colour the operator can re-hue in Settings. The hover cue\n is achromatic instead: the hairline thickens its contrast. */\n.emergencyButton:hover:not(:disabled) { border-color: var(--status-danger-fg); background: var(--status-danger-bg); }\n.emergencyButton:disabled { border-color: var(--border-default); background: var(--bg-surface); color: var(--text-disabled); cursor: not-allowed; }\n.emergencyNote { flex: 1; min-width: 220px; font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); }\n\n/* --- caps --------------------------------------------------------------- */\n.capGrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--space-4) var(--space-5); }\n.cap { display: flex; flex-direction: column; gap: var(--space-1); min-width: 0; }\n.capLabel { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); }\n.capRow { display: flex; align-items: center; gap: var(--space-2); }\n.capInput {\n flex: 1;\n min-width: 0;\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n}\n.capInput:focus-visible { border-color: var(--border-focus); }\n.capInput:disabled { color: var(--text-disabled); background: var(--bg-canvas); cursor: not-allowed; }\n.capInputInvalid { border-color: var(--status-danger-solid); }\n.capUnit { font-size: var(--text-xs-size); color: var(--text-tertiary); white-space: nowrap; }\n.capHelp { font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-tertiary); }\n.capUsage { font-family: var(--font-display); font-size: var(--text-xs-size); color: var(--text-secondary); }\n.capError { font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--status-danger-fg); }\n/* The server's own sentence about what the last action did. Not an error, not\n a success toast — a statement of fact, so it reads as body copy. */\n.actionNote { margin-top: var(--space-3); font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); }\n.capApplied { display: inline-flex; align-items: center; gap: var(--space-1); font-size: var(--text-xs-size); color: var(--status-success-fg); }\n.capApplied::before { content: \"✓\"; }\n\n/* --- scope -------------------------------------------------------------- */\n.repoList { display: flex; flex-direction: column; }\n.repoRow { display: flex; align-items: center; gap: var(--space-3); min-height: var(--density-row, 32px); padding: var(--space-1) 0; border-bottom: 1px solid var(--border-subtle); }\n.repoName { font-family: var(--font-display); font-size: var(--text-sm-size); color: var(--text-primary); white-space: nowrap; }\n.repoPath { flex: 1; min-width: 0; font-family: var(--font-mono); font-size: var(--text-xs-size); color: var(--text-tertiary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; direction: rtl; text-align: left; }\n.repoMissing { display: inline-flex; align-items: center; gap: var(--space-1); font-size: var(--text-xs-size); color: var(--status-warning-fg); white-space: nowrap; }\n.addRow { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-4); }\n.addInput {\n flex: 1;\n min-width: 240px;\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n.addInput:focus-visible { border-color: var(--border-focus); }\n\n/* --- dense tables (audit, ticks, dispatches) ---------------------------- */\n.tableScroll { max-height: 520px; overflow: auto; border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); scrollbar-gutter: stable; }\n.table { width: 100%; border-collapse: collapse; font-size: var(--text-xs-size); line-height: var(--text-xs-line); }\n.table th {\n font-family: var(--font-display);\n position: sticky;\n top: 0;\n z-index: var(--z-sticky);\n padding: var(--space-2) var(--space-3);\n background: var(--bg-surface);\n border-bottom: 1px solid var(--border-default);\n text-align: left;\n font-size: var(--text-2xs-size, 11px);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-semibold);\n color: var(--text-tertiary);\n white-space: nowrap;\n}\n.table td { padding: var(--space-1) var(--space-3); border-bottom: 1px solid var(--border-subtle); vertical-align: top; }\n.table tbody tr:hover { background: var(--bg-hover); }\n.cellAction { font-family: var(--font-mono); color: var(--text-primary); white-space: nowrap; }\n.cellTime { font-family: var(--font-display); color: var(--text-tertiary); white-space: nowrap; }\n.cellSummary { color: var(--text-secondary); }\n.cellRepo { font-family: var(--font-mono); color: var(--text-tertiary); white-space: nowrap; }\n/* --text-tertiary is a direct declaration on a CHILD, so the parent's\n :hover/[aria-current] colour change does not reach it — only the ground\n under it moves. Measured on --bg-selected it is 3.95:1 in light and 4.40:1\n in dark, both under the 4.5:1 floor in DESIGN-V2 §6; --text-secondary is\n 6.32:1 on the worst of them. design/tokens-contrast.test.ts now pins the\n token pair so the gap cannot reopen. */\n.table tbody tr:hover .cellTime,\n.table tbody tr:hover .cellRepo { color: var(--text-secondary); }\n.resultTag { display: inline-flex; align-items: center; gap: var(--space-1); font-family: var(--font-display); white-space: nowrap; }\n.resultTag::before { content: \"•\"; }\n.resultTag[data-result=\"ok\"] { color: var(--status-success-fg); }\n.resultTag[data-result=\"refused\"] { color: var(--status-warning-fg); }\n.resultTag[data-result=\"error\"] { color: var(--status-danger-fg); }\n.resultTag[data-result=\"ok\"]::before { content: \"✓\"; }\n.resultTag[data-result=\"refused\"]::before { content: \"⊘\"; }\n.resultTag[data-result=\"error\"]::before { content: \"✕\"; }\n\n.filters { display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--space-3); margin-bottom: var(--space-3); }\n.filterField { display: flex; flex-direction: column; gap: var(--space-1); }\n.filterLabel { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); }\n.filterField input {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n}\n\n/* The Select primitive renders its own <label>; restyle it to the uppercase\n micro-label the sibling text filters use so the row still reads as one\n group. Descendant element selector, so it stays module-scoped. */\n.filterSelect > label {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-regular, 400);\n color: var(--text-tertiary);\n}\n\n/* WebKit paints its own clear affordance inside type=search, which is a\n default browser control (§7). Sidebar.module.css already resets it. */\n.filterField input[type='search']::-webkit-search-cancel-button { appearance: none; }\n\n\n/* --- safety ------------------------------------------------------------- */\n.checkList { display: flex; flex-direction: column; }\n.check { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: var(--space-1) var(--space-3); padding: var(--space-2) 0; border-bottom: 1px solid var(--border-subtle); }\n.checkMark { grid-row: 1 / span 2; font-family: var(--font-display); font-size: var(--text-sm-size); }\n.check[data-pass=\"true\"] .checkMark { color: var(--status-success-fg); }\n.check[data-pass=\"false\"] .checkMark { color: var(--status-danger-fg); }\n.checkLabel { font-size: var(--text-sm-size); line-height: var(--text-sm-line); color: var(--text-primary); }\n.checkDetail { font-family: var(--font-mono); font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-tertiary); }\n\n/* --- goals + backlog ---------------------------------------------------- */\n.summaryColumns { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: var(--space-5); }\n.summaryList { display: flex; flex-direction: column; }\n.summaryRow { display: flex; align-items: baseline; gap: var(--space-3); min-height: var(--density-row, 32px); padding: var(--space-1) 0; border-bottom: 1px solid var(--border-subtle); }\n.summaryTitle { flex: 1; min-width: 0; font-size: var(--text-sm-size); color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.summaryMeta { font-family: var(--font-display); font-size: var(--text-xs-size); color: var(--text-tertiary); white-space: nowrap; }\n\n/* --- shared states ------------------------------------------------------ */\n.empty { padding: var(--space-4) 0; font-size: var(--text-sm-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 62ch; }\n.emptyStrong { color: var(--text-primary); font-weight: var(--font-weight-medium); }\n.error { padding: var(--space-3); border: 1px solid var(--status-danger-solid); border-radius: var(--radius-sm); background: var(--status-danger-bg); color: var(--status-danger-fg); font-size: var(--text-sm-size); line-height: var(--text-sm-line); }\n.readOnly { padding: var(--space-3); border: 1px solid var(--border-default); border-radius: var(--radius-sm); background: var(--bg-canvas); color: var(--text-secondary); font-size: var(--text-sm-size); line-height: var(--text-base-line); }\n.readOnly code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.skeletons { display: flex; flex-direction: column; gap: var(--space-2); }\n.srOnly { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }\n\n/* Guarded: appearance-store.ts writes data-motion=\"full\" so an operator can\n opt out of the OS preference, and every other animated surface here honours\n it. */\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .meterFill { transition: none; }\n}\n\n/* --- local fleet: serving runtime, local-only, agents in flight ---------- */\n/* Owner U. Same rules as the rest of this sheet: hairlines not cards, tone\n always paired with a word, every numeral in the display face with tabular\n figures so a column of elapsed times does not shimmer as it ticks. Reads at\n 900px — every grid here collapses to one column before that. */\n\n.runtimeTop { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-3); margin-bottom: var(--space-4); }\n.runtimeState { display: inline-flex; align-items: center; gap: var(--space-2); font-family: var(--font-display); font-size: var(--text-base-size); line-height: var(--text-base-line); font-weight: var(--font-weight-semibold); letter-spacing: var(--tracking-display, -0.02em); }\n.runtimeStateText { white-space: nowrap; }\n.runtimeState[data-state=\"running\"] .runDot { background: var(--status-success-solid); }\n.runtimeState[data-state=\"starting\"] .runDot,\n.runtimeState[data-state=\"stopping\"] .runDot { background: var(--status-running-solid); }\n.runtimeState[data-state=\"stopped\"] .runDot { background: var(--status-neutral-solid); }\n.runtimeState[data-state=\"unknown\"] .runDot { background: var(--status-unknown-solid); }\n\n.factWide { flex: 1 1 260px; min-width: 0; }\n.factMono { font-family: var(--font-mono); font-size: var(--text-xs-size); overflow: hidden; text-overflow: ellipsis; }\n\n/* The capacity block. The big numeral is the EFFECTIVE concurrency; the\n verdict word beside it carries the state so colour is never alone. */\n.capacityBlock { margin-top: var(--space-5); padding-top: var(--space-4); border-top: 1px solid var(--border-subtle); }\n.capacityHead { display: flex; align-items: flex-start; gap: var(--space-4); }\n.capacityBig {\n flex: none;\n min-width: 2ch;\n font-family: var(--font-display);\n font-variant-numeric: tabular-nums;\n font-size: var(--text-3xl-size, 30px);\n line-height: 1;\n letter-spacing: var(--tracking-display, -0.02em);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.capacityBlock[data-verdict=\"serialized\"] .capacityBig { color: var(--status-danger-fg); }\n.capacityBlock[data-verdict=\"unknown\"] .capacityBig,\n.capacityBlock[data-verdict=\"offline\"] .capacityBig { color: var(--text-tertiary); }\n.capacityWords { display: flex; flex-direction: column; gap: var(--space-1); min-width: 0; }\n.capacityHeadline { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); font-family: var(--font-display); font-size: var(--text-sm-size); line-height: var(--text-sm-line); color: var(--text-primary); }\n.capacityDetail { font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); max-width: 68ch; }\n\n/* The measurement, shown only when the configured number is not the real one. */\n.evidence { margin-top: var(--space-4); padding: var(--space-3); border: 1px solid var(--border-default); border-radius: var(--radius-sm); background: var(--bg-canvas); }\n.evidenceLead { font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); margin-bottom: var(--space-3); max-width: 68ch; }\n.evidenceScroll { overflow-x: auto; }\n.evidenceTable { width: 100%; min-width: 380px; border-collapse: collapse; font-size: var(--text-xs-size); line-height: var(--text-xs-line); }\n.evidenceTable th, .evidenceTable td { padding: var(--space-1) var(--space-2); text-align: left; border-bottom: 1px solid var(--border-subtle); }\n.evidenceTable thead th { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); font-weight: var(--font-weight-medium); }\n.evidenceTable tbody th { font-family: var(--font-display); color: var(--text-primary); font-weight: var(--font-weight-medium); white-space: nowrap; }\n.evidenceTable tbody tr:last-child th, .evidenceTable tbody tr:last-child td { border-bottom: 0; }\n.evidenceNums { font-family: var(--font-display); font-variant-numeric: tabular-nums; color: var(--text-secondary); white-space: nowrap; }\n.evidenceCode { font-family: var(--font-mono); font-size: var(--text-2xs-size, 11px); color: var(--text-tertiary); overflow-wrap: anywhere; }\n\n.utilisation { display: flex; flex-direction: column; gap: var(--space-2); margin-top: var(--space-5); }\n\n/* --- local only --------------------------------------------------------- */\n.toggleRow { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--space-3); }\n.toggleState { display: inline-flex; align-items: center; gap: var(--space-2); }\n.policyExplain { margin-top: var(--space-3); font-size: var(--text-sm-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 68ch; }\n.policyExplain strong { color: var(--text-primary); font-weight: var(--font-weight-semibold); }\n\n.impact { margin-top: var(--space-5); padding-top: var(--space-4); border-top: 1px solid var(--border-subtle); }\n.impactTitle { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); margin-bottom: var(--space-2); }\n.impactSummary { font-size: var(--text-sm-size); line-height: var(--text-base-line); color: var(--text-primary); max-width: 68ch; }\n.seatList { display: flex; flex-direction: column; margin-top: var(--space-3); }\n.seatRow { display: grid; grid-template-columns: minmax(64px, auto) minmax(0, 1fr); gap: var(--space-1) var(--space-3); align-items: baseline; padding: var(--space-2) 0; border-bottom: 1px solid var(--border-subtle); }\n.seatEngine {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n color: var(--text-secondary);\n /* A 2px engine marker, per the design language: identity, never state. */\n border-left: 2px solid var(--engine-color, var(--border-strong));\n padding-left: var(--space-2);\n white-space: nowrap;\n}\n.seatEngine[data-engine=\"claude\"] { --engine-color: var(--engine-claude); }\n.seatEngine[data-engine=\"codex\"] { --engine-color: var(--engine-codex); }\n.seatEngine[data-engine=\"grok\"] { --engine-color: var(--engine-grok); }\n.seatEngine[data-engine=\"local\"] { --engine-color: var(--engine-local); }\n.seatLabel { font-size: var(--text-sm-size); line-height: var(--text-sm-line); color: var(--text-primary); min-width: 0; overflow-wrap: anywhere; }\n.seatRefusal { grid-column: 2; font-family: var(--font-mono); font-size: var(--text-2xs-size, 11px); line-height: var(--text-xs-line); color: var(--text-tertiary); overflow-wrap: anywhere; }\n\n/* --- fleet -------------------------------------------------------------- */\n.pressure { display: flex; flex-direction: column; gap: var(--space-1); }\n.pressureHead { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); }\n.pressureHeadline { font-family: var(--font-display); font-size: var(--text-lg-size); line-height: var(--text-lg-line); font-weight: var(--font-weight-semibold); letter-spacing: var(--tracking-display, -0.02em); color: var(--text-primary); }\n.pressure[data-state=\"queued\"] .pressureHeadline { color: var(--status-warning-fg); }\n.pressure[data-state=\"unknown\"] .pressureHeadline { color: var(--status-unknown-fg); }\n.pressureDetail { font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); max-width: 68ch; }\n\n.fleetMeters { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); align-items: end; gap: var(--space-3) var(--space-5); margin: var(--space-4) 0; }\n.elapsedQualifier { color: var(--text-tertiary); font-family: var(--font-ui); font-style: italic; }\n.noteList { display: flex; flex-direction: column; gap: var(--space-1); margin-top: var(--space-3); list-style: none; }\n\n/* Standing of one enrolled repo in the autonomous lane: its sections and its\n rank. Ordering only — neither of these enrols anything. */\n.repoStanding {\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--space-1);\n align-items: center;\n}\n\n.repoPriority,\n.repoSection,\n.repoOutsideFocus {\n padding: 0 var(--space-1);\n border-radius: var(--radius-sm);\n border: 1px solid var(--border-subtle);\n font-size: var(--text-2xs, 0.6875rem);\n line-height: 1.6;\n color: var(--text-muted);\n white-space: nowrap;\n}\n\n.repoPriority { border-color: var(--accent); color: var(--text-default); }\n.repoOutsideFocus { font-style: italic; }\n","/**\n * routes/verse/autonomy/ActivityPanel.tsx — \"what did it do while I was\n * asleep\": recent ticks, the dispatches inside them, and the append-only audit\n * trail as a dense filterable table.\n *\n * Readability at 200 rows is a requirement, not an aspiration, so: one scroll\n * container with a sticky header rather than pagination, monospace in the\n * identifier columns so they align, wall-clock time (an audit read at 07:00 is\n * about *when*, and \"14h ago\" is useless for that) with the relative age as a\n * tooltip, and result carried by a glyph as well as a colour.\n *\n * The audit filters are applied deliberately, not per keystroke: the action\n * filter is server-side (`?action=`), so committing on Enter/blur keeps one\n * cache entry per real filter instead of one per character typed.\n */\nimport { useMemo, useState } from 'react';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { Select } from '../../../components/primitives/Select.js';\nimport { SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport { useQuery, useRefresh } from '../../../data/hooks.js';\nimport { verseAuditQuery, VERSE_AUDIT_DEFAULT_LIMIT } from './control-queries.js';\nimport type { AuditEntry, DaemonDispatchTrace, VerseControlSnapshot } from './control-types.js';\n// formatStamp, not formatClock: these three tables span days (the audit trail\n// defaults to 200 rows and offers 500), so a bare \"03:12:44\" cannot tell last\n// night from last week. It prints time alone for today and prefixes the date\n// otherwise.\nimport { describeTickOutcome, formatAge, formatCount, formatStamp, formatUsd, UNKNOWN } from './format.js';\nimport styles from './autonomy.module.css';\n\nconst RECENT_TICKS = 20;\nconst RECENT_DISPATCHES = 40;\n\ntype ResultFilter = '' | AuditEntry['result'];\n\ninterface DispatchRow extends DaemonDispatchTrace {\n tickTs: string;\n}\n\nexport function ActivityPanel({ snapshot }: { snapshot: VerseControlSnapshot }) {\n const ticks = snapshot.daemon?.ticks ?? null;\n\n const recentTicks = useMemo(() => (ticks ? [...ticks].slice(-RECENT_TICKS).reverse() : []), [ticks]);\n\n const dispatches = useMemo<DispatchRow[]>(() => {\n if (!ticks) return [];\n const rows: DispatchRow[] = [];\n for (let i = ticks.length - 1; i >= 0 && rows.length < RECENT_DISPATCHES; i -= 1) {\n const tick = ticks[i];\n if (!tick?.dispatches) continue;\n for (let j = tick.dispatches.length - 1; j >= 0 && rows.length < RECENT_DISPATCHES; j -= 1) {\n rows.push({ ...tick.dispatches[j]!, tickTs: tick.ts });\n }\n }\n return rows;\n }, [ticks]);\n\n return (\n <section className={styles.panel} aria-label=\"Activity\">\n <div className={styles.panelHead}>\n <h3 className={styles.panelTitle}>Recent ticks</h3>\n <p className={styles.panelNote}>Newest first · last {RECENT_TICKS}</p>\n </div>\n {ticks === null ? (\n <p className={styles.empty}>The daemon ledger is not readable right now, so tick history is unknown.</p>\n ) : recentTicks.length === 0 ? (\n <p className={styles.empty}>No ticks have been recorded yet. Start the loop, or run one tick, to produce the first.</p>\n ) : (\n <div className={styles.tableScroll}>\n <table className={styles.table}>\n <thead>\n <tr>\n <th scope=\"col\">Time</th>\n <th scope=\"col\">Outcome</th>\n <th scope=\"col\">Items</th>\n <th scope=\"col\">Proposals</th>\n <th scope=\"col\">Dispatched</th>\n <th scope=\"col\">Spend</th>\n <th scope=\"col\">Direction</th>\n </tr>\n </thead>\n <tbody>\n {recentTicks.map((tick) => {\n const outcome = describeTickOutcome(tick.reason);\n return (\n <tr key={`${tick.ts}-${tick.reason}`}>\n <td className={styles.cellTime} title={formatAge(tick.ts)}>\n {formatStamp(tick.ts)}\n </td>\n <td className={styles.cellSummary} data-tone={outcome.tone}>\n {outcome.label}\n {tick.dryRun ? ' (dry run)' : ''}\n </td>\n <td className={styles.cellTime}>{formatCount(tick.itemsConsidered)}</td>\n <td className={styles.cellTime}>{formatCount(tick.proposalsCreated)}</td>\n <td className={styles.cellTime}>{tick.dispatches ? tick.dispatches.length : UNKNOWN}</td>\n <td className={styles.cellTime}>{formatUsd(tick.spentUsd)}</td>\n <td className={styles.cellSummary}>{tick.directionMode ?? '—'}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n\n <div className={`${styles.panelHead} ${styles.panelHeadSpaced}`}>\n <h3 className={styles.panelTitle}>Recent dispatches</h3>\n <p className={styles.panelNote}>Newest first · last {RECENT_DISPATCHES}</p>\n </div>\n {dispatches.length === 0 ? (\n <p className={styles.empty}>\n No dispatch traces in the recorded ticks. A tick that finds nothing eligible records no dispatches — that is\n normal, not a gap.\n </p>\n ) : (\n <div className={styles.tableScroll}>\n <table className={styles.table}>\n <thead>\n <tr>\n <th scope=\"col\">Time</th>\n <th scope=\"col\">Item</th>\n <th scope=\"col\">Repo</th>\n <th scope=\"col\">Engine</th>\n <th scope=\"col\">Outcome</th>\n <th scope=\"col\">Spend</th>\n </tr>\n </thead>\n <tbody>\n {dispatches.map((row, i) => (\n <tr key={`${row.tickTs}-${row.itemId}-${i}`}>\n <td className={styles.cellTime} title={formatAge(row.tickTs)}>\n {formatStamp(row.tickTs)}\n </td>\n <td className={styles.cellSummary} title={row.title}>\n {row.title}\n </td>\n <td className={styles.cellRepo} title={row.repo}>\n {row.repo ? row.repo.split('/').pop() : UNKNOWN}\n </td>\n <td className={styles.cellAction}>{row.backend ?? 'not routed'}</td>\n <td className={styles.cellSummary}>\n {row.dispatched ? 'dispatched' : `skipped — ${row.reason}`}\n </td>\n <td className={styles.cellTime}>{formatUsd(row.spentUsd)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n <AuditTrail />\n </section>\n );\n}\n\nexport function AuditTrail() {\n const [actionDraft, setActionDraft] = useState('');\n const [action, setAction] = useState('');\n const [result, setResult] = useState<ResultFilter>('');\n const [limit, setLimit] = useState(VERSE_AUDIT_DEFAULT_LIMIT);\n\n const def = useMemo(\n () => verseAuditQuery({ limit, action: action || undefined, result: result || undefined }),\n [limit, action, result],\n );\n const query = useQuery(def);\n const refetch = useRefresh(def);\n\n const entries = query.data?.entries ?? [];\n\n return (\n <>\n <div className={`${styles.panelHead} ${styles.panelHeadSpaced}`}>\n <h3 className={styles.panelTitle}>Audit trail</h3>\n <div className={styles.panelActions}>\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n <button type=\"button\" className={styles.button} onClick={refetch}>\n Refresh\n </button>\n </div>\n </div>\n\n <div className={styles.filters}>\n <label className={styles.filterField}>\n <span className={styles.filterLabel}>Action</span>\n <input\n type=\"search\"\n value={actionDraft}\n placeholder=\"e.g. enroll.add\"\n onChange={(e) => setActionDraft(e.target.value)}\n onBlur={() => setAction(actionDraft.trim())}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n setAction(actionDraft.trim());\n }\n }}\n />\n </label>\n {/* The Select primitive, not a raw <select>: it carries the\n appearance: none reset, our own chevron, the --density-row height\n and the disabled styling. DESIGN-V2 §7 — \"Nothing is a default\n browser control\" — and an unreset <select> loses its border-radius\n to the native bezel on macOS Safari and grows a second OS chevron\n on Chrome/Windows. */}\n <Select\n className={styles.filterSelect}\n label=\"Result\"\n value={result}\n onChange={(e) => setResult(e.target.value as ResultFilter)}\n >\n <option value=\"\">Any result</option>\n <option value=\"ok\">ok</option>\n <option value=\"refused\">refused</option>\n <option value=\"error\">error</option>\n </Select>\n <Select\n className={styles.filterSelect}\n label=\"Rows\"\n value={limit}\n onChange={(e) => setLimit(Number(e.target.value))}\n >\n <option value={50}>50</option>\n <option value={200}>200</option>\n <option value={500}>500</option>\n </Select>\n </div>\n\n {query.status === 'loading' ? (\n <div className={styles.skeletons}>\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : query.status === 'error' ? (\n <p className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Could not read the audit trail.'}\n </p>\n ) : entries.length === 0 ? (\n <p className={styles.empty}>\n {action || result\n ? 'No audit entries match this filter.'\n : 'No audit entries recorded yet. Every autonomous or sandbox action appends one here, and none are ever deleted.'}\n </p>\n ) : (\n <>\n <p className={styles.panelNote} aria-live=\"polite\">\n {entries.length} {entries.length === 1 ? 'entry' : 'entries'} · newest first\n {query.data?.truncated ? ' · capped by the server, narrow the filter to see more' : ''}\n </p>\n <div className={styles.tableScroll}>\n <table className={styles.table}>\n <thead>\n <tr>\n <th scope=\"col\">Time</th>\n <th scope=\"col\">Action</th>\n <th scope=\"col\">Result</th>\n <th scope=\"col\">Repo</th>\n <th scope=\"col\">Summary</th>\n </tr>\n </thead>\n <tbody>\n {entries.map((entry, i) => (\n <tr key={`${entry.ts}-${entry.action}-${i}`}>\n <td className={styles.cellTime} title={formatAge(entry.ts)}>\n {formatStamp(entry.ts)}\n </td>\n <td className={styles.cellAction}>{entry.action}</td>\n <td>\n <span className={styles.resultTag} data-result={entry.result}>\n {entry.result}\n </span>\n </td>\n <td className={styles.cellRepo} title={entry.repo ?? undefined}>\n {entry.repo ? entry.repo.split('/').pop() : '—'}\n </td>\n <td className={styles.cellSummary}>{entry.summary}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </>\n )}\n </>\n );\n}\n","/**\n * routes/verse/autonomy/caps-spec.ts — one table describing every editable\n * cap, mirroring the server-side ranges in docs/VERSE-CONTRACT-V2.md so the\n * operator gets the error BEFORE the round trip, not after it.\n *\n * The table is the single source of truth for: the label, the unit shown next\n * to the number, the accepted range, whether the value must be whole, the\n * display transform (tick interval is edited in minutes, stored in ms), the\n * one-line explanation under the control, and how a committed value turns\n * into a `POST /api/verse/caps` partial body. Adding a cap is one entry here\n * and nothing else.\n *\n * If these ranges ever disagree with the server the server still wins — this\n * is a courtesy gate, never an authority. That is why `applyCapPatch` builds\n * a PARTIAL body and the panel re-reads the server's `applied` snapshot.\n */\nimport { VERSE_CAPS_BOUNDS, type VerseCaps, type VerseCapsPatch } from './control-types.js';\n\nexport type CapKey =\n | 'dailyBudgetUsd'\n | 'perTickItems'\n | 'parallel'\n | 'intervalMs'\n | 'maxConcurrent'\n | 'concurrency.local'\n | 'concurrency.cloud'\n | 'concurrency.total'\n | 'subscriptionMaxPercent';\n\nexport interface CapFieldSpec {\n key: CapKey;\n label: string;\n /** Shown after the input; also read aloud as part of the accessible name. */\n unit: string;\n /** Inclusive bounds, expressed in DISPLAY units. */\n min: number;\n max: number;\n /** Display values must be whole numbers (tick interval is the exception). */\n integer: boolean;\n step: number;\n help: string;\n /** Stored value -> what the operator types. */\n toDisplay: (stored: number) => number;\n /** What the operator typed -> what the server stores. */\n fromDisplay: (display: number) => number;\n}\n\nconst identity = (n: number) => n;\n\n/** Tick interval is stored in ms and edited in minutes — 30s..24h. */\nconst MS_PER_MINUTE = 60_000;\n\nexport const CAP_FIELDS: readonly CapFieldSpec[] = [\n {\n key: 'dailyBudgetUsd',\n label: 'Daily budget',\n unit: 'USD / day',\n min: 0,\n max: 1000,\n integer: false,\n step: 1,\n help: 'Hard ceiling on what the loop may spend in a calendar day. 0 means the loop is stopped — it is not \"unlimited\".',\n toDisplay: identity,\n fromDisplay: identity,\n },\n {\n key: 'perTickItems',\n label: 'Items per tick',\n unit: 'items',\n min: 1,\n max: 50,\n integer: true,\n step: 1,\n help: 'How many backlog items one tick may pick up.',\n toDisplay: identity,\n fromDisplay: identity,\n },\n {\n key: 'parallel',\n label: 'Parallel swarms',\n unit: 'swarms',\n min: 1,\n max: 16,\n integer: true,\n step: 1,\n help: 'Sandboxed swarms run simultaneously inside one tick (batch mode).',\n toDisplay: identity,\n fromDisplay: identity,\n },\n {\n key: 'intervalMs',\n label: 'Tick interval',\n unit: 'minutes',\n min: 0.5,\n max: 1440,\n integer: false,\n step: 0.5,\n help: 'Gap between ticks in loop mode. 30 seconds minimum, 24 hours maximum.',\n toDisplay: (stored) => Math.round((stored / MS_PER_MINUTE) * 100) / 100,\n fromDisplay: (display) => Math.round(display * MS_PER_MINUTE),\n },\n {\n key: 'maxConcurrent',\n label: 'Max concurrent',\n unit: 'dispatches',\n min: 1,\n max: 32,\n integer: true,\n step: 1,\n help: 'Absolute ceiling on in-flight dispatches in continuous mode. Takes precedence over the per-tier totals.',\n toDisplay: identity,\n fromDisplay: identity,\n },\n {\n key: 'concurrency.local',\n label: 'Local tier',\n unit: 'slots',\n min: 1,\n max: 32,\n integer: true,\n step: 1,\n help: 'On-device engines. GPU/RAM bound — keep this low.',\n toDisplay: identity,\n fromDisplay: identity,\n },\n {\n key: 'concurrency.cloud',\n label: 'Cloud tier',\n unit: 'slots',\n min: 1,\n max: 32,\n integer: true,\n step: 1,\n help: 'Subscription cloud agents. I/O bound — many can run at once.',\n toDisplay: identity,\n fromDisplay: identity,\n },\n {\n key: 'concurrency.total',\n label: 'All tiers',\n unit: 'slots',\n min: 1,\n max: 32,\n integer: true,\n step: 1,\n help: 'Hard cap across every tier combined.',\n toDisplay: identity,\n fromDisplay: identity,\n },\n {\n key: 'subscriptionMaxPercent',\n label: 'Subscription ceiling',\n unit: '% of window',\n min: 1,\n max: 100,\n integer: true,\n step: 1,\n help: 'How much of a flat-fee provider window the fleet may consume before it backs off.',\n toDisplay: identity,\n fromDisplay: identity,\n },\n] as const;\n\nexport function capFieldByKey(key: CapKey): CapFieldSpec {\n const found = CAP_FIELDS.find((f) => f.key === key);\n /* istanbul ignore next -- CapKey is closed; this is a type-level guarantee. */\n if (!found) throw new Error(`unknown cap field: ${key}`);\n return found;\n}\n\n/** Current stored value for a cap, or null when the server did not send it. */\nexport function readCap(caps: VerseCaps | undefined, key: CapKey): number | null {\n if (!caps) return null;\n const raw =\n key === 'concurrency.local'\n ? caps.concurrency?.local\n : key === 'concurrency.cloud'\n ? caps.concurrency?.cloud\n : key === 'concurrency.total'\n ? caps.concurrency?.total\n : (caps as unknown as Record<string, unknown>)[key];\n return typeof raw === 'number' && Number.isFinite(raw) ? raw : null;\n}\n\nexport type CapValidation =\n | { ok: true; stored: number; display: number }\n | { ok: false; error: string };\n\n/**\n * Validate what the operator typed against the spec's DISPLAY range, then\n * convert to the stored unit. Rejects blanks, non-numbers, fractions on\n * whole-number caps, and anything outside the range the server enforces.\n */\nexport function validateCap(spec: CapFieldSpec, raw: string): CapValidation {\n const trimmed = raw.trim();\n if (trimmed === '') return { ok: false, error: `${spec.label} cannot be blank.` };\n const parsed = Number(trimmed);\n if (!Number.isFinite(parsed)) return { ok: false, error: `${spec.label} must be a number.` };\n if (spec.integer && !Number.isInteger(parsed)) {\n return { ok: false, error: `${spec.label} must be a whole number of ${spec.unit}.` };\n }\n if (parsed < spec.min || parsed > spec.max) {\n return { ok: false, error: `${spec.label} must be between ${spec.min} and ${spec.max} ${spec.unit}.` };\n }\n return { ok: true, stored: spec.fromDisplay(parsed), display: parsed };\n}\n\n/** Build the smallest `POST /api/verse/caps` body that applies one cap. */\nexport function capPatch(key: CapKey, stored: number): VerseCapsPatch {\n switch (key) {\n case 'concurrency.local':\n return { concurrency: { local: stored } };\n case 'concurrency.cloud':\n return { concurrency: { cloud: stored } };\n case 'concurrency.total':\n return { concurrency: { total: stored } };\n default:\n return { [key]: stored } as VerseCapsPatch;\n }\n}\n\n/**\n * Inclusive display range for a per-engine foundry limit `max`. Read straight\n * off the server's own bound so the courtesy gate cannot drift from the 400\n * (`bounded(entry['max'], …, VERSE_CAPS_BOUNDS.foundryLimitMax)` in\n * control-api.ts). It is not a `CAP_FIELDS` entry, so the drift test that\n * iterates that table never reached it — hence the explicit export.\n */\nexport const FOUNDRY_LIMIT_MAX_RANGE = VERSE_CAPS_BOUNDS.foundryLimitMax;\n\n/** Per-engine foundry limit `max` — bounded exactly as the server bounds it. */\nexport function validateFoundryMax(raw: string, engine: string): CapValidation {\n const trimmed = raw.trim();\n if (trimmed === '') return { ok: false, error: `${engine} limit cannot be blank.` };\n const parsed = Number(trimmed);\n if (!Number.isFinite(parsed)) return { ok: false, error: `${engine} limit must be a number.` };\n if (!Number.isInteger(parsed)) return { ok: false, error: `${engine} limit must be a whole number of dispatches.` };\n if (parsed < FOUNDRY_LIMIT_MAX_RANGE.min) return { ok: false, error: `${engine} limit cannot be negative.` };\n if (parsed > FOUNDRY_LIMIT_MAX_RANGE.max) {\n return {\n ok: false,\n error: `${engine} limit must be at most ${FOUNDRY_LIMIT_MAX_RANGE.max} dispatches.`,\n };\n }\n return { ok: true, stored: parsed, display: parsed };\n}\n","/**\n * routes/verse/autonomy/CapsPanel.tsx — the leash: every configured cap, the\n * live usage against it, and an inline edit that commits on blur or Enter.\n *\n * Three behaviours the contract calls out explicitly:\n * - **Validate before the round trip.** caps-spec.ts mirrors the server's\n * ranges, so a bad value is refused inline instead of costing a 400.\n * - **\"Applied live\" means applied live.** The daemon re-reads config each\n * tick, so a committed cap takes effect without a restart; the confirmation\n * says so, and clears on the next edit rather than lingering.\n * - **A daily budget of 0 reads as \"stopped\".** Never as \"unlimited\". The\n * usage line under the budget field says it in words as well as in the\n * header's meter.\n *\n * Live usage is shown ONLY where the number is genuinely observable. Per-tier\n * concurrency has no live signal, so it gets no usage line — an invented\n * \"0 / 8\" would be worse than silence.\n */\nimport { useEffect, useState } from 'react';\nimport {\n CAP_FIELDS,\n FOUNDRY_LIMIT_MAX_RANGE,\n capPatch,\n readCap,\n validateCap,\n validateFoundryMax,\n type CapFieldSpec,\n type CapKey,\n} from './caps-spec.js';\nimport { updateVerseCaps } from './control-queries.js';\nimport { engineQuotaStanding } from './control-types.js';\nimport type { VerseCaps, VerseControlSnapshot, VerseFoundryLimit } from './control-types.js';\nimport { budgetMeter, formatAge, formatCount, formatUsd } from './format.js';\nimport type { GuardedAction } from './use-guarded-action.js';\nimport styles from './autonomy.module.css';\n\nexport interface CapsPanelProps {\n caps: VerseCaps;\n snapshot: VerseControlSnapshot;\n guard: GuardedAction;\n dispatchEnabled: boolean;\n}\n\n/** What is actually measurable against each cap right now. */\nfunction usageFor(key: CapKey, caps: VerseCaps, snapshot: VerseControlSnapshot): string | null {\n const daemon = snapshot.daemon;\n const lastTick = daemon?.ticks?.[daemon.ticks.length - 1] ?? null;\n switch (key) {\n case 'dailyBudgetUsd': {\n const cap = caps.dailyBudgetUsd;\n if (cap === 0) return 'Loop stopped — a budget of 0 is a stop, not \"unlimited\".';\n // Same honesty rule as the status header: `todayUsd` belongs to\n // `todayDate`, and a ledger day that is not today says nothing about\n // today. budgetMeter owns that comparison for both surfaces.\n const spend = snapshot.spend;\n const meter = spend\n ? budgetMeter(spend.todayUsd, cap, spend.todayDate)\n : budgetMeter(daemon?.todaySpentUsd ?? null, cap, null);\n if (meter.state === 'unknown') return meter.note;\n return `${formatUsd(spend ? spend.todayUsd : (daemon?.todaySpentUsd ?? null))} spent today`;\n }\n case 'perTickItems':\n return lastTick ? `${formatCount(lastTick.itemsConsidered)} considered on the last tick` : null;\n case 'parallel':\n return lastTick?.dispatches ? `${lastTick.dispatches.length} dispatched on the last tick` : null;\n case 'intervalMs':\n return daemon?.lastTickAt ? `last tick ${formatAge(daemon.lastTickAt)} ago` : null;\n default:\n return null;\n }\n}\n\nexport function CapsPanel({ caps, snapshot, guard, dispatchEnabled }: CapsPanelProps) {\n const [activeKey, setActiveKey] = useState<string | null>(null);\n const [busyKey, setBusyKey] = useState<string | null>(null);\n const [appliedKey, setAppliedKey] = useState<string | null>(null);\n const locked = !dispatchEnabled || guard.readOnly;\n\n function commit(id: string, reason: string, run: () => Promise<unknown>) {\n setActiveKey(id);\n setAppliedKey(null);\n guard.request(async () => {\n setBusyKey(id);\n try {\n await run();\n setAppliedKey(id);\n } finally {\n setBusyKey(null);\n }\n }, reason);\n }\n\n const limits = caps.foundryLimits ?? [];\n\n return (\n <section className={styles.panel} aria-label=\"Budget and limits\">\n <div className={styles.panelHead}>\n <h3 className={styles.panelTitle}>Budget and limits</h3>\n <p className={styles.panelNote}>Committed on blur or Enter. The daemon re-reads config each tick, so changes apply live.</p>\n </div>\n\n <div className={styles.capGrid}>\n {CAP_FIELDS.map((spec) => (\n <CapField\n key={spec.key}\n spec={spec}\n stored={readCap(caps, spec.key)}\n usage={usageFor(spec.key, caps, snapshot)}\n disabled={locked || (busyKey !== null && busyKey !== spec.key)}\n busy={busyKey === spec.key}\n applied={appliedKey === spec.key}\n error={activeKey === spec.key ? guard.error : null}\n onCommit={(stored) =>\n commit(spec.key, `Changing ${spec.label.toLowerCase()} requires the dispatch token.`, () =>\n updateVerseCaps(capPatch(spec.key, stored)),\n )\n }\n />\n ))}\n </div>\n\n <div className={`${styles.panelHead} ${styles.panelHeadSpaced}`}>\n <h3 className={styles.panelTitle}>Per-engine dispatch limits</h3>\n </div>\n {limits.length === 0 ? (\n <p className={styles.empty}>\n No per-engine dispatch limits are configured. Every engine is bounded only by the caps above and by its own\n provider quota.\n </p>\n ) : (\n <div className={styles.capGrid}>\n {limits.map((limit, index) => (\n <FoundryLimitField\n key={`${limit.engine}:${limit.window}`}\n limit={limit}\n usage={engineUsage(limit.engine, snapshot)}\n disabled={locked || (busyKey !== null && busyKey !== limitId(limit))}\n busy={busyKey === limitId(limit)}\n applied={appliedKey === limitId(limit)}\n error={activeKey === limitId(limit) ? guard.error : null}\n onCommit={(max) =>\n commit(limitId(limit), `Changing the ${limit.engine} dispatch limit requires the dispatch token.`, () => {\n const next = limits.map((entry, i) => (i === index ? { ...entry, max } : entry));\n return updateVerseCaps({ foundryLimits: next });\n })\n }\n />\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction limitId(limit: VerseFoundryLimit): string {\n return `foundry:${limit.engine}:${limit.window}`;\n}\n\nfunction engineUsage(engine: string, snapshot: VerseControlSnapshot): string | null {\n // `/api/verse/control` sends raw frontier-usage rows; the standing word\n // (\"ok\"/\"warn\"/\"over\"/\"unlimited\") is derived here rather than served, so\n // the client and the server cannot disagree about a threshold they both own.\n const row = snapshot.quota?.find((e) => e.engine === engine);\n if (!row) return null;\n const standing = engineQuotaStanding(row);\n const quota = standing === 'unlimited' ? 'no limit configured' : standing;\n // `callsToday` is NOT a 24h figure: frontier-usage counts it over the\n // CONFIGURED limit window, which the row carries as `limitWindow`. Saying\n // \"24h\" under a field labelled \"dispatches / 1h\" described one number two\n // contradictory ways.\n return `${formatCount(row.callsToday)} dispatched in the last ${row.limitWindow ?? '1d'} · ${quota}`;\n}\n\ninterface FieldShellProps {\n id: string;\n label: string;\n unit: string;\n help?: string;\n usage: string | null;\n value: string;\n invalid: string | null;\n disabled: boolean;\n busy: boolean;\n applied: boolean;\n error: string | null;\n onChange: (next: string) => void;\n onCommit: () => void;\n step: number;\n min: number;\n max: number;\n}\n\nfunction FieldShell(props: FieldShellProps) {\n const describedBy = [props.usage ? `${props.id}-usage` : null, props.help ? `${props.id}-help` : null]\n .filter((x): x is string => x !== null)\n .join(' ');\n return (\n <div className={styles.cap}>\n <label className={styles.capLabel} htmlFor={props.id}>\n {props.label}\n </label>\n <div className={styles.capRow}>\n <input\n id={props.id}\n type=\"number\"\n inputMode=\"decimal\"\n className={`${styles.capInput} ${props.invalid ? styles.capInputInvalid : ''}`}\n value={props.value}\n step={props.step}\n min={props.min}\n max={props.max}\n disabled={props.disabled || props.busy}\n aria-invalid={props.invalid ? true : undefined}\n aria-describedby={describedBy || undefined}\n onChange={(e) => props.onChange(e.target.value)}\n onBlur={props.onCommit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n props.onCommit();\n }\n }}\n />\n <span className={styles.capUnit}>{props.unit}</span>\n </div>\n {props.usage ? (\n <span className={styles.capUsage} id={`${props.id}-usage`}>\n {props.usage}\n </span>\n ) : null}\n {props.help ? (\n <span className={styles.capHelp} id={`${props.id}-help`}>\n {props.help}\n </span>\n ) : null}\n {props.invalid ? (\n <span className={styles.capError} role=\"alert\">\n {props.invalid}\n </span>\n ) : null}\n {props.error && !props.invalid ? (\n <span className={styles.capError} role=\"alert\">\n {props.error}\n </span>\n ) : null}\n {props.applied && !props.invalid && !props.error ? <span className={styles.capApplied}>applied live</span> : null}\n </div>\n );\n}\n\nfunction CapField({\n spec,\n stored,\n usage,\n disabled,\n busy,\n applied,\n error,\n onCommit,\n}: {\n spec: CapFieldSpec;\n stored: number | null;\n usage: string | null;\n disabled: boolean;\n busy: boolean;\n applied: boolean;\n error: string | null;\n onCommit: (stored: number) => void;\n}) {\n const canonical = stored === null ? '' : String(spec.toDisplay(stored));\n const [draft, setDraft] = useState(canonical);\n const [invalid, setInvalid] = useState<string | null>(null);\n\n // The server is the authority: when its value changes under us (another tab,\n // another cap's POST returning a fresh snapshot) adopt it, unless the\n // operator is mid-edit with something invalid they still need to see.\n useEffect(() => {\n if (invalid === null) setDraft(canonical);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- adopt server value only when it actually changes\n }, [canonical]);\n\n function commit() {\n if (draft === canonical) {\n setInvalid(null);\n return;\n }\n const result = validateCap(spec, draft);\n if (!result.ok) {\n setInvalid(result.error);\n return;\n }\n setInvalid(null);\n onCommit(result.stored);\n }\n\n return (\n <FieldShell\n id={`cap-${spec.key.replace('.', '-')}`}\n label={spec.label}\n unit={spec.unit}\n help={spec.help}\n usage={usage}\n value={draft}\n invalid={invalid}\n // `stored === null` means \"not configured yet\" — the ONE state this\n // control most needs to be editable in. Disabling it made Max\n // concurrent and all three tiers permanently uneditable on a default\n // config, which is the default. `commit()` already handles an empty\n // untouched field: `draft === canonical` is `'' === ''`, so it posts\n // nothing until something is typed.\n disabled={disabled}\n busy={busy}\n applied={applied}\n error={error}\n step={spec.step}\n min={spec.min}\n max={spec.max}\n onChange={(next) => {\n setDraft(next);\n if (invalid) setInvalid(null);\n }}\n onCommit={commit}\n />\n );\n}\n\nfunction FoundryLimitField({\n limit,\n usage,\n disabled,\n busy,\n applied,\n error,\n onCommit,\n}: {\n limit: VerseFoundryLimit;\n usage: string | null;\n disabled: boolean;\n busy: boolean;\n applied: boolean;\n error: string | null;\n onCommit: (max: number) => void;\n}) {\n const canonical = String(limit.max);\n const [draft, setDraft] = useState(canonical);\n const [invalid, setInvalid] = useState<string | null>(null);\n\n useEffect(() => {\n if (invalid === null) setDraft(canonical);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- adopt server value only when it actually changes\n }, [canonical]);\n\n function commit() {\n if (draft === canonical) {\n setInvalid(null);\n return;\n }\n const result = validateFoundryMax(draft, limit.engine);\n if (!result.ok) {\n setInvalid(result.error);\n return;\n }\n setInvalid(null);\n onCommit(result.stored);\n }\n\n return (\n <FieldShell\n id={`cap-foundry-${limit.engine}-${limit.window}`}\n label={limit.engine}\n unit={`dispatches / ${limit.window}`}\n usage={usage}\n value={draft}\n invalid={invalid}\n disabled={disabled}\n busy={busy}\n applied={applied}\n error={error}\n step={1}\n min={FOUNDRY_LIMIT_MAX_RANGE.min}\n max={FOUNDRY_LIMIT_MAX_RANGE.max}\n onChange={(next) => {\n setDraft(next);\n if (invalid) setInvalid(null);\n }}\n onCommit={commit}\n />\n );\n}\n","/**\n * routes/verse/autonomy/use-ticker.ts — a shared 1Hz clock for the countdown\n * and the relative ages in the status header — one interval per consumer\n * rather than a bespoke timer inside each panel.\n *\n * It deliberately keeps ticking under `prefers-reduced-motion`: a countdown is\n * information, not decoration. The design language's quiet-motion rule governs\n * transitions and animation, not numbers that have to stay true.\n */\nimport { useEffect, useState } from 'react';\n\nexport function useNow(intervalMs = 1000): number {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), intervalMs);\n return () => clearInterval(id);\n }, [intervalMs]);\n return now;\n}\n","/**\n * routes/verse/autonomy/StatusHeader.tsx — the five questions the cockpit has\n * to answer before the operator reads anything else: is it running, what is it\n * doing, what has it spent, when does it move next, and is the leash on.\n *\n * Epistemic rule enforced here: the daemon's run state is only stated when\n * `sourceQuality` says the observation is healthy AND complete. A degraded\n * read renders \"unknown\" — never \"stopped\", which would read as a fact.\n * The kill switch outranks everything: while it is engaged the header says so\n * regardless of what the daemon ledger claims.\n */\nimport { isKnown } from '../../../components/primitives/Epistemic.js';\nimport type { VerseControlSnapshot } from './control-types.js';\nimport { budgetMeter, countdownLabel, describeTickOutcome, formatClock, formatInterval, formatRelative, nextTickAt, UNKNOWN } from './format.js';\nimport { useNow } from './use-ticker.js';\nimport styles from './autonomy.module.css';\n\nexport type RunState = 'running' | 'stopped' | 'unknown' | 'killed';\n\nexport function runStateOf(snapshot: VerseControlSnapshot): { state: RunState; label: string } {\n // \"Kill switch engaged\", not \"Emergency stop engaged\". The sentinel has two\n // authors — the Emergency stop button and the ordinary `Stop loop`, which\n // `stopDaemon()` implements as `setKill(true)` — and the snapshot cannot\n // tell them apart. Naming the switch rather than the button states the fact\n // both paths share instead of accusing an operator who only pressed Stop.\n if (snapshot.killSwitch?.state === 'active') return { state: 'killed', label: 'Kill switch engaged' };\n const daemon = snapshot.daemon;\n if (!daemon || !isKnown(daemon.sourceQuality)) return { state: 'unknown', label: 'Run state unknown' };\n if (daemon.runtimeState === 'running') return { state: 'running', label: 'Running' };\n if (daemon.runtimeState === 'stopped') return { state: 'stopped', label: 'Stopped' };\n return { state: 'unknown', label: 'Run state unknown' };\n}\n\nexport function StatusHeader({ snapshot }: { snapshot: VerseControlSnapshot }) {\n const now = useNow(1000);\n const { state, label } = runStateOf(snapshot);\n const daemon = snapshot.daemon;\n const observed = isKnown(daemon?.sourceQuality);\n\n const lastTick = daemon?.ticks?.[daemon.ticks.length - 1] ?? null;\n const outcome = describeTickOutcome(lastTick?.reason);\n const directionMode = snapshot.fleet?.directionMode ?? lastTick?.directionMode ?? null;\n\n // The enrollment registry arrives as `scope.repos`; a missing scope block is\n // unknown (UNKNOWN), which is not the same as an enrolled-zero registry.\n const repos = snapshot.scope?.repos ?? null;\n\n const interval = snapshot.caps?.intervalMs ?? null;\n const next = state === 'running' ? nextTickAt(daemon?.lastTickAt, interval) : null;\n // `spend.todayUsd` belongs to `spend.todayDate`, and the daemon writes that\n // figure once a day and leaves it there. Handing the meter the date lets it\n // say \"nothing recorded today\" instead of presenting a three-week-old ledger\n // day as today's spend. When only the legacy daemon observation exists there\n // is no date to check, so it is passed as null and the meter behaves as before.\n const spend = snapshot.spend;\n const budget = spend\n ? budgetMeter(spend.todayUsd, snapshot.caps?.dailyBudgetUsd ?? null, spend.todayDate)\n : budgetMeter(daemon?.todaySpentUsd ?? null, snapshot.caps?.dailyBudgetUsd ?? null, null);\n\n return (\n <section className={styles.status} aria-label=\"Autonomy status\">\n <div className={styles.statusTop}>\n <span className={styles.runState} data-state={state}>\n <span className={styles.runDot} aria-hidden=\"true\" />\n {label}\n </span>\n <div className={styles.facts}>\n <div className={styles.fact}>\n <span className={styles.factLabel}>Direction</span>\n <span className={styles.factValue}>{directionMode ?? 'default'}</span>\n </div>\n <div className={styles.fact}>\n <span className={styles.factLabel}>Last tick</span>\n <span className={styles.factValue} data-tone={outcome.tone}>\n {observed && daemon?.lastTickAt ? `${formatClock(daemon.lastTickAt)} · ${outcome.label}` : outcome.label}\n </span>\n </div>\n <div className={styles.fact}>\n <span className={styles.factLabel}>Next tick</span>\n <span className={styles.factValue}>\n {state === 'running' ? countdownLabel(next, now) : state === 'killed' ? 'blocked' : 'not scheduled'}\n </span>\n </div>\n <div className={styles.fact}>\n <span className={styles.factLabel}>Interval</span>\n <span className={styles.factValue}>{formatInterval(interval)}</span>\n </div>\n <div className={styles.fact}>\n <span className={styles.factLabel}>Scope</span>\n <span className={styles.factValue} data-tone={(repos?.length ?? 0) === 0 ? 'warning' : undefined}>\n {repos ? `${repos.length} repos` : UNKNOWN}\n </span>\n </div>\n <div className={styles.fact}>\n <span className={styles.factLabel}>Awaiting you</span>\n <span className={styles.factValue}>{typeof snapshot.pendingApprovals === 'number' ? `${snapshot.pendingApprovals} approvals` : UNKNOWN}</span>\n </div>\n <div className={styles.fact}>\n <span className={styles.factLabel}>Started</span>\n <span className={styles.factValue}>{observed ? formatRelative(daemon?.startedAt) : UNKNOWN}</span>\n </div>\n </div>\n </div>\n\n <div className={styles.budget}>\n <div className={styles.budgetLine}>\n <span className={styles.budgetLabel}>{budget.label}</span>\n <span className={styles.budgetNote}>{budget.note}</span>\n </div>\n <div\n className={styles.meter}\n data-state={budget.state}\n role=\"meter\"\n aria-label=\"Today's spend against the daily budget\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={budget.percent ?? undefined}\n aria-valuetext={`${budget.label}. ${budget.note}`}\n >\n <div className={styles.meterFill} style={{ width: `${budget.percent ?? 0}%` }} />\n </div>\n </div>\n </section>\n );\n}\n","/**\n * routes/verse/autonomy/DaemonControls.tsx — THREE stops with three honestly\n * different scopes, ordered by how much they break.\n *\n * 1. Pause / Resume — primary, UNCONFIRMED, obviously reversible.\n * `POST /api/verse/daemon {action:'pause'}` writes the daemon-scoped\n * sentinel `~/.ashlr/daemon.paused`. It halts autonomous dispatch and\n * NOTHING else: the operator's own write tools keep working, a resident\n * loop parks instead of dying, and Resume brings it back with no restart.\n * It gets no confirm dialog on purpose — a control that is free to undo\n * must be free to reach, or people reach for the drastic one instead.\n *\n * 2. Stop loop — confirmed. `stopDaemon()` is still `setKill(true)`\n * (core/daemon/loop.ts), so the ordinary stop engages the SAME global\n * sentinel as the emergency button. The confirm says that plainly and\n * points at Pause, because with Pause shipped, Stop is now the WRONG\n * choice for \"just halt the loop\" rather than the only one.\n *\n * 3. Emergency stop — confirmed, below a rule, danger-styled. The global\n * kill switch, stated at its true blast radius.\n *\n * VERSE-CONTRACT-V2's two rules still hold: the kill switch is never labelled\n * \"pause\", and the confirm states what else it disables before the click. The\n * word \"pause\" now belongs to the control that earns it.\n */\nimport { useState } from 'react';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { ConfirmDialog } from '../../inbox/ConfirmDialog.js';\nimport { engageEmergencyStop, releaseEmergencyStop, runDaemonAction } from './control-queries.js';\nimport type { VerseControlSnapshot, VerseDaemonActionResult } from './control-types.js';\nimport { runStateOf } from './StatusHeader.js';\nimport type { GuardedAction } from './use-guarded-action.js';\nimport styles from './autonomy.module.css';\n\ntype Confirming = 'engage' | 'release' | 'stop' | null;\n\nexport interface DaemonControlsProps {\n snapshot: VerseControlSnapshot;\n guard: GuardedAction;\n /** False when the server was started without dispatch: every POST 404s. */\n dispatchEnabled: boolean;\n}\n\nexport function DaemonControls({ snapshot, guard, dispatchEnabled }: DaemonControlsProps) {\n const [confirming, setConfirming] = useState<Confirming>(null);\n // The server's own account of what the last action did. Every daemon action\n // returns one and every one of them used to be discarded — which is how\n // \"Stop loop\" could engage the global kill switch without the operator ever\n // being told. Cleared on the next action so it is never stale.\n const [lastNote, setLastNote] = useState<string | null>(null);\n const { state } = runStateOf(snapshot);\n const killed = snapshot.killSwitch?.state === 'active';\n const killUnknown = snapshot.killSwitch?.state === 'unknown';\n // The pause is its own sentinel with its own third state. `unknown` means\n // the sentinel could not be read, and the daemon FAILS SAFE by treating that\n // as paused — so the UI must too, rather than showing a running loop.\n const pauseState = snapshot.pause?.state ?? 'unknown';\n const paused = pauseState !== 'running';\n const pauseUnknown = pauseState === 'unknown';\n const locked = !dispatchEnabled || guard.readOnly;\n const disabled = locked || guard.busy;\n\n const noteOf = (result: VerseDaemonActionResult) => setLastNote(result.note || null);\n\n return (\n <section className={styles.panel} aria-label=\"Loop controls\">\n <div className={styles.panelHead}>\n <h3 className={styles.panelTitle}>Controls</h3>\n </div>\n\n <div className={styles.controls}>\n {paused ? (\n <button\n type=\"button\"\n className={`${styles.button} ${styles.buttonPrimary}`}\n disabled={disabled}\n onClick={() =>\n guard.request(\n () => runDaemonAction('resume'),\n 'Resuming autonomous dispatch requires the dispatch token.',\n noteOf,\n )\n }\n >\n Resume\n </button>\n ) : (\n // No confirm. Pausing costs nothing, undoes in one click, and leaves\n // every other capability intact — a dialog here would only teach the\n // operator to click through dialogs.\n <button\n type=\"button\"\n className={`${styles.button} ${styles.buttonPrimary}`}\n disabled={disabled}\n onClick={() =>\n guard.request(\n () => runDaemonAction('pause'),\n 'Pausing autonomous dispatch requires the dispatch token.',\n noteOf,\n )\n }\n >\n Pause\n </button>\n )}\n {/* WHY IS THIS GREYED OUT. The reason a control is refusing is the\n one thing a disabled control must be able to say, and a native\n `title` said it to a mouse and to nobody else. `disabled` also\n eats pointer events on the button itself — the Tooltip listens on\n its wrapper, so the reason survives that too. */}\n <Tooltip\n label={\n killed\n ? 'Release the emergency stop before starting the loop.'\n : paused\n ? 'Dispatch is paused — resume before starting the loop.'\n : ''\n }\n >\n <button\n type=\"button\"\n className={styles.button}\n disabled={disabled || state === 'running' || killed || paused}\n onClick={() =>\n guard.request(\n () => runDaemonAction('start'),\n 'Starting the autonomous loop requires the dispatch token.',\n noteOf,\n )\n }\n >\n Start loop\n </button>\n </Tooltip>\n <button\n type=\"button\"\n className={styles.button}\n disabled={disabled || state === 'stopped'}\n onClick={() => setConfirming('stop')}\n >\n Stop loop\n </button>\n <Tooltip label={paused ? 'Dispatch is paused — resume before running a tick.' : ''}>\n <button\n type=\"button\"\n className={styles.button}\n disabled={disabled || killed || paused}\n onClick={() =>\n guard.request(\n () => runDaemonAction('once'),\n 'Running one tick requires the dispatch token.',\n noteOf,\n )\n }\n >\n Run one tick\n </button>\n </Tooltip>\n </div>\n\n {paused ? (\n <p className={styles.actionNote} role=\"status\">\n {pauseUnknown\n ? 'Dispatch is treated as paused: the pause sentinel could not be read, and the daemon fails safe rather than running on an unreadable signal.'\n : 'Autonomous dispatch is paused. The loop parks between ticks; your own write tools are unaffected, and the global kill switch is not engaged.'}\n </p>\n ) : null}\n\n <div className={styles.emergency}>\n {killed ? (\n <>\n <button type=\"button\" className={styles.button} disabled={disabled} onClick={() => setConfirming('release')}>\n Release emergency stop\n </button>\n <p className={styles.emergencyNote}>\n The global kill switch is engaged. The daemon refuses to tick <em>and</em> the agent&rsquo;s own write tools\n refuse to edit anything, anywhere — not just in enrolled repos.\n </p>\n </>\n ) : (\n <>\n <button type=\"button\" className={styles.emergencyButton} disabled={disabled} onClick={() => setConfirming('engage')}>\n Emergency stop\n </button>\n <p className={styles.emergencyNote}>\n Engages the global kill switch. Wider than &ldquo;stop the loop&rdquo;: it also disables the agent&rsquo;s own\n write tools everywhere until you release it. To halt only the loop, use <strong>Pause</strong>.\n {killUnknown ? ' The switch’s current state could not be read.' : ''}\n </p>\n </>\n )}\n </div>\n\n {guard.error && confirming === null ? (\n <p className={styles.capError} role=\"alert\">\n {guard.error}\n </p>\n ) : null}\n\n {lastNote && !guard.error ? (\n <p className={styles.actionNote} role=\"status\">\n {lastNote}\n </p>\n ) : null}\n\n <ConfirmDialog\n open={confirming === 'stop'}\n onClose={() => setConfirming(null)}\n title=\"Stop the autonomous loop?\"\n body={\n <>\n This is the ordinary stop, but it works by engaging the global kill switch — the same\n <code> ~/.ashlr/KILL </code> sentinel the emergency stop writes. While it is set, the agent&rsquo;s own write\n tools also refuse to edit anything, anywhere, until you release it from this panel.\n <br />\n <br />\n If you only want the loop to stop working, <strong>Pause</strong> does exactly that and nothing else — it\n leaves your own tools alone and undoes in one click.\n <br />\n <br />\n Nothing in flight is rolled back. The loop will not restart by itself.\n </>\n }\n confirmLabel=\"Stop loop\"\n destructive\n busy={guard.busy}\n error={guard.error}\n onConfirm={() =>\n guard.request(\n () => runDaemonAction('stop'),\n 'Stopping the autonomous loop requires the dispatch token.',\n (result) => {\n noteOf(result);\n setConfirming(null);\n },\n )\n }\n />\n\n <ConfirmDialog\n open={confirming === 'engage'}\n onClose={() => setConfirming(null)}\n title=\"Engage the emergency stop?\"\n body={\n <>\n This writes the global kill switch. It stops the autonomous loop <strong>and</strong> disables the\n agent&rsquo;s own write tools — every edit, apply, and merge path refuses while it is engaged, in every repo,\n not only the enrolled ones. Nothing in flight is rolled back; nothing new can start.\n <br />\n <br />\n <strong>Pause</strong> halts autonomous dispatch only and leaves everything else working.{' '}\n <strong>Stop loop</strong> is not narrower than this button: it engages the same global kill switch.\n </>\n }\n confirmLabel=\"Engage emergency stop\"\n destructive\n busy={guard.busy}\n error={guard.error}\n onConfirm={() =>\n guard.request(async () => {\n await engageEmergencyStop();\n setConfirming(null);\n }, 'Engaging the emergency stop requires the dispatch token.')\n }\n />\n\n <ConfirmDialog\n open={confirming === 'release'}\n onClose={() => setConfirming(null)}\n title=\"Release the emergency stop?\"\n body={\n <>\n This clears the global kill switch. Write tools become usable again immediately. The autonomous loop does\n not restart by itself — use <strong>Start loop</strong> when you want it running.\n </>\n }\n confirmLabel=\"Release emergency stop\"\n busy={guard.busy}\n error={guard.error}\n onConfirm={() =>\n guard.request(async () => {\n await releaseEmergencyStop();\n setConfirming(null);\n }, 'Releasing the emergency stop requires the dispatch token.')\n }\n />\n </section>\n );\n}\n","/**\n * routes/verse/autonomy/FleetPanel.tsx — what the fleet is doing right now.\n *\n * The test this panel has to pass: a reader should be able to answer \"is it\n * working, and on what\" without opening a log. That means three things on\n * screen at once —\n *\n * - a verdict in words at the top (`fleetPressure`), because \"4 agents\" is\n * not an answer if three of them are queued;\n * - slot occupancy against the EFFECTIVE concurrency, not the configured\n * slot count, so a full runtime reads as full;\n * - one row per agent with what it is working on and how long it has been\n * at it, ticking, because a stuck agent is identified by its elapsed time\n * and nothing else.\n *\n * The failure this panel exists to prevent: a queue that presents as slowness.\n * When turns are waiting, the panel says they are waiting, says they have not\n * started, and — on a runtime that serializes — says the queue drains one at a\n * time. Elapsed time for a queued turn is labelled as queued, never as work,\n * because those two numbers mean opposite things to whoever is deciding\n * whether something is wrong.\n */\nimport type { ReactNode } from 'react';\nimport { Meter } from '../../../components/primitives/Meter.js';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport { UNKNOWN, formatCount } from './format.js';\nimport type { FleetAgent, FleetSnapshot, OptionalFleetRead } from './fleet-contract.js';\nimport {\n elapsedSince,\n fleetPressure,\n orderAgents,\n runtimeCapacity,\n slotUtilisation,\n type RuntimeCapacity,\n} from './fleet-model.js';\nimport type { ServingRuntimeSnapshot } from './fleet-contract.js';\nimport { useNow } from './use-ticker.js';\nimport styles from './autonomy.module.css';\n\nconst PRESSURE_TONE: Record<string, Tone> = {\n idle: 'neutral',\n working: 'running',\n saturated: 'running',\n queued: 'warning',\n unknown: 'unknown',\n};\n\nconst AGENT_TONE: Record<FleetAgent['state'], Tone> = {\n running: 'running',\n finishing: 'running',\n queued: 'neutral',\n};\n\nexport interface FleetPanelProps {\n read: OptionalFleetRead<FleetSnapshot> | null;\n /** Needed for the EFFECTIVE concurrency; occupancy is meaningless without it. */\n runtime: ServingRuntimeSnapshot | null;\n loading?: boolean;\n}\n\nexport function FleetPanel({ read, runtime, loading = false }: FleetPanelProps): ReactNode {\n const now = useNow(1000);\n const fleet = read?.value ?? null;\n const capacity = runtimeCapacity(runtime);\n\n // Slot figures come from the fleet snapshot when it has them and from the\n // runtime otherwise — one number, two possible reporters, never two numbers.\n const busy = fleet?.slotsBusy ?? runtime?.slotsBusy ?? null;\n const utilisation = slotUtilisation(busy, capacity.effectiveConcurrency);\n const pressure = fleetPressure(fleet, utilisation, capacity);\n const agents = fleet ? orderAgents(fleet.agents) : [];\n const queued = fleet?.queueDepth ?? agents.filter((a) => a.state === 'queued').length;\n\n return (\n <section className={styles.panel} aria-labelledby=\"verse-fleet-title\">\n <div className={styles.panelHead}>\n <h3 id=\"verse-fleet-title\" className={styles.panelTitle}>\n Fleet in flight\n </h3>\n <p className={styles.panelNote}>\n Every agent mid-turn right now, what it is working on, and how long it has been at it.\n </p>\n </div>\n\n {loading && read === null ? (\n <p className={styles.empty}>Reading the fleet…</p>\n ) : read === null || (!read.available && read.value === null) ? (\n <p className={styles.empty}>\n <span className={styles.emptyStrong}>No fleet source. </span>\n {read?.reason ??\n 'Nothing answered for the fleet, so what is in flight cannot be listed. That is a missing reading, not an empty fleet.'}\n </p>\n ) : fleet === null ? (\n <p className={styles.empty}>\n <span className={styles.emptyStrong}>Unreadable reading. </span>\n {read.reason ?? 'The fleet reading could not be narrowed, so nothing is shown rather than guessed.'}\n </p>\n ) : (\n <>\n <div className={styles.pressure} data-state={pressure.state}>\n <span className={styles.pressureHead}>\n <span className={styles.pressureHeadline}>{pressure.headline}</span>\n <StatusBadge status={pressure.state} tone={PRESSURE_TONE[pressure.state] ?? 'unknown'}>\n {pressure.state}\n </StatusBadge>\n </span>\n <p className={styles.pressureDetail}>{pressure.detail}</p>\n </div>\n\n <div className={styles.fleetMeters}>\n <Meter\n value={utilisation.busy}\n max={utilisation.total}\n label=\"Slot utilisation\"\n valueText={\n utilisation.percent === null\n ? 'unknown'\n : `${utilisation.busy} / ${utilisation.total} · ${utilisation.percent}%`\n }\n tone={utilisation.saturated ? 'warning' : undefined}\n />\n <div className={styles.fact}>\n <span className={styles.factLabel}>Queue depth</span>\n <span\n className={styles.factValue}\n data-tone={queued > 0 ? 'warning' : undefined}\n >\n {fleet.queueDepth === null && agents.length === 0\n ? UNKNOWN\n : `${formatCount(queued)} waiting`}\n </span>\n </div>\n </div>\n\n {utilisation.saturated && queued === 0 ? (\n <p className={styles.capHelp}>\n Every slot is occupied. Nothing is waiting yet, but the next turn will.\n </p>\n ) : null}\n\n {agents.length === 0 ? (\n <p className={styles.empty}>\n <span className={styles.emptyStrong}>Nothing in flight. </span>\n No agent is mid-turn. The fleet answered and reported an empty list — an idle fleet,\n not a missing reading.\n </p>\n ) : (\n <div className={styles.tableScroll}>\n <table className={styles.table}>\n <caption className={styles.srOnly}>\n Agents in flight: state, task, repository, model, slot and elapsed time\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">State</th>\n <th scope=\"col\">Working on</th>\n <th scope=\"col\">Repo</th>\n <th scope=\"col\">Model</th>\n <th scope=\"col\">Slot</th>\n <th scope=\"col\">Elapsed</th>\n </tr>\n </thead>\n <tbody>\n {agents.map((agent) => (\n <AgentRow key={agent.id} agent={agent} now={now} capacity={capacity} />\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {fleet.notes.length > 0 ? (\n <ul className={styles.noteList}>\n {fleet.notes.map((n) => (\n <li key={n} className={styles.capHelp}>\n {n}\n </li>\n ))}\n </ul>\n ) : null}\n </>\n )}\n </section>\n );\n}\n\n/**\n * One agent.\n *\n * The elapsed column is the reason this table exists, and it is the column\n * most easily made to lie: for a QUEUED turn the same number is time spent\n * waiting, not time spent working. Labelling it \"queued\" rather than letting\n * it sit under the same header as a running turn's duration is the difference\n * between \"this one is stuck\" and \"this one has not started\".\n */\nfunction AgentRow({\n agent,\n now,\n capacity,\n}: {\n agent: FleetAgent;\n now: number;\n capacity: RuntimeCapacity;\n}): ReactNode {\n const elapsed = elapsedSince(agent.startedAt, now);\n const queued = agent.state === 'queued';\n return (\n <tr>\n <td>\n <StatusBadge status={agent.state} tone={AGENT_TONE[agent.state]}>\n {agent.state}\n </StatusBadge>\n </td>\n <td className={styles.cellSummary}>\n {agent.task ?? <span className={styles.capHelp}>not reported</span>}\n </td>\n <td className={styles.cellRepo}>{agent.repo ?? UNKNOWN}</td>\n <td className={styles.cellRepo}>{agent.model ?? agent.engine ?? UNKNOWN}</td>\n <td className={styles.cellTime}>\n {agent.slot === null ? (\n queued ? (\n <span\n className={styles.capHelp}\n title={\n capacity.verdict === 'serialized'\n ? 'This runtime serializes, so only one slot ever frees up at a time.'\n : undefined\n }\n >\n no slot\n </span>\n ) : (\n UNKNOWN\n )\n ) : (\n `#${agent.slot}`\n )}\n </td>\n <td className={styles.cellTime}>\n {elapsed}\n {queued ? <span className={styles.elapsedQualifier}> queued</span> : null}\n </td>\n </tr>\n );\n}\n","/**\n * routes/verse/autonomy/GoalsBacklogPanel.tsx — read-only context for what the\n * loop is aiming at and what it has queued.\n *\n * V2 is explicit that goal mutation stays out of this surface, so there are no\n * controls here at all — only the two existing reads. `GET /api/backlog`\n * returns `null` when no backlog has been built, which is \"not yet\", not an\n * error, and renders as such.\n */\nimport { SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { verseBacklogQuery, verseGoalsQuery } from './control-queries.js';\nimport styles from './autonomy.module.css';\n\nconst MAX_ROWS = 8;\n\nexport function GoalsBacklogPanel() {\n const goals = useQuery(verseGoalsQuery);\n const backlog = useQuery(verseBacklogQuery);\n\n const activeGoals = (goals.data ?? []).filter((g) => g.status !== 'done' && g.status !== 'archived');\n const items = backlog.data?.items ?? [];\n\n return (\n <section className={styles.panel} aria-label=\"Goals and backlog\">\n <div className={styles.panelHead}>\n <h3 className={styles.panelTitle}>Goals and backlog</h3>\n <p className={styles.panelNote}>Read-only in this view.</p>\n </div>\n\n <div className={styles.summaryColumns}>\n <div>\n <p className={styles.factLabel}>Active goals</p>\n {goals.status === 'loading' ? (\n <div className={styles.skeletons}>\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : goals.status === 'error' ? (\n <p className={styles.error} role=\"alert\">\n {goals.error?.message ?? 'Could not read goals.'}\n </p>\n ) : activeGoals.length === 0 ? (\n <p className={styles.empty}>No active goals. The loop falls back to the backlog for work.</p>\n ) : (\n <div className={styles.summaryList}>\n {activeGoals.slice(0, MAX_ROWS).map((goal) => {\n const done = Math.round((goal.progress?.fractionDone ?? 0) * 100);\n return (\n <div className={styles.summaryRow} key={goal.id}>\n <span className={styles.summaryTitle} title={goal.objective}>\n {goal.objective}\n </span>\n <span className={styles.summaryMeta}>\n {done}% · {goal.status}\n </span>\n </div>\n );\n })}\n {activeGoals.length > MAX_ROWS ? (\n <p className={styles.panelNote}>+{activeGoals.length - MAX_ROWS} more</p>\n ) : null}\n </div>\n )}\n </div>\n\n <div>\n <p className={styles.factLabel}>Backlog</p>\n {backlog.status === 'loading' ? (\n <div className={styles.skeletons}>\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : backlog.status === 'error' ? (\n <p className={styles.error} role=\"alert\">\n {backlog.error?.message ?? 'Could not read the backlog.'}\n </p>\n ) : backlog.data?.absent ? (\n <p className={styles.empty}>No backlog has been built yet — run a tick, or `ashlr backlog`, to produce one.</p>\n ) : items.length === 0 ? (\n <p className={styles.empty}>The backlog is empty. A tick with nothing to do records `no-backlog` and idles.</p>\n ) : (\n <div className={styles.summaryList}>\n {items.slice(0, MAX_ROWS).map((item, i) => (\n <div className={styles.summaryRow} key={item.id ?? `${item.title ?? 'item'}-${i}`}>\n <span className={styles.summaryTitle} title={item.title}>\n {item.title ?? item.id ?? 'untitled item'}\n </span>\n <span className={styles.summaryMeta}>\n {item.repo ? item.repo.split('/').pop() : '—'}\n {typeof item.score === 'number' ? ` · ${item.score}` : ''}\n </span>\n </div>\n ))}\n {items.length > MAX_ROWS ? <p className={styles.panelNote}>+{items.length - MAX_ROWS} more</p> : null}\n </div>\n )}\n </div>\n </div>\n </section>\n );\n}\n","/**\n * routes/verse/autonomy/fleet-queries.ts — the reads and writes behind the\n * local-fleet surfaces: `GET/POST /api/verse/runtime`,\n * `GET/POST /api/verse/local-only`, and `GET /api/verse/fleet`.\n *\n * Same contract as control-queries.ts — reads are QueryDefs consumed through\n * useQuery, writes go through the mutation-token gate and invalidate exactly\n * the keys they affect — with two differences that both come from these three\n * routes landing in parallel with this surface (owners R, L, F):\n *\n * 1. **The reads do not throw on absence.** A server without these routes\n * answers 404, and a 404 means \"this panel has no source yet\", not\n * \"Autonomy is broken\". The panels render a designed degraded state from\n * `OptionalFleetRead.reason`. 401 still propagates: an expired read\n * session is an unauthorized state for the whole surface.\n * 2. **The bodies are narrowed structurally, not cast.** `fleet-model.ts`\n * projects every field, so a name drift between the route and this client\n * degrades to \"unknown\" rather than throwing at render time.\n *\n * Polling: the fleet and the runtime are the two things on this screen that\n * change while nobody clicks anything, and neither has an SSE event yet, so\n * `useFleetPolling` re-reads them on an interval — pausing while the tab is\n * hidden, because a background tab polling a runtime probe is pure waste.\n */\nimport { useEffect } from 'react';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { useRefetch } from '../../../data/hooks.js';\nimport { VERSE_CONTROL_KEY, VerseControlLockedError } from './control-queries.js';\nimport type {\n FleetSnapshot,\n LocalOnlyPolicy,\n LocalOnlyUpdateResult,\n OptionalFleetRead,\n RuntimeAction,\n RuntimeActionResult,\n ServingRuntimeSnapshot,\n} from './fleet-contract.js';\nimport { projectFleet, projectLocalOnly, projectServingRuntime } from './fleet-model.js';\n\nexport const VERSE_RUNTIME_KEY = 'verse-runtime';\nexport const VERSE_FLEET_KEY = 'verse-fleet';\nexport const VERSE_LOCAL_ONLY_KEY = 'verse-local-only';\n\nfunction describeAbsence(path: string, err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) {\n return `This server does not expose ${path}, so this panel has no source. It is a missing route, not an idle machine.`;\n }\n return `${path} answered HTTP ${err.status}.`;\n }\n return `${path} could not be reached.`;\n}\n\n/**\n * One optional read, projected. `value` is null both when the route was absent\n * and when it answered something this client could not narrow — `available`\n * and `reason` are what tell the two apart.\n */\nfunction optionalRead<T>(\n path: string,\n project: (raw: unknown) => T | null,\n): (signal?: AbortSignal) => Promise<OptionalFleetRead<T>> {\n return async (signal) => {\n try {\n const raw = await apiGet<unknown>(path, signal);\n const value = project(raw);\n if (value === null) {\n return {\n value: null,\n available: true,\n reason: `${path} answered in a shape this client does not recognise, so nothing is shown rather than guessed.`,\n };\n }\n return { value, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { value: null, available: false, reason: describeAbsence(path, err) };\n }\n };\n}\n\n/** GET /api/verse/runtime — is the serving runtime up, and what can it do. */\nexport const servingRuntimeQuery: QueryDef<OptionalFleetRead<ServingRuntimeSnapshot>> = {\n key: VERSE_RUNTIME_KEY,\n fetch: optionalRead('/api/verse/runtime', projectServingRuntime),\n};\n\n/** GET /api/verse/fleet — the agents in flight right now. */\nexport const fleetQuery: QueryDef<OptionalFleetRead<FleetSnapshot>> = {\n key: VERSE_FLEET_KEY,\n fetch: optionalRead('/api/verse/fleet', projectFleet),\n};\n\n/** GET /api/verse/local-only — the refusal policy and what it refuses. */\nexport const localOnlyQuery: QueryDef<OptionalFleetRead<LocalOnlyPolicy>> = {\n key: VERSE_LOCAL_ONLY_KEY,\n fetch: optionalRead('/api/verse/local-only', projectLocalOnly),\n};\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseControlLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/**\n * Start / stop / restart the serving runtime.\n *\n * Every one of these changes what the fleet can do, so all three fleet keys\n * and the control snapshot are invalidated together — a restarted runtime\n * with a stale slot count beside it is exactly the disagreement this surface\n * exists to prevent.\n */\nexport async function runRuntimeAction(action: RuntimeAction): Promise<RuntimeActionResult> {\n const result = await post<RuntimeActionResult>('/api/verse/runtime', { action });\n invalidate(VERSE_RUNTIME_KEY);\n invalidate(VERSE_FLEET_KEY);\n invalidate(VERSE_CONTROL_KEY);\n return result;\n}\n\n/** Turn the local-only refusal on or off. */\nexport async function setLocalOnly(enabled: boolean): Promise<LocalOnlyUpdateResult> {\n const result = await post<LocalOnlyUpdateResult>('/api/verse/local-only', { enabled });\n invalidate(VERSE_LOCAL_ONLY_KEY);\n invalidate(VERSE_CONTROL_KEY);\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Polling\n// ---------------------------------------------------------------------------\n\n/** Fast enough that \"is it working\" is answered live; slow enough to be free. */\nexport const FLEET_POLL_MS = 4000;\n\n/**\n * Keep the runtime and fleet reads live while this section is mounted and the\n * tab is visible.\n *\n * Both routes probe a local process, so this is cheap — but only while someone\n * is looking. `visibilitychange` stops the timer when the tab is hidden and\n * takes one immediate reading when it comes back, so a fleet view returned to\n * after lunch is current on the first frame rather than up to an interval old.\n */\nexport function useFleetPolling(intervalMs: number = FLEET_POLL_MS): void {\n const refetchRuntime = useRefetch(servingRuntimeQuery);\n const refetchFleet = useRefetch(fleetQuery);\n\n useEffect(() => {\n let timer: ReturnType<typeof setInterval> | null = null;\n\n const tick = (): void => {\n refetchRuntime();\n refetchFleet();\n };\n\n const start = (): void => {\n if (timer !== null) return;\n timer = setInterval(tick, intervalMs);\n };\n\n const stop = (): void => {\n if (timer === null) return;\n clearInterval(timer);\n timer = null;\n };\n\n const onVisibility = (): void => {\n if (document.visibilityState === 'hidden') {\n stop();\n return;\n }\n tick();\n start();\n };\n\n if (document.visibilityState !== 'hidden') start();\n document.addEventListener('visibilitychange', onVisibility);\n return () => {\n stop();\n document.removeEventListener('visibilitychange', onVisibility);\n };\n }, [intervalMs, refetchRuntime, refetchFleet]);\n}\n","/**\n * routes/verse/autonomy/LocalOnlyPanel.tsx — the local-only switch, and an\n * honest account of what flipping it does.\n *\n * Local-only is a REFUSAL, not a preference (docs/LOCAL-FLEET.md). Cloud\n * engines become unreachable: `provider-client.ts` throws on a cloud provider\n * without `--allow-cloud` and `router.ts` checks `cloudKeyAvailable`. Calling\n * that \"prefer local models\" would be the single most expensive piece of\n * wrong copy in the app, because an operator who reads it as a preference will\n * assume a frontier dispatch is merely unlikely rather than impossible — and\n * the whole point of the switch is to make accidental spend impossible.\n *\n * So the panel does two things a toggle usually does not:\n *\n * 1. It states the refusal in the present tense, in the operator's own\n * words back to them, before the click.\n * 2. It names, from the LIVE seat roster, exactly which of THEIR seats stop\n * working. \"Blocks cloud engines\" is abstract; \"blocks 3 of your 5 seats,\n * here they are\" is a decision an operator can actually make.\n *\n * Turning it ON is confirm-guarded even though it is reversible, because the\n * blast radius is the point. Turning it OFF is not: re-opening a door the\n * operator deliberately closed is their call, and a dialog there would only\n * teach them to click through dialogs.\n */\nimport { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { StatusBadge } from '../../../components/primitives/StatusBadge.js';\nimport { ConfirmDialog } from '../../inbox/ConfirmDialog.js';\nimport type { LocalOnlyPolicy, OptionalFleetRead } from './fleet-contract.js';\nimport { localOnlyImpact, localOnlySourceNote, type SeatLike } from './fleet-model.js';\nimport { setLocalOnly } from './fleet-queries.js';\nimport type { GuardedAction } from './use-guarded-action.js';\nimport styles from './autonomy.module.css';\n\nexport interface LocalOnlyPanelProps {\n read: OptionalFleetRead<LocalOnlyPolicy> | null;\n /** The live seat roster, so the blast radius is the operator's own number. */\n seats: readonly SeatLike[];\n guard: GuardedAction;\n dispatchEnabled: boolean;\n loading?: boolean;\n}\n\nexport function LocalOnlyPanel({\n read,\n seats,\n guard,\n dispatchEnabled,\n loading = false,\n}: LocalOnlyPanelProps): ReactNode {\n const [confirming, setConfirming] = useState(false);\n const [note, setNote] = useState<string | null>(null);\n\n const policy = read?.value ?? null;\n const impact = localOnlyImpact(policy, seats);\n const sourceNote = localOnlySourceNote(policy);\n const enabled = policy?.enabled ?? false;\n const locked = !dispatchEnabled || guard.readOnly;\n const disabled = locked || guard.busy || !(policy?.mutable ?? false);\n\n const apply = (next: boolean): void => {\n guard.request(\n () => setLocalOnly(next),\n next\n ? 'Turning local-only on requires the dispatch token.'\n : 'Turning local-only off requires the dispatch token.',\n (result) => {\n setNote(result.note || null);\n setConfirming(false);\n },\n );\n };\n\n return (\n <section className={styles.panel} aria-labelledby=\"verse-local-only-title\">\n <div className={styles.panelHead}>\n <h3 id=\"verse-local-only-title\" className={styles.panelTitle}>\n Local only\n </h3>\n <p className={styles.panelNote}>\n A refusal, not a preference. While it is on, cloud engines are unreachable.\n </p>\n </div>\n\n {loading && read === null ? (\n <p className={styles.empty}>Reading the local-only policy…</p>\n ) : read === null || policy === null ? (\n <p className={styles.empty}>\n <span className={styles.emptyStrong}>No local-only source. </span>\n {read?.reason ??\n 'Nothing answered for the local-only policy, so whether cloud engines are reachable cannot be stated here. It is not shown as off — an unread switch is not a switch that is off.'}\n </p>\n ) : (\n <>\n <div className={styles.toggleRow}>\n <span className={styles.toggleState} data-on={enabled ? 'true' : 'false'}>\n <StatusBadge\n status={enabled ? 'local-only-on' : 'local-only-off'}\n tone={enabled ? 'success' : 'neutral'}\n >\n {enabled ? 'on — cloud refused' : 'off — cloud reachable'}\n </StatusBadge>\n </span>\n <button\n type=\"button\"\n className={`${styles.button} ${enabled ? '' : styles.buttonPrimary}`}\n disabled={disabled}\n aria-pressed={enabled}\n onClick={() => (enabled ? apply(false) : setConfirming(true))}\n >\n {enabled ? 'Turn local-only off' : 'Turn local-only on'}\n </button>\n </div>\n\n <p className={styles.policyExplain}>\n {enabled ? (\n <>\n Every non-local engine is <strong>refused at dispatch</strong>. A turn sent to one\n does not fall back, does not queue, and does not run more slowly — it fails with a\n named refusal. Nothing can spend money while this is on.\n </>\n ) : (\n <>\n Cloud engines are reachable. Turning this on makes them <strong>unreachable</strong>,\n not deprioritised: a dispatch to one fails outright rather than being routed\n elsewhere. That is the difference between a budget and a guarantee.\n </>\n )}\n </p>\n\n {sourceNote ? <p className={styles.capHelp}>{sourceNote}</p> : null}\n {!policy.mutable && dispatchEnabled && !guard.readOnly ? (\n <p className={styles.actionNote} role=\"status\">\n This switch is not editable from here, so it is shown read-only rather than as a\n control that would refuse the click.\n </p>\n ) : null}\n\n <div className={styles.impact}>\n <h4 className={styles.impactTitle}>\n {enabled ? 'What is blocked right now' : 'What this would block'}\n </h4>\n <p className={styles.impactSummary}>{impact.summary}</p>\n\n {impact.blocked.length > 0 ? (\n <ul className={styles.seatList}>\n {impact.blocked.map((seat) => (\n <li key={seat.id} className={styles.seatRow}>\n <span className={styles.seatEngine} data-engine={seat.engine}>\n {seat.engine}\n </span>\n <span className={styles.seatLabel}>{seat.label}</span>\n <span className={styles.seatRefusal}>{impact.refusalFor(seat.engine)}</span>\n </li>\n ))}\n </ul>\n ) : null}\n\n {impact.allowed.length > 0 ? (\n <p className={styles.capHelp}>\n Still reachable:{' '}\n {impact.allowed.map((s) => s.label).join(', ')}. Local seats cost nothing to run and\n are unaffected by this switch.\n </p>\n ) : (\n <p className={styles.capHelp}>\n No local seat is configured. With local-only on there would be nothing left to\n dispatch to — add a local seat before relying on this switch.\n </p>\n )}\n </div>\n\n {note && !guard.error ? (\n <p className={styles.actionNote} role=\"status\">\n {note}\n </p>\n ) : null}\n\n {guard.error && !confirming ? (\n <p className={styles.capError} role=\"alert\">\n {guard.error}\n </p>\n ) : null}\n\n <ConfirmDialog\n open={confirming}\n onClose={() => setConfirming(false)}\n title=\"Make cloud engines unreachable?\"\n body={\n <>\n This is a refusal, not a routing preference. While local-only is on, a dispatch to a\n non-local engine <strong>fails</strong> with a named refusal — it does not fall back\n to a local seat and it does not wait.\n <br />\n <br />\n {impact.blocked.length === 0\n ? 'No seat on this machine is affected today: every configured seat is local.'\n : `${impact.blocked.length} of your ${seats.length} seats stop working: ${impact.blocked\n .map((s) => s.label)\n .join(', ')}.`}\n <br />\n <br />\n It is reversible from this panel at any time.\n </>\n }\n confirmLabel=\"Turn local-only on\"\n busy={guard.busy}\n error={guard.error}\n onConfirm={() => apply(true)}\n />\n </>\n )}\n </section>\n );\n}\n","/**\n * routes/verse/autonomy/LocalRuntimePanel.tsx — the serving runtime, which is\n * the thing that makes a local fleet possible at all.\n *\n * Read order, top to bottom, because that is the order the questions arrive:\n * is it up, what is it serving, how many agents can it actually run at once,\n * how full is it, and how do I start or stop it.\n *\n * The third question is the one this panel is really for. A runtime's\n * CONFIGURED slot count and its EFFECTIVE concurrency are different numbers\n * whenever the runtime refuses to batch, and printing the configured one is\n * how four agents become a four-deep queue that reads as slowness. So the big\n * number on this panel is `capacity.effectiveConcurrency` — never\n * `slotsTotal` — and when they disagree the panel says which is which and\n * shows the measurement behind the claim (docs/LOCAL-FLEET.md).\n *\n * State is never carried by colour alone: every tone is paired with a word\n * (StatusBadge) and a sentence.\n */\nimport { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport { Meter } from '../../../components/primitives/Meter.js';\nimport { ConfirmDialog } from '../../inbox/ConfirmDialog.js';\nimport { UNKNOWN } from './format.js';\nimport type {\n OptionalFleetRead,\n RuntimeAction,\n ServingRuntimeSnapshot,\n} from './fleet-contract.js';\nimport {\n CONCURRENCY_EVIDENCE,\n formatContextTokens,\n formatUptime,\n runtimeCapacity,\n runtimeLabel,\n slotUtilisation,\n type RuntimeCapacity,\n} from './fleet-model.js';\nimport { runRuntimeAction } from './fleet-queries.js';\nimport { useNow } from './use-ticker.js';\nimport type { GuardedAction } from './use-guarded-action.js';\nimport styles from './autonomy.module.css';\n\nconst STATE_TONE: Record<ServingRuntimeSnapshot['state'], Tone> = {\n running: 'success',\n starting: 'running',\n stopping: 'running',\n stopped: 'neutral',\n unknown: 'unknown',\n};\n\nconst CAPACITY_TONE: Record<RuntimeCapacity['tone'], Tone> = {\n success: 'success',\n warning: 'warning',\n danger: 'danger',\n neutral: 'neutral',\n unknown: 'unknown',\n};\n\nexport interface LocalRuntimePanelProps {\n read: OptionalFleetRead<ServingRuntimeSnapshot> | null;\n guard: GuardedAction;\n dispatchEnabled: boolean;\n /** Shown while the read is in flight and nothing has arrived yet. */\n loading?: boolean;\n}\n\nexport function LocalRuntimePanel({\n read,\n guard,\n dispatchEnabled,\n loading = false,\n}: LocalRuntimePanelProps): ReactNode {\n const now = useNow(1000);\n const [confirmStop, setConfirmStop] = useState<RuntimeAction | null>(null);\n const [note, setNote] = useState<string | null>(null);\n\n const runtime = read?.value ?? null;\n const capacity = runtimeCapacity(runtime);\n const utilisation = slotUtilisation(runtime?.slotsBusy ?? null, capacity.effectiveConcurrency);\n const locked = !dispatchEnabled || guard.readOnly;\n const supervised = runtime?.supervised ?? false;\n const disabled = locked || guard.busy || !supervised;\n const running = runtime?.state === 'running';\n\n const act = (action: RuntimeAction, reason: string): void => {\n guard.request(\n () => runRuntimeAction(action),\n reason,\n (result) => {\n setNote(result.note || null);\n setConfirmStop(null);\n },\n );\n };\n\n return (\n <section className={styles.panel} aria-labelledby=\"verse-runtime-title\">\n <div className={styles.panelHead}>\n <h3 id=\"verse-runtime-title\" className={styles.panelTitle}>\n Serving runtime\n </h3>\n <p className={styles.panelNote}>\n The process that answers local agent turns. Without it, a local fleet has nowhere to run.\n </p>\n </div>\n\n {loading && read === null ? (\n <p className={styles.empty}>Reading the serving runtime…</p>\n ) : read === null || (!read.available && read.value === null) ? (\n <p className={styles.empty}>\n <span className={styles.emptyStrong}>No serving-runtime source. </span>\n {read?.reason ??\n 'Nothing answered for the serving runtime, so whether a local fleet can run cannot be stated here.'}\n </p>\n ) : runtime === null ? (\n <p className={styles.empty}>\n <span className={styles.emptyStrong}>Unreadable reading. </span>\n {read.reason ?? 'The serving-runtime reading could not be narrowed, so nothing is shown rather than guessed.'}\n </p>\n ) : (\n <>\n <div className={styles.runtimeTop}>\n <span className={styles.runtimeState} data-state={runtime.state}>\n <span className={styles.runDot} aria-hidden=\"true\" />\n <span className={styles.runtimeStateText}>\n {runtimeLabel(runtime.kind)}\n {' · '}\n {runtime.state === 'unknown' ? 'state unknown' : runtime.state}\n </span>\n </span>\n <StatusBadge status={runtime.state} tone={STATE_TONE[runtime.state]}>\n {runtime.state === 'running' ? 'serving' : runtime.state}\n </StatusBadge>\n {runtime.reason ? (\n <code className={styles.evidenceCode}>{runtime.reason}</code>\n ) : null}\n </div>\n\n <div className={styles.facts}>\n <Fact label=\"Model\" value={runtime.model ?? UNKNOWN} wide />\n <Fact label=\"Endpoint\" value={runtime.endpoint ?? UNKNOWN} mono />\n <Fact label=\"Context\" value={formatContextTokens(runtime.contextTokens)} />\n <Fact\n label=\"Slots configured\"\n value={runtime.slotsTotal === null ? UNKNOWN : String(runtime.slotsTotal)}\n />\n <Fact\n label=\"Uptime\"\n value={running ? formatUptime(runtime.startedAt, now) : 'not running'}\n />\n </div>\n\n {/* The headline number. Deliberately the EFFECTIVE concurrency, so a\n runtime that will not batch cannot advertise its slot count. */}\n <div className={styles.capacityBlock} data-verdict={capacity.verdict}>\n <div className={styles.capacityHead}>\n <span className={styles.capacityBig}>\n {capacity.effectiveConcurrency === null ? UNKNOWN : capacity.effectiveConcurrency}\n </span>\n <div className={styles.capacityWords}>\n <span className={styles.capacityHeadline}>\n {capacity.headline}\n <StatusBadge status={capacity.verdict} tone={CAPACITY_TONE[capacity.tone]}>\n {capacity.verdict === 'batched'\n ? 'batches'\n : capacity.verdict === 'serialized'\n ? 'serializes'\n : capacity.verdict === 'offline'\n ? 'not serving'\n : 'unconfirmed'}\n </StatusBadge>\n </span>\n <span className={styles.capacityDetail}>{capacity.detail}</span>\n </div>\n </div>\n\n {capacity.overstated ? (\n <ConcurrencyEvidence\n configured={capacity.configuredSlots}\n refusal={runtime.parallel.refusal}\n />\n ) : null}\n </div>\n\n <div className={styles.utilisation}>\n <Meter\n value={utilisation.busy}\n max={utilisation.total}\n label=\"Slots in use\"\n valueText={\n utilisation.percent === null\n ? 'unknown'\n : `${utilisation.busy} / ${utilisation.total}`\n }\n tone={utilisation.saturated ? 'warning' : undefined}\n />\n <p className={styles.capHelp}>{utilisation.label}</p>\n </div>\n\n <div className={styles.controls}>\n <button\n type=\"button\"\n className={`${styles.button} ${styles.buttonPrimary}`}\n disabled={disabled || running}\n onClick={() => act('start', 'Starting the serving runtime requires the dispatch token.')}\n >\n Start runtime\n </button>\n <button\n type=\"button\"\n className={styles.button}\n disabled={disabled || !running}\n onClick={() => setConfirmStop('stop')}\n >\n Stop runtime\n </button>\n <button\n type=\"button\"\n className={styles.button}\n disabled={disabled}\n onClick={() => setConfirmStop('restart')}\n >\n Restart runtime\n </button>\n </div>\n\n {!supervised ? (\n <p className={styles.actionNote} role=\"status\">\n This runtime is managed outside the hub, so it cannot be started or stopped from here.\n Whoever launched it — a login item, a terminal — still owns it; these controls stay\n disabled rather than sending an action that cannot land.\n </p>\n ) : null}\n\n {note && !guard.error ? (\n <p className={styles.actionNote} role=\"status\">\n {note}\n </p>\n ) : null}\n\n {guard.error && confirmStop === null ? (\n <p className={styles.capError} role=\"alert\">\n {guard.error}\n </p>\n ) : null}\n\n <ConfirmDialog\n open={confirmStop === 'stop'}\n onClose={() => setConfirmStop(null)}\n title=\"Stop the serving runtime?\"\n body={\n <>\n Every local agent turn in flight is answered by this process. Stopping it ends those\n turns — nothing in flight is rolled back, and no local seat can take a new turn until\n it is running again.\n <br />\n <br />\n This does not touch the autonomous loop, the kill switch, or your own write tools.\n </>\n }\n confirmLabel=\"Stop runtime\"\n destructive\n busy={guard.busy}\n error={guard.error}\n onConfirm={() => act('stop', 'Stopping the serving runtime requires the dispatch token.')}\n />\n\n <ConfirmDialog\n open={confirmStop === 'restart'}\n onClose={() => setConfirmStop(null)}\n title=\"Restart the serving runtime?\"\n body={\n <>\n The process is stopped and started again. Turns in flight end with it, and the first\n turn afterwards pays the model load — on a 27 GB model that is not instant.\n <br />\n <br />\n Restart is the way to pick up a changed slot count or context size, since both are\n fixed at launch.\n </>\n }\n confirmLabel=\"Restart runtime\"\n destructive\n busy={guard.busy}\n error={guard.error}\n onConfirm={() =>\n act('restart', 'Restarting the serving runtime requires the dispatch token.')\n }\n />\n </>\n )}\n </section>\n );\n}\n\n/**\n * The measurement behind \"this runtime will not honour that slot count\".\n *\n * Shown only when the two numbers actually disagree, because an operator on a\n * runtime that batches does not need to be argued with. It is presented as\n * measured data with its per-request times, not as a claim: the stagger in one\n * row and the dead heat in the other are the whole argument.\n */\nfunction ConcurrencyEvidence({\n configured,\n refusal,\n}: {\n configured: number | null;\n refusal: string | null;\n}): ReactNode {\n return (\n <div className={styles.evidence}>\n <p className={styles.evidenceLead}>\n {configured === null\n ? 'The configured slot count is not a concurrency on this runtime.'\n : `${configured} slots are configured, but this runtime will not run them in parallel. Measured on this machine, four concurrent requests to the same model:`}\n </p>\n {/* Four columns of numerals do not fit a 900px window beside the rest\n of the cockpit, so the table gets its own scroll container rather\n than forcing the page body to scroll sideways. */}\n <div className={styles.evidenceScroll}>\n <table className={styles.evidenceTable}>\n <caption className={styles.srOnly}>\n Four concurrent requests to the same Qwen3.8 model file, per-runtime completion times in\n seconds\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">Runtime</th>\n <th scope=\"col\">Per request (s)</th>\n <th scope=\"col\">Wall (s)</th>\n <th scope=\"col\">Finished</th>\n </tr>\n </thead>\n <tbody>\n {CONCURRENCY_EVIDENCE.map((row) => (\n <tr key={row.runtime}>\n <th scope=\"row\">{row.runtime}</th>\n <td className={styles.evidenceNums}>{row.perRequestSeconds.join(' · ')}</td>\n <td className={styles.evidenceNums}>{row.wallSeconds.toFixed(1)}</td>\n <td>{row.verdict}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {refusal ? (\n <p className={styles.capHelp}>\n The runtime&rsquo;s own words: <code className={styles.evidenceCode}>{refusal}</code>\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction Fact({\n label,\n value,\n mono = false,\n wide = false,\n}: {\n label: string;\n value: string;\n mono?: boolean;\n wide?: boolean;\n}): ReactNode {\n return (\n <div className={`${styles.fact} ${wide ? styles.factWide : ''}`}>\n <span className={styles.factLabel}>{label}</span>\n <span className={`${styles.factValue} ${mono ? styles.factMono : ''}`}>{value}</span>\n </div>\n );\n}\n","/**\n * routes/verse/autonomy/overnight-model.ts — the pure half of the Overnight\n * panel: narrow the server's body, resolve the operator's stop rule, and\n * derive the one line that says how far the run is from stopping.\n *\n * Framework-free so it unit-tests without a DOM, and separate from the panel\n * because two of these functions are where the panel can most easily start\n * lying:\n *\n * - `projectOvernight` NARROWS, it does not cast. The route is being written\n * by another owner in parallel with this surface, so a field that drifts in\n * name or type has to degrade to `null` — which the panel renders as \"not\n * stated\" — rather than reach a render as `undefined` and crash, or reach\n * it as `0` and read as a fact. Same discipline as `fleet-model.ts`.\n * - `stopProgress` never invents a denominator. \"Until I pause it\" has no\n * progress, and drawing a bar for it would be a picture of a finish line\n * that does not exist.\n */\nimport { formatDuration, UNKNOWN } from './format.js';\nimport type {\n OvernightDiscard,\n OvernightGate,\n OvernightMerge,\n OvernightRun,\n OvernightStatus,\n OvernightStopRule,\n OvernightStopRuleKind,\n} from './overnight-contract.js';\n\n// ---------------------------------------------------------------------------\n// Narrowing\n// ---------------------------------------------------------------------------\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction str(value: unknown): string | null {\n return typeof value === 'string' && value.trim() !== '' ? value : null;\n}\n\nfunction bool(value: unknown): boolean | null {\n return typeof value === 'boolean' ? value : null;\n}\n\n/** A count. Negative and non-finite are not counts, so they are not observed. */\nfunction count(value: unknown): number | null {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) return null;\n return Math.floor(value);\n}\n\nexport function projectStopRule(raw: unknown): OvernightStopRule | null {\n if (!isRecord(raw)) return null;\n const kind = str(raw['kind']);\n if (kind === 'until-paused') return { kind: 'until-paused' };\n if (kind === 'at-time') {\n const at = str(raw['at']);\n // An unparseable instant is worse than no rule: it would render as a\n // countdown to NaN. Refuse it here so the panel can say \"not stated\".\n if (at === null || Number.isNaN(Date.parse(at))) return null;\n return { kind: 'at-time', at };\n }\n if (kind === 'after-iterations') {\n const iterations = count(raw['iterations']);\n if (iterations === null || iterations <= 0) return null;\n return { kind: 'after-iterations', iterations };\n }\n return null;\n}\n\nfunction projectMerges(raw: unknown): OvernightMerge[] {\n if (!Array.isArray(raw)) return [];\n const out: OvernightMerge[] = [];\n for (const [index, item] of raw.entries()) {\n if (!isRecord(item)) continue;\n const repo = str(item['repo']);\n if (repo === null) continue;\n out.push({\n id: str(item['id']) ?? `${repo}:${index}`,\n repo,\n title: str(item['title']) ?? 'untitled change',\n at: str(item['at']),\n commit: str(item['commit']),\n });\n }\n return out;\n}\n\nfunction projectDiscards(raw: unknown): OvernightDiscard[] {\n if (!Array.isArray(raw)) return [];\n const out: OvernightDiscard[] = [];\n for (const [index, item] of raw.entries()) {\n if (!isRecord(item)) continue;\n const repo = str(item['repo']);\n if (repo === null) continue;\n out.push({\n id: str(item['id']) ?? `${repo}:${index}`,\n repo,\n title: str(item['title']) ?? 'untitled change',\n at: str(item['at']),\n // A discard with no stated reason is the one row an operator will ask\n // about in the morning, so it says that it has none rather than being\n // rendered as a blank cell.\n reason: str(item['reason']) ?? 'no reason recorded',\n });\n }\n return out;\n}\n\nfunction projectGate(raw: unknown): OvernightGate | null {\n if (!isRecord(raw)) return null;\n return {\n tests: bool(raw['tests']),\n lint: bool(raw['lint']),\n typecheck: bool(raw['typecheck']),\n autoMerge: bool(raw['autoMerge']),\n branch: str(raw['branch']),\n };\n}\n\nfunction projectRun(raw: unknown): OvernightRun | null {\n if (!isRecord(raw)) return null;\n const runId = str(raw['runId']);\n if (runId === null) return null;\n return {\n runId,\n startedAt: str(raw['startedAt']),\n stopRule: projectStopRule(raw['stopRule']),\n iterationsDone: count(raw['iterationsDone']),\n repo: str(raw['repo']),\n activity: str(raw['activity']),\n merged: projectMerges(raw['merged']),\n discarded: projectDiscards(raw['discarded']),\n };\n}\n\n/**\n * `GET /api/verse/overnight` → a status, or null when the body is not one.\n *\n * `armed` is the single field this refuses to guess: a body that does not say\n * whether a run is armed is not a status, because \"nothing is armed\" is\n * exactly the claim a person checks before closing the laptop.\n */\nexport function projectOvernight(raw: unknown): OvernightStatus | null {\n if (!isRecord(raw)) return null;\n const armed = bool(raw['armed']);\n if (armed === null) return null;\n return {\n armed,\n run: projectRun(raw['run']),\n repos: count(raw['repos']),\n gate: projectGate(raw['gate']),\n };\n}\n\n// ---------------------------------------------------------------------------\n// The operator's side of the stop rule\n// ---------------------------------------------------------------------------\n\n/** Smallest and largest iteration cap the form will send. */\nexport const ITERATIONS_MIN = 1;\nexport const ITERATIONS_MAX = 500;\n\n/**\n * Turn an `<input type=\"time\">` value (\"23:30\") into the next occurrence of\n * that wall-clock time, as an absolute instant.\n *\n * The whole point of arming this at 11pm is that \"07:00\" means tomorrow\n * morning. Resolving it on the client, in the operator's own zone, is what\n * makes that unambiguous by the time it reaches a server that may not share\n * the zone — and rounds to the minute, so a run armed at 06:59:58 for 07:00\n * does not stop two seconds later.\n */\nexport function resolveStopAt(value: string, now: Date = new Date()): string | null {\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(value.trim());\n if (!match) return null;\n const hours = Number(match[1]);\n const minutes = Number(match[2]);\n if (!Number.isInteger(hours) || !Number.isInteger(minutes)) return null;\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) return null;\n const at = new Date(now);\n at.setHours(hours, minutes, 0, 0);\n if (at.getTime() <= now.getTime()) at.setDate(at.getDate() + 1);\n return at.toISOString();\n}\n\n/** \"07:00\" as the operator's locale writes it — never a raw ISO string. */\nexport function formatStopClock(iso: string | null): string {\n if (!iso) return UNKNOWN;\n const ms = Date.parse(iso);\n if (Number.isNaN(ms)) return UNKNOWN;\n return new Date(ms).toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });\n}\n\n/** True when the resolved instant is not today — \"07:00 tomorrow\". */\nexport function isNextDay(iso: string | null, now: Date = new Date()): boolean {\n if (!iso) return false;\n const ms = Date.parse(iso);\n if (Number.isNaN(ms)) return false;\n return new Date(ms).toDateString() !== now.toDateString();\n}\n\n/**\n * The sentence the Arm button is committing to, before the click.\n *\n * It restates the rule the operator chose in the operator's own units, so the\n * button is never the only description of what is about to be authorised.\n */\nexport function describeStopRule(rule: OvernightStopRule, now: Date = new Date()): string {\n switch (rule.kind) {\n case 'until-paused':\n return 'Runs until you pause it — no stop time, no iteration limit.';\n case 'at-time':\n return `Stops at ${formatStopClock(rule.at)}${isNextDay(rule.at, now) ? ' tomorrow' : ''}.`;\n case 'after-iterations':\n return `Stops after ${rule.iterations} ${rule.iterations === 1 ? 'iteration' : 'iterations'}.`;\n }\n}\n\n/** The short label each stop rule wears in the armed summary. */\nexport function stopRuleLabel(kind: OvernightStopRuleKind): string {\n switch (kind) {\n case 'until-paused':\n return 'Until paused';\n case 'at-time':\n return 'At a set time';\n case 'after-iterations':\n return 'After N iterations';\n }\n}\n\n// ---------------------------------------------------------------------------\n// How far to the stop condition\n// ---------------------------------------------------------------------------\n\nexport interface StopProgress {\n /** The rule, restated: \"Stops at 07:00\". */\n headline: string;\n /** How much is left: \"4h 12m left\", \"12 of 20 done\". */\n remaining: string;\n /** 0-100 for a meter, or null when there is no honest denominator. */\n percent: number | null;\n /** True once the condition is met and the loop should be winding down. */\n reached: boolean;\n}\n\n/**\n * How far the run is from its stop condition.\n *\n * `percent` is null for \"until I pause it\" on purpose: an open-ended run has\n * no finish line, and a bar with no denominator is the exact kind of confident\n * graphic this cockpit is not allowed to draw.\n */\nexport function stopProgress(\n rule: OvernightStopRule | null,\n run: OvernightRun | null,\n now: number = Date.now(),\n): StopProgress {\n if (rule === null) {\n return {\n headline: 'Stop rule not stated',\n remaining: UNKNOWN,\n percent: null,\n reached: false,\n };\n }\n\n if (rule.kind === 'until-paused') {\n return {\n headline: 'Runs until you pause it',\n remaining: 'no stop time, no iteration limit',\n percent: null,\n reached: false,\n };\n }\n\n if (rule.kind === 'at-time') {\n const at = Date.parse(rule.at);\n if (Number.isNaN(at)) {\n return { headline: 'Stop time not readable', remaining: UNKNOWN, percent: null, reached: false };\n }\n const headline = `Stops at ${formatStopClock(rule.at)}`;\n const left = at - now;\n if (left <= 0) {\n return { headline, remaining: 'stop time reached', percent: 100, reached: true };\n }\n const startedAt = run?.startedAt ? Date.parse(run.startedAt) : Number.NaN;\n // Elapsed over the run's whole window — which needs a start. Without one\n // the countdown is still true, so it is shown; only the bar is withheld.\n const percent =\n Number.isNaN(startedAt) || at <= startedAt\n ? null\n : Math.min(100, Math.max(0, Math.round(((now - startedAt) / (at - startedAt)) * 100)));\n return { headline, remaining: `${formatDuration(left)} left`, percent, reached: false };\n }\n\n const done = run?.iterationsDone;\n const headline = `Stops after ${rule.iterations} ${rule.iterations === 1 ? 'iteration' : 'iterations'}`;\n if (typeof done !== 'number') {\n return {\n headline,\n remaining: `${UNKNOWN} of ${rule.iterations} done`,\n percent: null,\n reached: false,\n };\n }\n return {\n headline,\n remaining: `${done} of ${rule.iterations} done`,\n percent: Math.min(100, Math.round((done / rule.iterations) * 100)),\n reached: done >= rule.iterations,\n };\n}\n\n/** \"3h 04m\" since the run started, or UNKNOWN when it never said. */\nexport function formatRunElapsed(startedAt: string | null | undefined, now: number = Date.now()): string {\n if (!startedAt) return UNKNOWN;\n const ms = Date.parse(startedAt);\n if (Number.isNaN(ms)) return UNKNOWN;\n return formatDuration(Math.max(0, now - ms));\n}\n\n/**\n * The checks named as one phrase: \"tests, lint and typecheck\".\n *\n * Only checks the server said `true` about are named. A `null` check is not\n * named as running AND not named as skipped — `gateCaveat` below says so in\n * words instead, because a gate an operator believes is running when it is not\n * is the single most expensive misreading this panel could cause.\n */\nexport function gateChecks(gate: OvernightGate | null): string[] {\n if (gate === null) return [];\n const named: string[] = [];\n if (gate.tests === true) named.push('tests');\n if (gate.lint === true) named.push('lint');\n if (gate.typecheck === true) named.push('typecheck');\n return named;\n}\n\n/** The checks the server would not commit to, if any. */\nexport function gateUnstated(gate: OvernightGate | null): string[] {\n if (gate === null) return ['tests', 'lint', 'typecheck'];\n const unstated: string[] = [];\n if (gate.tests === null) unstated.push('tests');\n if (gate.lint === null) unstated.push('lint');\n if (gate.typecheck === null) unstated.push('typecheck');\n return unstated;\n}\n\nexport function joinPhrase(parts: readonly string[]): string {\n if (parts.length === 0) return '';\n if (parts.length === 1) return parts[0]!;\n return `${parts.slice(0, -1).join(', ')} and ${parts[parts.length - 1]!}`;\n}\n","/**\n * routes/verse/autonomy/overnight-queries.ts — the one read and the one write\n * behind the Overnight panel: `GET /api/verse/overnight` and\n * `POST /api/verse/overnight`.\n *\n * Same contract as `control-queries.ts` and `fleet-queries.ts` — the read is a\n * QueryDef consumed through `useQuery` (cache-backed, so a poll never blanks a\n * populated panel); the write pulls the held mutation token from auth-store,\n * touches the hold on success, and invalidates exactly the keys it affects.\n * There is no new data layer here on purpose.\n *\n * TWO THINGS THAT ARE DELIBERATE:\n *\n * 1. **The read does not throw on absence.** The route does not exist yet —\n * four owners are building the engine, the permit, the budgets and the\n * local-only policy in parallel. A server without it answers 404, and 404\n * means \"this panel has no source yet\", not \"Autonomy is broken\". It comes\n * back as `OptionalFleetRead` (reused rather than re-declared, because two\n * shapes for \"a read that is allowed to be absent\" would be one too many)\n * and the panel renders a designed not-available state from `reason`.\n * 401 still propagates: an expired read session is an unauthorized state\n * for the whole surface, not a missing panel.\n *\n * 2. **There is no pause route here, and there must not be one.** The halt\n * this panel offers is the DAEMON-SCOPED pause — `~/.ashlr/daemon.paused`,\n * via `runDaemonAction('pause')` in control-queries.ts. Disarming stops\n * arming the next run; pausing stops the loop that is running now, and\n * they are different questions. Neither is `stopDaemon()`, which is\n * `setKill(true)` and therefore the emergency stop wearing a quieter name\n * (see the header of DaemonControls.tsx).\n */\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { useRefetch } from '../../../data/hooks.js';\nimport { useEffect } from 'react';\nimport { VERSE_CONTROL_KEY, VerseControlLockedError } from './control-queries.js';\nimport type { OptionalFleetRead } from './fleet-contract.js';\nimport type {\n OvernightAction,\n OvernightActionResult,\n OvernightStatus,\n OvernightStopRule,\n} from './overnight-contract.js';\nimport { projectOvernight } from './overnight-model.js';\n\nexport const VERSE_OVERNIGHT_KEY = 'verse-overnight';\nexport const OVERNIGHT_PATH = '/api/verse/overnight';\n\nfunction describeAbsence(err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) {\n return `This build does not expose ${OVERNIGHT_PATH}, so an overnight run cannot be armed from here. It is a missing route, not a run that refused to start.`;\n }\n return `${OVERNIGHT_PATH} answered HTTP ${err.status}.`;\n }\n return `${OVERNIGHT_PATH} could not be reached.`;\n}\n\n/**\n * `GET /api/verse/overnight` — is a run armed, and what has it done.\n *\n * `value` is null both when the route was absent and when it answered\n * something this client could not narrow; `available` and `reason` are what\n * tell those two apart, and the panel words them differently.\n */\nexport const overnightQuery: QueryDef<OptionalFleetRead<OvernightStatus>> = {\n key: VERSE_OVERNIGHT_KEY,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>(OVERNIGHT_PATH, signal);\n const value = projectOvernight(raw);\n if (value === null) {\n return {\n value: null,\n available: true,\n reason: `${OVERNIGHT_PATH} answered in a shape this client does not recognise, so nothing is shown rather than guessed.`,\n };\n }\n return { value, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { value: null, available: false, reason: describeAbsence(err) };\n }\n },\n};\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseControlLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\nfunction invalidateOvernight(): void {\n invalidate(VERSE_OVERNIGHT_KEY);\n // Arming changes what the daemon will do next, and the control snapshot is\n // what the rest of the cockpit reads that from.\n invalidate(VERSE_CONTROL_KEY);\n}\n\n/** Arm an overnight run with exactly one stop rule. */\nexport async function armOvernight(stopRule: OvernightStopRule): Promise<OvernightActionResult> {\n const body: OvernightAction = { action: 'arm', stopRule };\n const result = await post<OvernightActionResult>(OVERNIGHT_PATH, body);\n invalidateOvernight();\n return result;\n}\n\n/**\n * Disarm: no further overnight run starts.\n *\n * This is NOT the halt. It stops the arrangement, not the loop — a run already\n * in flight keeps going until it is paused. The panel says so at the click.\n */\nexport async function disarmOvernight(): Promise<OvernightActionResult> {\n const body: OvernightAction = { action: 'disarm' };\n const result = await post<OvernightActionResult>(OVERNIGHT_PATH, body);\n invalidateOvernight();\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Polling\n// ---------------------------------------------------------------------------\n\n/**\n * Slower than the fleet's 4s: an overnight run's counters move on the scale of\n * whole iterations, and the thing an operator watches second by second (the\n * elapsed clock and the countdown) is derived locally from `useNow`.\n */\nexport const OVERNIGHT_POLL_MS = 15_000;\n\n/**\n * Keep the overnight status live while a run is armed and the tab is visible.\n *\n * Only while armed: a disarmed panel has one boolean to report and polling it\n * every fifteen seconds forever would be pure waste. Hidden tabs stop the\n * timer and take one immediate reading when they come back, so a panel\n * returned to in the morning is current on the first frame.\n */\nexport function useOvernightPolling(armed: boolean, intervalMs: number = OVERNIGHT_POLL_MS): void {\n const refetch = useRefetch(overnightQuery);\n\n useEffect(() => {\n if (!armed) return;\n let timer: ReturnType<typeof setInterval> | null = null;\n\n const start = (): void => {\n if (timer !== null) return;\n timer = setInterval(refetch, intervalMs);\n };\n const stop = (): void => {\n if (timer === null) return;\n clearInterval(timer);\n timer = null;\n };\n const onVisibility = (): void => {\n if (document.visibilityState === 'hidden') {\n stop();\n return;\n }\n refetch();\n start();\n };\n\n if (document.visibilityState !== 'hidden') start();\n document.addEventListener('visibilitychange', onVisibility);\n return () => {\n stop();\n document.removeEventListener('visibilitychange', onVisibility);\n };\n }, [armed, intervalMs, refetch]);\n}\n","/**\n * routes/verse/autonomy/overnight.module.css — the Overnight panel's own\n * layout. Everything shared (panel frame, buttons, empty/error states, the\n * action note) comes from autonomy.module.css, which this panel imports\n * alongside this sheet; only the shapes that exist nowhere else live here.\n *\n * Same rules as the rest of the cockpit (docs/VERSE-DESIGN-V2.md): monochrome,\n * hairlines instead of cards, no shadows, tight radii, the display face with\n * tabular figures on every numeral, colour only where it carries meaning and\n * always paired with a word.\n *\n * No literal px for anything that should scale. The Display-size setting\n * multiplies the type, spacing, density and control ramps together\n * (design/ui-scale.test.ts), so every measure here is a token or a `calc()`\n * over one — including the `ch`/`em` measures, which follow the font size by\n * definition. The one exception is the 2px engine-marker-style rule on\n * `.authorisation`, which is a hairline accent: a hairline is one device pixel\n * at every display size, exactly as tokens.css keeps `--space-px` at 1px.\n */\n\n/* --- armed: the halt first, then everything there is to read ------------- */\n.armedTop {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n}\n\n.armedState {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n}\n\n.haltRow {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n}\n\n.haltNote {\n margin-top: var(--space-3);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n max-width: 68ch;\n}\n\n/* The heavier control, named rather than duplicated. Quiet on purpose: it is\n a signpost, not a second emergency stop. */\n.heavier {\n margin-top: var(--space-4);\n padding-top: var(--space-4);\n border-top: 1px solid var(--border-subtle);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n max-width: 68ch;\n}\n\n.heavier strong {\n color: var(--text-secondary);\n font-weight: var(--font-weight-semibold);\n}\n\n/* --- what it is doing right now ----------------------------------------- */\n.facts {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-3) var(--space-5);\n margin: var(--space-5) 0 0;\n}\n\n.fact {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.factWide {\n flex: 1 1 26ch;\n}\n\n.factLabel {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.factValue {\n margin: 0;\n font-family: var(--font-display);\n font-variant-numeric: tabular-nums;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.factMono {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n\n/* --- how far to the stop condition -------------------------------------- */\n.stop {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n margin-top: var(--space-5);\n padding-top: var(--space-4);\n border-top: 1px solid var(--border-subtle);\n}\n\n.stopHead {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.stopHeadline {\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n}\n\n.stopRemaining {\n font-family: var(--font-display);\n font-variant-numeric: tabular-nums;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n white-space: nowrap;\n}\n\n.stopDetail {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n max-width: 68ch;\n}\n\n/* --- merged / discarded -------------------------------------------------- */\n.ledger {\n margin-top: var(--space-5);\n}\n\n.ledgerTitle {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-semibold);\n color: var(--text-tertiary);\n margin-bottom: var(--space-2);\n}\n\n.ledgerCount {\n font-variant-numeric: tabular-nums;\n letter-spacing: normal;\n color: var(--text-secondary);\n}\n\n.ledgerEmpty {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.ledgerList {\n display: flex;\n flex-direction: column;\n list-style: none;\n}\n\n.ledgerRow {\n display: grid;\n grid-template-columns: minmax(8ch, auto) minmax(0, 1fr);\n gap: var(--space-1) var(--space-3);\n align-items: baseline;\n padding: var(--space-2) 0;\n border-bottom: 1px solid var(--border-subtle);\n transition: background-color var(--duration-fast) var(--ease-standard);\n}\n\n.ledgerRow:hover {\n background: var(--bg-hover);\n}\n\n.ledgerRepo {\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n color: var(--text-tertiary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ledgerChange {\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n/* The reason a change was thrown away, and the stamp. Column 2 so it sits\n under the change it belongs to rather than under the repo name. */\n.ledgerMeta {\n grid-column: 2;\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n overflow-wrap: anywhere;\n}\n\n/* --- the arm form -------------------------------------------------------- */\n.form {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-end;\n gap: var(--space-3) var(--space-5);\n}\n\n.field {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.fieldLabel {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.input {\n min-height: var(--control-h);\n min-width: 10ch;\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-display);\n font-variant-numeric: tabular-nums;\n font-size: var(--text-sm-size);\n}\n\n.input:focus-visible {\n border-color: var(--border-focus);\n}\n\n.input:disabled {\n color: var(--text-disabled);\n background: var(--bg-canvas);\n cursor: not-allowed;\n}\n\n.rulePreview {\n margin-top: var(--space-3);\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n}\n\n.armRow {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n margin-top: var(--space-4);\n}\n\n/* --- what you are authorising ------------------------------------------- */\n/* Not an alert. This is the designed behaviour, stated plainly, so it wears\n body copy and a neutral 2px marker — the same identity marker the seat rows\n use — rather than the danger ground `.error` carries. */\n.authorisation {\n margin-top: var(--space-5);\n padding: var(--space-3) var(--space-4);\n border-left: 2px solid var(--border-strong);\n background: var(--bg-canvas);\n border-radius: 0 var(--radius-sm) var(--radius-sm) 0;\n}\n\n.authorisationTitle {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-semibold);\n color: var(--text-tertiary);\n margin-bottom: var(--space-2);\n}\n\n.authorisationBody {\n font-size: var(--text-sm-size);\n line-height: var(--text-base-line);\n color: var(--text-secondary);\n max-width: 68ch;\n}\n\n.authorisationBody strong {\n color: var(--text-primary);\n font-weight: var(--font-weight-semibold);\n}\n\n.authorisationCaveat {\n margin-top: var(--space-2);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--status-warning-fg);\n max-width: 68ch;\n}\n\n.authorisationCaveat strong {\n font-weight: var(--font-weight-semibold);\n}\n\n/* Guarded the way the rest of the cockpit guards motion: appearance-store.ts\n writes data-motion=\"full\" so an operator can opt back in to animation over\n the OS preference. Nothing here animates except this one hover tint, and\n under reduced motion it simply switches instantly. */\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .ledgerRow {\n transition: none;\n }\n}\n","/**\n * routes/verse/autonomy/OvernightPanel.tsx — the control the operator arms\n * when they leave the computer, so local models keep working the enrolled\n * repos while they are asleep.\n *\n * It has to answer four things, and it answers them in this order because\n * that is the order they are asked at 11pm and again at 7am:\n *\n * 1. **What am I authorising?** Stated in full, always visible, above the\n * Arm button — never behind a dialog. While a run is armed it merges to\n * master on its own behind a test/lint/typecheck gate. That is the\n * designed behaviour and the operator's considered choice, so it is\n * written as a description, not a warning: no red, no destructive\n * styling, no \"are you sure\". It is also not hidden. A person arming\n * this should be able to read exactly what they are agreeing to without\n * clicking anything, which is strictly more than a confirm dialog\n * achieves — DaemonControls already makes this argument for Pause\n * (\"a dialog here would only teach the operator to click through\n * dialogs\"), and it applies with more force to a control that is used\n * once a night.\n *\n * 2. **How does it stop?** Exactly one rule per run — until paused, at a\n * wall-clock time, or after N iterations — chosen in a radiogroup, so\n * the choice has single-selection semantics for a screen reader and the\n * form cannot express two rules at once.\n *\n * 3. **What is it doing right now?** Which repo, what activity, how long it\n * has been running, how far it is from its stop condition, what it has\n * merged, what it has discarded and why.\n *\n * 4. **How do I stop it right now?** With PAUSE — `~/.ashlr/daemon.paused`\n * via `runDaemonAction('pause')`. The halt sits at the TOP of the armed\n * block, before any of the reading material, so it is never below the\n * fold.\n *\n * WHY THE HALT IS PAUSE AND NOT \"STOP LOOP\". `stopDaemon()` is literally\n * `setKill(true)` (core/daemon/loop.ts), i.e. the ordinary stop engages the\n * SAME global sentinel as the emergency stop and takes the agent's own write\n * tools down with it. Wiring a woken-at-3am operator's first instinct to that\n * would mean the cheapest reaction to \"it is doing something I do not like\"\n * has the widest blast radius in the app. Pause halts autonomous dispatch and\n * nothing else, and undoes in one click.\n *\n * WHY THERE IS NO EMERGENCY STOP BUTTON HERE. It is one panel up, in\n * Controls, under a rule and danger-styled, and a second copy of it would\n * both duplicate that ladder and put two identically-named buttons on one\n * screen. It is named in prose instead, with its true blast radius, so it\n * stays reachable and stays visibly heavier than the halt this panel offers.\n *\n * WHY DISARM IS NOT THE HALT EITHER. Disarming stops the ARRANGEMENT; the run\n * already in flight keeps going. Two different questions, two different\n * controls, and the panel says which is which at the point of the click.\n *\n * THE BACKEND DOES NOT EXIST YET. `GET/POST /api/verse/overnight` are being\n * written in parallel by other owners, so an absent route is a designed state\n * of this panel (\"not available in this build\"), never a spinner that never\n * resolves and never a crash. See overnight-contract.ts for the shapes this\n * is coded against.\n */\nimport { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { Meter } from '../../../components/primitives/Meter.js';\nimport { Segmented } from '../../../components/primitives/Segmented.js';\nimport { StatusBadge } from '../../../components/primitives/StatusBadge.js';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { runDaemonAction } from './control-queries.js';\nimport type { VerseControlSnapshot } from './control-types.js';\nimport type { OptionalFleetRead } from './fleet-contract.js';\nimport { formatStamp, UNKNOWN } from './format.js';\nimport type { OvernightStatus, OvernightStopRule, OvernightStopRuleKind } from './overnight-contract.js';\nimport { armOvernight, disarmOvernight } from './overnight-queries.js';\nimport {\n ITERATIONS_MAX,\n ITERATIONS_MIN,\n describeStopRule,\n formatRunElapsed,\n gateChecks,\n gateUnstated,\n joinPhrase,\n resolveStopAt,\n stopProgress,\n} from './overnight-model.js';\nimport { useNow } from './use-ticker.js';\nimport type { GuardedAction } from './use-guarded-action.js';\nimport autonomy from './autonomy.module.css';\nimport styles from './overnight.module.css';\n\nconst STOP_OPTIONS: ReadonlyArray<{ value: OvernightStopRuleKind; label: string }> = [\n { value: 'until-paused', label: 'Until I pause it' },\n { value: 'at-time', label: 'At a time' },\n { value: 'after-iterations', label: 'After N iterations' },\n];\n\n/** A sensible 7am, so the common case is one click away from correct. */\nconst DEFAULT_STOP_TIME = '07:00';\nconst DEFAULT_ITERATIONS = '20';\n\nexport interface OvernightPanelProps {\n read: OptionalFleetRead<OvernightStatus> | null;\n /** For the pause sentinel and the enrolled-repo count — the same snapshot\n * every other panel here reads, so this one cannot disagree with them. */\n snapshot: VerseControlSnapshot;\n guard: GuardedAction;\n dispatchEnabled: boolean;\n loading?: boolean;\n}\n\nexport function OvernightPanel({\n read,\n snapshot,\n guard,\n dispatchEnabled,\n loading = false,\n}: OvernightPanelProps): ReactNode {\n const now = useNow(1000);\n const [kind, setKind] = useState<OvernightStopRuleKind>('until-paused');\n const [timeValue, setTimeValue] = useState(DEFAULT_STOP_TIME);\n const [iterationsValue, setIterationsValue] = useState(DEFAULT_ITERATIONS);\n const [formError, setFormError] = useState<string | null>(null);\n const [note, setNote] = useState<string | null>(null);\n\n const status = read?.value ?? null;\n const run = status?.run ?? null;\n\n // The pause sentinel has three states and `unknown` FAILS SAFE as paused —\n // the daemon treats an unreadable sentinel as paused, so this must too\n // rather than drawing a running loop over a signal nobody could read.\n const pauseState = snapshot.pause?.state ?? 'unknown';\n const paused = pauseState !== 'running';\n const pauseUnknown = pauseState === 'unknown';\n const killed = snapshot.killSwitch?.state === 'active';\n\n const locked = !dispatchEnabled || guard.readOnly;\n const disabled = locked || guard.busy;\n\n const repos = status?.repos ?? snapshot.scope?.repos?.length ?? null;\n const gate = status?.gate ?? null;\n const checks = gateChecks(gate);\n const unstated = gateUnstated(gate);\n const branch = gate?.branch ?? 'master';\n\n const rule = buildRule(kind, timeValue, iterationsValue);\n const progress = stopProgress(run?.stopRule ?? null, run, now);\n\n // Only the reasons the button is actually DISABLED for. An incomplete stop\n // rule leaves the button live — clicking it says what is missing, which is\n // more use than a dead control — and the visible preview line already says\n // what to enter, so a tooltip repeating it would be noise.\n const armDisabledReason = locked\n ? 'This server runs without dispatch, so an overnight run cannot be armed from here.'\n : killed\n ? 'Release the emergency stop before arming an overnight run.'\n : '';\n\n const halt = (): void => {\n setFormError(null);\n guard.request(\n () => runDaemonAction('pause'),\n 'Pausing autonomous dispatch requires the dispatch token.',\n (result) => setNote(result.note || null),\n );\n };\n\n const resume = (): void => {\n setFormError(null);\n guard.request(\n () => runDaemonAction('resume'),\n 'Resuming autonomous dispatch requires the dispatch token.',\n (result) => setNote(result.note || null),\n );\n };\n\n const arm = (): void => {\n if (rule === null) {\n setFormError(\n kind === 'at-time'\n ? 'Enter a stop time as HH:MM before arming.'\n : `Enter a number of iterations between ${ITERATIONS_MIN} and ${ITERATIONS_MAX} before arming.`,\n );\n return;\n }\n setFormError(null);\n guard.request(\n () => armOvernight(rule),\n 'Arming an overnight run requires the dispatch token.',\n (result) => setNote(result.note || null),\n );\n };\n\n const disarm = (): void => {\n setFormError(null);\n guard.request(\n () => disarmOvernight(),\n 'Disarming the overnight run requires the dispatch token.',\n (result) => setNote(result.note || null),\n );\n };\n\n /** The permanent, unavoidable statement of what an armed run does. */\n const authorisation = (\n <div className={styles.authorisation}>\n <h4 className={styles.authorisationTitle}>What it does while you sleep</h4>\n <p className={styles.authorisationBody}>\n Local models work through{' '}\n <strong>{repos === null ? 'your enrolled repositories' : `your ${repos} enrolled ${repos === 1 ? 'repository' : 'repositories'}`}</strong>{' '}\n unattended. Each change it writes is put through the gate\n {checks.length > 0 ? (\n <>\n {' '}— <strong>{joinPhrase(checks)}</strong> must pass\n </>\n ) : null}\n . A change that passes the gate is <strong>merged to {branch} without asking you</strong>. A\n change that fails is discarded and the repository is left as it was.\n </p>\n {unstated.length > 0 ? (\n <p className={styles.authorisationCaveat}>\n This build did not state whether {joinPhrase(unstated)}{' '}\n {unstated.length === 1 ? 'runs' : 'run'} in the gate, so {unstated.length === 1 ? 'it is' : 'they are'} shown as\n unstated rather than as passing checks you can rely on.\n </p>\n ) : null}\n {gate?.autoMerge === false ? (\n <p className={styles.authorisationCaveat}>\n This build reports that passing changes are <strong>not</strong> merged automatically — they\n wait for you in Approvals.\n </p>\n ) : null}\n </div>\n );\n\n return (\n <section className={autonomy.panel} aria-labelledby=\"verse-overnight-title\">\n <div className={autonomy.panelHead}>\n <h3 id=\"verse-overnight-title\" className={autonomy.panelTitle}>\n Overnight\n </h3>\n <p className={autonomy.panelNote}>\n Arm this when you walk away. One stop rule per run; pause halts it at any time.\n </p>\n </div>\n\n {loading && read === null ? (\n <p className={autonomy.empty}>Reading the overnight lane…</p>\n ) : read === null || (!read.available && read.value === null) ? (\n <p className={autonomy.empty}>\n <span className={autonomy.emptyStrong}>Not available in this build. </span>\n {read?.reason ??\n 'Nothing answered for the overnight lane, so a run cannot be armed or reported here. Nothing is running because of this panel.'}\n </p>\n ) : status === null ? (\n <p className={autonomy.empty}>\n <span className={autonomy.emptyStrong}>Unreadable reading. </span>\n {read.reason ??\n 'The overnight reading could not be narrowed, so whether a run is armed is not stated rather than guessed.'}\n </p>\n ) : status.armed ? (\n <>\n {/* The halt comes FIRST, before anything there is to read. */}\n <div className={styles.armedTop}>\n <span className={styles.armedState}>\n <StatusBadge status={paused ? 'paused' : 'running'} tone={paused ? 'warning' : 'running'}>\n {paused ? 'armed — dispatch paused' : 'armed — running'}\n </StatusBadge>\n </span>\n <div className={styles.haltRow}>\n {paused ? (\n <button\n type=\"button\"\n className={`${autonomy.button} ${autonomy.buttonPrimary}`}\n disabled={disabled}\n onClick={resume}\n >\n Resume now\n </button>\n ) : (\n <button\n type=\"button\"\n className={`${autonomy.button} ${autonomy.buttonPrimary}`}\n disabled={disabled}\n onClick={halt}\n >\n Pause now\n </button>\n )}\n <button type=\"button\" className={autonomy.button} disabled={disabled} onClick={disarm}>\n Disarm\n </button>\n </div>\n </div>\n\n <p className={styles.haltNote}>\n {paused\n ? pauseUnknown\n ? 'Treated as paused: the pause sentinel could not be read, and the daemon fails safe rather than running on an unreadable signal. Nothing is being dispatched.'\n : 'Autonomous dispatch is paused. The loop parks between iterations; your own write tools are unaffected and the global kill switch is not engaged.'\n : 'Pause halts autonomous dispatch and nothing else — it undoes in one click. Disarm stops the next run from starting but leaves this one going.'}\n </p>\n\n <dl className={styles.facts}>\n <Fact label=\"Doing now\" value={run?.activity ?? UNKNOWN} wide />\n <Fact label=\"Repository\" value={run?.repo ?? UNKNOWN} mono />\n <Fact label=\"Running for\" value={formatRunElapsed(run?.startedAt, now)} />\n </dl>\n\n <div className={styles.stop}>\n <div className={styles.stopHead}>\n <span className={styles.stopHeadline}>{progress.headline}</span>\n <span className={styles.stopRemaining}>{progress.remaining}</span>\n </div>\n {progress.percent === null ? (\n <p className={styles.stopDetail}>\n No progress is drawn for an open-ended run: there is no finish line to draw it\n against.\n </p>\n ) : (\n <Meter\n value={progress.percent}\n max={100}\n variant=\"line\"\n tone={progress.reached ? 'warning' : 'accent'}\n aria-label=\"Progress toward the stop condition\"\n />\n )}\n </div>\n\n <Ledger\n title=\"Merged\"\n empty=\"Nothing merged yet.\"\n rows={(run?.merged ?? []).map((m) => ({\n id: m.id,\n repo: m.repo,\n title: m.title,\n meta: m.commit ? `${m.commit} · ${formatStamp(m.at)}` : formatStamp(m.at),\n }))}\n />\n <Ledger\n title=\"Discarded\"\n empty=\"Nothing discarded yet.\"\n rows={(run?.discarded ?? []).map((d) => ({\n id: d.id,\n repo: d.repo,\n title: d.title,\n meta: `${d.reason} · ${formatStamp(d.at)}`,\n }))}\n />\n\n {authorisation}\n </>\n ) : (\n <>\n <div className={styles.form}>\n <div className={styles.field}>\n <span className={styles.fieldLabel} id=\"verse-overnight-stop-label\">\n Stop rule\n </span>\n <Segmented\n options={STOP_OPTIONS}\n value={kind}\n onChange={(next) => {\n setKind(next);\n setFormError(null);\n }}\n aria-labelledby=\"verse-overnight-stop-label\"\n size=\"sm\"\n />\n </div>\n\n {kind === 'at-time' ? (\n <div className={styles.field}>\n <label className={styles.fieldLabel} htmlFor=\"verse-overnight-time\">\n Stop at\n </label>\n <input\n id=\"verse-overnight-time\"\n type=\"time\"\n className={styles.input}\n value={timeValue}\n disabled={disabled}\n onChange={(e) => {\n setTimeValue(e.target.value);\n setFormError(null);\n }}\n />\n </div>\n ) : null}\n\n {kind === 'after-iterations' ? (\n <div className={styles.field}>\n <label className={styles.fieldLabel} htmlFor=\"verse-overnight-iterations\">\n Iterations\n </label>\n <input\n id=\"verse-overnight-iterations\"\n type=\"number\"\n inputMode=\"numeric\"\n min={ITERATIONS_MIN}\n max={ITERATIONS_MAX}\n className={styles.input}\n value={iterationsValue}\n disabled={disabled}\n onChange={(e) => {\n setIterationsValue(e.target.value);\n setFormError(null);\n }}\n />\n </div>\n ) : null}\n </div>\n\n <p className={styles.rulePreview}>\n {rule === null\n ? kind === 'at-time'\n ? 'Enter a stop time as HH:MM.'\n : `Enter a number of iterations between ${ITERATIONS_MIN} and ${ITERATIONS_MAX}.`\n : describeStopRule(rule, new Date(now))}\n </p>\n\n {authorisation}\n\n <div className={styles.armRow}>\n {/* WHY IS THIS GREYED OUT — the one thing a disabled control has\n to be able to say. `disabled` eats pointer events on the button\n itself, so the Tooltip listens on its wrapper; it carries a\n DESCRIPTION, and the button keeps its own visible text as its\n accessible name. */}\n <Tooltip label={armDisabledReason}>\n <button\n type=\"button\"\n className={`${autonomy.button} ${autonomy.buttonPrimary}`}\n disabled={disabled || killed}\n onClick={arm}\n >\n Arm overnight run\n </button>\n </Tooltip>\n {paused ? (\n <button\n type=\"button\"\n className={autonomy.button}\n disabled={disabled}\n onClick={resume}\n >\n Resume now\n </button>\n ) : null}\n </div>\n\n {paused ? (\n <p className={styles.haltNote} role=\"status\">\n {pauseUnknown\n ? 'Autonomous dispatch is treated as paused — the sentinel could not be read. An armed run would park rather than work until that is resolved.'\n : 'Autonomous dispatch is paused, so an armed run would park rather than work. Resume before walking away.'}\n </p>\n ) : null}\n\n <p className={styles.heavier}>\n Pause is the halt for this run and it undoes in one click.{' '}\n <strong>Emergency stop</strong>, in Controls above, is heavier on purpose: it engages the\n global kill switch, which also stops the agent&rsquo;s own write tools from editing\n anything, anywhere, until you release it.\n </p>\n </>\n )}\n\n {formError ? (\n <p className={autonomy.capError} role=\"alert\">\n {formError}\n </p>\n ) : null}\n\n {guard.error ? (\n <p className={autonomy.capError} role=\"alert\">\n {guard.error}\n </p>\n ) : null}\n\n {note && !guard.error ? (\n <p className={autonomy.actionNote} role=\"status\">\n {note}\n </p>\n ) : null}\n </section>\n );\n}\n\n/**\n * The form state as a rule, or null when it is not yet a rule.\n *\n * Null is the single source of \"cannot arm yet\" — the preview line, the\n * disabled Arm button's tooltip and the submit guard all read it, so they\n * cannot disagree about whether the form is complete.\n */\nfunction buildRule(\n kind: OvernightStopRuleKind,\n timeValue: string,\n iterationsValue: string,\n): OvernightStopRule | null {\n if (kind === 'until-paused') return { kind: 'until-paused' };\n if (kind === 'at-time') {\n const at = resolveStopAt(timeValue);\n return at === null ? null : { kind: 'at-time', at };\n }\n const iterations = Number(iterationsValue);\n if (!Number.isInteger(iterations) || iterations < ITERATIONS_MIN || iterations > ITERATIONS_MAX) {\n return null;\n }\n return { kind: 'after-iterations', iterations };\n}\n\nfunction Fact({\n label,\n value,\n mono = false,\n wide = false,\n}: {\n label: string;\n value: string;\n mono?: boolean;\n wide?: boolean;\n}): ReactNode {\n return (\n <div className={`${styles.fact} ${wide ? styles.factWide : ''}`}>\n <dt className={styles.factLabel}>{label}</dt>\n <dd className={`${styles.factValue} ${mono ? styles.factMono : ''}`}>{value}</dd>\n </div>\n );\n}\n\ninterface LedgerRow {\n id: string;\n repo: string;\n title: string;\n meta: string;\n}\n\n/** What it merged, and what it threw away — same row shape for both. */\nfunction Ledger({\n title,\n empty,\n rows,\n}: {\n title: string;\n empty: string;\n rows: readonly LedgerRow[];\n}): ReactNode {\n return (\n <div className={styles.ledger}>\n <h4 className={styles.ledgerTitle}>\n {title} <span className={styles.ledgerCount}>{rows.length}</span>\n </h4>\n {rows.length === 0 ? (\n <p className={styles.ledgerEmpty}>{empty}</p>\n ) : (\n <ul className={styles.ledgerList}>\n {rows.map((row) => (\n <li key={row.id} className={styles.ledgerRow}>\n <span className={styles.ledgerRepo}>{row.repo}</span>\n <span className={styles.ledgerChange}>{row.title}</span>\n <span className={styles.ledgerMeta}>{row.meta}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","/**\n * routes/verse/autonomy/SafetyPanel.tsx — the `verify-safety` report as\n * pass/fail lines with a re-run button.\n *\n * These are READ-ONLY structural checks on this build's own source, so the\n * \"Re-run\" button is a plain re-fetch of `GET /api/verse/safety`: it needs no\n * mutation token and cannot change anything. The count is stated rather than\n * hardcoded to five — if the backend grows a sixth check the panel should show\n * six, not silently hide it.\n */\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { useQuery, useRefresh } from '../../../data/hooks.js';\nimport { verseSafetyQuery } from './control-queries.js';\nimport styles from './autonomy.module.css';\n\nexport function SafetyPanel() {\n const query = useQuery(verseSafetyQuery);\n const refetch = useRefresh(verseSafetyQuery);\n const report = query.data;\n const passed = report?.checks?.filter((c) => c.pass).length ?? 0;\n const total = report?.checks?.length ?? 0;\n\n return (\n <section className={styles.panel} aria-label=\"Safety checks\">\n <div className={styles.panelHead}>\n <h3 className={styles.panelTitle}>Safety</h3>\n <div className={styles.panelActions}>\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n {report ? (\n <span className={styles.panelNote}>\n {passed}/{total} passing\n </span>\n ) : null}\n <button type=\"button\" className={styles.button} onClick={refetch} disabled={query.status === 'loading'}>\n Re-run checks\n </button>\n </div>\n </div>\n\n {query.status === 'loading' ? (\n <div className={styles.skeletons}>\n <SkeletonLine width=\"70%\" />\n <SkeletonLine width=\"55%\" />\n <SkeletonLine width=\"62%\" />\n </div>\n ) : query.status === 'error' ? (\n <p className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Could not run the safety checks.'}\n </p>\n ) : !report || total === 0 ? (\n <p className={styles.empty}>\n The safety report came back with no checks. That is itself a problem worth investigating — treat it as a\n failure, not as a pass.\n </p>\n ) : (\n <div className={styles.checkList}>\n {report.checks.map((check) => (\n <div className={styles.check} key={check.id} data-pass={check.pass}>\n <span className={styles.checkMark} aria-hidden=\"true\">\n {check.pass ? '✓' : '✕'}\n </span>\n <span className={styles.checkLabel}>\n {check.label}\n <span className={styles.srOnly}>{check.pass ? ' — passed' : ' — failed'}</span>\n </span>\n <span className={styles.checkDetail}>{check.detail || check.id}</span>\n </div>\n ))}\n </div>\n )}\n </section>\n );\n}\n","/**\n * routes/verse/autonomy/ScopePanel.tsx — the enrollment registry: the single\n * biggest lever on what the autonomous loop is allowed to touch, and the one\n * with no UI path before V2.\n *\n * The empty state is the important one. An empty registry is the DEFAULT and\n * it means the daemon can mutate nothing at all — so the panel says that in\n * plain words instead of rendering an apologetic \"no data\" and letting the\n * operator conclude something is broken.\n *\n * Path rules mirror the server (docs/VERSE-CONTRACT-V2.md): absolute paths\n * only, and never anything under `~/.codex/artifacts`. The server is still the\n * authority; this just spares a round trip on an obvious mistake.\n */\nimport { useState } from 'react';\nimport { SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { ConfirmDialog } from '../../inbox/ConfirmDialog.js';\nimport { updateVerseScope, verseScopeQuery } from './control-queries.js';\nimport { verseAutonomyScopeQuery } from '../verse-queries.js';\nimport { ROOT_PRIORITY_LABEL, ROOT_PRIORITY_NOTE } from '../workspace-model.js';\nimport type { VerseAutonomyScopeView } from '../../../data/api-types.js';\nimport type { VerseScopeRepo } from './control-types.js';\nimport type { GuardedAction } from './use-guarded-action.js';\nimport styles from './autonomy.module.css';\n\n/**\n * Returns an error string, or null when the path is worth sending.\n *\n * A courtesy gate only — `checkVerseScopePath` on the server is the authority\n * and knows the operator's real home directory, which this cannot. The rules\n * mirrored here are the ones expressible without it.\n */\nexport function validateRepoPath(raw: string): string | null {\n const trimmed = raw.trim();\n if (trimmed === '') return 'Enter the absolute path of the repository to enroll.';\n if (!trimmed.startsWith('/')) return 'Enrollment takes an absolute path, e.g. /Users/you/code/project.';\n if (trimmed === '/') return 'The filesystem root cannot be enrolled as autonomous scope.';\n if (/(^|\\/)\\.codex\\/artifacts(\\/|$)/.test(trimmed)) return 'Paths under ~/.codex/artifacts cannot be enrolled.';\n // ~/.ashlr holds config.json, the enrollment registry, the KILL sentinel and\n // the private launcher records. Enrolling it would put the agent's own\n // control directory inside the scope those files define.\n if (/(^|\\/)\\.ashlr(\\/|$)/.test(trimmed)) return 'Paths under ~/.ashlr cannot be enrolled — that is the agent’s own control directory.';\n return null;\n}\n\n/**\n * One repo's standing in the autonomous lane: its sections and its priority.\n *\n * Renders NOTHING when the repo is in no section and carries the default\n * priority — which is every repo until the operator says otherwise, and is\n * exactly how the panel behaved before sections existed.\n */\nfunction ScopeRepoStanding({ path, scope }: { path: string; scope: VerseAutonomyScopeView | null }) {\n const entry = scope?.entries.find((e) => e.path === path) ?? null;\n if (entry === null) return null;\n const ranked = entry.priority !== 'normal';\n if (!ranked && entry.sections.length === 0) return null;\n return (\n <span className={styles.repoStanding} title={ROOT_PRIORITY_NOTE}>\n {ranked ? <span className={styles.repoPriority}>{ROOT_PRIORITY_LABEL[entry.priority]}</span> : null}\n {entry.sections.map((section) => (\n <span key={section.id} className={styles.repoSection}>{section.name}</span>\n ))}\n {entry.outsideFocus ? <span className={styles.repoOutsideFocus}>outside the focused section</span> : null}\n </span>\n );\n}\n\nexport function ScopePanel({ guard, dispatchEnabled }: { guard: GuardedAction; dispatchEnabled: boolean }) {\n const scope = useQuery(verseScopeQuery);\n // The RANKED view of the same registry. Read separately so it is obvious\n // these are two facts: what is enrolled, and in what order it is worked on.\n const autonomy = useQuery(verseAutonomyScopeQuery);\n const [path, setPath] = useState('');\n const [pathError, setPathError] = useState<string | null>(null);\n const [removing, setRemoving] = useState<VerseScopeRepo | null>(null);\n // The path the confirm dialog is asking about. Enrolment GRANTS an\n // autonomous agent write authority over a directory; removal takes authority\n // away and changes nothing on disk. Confirming only the removal put the\n // friction on the safe half, so the grant gets the same step — and in the\n // desktop shell, where the mutation hold never expires, this dialog is the\n // only thing between an Enter keypress and the grant.\n const [enrolling, setEnrolling] = useState<string | null>(null);\n const locked = !dispatchEnabled || guard.readOnly;\n\n /** Validate, then ASK. The Enter shortcut opens the confirm, never posts. */\n function submitEnroll() {\n const problem = validateRepoPath(path);\n if (problem) {\n setPathError(problem);\n return;\n }\n setPathError(null);\n setEnrolling(path.trim());\n }\n\n function confirmEnroll() {\n const target = enrolling;\n if (!target) return;\n guard.request(async () => {\n await updateVerseScope({ action: 'enroll', path: target });\n setPath('');\n setEnrolling(null);\n }, 'Enrolling a repository for autonomous work requires the dispatch token.');\n }\n\n const repos = scope.data?.repos ?? [];\n\n return (\n <section className={styles.panel} aria-label=\"Scope\">\n <div className={styles.panelHead}>\n <h3 className={styles.panelTitle}>Scope — enrolled repositories</h3>\n {scope.status === 'refreshing' ? <RefreshIndicator /> : null}\n </div>\n\n {scope.data?.degradedReason ? (\n <p className={styles.readOnly}>The enrollment registry read is degraded: {scope.data.degradedReason}</p>\n ) : null}\n\n {scope.status === 'loading' ? (\n <div className={styles.skeletons}>\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : scope.status === 'error' ? (\n <p className={styles.error} role=\"alert\">\n {scope.error?.message ?? 'Could not read the enrollment registry.'}\n </p>\n ) : repos.length === 0 ? (\n <p className={styles.empty}>\n <span className={styles.emptyStrong}>No repositories are enrolled, so the daemon will do nothing.</span>{' '}\n That is the default and it is not a bug — nothing autonomous can mutate a real repository until you enroll it\n here. Add one below to give the loop somewhere to work.\n </p>\n ) : (\n <div className={styles.repoList}>\n {repos.map((repo) => (\n <div className={styles.repoRow} key={repo.path}>\n <span className={styles.repoName}>{repo.name}</span>\n <span className={styles.repoPath} title={repo.path}>\n {repo.path}\n </span>\n {repo.exists ? null : <span className={styles.repoMissing}>⚠ path missing on disk</span>}\n {/* Workspace membership and rank, so the blast radius is legible:\n WHICH sections claim this repo, and where the fleet's\n attention goes. Both are ordering — neither enrols. */}\n <ScopeRepoStanding path={repo.path} scope={autonomy.data ?? null} />\n <button type=\"button\" className={styles.button} disabled={locked || guard.busy} onClick={() => setRemoving(repo)}>\n Remove\n </button>\n </div>\n ))}\n </div>\n )}\n\n <div className={styles.addRow}>\n <input\n className={styles.addInput}\n type=\"text\"\n value={path}\n placeholder=\"/absolute/path/to/repository\"\n aria-label=\"Repository path to enroll\"\n aria-invalid={pathError ? true : undefined}\n disabled={locked || guard.busy}\n onChange={(e) => {\n setPath(e.target.value);\n if (pathError) setPathError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n submitEnroll();\n }\n }}\n />\n <button type=\"button\" className={styles.button} disabled={locked || guard.busy} onClick={submitEnroll}>\n Enroll repository\n </button>\n </div>\n {pathError ? (\n <p className={styles.capError} role=\"alert\">\n {pathError}\n </p>\n ) : null}\n {guard.error && !pathError ? (\n <p className={styles.capError} role=\"alert\">\n {guard.error}\n </p>\n ) : null}\n\n <ConfirmDialog\n open={enrolling !== null}\n onClose={() => setEnrolling(null)}\n title=\"Give the autonomous loop write authority here?\"\n body={\n <>\n <code>{enrolling}</code> becomes autonomous scope. The loop may propose work against it, and the\n agent&rsquo;s own mcp-native write tools will act on it — enrolment is the gate those tools check.\n <br />\n <br />\n Nothing is written by enrolling. You can remove it again from this panel at any time.\n </>\n }\n confirmLabel=\"Enroll repository\"\n busy={guard.busy}\n error={guard.error}\n onConfirm={confirmEnroll}\n />\n\n <ConfirmDialog\n open={removing !== null}\n onClose={() => setRemoving(null)}\n title=\"Remove this repository from scope?\"\n body={\n <>\n The autonomous loop will stop proposing work for <code>{removing?.path}</code>. Existing proposals stay in\n the inbox; nothing on disk is changed or deleted.\n </>\n }\n confirmLabel=\"Remove from scope\"\n destructive\n busy={guard.busy}\n error={guard.error}\n onConfirm={() => {\n const target = removing;\n if (!target) return;\n guard.request(async () => {\n await updateVerseScope({ action: 'unenroll', path: target.path });\n setRemoving(null);\n }, 'Removing a repository from autonomous scope requires the dispatch token.');\n }}\n />\n </section>\n );\n}\n","/**\n * routes/verse/sections/AutonomySection.module.css — the section shell only.\n * Panel-level styling lives in ../autonomy/autonomy.module.css so the cockpit\n * reads as one object; this file owns the 48px header strip, the scroll\n * region, and the wide (non-720px) measure a dense control plane needs.\n */\n\n.section { display: flex; flex-direction: column; min-height: 0; height: 100%; background: var(--bg-canvas); }\n\n.header {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n /* DESIGN-V2 §4: header strips are --strip-height, and the token is what the\n desktop shell's inset maths is written against. */\n height: var(--strip-height);\n padding: 0 var(--space-5);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n.title {\n font-family: var(--font-display);\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display, -0.02em);\n color: var(--text-primary);\n}\n.headerActions { display: flex; align-items: center; gap: var(--space-2); }\n.ghost {\n min-height: var(--control-h-sm);\n padding: 0 var(--space-3);\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-secondary);\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n cursor: pointer;\n}\n.ghost:hover { background: var(--bg-hover); color: var(--text-primary); }\n\n.scroll { flex: 1; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; }\n.measure { max-width: 1040px; margin: 0 auto; padding: var(--space-5) var(--space-5) var(--space-16); }\n\n.banner {\n margin-bottom: var(--space-5);\n padding: var(--space-3) var(--space-4);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-surface);\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-base-line);\n}\n.banner code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.bannerTitle { display: block; color: var(--text-primary); font-weight: var(--font-weight-medium); }\n\n.failure {\n padding: var(--space-4);\n border: 1px solid var(--status-danger-solid);\n border-radius: var(--radius-sm);\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n font-size: var(--text-sm-size);\n line-height: var(--text-base-line);\n}\n.retry {\n margin-top: var(--space-3);\n min-height: var(--control-h-sm);\n padding: 0 var(--space-3);\n border: 1px solid currentColor;\n border-radius: var(--radius-sm);\n background: transparent;\n color: inherit;\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n cursor: pointer;\n}\n.loading { display: flex; flex-direction: column; gap: var(--space-3); }\n\n@media (max-width: 900px) {\n .measure { padding: var(--space-4) var(--space-4) var(--space-12); }\n}\n\n/* ---- desktop shell (see desktop/README.md \"Desktop shell contract\") -----\n * In the Tauri window the OS title bar overlays the top 48px and the macOS\n * traffic lights float over the top-LEFT 92px of the WINDOW. This strip does\n * not start at the window's left edge — the 56px rail does — so the inset it\n * owes is the overlap, never the full 92px. Both vars are absent in a\n * browser, where the expression floors to 0px and the layout is unchanged. */\n.header {\n padding-left: max(\n var(--space-5),\n calc(var(--app-traffic-light-inset, 0px) - var(--rail-width, 56px))\n );\n}\n","/**\n * routes/verse/sections/AutonomySection.tsx — the human-out-of-the-loop\n * cockpit (docs/VERSE-CONTRACT-V2.md, owner D). Lazy-mounted by VerseApp's\n * rail; takes no props by contract.\n *\n * It answers, top to bottom: is it running, how do I stop it, what is it\n * allowed to spend, what is it allowed to touch, what did it do, is it safe,\n * and what is it aiming at. The order is the priority order — the stop button\n * is never below the fold.\n *\n * One `GET /api/verse/control` aggregate backs the header, the controls, and\n * the live-usage figures; the panels underneath fetch their own slower or\n * filterable data (`/caps`, `/scope`, `/audit`, `/safety`, `/goals`,\n * `/backlog`) so a slow audit read never blocks the stop button from\n * rendering.\n *\n * Read-only sessions: `ashlr serve` without dispatch 404s every POST. That is\n * detected two ways — the bootstrap's `dispatchEnabled` up front, and a\n * `DispatchDisabledError` from any attempted write — and is rendered as an\n * explained session mode, never as an error.\n *\n * LOCAL FLEET (owner U). Three panels sit directly under the controls, above\n * budget and scope, because on a local-only machine they are the answer to\n * \"is it working\": the serving runtime that makes local agents possible at\n * all, the local-only refusal, and the agents in flight. They read\n * `/api/verse/{runtime,local-only,fleet}` through `fleet-queries.ts`, which\n * treats an absent route as a degraded panel rather than a dead section — the\n * three routes are landing in parallel with this surface.\n *\n * They also poll. The runtime and the fleet are the only things on this screen\n * that change while nobody clicks anything, and neither has an SSE event yet,\n * so `useFleetPolling` re-reads them while the tab is visible. Everything else\n * here still refreshes on the existing cache rules.\n *\n * OVERNIGHT (owner U). It sits directly under the controls, above the local\n * fleet, because it is a CONTROL — the one the operator arms when they walk\n * away — and the order of this section is the priority order. It reads\n * `/api/verse/overnight` through `overnight-queries.ts`, which treats an\n * absent route as a designed \"not available in this build\" state rather than\n * an error, and polls only while a run is armed.\n */\nimport { useMemo } from 'react';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine, SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport { useQuery, useRefresh } from '../../../data/hooks.js';\nimport { ActivityPanel } from '../autonomy/ActivityPanel.js';\nimport { CapsPanel } from '../autonomy/CapsPanel.js';\nimport { DaemonControls } from '../autonomy/DaemonControls.js';\nimport { FleetPanel } from '../autonomy/FleetPanel.js';\nimport { GoalsBacklogPanel } from '../autonomy/GoalsBacklogPanel.js';\nimport { LocalOnlyPanel } from '../autonomy/LocalOnlyPanel.js';\nimport { LocalRuntimePanel } from '../autonomy/LocalRuntimePanel.js';\nimport { OvernightPanel } from '../autonomy/OvernightPanel.js';\nimport { SafetyPanel } from '../autonomy/SafetyPanel.js';\nimport { ScopePanel } from '../autonomy/ScopePanel.js';\nimport { StatusHeader } from '../autonomy/StatusHeader.js';\nimport { verseCapsQuery, verseControlQuery } from '../autonomy/control-queries.js';\nimport {\n fleetQuery,\n localOnlyQuery,\n servingRuntimeQuery,\n useFleetPolling,\n} from '../autonomy/fleet-queries.js';\nimport type { SeatLike } from '../autonomy/fleet-model.js';\nimport { overnightQuery, useOvernightPolling } from '../autonomy/overnight-queries.js';\nimport { useGuardedAction } from '../autonomy/use-guarded-action.js';\nimport { verseBootstrapQuery } from '../verse-queries.js';\nimport autonomy from '../autonomy/autonomy.module.css';\nimport styles from './AutonomySection.module.css';\n\nexport function AutonomySection() {\n const control = useQuery(verseControlQuery);\n const caps = useQuery(verseCapsQuery);\n const bootstrap = useQuery(verseBootstrapQuery);\n const runtime = useQuery(servingRuntimeQuery);\n const fleet = useQuery(fleetQuery);\n const localOnly = useQuery(localOnlyQuery);\n const overnight = useQuery(overnightQuery);\n const refetchControl = useRefresh(verseControlQuery);\n const guard = useGuardedAction();\n useFleetPolling();\n // Only an ARMED run has counters that move on their own; a disarmed panel\n // has one boolean to report and is left to the ordinary cache rules.\n useOvernightPolling(overnight.data?.value?.armed ?? false);\n\n const dispatchEnabled = (bootstrap.data?.dispatchEnabled ?? true) && !guard.readOnly;\n const snapshot = control.data;\n\n // The live seat roster, narrowed to what the local-only blast radius needs.\n // Bootstrap is the roster every other Verse surface reads, so this panel's\n // \"3 of your 5 seats\" cannot disagree with the seat picker.\n const seats: SeatLike[] = useMemo(\n () => (bootstrap.data?.seats ?? []).map((s) => ({ id: s.id, engine: s.engine, label: s.label })),\n [bootstrap.data],\n );\n\n return (\n <section className={styles.section} aria-label=\"Autonomy\">\n <header className={styles.header} data-app-region=\"drag\">\n <h2 className={styles.title}>Autonomy</h2>\n <div className={styles.headerActions}>\n {control.status === 'refreshing' ? <RefreshIndicator /> : null}\n <button type=\"button\" className={styles.ghost} onClick={refetchControl}>\n Refresh\n </button>\n </div>\n </header>\n\n <div className={styles.scroll}>\n <div className={styles.measure}>\n {!dispatchEnabled ? (\n <div className={styles.banner} role=\"status\">\n <span className={styles.bannerTitle}>Read-only session</span>\n This server was started without dispatch, so starting, stopping, editing caps, and changing scope are\n unavailable. Everything below is live and accurate — run <code>ashlr verse</code> to get the controls.\n </div>\n ) : null}\n\n {control.status === 'loading' ? (\n <div className={styles.loading}>\n <SkeletonLine width=\"42%\" />\n <SkeletonLine width=\"68%\" />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : control.status === 'error' || !snapshot ? (\n <div className={styles.failure} role=\"alert\">\n {control.error?.message ?? 'Could not read the autonomy control snapshot.'}\n <br />\n Without it the cockpit cannot honestly say whether the loop is running, so nothing below is shown rather\n than guessed.\n <br />\n <button type=\"button\" className={styles.retry} onClick={refetchControl}>\n Try again\n </button>\n </div>\n ) : (\n <>\n <StatusHeader snapshot={snapshot} />\n <DaemonControls snapshot={snapshot} guard={guard} dispatchEnabled={dispatchEnabled} />\n {/* The unattended lane, directly under the controls: arming it\n is the biggest single thing an operator does on this screen,\n and its halt must never be below the fold. */}\n <OvernightPanel\n read={overnight.data ?? null}\n snapshot={snapshot}\n guard={guard}\n dispatchEnabled={dispatchEnabled}\n loading={overnight.status === 'loading'}\n />\n {/* The local fleet, in the order the questions arrive: can it\n run, what is it allowed to reach, and what is it doing. */}\n <LocalRuntimePanel\n read={runtime.data ?? null}\n guard={guard}\n dispatchEnabled={dispatchEnabled}\n loading={runtime.status === 'loading'}\n />\n <LocalOnlyPanel\n read={localOnly.data ?? null}\n seats={seats}\n guard={guard}\n dispatchEnabled={dispatchEnabled}\n loading={localOnly.status === 'loading'}\n />\n <FleetPanel\n read={fleet.data ?? null}\n runtime={runtime.data?.value ?? null}\n loading={fleet.status === 'loading'}\n />\n {caps.status === 'loading' ? (\n <div className={autonomy.panel}>\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : caps.data ? (\n <CapsPanel caps={caps.data} snapshot={snapshot} guard={guard} dispatchEnabled={dispatchEnabled} />\n ) : (\n <section className={autonomy.panel} aria-label=\"Budget and limits\">\n <div className={autonomy.panelHead}>\n <h3 className={autonomy.panelTitle}>Budget and limits</h3>\n </div>\n <p className={autonomy.error} role=\"alert\">\n {caps.error?.message ?? 'Could not read the configured caps, so none are shown or editable.'}\n </p>\n </section>\n )}\n <ScopePanel guard={guard} dispatchEnabled={dispatchEnabled} />\n <ActivityPanel snapshot={snapshot} />\n <SafetyPanel />\n <GoalsBacklogPanel />\n </>\n )}\n </div>\n </div>\n\n <MutationTokenDialog\n open={guard.tokenOpen}\n onClose={guard.closeToken}\n reason={guard.tokenReason}\n tokenHelp=\"the mutation token ashlr verse printed\"\n />\n </section>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AutonomySection-C4GBsQVc.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/autonomy/control-types.ts","../../../../../../src/web-ui/routes/verse/autonomy/autonomy.module.css","../../../../../../src/web-ui/routes/verse/autonomy/ActivityPanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/caps-spec.ts","../../../../../../src/web-ui/routes/verse/autonomy/CapsPanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/use-ticker.ts","../../../../../../src/web-ui/routes/verse/autonomy/StatusHeader.tsx","../../../../../../src/web-ui/routes/verse/autonomy/DaemonControls.tsx","../../../../../../src/web-ui/routes/verse/autonomy/FleetPanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/GoalsBacklogPanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/fleet-queries.ts","../../../../../../src/web-ui/routes/verse/autonomy/LocalOnlyPanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/LocalRuntimePanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/overnight-model.ts","../../../../../../src/web-ui/routes/verse/autonomy/overnight-queries.ts","../../../../../../src/web-ui/routes/verse/autonomy/overnight.module.css","../../../../../../src/web-ui/routes/verse/autonomy/OvernightPanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/SafetyPanel.tsx","../../../../../../src/web-ui/routes/verse/autonomy/ScopePanel.tsx","../../../../../../src/web-ui/routes/verse/sections/AutonomySection.module.css","../../../../../../src/web-ui/routes/verse/sections/AutonomySection.tsx"],"sourcesContent":["/**\n * routes/verse/autonomy/control-types.ts\n *\n * The V2 control-plane shapes, re-exported from the ONE declaration site:\n * `src/core/verse/control-types.ts` (owner B), by way of\n * `src/web-ui/data/api-types.ts`. This file used to hold a local\n * transcription of the contract prose because the backend module did not\n * exist yet; that block is gone and the cockpit is now typed by the same\n * declarations the routes serialize.\n *\n * Reconciliation notes — where the transcription had guessed wrong, and what\n * the real server sends:\n * - `VerseControlSnapshot.enrollment` → `.scope: VerseScope` (`.scope.repos`)\n * - `VerseControlSnapshot.todaySpendUsd` → `.spend: VerseSpend` (`.spend.todayUsd`)\n * - `VerseControlSnapshot.engines` → `.quota: FrontierEngineUsage[]`, whose\n * rows carry `callsToday`/`limit`/`limitWindow`, not `dispatchesRecent`\n * plus a precomputed `quota` word. `engineQuotaStanding()` below derives\n * that word on the client, so the UI copy is unchanged.\n * - `VerseCapsUpdateResult.applied` is `VerseCapKey[]` (which caps changed),\n * not the whole `VerseCaps`; the new caps come back on `.caps`.\n * - `maxConcurrent` and each `concurrency.*` are `number | null` — null\n * means \"not configured\", which is an honest state, not a zero.\n *\n * The local alias names the cockpit already used (`VerseCapsPatch`,\n * `VerseCapsApplyResult`, `VerseScopePatch`, `VerseAuditPage`) are kept as\n * aliases of the real types so call sites read the same.\n */\nimport type { FrontierEngineUsage } from '../../../../core/usage/frontier-usage.js';\nimport type { VerseFoundryLimit } from '../../../data/api-types.js';\n\nexport type {\n AuditEntry,\n VerseAuditResponse,\n VerseAuditResult,\n VerseCapKey,\n VerseCaps,\n VerseCapsConcurrency,\n VerseCapsUpdate,\n VerseCapsUpdateResult,\n VerseControlError,\n VerseControlErrorCode,\n VerseControlSnapshot,\n VerseDaemonAction,\n VerseDaemonActionResult,\n VerseDaemonStateProjection,\n VerseFleetEssentials,\n VerseFoundryLimit,\n VerseKillSwitch,\n VerseSafetyReport,\n VerseScope,\n VerseScopeAction,\n VerseScopeRepo,\n VerseScopeRequest,\n VerseScopeResult,\n VerseSpend,\n} from '../../../data/api-types.js';\nexport type { PublicDaemonObservation } from '../../../data/api-types.js';\nexport type { DaemonDispatchTrace, DaemonTick } from '../../../../core/types.js';\nexport type { FrontierEngineUsage };\n\n/**\n * Runtime constants from the same backend module. `control-types.ts` has only\n * type-only imports, so pulling these values into the bundle costs nothing and\n * removes the last place the client could disagree with the server about a\n * bound or the kill switch's wording.\n */\nexport {\n VERSE_AUDIT_MAX_LIMIT,\n VERSE_CAPS_BOUNDS,\n VERSE_DAEMON_PAUSE_NOTE,\n VERSE_KILL_SWITCH_NOTE,\n} from '../../../../core/verse/control-types.js';\n\n/**\n * The DAEMON-SCOPED pause (V2.1), taken straight from the backend contract\n * rather than through `data/api-types.ts`.\n *\n * Every other shape here routes through that barrel, and this one should join\n * it when the barrel is next edited. It is imported directly for now because\n * `api-types.ts` is being changed by another surface in the same build, and a\n * type-only re-export is the one place where the short path costs nothing:\n * it is the same declaration either way, and `VERSE_CAPS_BOUNDS` above already\n * reaches for the core module by this exact path.\n */\nexport type { VerseDaemonPause } from '../../../../core/verse/control-types.js';\n\nimport type {\n VerseAuditResponse,\n VerseAuditResult,\n VerseCapsUpdate,\n VerseCapsUpdateResult,\n VerseScopeRequest,\n} from '../../../data/api-types.js';\n\n/** Partial update body for `POST /api/verse/caps`. */\nexport type VerseCapsPatch = VerseCapsUpdate;\n/** `{ok, applied, live: true, caps}` — the \"takes effect live\" receipt. */\nexport type VerseCapsApplyResult = VerseCapsUpdateResult;\n/** `POST /api/verse/scope` body. */\nexport type VerseScopePatch = VerseScopeRequest;\n/** `GET /api/verse/audit` — one page of the audit trail. */\nexport type VerseAuditPage = VerseAuditResponse;\n\n/** Client-side filter state for `GET /api/verse/audit`. */\nexport interface VerseAuditFilters {\n limit?: number;\n action?: string;\n result?: VerseAuditResult;\n}\n\n/** How a quota row stands against its configured limit, as a single word. */\nexport type VerseQuotaStanding = 'ok' | 'warn' | 'over' | 'unlimited';\n\n/**\n * Derive the standing word from a real `FrontierEngineUsage` row.\n *\n * The server does not precompute this (the transcription assumed it did), and\n * it is a pure function of two numbers, so it belongs on the client rather\n * than in a new response field. No limit configured is `unlimited` — which\n * the UI must render as \"no limit configured\", never as headroom.\n */\nexport function engineQuotaStanding(row: FrontierEngineUsage): VerseQuotaStanding {\n const limit = row.limit;\n if (typeof limit !== 'number' || !Number.isFinite(limit) || limit <= 0) return 'unlimited';\n const used = typeof row.callsToday === 'number' && Number.isFinite(row.callsToday) ? row.callsToday : 0;\n if (used >= limit) return 'over';\n if (used >= limit * 0.8) return 'warn';\n return 'ok';\n}\n\n/** The configured foundry limit matching a quota row, when there is one. */\nexport function limitForEngine(\n engine: string,\n limits: readonly VerseFoundryLimit[] | undefined,\n): VerseFoundryLimit | null {\n return limits?.find((l) => l.engine === engine) ?? null;\n}\n","/**\n * routes/verse/autonomy/autonomy.module.css — one stylesheet for the whole\n * cockpit so the panels cannot drift apart.\n *\n * Design language (docs/VERSE-DESIGN-V2.md): monochrome, hairlines instead of\n * cards, no shadows outside true overlays, tight radii, Space Grotesk on every\n * numeral and micro-label, colour only where it carries meaning. Row heights\n * and padding derive from --density-row/--density-pad; both carry a fallback\n * so this renders correctly before owner A's token pass lands.\n */\n\n.panel { border-top: 1px solid var(--border-subtle); padding-block: var(--space-6); }\n.panel:first-of-type { border-top: 0; padding-top: var(--space-4); }\n\n.panelHead { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-3); margin-bottom: var(--space-4); }\n.panelTitle {\n font-family: var(--font-display);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n.panelHeadSpaced { margin-top: var(--space-6); }\n.panelNote { font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-tertiary); }\n.panelActions { display: flex; align-items: center; gap: var(--space-2); }\n\n/* --- status header ------------------------------------------------------ */\n.status { display: flex; flex-direction: column; gap: var(--space-4); }\n.statusTop { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-3) var(--space-5); }\n.runState { display: inline-flex; align-items: center; gap: var(--space-2); font-family: var(--font-display); font-size: var(--text-xl-size); line-height: var(--text-xl-line); font-weight: var(--font-weight-semibold); letter-spacing: var(--tracking-display, -0.02em); }\n.runDot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--status-neutral-solid); flex-shrink: 0; }\n.runState[data-state=\"running\"] .runDot { background: var(--status-running-solid); }\n.runState[data-state=\"stopped\"] .runDot { background: var(--status-neutral-solid); }\n.runState[data-state=\"unknown\"] .runDot { background: var(--status-unknown-solid); }\n.runState[data-state=\"killed\"] .runDot { background: var(--status-danger-solid); }\n\n.facts { display: flex; flex-wrap: wrap; gap: var(--space-3) var(--space-5); }\n.fact { display: flex; flex-direction: column; gap: 2px; min-width: 0; }\n.factLabel { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); }\n.factValue { font-family: var(--font-display); font-size: var(--text-sm-size); line-height: var(--text-sm-line); color: var(--text-primary); white-space: nowrap; }\n.factValue[data-tone=\"warning\"] { color: var(--status-warning-fg); }\n.factValue[data-tone=\"danger\"] { color: var(--status-danger-fg); }\n.factValue[data-tone=\"success\"] { color: var(--status-success-fg); }\n.factValue[data-tone=\"unknown\"] { color: var(--status-unknown-fg); }\n\n/* Budget: one line, never a labelled progress bar. */\n.budget { display: flex; flex-direction: column; gap: var(--space-2); }\n.budgetLine { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: var(--space-2); }\n.budgetLabel { font-family: var(--font-display); font-size: var(--text-sm-size); color: var(--text-primary); }\n.budgetNote { font-size: var(--text-xs-size); color: var(--text-tertiary); }\n.meter { --meter-color: var(--accent-500); height: 2px; background: var(--meter-track); overflow: hidden; }\n.meter[data-state=\"warn\"] { --meter-color: var(--status-warning-solid); }\n.meter[data-state=\"over\"] { --meter-color: var(--status-danger-solid); }\n.meter[data-state=\"stopped\"] { --meter-color: var(--status-danger-solid); }\n.meter[data-state=\"unknown\"] { --meter-color: var(--status-unknown-solid); }\n.meterFill { height: 100%; background: var(--meter-color); transition: width var(--duration-base) var(--ease-decelerate); }\n\n/* --- controls ----------------------------------------------------------- */\n.controls { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); }\n.button {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-surface);\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n}\n.button:hover:not(:disabled) { background: var(--bg-hover); border-color: var(--border-strong); }\n.button:disabled { color: var(--text-disabled); cursor: not-allowed; }\n.buttonPrimary { border-color: var(--accent-500); color: var(--accent-600); }\n.buttonPrimary:hover:not(:disabled) { background: var(--bg-selected); }\n\n/* The emergency stop is separated by a rule, not by colour alone. */\n.emergency { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-3); margin-top: var(--space-4); padding-top: var(--space-4); border-top: 1px solid var(--border-default); }\n.emergencyButton {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-4);\n border: 1px solid var(--status-danger-solid);\n border-radius: var(--radius-sm);\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n cursor: pointer;\n}\n/* Hover keeps the RESTING pair. `--accent-contrast` on `--status-danger-solid`\n measures 3.97:1 in light (#ffffff on #e5473a) — below the 4.5:1 floor, on\n the label of the most destructive control in the app, at the exact moment\n the operator is reading it to confirm what they are about to do. It also\n borrowed the accent system's foreground token for a danger ground, coupling\n this button to a colour the operator can re-hue in Settings. The hover cue\n is achromatic instead: the hairline thickens its contrast. */\n.emergencyButton:hover:not(:disabled) { border-color: var(--status-danger-fg); background: var(--status-danger-bg); }\n.emergencyButton:disabled { border-color: var(--border-default); background: var(--bg-surface); color: var(--text-disabled); cursor: not-allowed; }\n.emergencyNote { flex: 1; min-width: 220px; font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); }\n\n/* --- caps --------------------------------------------------------------- */\n.capGrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--space-4) var(--space-5); }\n.cap { display: flex; flex-direction: column; gap: var(--space-1); min-width: 0; }\n.capLabel { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); }\n.capRow { display: flex; align-items: center; gap: var(--space-2); }\n.capInput {\n flex: 1;\n min-width: 0;\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n}\n.capInput:focus-visible { border-color: var(--border-focus); }\n.capInput:disabled { color: var(--text-disabled); background: var(--bg-canvas); cursor: not-allowed; }\n.capInputInvalid { border-color: var(--status-danger-solid); }\n.capUnit { font-size: var(--text-xs-size); color: var(--text-tertiary); white-space: nowrap; }\n.capHelp { font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-tertiary); }\n.capUsage { font-family: var(--font-display); font-size: var(--text-xs-size); color: var(--text-secondary); }\n.capError { font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--status-danger-fg); }\n/* The server's own sentence about what the last action did. Not an error, not\n a success toast — a statement of fact, so it reads as body copy. */\n.actionNote { margin-top: var(--space-3); font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); }\n.capApplied { display: inline-flex; align-items: center; gap: var(--space-1); font-size: var(--text-xs-size); color: var(--status-success-fg); }\n.capApplied::before { content: \"✓\"; }\n\n/* --- scope -------------------------------------------------------------- */\n.repoList { display: flex; flex-direction: column; }\n.repoRow { display: flex; align-items: center; gap: var(--space-3); min-height: var(--density-row, 32px); padding: var(--space-1) 0; border-bottom: 1px solid var(--border-subtle); }\n.repoName { font-family: var(--font-display); font-size: var(--text-sm-size); color: var(--text-primary); white-space: nowrap; }\n.repoPath { flex: 1; min-width: 0; font-family: var(--font-mono); font-size: var(--text-xs-size); color: var(--text-tertiary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; direction: rtl; text-align: left; }\n.repoMissing { display: inline-flex; align-items: center; gap: var(--space-1); font-size: var(--text-xs-size); color: var(--status-warning-fg); white-space: nowrap; }\n.addRow { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-4); }\n.addInput {\n flex: 1;\n min-width: 240px;\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n.addInput:focus-visible { border-color: var(--border-focus); }\n\n/* --- dense tables (audit, ticks, dispatches) ---------------------------- */\n.tableScroll { max-height: 520px; overflow: auto; border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); scrollbar-gutter: stable; }\n.table { width: 100%; border-collapse: collapse; font-size: var(--text-xs-size); line-height: var(--text-xs-line); }\n.table th {\n font-family: var(--font-display);\n position: sticky;\n top: 0;\n z-index: var(--z-sticky);\n padding: var(--space-2) var(--space-3);\n background: var(--bg-surface);\n border-bottom: 1px solid var(--border-default);\n text-align: left;\n font-size: var(--text-2xs-size, 11px);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-semibold);\n color: var(--text-tertiary);\n white-space: nowrap;\n}\n.table td { padding: var(--space-1) var(--space-3); border-bottom: 1px solid var(--border-subtle); vertical-align: top; }\n.table tbody tr:hover { background: var(--bg-hover); }\n.cellAction { font-family: var(--font-mono); color: var(--text-primary); white-space: nowrap; }\n.cellTime { font-family: var(--font-display); color: var(--text-tertiary); white-space: nowrap; }\n.cellSummary { color: var(--text-secondary); }\n.cellRepo { font-family: var(--font-mono); color: var(--text-tertiary); white-space: nowrap; }\n/* --text-tertiary is a direct declaration on a CHILD, so the parent's\n :hover/[aria-current] colour change does not reach it — only the ground\n under it moves. Measured on --bg-selected it is 3.95:1 in light and 4.40:1\n in dark, both under the 4.5:1 floor in DESIGN-V2 §6; --text-secondary is\n 6.32:1 on the worst of them. design/tokens-contrast.test.ts now pins the\n token pair so the gap cannot reopen. */\n.table tbody tr:hover .cellTime,\n.table tbody tr:hover .cellRepo { color: var(--text-secondary); }\n.resultTag { display: inline-flex; align-items: center; gap: var(--space-1); font-family: var(--font-display); white-space: nowrap; }\n.resultTag::before { content: \"•\"; }\n.resultTag[data-result=\"ok\"] { color: var(--status-success-fg); }\n.resultTag[data-result=\"refused\"] { color: var(--status-warning-fg); }\n.resultTag[data-result=\"error\"] { color: var(--status-danger-fg); }\n.resultTag[data-result=\"ok\"]::before { content: \"✓\"; }\n.resultTag[data-result=\"refused\"]::before { content: \"⊘\"; }\n.resultTag[data-result=\"error\"]::before { content: \"✕\"; }\n\n.filters { display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--space-3); margin-bottom: var(--space-3); }\n.filterField { display: flex; flex-direction: column; gap: var(--space-1); }\n.filterLabel { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); }\n.filterField input {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n}\n\n/* The Select primitive renders its own <label>; restyle it to the uppercase\n micro-label the sibling text filters use so the row still reads as one\n group. Descendant element selector, so it stays module-scoped. */\n.filterSelect > label {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-regular, 400);\n color: var(--text-tertiary);\n}\n\n/* WebKit paints its own clear affordance inside type=search, which is a\n default browser control (§7). Sidebar.module.css already resets it. */\n.filterField input[type='search']::-webkit-search-cancel-button { appearance: none; }\n\n\n/* --- safety ------------------------------------------------------------- */\n.checkList { display: flex; flex-direction: column; }\n.check { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: var(--space-1) var(--space-3); padding: var(--space-2) 0; border-bottom: 1px solid var(--border-subtle); }\n.checkMark { grid-row: 1 / span 2; font-family: var(--font-display); font-size: var(--text-sm-size); }\n.check[data-pass=\"true\"] .checkMark { color: var(--status-success-fg); }\n.check[data-pass=\"false\"] .checkMark { color: var(--status-danger-fg); }\n.checkLabel { font-size: var(--text-sm-size); line-height: var(--text-sm-line); color: var(--text-primary); }\n.checkDetail { font-family: var(--font-mono); font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-tertiary); }\n\n/* --- goals + backlog ---------------------------------------------------- */\n.summaryColumns { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: var(--space-5); }\n.summaryList { display: flex; flex-direction: column; }\n.summaryRow { display: flex; align-items: baseline; gap: var(--space-3); min-height: var(--density-row, 32px); padding: var(--space-1) 0; border-bottom: 1px solid var(--border-subtle); }\n.summaryTitle { flex: 1; min-width: 0; font-size: var(--text-sm-size); color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.summaryMeta { font-family: var(--font-display); font-size: var(--text-xs-size); color: var(--text-tertiary); white-space: nowrap; }\n\n/* --- shared states ------------------------------------------------------ */\n.empty { padding: var(--space-4) 0; font-size: var(--text-sm-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 62ch; }\n.emptyStrong { color: var(--text-primary); font-weight: var(--font-weight-medium); }\n.error { padding: var(--space-3); border: 1px solid var(--status-danger-solid); border-radius: var(--radius-sm); background: var(--status-danger-bg); color: var(--status-danger-fg); font-size: var(--text-sm-size); line-height: var(--text-sm-line); }\n.readOnly { padding: var(--space-3); border: 1px solid var(--border-default); border-radius: var(--radius-sm); background: var(--bg-canvas); color: var(--text-secondary); font-size: var(--text-sm-size); line-height: var(--text-base-line); }\n.readOnly code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.skeletons { display: flex; flex-direction: column; gap: var(--space-2); }\n.srOnly { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }\n\n/* Guarded: appearance-store.ts writes data-motion=\"full\" so an operator can\n opt out of the OS preference, and every other animated surface here honours\n it. */\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .meterFill { transition: none; }\n}\n\n/* --- local fleet: serving runtime, local-only, agents in flight ---------- */\n/* Owner U. Same rules as the rest of this sheet: hairlines not cards, tone\n always paired with a word, every numeral in the display face with tabular\n figures so a column of elapsed times does not shimmer as it ticks. Reads at\n 900px — every grid here collapses to one column before that. */\n\n.runtimeTop { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-3); margin-bottom: var(--space-4); }\n.runtimeState { display: inline-flex; align-items: center; gap: var(--space-2); font-family: var(--font-display); font-size: var(--text-base-size); line-height: var(--text-base-line); font-weight: var(--font-weight-semibold); letter-spacing: var(--tracking-display, -0.02em); }\n.runtimeStateText { white-space: nowrap; }\n.runtimeState[data-state=\"running\"] .runDot { background: var(--status-success-solid); }\n.runtimeState[data-state=\"starting\"] .runDot,\n.runtimeState[data-state=\"stopping\"] .runDot { background: var(--status-running-solid); }\n.runtimeState[data-state=\"stopped\"] .runDot { background: var(--status-neutral-solid); }\n.runtimeState[data-state=\"unknown\"] .runDot { background: var(--status-unknown-solid); }\n\n.factWide { flex: 1 1 260px; min-width: 0; }\n.factMono { font-family: var(--font-mono); font-size: var(--text-xs-size); overflow: hidden; text-overflow: ellipsis; }\n\n/* The capacity block. The big numeral is the EFFECTIVE concurrency; the\n verdict word beside it carries the state so colour is never alone. */\n.capacityBlock { margin-top: var(--space-5); padding-top: var(--space-4); border-top: 1px solid var(--border-subtle); }\n.capacityHead { display: flex; align-items: flex-start; gap: var(--space-4); }\n.capacityBig {\n flex: none;\n min-width: 2ch;\n font-family: var(--font-display);\n font-variant-numeric: tabular-nums;\n font-size: var(--text-3xl-size, 30px);\n line-height: 1;\n letter-spacing: var(--tracking-display, -0.02em);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.capacityBlock[data-verdict=\"serialized\"] .capacityBig { color: var(--status-danger-fg); }\n.capacityBlock[data-verdict=\"unknown\"] .capacityBig,\n.capacityBlock[data-verdict=\"offline\"] .capacityBig { color: var(--text-tertiary); }\n.capacityWords { display: flex; flex-direction: column; gap: var(--space-1); min-width: 0; }\n.capacityHeadline { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); font-family: var(--font-display); font-size: var(--text-sm-size); line-height: var(--text-sm-line); color: var(--text-primary); }\n.capacityDetail { font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); max-width: 68ch; }\n\n/* The measurement, shown only when the configured number is not the real one. */\n.evidence { margin-top: var(--space-4); padding: var(--space-3); border: 1px solid var(--border-default); border-radius: var(--radius-sm); background: var(--bg-canvas); }\n.evidenceLead { font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); margin-bottom: var(--space-3); max-width: 68ch; }\n.evidenceScroll { overflow-x: auto; }\n.evidenceTable { width: 100%; min-width: 380px; border-collapse: collapse; font-size: var(--text-xs-size); line-height: var(--text-xs-line); }\n.evidenceTable th, .evidenceTable td { padding: var(--space-1) var(--space-2); text-align: left; border-bottom: 1px solid var(--border-subtle); }\n.evidenceTable thead th { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); font-weight: var(--font-weight-medium); }\n.evidenceTable tbody th { font-family: var(--font-display); color: var(--text-primary); font-weight: var(--font-weight-medium); white-space: nowrap; }\n.evidenceTable tbody tr:last-child th, .evidenceTable tbody tr:last-child td { border-bottom: 0; }\n.evidenceNums { font-family: var(--font-display); font-variant-numeric: tabular-nums; color: var(--text-secondary); white-space: nowrap; }\n.evidenceCode { font-family: var(--font-mono); font-size: var(--text-2xs-size, 11px); color: var(--text-tertiary); overflow-wrap: anywhere; }\n\n.utilisation { display: flex; flex-direction: column; gap: var(--space-2); margin-top: var(--space-5); }\n\n/* --- local only --------------------------------------------------------- */\n.toggleRow { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--space-3); }\n.toggleState { display: inline-flex; align-items: center; gap: var(--space-2); }\n.policyExplain { margin-top: var(--space-3); font-size: var(--text-sm-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 68ch; }\n.policyExplain strong { color: var(--text-primary); font-weight: var(--font-weight-semibold); }\n\n.impact { margin-top: var(--space-5); padding-top: var(--space-4); border-top: 1px solid var(--border-subtle); }\n.impactTitle { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); margin-bottom: var(--space-2); }\n.impactSummary { font-size: var(--text-sm-size); line-height: var(--text-base-line); color: var(--text-primary); max-width: 68ch; }\n.seatList { display: flex; flex-direction: column; margin-top: var(--space-3); }\n.seatRow { display: grid; grid-template-columns: minmax(64px, auto) minmax(0, 1fr); gap: var(--space-1) var(--space-3); align-items: baseline; padding: var(--space-2) 0; border-bottom: 1px solid var(--border-subtle); }\n.seatEngine {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n color: var(--text-secondary);\n /* A 2px engine marker, per the design language: identity, never state. */\n border-left: 2px solid var(--engine-color, var(--border-strong));\n padding-left: var(--space-2);\n white-space: nowrap;\n}\n.seatEngine[data-engine=\"claude\"] { --engine-color: var(--engine-claude); }\n.seatEngine[data-engine=\"codex\"] { --engine-color: var(--engine-codex); }\n.seatEngine[data-engine=\"grok\"] { --engine-color: var(--engine-grok); }\n.seatEngine[data-engine=\"local\"] { --engine-color: var(--engine-local); }\n.seatLabel { font-size: var(--text-sm-size); line-height: var(--text-sm-line); color: var(--text-primary); min-width: 0; overflow-wrap: anywhere; }\n.seatRefusal { grid-column: 2; font-family: var(--font-mono); font-size: var(--text-2xs-size, 11px); line-height: var(--text-xs-line); color: var(--text-tertiary); overflow-wrap: anywhere; }\n\n/* --- fleet -------------------------------------------------------------- */\n.pressure { display: flex; flex-direction: column; gap: var(--space-1); }\n.pressureHead { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); }\n.pressureHeadline { font-family: var(--font-display); font-size: var(--text-lg-size); line-height: var(--text-lg-line); font-weight: var(--font-weight-semibold); letter-spacing: var(--tracking-display, -0.02em); color: var(--text-primary); }\n.pressure[data-state=\"queued\"] .pressureHeadline { color: var(--status-warning-fg); }\n.pressure[data-state=\"unknown\"] .pressureHeadline { color: var(--status-unknown-fg); }\n.pressureDetail { font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); max-width: 68ch; }\n\n.fleetMeters { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); align-items: end; gap: var(--space-3) var(--space-5); margin: var(--space-4) 0; }\n.elapsedQualifier { color: var(--text-tertiary); font-family: var(--font-ui); font-style: italic; }\n.noteList { display: flex; flex-direction: column; gap: var(--space-1); margin-top: var(--space-3); list-style: none; }\n\n/* Standing of one enrolled repo in the autonomous lane: its sections and its\n rank. Ordering only — neither of these enrols anything. */\n.repoStanding {\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--space-1);\n align-items: center;\n}\n\n.repoPriority,\n.repoSection,\n.repoOutsideFocus {\n padding: 0 var(--space-1);\n border-radius: var(--radius-sm);\n border: 1px solid var(--border-subtle);\n font-size: var(--text-2xs, 0.6875rem);\n line-height: 1.6;\n color: var(--text-muted);\n white-space: nowrap;\n}\n\n.repoPriority { border-color: var(--accent); color: var(--text-default); }\n.repoOutsideFocus { font-style: italic; }\n","/**\n * routes/verse/autonomy/ActivityPanel.tsx — \"what did it do while I was\n * asleep\": recent ticks, the dispatches inside them, and the append-only audit\n * trail as a dense filterable table.\n *\n * Readability at 200 rows is a requirement, not an aspiration, so: one scroll\n * container with a sticky header rather than pagination, monospace in the\n * identifier columns so they align, wall-clock time (an audit read at 07:00 is\n * about *when*, and \"14h ago\" is useless for that) with the relative age as a\n * tooltip, and result carried by a glyph as well as a colour.\n *\n * The audit filters are applied deliberately, not per keystroke: the action\n * filter is server-side (`?action=`), so committing on Enter/blur keeps one\n * cache entry per real filter instead of one per character typed.\n */\nimport { useMemo, useState } from 'react';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { Select } from '../../../components/primitives/Select.js';\nimport { SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport { useQuery, useRefresh } from '../../../data/hooks.js';\nimport { verseAuditQuery, VERSE_AUDIT_DEFAULT_LIMIT } from './control-queries.js';\nimport type { AuditEntry, DaemonDispatchTrace, VerseControlSnapshot } from './control-types.js';\n// formatStamp, not formatClock: these three tables span days (the audit trail\n// defaults to 200 rows and offers 500), so a bare \"03:12:44\" cannot tell last\n// night from last week. It prints time alone for today and prefixes the date\n// otherwise.\nimport { describeTickOutcome, formatAge, formatCount, formatStamp, formatUsd, UNKNOWN } from './format.js';\nimport styles from './autonomy.module.css';\n\nconst RECENT_TICKS = 20;\nconst RECENT_DISPATCHES = 40;\n\ntype ResultFilter = '' | AuditEntry['result'];\n\ninterface DispatchRow extends DaemonDispatchTrace {\n tickTs: string;\n}\n\nexport function ActivityPanel({ snapshot }: { snapshot: VerseControlSnapshot }) {\n const ticks = snapshot.daemon?.ticks ?? null;\n\n const recentTicks = useMemo(() => (ticks ? [...ticks].slice(-RECENT_TICKS).reverse() : []), [ticks]);\n\n const dispatches = useMemo<DispatchRow[]>(() => {\n if (!ticks) return [];\n const rows: DispatchRow[] = [];\n for (let i = ticks.length - 1; i >= 0 && rows.length < RECENT_DISPATCHES; i -= 1) {\n const tick = ticks[i];\n if (!tick?.dispatches) continue;\n for (let j = tick.dispatches.length - 1; j >= 0 && rows.length < RECENT_DISPATCHES; j -= 1) {\n rows.push({ ...tick.dispatches[j]!, tickTs: tick.ts });\n }\n }\n return rows;\n }, [ticks]);\n\n return (\n <section className={styles.panel} aria-label=\"Activity\">\n <div className={styles.panelHead}>\n <h3 className={styles.panelTitle}>Recent ticks</h3>\n <p className={styles.panelNote}>Newest first · last {RECENT_TICKS}</p>\n </div>\n {ticks === null ? (\n <p className={styles.empty}>The daemon ledger is not readable right now, so tick history is unknown.</p>\n ) : recentTicks.length === 0 ? (\n <p className={styles.empty}>No ticks have been recorded yet. Start the loop, or run one tick, to produce the first.</p>\n ) : (\n <div className={styles.tableScroll}>\n <table className={styles.table}>\n <thead>\n <tr>\n <th scope=\"col\">Time</th>\n <th scope=\"col\">Outcome</th>\n <th scope=\"col\">Items</th>\n <th scope=\"col\">Proposals</th>\n <th scope=\"col\">Dispatched</th>\n <th scope=\"col\">Spend</th>\n <th scope=\"col\">Direction</th>\n </tr>\n </thead>\n <tbody>\n {recentTicks.map((tick) => {\n const outcome = describeTickOutcome(tick.reason);\n return (\n <tr key={`${tick.ts}-${tick.reason}`}>\n <td className={styles.cellTime} title={formatAge(tick.ts)}>\n {formatStamp(tick.ts)}\n </td>\n <td className={styles.cellSummary} data-tone={outcome.tone}>\n {outcome.label}\n {tick.dryRun ? ' (dry run)' : ''}\n </td>\n <td className={styles.cellTime}>{formatCount(tick.itemsConsidered)}</td>\n <td className={styles.cellTime}>{formatCount(tick.proposalsCreated)}</td>\n <td className={styles.cellTime}>{tick.dispatches ? tick.dispatches.length : UNKNOWN}</td>\n <td className={styles.cellTime}>{formatUsd(tick.spentUsd)}</td>\n <td className={styles.cellSummary}>{tick.directionMode ?? '—'}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n\n <div className={`${styles.panelHead} ${styles.panelHeadSpaced}`}>\n <h3 className={styles.panelTitle}>Recent dispatches</h3>\n <p className={styles.panelNote}>Newest first · last {RECENT_DISPATCHES}</p>\n </div>\n {dispatches.length === 0 ? (\n <p className={styles.empty}>\n No dispatch traces in the recorded ticks. A tick that finds nothing eligible records no dispatches — that is\n normal, not a gap.\n </p>\n ) : (\n <div className={styles.tableScroll}>\n <table className={styles.table}>\n <thead>\n <tr>\n <th scope=\"col\">Time</th>\n <th scope=\"col\">Item</th>\n <th scope=\"col\">Repo</th>\n <th scope=\"col\">Engine</th>\n <th scope=\"col\">Outcome</th>\n <th scope=\"col\">Spend</th>\n </tr>\n </thead>\n <tbody>\n {dispatches.map((row, i) => (\n <tr key={`${row.tickTs}-${row.itemId}-${i}`}>\n <td className={styles.cellTime} title={formatAge(row.tickTs)}>\n {formatStamp(row.tickTs)}\n </td>\n <td className={styles.cellSummary} title={row.title}>\n {row.title}\n </td>\n <td className={styles.cellRepo} title={row.repo}>\n {row.repo ? row.repo.split('/').pop() : UNKNOWN}\n </td>\n <td className={styles.cellAction}>{row.backend ?? 'not routed'}</td>\n <td className={styles.cellSummary}>\n {row.dispatched ? 'dispatched' : `skipped — ${row.reason}`}\n </td>\n <td className={styles.cellTime}>{formatUsd(row.spentUsd)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n <AuditTrail />\n </section>\n );\n}\n\nexport function AuditTrail() {\n const [actionDraft, setActionDraft] = useState('');\n const [action, setAction] = useState('');\n const [result, setResult] = useState<ResultFilter>('');\n const [limit, setLimit] = useState(VERSE_AUDIT_DEFAULT_LIMIT);\n\n const def = useMemo(\n () => verseAuditQuery({ limit, action: action || undefined, result: result || undefined }),\n [limit, action, result],\n );\n const query = useQuery(def);\n const refetch = useRefresh(def);\n\n const entries = query.data?.entries ?? [];\n\n return (\n <>\n <div className={`${styles.panelHead} ${styles.panelHeadSpaced}`}>\n <h3 className={styles.panelTitle}>Audit trail</h3>\n <div className={styles.panelActions}>\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n <button type=\"button\" className={styles.button} onClick={refetch}>\n Refresh\n </button>\n </div>\n </div>\n\n <div className={styles.filters}>\n <label className={styles.filterField}>\n <span className={styles.filterLabel}>Action</span>\n <input\n type=\"search\"\n value={actionDraft}\n placeholder=\"e.g. enroll.add\"\n onChange={(e) => setActionDraft(e.target.value)}\n onBlur={() => setAction(actionDraft.trim())}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n setAction(actionDraft.trim());\n }\n }}\n />\n </label>\n {/* The Select primitive, not a raw <select>: it carries the\n appearance: none reset, our own chevron, the --density-row height\n and the disabled styling. DESIGN-V2 §7 — \"Nothing is a default\n browser control\" — and an unreset <select> loses its border-radius\n to the native bezel on macOS Safari and grows a second OS chevron\n on Chrome/Windows. */}\n <Select\n className={styles.filterSelect}\n label=\"Result\"\n value={result}\n onChange={(e) => setResult(e.target.value as ResultFilter)}\n >\n <option value=\"\">Any result</option>\n <option value=\"ok\">ok</option>\n <option value=\"refused\">refused</option>\n <option value=\"error\">error</option>\n </Select>\n <Select\n className={styles.filterSelect}\n label=\"Rows\"\n value={limit}\n onChange={(e) => setLimit(Number(e.target.value))}\n >\n <option value={50}>50</option>\n <option value={200}>200</option>\n <option value={500}>500</option>\n </Select>\n </div>\n\n {query.status === 'loading' ? (\n <div className={styles.skeletons}>\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : query.status === 'error' ? (\n <p className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Could not read the audit trail.'}\n </p>\n ) : entries.length === 0 ? (\n <p className={styles.empty}>\n {action || result\n ? 'No audit entries match this filter.'\n : 'No audit entries recorded yet. Every autonomous or sandbox action appends one here, and none are ever deleted.'}\n </p>\n ) : (\n <>\n <p className={styles.panelNote} aria-live=\"polite\">\n {entries.length} {entries.length === 1 ? 'entry' : 'entries'} · newest first\n {query.data?.truncated ? ' · capped by the server, narrow the filter to see more' : ''}\n </p>\n <div className={styles.tableScroll}>\n <table className={styles.table}>\n <thead>\n <tr>\n <th scope=\"col\">Time</th>\n <th scope=\"col\">Action</th>\n <th scope=\"col\">Result</th>\n <th scope=\"col\">Repo</th>\n <th scope=\"col\">Summary</th>\n </tr>\n </thead>\n <tbody>\n {entries.map((entry, i) => (\n <tr key={`${entry.ts}-${entry.action}-${i}`}>\n <td className={styles.cellTime} title={formatAge(entry.ts)}>\n {formatStamp(entry.ts)}\n </td>\n <td className={styles.cellAction}>{entry.action}</td>\n <td>\n <span className={styles.resultTag} data-result={entry.result}>\n {entry.result}\n </span>\n </td>\n <td className={styles.cellRepo} title={entry.repo ?? undefined}>\n {entry.repo ? entry.repo.split('/').pop() : '—'}\n </td>\n <td className={styles.cellSummary}>{entry.summary}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </>\n )}\n </>\n );\n}\n","/**\n * routes/verse/autonomy/caps-spec.ts — one table describing every editable\n * cap, mirroring the server-side ranges in docs/VERSE-CONTRACT-V2.md so the\n * operator gets the error BEFORE the round trip, not after it.\n *\n * The table is the single source of truth for: the label, the unit shown next\n * to the number, the accepted range, whether the value must be whole, the\n * display transform (tick interval is edited in minutes, stored in ms), the\n * one-line explanation under the control, and how a committed value turns\n * into a `POST /api/verse/caps` partial body. Adding a cap is one entry here\n * and nothing else.\n *\n * If these ranges ever disagree with the server the server still wins — this\n * is a courtesy gate, never an authority. That is why `applyCapPatch` builds\n * a PARTIAL body and the panel re-reads the server's `applied` snapshot.\n */\nimport { VERSE_CAPS_BOUNDS, type VerseCaps, type VerseCapsPatch } from './control-types.js';\n\nexport type CapKey =\n | 'dailyBudgetUsd'\n | 'perTickItems'\n | 'parallel'\n | 'intervalMs'\n | 'maxConcurrent'\n | 'concurrency.local'\n | 'concurrency.cloud'\n | 'concurrency.total'\n | 'subscriptionMaxPercent';\n\nexport interface CapFieldSpec {\n key: CapKey;\n label: string;\n /** Shown after the input; also read aloud as part of the accessible name. */\n unit: string;\n /** Inclusive bounds, expressed in DISPLAY units. */\n min: number;\n max: number;\n /** Display values must be whole numbers (tick interval is the exception). */\n integer: boolean;\n step: number;\n help: string;\n /** Stored value -> what the operator types. */\n toDisplay: (stored: number) => number;\n /** What the operator typed -> what the server stores. */\n fromDisplay: (display: number) => number;\n}\n\nconst identity = (n: number) => n;\n\n/** Tick interval is stored in ms and edited in minutes — 30s..24h. */\nconst MS_PER_MINUTE = 60_000;\n\nexport const CAP_FIELDS: readonly CapFieldSpec[] = [\n {\n key: 'dailyBudgetUsd',\n label: 'Daily budget',\n unit: 'USD / day',\n min: 0,\n max: 1000,\n integer: false,\n step: 1,\n help: 'Hard ceiling on what the loop may spend in a calendar day. 0 means the loop is stopped — it is not \"unlimited\".',\n toDisplay: identity,\n fromDisplay: identity,\n },\n {\n key: 'perTickItems',\n label: 'Items per tick',\n unit: 'items',\n min: 1,\n max: 50,\n integer: true,\n step: 1,\n help: 'How many backlog items one tick may pick up.',\n toDisplay: identity,\n fromDisplay: identity,\n },\n {\n key: 'parallel',\n label: 'Parallel swarms',\n unit: 'swarms',\n min: 1,\n max: 16,\n integer: true,\n step: 1,\n help: 'Sandboxed swarms run simultaneously inside one tick (batch mode).',\n toDisplay: identity,\n fromDisplay: identity,\n },\n {\n key: 'intervalMs',\n label: 'Tick interval',\n unit: 'minutes',\n min: 0.5,\n max: 1440,\n integer: false,\n step: 0.5,\n help: 'Gap between ticks in loop mode. 30 seconds minimum, 24 hours maximum.',\n toDisplay: (stored) => Math.round((stored / MS_PER_MINUTE) * 100) / 100,\n fromDisplay: (display) => Math.round(display * MS_PER_MINUTE),\n },\n {\n key: 'maxConcurrent',\n label: 'Max concurrent',\n unit: 'dispatches',\n min: 1,\n max: 32,\n integer: true,\n step: 1,\n help: 'Absolute ceiling on in-flight dispatches in continuous mode. Takes precedence over the per-tier totals.',\n toDisplay: identity,\n fromDisplay: identity,\n },\n {\n key: 'concurrency.local',\n label: 'Local tier',\n unit: 'slots',\n min: 1,\n max: 32,\n integer: true,\n step: 1,\n help: 'On-device engines. GPU/RAM bound — keep this low.',\n toDisplay: identity,\n fromDisplay: identity,\n },\n {\n key: 'concurrency.cloud',\n label: 'Cloud tier',\n unit: 'slots',\n min: 1,\n max: 32,\n integer: true,\n step: 1,\n help: 'Subscription cloud agents. I/O bound — many can run at once.',\n toDisplay: identity,\n fromDisplay: identity,\n },\n {\n key: 'concurrency.total',\n label: 'All tiers',\n unit: 'slots',\n min: 1,\n max: 32,\n integer: true,\n step: 1,\n help: 'Hard cap across every tier combined.',\n toDisplay: identity,\n fromDisplay: identity,\n },\n {\n key: 'subscriptionMaxPercent',\n label: 'Subscription ceiling',\n unit: '% of window',\n min: 1,\n max: 100,\n integer: true,\n step: 1,\n help: 'How much of a flat-fee provider window the fleet may consume before it backs off.',\n toDisplay: identity,\n fromDisplay: identity,\n },\n] as const;\n\nexport function capFieldByKey(key: CapKey): CapFieldSpec {\n const found = CAP_FIELDS.find((f) => f.key === key);\n /* istanbul ignore next -- CapKey is closed; this is a type-level guarantee. */\n if (!found) throw new Error(`unknown cap field: ${key}`);\n return found;\n}\n\n/** Current stored value for a cap, or null when the server did not send it. */\nexport function readCap(caps: VerseCaps | undefined, key: CapKey): number | null {\n if (!caps) return null;\n const raw =\n key === 'concurrency.local'\n ? caps.concurrency?.local\n : key === 'concurrency.cloud'\n ? caps.concurrency?.cloud\n : key === 'concurrency.total'\n ? caps.concurrency?.total\n : (caps as unknown as Record<string, unknown>)[key];\n return typeof raw === 'number' && Number.isFinite(raw) ? raw : null;\n}\n\nexport type CapValidation =\n | { ok: true; stored: number; display: number }\n | { ok: false; error: string };\n\n/**\n * Validate what the operator typed against the spec's DISPLAY range, then\n * convert to the stored unit. Rejects blanks, non-numbers, fractions on\n * whole-number caps, and anything outside the range the server enforces.\n */\nexport function validateCap(spec: CapFieldSpec, raw: string): CapValidation {\n const trimmed = raw.trim();\n if (trimmed === '') return { ok: false, error: `${spec.label} cannot be blank.` };\n const parsed = Number(trimmed);\n if (!Number.isFinite(parsed)) return { ok: false, error: `${spec.label} must be a number.` };\n if (spec.integer && !Number.isInteger(parsed)) {\n return { ok: false, error: `${spec.label} must be a whole number of ${spec.unit}.` };\n }\n if (parsed < spec.min || parsed > spec.max) {\n return { ok: false, error: `${spec.label} must be between ${spec.min} and ${spec.max} ${spec.unit}.` };\n }\n return { ok: true, stored: spec.fromDisplay(parsed), display: parsed };\n}\n\n/** Build the smallest `POST /api/verse/caps` body that applies one cap. */\nexport function capPatch(key: CapKey, stored: number): VerseCapsPatch {\n switch (key) {\n case 'concurrency.local':\n return { concurrency: { local: stored } };\n case 'concurrency.cloud':\n return { concurrency: { cloud: stored } };\n case 'concurrency.total':\n return { concurrency: { total: stored } };\n default:\n return { [key]: stored } as VerseCapsPatch;\n }\n}\n\n/**\n * Inclusive display range for a per-engine foundry limit `max`. Read straight\n * off the server's own bound so the courtesy gate cannot drift from the 400\n * (`bounded(entry['max'], …, VERSE_CAPS_BOUNDS.foundryLimitMax)` in\n * control-api.ts). It is not a `CAP_FIELDS` entry, so the drift test that\n * iterates that table never reached it — hence the explicit export.\n */\nexport const FOUNDRY_LIMIT_MAX_RANGE = VERSE_CAPS_BOUNDS.foundryLimitMax;\n\n/** Per-engine foundry limit `max` — bounded exactly as the server bounds it. */\nexport function validateFoundryMax(raw: string, engine: string): CapValidation {\n const trimmed = raw.trim();\n if (trimmed === '') return { ok: false, error: `${engine} limit cannot be blank.` };\n const parsed = Number(trimmed);\n if (!Number.isFinite(parsed)) return { ok: false, error: `${engine} limit must be a number.` };\n if (!Number.isInteger(parsed)) return { ok: false, error: `${engine} limit must be a whole number of dispatches.` };\n if (parsed < FOUNDRY_LIMIT_MAX_RANGE.min) return { ok: false, error: `${engine} limit cannot be negative.` };\n if (parsed > FOUNDRY_LIMIT_MAX_RANGE.max) {\n return {\n ok: false,\n error: `${engine} limit must be at most ${FOUNDRY_LIMIT_MAX_RANGE.max} dispatches.`,\n };\n }\n return { ok: true, stored: parsed, display: parsed };\n}\n","/**\n * routes/verse/autonomy/CapsPanel.tsx — the leash: every configured cap, the\n * live usage against it, and an inline edit that commits on blur or Enter.\n *\n * Three behaviours the contract calls out explicitly:\n * - **Validate before the round trip.** caps-spec.ts mirrors the server's\n * ranges, so a bad value is refused inline instead of costing a 400.\n * - **\"Applied live\" means applied live.** The daemon re-reads config each\n * tick, so a committed cap takes effect without a restart; the confirmation\n * says so, and clears on the next edit rather than lingering.\n * - **A daily budget of 0 reads as \"stopped\".** Never as \"unlimited\". The\n * usage line under the budget field says it in words as well as in the\n * header's meter.\n *\n * Live usage is shown ONLY where the number is genuinely observable. Per-tier\n * concurrency has no live signal, so it gets no usage line — an invented\n * \"0 / 8\" would be worse than silence.\n */\nimport { useEffect, useState } from 'react';\nimport {\n CAP_FIELDS,\n FOUNDRY_LIMIT_MAX_RANGE,\n capPatch,\n readCap,\n validateCap,\n validateFoundryMax,\n type CapFieldSpec,\n type CapKey,\n} from './caps-spec.js';\nimport { updateVerseCaps } from './control-queries.js';\nimport { engineQuotaStanding } from './control-types.js';\nimport type { VerseCaps, VerseControlSnapshot, VerseFoundryLimit } from './control-types.js';\nimport { budgetMeter, formatAge, formatCount, formatUsd } from './format.js';\nimport type { GuardedAction } from './use-guarded-action.js';\nimport styles from './autonomy.module.css';\n\nexport interface CapsPanelProps {\n caps: VerseCaps;\n snapshot: VerseControlSnapshot;\n guard: GuardedAction;\n dispatchEnabled: boolean;\n}\n\n/** What is actually measurable against each cap right now. */\nfunction usageFor(key: CapKey, caps: VerseCaps, snapshot: VerseControlSnapshot): string | null {\n const daemon = snapshot.daemon;\n const lastTick = daemon?.ticks?.[daemon.ticks.length - 1] ?? null;\n switch (key) {\n case 'dailyBudgetUsd': {\n const cap = caps.dailyBudgetUsd;\n if (cap === 0) return 'Loop stopped — a budget of 0 is a stop, not \"unlimited\".';\n // Same honesty rule as the status header: `todayUsd` belongs to\n // `todayDate`, and a ledger day that is not today says nothing about\n // today. budgetMeter owns that comparison for both surfaces.\n const spend = snapshot.spend;\n const meter = spend\n ? budgetMeter(spend.todayUsd, cap, spend.todayDate)\n : budgetMeter(daemon?.todaySpentUsd ?? null, cap, null);\n if (meter.state === 'unknown') return meter.note;\n return `${formatUsd(spend ? spend.todayUsd : (daemon?.todaySpentUsd ?? null))} spent today`;\n }\n case 'perTickItems':\n return lastTick ? `${formatCount(lastTick.itemsConsidered)} considered on the last tick` : null;\n case 'parallel':\n return lastTick?.dispatches ? `${lastTick.dispatches.length} dispatched on the last tick` : null;\n case 'intervalMs':\n return daemon?.lastTickAt ? `last tick ${formatAge(daemon.lastTickAt)} ago` : null;\n default:\n return null;\n }\n}\n\nexport function CapsPanel({ caps, snapshot, guard, dispatchEnabled }: CapsPanelProps) {\n const [activeKey, setActiveKey] = useState<string | null>(null);\n const [busyKey, setBusyKey] = useState<string | null>(null);\n const [appliedKey, setAppliedKey] = useState<string | null>(null);\n const locked = !dispatchEnabled || guard.readOnly;\n\n function commit(id: string, reason: string, run: () => Promise<unknown>) {\n setActiveKey(id);\n setAppliedKey(null);\n guard.request(async () => {\n setBusyKey(id);\n try {\n await run();\n setAppliedKey(id);\n } finally {\n setBusyKey(null);\n }\n }, reason);\n }\n\n const limits = caps.foundryLimits ?? [];\n\n return (\n <section className={styles.panel} aria-label=\"Budget and limits\">\n <div className={styles.panelHead}>\n <h3 className={styles.panelTitle}>Budget and limits</h3>\n <p className={styles.panelNote}>Committed on blur or Enter. The daemon re-reads config each tick, so changes apply live.</p>\n </div>\n\n <div className={styles.capGrid}>\n {CAP_FIELDS.map((spec) => (\n <CapField\n key={spec.key}\n spec={spec}\n stored={readCap(caps, spec.key)}\n usage={usageFor(spec.key, caps, snapshot)}\n disabled={locked || (busyKey !== null && busyKey !== spec.key)}\n busy={busyKey === spec.key}\n applied={appliedKey === spec.key}\n error={activeKey === spec.key ? guard.error : null}\n onCommit={(stored) =>\n commit(spec.key, `Changing ${spec.label.toLowerCase()} requires the dispatch token.`, () =>\n updateVerseCaps(capPatch(spec.key, stored)),\n )\n }\n />\n ))}\n </div>\n\n <div className={`${styles.panelHead} ${styles.panelHeadSpaced}`}>\n <h3 className={styles.panelTitle}>Per-engine dispatch limits</h3>\n </div>\n {limits.length === 0 ? (\n <p className={styles.empty}>\n No per-engine dispatch limits are configured. Every engine is bounded only by the caps above and by its own\n provider quota.\n </p>\n ) : (\n <div className={styles.capGrid}>\n {limits.map((limit, index) => (\n <FoundryLimitField\n key={`${limit.engine}:${limit.window}`}\n limit={limit}\n usage={engineUsage(limit.engine, snapshot)}\n disabled={locked || (busyKey !== null && busyKey !== limitId(limit))}\n busy={busyKey === limitId(limit)}\n applied={appliedKey === limitId(limit)}\n error={activeKey === limitId(limit) ? guard.error : null}\n onCommit={(max) =>\n commit(limitId(limit), `Changing the ${limit.engine} dispatch limit requires the dispatch token.`, () => {\n const next = limits.map((entry, i) => (i === index ? { ...entry, max } : entry));\n return updateVerseCaps({ foundryLimits: next });\n })\n }\n />\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction limitId(limit: VerseFoundryLimit): string {\n return `foundry:${limit.engine}:${limit.window}`;\n}\n\nfunction engineUsage(engine: string, snapshot: VerseControlSnapshot): string | null {\n // `/api/verse/control` sends raw frontier-usage rows; the standing word\n // (\"ok\"/\"warn\"/\"over\"/\"unlimited\") is derived here rather than served, so\n // the client and the server cannot disagree about a threshold they both own.\n const row = snapshot.quota?.find((e) => e.engine === engine);\n if (!row) return null;\n const standing = engineQuotaStanding(row);\n const quota = standing === 'unlimited' ? 'no limit configured' : standing;\n // `callsToday` is NOT a 24h figure: frontier-usage counts it over the\n // CONFIGURED limit window, which the row carries as `limitWindow`. Saying\n // \"24h\" under a field labelled \"dispatches / 1h\" described one number two\n // contradictory ways.\n return `${formatCount(row.callsToday)} dispatched in the last ${row.limitWindow ?? '1d'} · ${quota}`;\n}\n\ninterface FieldShellProps {\n id: string;\n label: string;\n unit: string;\n help?: string;\n usage: string | null;\n value: string;\n invalid: string | null;\n disabled: boolean;\n busy: boolean;\n applied: boolean;\n error: string | null;\n onChange: (next: string) => void;\n onCommit: () => void;\n step: number;\n min: number;\n max: number;\n}\n\nfunction FieldShell(props: FieldShellProps) {\n const describedBy = [props.usage ? `${props.id}-usage` : null, props.help ? `${props.id}-help` : null]\n .filter((x): x is string => x !== null)\n .join(' ');\n return (\n <div className={styles.cap}>\n <label className={styles.capLabel} htmlFor={props.id}>\n {props.label}\n </label>\n <div className={styles.capRow}>\n <input\n id={props.id}\n type=\"number\"\n inputMode=\"decimal\"\n className={`${styles.capInput} ${props.invalid ? styles.capInputInvalid : ''}`}\n value={props.value}\n step={props.step}\n min={props.min}\n max={props.max}\n disabled={props.disabled || props.busy}\n aria-invalid={props.invalid ? true : undefined}\n aria-describedby={describedBy || undefined}\n onChange={(e) => props.onChange(e.target.value)}\n onBlur={props.onCommit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n props.onCommit();\n }\n }}\n />\n <span className={styles.capUnit}>{props.unit}</span>\n </div>\n {props.usage ? (\n <span className={styles.capUsage} id={`${props.id}-usage`}>\n {props.usage}\n </span>\n ) : null}\n {props.help ? (\n <span className={styles.capHelp} id={`${props.id}-help`}>\n {props.help}\n </span>\n ) : null}\n {props.invalid ? (\n <span className={styles.capError} role=\"alert\">\n {props.invalid}\n </span>\n ) : null}\n {props.error && !props.invalid ? (\n <span className={styles.capError} role=\"alert\">\n {props.error}\n </span>\n ) : null}\n {props.applied && !props.invalid && !props.error ? <span className={styles.capApplied}>applied live</span> : null}\n </div>\n );\n}\n\nfunction CapField({\n spec,\n stored,\n usage,\n disabled,\n busy,\n applied,\n error,\n onCommit,\n}: {\n spec: CapFieldSpec;\n stored: number | null;\n usage: string | null;\n disabled: boolean;\n busy: boolean;\n applied: boolean;\n error: string | null;\n onCommit: (stored: number) => void;\n}) {\n const canonical = stored === null ? '' : String(spec.toDisplay(stored));\n const [draft, setDraft] = useState(canonical);\n const [invalid, setInvalid] = useState<string | null>(null);\n\n // The server is the authority: when its value changes under us (another tab,\n // another cap's POST returning a fresh snapshot) adopt it, unless the\n // operator is mid-edit with something invalid they still need to see.\n useEffect(() => {\n if (invalid === null) setDraft(canonical);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- adopt server value only when it actually changes\n }, [canonical]);\n\n function commit() {\n if (draft === canonical) {\n setInvalid(null);\n return;\n }\n const result = validateCap(spec, draft);\n if (!result.ok) {\n setInvalid(result.error);\n return;\n }\n setInvalid(null);\n onCommit(result.stored);\n }\n\n return (\n <FieldShell\n id={`cap-${spec.key.replace('.', '-')}`}\n label={spec.label}\n unit={spec.unit}\n help={spec.help}\n usage={usage}\n value={draft}\n invalid={invalid}\n // `stored === null` means \"not configured yet\" — the ONE state this\n // control most needs to be editable in. Disabling it made Max\n // concurrent and all three tiers permanently uneditable on a default\n // config, which is the default. `commit()` already handles an empty\n // untouched field: `draft === canonical` is `'' === ''`, so it posts\n // nothing until something is typed.\n disabled={disabled}\n busy={busy}\n applied={applied}\n error={error}\n step={spec.step}\n min={spec.min}\n max={spec.max}\n onChange={(next) => {\n setDraft(next);\n if (invalid) setInvalid(null);\n }}\n onCommit={commit}\n />\n );\n}\n\nfunction FoundryLimitField({\n limit,\n usage,\n disabled,\n busy,\n applied,\n error,\n onCommit,\n}: {\n limit: VerseFoundryLimit;\n usage: string | null;\n disabled: boolean;\n busy: boolean;\n applied: boolean;\n error: string | null;\n onCommit: (max: number) => void;\n}) {\n const canonical = String(limit.max);\n const [draft, setDraft] = useState(canonical);\n const [invalid, setInvalid] = useState<string | null>(null);\n\n useEffect(() => {\n if (invalid === null) setDraft(canonical);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- adopt server value only when it actually changes\n }, [canonical]);\n\n function commit() {\n if (draft === canonical) {\n setInvalid(null);\n return;\n }\n const result = validateFoundryMax(draft, limit.engine);\n if (!result.ok) {\n setInvalid(result.error);\n return;\n }\n setInvalid(null);\n onCommit(result.stored);\n }\n\n return (\n <FieldShell\n id={`cap-foundry-${limit.engine}-${limit.window}`}\n label={limit.engine}\n unit={`dispatches / ${limit.window}`}\n usage={usage}\n value={draft}\n invalid={invalid}\n disabled={disabled}\n busy={busy}\n applied={applied}\n error={error}\n step={1}\n min={FOUNDRY_LIMIT_MAX_RANGE.min}\n max={FOUNDRY_LIMIT_MAX_RANGE.max}\n onChange={(next) => {\n setDraft(next);\n if (invalid) setInvalid(null);\n }}\n onCommit={commit}\n />\n );\n}\n","/**\n * routes/verse/autonomy/use-ticker.ts — a shared 1Hz clock for the countdown\n * and the relative ages in the status header — one interval per consumer\n * rather than a bespoke timer inside each panel.\n *\n * It deliberately keeps ticking under `prefers-reduced-motion`: a countdown is\n * information, not decoration. The design language's quiet-motion rule governs\n * transitions and animation, not numbers that have to stay true.\n */\nimport { useEffect, useState } from 'react';\n\nexport function useNow(intervalMs = 1000): number {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), intervalMs);\n return () => clearInterval(id);\n }, [intervalMs]);\n return now;\n}\n","/**\n * routes/verse/autonomy/StatusHeader.tsx — the five questions the cockpit has\n * to answer before the operator reads anything else: is it running, what is it\n * doing, what has it spent, when does it move next, and is the leash on.\n *\n * Epistemic rule enforced here: the daemon's run state is only stated when\n * `sourceQuality` says the observation is healthy AND complete. A degraded\n * read renders \"unknown\" — never \"stopped\", which would read as a fact.\n * The kill switch outranks everything: while it is engaged the header says so\n * regardless of what the daemon ledger claims.\n */\nimport { isKnown } from '../../../components/primitives/Epistemic.js';\nimport type { VerseControlSnapshot } from './control-types.js';\nimport { budgetMeter, countdownLabel, describeTickOutcome, formatClock, formatInterval, formatRelative, nextTickAt, UNKNOWN } from './format.js';\nimport { useNow } from './use-ticker.js';\nimport styles from './autonomy.module.css';\n\nexport type RunState = 'running' | 'stopped' | 'unknown' | 'killed';\n\nexport function runStateOf(snapshot: VerseControlSnapshot): { state: RunState; label: string } {\n // \"Kill switch engaged\", not \"Emergency stop engaged\". The sentinel has two\n // authors — the Emergency stop button and the ordinary `Stop loop`, which\n // `stopDaemon()` implements as `setKill(true)` — and the snapshot cannot\n // tell them apart. Naming the switch rather than the button states the fact\n // both paths share instead of accusing an operator who only pressed Stop.\n if (snapshot.killSwitch?.state === 'active') return { state: 'killed', label: 'Kill switch engaged' };\n const daemon = snapshot.daemon;\n if (!daemon || !isKnown(daemon.sourceQuality)) return { state: 'unknown', label: 'Run state unknown' };\n if (daemon.runtimeState === 'running') return { state: 'running', label: 'Running' };\n if (daemon.runtimeState === 'stopped') return { state: 'stopped', label: 'Stopped' };\n return { state: 'unknown', label: 'Run state unknown' };\n}\n\nexport function StatusHeader({ snapshot }: { snapshot: VerseControlSnapshot }) {\n const now = useNow(1000);\n const { state, label } = runStateOf(snapshot);\n const daemon = snapshot.daemon;\n const observed = isKnown(daemon?.sourceQuality);\n\n const lastTick = daemon?.ticks?.[daemon.ticks.length - 1] ?? null;\n const outcome = describeTickOutcome(lastTick?.reason);\n const directionMode = snapshot.fleet?.directionMode ?? lastTick?.directionMode ?? null;\n\n // The enrollment registry arrives as `scope.repos`; a missing scope block is\n // unknown (UNKNOWN), which is not the same as an enrolled-zero registry.\n const repos = snapshot.scope?.repos ?? null;\n\n const interval = snapshot.caps?.intervalMs ?? null;\n const next = state === 'running' ? nextTickAt(daemon?.lastTickAt, interval) : null;\n // `spend.todayUsd` belongs to `spend.todayDate`, and the daemon writes that\n // figure once a day and leaves it there. Handing the meter the date lets it\n // say \"nothing recorded today\" instead of presenting a three-week-old ledger\n // day as today's spend. When only the legacy daemon observation exists there\n // is no date to check, so it is passed as null and the meter behaves as before.\n const spend = snapshot.spend;\n const budget = spend\n ? budgetMeter(spend.todayUsd, snapshot.caps?.dailyBudgetUsd ?? null, spend.todayDate)\n : budgetMeter(daemon?.todaySpentUsd ?? null, snapshot.caps?.dailyBudgetUsd ?? null, null);\n\n return (\n <section className={styles.status} aria-label=\"Autonomy status\">\n <div className={styles.statusTop}>\n <span className={styles.runState} data-state={state}>\n <span className={styles.runDot} aria-hidden=\"true\" />\n {label}\n </span>\n <div className={styles.facts}>\n <div className={styles.fact}>\n <span className={styles.factLabel}>Direction</span>\n <span className={styles.factValue}>{directionMode ?? 'default'}</span>\n </div>\n <div className={styles.fact}>\n <span className={styles.factLabel}>Last tick</span>\n <span className={styles.factValue} data-tone={outcome.tone}>\n {observed && daemon?.lastTickAt ? `${formatClock(daemon.lastTickAt)} · ${outcome.label}` : outcome.label}\n </span>\n </div>\n <div className={styles.fact}>\n <span className={styles.factLabel}>Next tick</span>\n <span className={styles.factValue}>\n {state === 'running' ? countdownLabel(next, now) : state === 'killed' ? 'blocked' : 'not scheduled'}\n </span>\n </div>\n <div className={styles.fact}>\n <span className={styles.factLabel}>Interval</span>\n <span className={styles.factValue}>{formatInterval(interval)}</span>\n </div>\n <div className={styles.fact}>\n <span className={styles.factLabel}>Scope</span>\n <span className={styles.factValue} data-tone={(repos?.length ?? 0) === 0 ? 'warning' : undefined}>\n {repos ? `${repos.length} repos` : UNKNOWN}\n </span>\n </div>\n <div className={styles.fact}>\n <span className={styles.factLabel}>Awaiting you</span>\n <span className={styles.factValue}>{typeof snapshot.pendingApprovals === 'number' ? `${snapshot.pendingApprovals} approvals` : UNKNOWN}</span>\n </div>\n <div className={styles.fact}>\n <span className={styles.factLabel}>Started</span>\n <span className={styles.factValue}>{observed ? formatRelative(daemon?.startedAt) : UNKNOWN}</span>\n </div>\n </div>\n </div>\n\n <div className={styles.budget}>\n <div className={styles.budgetLine}>\n <span className={styles.budgetLabel}>{budget.label}</span>\n <span className={styles.budgetNote}>{budget.note}</span>\n </div>\n <div\n className={styles.meter}\n data-state={budget.state}\n role=\"meter\"\n aria-label=\"Today's spend against the daily budget\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={budget.percent ?? undefined}\n aria-valuetext={`${budget.label}. ${budget.note}`}\n >\n <div className={styles.meterFill} style={{ width: `${budget.percent ?? 0}%` }} />\n </div>\n </div>\n </section>\n );\n}\n","/**\n * routes/verse/autonomy/DaemonControls.tsx — THREE stops with three honestly\n * different scopes, ordered by how much they break.\n *\n * 1. Pause / Resume — primary, UNCONFIRMED, obviously reversible.\n * `POST /api/verse/daemon {action:'pause'}` writes the daemon-scoped\n * sentinel `~/.ashlr/daemon.paused`. It halts autonomous dispatch and\n * NOTHING else: the operator's own write tools keep working, a resident\n * loop parks instead of dying, and Resume brings it back with no restart.\n * It gets no confirm dialog on purpose — a control that is free to undo\n * must be free to reach, or people reach for the drastic one instead.\n *\n * 2. Stop loop — confirmed. `stopDaemon()` is still `setKill(true)`\n * (core/daemon/loop.ts), so the ordinary stop engages the SAME global\n * sentinel as the emergency button. The confirm says that plainly and\n * points at Pause, because with Pause shipped, Stop is now the WRONG\n * choice for \"just halt the loop\" rather than the only one.\n *\n * 3. Emergency stop — confirmed, below a rule, danger-styled. The global\n * kill switch, stated at its true blast radius.\n *\n * VERSE-CONTRACT-V2's two rules still hold: the kill switch is never labelled\n * \"pause\", and the confirm states what else it disables before the click. The\n * word \"pause\" now belongs to the control that earns it.\n */\nimport { useState } from 'react';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { ConfirmDialog } from '../../inbox/ConfirmDialog.js';\nimport { engageEmergencyStop, releaseEmergencyStop, runDaemonAction } from './control-queries.js';\nimport type { VerseControlSnapshot, VerseDaemonActionResult } from './control-types.js';\nimport { runStateOf } from './StatusHeader.js';\nimport type { GuardedAction } from './use-guarded-action.js';\nimport styles from './autonomy.module.css';\n\ntype Confirming = 'engage' | 'release' | 'stop' | null;\n\nexport interface DaemonControlsProps {\n snapshot: VerseControlSnapshot;\n guard: GuardedAction;\n /** False when the server was started without dispatch: every POST 404s. */\n dispatchEnabled: boolean;\n}\n\nexport function DaemonControls({ snapshot, guard, dispatchEnabled }: DaemonControlsProps) {\n const [confirming, setConfirming] = useState<Confirming>(null);\n // The server's own account of what the last action did. Every daemon action\n // returns one and every one of them used to be discarded — which is how\n // \"Stop loop\" could engage the global kill switch without the operator ever\n // being told. Cleared on the next action so it is never stale.\n const [lastNote, setLastNote] = useState<string | null>(null);\n const { state } = runStateOf(snapshot);\n const killed = snapshot.killSwitch?.state === 'active';\n const killUnknown = snapshot.killSwitch?.state === 'unknown';\n // The pause is its own sentinel with its own third state. `unknown` means\n // the sentinel could not be read, and the daemon FAILS SAFE by treating that\n // as paused — so the UI must too, rather than showing a running loop.\n const pauseState = snapshot.pause?.state ?? 'unknown';\n const paused = pauseState !== 'running';\n const pauseUnknown = pauseState === 'unknown';\n const locked = !dispatchEnabled || guard.readOnly;\n const disabled = locked || guard.busy;\n\n const noteOf = (result: VerseDaemonActionResult) => setLastNote(result.note || null);\n\n return (\n <section className={styles.panel} aria-label=\"Loop controls\">\n <div className={styles.panelHead}>\n <h3 className={styles.panelTitle}>Controls</h3>\n </div>\n\n <div className={styles.controls}>\n {paused ? (\n <button\n type=\"button\"\n className={`${styles.button} ${styles.buttonPrimary}`}\n disabled={disabled}\n onClick={() =>\n guard.request(\n () => runDaemonAction('resume'),\n 'Resuming autonomous dispatch requires the dispatch token.',\n noteOf,\n )\n }\n >\n Resume\n </button>\n ) : (\n // No confirm. Pausing costs nothing, undoes in one click, and leaves\n // every other capability intact — a dialog here would only teach the\n // operator to click through dialogs.\n <button\n type=\"button\"\n className={`${styles.button} ${styles.buttonPrimary}`}\n disabled={disabled}\n onClick={() =>\n guard.request(\n () => runDaemonAction('pause'),\n 'Pausing autonomous dispatch requires the dispatch token.',\n noteOf,\n )\n }\n >\n Pause\n </button>\n )}\n {/* WHY IS THIS GREYED OUT. The reason a control is refusing is the\n one thing a disabled control must be able to say, and a native\n `title` said it to a mouse and to nobody else. `disabled` also\n eats pointer events on the button itself — the Tooltip listens on\n its wrapper, so the reason survives that too. */}\n <Tooltip\n label={\n killed\n ? 'Release the emergency stop before starting the loop.'\n : paused\n ? 'Dispatch is paused — resume before starting the loop.'\n : ''\n }\n >\n <button\n type=\"button\"\n className={styles.button}\n disabled={disabled || state === 'running' || killed || paused}\n onClick={() =>\n guard.request(\n () => runDaemonAction('start'),\n 'Starting the autonomous loop requires the dispatch token.',\n noteOf,\n )\n }\n >\n Start loop\n </button>\n </Tooltip>\n <button\n type=\"button\"\n className={styles.button}\n disabled={disabled || state === 'stopped'}\n onClick={() => setConfirming('stop')}\n >\n Stop loop\n </button>\n <Tooltip label={paused ? 'Dispatch is paused — resume before running a tick.' : ''}>\n <button\n type=\"button\"\n className={styles.button}\n disabled={disabled || killed || paused}\n onClick={() =>\n guard.request(\n () => runDaemonAction('once'),\n 'Running one tick requires the dispatch token.',\n noteOf,\n )\n }\n >\n Run one tick\n </button>\n </Tooltip>\n </div>\n\n {paused ? (\n <p className={styles.actionNote} role=\"status\">\n {pauseUnknown\n ? 'Dispatch is treated as paused: the pause sentinel could not be read, and the daemon fails safe rather than running on an unreadable signal.'\n : 'Autonomous dispatch is paused. The loop parks between ticks; your own write tools are unaffected, and the global kill switch is not engaged.'}\n </p>\n ) : null}\n\n <div className={styles.emergency}>\n {killed ? (\n <>\n <button type=\"button\" className={styles.button} disabled={disabled} onClick={() => setConfirming('release')}>\n Release emergency stop\n </button>\n <p className={styles.emergencyNote}>\n The global kill switch is engaged. The daemon refuses to tick <em>and</em> the agent&rsquo;s own write tools\n refuse to edit anything, anywhere — not just in enrolled repos.\n </p>\n </>\n ) : (\n <>\n <button type=\"button\" className={styles.emergencyButton} disabled={disabled} onClick={() => setConfirming('engage')}>\n Emergency stop\n </button>\n <p className={styles.emergencyNote}>\n Engages the global kill switch. Wider than &ldquo;stop the loop&rdquo;: it also disables the agent&rsquo;s own\n write tools everywhere until you release it. To halt only the loop, use <strong>Pause</strong>.\n {killUnknown ? ' The switch’s current state could not be read.' : ''}\n </p>\n </>\n )}\n </div>\n\n {guard.error && confirming === null ? (\n <p className={styles.capError} role=\"alert\">\n {guard.error}\n </p>\n ) : null}\n\n {lastNote && !guard.error ? (\n <p className={styles.actionNote} role=\"status\">\n {lastNote}\n </p>\n ) : null}\n\n <ConfirmDialog\n open={confirming === 'stop'}\n onClose={() => setConfirming(null)}\n title=\"Stop the autonomous loop?\"\n body={\n <>\n This is the ordinary stop, but it works by engaging the global kill switch — the same\n <code> ~/.ashlr/KILL </code> sentinel the emergency stop writes. While it is set, the agent&rsquo;s own write\n tools also refuse to edit anything, anywhere, until you release it from this panel.\n <br />\n <br />\n If you only want the loop to stop working, <strong>Pause</strong> does exactly that and nothing else — it\n leaves your own tools alone and undoes in one click.\n <br />\n <br />\n Nothing in flight is rolled back. The loop will not restart by itself.\n </>\n }\n confirmLabel=\"Stop loop\"\n destructive\n busy={guard.busy}\n error={guard.error}\n onConfirm={() =>\n guard.request(\n () => runDaemonAction('stop'),\n 'Stopping the autonomous loop requires the dispatch token.',\n (result) => {\n noteOf(result);\n setConfirming(null);\n },\n )\n }\n />\n\n <ConfirmDialog\n open={confirming === 'engage'}\n onClose={() => setConfirming(null)}\n title=\"Engage the emergency stop?\"\n body={\n <>\n This writes the global kill switch. It stops the autonomous loop <strong>and</strong> disables the\n agent&rsquo;s own write tools — every edit, apply, and merge path refuses while it is engaged, in every repo,\n not only the enrolled ones. Nothing in flight is rolled back; nothing new can start.\n <br />\n <br />\n <strong>Pause</strong> halts autonomous dispatch only and leaves everything else working.{' '}\n <strong>Stop loop</strong> is not narrower than this button: it engages the same global kill switch.\n </>\n }\n confirmLabel=\"Engage emergency stop\"\n destructive\n busy={guard.busy}\n error={guard.error}\n onConfirm={() =>\n guard.request(async () => {\n await engageEmergencyStop();\n setConfirming(null);\n }, 'Engaging the emergency stop requires the dispatch token.')\n }\n />\n\n <ConfirmDialog\n open={confirming === 'release'}\n onClose={() => setConfirming(null)}\n title=\"Release the emergency stop?\"\n body={\n <>\n This clears the global kill switch. Write tools become usable again immediately. The autonomous loop does\n not restart by itself — use <strong>Start loop</strong> when you want it running.\n </>\n }\n confirmLabel=\"Release emergency stop\"\n busy={guard.busy}\n error={guard.error}\n onConfirm={() =>\n guard.request(async () => {\n await releaseEmergencyStop();\n setConfirming(null);\n }, 'Releasing the emergency stop requires the dispatch token.')\n }\n />\n </section>\n );\n}\n","/**\n * routes/verse/autonomy/FleetPanel.tsx — what the fleet is doing right now.\n *\n * The test this panel has to pass: a reader should be able to answer \"is it\n * working, and on what\" without opening a log. That means three things on\n * screen at once —\n *\n * - a verdict in words at the top (`fleetPressure`), because \"4 agents\" is\n * not an answer if three of them are queued;\n * - slot occupancy against the EFFECTIVE concurrency, not the configured\n * slot count, so a full runtime reads as full;\n * - one row per agent with what it is working on and how long it has been\n * at it, ticking, because a stuck agent is identified by its elapsed time\n * and nothing else.\n *\n * The failure this panel exists to prevent: a queue that presents as slowness.\n * When turns are waiting, the panel says they are waiting, says they have not\n * started, and — on a runtime that serializes — says the queue drains one at a\n * time. Elapsed time for a queued turn is labelled as queued, never as work,\n * because those two numbers mean opposite things to whoever is deciding\n * whether something is wrong.\n */\nimport type { ReactNode } from 'react';\nimport { Meter } from '../../../components/primitives/Meter.js';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport { UNKNOWN, formatCount } from './format.js';\nimport type { FleetAgent, FleetSnapshot, OptionalFleetRead } from './fleet-contract.js';\nimport {\n elapsedSince,\n fleetPressure,\n orderAgents,\n runtimeCapacity,\n slotUtilisation,\n type RuntimeCapacity,\n} from './fleet-model.js';\nimport type { ServingRuntimeSnapshot } from './fleet-contract.js';\nimport { useNow } from './use-ticker.js';\nimport styles from './autonomy.module.css';\n\nconst PRESSURE_TONE: Record<string, Tone> = {\n idle: 'neutral',\n working: 'running',\n saturated: 'running',\n queued: 'warning',\n unknown: 'unknown',\n};\n\nconst AGENT_TONE: Record<FleetAgent['state'], Tone> = {\n running: 'running',\n finishing: 'running',\n queued: 'neutral',\n};\n\nexport interface FleetPanelProps {\n read: OptionalFleetRead<FleetSnapshot> | null;\n /** Needed for the EFFECTIVE concurrency; occupancy is meaningless without it. */\n runtime: ServingRuntimeSnapshot | null;\n loading?: boolean;\n}\n\nexport function FleetPanel({ read, runtime, loading = false }: FleetPanelProps): ReactNode {\n const now = useNow(1000);\n const fleet = read?.value ?? null;\n const capacity = runtimeCapacity(runtime);\n\n // Slot figures come from the fleet snapshot when it has them and from the\n // runtime otherwise — one number, two possible reporters, never two numbers.\n const busy = fleet?.slotsBusy ?? runtime?.slotsBusy ?? null;\n const utilisation = slotUtilisation(busy, capacity.effectiveConcurrency);\n const pressure = fleetPressure(fleet, utilisation, capacity);\n const agents = fleet ? orderAgents(fleet.agents) : [];\n const queued = fleet?.queueDepth ?? agents.filter((a) => a.state === 'queued').length;\n\n return (\n <section className={styles.panel} aria-labelledby=\"verse-fleet-title\">\n <div className={styles.panelHead}>\n <h3 id=\"verse-fleet-title\" className={styles.panelTitle}>\n Fleet in flight\n </h3>\n <p className={styles.panelNote}>\n Every agent mid-turn right now, what it is working on, and how long it has been at it.\n </p>\n </div>\n\n {loading && read === null ? (\n <p className={styles.empty}>Reading the fleet…</p>\n ) : read === null || (!read.available && read.value === null) ? (\n <p className={styles.empty}>\n <span className={styles.emptyStrong}>No fleet source. </span>\n {read?.reason ??\n 'Nothing answered for the fleet, so what is in flight cannot be listed. That is a missing reading, not an empty fleet.'}\n </p>\n ) : fleet === null ? (\n <p className={styles.empty}>\n <span className={styles.emptyStrong}>Unreadable reading. </span>\n {read.reason ?? 'The fleet reading could not be narrowed, so nothing is shown rather than guessed.'}\n </p>\n ) : (\n <>\n <div className={styles.pressure} data-state={pressure.state}>\n <span className={styles.pressureHead}>\n <span className={styles.pressureHeadline}>{pressure.headline}</span>\n <StatusBadge status={pressure.state} tone={PRESSURE_TONE[pressure.state] ?? 'unknown'}>\n {pressure.state}\n </StatusBadge>\n </span>\n <p className={styles.pressureDetail}>{pressure.detail}</p>\n </div>\n\n <div className={styles.fleetMeters}>\n <Meter\n value={utilisation.busy}\n max={utilisation.total}\n label=\"Slot utilisation\"\n valueText={\n utilisation.percent === null\n ? 'unknown'\n : `${utilisation.busy} / ${utilisation.total} · ${utilisation.percent}%`\n }\n tone={utilisation.saturated ? 'warning' : undefined}\n />\n <div className={styles.fact}>\n <span className={styles.factLabel}>Queue depth</span>\n <span\n className={styles.factValue}\n data-tone={queued > 0 ? 'warning' : undefined}\n >\n {fleet.queueDepth === null && agents.length === 0\n ? UNKNOWN\n : `${formatCount(queued)} waiting`}\n </span>\n </div>\n </div>\n\n {utilisation.saturated && queued === 0 ? (\n <p className={styles.capHelp}>\n Every slot is occupied. Nothing is waiting yet, but the next turn will.\n </p>\n ) : null}\n\n {agents.length === 0 ? (\n <p className={styles.empty}>\n <span className={styles.emptyStrong}>Nothing in flight. </span>\n No agent is mid-turn. The fleet answered and reported an empty list — an idle fleet,\n not a missing reading.\n </p>\n ) : (\n <div className={styles.tableScroll}>\n <table className={styles.table}>\n <caption className={styles.srOnly}>\n Agents in flight: state, task, repository, model, slot and elapsed time\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">State</th>\n <th scope=\"col\">Working on</th>\n <th scope=\"col\">Repo</th>\n <th scope=\"col\">Model</th>\n <th scope=\"col\">Slot</th>\n <th scope=\"col\">Elapsed</th>\n </tr>\n </thead>\n <tbody>\n {agents.map((agent) => (\n <AgentRow key={agent.id} agent={agent} now={now} capacity={capacity} />\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {fleet.notes.length > 0 ? (\n <ul className={styles.noteList}>\n {fleet.notes.map((n) => (\n <li key={n} className={styles.capHelp}>\n {n}\n </li>\n ))}\n </ul>\n ) : null}\n </>\n )}\n </section>\n );\n}\n\n/**\n * One agent.\n *\n * The elapsed column is the reason this table exists, and it is the column\n * most easily made to lie: for a QUEUED turn the same number is time spent\n * waiting, not time spent working. Labelling it \"queued\" rather than letting\n * it sit under the same header as a running turn's duration is the difference\n * between \"this one is stuck\" and \"this one has not started\".\n */\nfunction AgentRow({\n agent,\n now,\n capacity,\n}: {\n agent: FleetAgent;\n now: number;\n capacity: RuntimeCapacity;\n}): ReactNode {\n const elapsed = elapsedSince(agent.startedAt, now);\n const queued = agent.state === 'queued';\n return (\n <tr>\n <td>\n <StatusBadge status={agent.state} tone={AGENT_TONE[agent.state]}>\n {agent.state}\n </StatusBadge>\n </td>\n <td className={styles.cellSummary}>\n {agent.task ?? <span className={styles.capHelp}>not reported</span>}\n </td>\n <td className={styles.cellRepo}>{agent.repo ?? UNKNOWN}</td>\n <td className={styles.cellRepo}>{agent.model ?? agent.engine ?? UNKNOWN}</td>\n <td className={styles.cellTime}>\n {agent.slot === null ? (\n queued ? (\n <span\n className={styles.capHelp}\n title={\n capacity.verdict === 'serialized'\n ? 'This runtime serializes, so only one slot ever frees up at a time.'\n : undefined\n }\n >\n no slot\n </span>\n ) : (\n UNKNOWN\n )\n ) : (\n `#${agent.slot}`\n )}\n </td>\n <td className={styles.cellTime}>\n {elapsed}\n {queued ? <span className={styles.elapsedQualifier}> queued</span> : null}\n </td>\n </tr>\n );\n}\n","/**\n * routes/verse/autonomy/GoalsBacklogPanel.tsx — read-only context for what the\n * loop is aiming at and what it has queued.\n *\n * V2 is explicit that goal mutation stays out of this surface, so there are no\n * controls here at all — only the two existing reads. `GET /api/backlog`\n * returns `null` when no backlog has been built, which is \"not yet\", not an\n * error, and renders as such.\n */\nimport { SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { verseBacklogQuery, verseGoalsQuery } from './control-queries.js';\nimport styles from './autonomy.module.css';\n\nconst MAX_ROWS = 8;\n\nexport function GoalsBacklogPanel() {\n const goals = useQuery(verseGoalsQuery);\n const backlog = useQuery(verseBacklogQuery);\n\n const activeGoals = (goals.data ?? []).filter((g) => g.status !== 'done' && g.status !== 'archived');\n const items = backlog.data?.items ?? [];\n\n return (\n <section className={styles.panel} aria-label=\"Goals and backlog\">\n <div className={styles.panelHead}>\n <h3 className={styles.panelTitle}>Goals and backlog</h3>\n <p className={styles.panelNote}>Read-only in this view.</p>\n </div>\n\n <div className={styles.summaryColumns}>\n <div>\n <p className={styles.factLabel}>Active goals</p>\n {goals.status === 'loading' ? (\n <div className={styles.skeletons}>\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : goals.status === 'error' ? (\n <p className={styles.error} role=\"alert\">\n {goals.error?.message ?? 'Could not read goals.'}\n </p>\n ) : activeGoals.length === 0 ? (\n <p className={styles.empty}>No active goals. The loop falls back to the backlog for work.</p>\n ) : (\n <div className={styles.summaryList}>\n {activeGoals.slice(0, MAX_ROWS).map((goal) => {\n const done = Math.round((goal.progress?.fractionDone ?? 0) * 100);\n return (\n <div className={styles.summaryRow} key={goal.id}>\n <span className={styles.summaryTitle} title={goal.objective}>\n {goal.objective}\n </span>\n <span className={styles.summaryMeta}>\n {done}% · {goal.status}\n </span>\n </div>\n );\n })}\n {activeGoals.length > MAX_ROWS ? (\n <p className={styles.panelNote}>+{activeGoals.length - MAX_ROWS} more</p>\n ) : null}\n </div>\n )}\n </div>\n\n <div>\n <p className={styles.factLabel}>Backlog</p>\n {backlog.status === 'loading' ? (\n <div className={styles.skeletons}>\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : backlog.status === 'error' ? (\n <p className={styles.error} role=\"alert\">\n {backlog.error?.message ?? 'Could not read the backlog.'}\n </p>\n ) : backlog.data?.absent ? (\n <p className={styles.empty}>No backlog has been built yet — run a tick, or `ashlr backlog`, to produce one.</p>\n ) : items.length === 0 ? (\n <p className={styles.empty}>The backlog is empty. A tick with nothing to do records `no-backlog` and idles.</p>\n ) : (\n <div className={styles.summaryList}>\n {items.slice(0, MAX_ROWS).map((item, i) => (\n <div className={styles.summaryRow} key={item.id ?? `${item.title ?? 'item'}-${i}`}>\n <span className={styles.summaryTitle} title={item.title}>\n {item.title ?? item.id ?? 'untitled item'}\n </span>\n <span className={styles.summaryMeta}>\n {item.repo ? item.repo.split('/').pop() : '—'}\n {typeof item.score === 'number' ? ` · ${item.score}` : ''}\n </span>\n </div>\n ))}\n {items.length > MAX_ROWS ? <p className={styles.panelNote}>+{items.length - MAX_ROWS} more</p> : null}\n </div>\n )}\n </div>\n </div>\n </section>\n );\n}\n","/**\n * routes/verse/autonomy/fleet-queries.ts — the reads and writes behind the\n * local-fleet surfaces: `GET/POST /api/verse/runtime`,\n * `GET/POST /api/verse/local-only`, and `GET /api/verse/fleet`.\n *\n * Same contract as control-queries.ts — reads are QueryDefs consumed through\n * useQuery, writes go through the mutation-token gate and invalidate exactly\n * the keys they affect — with two differences that both come from these three\n * routes landing in parallel with this surface (owners R, L, F):\n *\n * 1. **The reads do not throw on absence.** A server without these routes\n * answers 404, and a 404 means \"this panel has no source yet\", not\n * \"Autonomy is broken\". The panels render a designed degraded state from\n * `OptionalFleetRead.reason`. 401 still propagates: an expired read\n * session is an unauthorized state for the whole surface.\n * 2. **The bodies are narrowed structurally, not cast.** `fleet-model.ts`\n * projects every field, so a name drift between the route and this client\n * degrades to \"unknown\" rather than throwing at render time.\n *\n * Polling: the fleet and the runtime are the two things on this screen that\n * change while nobody clicks anything, and neither has an SSE event yet, so\n * `useFleetPolling` re-reads them on an interval — pausing while the tab is\n * hidden, because a background tab polling a runtime probe is pure waste.\n */\nimport { useEffect } from 'react';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { useRefetch } from '../../../data/hooks.js';\nimport { VERSE_CONTROL_KEY, VerseControlLockedError } from './control-queries.js';\nimport type {\n FleetSnapshot,\n LocalOnlyPolicy,\n LocalOnlyUpdateResult,\n OptionalFleetRead,\n RuntimeAction,\n RuntimeActionResult,\n ServingRuntimeSnapshot,\n} from './fleet-contract.js';\nimport { projectFleet, projectLocalOnly, projectServingRuntime } from './fleet-model.js';\n\nexport const VERSE_RUNTIME_KEY = 'verse-runtime';\nexport const VERSE_FLEET_KEY = 'verse-fleet';\nexport const VERSE_LOCAL_ONLY_KEY = 'verse-local-only';\n\nfunction describeAbsence(path: string, err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) {\n return `This server does not expose ${path}, so this panel has no source. It is a missing route, not an idle machine.`;\n }\n return `${path} answered HTTP ${err.status}.`;\n }\n return `${path} could not be reached.`;\n}\n\n/**\n * One optional read, projected. `value` is null both when the route was absent\n * and when it answered something this client could not narrow — `available`\n * and `reason` are what tell the two apart.\n */\nfunction optionalRead<T>(\n path: string,\n project: (raw: unknown) => T | null,\n): (signal?: AbortSignal) => Promise<OptionalFleetRead<T>> {\n return async (signal) => {\n try {\n const raw = await apiGet<unknown>(path, signal);\n const value = project(raw);\n if (value === null) {\n return {\n value: null,\n available: true,\n reason: `${path} answered in a shape this client does not recognise, so nothing is shown rather than guessed.`,\n };\n }\n return { value, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { value: null, available: false, reason: describeAbsence(path, err) };\n }\n };\n}\n\n/** GET /api/verse/runtime — is the serving runtime up, and what can it do. */\nexport const servingRuntimeQuery: QueryDef<OptionalFleetRead<ServingRuntimeSnapshot>> = {\n key: VERSE_RUNTIME_KEY,\n fetch: optionalRead('/api/verse/runtime', projectServingRuntime),\n};\n\n/** GET /api/verse/fleet — the agents in flight right now. */\nexport const fleetQuery: QueryDef<OptionalFleetRead<FleetSnapshot>> = {\n key: VERSE_FLEET_KEY,\n fetch: optionalRead('/api/verse/fleet', projectFleet),\n};\n\n/** GET /api/verse/local-only — the refusal policy and what it refuses. */\nexport const localOnlyQuery: QueryDef<OptionalFleetRead<LocalOnlyPolicy>> = {\n key: VERSE_LOCAL_ONLY_KEY,\n fetch: optionalRead('/api/verse/local-only', projectLocalOnly),\n};\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseControlLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/**\n * Start / stop / restart the serving runtime.\n *\n * Every one of these changes what the fleet can do, so all three fleet keys\n * and the control snapshot are invalidated together — a restarted runtime\n * with a stale slot count beside it is exactly the disagreement this surface\n * exists to prevent.\n */\nexport async function runRuntimeAction(action: RuntimeAction): Promise<RuntimeActionResult> {\n const result = await post<RuntimeActionResult>('/api/verse/runtime', { action });\n invalidate(VERSE_RUNTIME_KEY);\n invalidate(VERSE_FLEET_KEY);\n invalidate(VERSE_CONTROL_KEY);\n return result;\n}\n\n/** Turn the local-only refusal on or off. */\nexport async function setLocalOnly(enabled: boolean): Promise<LocalOnlyUpdateResult> {\n const result = await post<LocalOnlyUpdateResult>('/api/verse/local-only', { enabled });\n invalidate(VERSE_LOCAL_ONLY_KEY);\n invalidate(VERSE_CONTROL_KEY);\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Polling\n// ---------------------------------------------------------------------------\n\n/** Fast enough that \"is it working\" is answered live; slow enough to be free. */\nexport const FLEET_POLL_MS = 4000;\n\n/**\n * Keep the runtime and fleet reads live while this section is mounted and the\n * tab is visible.\n *\n * Both routes probe a local process, so this is cheap — but only while someone\n * is looking. `visibilitychange` stops the timer when the tab is hidden and\n * takes one immediate reading when it comes back, so a fleet view returned to\n * after lunch is current on the first frame rather than up to an interval old.\n */\nexport function useFleetPolling(intervalMs: number = FLEET_POLL_MS): void {\n const refetchRuntime = useRefetch(servingRuntimeQuery);\n const refetchFleet = useRefetch(fleetQuery);\n\n useEffect(() => {\n let timer: ReturnType<typeof setInterval> | null = null;\n\n const tick = (): void => {\n refetchRuntime();\n refetchFleet();\n };\n\n const start = (): void => {\n if (timer !== null) return;\n timer = setInterval(tick, intervalMs);\n };\n\n const stop = (): void => {\n if (timer === null) return;\n clearInterval(timer);\n timer = null;\n };\n\n const onVisibility = (): void => {\n if (document.visibilityState === 'hidden') {\n stop();\n return;\n }\n tick();\n start();\n };\n\n if (document.visibilityState !== 'hidden') start();\n document.addEventListener('visibilitychange', onVisibility);\n return () => {\n stop();\n document.removeEventListener('visibilitychange', onVisibility);\n };\n }, [intervalMs, refetchRuntime, refetchFleet]);\n}\n","/**\n * routes/verse/autonomy/LocalOnlyPanel.tsx — the local-only switch, and an\n * honest account of what flipping it does.\n *\n * Local-only is a REFUSAL, not a preference (docs/LOCAL-FLEET.md). Cloud\n * engines become unreachable: `provider-client.ts` throws on a cloud provider\n * without `--allow-cloud` and `router.ts` checks `cloudKeyAvailable`. Calling\n * that \"prefer local models\" would be the single most expensive piece of\n * wrong copy in the app, because an operator who reads it as a preference will\n * assume a frontier dispatch is merely unlikely rather than impossible — and\n * the whole point of the switch is to make accidental spend impossible.\n *\n * So the panel does two things a toggle usually does not:\n *\n * 1. It states the refusal in the present tense, in the operator's own\n * words back to them, before the click.\n * 2. It names, from the LIVE seat roster, exactly which of THEIR seats stop\n * working. \"Blocks cloud engines\" is abstract; \"blocks 3 of your 5 seats,\n * here they are\" is a decision an operator can actually make.\n *\n * Turning it ON is confirm-guarded even though it is reversible, because the\n * blast radius is the point. Turning it OFF is not: re-opening a door the\n * operator deliberately closed is their call, and a dialog there would only\n * teach them to click through dialogs.\n */\nimport { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { StatusBadge } from '../../../components/primitives/StatusBadge.js';\nimport { ConfirmDialog } from '../../inbox/ConfirmDialog.js';\nimport type { LocalOnlyPolicy, OptionalFleetRead } from './fleet-contract.js';\nimport { localOnlyImpact, localOnlySourceNote, type SeatLike } from './fleet-model.js';\nimport { setLocalOnly } from './fleet-queries.js';\nimport type { GuardedAction } from './use-guarded-action.js';\nimport styles from './autonomy.module.css';\n\nexport interface LocalOnlyPanelProps {\n read: OptionalFleetRead<LocalOnlyPolicy> | null;\n /** The live seat roster, so the blast radius is the operator's own number. */\n seats: readonly SeatLike[];\n guard: GuardedAction;\n dispatchEnabled: boolean;\n loading?: boolean;\n}\n\nexport function LocalOnlyPanel({\n read,\n seats,\n guard,\n dispatchEnabled,\n loading = false,\n}: LocalOnlyPanelProps): ReactNode {\n const [confirming, setConfirming] = useState(false);\n const [note, setNote] = useState<string | null>(null);\n\n const policy = read?.value ?? null;\n const impact = localOnlyImpact(policy, seats);\n const sourceNote = localOnlySourceNote(policy);\n const enabled = policy?.enabled ?? false;\n const locked = !dispatchEnabled || guard.readOnly;\n const disabled = locked || guard.busy || !(policy?.mutable ?? false);\n\n const apply = (next: boolean): void => {\n guard.request(\n () => setLocalOnly(next),\n next\n ? 'Turning local-only on requires the dispatch token.'\n : 'Turning local-only off requires the dispatch token.',\n (result) => {\n setNote(result.note || null);\n setConfirming(false);\n },\n );\n };\n\n return (\n <section className={styles.panel} aria-labelledby=\"verse-local-only-title\">\n <div className={styles.panelHead}>\n <h3 id=\"verse-local-only-title\" className={styles.panelTitle}>\n Local only\n </h3>\n <p className={styles.panelNote}>\n A refusal, not a preference. While it is on, cloud engines are unreachable.\n </p>\n </div>\n\n {loading && read === null ? (\n <p className={styles.empty}>Reading the local-only policy…</p>\n ) : read === null || policy === null ? (\n <p className={styles.empty}>\n <span className={styles.emptyStrong}>No local-only source. </span>\n {read?.reason ??\n 'Nothing answered for the local-only policy, so whether cloud engines are reachable cannot be stated here. It is not shown as off — an unread switch is not a switch that is off.'}\n </p>\n ) : (\n <>\n <div className={styles.toggleRow}>\n <span className={styles.toggleState} data-on={enabled ? 'true' : 'false'}>\n <StatusBadge\n status={enabled ? 'local-only-on' : 'local-only-off'}\n tone={enabled ? 'success' : 'neutral'}\n >\n {enabled ? 'on — cloud refused' : 'off — cloud reachable'}\n </StatusBadge>\n </span>\n <button\n type=\"button\"\n className={`${styles.button} ${enabled ? '' : styles.buttonPrimary}`}\n disabled={disabled}\n aria-pressed={enabled}\n onClick={() => (enabled ? apply(false) : setConfirming(true))}\n >\n {enabled ? 'Turn local-only off' : 'Turn local-only on'}\n </button>\n </div>\n\n <p className={styles.policyExplain}>\n {enabled ? (\n <>\n Every non-local engine is <strong>refused at dispatch</strong>. A turn sent to one\n does not fall back, does not queue, and does not run more slowly — it fails with a\n named refusal. Nothing can spend money while this is on.\n </>\n ) : (\n <>\n Cloud engines are reachable. Turning this on makes them <strong>unreachable</strong>,\n not deprioritised: a dispatch to one fails outright rather than being routed\n elsewhere. That is the difference between a budget and a guarantee.\n </>\n )}\n </p>\n\n {sourceNote ? <p className={styles.capHelp}>{sourceNote}</p> : null}\n {!policy.mutable && dispatchEnabled && !guard.readOnly ? (\n <p className={styles.actionNote} role=\"status\">\n This switch is not editable from here, so it is shown read-only rather than as a\n control that would refuse the click.\n </p>\n ) : null}\n\n <div className={styles.impact}>\n <h4 className={styles.impactTitle}>\n {enabled ? 'What is blocked right now' : 'What this would block'}\n </h4>\n <p className={styles.impactSummary}>{impact.summary}</p>\n\n {impact.blocked.length > 0 ? (\n <ul className={styles.seatList}>\n {impact.blocked.map((seat) => (\n <li key={seat.id} className={styles.seatRow}>\n <span className={styles.seatEngine} data-engine={seat.engine}>\n {seat.engine}\n </span>\n <span className={styles.seatLabel}>{seat.label}</span>\n <span className={styles.seatRefusal}>{impact.refusalFor(seat.engine)}</span>\n </li>\n ))}\n </ul>\n ) : null}\n\n {impact.allowed.length > 0 ? (\n <p className={styles.capHelp}>\n Still reachable:{' '}\n {impact.allowed.map((s) => s.label).join(', ')}. Local seats cost nothing to run and\n are unaffected by this switch.\n </p>\n ) : (\n <p className={styles.capHelp}>\n No local seat is configured. With local-only on there would be nothing left to\n dispatch to — add a local seat before relying on this switch.\n </p>\n )}\n </div>\n\n {note && !guard.error ? (\n <p className={styles.actionNote} role=\"status\">\n {note}\n </p>\n ) : null}\n\n {guard.error && !confirming ? (\n <p className={styles.capError} role=\"alert\">\n {guard.error}\n </p>\n ) : null}\n\n <ConfirmDialog\n open={confirming}\n onClose={() => setConfirming(false)}\n title=\"Make cloud engines unreachable?\"\n body={\n <>\n This is a refusal, not a routing preference. While local-only is on, a dispatch to a\n non-local engine <strong>fails</strong> with a named refusal — it does not fall back\n to a local seat and it does not wait.\n <br />\n <br />\n {impact.blocked.length === 0\n ? 'No seat on this machine is affected today: every configured seat is local.'\n : `${impact.blocked.length} of your ${seats.length} seats stop working: ${impact.blocked\n .map((s) => s.label)\n .join(', ')}.`}\n <br />\n <br />\n It is reversible from this panel at any time.\n </>\n }\n confirmLabel=\"Turn local-only on\"\n busy={guard.busy}\n error={guard.error}\n onConfirm={() => apply(true)}\n />\n </>\n )}\n </section>\n );\n}\n","/**\n * routes/verse/autonomy/LocalRuntimePanel.tsx — the serving runtime, which is\n * the thing that makes a local fleet possible at all.\n *\n * Read order, top to bottom, because that is the order the questions arrive:\n * is it up, what is it serving, how many agents can it actually run at once,\n * how full is it, and how do I start or stop it.\n *\n * The third question is the one this panel is really for. A runtime's\n * CONFIGURED slot count and its EFFECTIVE concurrency are different numbers\n * whenever the runtime refuses to batch, and printing the configured one is\n * how four agents become a four-deep queue that reads as slowness. So the big\n * number on this panel is `capacity.effectiveConcurrency` — never\n * `slotsTotal` — and when they disagree the panel says which is which and\n * shows the measurement behind the claim (docs/LOCAL-FLEET.md).\n *\n * State is never carried by colour alone: every tone is paired with a word\n * (StatusBadge) and a sentence.\n */\nimport { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport { Meter } from '../../../components/primitives/Meter.js';\nimport { ConfirmDialog } from '../../inbox/ConfirmDialog.js';\nimport { UNKNOWN } from './format.js';\nimport type {\n OptionalFleetRead,\n RuntimeAction,\n ServingRuntimeSnapshot,\n} from './fleet-contract.js';\nimport {\n CONCURRENCY_EVIDENCE,\n formatContextTokens,\n formatUptime,\n runtimeCapacity,\n runtimeLabel,\n slotUtilisation,\n type RuntimeCapacity,\n} from './fleet-model.js';\nimport { runRuntimeAction } from './fleet-queries.js';\nimport { useNow } from './use-ticker.js';\nimport type { GuardedAction } from './use-guarded-action.js';\nimport styles from './autonomy.module.css';\n\nconst STATE_TONE: Record<ServingRuntimeSnapshot['state'], Tone> = {\n running: 'success',\n starting: 'running',\n stopping: 'running',\n stopped: 'neutral',\n unknown: 'unknown',\n};\n\nconst CAPACITY_TONE: Record<RuntimeCapacity['tone'], Tone> = {\n success: 'success',\n warning: 'warning',\n danger: 'danger',\n neutral: 'neutral',\n unknown: 'unknown',\n};\n\nexport interface LocalRuntimePanelProps {\n read: OptionalFleetRead<ServingRuntimeSnapshot> | null;\n guard: GuardedAction;\n dispatchEnabled: boolean;\n /** Shown while the read is in flight and nothing has arrived yet. */\n loading?: boolean;\n}\n\nexport function LocalRuntimePanel({\n read,\n guard,\n dispatchEnabled,\n loading = false,\n}: LocalRuntimePanelProps): ReactNode {\n const now = useNow(1000);\n const [confirmStop, setConfirmStop] = useState<RuntimeAction | null>(null);\n const [note, setNote] = useState<string | null>(null);\n\n const runtime = read?.value ?? null;\n const capacity = runtimeCapacity(runtime);\n const utilisation = slotUtilisation(runtime?.slotsBusy ?? null, capacity.effectiveConcurrency);\n const locked = !dispatchEnabled || guard.readOnly;\n const supervised = runtime?.supervised ?? false;\n const disabled = locked || guard.busy || !supervised;\n const running = runtime?.state === 'running';\n\n const act = (action: RuntimeAction, reason: string): void => {\n guard.request(\n () => runRuntimeAction(action),\n reason,\n (result) => {\n setNote(result.note || null);\n setConfirmStop(null);\n },\n );\n };\n\n return (\n <section className={styles.panel} aria-labelledby=\"verse-runtime-title\">\n <div className={styles.panelHead}>\n <h3 id=\"verse-runtime-title\" className={styles.panelTitle}>\n Serving runtime\n </h3>\n <p className={styles.panelNote}>\n The process that answers local agent turns. Without it, a local fleet has nowhere to run.\n </p>\n </div>\n\n {loading && read === null ? (\n <p className={styles.empty}>Reading the serving runtime…</p>\n ) : read === null || (!read.available && read.value === null) ? (\n <p className={styles.empty}>\n <span className={styles.emptyStrong}>No serving-runtime source. </span>\n {read?.reason ??\n 'Nothing answered for the serving runtime, so whether a local fleet can run cannot be stated here.'}\n </p>\n ) : runtime === null ? (\n <p className={styles.empty}>\n <span className={styles.emptyStrong}>Unreadable reading. </span>\n {read.reason ?? 'The serving-runtime reading could not be narrowed, so nothing is shown rather than guessed.'}\n </p>\n ) : (\n <>\n <div className={styles.runtimeTop}>\n <span className={styles.runtimeState} data-state={runtime.state}>\n <span className={styles.runDot} aria-hidden=\"true\" />\n <span className={styles.runtimeStateText}>\n {runtimeLabel(runtime.kind)}\n {' · '}\n {runtime.state === 'unknown' ? 'state unknown' : runtime.state}\n </span>\n </span>\n <StatusBadge status={runtime.state} tone={STATE_TONE[runtime.state]}>\n {runtime.state === 'running' ? 'serving' : runtime.state}\n </StatusBadge>\n {runtime.reason ? (\n <code className={styles.evidenceCode}>{runtime.reason}</code>\n ) : null}\n </div>\n\n <div className={styles.facts}>\n <Fact label=\"Model\" value={runtime.model ?? UNKNOWN} wide />\n <Fact label=\"Endpoint\" value={runtime.endpoint ?? UNKNOWN} mono />\n <Fact label=\"Context\" value={formatContextTokens(runtime.contextTokens)} />\n <Fact\n label=\"Slots configured\"\n value={runtime.slotsTotal === null ? UNKNOWN : String(runtime.slotsTotal)}\n />\n <Fact\n label=\"Uptime\"\n value={running ? formatUptime(runtime.startedAt, now) : 'not running'}\n />\n </div>\n\n {/* The headline number. Deliberately the EFFECTIVE concurrency, so a\n runtime that will not batch cannot advertise its slot count. */}\n <div className={styles.capacityBlock} data-verdict={capacity.verdict}>\n <div className={styles.capacityHead}>\n <span className={styles.capacityBig}>\n {capacity.effectiveConcurrency === null ? UNKNOWN : capacity.effectiveConcurrency}\n </span>\n <div className={styles.capacityWords}>\n <span className={styles.capacityHeadline}>\n {capacity.headline}\n <StatusBadge status={capacity.verdict} tone={CAPACITY_TONE[capacity.tone]}>\n {capacity.verdict === 'batched'\n ? 'batches'\n : capacity.verdict === 'serialized'\n ? 'serializes'\n : capacity.verdict === 'offline'\n ? 'not serving'\n : 'unconfirmed'}\n </StatusBadge>\n </span>\n <span className={styles.capacityDetail}>{capacity.detail}</span>\n </div>\n </div>\n\n {capacity.overstated ? (\n <ConcurrencyEvidence\n configured={capacity.configuredSlots}\n refusal={runtime.parallel.refusal}\n />\n ) : null}\n </div>\n\n <div className={styles.utilisation}>\n <Meter\n value={utilisation.busy}\n max={utilisation.total}\n label=\"Slots in use\"\n valueText={\n utilisation.percent === null\n ? 'unknown'\n : `${utilisation.busy} / ${utilisation.total}`\n }\n tone={utilisation.saturated ? 'warning' : undefined}\n />\n <p className={styles.capHelp}>{utilisation.label}</p>\n </div>\n\n <div className={styles.controls}>\n <button\n type=\"button\"\n className={`${styles.button} ${styles.buttonPrimary}`}\n disabled={disabled || running}\n onClick={() => act('start', 'Starting the serving runtime requires the dispatch token.')}\n >\n Start runtime\n </button>\n <button\n type=\"button\"\n className={styles.button}\n disabled={disabled || !running}\n onClick={() => setConfirmStop('stop')}\n >\n Stop runtime\n </button>\n <button\n type=\"button\"\n className={styles.button}\n disabled={disabled}\n onClick={() => setConfirmStop('restart')}\n >\n Restart runtime\n </button>\n </div>\n\n {!supervised ? (\n <p className={styles.actionNote} role=\"status\">\n This runtime is managed outside the hub, so it cannot be started or stopped from here.\n Whoever launched it — a login item, a terminal — still owns it; these controls stay\n disabled rather than sending an action that cannot land.\n </p>\n ) : null}\n\n {note && !guard.error ? (\n <p className={styles.actionNote} role=\"status\">\n {note}\n </p>\n ) : null}\n\n {guard.error && confirmStop === null ? (\n <p className={styles.capError} role=\"alert\">\n {guard.error}\n </p>\n ) : null}\n\n <ConfirmDialog\n open={confirmStop === 'stop'}\n onClose={() => setConfirmStop(null)}\n title=\"Stop the serving runtime?\"\n body={\n <>\n Every local agent turn in flight is answered by this process. Stopping it ends those\n turns — nothing in flight is rolled back, and no local seat can take a new turn until\n it is running again.\n <br />\n <br />\n This does not touch the autonomous loop, the kill switch, or your own write tools.\n </>\n }\n confirmLabel=\"Stop runtime\"\n destructive\n busy={guard.busy}\n error={guard.error}\n onConfirm={() => act('stop', 'Stopping the serving runtime requires the dispatch token.')}\n />\n\n <ConfirmDialog\n open={confirmStop === 'restart'}\n onClose={() => setConfirmStop(null)}\n title=\"Restart the serving runtime?\"\n body={\n <>\n The process is stopped and started again. Turns in flight end with it, and the first\n turn afterwards pays the model load — on a 27 GB model that is not instant.\n <br />\n <br />\n Restart is the way to pick up a changed slot count or context size, since both are\n fixed at launch.\n </>\n }\n confirmLabel=\"Restart runtime\"\n destructive\n busy={guard.busy}\n error={guard.error}\n onConfirm={() =>\n act('restart', 'Restarting the serving runtime requires the dispatch token.')\n }\n />\n </>\n )}\n </section>\n );\n}\n\n/**\n * The measurement behind \"this runtime will not honour that slot count\".\n *\n * Shown only when the two numbers actually disagree, because an operator on a\n * runtime that batches does not need to be argued with. It is presented as\n * measured data with its per-request times, not as a claim: the stagger in one\n * row and the dead heat in the other are the whole argument.\n */\nfunction ConcurrencyEvidence({\n configured,\n refusal,\n}: {\n configured: number | null;\n refusal: string | null;\n}): ReactNode {\n return (\n <div className={styles.evidence}>\n <p className={styles.evidenceLead}>\n {configured === null\n ? 'The configured slot count is not a concurrency on this runtime.'\n : `${configured} slots are configured, but this runtime will not run them in parallel. Measured on this machine, four concurrent requests to the same model:`}\n </p>\n {/* Four columns of numerals do not fit a 900px window beside the rest\n of the cockpit, so the table gets its own scroll container rather\n than forcing the page body to scroll sideways. */}\n <div className={styles.evidenceScroll}>\n <table className={styles.evidenceTable}>\n <caption className={styles.srOnly}>\n Four concurrent requests to the same Qwen3.8 model file, per-runtime completion times in\n seconds\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">Runtime</th>\n <th scope=\"col\">Per request (s)</th>\n <th scope=\"col\">Wall (s)</th>\n <th scope=\"col\">Finished</th>\n </tr>\n </thead>\n <tbody>\n {CONCURRENCY_EVIDENCE.map((row) => (\n <tr key={row.runtime}>\n <th scope=\"row\">{row.runtime}</th>\n <td className={styles.evidenceNums}>{row.perRequestSeconds.join(' · ')}</td>\n <td className={styles.evidenceNums}>{row.wallSeconds.toFixed(1)}</td>\n <td>{row.verdict}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {refusal ? (\n <p className={styles.capHelp}>\n The runtime&rsquo;s own words: <code className={styles.evidenceCode}>{refusal}</code>\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction Fact({\n label,\n value,\n mono = false,\n wide = false,\n}: {\n label: string;\n value: string;\n mono?: boolean;\n wide?: boolean;\n}): ReactNode {\n return (\n <div className={`${styles.fact} ${wide ? styles.factWide : ''}`}>\n <span className={styles.factLabel}>{label}</span>\n <span className={`${styles.factValue} ${mono ? styles.factMono : ''}`}>{value}</span>\n </div>\n );\n}\n","/**\n * routes/verse/autonomy/overnight-model.ts — the pure half of the Overnight\n * panel: narrow the server's body, resolve the operator's stop rule, and\n * derive the one line that says how far the run is from stopping.\n *\n * Framework-free so it unit-tests without a DOM, and separate from the panel\n * because two of these functions are where the panel can most easily start\n * lying:\n *\n * - `projectOvernight` NARROWS, it does not cast. The route is being written\n * by another owner in parallel with this surface, so a field that drifts in\n * name or type has to degrade to `null` — which the panel renders as \"not\n * stated\" — rather than reach a render as `undefined` and crash, or reach\n * it as `0` and read as a fact. Same discipline as `fleet-model.ts`.\n * - `stopProgress` never invents a denominator. \"Until I pause it\" has no\n * progress, and drawing a bar for it would be a picture of a finish line\n * that does not exist.\n */\nimport { formatDuration, UNKNOWN } from './format.js';\nimport type {\n OvernightDiscard,\n OvernightGate,\n OvernightMerge,\n OvernightRun,\n OvernightStatus,\n OvernightStopRule,\n OvernightStopRuleKind,\n} from './overnight-contract.js';\n\n// ---------------------------------------------------------------------------\n// Narrowing\n// ---------------------------------------------------------------------------\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction str(value: unknown): string | null {\n return typeof value === 'string' && value.trim() !== '' ? value : null;\n}\n\nfunction bool(value: unknown): boolean | null {\n return typeof value === 'boolean' ? value : null;\n}\n\n/** A count. Negative and non-finite are not counts, so they are not observed. */\nfunction count(value: unknown): number | null {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) return null;\n return Math.floor(value);\n}\n\nexport function projectStopRule(raw: unknown): OvernightStopRule | null {\n if (!isRecord(raw)) return null;\n const kind = str(raw['kind']);\n if (kind === 'until-paused') return { kind: 'until-paused' };\n if (kind === 'at-time') {\n const at = str(raw['at']);\n // An unparseable instant is worse than no rule: it would render as a\n // countdown to NaN. Refuse it here so the panel can say \"not stated\".\n if (at === null || Number.isNaN(Date.parse(at))) return null;\n return { kind: 'at-time', at };\n }\n if (kind === 'after-iterations') {\n const iterations = count(raw['iterations']);\n if (iterations === null || iterations <= 0) return null;\n return { kind: 'after-iterations', iterations };\n }\n return null;\n}\n\nfunction projectMerges(raw: unknown): OvernightMerge[] {\n if (!Array.isArray(raw)) return [];\n const out: OvernightMerge[] = [];\n for (const [index, item] of raw.entries()) {\n if (!isRecord(item)) continue;\n const repo = str(item['repo']);\n if (repo === null) continue;\n out.push({\n id: str(item['id']) ?? `${repo}:${index}`,\n repo,\n title: str(item['title']) ?? 'untitled change',\n at: str(item['at']),\n commit: str(item['commit']),\n });\n }\n return out;\n}\n\nfunction projectDiscards(raw: unknown): OvernightDiscard[] {\n if (!Array.isArray(raw)) return [];\n const out: OvernightDiscard[] = [];\n for (const [index, item] of raw.entries()) {\n if (!isRecord(item)) continue;\n const repo = str(item['repo']);\n if (repo === null) continue;\n out.push({\n id: str(item['id']) ?? `${repo}:${index}`,\n repo,\n title: str(item['title']) ?? 'untitled change',\n at: str(item['at']),\n // A discard with no stated reason is the one row an operator will ask\n // about in the morning, so it says that it has none rather than being\n // rendered as a blank cell.\n reason: str(item['reason']) ?? 'no reason recorded',\n });\n }\n return out;\n}\n\nfunction projectGate(raw: unknown): OvernightGate | null {\n if (!isRecord(raw)) return null;\n return {\n tests: bool(raw['tests']),\n lint: bool(raw['lint']),\n typecheck: bool(raw['typecheck']),\n autoMerge: bool(raw['autoMerge']),\n branch: str(raw['branch']),\n };\n}\n\nfunction projectRun(raw: unknown): OvernightRun | null {\n if (!isRecord(raw)) return null;\n const runId = str(raw['runId']);\n if (runId === null) return null;\n return {\n runId,\n startedAt: str(raw['startedAt']),\n stopRule: projectStopRule(raw['stopRule']),\n iterationsDone: count(raw['iterationsDone']),\n repo: str(raw['repo']),\n activity: str(raw['activity']),\n merged: projectMerges(raw['merged']),\n discarded: projectDiscards(raw['discarded']),\n };\n}\n\n/**\n * `GET /api/verse/overnight` → a status, or null when the body is not one.\n *\n * `armed` is the single field this refuses to guess: a body that does not say\n * whether a run is armed is not a status, because \"nothing is armed\" is\n * exactly the claim a person checks before closing the laptop.\n */\nexport function projectOvernight(raw: unknown): OvernightStatus | null {\n if (!isRecord(raw)) return null;\n const armed = bool(raw['armed']);\n if (armed === null) return null;\n return {\n armed,\n run: projectRun(raw['run']),\n repos: count(raw['repos']),\n gate: projectGate(raw['gate']),\n };\n}\n\n// ---------------------------------------------------------------------------\n// The operator's side of the stop rule\n// ---------------------------------------------------------------------------\n\n/** Smallest and largest iteration cap the form will send. */\nexport const ITERATIONS_MIN = 1;\nexport const ITERATIONS_MAX = 500;\n\n/**\n * Turn an `<input type=\"time\">` value (\"23:30\") into the next occurrence of\n * that wall-clock time, as an absolute instant.\n *\n * The whole point of arming this at 11pm is that \"07:00\" means tomorrow\n * morning. Resolving it on the client, in the operator's own zone, is what\n * makes that unambiguous by the time it reaches a server that may not share\n * the zone — and rounds to the minute, so a run armed at 06:59:58 for 07:00\n * does not stop two seconds later.\n */\nexport function resolveStopAt(value: string, now: Date = new Date()): string | null {\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(value.trim());\n if (!match) return null;\n const hours = Number(match[1]);\n const minutes = Number(match[2]);\n if (!Number.isInteger(hours) || !Number.isInteger(minutes)) return null;\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) return null;\n const at = new Date(now);\n at.setHours(hours, minutes, 0, 0);\n if (at.getTime() <= now.getTime()) at.setDate(at.getDate() + 1);\n return at.toISOString();\n}\n\n/** \"07:00\" as the operator's locale writes it — never a raw ISO string. */\nexport function formatStopClock(iso: string | null): string {\n if (!iso) return UNKNOWN;\n const ms = Date.parse(iso);\n if (Number.isNaN(ms)) return UNKNOWN;\n return new Date(ms).toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });\n}\n\n/** True when the resolved instant is not today — \"07:00 tomorrow\". */\nexport function isNextDay(iso: string | null, now: Date = new Date()): boolean {\n if (!iso) return false;\n const ms = Date.parse(iso);\n if (Number.isNaN(ms)) return false;\n return new Date(ms).toDateString() !== now.toDateString();\n}\n\n/**\n * The sentence the Arm button is committing to, before the click.\n *\n * It restates the rule the operator chose in the operator's own units, so the\n * button is never the only description of what is about to be authorised.\n */\nexport function describeStopRule(rule: OvernightStopRule, now: Date = new Date()): string {\n switch (rule.kind) {\n case 'until-paused':\n return 'Runs until you pause it — no stop time, no iteration limit.';\n case 'at-time':\n return `Stops at ${formatStopClock(rule.at)}${isNextDay(rule.at, now) ? ' tomorrow' : ''}.`;\n case 'after-iterations':\n return `Stops after ${rule.iterations} ${rule.iterations === 1 ? 'iteration' : 'iterations'}.`;\n }\n}\n\n/** The short label each stop rule wears in the armed summary. */\nexport function stopRuleLabel(kind: OvernightStopRuleKind): string {\n switch (kind) {\n case 'until-paused':\n return 'Until paused';\n case 'at-time':\n return 'At a set time';\n case 'after-iterations':\n return 'After N iterations';\n }\n}\n\n// ---------------------------------------------------------------------------\n// How far to the stop condition\n// ---------------------------------------------------------------------------\n\nexport interface StopProgress {\n /** The rule, restated: \"Stops at 07:00\". */\n headline: string;\n /** How much is left: \"4h 12m left\", \"12 of 20 done\". */\n remaining: string;\n /** 0-100 for a meter, or null when there is no honest denominator. */\n percent: number | null;\n /** True once the condition is met and the loop should be winding down. */\n reached: boolean;\n}\n\n/**\n * How far the run is from its stop condition.\n *\n * `percent` is null for \"until I pause it\" on purpose: an open-ended run has\n * no finish line, and a bar with no denominator is the exact kind of confident\n * graphic this cockpit is not allowed to draw.\n */\nexport function stopProgress(\n rule: OvernightStopRule | null,\n run: OvernightRun | null,\n now: number = Date.now(),\n): StopProgress {\n if (rule === null) {\n return {\n headline: 'Stop rule not stated',\n remaining: UNKNOWN,\n percent: null,\n reached: false,\n };\n }\n\n if (rule.kind === 'until-paused') {\n return {\n headline: 'Runs until you pause it',\n remaining: 'no stop time, no iteration limit',\n percent: null,\n reached: false,\n };\n }\n\n if (rule.kind === 'at-time') {\n const at = Date.parse(rule.at);\n if (Number.isNaN(at)) {\n return { headline: 'Stop time not readable', remaining: UNKNOWN, percent: null, reached: false };\n }\n const headline = `Stops at ${formatStopClock(rule.at)}`;\n const left = at - now;\n if (left <= 0) {\n return { headline, remaining: 'stop time reached', percent: 100, reached: true };\n }\n const startedAt = run?.startedAt ? Date.parse(run.startedAt) : Number.NaN;\n // Elapsed over the run's whole window — which needs a start. Without one\n // the countdown is still true, so it is shown; only the bar is withheld.\n const percent =\n Number.isNaN(startedAt) || at <= startedAt\n ? null\n : Math.min(100, Math.max(0, Math.round(((now - startedAt) / (at - startedAt)) * 100)));\n return { headline, remaining: `${formatDuration(left)} left`, percent, reached: false };\n }\n\n const done = run?.iterationsDone;\n const headline = `Stops after ${rule.iterations} ${rule.iterations === 1 ? 'iteration' : 'iterations'}`;\n if (typeof done !== 'number') {\n return {\n headline,\n remaining: `${UNKNOWN} of ${rule.iterations} done`,\n percent: null,\n reached: false,\n };\n }\n return {\n headline,\n remaining: `${done} of ${rule.iterations} done`,\n percent: Math.min(100, Math.round((done / rule.iterations) * 100)),\n reached: done >= rule.iterations,\n };\n}\n\n/** \"3h 04m\" since the run started, or UNKNOWN when it never said. */\nexport function formatRunElapsed(startedAt: string | null | undefined, now: number = Date.now()): string {\n if (!startedAt) return UNKNOWN;\n const ms = Date.parse(startedAt);\n if (Number.isNaN(ms)) return UNKNOWN;\n return formatDuration(Math.max(0, now - ms));\n}\n\n/**\n * The checks named as one phrase: \"tests, lint and typecheck\".\n *\n * Only checks the server said `true` about are named. A `null` check is not\n * named as running AND not named as skipped — `gateCaveat` below says so in\n * words instead, because a gate an operator believes is running when it is not\n * is the single most expensive misreading this panel could cause.\n */\nexport function gateChecks(gate: OvernightGate | null): string[] {\n if (gate === null) return [];\n const named: string[] = [];\n if (gate.tests === true) named.push('tests');\n if (gate.lint === true) named.push('lint');\n if (gate.typecheck === true) named.push('typecheck');\n return named;\n}\n\n/** The checks the server would not commit to, if any. */\nexport function gateUnstated(gate: OvernightGate | null): string[] {\n if (gate === null) return ['tests', 'lint', 'typecheck'];\n const unstated: string[] = [];\n if (gate.tests === null) unstated.push('tests');\n if (gate.lint === null) unstated.push('lint');\n if (gate.typecheck === null) unstated.push('typecheck');\n return unstated;\n}\n\nexport function joinPhrase(parts: readonly string[]): string {\n if (parts.length === 0) return '';\n if (parts.length === 1) return parts[0]!;\n return `${parts.slice(0, -1).join(', ')} and ${parts[parts.length - 1]!}`;\n}\n","/**\n * routes/verse/autonomy/overnight-queries.ts — the one read and the one write\n * behind the Overnight panel: `GET /api/verse/overnight` and\n * `POST /api/verse/overnight`.\n *\n * Same contract as `control-queries.ts` and `fleet-queries.ts` — the read is a\n * QueryDef consumed through `useQuery` (cache-backed, so a poll never blanks a\n * populated panel); the write pulls the held mutation token from auth-store,\n * touches the hold on success, and invalidates exactly the keys it affects.\n * There is no new data layer here on purpose.\n *\n * TWO THINGS THAT ARE DELIBERATE:\n *\n * 1. **The read does not throw on absence.** The route does not exist yet —\n * four owners are building the engine, the permit, the budgets and the\n * local-only policy in parallel. A server without it answers 404, and 404\n * means \"this panel has no source yet\", not \"Autonomy is broken\". It comes\n * back as `OptionalFleetRead` (reused rather than re-declared, because two\n * shapes for \"a read that is allowed to be absent\" would be one too many)\n * and the panel renders a designed not-available state from `reason`.\n * 401 still propagates: an expired read session is an unauthorized state\n * for the whole surface, not a missing panel.\n *\n * 2. **There is no pause route here, and there must not be one.** The halt\n * this panel offers is the DAEMON-SCOPED pause — `~/.ashlr/daemon.paused`,\n * via `runDaemonAction('pause')` in control-queries.ts. Disarming stops\n * arming the next run; pausing stops the loop that is running now, and\n * they are different questions. Neither is `stopDaemon()`, which is\n * `setKill(true)` and therefore the emergency stop wearing a quieter name\n * (see the header of DaemonControls.tsx).\n */\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { useRefetch } from '../../../data/hooks.js';\nimport { useEffect } from 'react';\nimport { VERSE_CONTROL_KEY, VerseControlLockedError } from './control-queries.js';\nimport type { OptionalFleetRead } from './fleet-contract.js';\nimport type {\n OvernightAction,\n OvernightActionResult,\n OvernightStatus,\n OvernightStopRule,\n} from './overnight-contract.js';\nimport { projectOvernight } from './overnight-model.js';\n\nexport const VERSE_OVERNIGHT_KEY = 'verse-overnight';\nexport const OVERNIGHT_PATH = '/api/verse/overnight';\n\nfunction describeAbsence(err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) {\n return `This build does not expose ${OVERNIGHT_PATH}, so an overnight run cannot be armed from here. It is a missing route, not a run that refused to start.`;\n }\n return `${OVERNIGHT_PATH} answered HTTP ${err.status}.`;\n }\n return `${OVERNIGHT_PATH} could not be reached.`;\n}\n\n/**\n * `GET /api/verse/overnight` — is a run armed, and what has it done.\n *\n * `value` is null both when the route was absent and when it answered\n * something this client could not narrow; `available` and `reason` are what\n * tell those two apart, and the panel words them differently.\n */\nexport const overnightQuery: QueryDef<OptionalFleetRead<OvernightStatus>> = {\n key: VERSE_OVERNIGHT_KEY,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>(OVERNIGHT_PATH, signal);\n const value = projectOvernight(raw);\n if (value === null) {\n return {\n value: null,\n available: true,\n reason: `${OVERNIGHT_PATH} answered in a shape this client does not recognise, so nothing is shown rather than guessed.`,\n };\n }\n return { value, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { value: null, available: false, reason: describeAbsence(err) };\n }\n },\n};\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseControlLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\nfunction invalidateOvernight(): void {\n invalidate(VERSE_OVERNIGHT_KEY);\n // Arming changes what the daemon will do next, and the control snapshot is\n // what the rest of the cockpit reads that from.\n invalidate(VERSE_CONTROL_KEY);\n}\n\n/** Arm an overnight run with exactly one stop rule. */\nexport async function armOvernight(stopRule: OvernightStopRule): Promise<OvernightActionResult> {\n const body: OvernightAction = { action: 'arm', stopRule };\n const result = await post<OvernightActionResult>(OVERNIGHT_PATH, body);\n invalidateOvernight();\n return result;\n}\n\n/**\n * Disarm: no further overnight run starts.\n *\n * This is NOT the halt. It stops the arrangement, not the loop — a run already\n * in flight keeps going until it is paused. The panel says so at the click.\n */\nexport async function disarmOvernight(): Promise<OvernightActionResult> {\n const body: OvernightAction = { action: 'disarm' };\n const result = await post<OvernightActionResult>(OVERNIGHT_PATH, body);\n invalidateOvernight();\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Polling\n// ---------------------------------------------------------------------------\n\n/**\n * Slower than the fleet's 4s: an overnight run's counters move on the scale of\n * whole iterations, and the thing an operator watches second by second (the\n * elapsed clock and the countdown) is derived locally from `useNow`.\n */\nexport const OVERNIGHT_POLL_MS = 15_000;\n\n/**\n * Keep the overnight status live while a run is armed and the tab is visible.\n *\n * Only while armed: a disarmed panel has one boolean to report and polling it\n * every fifteen seconds forever would be pure waste. Hidden tabs stop the\n * timer and take one immediate reading when they come back, so a panel\n * returned to in the morning is current on the first frame.\n */\nexport function useOvernightPolling(armed: boolean, intervalMs: number = OVERNIGHT_POLL_MS): void {\n const refetch = useRefetch(overnightQuery);\n\n useEffect(() => {\n if (!armed) return;\n let timer: ReturnType<typeof setInterval> | null = null;\n\n const start = (): void => {\n if (timer !== null) return;\n timer = setInterval(refetch, intervalMs);\n };\n const stop = (): void => {\n if (timer === null) return;\n clearInterval(timer);\n timer = null;\n };\n const onVisibility = (): void => {\n if (document.visibilityState === 'hidden') {\n stop();\n return;\n }\n refetch();\n start();\n };\n\n if (document.visibilityState !== 'hidden') start();\n document.addEventListener('visibilitychange', onVisibility);\n return () => {\n stop();\n document.removeEventListener('visibilitychange', onVisibility);\n };\n }, [armed, intervalMs, refetch]);\n}\n","/**\n * routes/verse/autonomy/overnight.module.css — the Overnight panel's own\n * layout. Everything shared (panel frame, buttons, empty/error states, the\n * action note) comes from autonomy.module.css, which this panel imports\n * alongside this sheet; only the shapes that exist nowhere else live here.\n *\n * Same rules as the rest of the cockpit (docs/VERSE-DESIGN-V2.md): monochrome,\n * hairlines instead of cards, no shadows, tight radii, the display face with\n * tabular figures on every numeral, colour only where it carries meaning and\n * always paired with a word.\n *\n * No literal px for anything that should scale. The Display-size setting\n * multiplies the type, spacing, density and control ramps together\n * (design/ui-scale.test.ts), so every measure here is a token or a `calc()`\n * over one — including the `ch`/`em` measures, which follow the font size by\n * definition. The one exception is the 2px engine-marker-style rule on\n * `.authorisation`, which is a hairline accent: a hairline is one device pixel\n * at every display size, exactly as tokens.css keeps `--space-px` at 1px.\n */\n\n/* --- armed: the halt first, then everything there is to read ------------- */\n.armedTop {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n}\n\n.armedState {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n}\n\n.haltRow {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n}\n\n.haltNote {\n margin-top: var(--space-3);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n max-width: 68ch;\n}\n\n/* The heavier control, named rather than duplicated. Quiet on purpose: it is\n a signpost, not a second emergency stop. */\n.heavier {\n margin-top: var(--space-4);\n padding-top: var(--space-4);\n border-top: 1px solid var(--border-subtle);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n max-width: 68ch;\n}\n\n.heavier strong {\n color: var(--text-secondary);\n font-weight: var(--font-weight-semibold);\n}\n\n/* --- what it is doing right now ----------------------------------------- */\n.facts {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-3) var(--space-5);\n margin: var(--space-5) 0 0;\n}\n\n.fact {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.factWide {\n flex: 1 1 26ch;\n}\n\n.factLabel {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.factValue {\n margin: 0;\n font-family: var(--font-display);\n font-variant-numeric: tabular-nums;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.factMono {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n\n/* --- how far to the stop condition -------------------------------------- */\n.stop {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n margin-top: var(--space-5);\n padding-top: var(--space-4);\n border-top: 1px solid var(--border-subtle);\n}\n\n.stopHead {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.stopHeadline {\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n}\n\n.stopRemaining {\n font-family: var(--font-display);\n font-variant-numeric: tabular-nums;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n white-space: nowrap;\n}\n\n.stopDetail {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n max-width: 68ch;\n}\n\n/* --- merged / discarded -------------------------------------------------- */\n.ledger {\n margin-top: var(--space-5);\n}\n\n.ledgerTitle {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-semibold);\n color: var(--text-tertiary);\n margin-bottom: var(--space-2);\n}\n\n.ledgerCount {\n font-variant-numeric: tabular-nums;\n letter-spacing: normal;\n color: var(--text-secondary);\n}\n\n.ledgerEmpty {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.ledgerList {\n display: flex;\n flex-direction: column;\n list-style: none;\n}\n\n.ledgerRow {\n display: grid;\n grid-template-columns: minmax(8ch, auto) minmax(0, 1fr);\n gap: var(--space-1) var(--space-3);\n align-items: baseline;\n padding: var(--space-2) 0;\n border-bottom: 1px solid var(--border-subtle);\n transition: background-color var(--duration-fast) var(--ease-standard);\n}\n\n.ledgerRow:hover {\n background: var(--bg-hover);\n}\n\n.ledgerRepo {\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n color: var(--text-tertiary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ledgerChange {\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n/* The reason a change was thrown away, and the stamp. Column 2 so it sits\n under the change it belongs to rather than under the repo name. */\n.ledgerMeta {\n grid-column: 2;\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n overflow-wrap: anywhere;\n}\n\n/* --- the arm form -------------------------------------------------------- */\n.form {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-end;\n gap: var(--space-3) var(--space-5);\n}\n\n.field {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.fieldLabel {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.input {\n min-height: var(--control-h);\n min-width: 10ch;\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-display);\n font-variant-numeric: tabular-nums;\n font-size: var(--text-sm-size);\n}\n\n.input:focus-visible {\n border-color: var(--border-focus);\n}\n\n.input:disabled {\n color: var(--text-disabled);\n background: var(--bg-canvas);\n cursor: not-allowed;\n}\n\n.rulePreview {\n margin-top: var(--space-3);\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n}\n\n.armRow {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n margin-top: var(--space-4);\n}\n\n/* --- what you are authorising ------------------------------------------- */\n/* Not an alert. This is the designed behaviour, stated plainly, so it wears\n body copy and a neutral 2px marker — the same identity marker the seat rows\n use — rather than the danger ground `.error` carries. */\n.authorisation {\n margin-top: var(--space-5);\n padding: var(--space-3) var(--space-4);\n border-left: 2px solid var(--border-strong);\n background: var(--bg-canvas);\n border-radius: 0 var(--radius-sm) var(--radius-sm) 0;\n}\n\n.authorisationTitle {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-semibold);\n color: var(--text-tertiary);\n margin-bottom: var(--space-2);\n}\n\n.authorisationBody {\n font-size: var(--text-sm-size);\n line-height: var(--text-base-line);\n color: var(--text-secondary);\n max-width: 68ch;\n}\n\n.authorisationBody strong {\n color: var(--text-primary);\n font-weight: var(--font-weight-semibold);\n}\n\n.authorisationCaveat {\n margin-top: var(--space-2);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--status-warning-fg);\n max-width: 68ch;\n}\n\n.authorisationCaveat strong {\n font-weight: var(--font-weight-semibold);\n}\n\n/* Guarded the way the rest of the cockpit guards motion: appearance-store.ts\n writes data-motion=\"full\" so an operator can opt back in to animation over\n the OS preference. Nothing here animates except this one hover tint, and\n under reduced motion it simply switches instantly. */\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .ledgerRow {\n transition: none;\n }\n}\n","/**\n * routes/verse/autonomy/OvernightPanel.tsx — the control the operator arms\n * when they leave the computer, so local models keep working the enrolled\n * repos while they are asleep.\n *\n * It has to answer four things, and it answers them in this order because\n * that is the order they are asked at 11pm and again at 7am:\n *\n * 1. **What am I authorising?** Stated in full, always visible, above the\n * Arm button — never behind a dialog. While a run is armed it merges to\n * master on its own behind a test/lint/typecheck gate. That is the\n * designed behaviour and the operator's considered choice, so it is\n * written as a description, not a warning: no red, no destructive\n * styling, no \"are you sure\". It is also not hidden. A person arming\n * this should be able to read exactly what they are agreeing to without\n * clicking anything, which is strictly more than a confirm dialog\n * achieves — DaemonControls already makes this argument for Pause\n * (\"a dialog here would only teach the operator to click through\n * dialogs\"), and it applies with more force to a control that is used\n * once a night.\n *\n * 2. **How does it stop?** Exactly one rule per run — until paused, at a\n * wall-clock time, or after N iterations — chosen in a radiogroup, so\n * the choice has single-selection semantics for a screen reader and the\n * form cannot express two rules at once.\n *\n * 3. **What is it doing right now?** Which repo, what activity, how long it\n * has been running, how far it is from its stop condition, what it has\n * merged, what it has discarded and why.\n *\n * 4. **How do I stop it right now?** With PAUSE — `~/.ashlr/daemon.paused`\n * via `runDaemonAction('pause')`. The halt sits at the TOP of the armed\n * block, before any of the reading material, so it is never below the\n * fold.\n *\n * WHY THE HALT IS PAUSE AND NOT \"STOP LOOP\". `stopDaemon()` is literally\n * `setKill(true)` (core/daemon/loop.ts), i.e. the ordinary stop engages the\n * SAME global sentinel as the emergency stop and takes the agent's own write\n * tools down with it. Wiring a woken-at-3am operator's first instinct to that\n * would mean the cheapest reaction to \"it is doing something I do not like\"\n * has the widest blast radius in the app. Pause halts autonomous dispatch and\n * nothing else, and undoes in one click.\n *\n * WHY THERE IS NO EMERGENCY STOP BUTTON HERE. It is one panel up, in\n * Controls, under a rule and danger-styled, and a second copy of it would\n * both duplicate that ladder and put two identically-named buttons on one\n * screen. It is named in prose instead, with its true blast radius, so it\n * stays reachable and stays visibly heavier than the halt this panel offers.\n *\n * WHY DISARM IS NOT THE HALT EITHER. Disarming stops the ARRANGEMENT; the run\n * already in flight keeps going. Two different questions, two different\n * controls, and the panel says which is which at the point of the click.\n *\n * THE BACKEND DOES NOT EXIST YET. `GET/POST /api/verse/overnight` are being\n * written in parallel by other owners, so an absent route is a designed state\n * of this panel (\"not available in this build\"), never a spinner that never\n * resolves and never a crash. See overnight-contract.ts for the shapes this\n * is coded against.\n */\nimport { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { Meter } from '../../../components/primitives/Meter.js';\nimport { Segmented } from '../../../components/primitives/Segmented.js';\nimport { StatusBadge } from '../../../components/primitives/StatusBadge.js';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { runDaemonAction } from './control-queries.js';\nimport type { VerseControlSnapshot } from './control-types.js';\nimport type { OptionalFleetRead } from './fleet-contract.js';\nimport { formatStamp, UNKNOWN } from './format.js';\nimport type { OvernightStatus, OvernightStopRule, OvernightStopRuleKind } from './overnight-contract.js';\nimport { armOvernight, disarmOvernight } from './overnight-queries.js';\nimport {\n ITERATIONS_MAX,\n ITERATIONS_MIN,\n describeStopRule,\n formatRunElapsed,\n gateChecks,\n gateUnstated,\n joinPhrase,\n resolveStopAt,\n stopProgress,\n} from './overnight-model.js';\nimport { useNow } from './use-ticker.js';\nimport type { GuardedAction } from './use-guarded-action.js';\nimport autonomy from './autonomy.module.css';\nimport styles from './overnight.module.css';\n\nconst STOP_OPTIONS: ReadonlyArray<{ value: OvernightStopRuleKind; label: string }> = [\n { value: 'until-paused', label: 'Until I pause it' },\n { value: 'at-time', label: 'At a time' },\n { value: 'after-iterations', label: 'After N iterations' },\n];\n\n/** A sensible 7am, so the common case is one click away from correct. */\nconst DEFAULT_STOP_TIME = '07:00';\nconst DEFAULT_ITERATIONS = '20';\n\nexport interface OvernightPanelProps {\n read: OptionalFleetRead<OvernightStatus> | null;\n /** For the pause sentinel and the enrolled-repo count — the same snapshot\n * every other panel here reads, so this one cannot disagree with them. */\n snapshot: VerseControlSnapshot;\n guard: GuardedAction;\n dispatchEnabled: boolean;\n loading?: boolean;\n}\n\nexport function OvernightPanel({\n read,\n snapshot,\n guard,\n dispatchEnabled,\n loading = false,\n}: OvernightPanelProps): ReactNode {\n const now = useNow(1000);\n const [kind, setKind] = useState<OvernightStopRuleKind>('until-paused');\n const [timeValue, setTimeValue] = useState(DEFAULT_STOP_TIME);\n const [iterationsValue, setIterationsValue] = useState(DEFAULT_ITERATIONS);\n const [formError, setFormError] = useState<string | null>(null);\n const [note, setNote] = useState<string | null>(null);\n\n const status = read?.value ?? null;\n const run = status?.run ?? null;\n\n // The pause sentinel has three states and `unknown` FAILS SAFE as paused —\n // the daemon treats an unreadable sentinel as paused, so this must too\n // rather than drawing a running loop over a signal nobody could read.\n const pauseState = snapshot.pause?.state ?? 'unknown';\n const paused = pauseState !== 'running';\n const pauseUnknown = pauseState === 'unknown';\n const killed = snapshot.killSwitch?.state === 'active';\n\n const locked = !dispatchEnabled || guard.readOnly;\n const disabled = locked || guard.busy;\n\n const repos = status?.repos ?? snapshot.scope?.repos?.length ?? null;\n const gate = status?.gate ?? null;\n const checks = gateChecks(gate);\n const unstated = gateUnstated(gate);\n const branch = gate?.branch ?? 'master';\n\n const rule = buildRule(kind, timeValue, iterationsValue);\n const progress = stopProgress(run?.stopRule ?? null, run, now);\n\n // Only the reasons the button is actually DISABLED for. An incomplete stop\n // rule leaves the button live — clicking it says what is missing, which is\n // more use than a dead control — and the visible preview line already says\n // what to enter, so a tooltip repeating it would be noise.\n const armDisabledReason = locked\n ? 'This server runs without dispatch, so an overnight run cannot be armed from here.'\n : killed\n ? 'Release the emergency stop before arming an overnight run.'\n : '';\n\n const halt = (): void => {\n setFormError(null);\n guard.request(\n () => runDaemonAction('pause'),\n 'Pausing autonomous dispatch requires the dispatch token.',\n (result) => setNote(result.note || null),\n );\n };\n\n const resume = (): void => {\n setFormError(null);\n guard.request(\n () => runDaemonAction('resume'),\n 'Resuming autonomous dispatch requires the dispatch token.',\n (result) => setNote(result.note || null),\n );\n };\n\n const arm = (): void => {\n if (rule === null) {\n setFormError(\n kind === 'at-time'\n ? 'Enter a stop time as HH:MM before arming.'\n : `Enter a number of iterations between ${ITERATIONS_MIN} and ${ITERATIONS_MAX} before arming.`,\n );\n return;\n }\n setFormError(null);\n guard.request(\n () => armOvernight(rule),\n 'Arming an overnight run requires the dispatch token.',\n (result) => setNote(result.note || null),\n );\n };\n\n const disarm = (): void => {\n setFormError(null);\n guard.request(\n () => disarmOvernight(),\n 'Disarming the overnight run requires the dispatch token.',\n (result) => setNote(result.note || null),\n );\n };\n\n /** The permanent, unavoidable statement of what an armed run does. */\n const authorisation = (\n <div className={styles.authorisation}>\n <h4 className={styles.authorisationTitle}>What it does while you sleep</h4>\n <p className={styles.authorisationBody}>\n Local models work through{' '}\n <strong>{repos === null ? 'your enrolled repositories' : `your ${repos} enrolled ${repos === 1 ? 'repository' : 'repositories'}`}</strong>{' '}\n unattended. Each change it writes is put through the gate\n {checks.length > 0 ? (\n <>\n {' '}— <strong>{joinPhrase(checks)}</strong> must pass\n </>\n ) : null}\n . A change that passes the gate is <strong>merged to {branch} without asking you</strong>. A\n change that fails is discarded and the repository is left as it was.\n </p>\n {unstated.length > 0 ? (\n <p className={styles.authorisationCaveat}>\n This build did not state whether {joinPhrase(unstated)}{' '}\n {unstated.length === 1 ? 'runs' : 'run'} in the gate, so {unstated.length === 1 ? 'it is' : 'they are'} shown as\n unstated rather than as passing checks you can rely on.\n </p>\n ) : null}\n {gate?.autoMerge === false ? (\n <p className={styles.authorisationCaveat}>\n This build reports that passing changes are <strong>not</strong> merged automatically — they\n wait for you in Approvals.\n </p>\n ) : null}\n </div>\n );\n\n return (\n <section className={autonomy.panel} aria-labelledby=\"verse-overnight-title\">\n <div className={autonomy.panelHead}>\n <h3 id=\"verse-overnight-title\" className={autonomy.panelTitle}>\n Overnight\n </h3>\n <p className={autonomy.panelNote}>\n Arm this when you walk away. One stop rule per run; pause halts it at any time.\n </p>\n </div>\n\n {loading && read === null ? (\n <p className={autonomy.empty}>Reading the overnight lane…</p>\n ) : read === null || (!read.available && read.value === null) ? (\n <p className={autonomy.empty}>\n <span className={autonomy.emptyStrong}>Not available in this build. </span>\n {read?.reason ??\n 'Nothing answered for the overnight lane, so a run cannot be armed or reported here. Nothing is running because of this panel.'}\n </p>\n ) : status === null ? (\n <p className={autonomy.empty}>\n <span className={autonomy.emptyStrong}>Unreadable reading. </span>\n {read.reason ??\n 'The overnight reading could not be narrowed, so whether a run is armed is not stated rather than guessed.'}\n </p>\n ) : status.armed ? (\n <>\n {/* The halt comes FIRST, before anything there is to read. */}\n <div className={styles.armedTop}>\n <span className={styles.armedState}>\n <StatusBadge status={paused ? 'paused' : 'running'} tone={paused ? 'warning' : 'running'}>\n {paused ? 'armed — dispatch paused' : 'armed — running'}\n </StatusBadge>\n </span>\n <div className={styles.haltRow}>\n {paused ? (\n <button\n type=\"button\"\n className={`${autonomy.button} ${autonomy.buttonPrimary}`}\n disabled={disabled}\n onClick={resume}\n >\n Resume now\n </button>\n ) : (\n <button\n type=\"button\"\n className={`${autonomy.button} ${autonomy.buttonPrimary}`}\n disabled={disabled}\n onClick={halt}\n >\n Pause now\n </button>\n )}\n <button type=\"button\" className={autonomy.button} disabled={disabled} onClick={disarm}>\n Disarm\n </button>\n </div>\n </div>\n\n <p className={styles.haltNote}>\n {paused\n ? pauseUnknown\n ? 'Treated as paused: the pause sentinel could not be read, and the daemon fails safe rather than running on an unreadable signal. Nothing is being dispatched.'\n : 'Autonomous dispatch is paused. The loop parks between iterations; your own write tools are unaffected and the global kill switch is not engaged.'\n : 'Pause halts autonomous dispatch and nothing else — it undoes in one click. Disarm stops the next run from starting but leaves this one going.'}\n </p>\n\n <dl className={styles.facts}>\n <Fact label=\"Doing now\" value={run?.activity ?? UNKNOWN} wide />\n <Fact label=\"Repository\" value={run?.repo ?? UNKNOWN} mono />\n <Fact label=\"Running for\" value={formatRunElapsed(run?.startedAt, now)} />\n </dl>\n\n <div className={styles.stop}>\n <div className={styles.stopHead}>\n <span className={styles.stopHeadline}>{progress.headline}</span>\n <span className={styles.stopRemaining}>{progress.remaining}</span>\n </div>\n {progress.percent === null ? (\n <p className={styles.stopDetail}>\n No progress is drawn for an open-ended run: there is no finish line to draw it\n against.\n </p>\n ) : (\n <Meter\n value={progress.percent}\n max={100}\n variant=\"line\"\n tone={progress.reached ? 'warning' : 'accent'}\n aria-label=\"Progress toward the stop condition\"\n />\n )}\n </div>\n\n <Ledger\n title=\"Merged\"\n empty=\"Nothing merged yet.\"\n rows={(run?.merged ?? []).map((m) => ({\n id: m.id,\n repo: m.repo,\n title: m.title,\n meta: m.commit ? `${m.commit} · ${formatStamp(m.at)}` : formatStamp(m.at),\n }))}\n />\n <Ledger\n title=\"Discarded\"\n empty=\"Nothing discarded yet.\"\n rows={(run?.discarded ?? []).map((d) => ({\n id: d.id,\n repo: d.repo,\n title: d.title,\n meta: `${d.reason} · ${formatStamp(d.at)}`,\n }))}\n />\n\n {authorisation}\n </>\n ) : (\n <>\n <div className={styles.form}>\n <div className={styles.field}>\n <span className={styles.fieldLabel} id=\"verse-overnight-stop-label\">\n Stop rule\n </span>\n <Segmented\n options={STOP_OPTIONS}\n value={kind}\n onChange={(next) => {\n setKind(next);\n setFormError(null);\n }}\n aria-labelledby=\"verse-overnight-stop-label\"\n size=\"sm\"\n />\n </div>\n\n {kind === 'at-time' ? (\n <div className={styles.field}>\n <label className={styles.fieldLabel} htmlFor=\"verse-overnight-time\">\n Stop at\n </label>\n <input\n id=\"verse-overnight-time\"\n type=\"time\"\n className={styles.input}\n value={timeValue}\n disabled={disabled}\n onChange={(e) => {\n setTimeValue(e.target.value);\n setFormError(null);\n }}\n />\n </div>\n ) : null}\n\n {kind === 'after-iterations' ? (\n <div className={styles.field}>\n <label className={styles.fieldLabel} htmlFor=\"verse-overnight-iterations\">\n Iterations\n </label>\n <input\n id=\"verse-overnight-iterations\"\n type=\"number\"\n inputMode=\"numeric\"\n min={ITERATIONS_MIN}\n max={ITERATIONS_MAX}\n className={styles.input}\n value={iterationsValue}\n disabled={disabled}\n onChange={(e) => {\n setIterationsValue(e.target.value);\n setFormError(null);\n }}\n />\n </div>\n ) : null}\n </div>\n\n <p className={styles.rulePreview}>\n {rule === null\n ? kind === 'at-time'\n ? 'Enter a stop time as HH:MM.'\n : `Enter a number of iterations between ${ITERATIONS_MIN} and ${ITERATIONS_MAX}.`\n : describeStopRule(rule, new Date(now))}\n </p>\n\n {authorisation}\n\n <div className={styles.armRow}>\n {/* WHY IS THIS GREYED OUT — the one thing a disabled control has\n to be able to say. `disabled` eats pointer events on the button\n itself, so the Tooltip listens on its wrapper; it carries a\n DESCRIPTION, and the button keeps its own visible text as its\n accessible name. */}\n <Tooltip label={armDisabledReason}>\n <button\n type=\"button\"\n className={`${autonomy.button} ${autonomy.buttonPrimary}`}\n disabled={disabled || killed}\n onClick={arm}\n >\n Arm overnight run\n </button>\n </Tooltip>\n {paused ? (\n <button\n type=\"button\"\n className={autonomy.button}\n disabled={disabled}\n onClick={resume}\n >\n Resume now\n </button>\n ) : null}\n </div>\n\n {paused ? (\n <p className={styles.haltNote} role=\"status\">\n {pauseUnknown\n ? 'Autonomous dispatch is treated as paused — the sentinel could not be read. An armed run would park rather than work until that is resolved.'\n : 'Autonomous dispatch is paused, so an armed run would park rather than work. Resume before walking away.'}\n </p>\n ) : null}\n\n <p className={styles.heavier}>\n Pause is the halt for this run and it undoes in one click.{' '}\n <strong>Emergency stop</strong>, in Controls above, is heavier on purpose: it engages the\n global kill switch, which also stops the agent&rsquo;s own write tools from editing\n anything, anywhere, until you release it.\n </p>\n </>\n )}\n\n {formError ? (\n <p className={autonomy.capError} role=\"alert\">\n {formError}\n </p>\n ) : null}\n\n {guard.error ? (\n <p className={autonomy.capError} role=\"alert\">\n {guard.error}\n </p>\n ) : null}\n\n {note && !guard.error ? (\n <p className={autonomy.actionNote} role=\"status\">\n {note}\n </p>\n ) : null}\n </section>\n );\n}\n\n/**\n * The form state as a rule, or null when it is not yet a rule.\n *\n * Null is the single source of \"cannot arm yet\" — the preview line, the\n * disabled Arm button's tooltip and the submit guard all read it, so they\n * cannot disagree about whether the form is complete.\n */\nfunction buildRule(\n kind: OvernightStopRuleKind,\n timeValue: string,\n iterationsValue: string,\n): OvernightStopRule | null {\n if (kind === 'until-paused') return { kind: 'until-paused' };\n if (kind === 'at-time') {\n const at = resolveStopAt(timeValue);\n return at === null ? null : { kind: 'at-time', at };\n }\n const iterations = Number(iterationsValue);\n if (!Number.isInteger(iterations) || iterations < ITERATIONS_MIN || iterations > ITERATIONS_MAX) {\n return null;\n }\n return { kind: 'after-iterations', iterations };\n}\n\nfunction Fact({\n label,\n value,\n mono = false,\n wide = false,\n}: {\n label: string;\n value: string;\n mono?: boolean;\n wide?: boolean;\n}): ReactNode {\n return (\n <div className={`${styles.fact} ${wide ? styles.factWide : ''}`}>\n <dt className={styles.factLabel}>{label}</dt>\n <dd className={`${styles.factValue} ${mono ? styles.factMono : ''}`}>{value}</dd>\n </div>\n );\n}\n\ninterface LedgerRow {\n id: string;\n repo: string;\n title: string;\n meta: string;\n}\n\n/** What it merged, and what it threw away — same row shape for both. */\nfunction Ledger({\n title,\n empty,\n rows,\n}: {\n title: string;\n empty: string;\n rows: readonly LedgerRow[];\n}): ReactNode {\n return (\n <div className={styles.ledger}>\n <h4 className={styles.ledgerTitle}>\n {title} <span className={styles.ledgerCount}>{rows.length}</span>\n </h4>\n {rows.length === 0 ? (\n <p className={styles.ledgerEmpty}>{empty}</p>\n ) : (\n <ul className={styles.ledgerList}>\n {rows.map((row) => (\n <li key={row.id} className={styles.ledgerRow}>\n <span className={styles.ledgerRepo}>{row.repo}</span>\n <span className={styles.ledgerChange}>{row.title}</span>\n <span className={styles.ledgerMeta}>{row.meta}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","/**\n * routes/verse/autonomy/SafetyPanel.tsx — the `verify-safety` report as\n * pass/fail lines with a re-run button.\n *\n * These are READ-ONLY structural checks on this build's own source, so the\n * \"Re-run\" button is a plain re-fetch of `GET /api/verse/safety`: it needs no\n * mutation token and cannot change anything. The count is stated rather than\n * hardcoded to five — if the backend grows a sixth check the panel should show\n * six, not silently hide it.\n */\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { useQuery, useRefresh } from '../../../data/hooks.js';\nimport { verseSafetyQuery } from './control-queries.js';\nimport styles from './autonomy.module.css';\n\nexport function SafetyPanel() {\n const query = useQuery(verseSafetyQuery);\n const refetch = useRefresh(verseSafetyQuery);\n const report = query.data;\n const passed = report?.checks?.filter((c) => c.pass).length ?? 0;\n const total = report?.checks?.length ?? 0;\n\n return (\n <section className={styles.panel} aria-label=\"Safety checks\">\n <div className={styles.panelHead}>\n <h3 className={styles.panelTitle}>Safety</h3>\n <div className={styles.panelActions}>\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n {report ? (\n <span className={styles.panelNote}>\n {passed}/{total} passing\n </span>\n ) : null}\n <button type=\"button\" className={styles.button} onClick={refetch} disabled={query.status === 'loading'}>\n Re-run checks\n </button>\n </div>\n </div>\n\n {query.status === 'loading' ? (\n <div className={styles.skeletons}>\n <SkeletonLine width=\"70%\" />\n <SkeletonLine width=\"55%\" />\n <SkeletonLine width=\"62%\" />\n </div>\n ) : query.status === 'error' ? (\n <p className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Could not run the safety checks.'}\n </p>\n ) : !report || total === 0 ? (\n <p className={styles.empty}>\n The safety report came back with no checks. That is itself a problem worth investigating — treat it as a\n failure, not as a pass.\n </p>\n ) : (\n <div className={styles.checkList}>\n {report.checks.map((check) => (\n <div className={styles.check} key={check.id} data-pass={check.pass}>\n <span className={styles.checkMark} aria-hidden=\"true\">\n {check.pass ? '✓' : '✕'}\n </span>\n <span className={styles.checkLabel}>\n {check.label}\n <span className={styles.srOnly}>{check.pass ? ' — passed' : ' — failed'}</span>\n </span>\n <span className={styles.checkDetail}>{check.detail || check.id}</span>\n </div>\n ))}\n </div>\n )}\n </section>\n );\n}\n","/**\n * routes/verse/autonomy/ScopePanel.tsx — the enrollment registry: the single\n * biggest lever on what the autonomous loop is allowed to touch, and the one\n * with no UI path before V2.\n *\n * The empty state is the important one. An empty registry is the DEFAULT and\n * it means the daemon can mutate nothing at all — so the panel says that in\n * plain words instead of rendering an apologetic \"no data\" and letting the\n * operator conclude something is broken.\n *\n * Path rules mirror the server (docs/VERSE-CONTRACT-V2.md): absolute paths\n * only, and never anything under `~/.codex/artifacts`. The server is still the\n * authority; this just spares a round trip on an obvious mistake.\n */\nimport { useState } from 'react';\nimport { SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { ConfirmDialog } from '../../inbox/ConfirmDialog.js';\nimport { updateVerseScope, verseScopeQuery } from './control-queries.js';\nimport { verseAutonomyScopeQuery } from '../verse-queries.js';\nimport { ROOT_PRIORITY_LABEL, ROOT_PRIORITY_NOTE } from '../workspace-model.js';\nimport type { VerseAutonomyScopeView } from '../../../data/api-types.js';\nimport type { VerseScopeRepo } from './control-types.js';\nimport type { GuardedAction } from './use-guarded-action.js';\nimport styles from './autonomy.module.css';\n\n/**\n * Returns an error string, or null when the path is worth sending.\n *\n * A courtesy gate only — `checkVerseScopePath` on the server is the authority\n * and knows the operator's real home directory, which this cannot. The rules\n * mirrored here are the ones expressible without it.\n */\nexport function validateRepoPath(raw: string): string | null {\n const trimmed = raw.trim();\n if (trimmed === '') return 'Enter the absolute path of the repository to enroll.';\n if (!trimmed.startsWith('/')) return 'Enrollment takes an absolute path, e.g. /Users/you/code/project.';\n if (trimmed === '/') return 'The filesystem root cannot be enrolled as autonomous scope.';\n if (/(^|\\/)\\.codex\\/artifacts(\\/|$)/.test(trimmed)) return 'Paths under ~/.codex/artifacts cannot be enrolled.';\n // ~/.ashlr holds config.json, the enrollment registry, the KILL sentinel and\n // the private launcher records. Enrolling it would put the agent's own\n // control directory inside the scope those files define.\n if (/(^|\\/)\\.ashlr(\\/|$)/.test(trimmed)) return 'Paths under ~/.ashlr cannot be enrolled — that is the agent’s own control directory.';\n return null;\n}\n\n/**\n * One repo's standing in the autonomous lane: its sections and its priority.\n *\n * Renders NOTHING when the repo is in no section and carries the default\n * priority — which is every repo until the operator says otherwise, and is\n * exactly how the panel behaved before sections existed.\n */\nfunction ScopeRepoStanding({ path, scope }: { path: string; scope: VerseAutonomyScopeView | null }) {\n const entry = scope?.entries.find((e) => e.path === path) ?? null;\n if (entry === null) return null;\n const ranked = entry.priority !== 'normal';\n if (!ranked && entry.sections.length === 0) return null;\n return (\n <span className={styles.repoStanding} title={ROOT_PRIORITY_NOTE}>\n {ranked ? <span className={styles.repoPriority}>{ROOT_PRIORITY_LABEL[entry.priority]}</span> : null}\n {entry.sections.map((section) => (\n <span key={section.id} className={styles.repoSection}>{section.name}</span>\n ))}\n {entry.outsideFocus ? <span className={styles.repoOutsideFocus}>outside the focused section</span> : null}\n </span>\n );\n}\n\nexport function ScopePanel({ guard, dispatchEnabled }: { guard: GuardedAction; dispatchEnabled: boolean }) {\n const scope = useQuery(verseScopeQuery);\n // The RANKED view of the same registry. Read separately so it is obvious\n // these are two facts: what is enrolled, and in what order it is worked on.\n const autonomy = useQuery(verseAutonomyScopeQuery);\n const [path, setPath] = useState('');\n const [pathError, setPathError] = useState<string | null>(null);\n const [removing, setRemoving] = useState<VerseScopeRepo | null>(null);\n // The path the confirm dialog is asking about. Enrolment GRANTS an\n // autonomous agent write authority over a directory; removal takes authority\n // away and changes nothing on disk. Confirming only the removal put the\n // friction on the safe half, so the grant gets the same step — and in the\n // desktop shell, where the mutation hold never expires, this dialog is the\n // only thing between an Enter keypress and the grant.\n const [enrolling, setEnrolling] = useState<string | null>(null);\n const locked = !dispatchEnabled || guard.readOnly;\n\n /** Validate, then ASK. The Enter shortcut opens the confirm, never posts. */\n function submitEnroll() {\n const problem = validateRepoPath(path);\n if (problem) {\n setPathError(problem);\n return;\n }\n setPathError(null);\n setEnrolling(path.trim());\n }\n\n function confirmEnroll() {\n const target = enrolling;\n if (!target) return;\n guard.request(async () => {\n await updateVerseScope({ action: 'enroll', path: target });\n setPath('');\n setEnrolling(null);\n }, 'Enrolling a repository for autonomous work requires the dispatch token.');\n }\n\n const repos = scope.data?.repos ?? [];\n\n return (\n <section className={styles.panel} aria-label=\"Scope\">\n <div className={styles.panelHead}>\n <h3 className={styles.panelTitle}>Scope — enrolled repositories</h3>\n {scope.status === 'refreshing' ? <RefreshIndicator /> : null}\n </div>\n\n {scope.data?.degradedReason ? (\n <p className={styles.readOnly}>The enrollment registry read is degraded: {scope.data.degradedReason}</p>\n ) : null}\n\n {scope.status === 'loading' ? (\n <div className={styles.skeletons}>\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : scope.status === 'error' ? (\n <p className={styles.error} role=\"alert\">\n {scope.error?.message ?? 'Could not read the enrollment registry.'}\n </p>\n ) : repos.length === 0 ? (\n <p className={styles.empty}>\n <span className={styles.emptyStrong}>No repositories are enrolled, so the daemon will do nothing.</span>{' '}\n That is the default and it is not a bug — nothing autonomous can mutate a real repository until you enroll it\n here. Add one below to give the loop somewhere to work.\n </p>\n ) : (\n <div className={styles.repoList}>\n {repos.map((repo) => (\n <div className={styles.repoRow} key={repo.path}>\n <span className={styles.repoName}>{repo.name}</span>\n <span className={styles.repoPath} title={repo.path}>\n {repo.path}\n </span>\n {repo.exists ? null : <span className={styles.repoMissing}>⚠ path missing on disk</span>}\n {/* Workspace membership and rank, so the blast radius is legible:\n WHICH sections claim this repo, and where the fleet's\n attention goes. Both are ordering — neither enrols. */}\n <ScopeRepoStanding path={repo.path} scope={autonomy.data ?? null} />\n <button type=\"button\" className={styles.button} disabled={locked || guard.busy} onClick={() => setRemoving(repo)}>\n Remove\n </button>\n </div>\n ))}\n </div>\n )}\n\n <div className={styles.addRow}>\n <input\n className={styles.addInput}\n type=\"text\"\n value={path}\n placeholder=\"/absolute/path/to/repository\"\n aria-label=\"Repository path to enroll\"\n aria-invalid={pathError ? true : undefined}\n disabled={locked || guard.busy}\n onChange={(e) => {\n setPath(e.target.value);\n if (pathError) setPathError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n submitEnroll();\n }\n }}\n />\n <button type=\"button\" className={styles.button} disabled={locked || guard.busy} onClick={submitEnroll}>\n Enroll repository\n </button>\n </div>\n {pathError ? (\n <p className={styles.capError} role=\"alert\">\n {pathError}\n </p>\n ) : null}\n {guard.error && !pathError ? (\n <p className={styles.capError} role=\"alert\">\n {guard.error}\n </p>\n ) : null}\n\n <ConfirmDialog\n open={enrolling !== null}\n onClose={() => setEnrolling(null)}\n title=\"Give the autonomous loop write authority here?\"\n body={\n <>\n <code>{enrolling}</code> becomes autonomous scope. The loop may propose work against it, and the\n agent&rsquo;s own mcp-native write tools will act on it — enrolment is the gate those tools check.\n <br />\n <br />\n Nothing is written by enrolling. You can remove it again from this panel at any time.\n </>\n }\n confirmLabel=\"Enroll repository\"\n busy={guard.busy}\n error={guard.error}\n onConfirm={confirmEnroll}\n />\n\n <ConfirmDialog\n open={removing !== null}\n onClose={() => setRemoving(null)}\n title=\"Remove this repository from scope?\"\n body={\n <>\n The autonomous loop will stop proposing work for <code>{removing?.path}</code>. Existing proposals stay in\n the inbox; nothing on disk is changed or deleted.\n </>\n }\n confirmLabel=\"Remove from scope\"\n destructive\n busy={guard.busy}\n error={guard.error}\n onConfirm={() => {\n const target = removing;\n if (!target) return;\n guard.request(async () => {\n await updateVerseScope({ action: 'unenroll', path: target.path });\n setRemoving(null);\n }, 'Removing a repository from autonomous scope requires the dispatch token.');\n }}\n />\n </section>\n );\n}\n","/**\n * routes/verse/sections/AutonomySection.module.css — the section shell only.\n * Panel-level styling lives in ../autonomy/autonomy.module.css so the cockpit\n * reads as one object; this file owns the 48px header strip, the scroll\n * region, and the wide (non-720px) measure a dense control plane needs.\n */\n\n.section { display: flex; flex-direction: column; min-height: 0; height: 100%; background: var(--bg-canvas); }\n\n.header {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n /* DESIGN-V2 §4: header strips are --strip-height, and the token is what the\n desktop shell's inset maths is written against. */\n height: var(--strip-height);\n padding: 0 var(--space-5);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n.title {\n font-family: var(--font-display);\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display, -0.02em);\n color: var(--text-primary);\n}\n.headerActions { display: flex; align-items: center; gap: var(--space-2); }\n.ghost {\n min-height: var(--control-h-sm);\n padding: 0 var(--space-3);\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-secondary);\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n cursor: pointer;\n}\n.ghost:hover { background: var(--bg-hover); color: var(--text-primary); }\n\n.scroll { flex: 1; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; }\n.measure { max-width: 1040px; margin: 0 auto; padding: var(--space-5) var(--space-5) var(--space-16); }\n\n.banner {\n margin-bottom: var(--space-5);\n padding: var(--space-3) var(--space-4);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-surface);\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-base-line);\n}\n.banner code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.bannerTitle { display: block; color: var(--text-primary); font-weight: var(--font-weight-medium); }\n\n.failure {\n padding: var(--space-4);\n border: 1px solid var(--status-danger-solid);\n border-radius: var(--radius-sm);\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n font-size: var(--text-sm-size);\n line-height: var(--text-base-line);\n}\n.retry {\n margin-top: var(--space-3);\n min-height: var(--control-h-sm);\n padding: 0 var(--space-3);\n border: 1px solid currentColor;\n border-radius: var(--radius-sm);\n background: transparent;\n color: inherit;\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n cursor: pointer;\n}\n.loading { display: flex; flex-direction: column; gap: var(--space-3); }\n\n@media (max-width: 900px) {\n .measure { padding: var(--space-4) var(--space-4) var(--space-12); }\n}\n\n/* ---- desktop shell (see desktop/README.md \"Desktop shell contract\") -----\n * In the Tauri window the OS title bar overlays the top 48px and the macOS\n * traffic lights float over the top-LEFT 92px of the WINDOW. This strip does\n * not start at the window's left edge — the 56px rail does — so the inset it\n * owes is the overlap, never the full 92px. Both vars are absent in a\n * browser, where the expression floors to 0px and the layout is unchanged. */\n.header {\n padding-left: max(\n var(--space-5),\n calc(var(--app-traffic-light-inset, 0px) - var(--rail-width, 56px))\n );\n}\n","/**\n * routes/verse/sections/AutonomySection.tsx — the human-out-of-the-loop\n * cockpit (docs/VERSE-CONTRACT-V2.md, owner D). Lazy-mounted by VerseApp's\n * rail; takes no props by contract.\n *\n * It answers, top to bottom: is it running, how do I stop it, what is it\n * allowed to spend, what is it allowed to touch, what did it do, is it safe,\n * and what is it aiming at. The order is the priority order — the stop button\n * is never below the fold.\n *\n * One `GET /api/verse/control` aggregate backs the header, the controls, and\n * the live-usage figures; the panels underneath fetch their own slower or\n * filterable data (`/caps`, `/scope`, `/audit`, `/safety`, `/goals`,\n * `/backlog`) so a slow audit read never blocks the stop button from\n * rendering.\n *\n * Read-only sessions: `ashlr serve` without dispatch 404s every POST. That is\n * detected two ways — the bootstrap's `dispatchEnabled` up front, and a\n * `DispatchDisabledError` from any attempted write — and is rendered as an\n * explained session mode, never as an error.\n *\n * LOCAL FLEET (owner U). Three panels sit directly under the controls, above\n * budget and scope, because on a local-only machine they are the answer to\n * \"is it working\": the serving runtime that makes local agents possible at\n * all, the local-only refusal, and the agents in flight. They read\n * `/api/verse/{runtime,local-only,fleet}` through `fleet-queries.ts`, which\n * treats an absent route as a degraded panel rather than a dead section — the\n * three routes are landing in parallel with this surface.\n *\n * They also poll. The runtime and the fleet are the only things on this screen\n * that change while nobody clicks anything, and neither has an SSE event yet,\n * so `useFleetPolling` re-reads them while the tab is visible. Everything else\n * here still refreshes on the existing cache rules.\n *\n * OVERNIGHT (owner U). It sits directly under the controls, above the local\n * fleet, because it is a CONTROL — the one the operator arms when they walk\n * away — and the order of this section is the priority order. It reads\n * `/api/verse/overnight` through `overnight-queries.ts`, which treats an\n * absent route as a designed \"not available in this build\" state rather than\n * an error, and polls only while a run is armed.\n */\nimport { useMemo } from 'react';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine, SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport { useQuery, useRefresh } from '../../../data/hooks.js';\nimport { ActivityPanel } from '../autonomy/ActivityPanel.js';\nimport { CapsPanel } from '../autonomy/CapsPanel.js';\nimport { DaemonControls } from '../autonomy/DaemonControls.js';\nimport { FleetPanel } from '../autonomy/FleetPanel.js';\nimport { GoalsBacklogPanel } from '../autonomy/GoalsBacklogPanel.js';\nimport { LocalOnlyPanel } from '../autonomy/LocalOnlyPanel.js';\nimport { LocalRuntimePanel } from '../autonomy/LocalRuntimePanel.js';\nimport { OvernightPanel } from '../autonomy/OvernightPanel.js';\nimport { SafetyPanel } from '../autonomy/SafetyPanel.js';\nimport { ScopePanel } from '../autonomy/ScopePanel.js';\nimport { StatusHeader } from '../autonomy/StatusHeader.js';\nimport { verseCapsQuery, verseControlQuery } from '../autonomy/control-queries.js';\nimport {\n fleetQuery,\n localOnlyQuery,\n servingRuntimeQuery,\n useFleetPolling,\n} from '../autonomy/fleet-queries.js';\nimport type { SeatLike } from '../autonomy/fleet-model.js';\nimport { overnightQuery, useOvernightPolling } from '../autonomy/overnight-queries.js';\nimport { useGuardedAction } from '../autonomy/use-guarded-action.js';\nimport { verseBootstrapQuery } from '../verse-queries.js';\nimport autonomy from '../autonomy/autonomy.module.css';\nimport styles from './AutonomySection.module.css';\n\nexport function AutonomySection() {\n const control = useQuery(verseControlQuery);\n const caps = useQuery(verseCapsQuery);\n const bootstrap = useQuery(verseBootstrapQuery);\n const runtime = useQuery(servingRuntimeQuery);\n const fleet = useQuery(fleetQuery);\n const localOnly = useQuery(localOnlyQuery);\n const overnight = useQuery(overnightQuery);\n const refetchControl = useRefresh(verseControlQuery);\n const guard = useGuardedAction();\n useFleetPolling();\n // Only an ARMED run has counters that move on their own; a disarmed panel\n // has one boolean to report and is left to the ordinary cache rules.\n useOvernightPolling(overnight.data?.value?.armed ?? false);\n\n const dispatchEnabled = (bootstrap.data?.dispatchEnabled ?? true) && !guard.readOnly;\n const snapshot = control.data;\n\n // The live seat roster, narrowed to what the local-only blast radius needs.\n // Bootstrap is the roster every other Verse surface reads, so this panel's\n // \"3 of your 5 seats\" cannot disagree with the seat picker.\n const seats: SeatLike[] = useMemo(\n () => (bootstrap.data?.seats ?? []).map((s) => ({ id: s.id, engine: s.engine, label: s.label })),\n [bootstrap.data],\n );\n\n return (\n <section className={styles.section} aria-label=\"Autonomy\">\n <header className={styles.header} data-app-region=\"drag\">\n <h2 className={styles.title}>Autonomy</h2>\n <div className={styles.headerActions}>\n {control.status === 'refreshing' ? <RefreshIndicator /> : null}\n <button type=\"button\" className={styles.ghost} onClick={refetchControl}>\n Refresh\n </button>\n </div>\n </header>\n\n <div className={styles.scroll}>\n <div className={styles.measure}>\n {!dispatchEnabled ? (\n <div className={styles.banner} role=\"status\">\n <span className={styles.bannerTitle}>Read-only session</span>\n This server was started without dispatch, so starting, stopping, editing caps, and changing scope are\n unavailable. Everything below is live and accurate — run <code>ashlr verse</code> to get the controls.\n </div>\n ) : null}\n\n {control.status === 'loading' ? (\n <div className={styles.loading}>\n <SkeletonLine width=\"42%\" />\n <SkeletonLine width=\"68%\" />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : control.status === 'error' || !snapshot ? (\n <div className={styles.failure} role=\"alert\">\n {control.error?.message ?? 'Could not read the autonomy control snapshot.'}\n <br />\n Without it the cockpit cannot honestly say whether the loop is running, so nothing below is shown rather\n than guessed.\n <br />\n <button type=\"button\" className={styles.retry} onClick={refetchControl}>\n Try again\n </button>\n </div>\n ) : (\n <>\n <StatusHeader snapshot={snapshot} />\n <DaemonControls snapshot={snapshot} guard={guard} dispatchEnabled={dispatchEnabled} />\n {/* The unattended lane, directly under the controls: arming it\n is the biggest single thing an operator does on this screen,\n and its halt must never be below the fold. */}\n <OvernightPanel\n read={overnight.data ?? null}\n snapshot={snapshot}\n guard={guard}\n dispatchEnabled={dispatchEnabled}\n loading={overnight.status === 'loading'}\n />\n {/* The local fleet, in the order the questions arrive: can it\n run, what is it allowed to reach, and what is it doing. */}\n <LocalRuntimePanel\n read={runtime.data ?? null}\n guard={guard}\n dispatchEnabled={dispatchEnabled}\n loading={runtime.status === 'loading'}\n />\n <LocalOnlyPanel\n read={localOnly.data ?? null}\n seats={seats}\n guard={guard}\n dispatchEnabled={dispatchEnabled}\n loading={localOnly.status === 'loading'}\n />\n <FleetPanel\n read={fleet.data ?? null}\n runtime={runtime.data?.value ?? null}\n loading={fleet.status === 'loading'}\n />\n {caps.status === 'loading' ? (\n <div className={autonomy.panel}>\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : caps.data ? (\n <CapsPanel caps={caps.data} snapshot={snapshot} guard={guard} dispatchEnabled={dispatchEnabled} />\n ) : (\n <section className={autonomy.panel} aria-label=\"Budget and limits\">\n <div className={autonomy.panelHead}>\n <h3 className={autonomy.panelTitle}>Budget and limits</h3>\n </div>\n <p className={autonomy.error} role=\"alert\">\n {caps.error?.message ?? 'Could not read the configured caps, so none are shown or editable.'}\n </p>\n </section>\n )}\n <ScopePanel guard={guard} dispatchEnabled={dispatchEnabled} />\n <ActivityPanel snapshot={snapshot} />\n <SafetyPanel />\n <GoalsBacklogPanel />\n </>\n )}\n </div>\n </div>\n\n <MutationTokenDialog\n open={guard.tokenOpen}\n onClose={guard.closeToken}\n reason={guard.tokenReason}\n tokenHelp=\"the mutation token ashlr verse printed\"\n />\n </section>\n );\n}\n"],"mappings":"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"}