@ashlr/hub 3.13.0 → 3.14.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 (625) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/dist/authority-surface.json +204 -124
  3. package/dist/build-identity.json +2 -2
  4. package/dist/cli/authority.js +112 -18
  5. package/dist/cli/authority.js.map +1 -1
  6. package/dist/cli/comms.d.ts +33 -19
  7. package/dist/cli/comms.js +128 -151
  8. package/dist/cli/comms.js.map +1 -1
  9. package/dist/cli/completions.js +1 -1
  10. package/dist/cli/completions.js.map +1 -1
  11. package/dist/cli/daemon.js +29 -0
  12. package/dist/cli/daemon.js.map +1 -1
  13. package/dist/cli/director.d.ts +8 -12
  14. package/dist/cli/director.js +17 -52
  15. package/dist/cli/director.js.map +1 -1
  16. package/dist/cli/fleet.js +4 -1
  17. package/dist/cli/fleet.js.map +1 -1
  18. package/dist/cli/help.js +1 -0
  19. package/dist/cli/help.js.map +1 -1
  20. package/dist/cli/leader.d.ts +27 -3
  21. package/dist/cli/leader.js +253 -4
  22. package/dist/cli/leader.js.map +1 -1
  23. package/dist/core/authority/server-enforcement.d.ts +110 -0
  24. package/dist/core/authority/server-enforcement.js +260 -0
  25. package/dist/core/authority/server-enforcement.js.map +1 -0
  26. package/dist/core/authority/standing-grant.d.ts +24 -4
  27. package/dist/core/authority/standing-grant.js +19 -3
  28. package/dist/core/authority/standing-grant.js.map +1 -1
  29. package/dist/core/cloud/timeline.js +13 -7
  30. package/dist/core/cloud/timeline.js.map +1 -1
  31. package/dist/core/comms/change-digest.d.ts +130 -0
  32. package/dist/core/comms/change-digest.js +451 -0
  33. package/dist/core/comms/change-digest.js.map +1 -0
  34. package/dist/core/comms/director-prompt.d.ts +4 -5
  35. package/dist/core/comms/director-prompt.js +4 -71
  36. package/dist/core/comms/director-prompt.js.map +1 -1
  37. package/dist/core/comms/director.d.ts +24 -61
  38. package/dist/core/comms/director.js +29 -382
  39. package/dist/core/comms/director.js.map +1 -1
  40. package/dist/core/comms/dispatch.d.ts +37 -12
  41. package/dist/core/comms/dispatch.js +244 -177
  42. package/dist/core/comms/dispatch.js.map +1 -1
  43. package/dist/core/comms/elon-dialogue.d.ts +23 -15
  44. package/dist/core/comms/elon-dialogue.js +36 -307
  45. package/dist/core/comms/elon-dialogue.js.map +1 -1
  46. package/dist/core/comms/fleet-pulse.js +4 -7
  47. package/dist/core/comms/fleet-pulse.js.map +1 -1
  48. package/dist/core/comms/handlers.d.ts +10 -6
  49. package/dist/core/comms/handlers.js +14 -48
  50. package/dist/core/comms/handlers.js.map +1 -1
  51. package/dist/core/comms/migrations.d.ts +47 -0
  52. package/dist/core/comms/migrations.js +125 -0
  53. package/dist/core/comms/migrations.js.map +1 -0
  54. package/dist/core/comms/requests.d.ts +32 -5
  55. package/dist/core/comms/requests.js +101 -5
  56. package/dist/core/comms/requests.js.map +1 -1
  57. package/dist/core/comms/telegram-channel.d.ts +104 -0
  58. package/dist/core/comms/telegram-channel.js +622 -0
  59. package/dist/core/comms/telegram-channel.js.map +1 -0
  60. package/dist/core/comms/telegram-thread-map.d.ts +56 -0
  61. package/dist/core/comms/telegram-thread-map.js +144 -0
  62. package/dist/core/comms/telegram-thread-map.js.map +1 -0
  63. package/dist/core/daemon/capacity-publisher.d.ts +8 -1
  64. package/dist/core/daemon/capacity-publisher.js +40 -2
  65. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  66. package/dist/core/daemon/loop.js +18 -4
  67. package/dist/core/daemon/loop.js.map +1 -1
  68. package/dist/core/daemon/tick-deadline.d.ts +44 -0
  69. package/dist/core/daemon/tick-deadline.js +83 -0
  70. package/dist/core/daemon/tick-deadline.js.map +1 -0
  71. package/dist/core/daemon/tick-hooks.d.ts +7 -0
  72. package/dist/core/daemon/tick-hooks.js.map +1 -1
  73. package/dist/core/daemon/tick-progress.d.ts +39 -0
  74. package/dist/core/daemon/tick-progress.js +194 -0
  75. package/dist/core/daemon/tick-progress.js.map +1 -0
  76. package/dist/core/dashboard.js +3 -1
  77. package/dist/core/dashboard.js.map +1 -1
  78. package/dist/core/fleet/fleet-merge-state.d.ts +6 -0
  79. package/dist/core/fleet/fleet-merge-state.js.map +1 -1
  80. package/dist/core/fleet/host-merge.d.ts +9 -0
  81. package/dist/core/fleet/host-merge.js +13 -2
  82. package/dist/core/fleet/host-merge.js.map +1 -1
  83. package/dist/core/fleet/merge-gates.d.ts +13 -0
  84. package/dist/core/fleet/merge-gates.js +14 -0
  85. package/dist/core/fleet/merge-gates.js.map +1 -1
  86. package/dist/core/fleet/mirrors.d.ts +162 -6
  87. package/dist/core/fleet/mirrors.js +1051 -49
  88. package/dist/core/fleet/mirrors.js.map +1 -1
  89. package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
  90. package/dist/core/fleet/standing-merge-pass.js +72 -1
  91. package/dist/core/fleet/standing-merge-pass.js.map +1 -1
  92. package/dist/core/fleet/status.d.ts +17 -0
  93. package/dist/core/fleet/status.js +22 -0
  94. package/dist/core/fleet/status.js.map +1 -1
  95. package/dist/core/fleet/tick-hooks-live.d.ts +1 -1
  96. package/dist/core/fleet/tick-hooks-live.js +13 -3
  97. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  98. package/dist/core/git.d.ts +17 -0
  99. package/dist/core/git.js +124 -25
  100. package/dist/core/git.js.map +1 -1
  101. package/dist/core/goals/open-goals.d.ts +47 -0
  102. package/dist/core/goals/open-goals.js +33 -0
  103. package/dist/core/goals/open-goals.js.map +1 -0
  104. package/dist/core/inbox/merge.d.ts +5 -0
  105. package/dist/core/inbox/merge.js +58 -2
  106. package/dist/core/inbox/merge.js.map +1 -1
  107. package/dist/core/integrations/locus.d.ts +28 -0
  108. package/dist/core/integrations/locus.js +155 -30
  109. package/dist/core/integrations/locus.js.map +1 -1
  110. package/dist/core/integrations/telegram-format.d.ts +40 -0
  111. package/dist/core/integrations/telegram-format.js +123 -0
  112. package/dist/core/integrations/telegram-format.js.map +1 -0
  113. package/dist/core/integrations/telegram.d.ts +60 -4
  114. package/dist/core/integrations/telegram.js +161 -28
  115. package/dist/core/integrations/telegram.js.map +1 -1
  116. package/dist/core/mcp-registry.d.ts +12 -0
  117. package/dist/core/mcp-registry.js +70 -0
  118. package/dist/core/mcp-registry.js.map +1 -1
  119. package/dist/core/observability/rollup.d.ts +12 -10
  120. package/dist/core/observability/rollup.js +44 -17
  121. package/dist/core/observability/rollup.js.map +1 -1
  122. package/dist/core/resources/connection-monitor.d.ts +9 -0
  123. package/dist/core/resources/connection-monitor.js +19 -9
  124. package/dist/core/resources/connection-monitor.js.map +1 -1
  125. package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
  126. package/dist/core/resources/quota-refresh-lease.js +34 -1
  127. package/dist/core/resources/quota-refresh-lease.js.map +1 -1
  128. package/dist/core/routing/budget-api.d.ts +7 -1
  129. package/dist/core/routing/budget-api.js +56 -2
  130. package/dist/core/routing/budget-api.js.map +1 -1
  131. package/dist/core/routing/readiness-types.d.ts +82 -0
  132. package/dist/core/routing/readiness-types.js +23 -0
  133. package/dist/core/routing/readiness-types.js.map +1 -0
  134. package/dist/core/routing/readiness.d.ts +103 -0
  135. package/dist/core/routing/readiness.js +480 -0
  136. package/dist/core/routing/readiness.js.map +1 -0
  137. package/dist/core/sandbox/confine.js +22 -1
  138. package/dist/core/sandbox/confine.js.map +1 -1
  139. package/dist/core/sandbox/policy.d.ts +23 -0
  140. package/dist/core/sandbox/policy.js +100 -0
  141. package/dist/core/sandbox/policy.js.map +1 -1
  142. package/dist/core/types.d.ts +13 -0
  143. package/dist/core/types.js.map +1 -1
  144. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  145. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
  146. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
  147. package/dist/core/usage/frontier-usage.d.ts +20 -2
  148. package/dist/core/usage/frontier-usage.js +75 -17
  149. package/dist/core/usage/frontier-usage.js.map +1 -1
  150. package/dist/core/verse/accounts.d.ts +45 -0
  151. package/dist/core/verse/accounts.js +246 -17
  152. package/dist/core/verse/accounts.js.map +1 -1
  153. package/dist/core/verse/apps-api.js +23 -11
  154. package/dist/core/verse/apps-api.js.map +1 -1
  155. package/dist/core/verse/apps.d.ts +11 -9
  156. package/dist/core/verse/apps.js +2 -2
  157. package/dist/core/verse/apps.js.map +1 -1
  158. package/dist/core/verse/authority-api.d.ts +8 -2
  159. package/dist/core/verse/authority-api.js +40 -5
  160. package/dist/core/verse/authority-api.js.map +1 -1
  161. package/dist/core/verse/autonomy-ladder.d.ts +172 -0
  162. package/dist/core/verse/autonomy-ladder.js +251 -0
  163. package/dist/core/verse/autonomy-ladder.js.map +1 -0
  164. package/dist/core/verse/context-fit.js +7 -5
  165. package/dist/core/verse/context-fit.js.map +1 -1
  166. package/dist/core/verse/control-api.d.ts +23 -1
  167. package/dist/core/verse/control-api.js +117 -10
  168. package/dist/core/verse/control-api.js.map +1 -1
  169. package/dist/core/verse/fleet-live-api.js +13 -5
  170. package/dist/core/verse/fleet-live-api.js.map +1 -1
  171. package/dist/core/verse/folder-io.d.ts +50 -0
  172. package/dist/core/verse/folder-io.js +142 -0
  173. package/dist/core/verse/folder-io.js.map +1 -0
  174. package/dist/core/verse/git-api.js +5 -4
  175. package/dist/core/verse/git-api.js.map +1 -1
  176. package/dist/core/verse/git-ops.d.ts +10 -1
  177. package/dist/core/verse/git-ops.js +18 -2
  178. package/dist/core/verse/git-ops.js.map +1 -1
  179. package/dist/core/verse/github-api.d.ts +1 -1
  180. package/dist/core/verse/github-api.js +5 -4
  181. package/dist/core/verse/github-api.js.map +1 -1
  182. package/dist/core/verse/github-repo.js +118 -14
  183. package/dist/core/verse/github-repo.js.map +1 -1
  184. package/dist/core/verse/leader-api.d.ts +5 -4
  185. package/dist/core/verse/leader-api.js +237 -10
  186. package/dist/core/verse/leader-api.js.map +1 -1
  187. package/dist/core/verse/local-models.d.ts +10 -0
  188. package/dist/core/verse/local-models.js +10 -1
  189. package/dist/core/verse/local-models.js.map +1 -1
  190. package/dist/core/verse/login-path.d.ts +73 -0
  191. package/dist/core/verse/login-path.js +123 -14
  192. package/dist/core/verse/login-path.js.map +1 -1
  193. package/dist/core/verse/mcp-control-api.js +4 -4
  194. package/dist/core/verse/mcp-control-api.js.map +1 -1
  195. package/dist/core/verse/mcp-scope.d.ts +22 -0
  196. package/dist/core/verse/mcp-scope.js +41 -1
  197. package/dist/core/verse/mcp-scope.js.map +1 -1
  198. package/dist/core/verse/mcp-seat-view.d.ts +10 -0
  199. package/dist/core/verse/mcp-seat-view.js +30 -4
  200. package/dist/core/verse/mcp-seat-view.js.map +1 -1
  201. package/dist/core/verse/overnight-api.js +20 -2
  202. package/dist/core/verse/overnight-api.js.map +1 -1
  203. package/dist/core/verse/path-guard.d.ts +24 -0
  204. package/dist/core/verse/path-guard.js +91 -22
  205. package/dist/core/verse/path-guard.js.map +1 -1
  206. package/dist/core/verse/preview-api.js +22 -0
  207. package/dist/core/verse/preview-api.js.map +1 -1
  208. package/dist/core/verse/projects.d.ts +21 -0
  209. package/dist/core/verse/projects.js +82 -0
  210. package/dist/core/verse/projects.js.map +1 -1
  211. package/dist/core/verse/session-controls-api.js +5 -3
  212. package/dist/core/verse/session-controls-api.js.map +1 -1
  213. package/dist/core/verse/session-handoff.d.ts +26 -0
  214. package/dist/core/verse/session-handoff.js +90 -12
  215. package/dist/core/verse/session-handoff.js.map +1 -1
  216. package/dist/core/verse/terminal-api.js +7 -4
  217. package/dist/core/verse/terminal-api.js.map +1 -1
  218. package/dist/core/verse/terminal.js +9 -5
  219. package/dist/core/verse/terminal.js.map +1 -1
  220. package/dist/core/verse/verse-api.js +81 -27
  221. package/dist/core/verse/verse-api.js.map +1 -1
  222. package/dist/core/verse/workspaces.d.ts +51 -0
  223. package/dist/core/verse/workspaces.js +177 -47
  224. package/dist/core/verse/workspaces.js.map +1 -1
  225. package/dist/core/vision/leader-apply.d.ts +40 -0
  226. package/dist/core/vision/leader-apply.js +101 -30
  227. package/dist/core/vision/leader-apply.js.map +1 -1
  228. package/dist/core/vision/leader-cadence.d.ts +114 -0
  229. package/dist/core/vision/leader-cadence.js +127 -0
  230. package/dist/core/vision/leader-cadence.js.map +1 -0
  231. package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
  232. package/dist/core/vision/leader-goal-evidence.js +36 -0
  233. package/dist/core/vision/leader-goal-evidence.js.map +1 -0
  234. package/dist/core/vision/leader-health.d.ts +53 -0
  235. package/dist/core/vision/leader-health.js +92 -0
  236. package/dist/core/vision/leader-health.js.map +1 -0
  237. package/dist/core/vision/leader-operator.d.ts +176 -0
  238. package/dist/core/vision/leader-operator.js +355 -0
  239. package/dist/core/vision/leader-operator.js.map +1 -0
  240. package/dist/core/vision/leader-run-chain.d.ts +41 -0
  241. package/dist/core/vision/leader-run-chain.js +54 -0
  242. package/dist/core/vision/leader-run-chain.js.map +1 -0
  243. package/dist/core/vision/leader-seat-plan.d.ts +68 -0
  244. package/dist/core/vision/leader-seat-plan.js +93 -0
  245. package/dist/core/vision/leader-seat-plan.js.map +1 -0
  246. package/dist/core/vision/leader-seat.d.ts +71 -5
  247. package/dist/core/vision/leader-seat.js +235 -33
  248. package/dist/core/vision/leader-seat.js.map +1 -1
  249. package/dist/core/vision/leader-thread-types.d.ts +104 -0
  250. package/dist/core/vision/leader-thread-types.js +9 -0
  251. package/dist/core/vision/leader-thread-types.js.map +1 -0
  252. package/dist/core/vision/leader-thread.d.ts +138 -0
  253. package/dist/core/vision/leader-thread.js +926 -0
  254. package/dist/core/vision/leader-thread.js.map +1 -0
  255. package/dist/core/vision/leader-types.d.ts +75 -1
  256. package/dist/core/vision/leader.d.ts +88 -18
  257. package/dist/core/vision/leader.js +269 -69
  258. package/dist/core/vision/leader.js.map +1 -1
  259. package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js → ActionMenu-CIiX2X8w.js} +2 -2
  260. package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
  261. package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
  262. package/dist/core/web/public/next/assets/{Advanced-cVYTAsfB.js.map → Advanced-DHsysoIL.js.map} +1 -1
  263. package/dist/core/web/public/next/assets/{App-IsaWDsdF.js → App-CMeAocmW.js} +5 -5
  264. package/dist/core/web/public/next/assets/{App-IsaWDsdF.js.map → App-CMeAocmW.js.map} +1 -1
  265. package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
  266. package/dist/core/web/public/next/assets/{AppsSection-DDqeSrty.js.map → AppsSection-DISYnMnc.js.map} +1 -1
  267. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
  268. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
  269. package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js → AutonomyOffState-CEPSZToP.js} +3 -3
  270. package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js.map → AutonomyOffState-CEPSZToP.js.map} +1 -1
  271. package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
  272. package/dist/core/web/public/next/assets/{AutonomySection-Dwn8UtOy.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
  273. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
  274. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
  275. package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js → BranchBar-BxhdiIpx.js} +2 -2
  276. package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
  277. package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js → BudgetControl-C-0KhjRS.js} +2 -2
  278. package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js.map → BudgetControl-C-0KhjRS.js.map} +1 -1
  279. package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js → Button-D90dzI_o.js} +2 -2
  280. package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js.map → Button-D90dzI_o.js.map} +1 -1
  281. package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js → CapacityStrip-qKDBC65C.js} +2 -2
  282. package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
  283. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
  284. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
  285. package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
  286. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
  287. package/dist/core/web/public/next/assets/{ChatSection-C9myY4ei.js.map → ChatSection-DlT4QU6a.js.map} +1 -1
  288. package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
  289. package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
  290. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
  291. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
  292. package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
  293. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
  294. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
  295. package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
  296. package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
  297. package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js → DeleteChatDialog-BCfP12GH.js} +2 -2
  298. package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
  299. package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js → Dialog-D3msQlCj.js} +2 -2
  300. package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js.map → Dialog-D3msQlCj.js.map} +1 -1
  301. package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js → DiffPane-Ix6hvXlY.js} +2 -2
  302. package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
  303. package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js → DiffViewer-C4WKsCIe.js} +2 -2
  304. package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
  305. package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
  306. package/dist/core/web/public/next/assets/{DockHost-BcEq2qaS.js.map → DockHost-aWP7liri.js.map} +1 -1
  307. package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js → EmptyState-D2IRy3Cg.js} +2 -2
  308. package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
  309. package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js → Epistemic-DMr18muX.js} +2 -2
  310. package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js.map → Epistemic-DMr18muX.js.map} +1 -1
  311. package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js → EvidenceTimeline-DXmmz6Fi.js} +2 -2
  312. package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js.map → EvidenceTimeline-DXmmz6Fi.js.map} +1 -1
  313. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
  314. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
  315. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
  316. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
  317. package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js → GearTray-Dt-ee32-.js} +2 -2
  318. package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js.map → GearTray-Dt-ee32-.js.map} +1 -1
  319. package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
  320. package/dist/core/web/public/next/assets/{GrowthSection-BvZezOsX.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
  321. package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js → HandoffDialog-CLJQLe7M.js} +2 -2
  322. package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
  323. package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js → Input-D_KRJA9V.js} +2 -2
  324. package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js.map → Input-D_KRJA9V.js.map} +1 -1
  325. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
  326. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
  327. package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
  328. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
  329. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
  330. package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
  331. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
  332. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
  333. package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
  334. package/dist/core/web/public/next/assets/{McpSection-nuXer4K-.js.map → McpSection-DGbRcyv8.js.map} +1 -1
  335. package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js → MessageMarkdown-DFvk06qG.js} +3 -3
  336. package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
  337. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
  338. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
  339. package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js → Meter-CMj-VafN.js} +2 -2
  340. package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js.map → Meter-CMj-VafN.js.map} +1 -1
  341. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
  342. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
  343. package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
  344. package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
  345. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
  346. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
  347. package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js → NeedsYouList-CCsijdWt.js} +2 -2
  348. package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
  350. package/dist/core/web/public/next/assets/{NewChatDialog-BqFTWgHU.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
  351. package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js → OnboardingFlow-Cy9BA9eR.js} +3 -3
  352. package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js.map → OnboardingFlow-Cy9BA9eR.js.map} +1 -1
  353. package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
  354. package/dist/core/web/public/next/assets/{OnboardingGate-BZafM1Vf.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
  355. package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
  356. package/dist/core/web/public/next/assets/{PreviewPane-zT3gK9TD.js.map → PreviewPane-COid5A0f.js.map} +1 -1
  357. package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js → ProviderLogo-Cq-CYIwT.js} +2 -2
  358. package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
  359. package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js → RailStatus-Co5UB6We.js} +2 -2
  360. package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js.map → RailStatus-Co5UB6We.js.map} +1 -1
  361. package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js → RefreshIndicator-DO9ibnSq.js} +2 -2
  362. package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
  363. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
  364. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CAxPQ4sZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
  365. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
  366. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
  367. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
  368. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
  369. package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
  370. package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
  371. package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
  372. package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
  373. package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
  374. package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js → SeatSelector-J5R3zDkB.js} +3 -3
  375. package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
  376. package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js → Segmented-CGh_-tBb.js} +2 -2
  377. package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js.map → Segmented-CGh_-tBb.js.map} +1 -1
  378. package/dist/core/web/public/next/assets/{Select-By-V9lMc.js → Select-CWnmUzs3.js} +2 -2
  379. package/dist/core/web/public/next/assets/{Select-By-V9lMc.js.map → Select-CWnmUzs3.js.map} +1 -1
  380. package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js → SessionGate-sp4KsnUo.js} +2 -2
  381. package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
  382. package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js → SessionInsightChip-DLFAzdbi.js} +2 -2
  383. package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
  384. package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js → SessionSearch-DbFjwR1h.js} +2 -2
  385. package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
  386. package/dist/core/web/public/next/assets/{SettingsSection-Bf74l0Gj.js → SettingsSection-Ch23msJ5.js} +2 -2
  387. package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
  388. package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js → SetupChecklist-Bd76MBAR.js} +2 -2
  389. package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js.map → SetupChecklist-Bd76MBAR.js.map} +1 -1
  390. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
  391. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
  392. package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js → Sheet-BZ2AG4Eo.js} +2 -2
  393. package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
  394. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
  395. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
  396. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
  397. package/dist/core/web/public/next/assets/{Sidebar-C9YtBYVZ.js.map → Sidebar-DN--cPYN.js.map} +1 -1
  398. package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js → Slider-KVoJLDD6.js} +2 -2
  399. package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js.map → Slider-KVoJLDD6.js.map} +1 -1
  400. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
  401. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
  402. package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
  403. package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js → StatusBadge-CXsYqmdU.js} +2 -2
  404. package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
  405. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
  406. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
  407. package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js → Surface-BfDmQcKe.js} +2 -2
  408. package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js.map → Surface-BfDmQcKe.js.map} +1 -1
  409. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
  410. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
  411. package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
  412. package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js → Switch-9NtO_6Lj.js} +2 -2
  413. package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js.map → Switch-9NtO_6Lj.js.map} +1 -1
  414. package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js → Tag-DscCRFcN.js} +2 -2
  415. package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js.map → Tag-DscCRFcN.js.map} +1 -1
  416. package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js → TerminalPane-B668-DJW.js} +5 -5
  417. package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js.map → TerminalPane-B668-DJW.js.map} +1 -1
  418. package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
  419. package/dist/core/web/public/next/assets/{UniverseConsoleApp-BpphLqoz.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
  420. package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js → UniverseView-DG70zH0W.js} +4 -4
  421. package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js.map → UniverseView-DG70zH0W.js.map} +1 -1
  422. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
  423. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
  424. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
  425. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
  426. package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
  427. package/dist/core/web/public/next/assets/{Workspace-RXy0pqp6.js.map → Workspace-D1nP9BhD.js.map} +1 -1
  428. package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
  429. package/dist/core/web/public/next/assets/{actions-BZTidCXZ.js.map → actions-CY-PjpGc.js.map} +1 -1
  430. package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
  431. package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js → apps-model-Du02KhAf.js} +2 -2
  432. package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js.map → apps-model-Du02KhAf.js.map} +1 -1
  433. package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js → authority-model-79SeuKlJ.js} +2 -2
  434. package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js.map → authority-model-79SeuKlJ.js.map} +1 -1
  435. package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
  436. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
  437. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
  438. package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
  439. package/dist/core/web/public/next/assets/{budget-queries-DFF-3ICg.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
  440. package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
  441. package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
  442. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
  443. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
  444. package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
  445. package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js → cloud-model-BDivRMqv.js} +2 -2
  446. package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js.map → cloud-model-BDivRMqv.js.map} +1 -1
  447. package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js → cloud-queries-BPQQ5_pJ.js} +2 -2
  448. package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
  449. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
  450. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
  451. package/dist/core/web/public/next/assets/{command-catalog-ffCAijVY.js → command-catalog-BIntSa9l.js} +2 -2
  452. package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
  453. package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js → context-model-Br8t9jgG.js} +2 -2
  454. package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js.map → context-model-Br8t9jgG.js.map} +1 -1
  455. package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js → context-model-CokrgEUq.js} +3 -3
  456. package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js.map → context-model-CokrgEUq.js.map} +1 -1
  457. package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
  458. package/dist/core/web/public/next/assets/{context-queries-_9bFWb9v.js.map → context-queries-eL3caKVG.js.map} +1 -1
  459. package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js → control-queries-B9K-wmcB.js} +2 -2
  460. package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js.map → control-queries-B9K-wmcB.js.map} +1 -1
  461. package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js → copy-setup-XMgCC5f8.js} +2 -2
  462. package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js.map → copy-setup-XMgCC5f8.js.map} +1 -1
  463. package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js → dock-icons-BJ6ZqB2t.js} +2 -2
  464. package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
  465. package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js → fleet-model-BvDR3gjp.js} +2 -2
  466. package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
  467. package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js → fleet-queries-W2UFVMZJ.js} +2 -2
  468. package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
  469. package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js → focus-trap-CtI1SlMX.js} +2 -2
  470. package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
  471. package/dist/core/web/public/next/assets/{format-BmH2yWL6.js → format-CH4g_sl1.js} +2 -2
  472. package/dist/core/web/public/next/assets/{format-BmH2yWL6.js.map → format-CH4g_sl1.js.map} +1 -1
  473. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
  474. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
  475. package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js → git-model-Dnkd1TnK.js} +2 -2
  476. package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js.map → git-model-Dnkd1TnK.js.map} +1 -1
  477. package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
  478. package/dist/core/web/public/next/assets/{global-y_exIyAP.js.map → global-CMNW_dqn.js.map} +1 -1
  479. package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
  480. package/dist/core/web/public/next/assets/{guarded-runners-Cd4POBtI.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
  481. package/dist/core/web/public/next/assets/{icons-CygCEFWs.js → icons-D1sYbCTQ.js} +2 -2
  482. package/dist/core/web/public/next/assets/{icons-CygCEFWs.js.map → icons-D1sYbCTQ.js.map} +1 -1
  483. package/dist/core/web/public/next/assets/{index-CyK31YRm.js → index-DZ-UQ7v8.js} +3 -3
  484. package/dist/core/web/public/next/assets/{index-CyK31YRm.js.map → index-DZ-UQ7v8.js.map} +1 -1
  485. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
  486. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
  487. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
  488. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
  489. package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js → live-model-D_32RAOR.js} +2 -2
  490. package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js.map → live-model-D_32RAOR.js.map} +1 -1
  491. package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js → mind.module-7hA92hRg.js} +2 -2
  492. package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js.map → mind.module-7hA92hRg.js.map} +1 -1
  493. package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
  494. package/dist/core/web/public/next/assets/{mutations-CWlxEMEm.js.map → mutations-DQPbFdRJ.js.map} +1 -1
  495. package/dist/core/web/public/next/assets/{nav-mimleI0R.js → nav-0dOYe2rJ.js} +2 -2
  496. package/dist/core/web/public/next/assets/{nav-mimleI0R.js.map → nav-0dOYe2rJ.js.map} +1 -1
  497. package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js → overnight-queries-C4wOnFtE.js} +2 -2
  498. package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
  499. package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
  500. package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js → queries-BTXWdZzU.js} +2 -2
  501. package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js.map → queries-BTXWdZzU.js.map} +1 -1
  502. package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js → reasoning-pref-Ca6lN6x_.js} +2 -2
  503. package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
  504. package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js → reveal-anchor-DfNLgK_I.js} +2 -2
  505. package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
  506. package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
  507. package/dist/core/web/public/next/assets/{seat-subscription-BhUUz7VL.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
  508. package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js → sidebar-model-CLCdqwkR.js} +2 -2
  509. package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
  510. package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js → slots-C-qBeu-8.js} +3 -3
  511. package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js.map → slots-C-qBeu-8.js.map} +1 -1
  512. package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js → surface-data-Dj71tdD-.js} +2 -2
  513. package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js.map → surface-data-Dj71tdD-.js.map} +1 -1
  514. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
  515. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
  516. package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js → tasks-model-O8yR5YXp.js} +2 -2
  517. package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
  518. package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js → terminal-icons-CoRZq9iO.js} +2 -2
  519. package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
  520. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
  521. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
  522. package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js → usage-queries-AdjEyEtn.js} +2 -2
  523. package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
  524. package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js → use-guarded-action-CuuMHeDX.js} +2 -2
  525. package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
  526. package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js → use-ticker-BBcp02SZ.js} +2 -2
  527. package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
  528. package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js → use-token-gate-CbXVYQYI.js} +2 -2
  529. package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
  530. package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js → useOnboarding-C_Fpe_sH.js} +2 -2
  531. package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
  532. package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
  533. package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
  534. package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js → useVerseTranscript-DgbigUlV.js} +2 -2
  535. package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
  536. package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js → verse-icons-S56hIiXS.js} +2 -2
  537. package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js.map → verse-icons-S56hIiXS.js.map} +1 -1
  538. package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
  539. package/dist/core/web/public/next/assets/{verse-model-JTuvRBVK.js.map → verse-model-DAVevkNe.js.map} +1 -1
  540. package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js → warmup-B_RAtNZ_.js} +3 -3
  541. package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js.map → warmup-B_RAtNZ_.js.map} +1 -1
  542. package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js → why-seat-model-M_r0wX3b.js} +2 -2
  543. package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js.map → why-seat-model-M_r0wX3b.js.map} +1 -1
  544. package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js → workspace-model-dji5-Al3.js} +2 -2
  545. package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js.map → workspace-model-dji5-Al3.js.map} +1 -1
  546. package/dist/core/web/public/next/index.html +1 -1
  547. package/dist/core/web/read-projection-worker.js +2 -1
  548. package/dist/core/web/read-projection-worker.js.map +1 -1
  549. package/dist/core/web/read-projections.d.ts +3 -0
  550. package/dist/core/web/read-projections.js +2 -2
  551. package/dist/core/web/read-projections.js.map +1 -1
  552. package/dist/core/web/visibility.js +3 -4
  553. package/dist/core/web/visibility.js.map +1 -1
  554. package/dist/release-dependency-inventory.json +1 -1
  555. package/package.json +3 -2
  556. package/dist/core/web/public/next/assets/Advanced-cVYTAsfB.js +0 -2
  557. package/dist/core/web/public/next/assets/AppsSection-DDqeSrty.js +0 -2
  558. package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js +0 -2
  559. package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js.map +0 -1
  560. package/dist/core/web/public/next/assets/AutonomySection-Dwn8UtOy.js +0 -2
  561. package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
  562. package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js +0 -2
  563. package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js.map +0 -1
  564. package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js +0 -3
  565. package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js +0 -2
  566. package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js.map +0 -1
  567. package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js +0 -3
  568. package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js.map +0 -1
  569. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
  570. package/dist/core/web/public/next/assets/DockHost-BcEq2qaS.js +0 -2
  571. package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js +0 -3
  572. package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js.map +0 -1
  573. package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js +0 -2
  574. package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js.map +0 -1
  575. package/dist/core/web/public/next/assets/GrowthSection-BvZezOsX.js +0 -2
  576. package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js +0 -2
  577. package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js.map +0 -1
  578. package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js +0 -2
  579. package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js.map +0 -1
  580. package/dist/core/web/public/next/assets/McpSection-nuXer4K-.js +0 -2
  581. package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js +0 -2
  582. package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js.map +0 -1
  583. package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js +0 -3
  584. package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js.map +0 -1
  585. package/dist/core/web/public/next/assets/NewChatDialog-BqFTWgHU.js +0 -3
  586. package/dist/core/web/public/next/assets/OnboardingGate-BZafM1Vf.js +0 -3
  587. package/dist/core/web/public/next/assets/PreviewPane-zT3gK9TD.js +0 -2
  588. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CAxPQ4sZ.js +0 -7
  589. package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js +0 -3
  590. package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js.map +0 -1
  591. package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js +0 -2
  592. package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js.map +0 -1
  593. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
  594. package/dist/core/web/public/next/assets/SettingsSection-Bf74l0Gj.js.map +0 -1
  595. package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js +0 -3
  596. package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
  597. package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js +0 -2
  598. package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js.map +0 -1
  599. package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js +0 -2
  600. package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js.map +0 -1
  601. package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js +0 -2
  602. package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js.map +0 -1
  603. package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
  604. package/dist/core/web/public/next/assets/UniverseConsoleApp-BpphLqoz.js +0 -2
  605. package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js +0 -3
  606. package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js.map +0 -1
  607. package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js +0 -3
  608. package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js.map +0 -1
  609. package/dist/core/web/public/next/assets/Workspace-RXy0pqp6.js +0 -10
  610. package/dist/core/web/public/next/assets/actions-BZTidCXZ.js +0 -2
  611. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
  612. package/dist/core/web/public/next/assets/budget-queries-DFF-3ICg.js +0 -2
  613. package/dist/core/web/public/next/assets/charts-CzxWrZn7.js +0 -2
  614. package/dist/core/web/public/next/assets/charts-CzxWrZn7.js.map +0 -1
  615. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
  616. package/dist/core/web/public/next/assets/command-catalog-ffCAijVY.js.map +0 -1
  617. package/dist/core/web/public/next/assets/context-queries-_9bFWb9v.js +0 -2
  618. package/dist/core/web/public/next/assets/global-y_exIyAP.js +0 -2
  619. package/dist/core/web/public/next/assets/guarded-runners-Cd4POBtI.js +0 -2
  620. package/dist/core/web/public/next/assets/mutations-CWlxEMEm.js +0 -2
  621. package/dist/core/web/public/next/assets/primitives-DMijqcu0.js +0 -1
  622. package/dist/core/web/public/next/assets/seat-subscription-BhUUz7VL.js +0 -2
  623. package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js +0 -2
  624. package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js.map +0 -1
  625. package/dist/core/web/public/next/assets/verse-model-JTuvRBVK.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"control-queries-CXtmZZH6.js","names":[],"sources":["../../../../../../src/core/verse/control-types.ts","../../../../../../src/web-ui/routes/verse/autonomy/control-queries.ts"],"sourcesContent":["/**\n * Ashlr Verse — autonomy control-plane contract (V2).\n *\n * V1 (`./types.ts`) is frozen: it describes interactive chat sessions. This\n * module adds the shapes the Autonomy cockpit needs to run the hub's existing\n * autonomous fleet without a terminal — the CONFIGURED caps, the enrollment\n * scope, the audit trail, the kill switch, and the daemon lifecycle.\n *\n * Two hard rules are encoded here rather than left to the UI:\n *\n * 1. The global kill switch (`~/.ashlr/KILL`) is an EMERGENCY STOP, not a\n * pause. It also refuses the agent's own `mcp-native` write tools. Every\n * shape that carries it is named `killSwitch`, and the action that engages\n * it is named `emergencyStop`. It is never called \"pause\".\n *\n * V2.1 adds the control that name was being withheld from: the\n * DAEMON-SCOPED pause (`~/.ashlr/daemon.paused`, see core/daemon/pause.ts).\n * It halts autonomous dispatch and NOTHING else — `assertMayMutate`,\n * `mcp-native`, and `mcp-native-engineer` do not read it. It travels as\n * `pause: VerseDaemonPause`, always a FIELD OF ITS OWN, never merged into\n * `killSwitch`, because the whole point is that the two have different\n * blast radii and the operator must be able to see which one is on.\n * 2. Nothing in this module is a secret. Launcher commands, tokens, and env\n * values never appear in any of these shapes — the daemon lifecycle result\n * carries a pid, never an argv.\n *\n * Everything is a projection of state the hub already computes; nothing here\n * introduces a new source of truth.\n */\n\nimport type { AuditEntry } from '../types.js';\nimport type { PublicDaemonObservation } from '../daemon/public-observation.js';\nimport type { FrontierEngineUsage } from '../usage/frontier-usage.js';\nimport type { SafetyReport } from '../../cli/verify-safety.js';\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\n/**\n * Error codes for `/api/verse/{control,caps,scope,audit,daemon,safety}`.\n * `VERSE_INVALID` / `VERSE_TOO_LARGE` are deliberately the SAME codes V1 uses,\n * so one client error mapper covers both halves of the Verse API.\n */\nexport type VerseControlErrorCode =\n | 'VERSE_INVALID'\n | 'VERSE_REFUSED'\n | 'VERSE_TOO_LARGE'\n | 'VERSE_UNAVAILABLE';\n\n/** Every error body on these routes. */\nexport interface VerseControlError {\n error: string;\n code: VerseControlErrorCode;\n}\n\n// ---------------------------------------------------------------------------\n// Caps — the CONFIGURED limits (GET/POST /api/verse/caps)\n// ---------------------------------------------------------------------------\n\n/** One `cfg.foundry.limits[engine]` entry, flattened for transport. */\nexport interface VerseFoundryLimit {\n /** EngineId key, e.g. 'claude' | 'codex'. */\n engine: string;\n /** Rolling window label, e.g. '1m' | '5m' | '1h' | '1d'. */\n window: string;\n /** Max dispatches per window. 0 means \"no dispatches allowed\". */\n max: number;\n}\n\n/** `cfg.daemon.concurrency` — null per tier means \"not configured, using the default\". */\nexport interface VerseCapsConcurrency {\n local: number | null;\n cloud: number | null;\n total: number | null;\n}\n\n/**\n * The configured autonomy limits. These are the values the daemon actually\n * reads — no route exposed them before V2, which is why the cockpit could not\n * show a cap next to the usage burning against it.\n */\nexport interface VerseCaps {\n /** HARD daily spend ceiling (USD). 0 means the daemon is stopped by budget. */\n dailyBudgetUsd: number;\n /** Backlog items processed per tick. */\n perTickItems: number;\n /** Concurrent sandboxed swarms per tick (batch mode). */\n parallel: number;\n /** Tick interval in loop mode (ms). */\n intervalMs: number;\n /** Daemon execution mode. */\n mode: 'batch' | 'continuous';\n /** Ceiling on in-flight dispatches in continuous mode; null when unset. */\n maxConcurrent: number | null;\n /** Per-tier concurrency budgets; null per tier when unset. */\n concurrency: VerseCapsConcurrency;\n /** Subscription-window throttle percentage (1–100). */\n subscriptionMaxPercent: number;\n /** Per-engine dispatch limits, sorted by engine id. */\n foundryLimits: VerseFoundryLimit[];\n /**\n * HONEST STATE: the cap keys whose value is a built-in default rather than\n * something configured on disk. The UI renders these as \"default\", never as\n * a deliberate choice the operator made. Sorted, stable.\n */\n defaulted: VerseCapKey[];\n}\n\n/** The scalar cap keys a client may update. `foundryLimits` is handled separately. */\nexport type VerseCapKey =\n | 'dailyBudgetUsd'\n | 'perTickItems'\n | 'parallel'\n | 'intervalMs'\n | 'mode'\n | 'maxConcurrent'\n | 'concurrency'\n | 'subscriptionMaxPercent'\n | 'foundryLimits';\n\n/** POST /api/verse/caps — a partial update. Unknown keys are rejected. */\nexport interface VerseCapsUpdate {\n dailyBudgetUsd?: number;\n perTickItems?: number;\n parallel?: number;\n intervalMs?: number;\n mode?: 'batch' | 'continuous';\n maxConcurrent?: number;\n concurrency?: { local?: number; cloud?: number; total?: number };\n subscriptionMaxPercent?: number;\n /** Replaces the named engines' limits; engines not listed are left alone. */\n foundryLimits?: VerseFoundryLimit[];\n}\n\n/**\n * POST /api/verse/caps result. `live: true` is not decoration — the daemon\n * re-reads config at the top of every tick, so a saved cap binds on the next\n * tick without a restart.\n */\nexport interface VerseCapsUpdateResult {\n ok: true;\n /** The cap keys this request actually changed, in request order. */\n applied: VerseCapKey[];\n live: true;\n /** The full caps AFTER the write, re-read from disk. */\n caps: VerseCaps;\n}\n\n// ---------------------------------------------------------------------------\n// Scope — the enrollment registry (GET/POST /api/verse/scope)\n// ---------------------------------------------------------------------------\n\nexport interface VerseScopeRepo {\n path: string;\n name: string;\n /** False when the registry still lists a directory that is gone. */\n exists: boolean;\n}\n\n/**\n * GET /api/verse/scope. An EMPTY `repos` with no `degradedReason` is the\n * valid default state and means the daemon will do nothing at all — the UI\n * must say that plainly rather than rendering an innocuous empty list.\n */\nexport interface VerseScope {\n repos: VerseScopeRepo[];\n /** Present only when enrollment authority could not be read at all. */\n degradedReason?: string;\n}\n\nexport type VerseScopeAction = 'enroll' | 'unenroll';\n\n/** POST /api/verse/scope body. */\nexport interface VerseScopeRequest {\n action: VerseScopeAction;\n path: string;\n}\n\nexport interface VerseScopeResult {\n ok: boolean;\n action: VerseScopeAction;\n /** The canonical (realpath'd) registry path this acted on. */\n path: string;\n /** False when the registry already had the requested state (idempotent). */\n changed: boolean;\n /** Policy reason string, e.g. 'enrolled' | 'already-unenrolled'. */\n reason: string;\n /** The scope AFTER the mutation. */\n scope: VerseScope;\n}\n\n// ---------------------------------------------------------------------------\n// Audit (GET /api/verse/audit)\n// ---------------------------------------------------------------------------\n\nexport type VerseAuditResult = AuditEntry['result'];\n\n/** GET /api/verse/audit?limit=&action=&result= */\nexport interface VerseAuditResponse {\n /** Newest first, already filtered, at most `limit` entries. */\n entries: AuditEntry[];\n /** The effective cap applied to `entries` (never above 500). */\n limit: number;\n /** Echo of the applied filter so the UI cannot drift from what it shows. */\n filter: { action: string | null; result: VerseAuditResult | null };\n /** How many raw entries were scanned before filtering. */\n scanned: number;\n /**\n * True when the scan filled its own ceiling, so older entries MAY exist\n * beyond what was read. Conservative by design: it never claims the reader\n * reached the end of history when it cannot prove that.\n */\n truncated: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Kill switch\n// ---------------------------------------------------------------------------\n\n/**\n * The GLOBAL kill switch (`~/.ashlr/KILL`). `state: 'unknown'` is a real,\n * distinct outcome — the sentinel was uninspectable — and must never be\n * rendered as \"off\".\n */\nexport interface VerseKillSwitch {\n state: 'active' | 'inactive' | 'unknown';\n sourceState: 'healthy' | 'degraded';\n reason: string;\n /**\n * Plain-language statement of blast radius, shipped with the state so no\n * surface can show the switch without the warning.\n */\n note: string;\n}\n\n// ---------------------------------------------------------------------------\n// Daemon pause — the NARROW stop (POST /api/verse/daemon {action:'pause'})\n// ---------------------------------------------------------------------------\n\n/**\n * The DAEMON-SCOPED pause sentinel (`~/.ashlr/daemon.paused`), projected for\n * transport. Shares `VerseKillSwitch`'s shape on purpose — both are sentinels\n * read the same way, and both keep `'unknown'` as a real third state that must\n * never render as \"off\".\n *\n * `state: 'unknown'` is treated by the daemon as PAUSED (fail safe), so the UI\n * must say \"paused — the sentinel could not be read\", not \"running\".\n *\n * The sentinel PATH is deliberately absent: it is machine-local detail the\n * cockpit has no use for, the same omission `VerseKillSwitch` makes.\n */\nexport interface VerseDaemonPause {\n /** 'paused' = dispatch halted. 'running' = proven not paused. */\n state: 'paused' | 'running' | 'unknown';\n sourceState: 'healthy' | 'degraded';\n reason: string;\n /** ISO time the pause was requested; null when not paused or unknown. */\n pausedAt: string | null;\n /** Which surface paused it ('cli' | 'verse-control-plane' | 'unknown'). */\n by: string | null;\n /** Plain-language statement of the NARROW blast radius, shipped with the state. */\n note: string;\n}\n\n// ---------------------------------------------------------------------------\n// Daemon lifecycle (POST /api/verse/daemon)\n// ---------------------------------------------------------------------------\n\n/**\n * 'start' launches the autonomous loop detached (exactly `ashlr daemon start`).\n * 'once' runs a single tick the same way.\n *\n * Three stops, three honestly different scopes:\n * - 'pause' — halts autonomous DISPATCH only. Reversible with 'resume'.\n * Leaves the agent's own write tools alone. The default choice.\n * - 'stop' — the ordinary stop, which today engages the GLOBAL kill switch\n * (`stopDaemon()` is `setKill(true)`), so it is wider than a\n * pause and the result's `note` says so.\n * - emergency stop — not on this route at all (`POST /api/fleet/pause`).\n */\nexport type VerseDaemonAction = 'start' | 'stop' | 'once' | 'pause' | 'resume';\n\n/** Non-secret projection of `~/.ashlr/daemon.json`. */\nexport interface VerseDaemonStateProjection {\n running: boolean;\n pid: number | null;\n startedAt: string | null;\n lastTickAt: string | null;\n todayDate: string | null;\n todaySpentUsd: number;\n itemsProcessed: number;\n}\n\n/**\n * POST /api/verse/daemon result. `pid` is the only thing that ever escapes the\n * spawn — the argv, the env, and the resolved launcher path never do.\n */\nexport interface VerseDaemonActionResult {\n ok: boolean;\n action: VerseDaemonAction;\n /** True when a detached child was launched by this request. */\n spawned: boolean;\n /** The detached child's pid for 'start'/'once'; null otherwise. */\n pid: number | null;\n state: VerseDaemonStateProjection;\n killSwitch: VerseKillSwitch;\n /** The daemon-scoped pause AFTER this action. Never folded into killSwitch. */\n pause: VerseDaemonPause;\n /** One line of plain language about what just happened, for the UI to echo. */\n note: string;\n}\n\n// ---------------------------------------------------------------------------\n// Fleet essentials + control aggregate (GET /api/verse/control)\n// ---------------------------------------------------------------------------\n\n/**\n * The small honest slice of FleetStatus/ControlSnapshot the cockpit needs.\n * Deliberately excludes service file paths and error-log paths: the cockpit\n * does not need them, and keeping them out keeps this payload trivially\n * provable as free of machine-local command detail.\n */\nexport interface VerseFleetEssentials {\n /** Mode the autonomy control loop last directed, when known. */\n directionMode: string | null;\n directionAt: string | null;\n directionReason: string | null;\n autonomyControlLoop: boolean;\n autonomyControlMode: string;\n service: {\n registrationState: 'present' | 'absent' | 'unknown';\n installed: boolean;\n running: boolean;\n runtimeState: string | null;\n };\n /** Freshness of the shared fleet-status cache backing these values. */\n freshness: { stale: boolean; ageMs: number };\n}\n\n/** Today's spend against the configured ceiling. */\nexport interface VerseSpend {\n /** null when the daemon ledger could not be read (NOT zero). */\n todayUsd: number | null;\n /** Calendar day the counter applies to; null before the first tick. */\n todayDate: string | null;\n dailyBudgetUsd: number;\n}\n\n/**\n * GET /api/verse/control — the ONE aggregate the Autonomy view reads.\n * Every field is a projection of an existing snapshot; nothing is recomputed.\n */\nexport interface VerseControlSnapshot {\n generatedAt: string;\n daemon: PublicDaemonObservation;\n fleet: VerseFleetEssentials;\n caps: VerseCaps;\n scope: VerseScope;\n killSwitch: VerseKillSwitch;\n /**\n * The DAEMON-SCOPED pause, as its own field. A cockpit that folded this into\n * `killSwitch` would be back to one control with two names; keeping them\n * separate is what lets the Autonomy view render \"paused\" and \"kill switch\n * engaged\" as the different situations they are.\n */\n pause: VerseDaemonPause;\n /** Pending inbox proposals awaiting a human decision. */\n pendingApprovals: number;\n spend: VerseSpend;\n /** Per-engine quota usage against the configured foundry limits. */\n quota: FrontierEngineUsage[];\n /** False when this server was started without --allow-dispatch: all POSTs 404. */\n dispatchEnabled: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Safety (GET /api/verse/safety)\n// ---------------------------------------------------------------------------\n\n/** GET /api/verse/safety — the `ashlr verify-safety --json` report, unmodified. */\nexport type VerseSafetyReport = SafetyReport;\n\n// ---------------------------------------------------------------------------\n// Bounds (single source of truth — the API validator and the UI share these)\n// ---------------------------------------------------------------------------\n\nexport const VERSE_CAPS_BOUNDS = {\n dailyBudgetUsd: { min: 0, max: 1_000 },\n perTickItems: { min: 1, max: 50 },\n parallel: { min: 1, max: 16 },\n intervalMs: { min: 30_000, max: 86_400_000 },\n maxConcurrent: { min: 1, max: 32 },\n /**\n * DELIBERATE DEVIATION from VERSE-CONTRACT-V2's \"concurrency 0-32 each\".\n *\n * The daemon cannot honour a zero tier. `resolveCfg` (daemon/loop.ts) only\n * adopts a tier when it is `> 0`, and `TieredPool`'s constructor floors\n * every cap at `Math.max(1, …)` on top of that — so a stored 0 came back as\n * the built-in 2/6/8 while the cockpit displayed 0. Teaching the pool to\n * accept 0 is not a fix either: `tieredBounded` would then never start a\n * task on that tier and never resolve, i.e. a hung tick.\n *\n * A floor of 1 is therefore the only value that is true in both places. To\n * stop dispatch entirely, the honest lever is `dailyBudgetUsd: 0`, which the\n * daemon now really does obey.\n */\n concurrency: { min: 1, max: 32 },\n subscriptionMaxPercent: { min: 1, max: 100 },\n foundryLimitMax: { min: 0, max: 1_000_000 },\n} as const;\n\n/** Hard ceiling on GET /api/verse/audit `limit`. */\nexport const VERSE_AUDIT_MAX_LIMIT = 500;\n/** Default `limit` when the query omits one. */\nexport const VERSE_AUDIT_DEFAULT_LIMIT = 100;\n/**\n * Hard ceiling on how many raw audit entries a single request will read before\n * filtering. Bounds the work a filtered query can ask of the disk.\n */\nexport const VERSE_AUDIT_MAX_SCAN = 5_000;\n\n/** The kill switch's blast-radius warning — one string, used everywhere. */\nexport const VERSE_KILL_SWITCH_NOTE =\n 'Emergency stop: the global kill switch also refuses the agent\\'s own write tools, not just the daemon. Use the daemon pause action for an ordinary, reversible halt.';\n\n/**\n * The pause's blast-radius statement — the counterpart to\n * VERSE_KILL_SWITCH_NOTE, shipped with every pause projection so no surface\n * can show the state without the scope. Says what it does NOT do, because\n * that is the entire difference from the control next to it.\n */\nexport const VERSE_DAEMON_PAUSE_NOTE =\n 'Pause: halts autonomous dispatch only. Your own write tools keep working, nothing in flight is rolled back, and Resume restores the loop without a restart.';\n","/**\n * routes/verse/autonomy/control-queries.ts — every `/api/verse/{control,caps,\n * scope,audit,daemon,safety}` call the Autonomy cockpit makes, plus the two\n * existing read-only feeds it borrows (`/api/goals`, `/api/backlog`).\n *\n * Same contract as routes/verse/verse-queries.ts: reads are QueryDefs consumed\n * through useQuery (cache-backed, so a background refresh never blanks a\n * populated panel); writes pull the held mutation token from auth-store, touch\n * the hold on success, and invalidate exactly the keys they affect.\n *\n * Two deliberate choices worth knowing before editing:\n *\n * 1. **The envelopes are now fixed, so nothing is normalized.**\n * `/api/verse/scope` and `/api/verse/audit` are declared in\n * `src/core/verse/control-types.ts` (`VerseScope`, `VerseAuditResponse`)\n * and the handlers serialize exactly those, so these fetchers are typed\n * straight through. The speculative bare-array/wrapper normalization that\n * let this surface ship before the routes existed has been deleted.\n * `/api/backlog` keeps its normalizer — that route really does answer\n * `loadBacklog() ?? null` and is not part of the V2 contract.\n * 2. **Emergency stop is not a route of its own.** The global kill switch is\n * `POST /api/fleet/pause` (and `/resume` to clear), already wrapped in\n * data/mutations.ts. It is re-exported here under honest names so no call\n * site in this folder can accidentally call it \"pause\".\n */\nimport { VERSE_AUDIT_MAX_LIMIT } from './control-types.js';\nimport type { GoalSummary, QueryDef } from '../../../data/queries.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { apiGet, apiPost } from '../../../data/client.js';\nimport { invalidate } from '../../../data/cache.js';\nimport { pauseFleet, resumeFleet } from '../../../data/mutations.js';\nimport type {\n VerseAuditFilters,\n VerseAuditPage,\n VerseCaps,\n VerseCapsApplyResult,\n VerseCapsPatch,\n VerseControlSnapshot,\n VerseDaemonAction,\n VerseDaemonActionResult,\n VerseSafetyReport,\n VerseScope,\n VerseScopePatch,\n} from './control-types.js';\n\nexport const VERSE_CONTROL_KEY = 'verse-control';\nexport const VERSE_CAPS_KEY = 'verse-caps';\nexport const VERSE_SCOPE_KEY = 'verse-scope';\nexport const VERSE_SAFETY_KEY = 'verse-safety';\nexport const VERSE_AUDIT_PREFIX = 'verse-audit:';\n\n/**\n * Server-side cap on `/api/verse/audit`, re-exported from the backend\n * contract module so the client cannot drift from the value the route\n * actually clamps to.\n */\nexport const VERSE_AUDIT_MAX = VERSE_AUDIT_MAX_LIMIT;\n/** Enough rows that the table is the real \"while I was asleep\" view. */\nexport const VERSE_AUDIT_DEFAULT_LIMIT = 200;\n\nexport const verseControlQuery: QueryDef<VerseControlSnapshot> = {\n key: VERSE_CONTROL_KEY,\n fetch: (signal) => apiGet<VerseControlSnapshot>('/api/verse/control', signal),\n};\n\nexport const verseCapsQuery: QueryDef<VerseCaps> = {\n key: VERSE_CAPS_KEY,\n fetch: (signal) => apiGet<VerseCaps>('/api/verse/caps', signal),\n};\n\nexport const verseSafetyQuery: QueryDef<VerseSafetyReport> = {\n key: VERSE_SAFETY_KEY,\n fetch: (signal) => apiGet<VerseSafetyReport>('/api/verse/safety', signal),\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport const verseScopeQuery: QueryDef<VerseScope> = {\n key: VERSE_SCOPE_KEY,\n fetch: (signal) => apiGet<VerseScope>('/api/verse/scope', signal),\n};\n\nexport function verseAuditQuery(filters: VerseAuditFilters = {}): QueryDef<VerseAuditPage> {\n const limit = Math.min(filters.limit ?? VERSE_AUDIT_DEFAULT_LIMIT, VERSE_AUDIT_MAX);\n const params = new URLSearchParams();\n params.set('limit', String(limit));\n if (filters.action) params.set('action', filters.action);\n if (filters.result) params.set('result', filters.result);\n return {\n key: `${VERSE_AUDIT_PREFIX}${limit}:${filters.action ?? ''}:${filters.result ?? ''}`,\n fetch: (signal) => apiGet<VerseAuditPage>(`/api/verse/audit?${params.toString()}`, signal),\n };\n}\n\n/**\n * Read-only in V2 — the contract is explicit that no goal-mutation routes get\n * built here. `/api/goals` returns a bare array; `/api/backlog` returns\n * `loadBacklog() ?? null`, i.e. `null` is \"no backlog on disk\", not an error.\n */\nexport const verseGoalsQuery: QueryDef<GoalSummary[]> = {\n key: 'goals',\n fetch: (signal) => apiGet<GoalSummary[]>('/api/goals', signal),\n};\n\n/** One backlog row, narrowed to what the read-only summary renders. */\nexport interface VerseBacklogItem {\n id?: string;\n title?: string;\n repo?: string;\n score?: number;\n source?: string;\n}\n\nexport interface VerseBacklogSummary {\n items: VerseBacklogItem[];\n /** True when the server answered `null` — no backlog has been built yet. */\n absent: boolean;\n}\n\nexport function normalizeBacklog(raw: unknown): VerseBacklogSummary {\n if (raw === null || raw === undefined) return { items: [], absent: true };\n if (Array.isArray(raw)) return { items: raw as VerseBacklogItem[], absent: false };\n if (isRecord(raw) && Array.isArray(raw['items'])) {\n return { items: raw['items'] as VerseBacklogItem[], absent: false };\n }\n return { items: [], absent: true };\n}\n\nexport const verseBacklogQuery: QueryDef<VerseBacklogSummary> = {\n key: 'backlog',\n fetch: (signal) => apiGet<unknown>('/api/backlog', signal).then(normalizeBacklog),\n};\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\n/** Thrown before any network call when no mutation token is held. */\nexport class VerseControlLockedError extends Error {\n constructor() {\n super('Unlock actions with the mutation token before changing the loop.');\n this.name = 'VerseControlLockedError';\n }\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/** Every panel in the cockpit reads through one of these three. */\nexport function invalidateControl(): void {\n invalidate(VERSE_CONTROL_KEY);\n}\n\nexport async function updateVerseCaps(patch: VerseCapsPatch): Promise<VerseCapsApplyResult> {\n const result = await post<VerseCapsApplyResult>('/api/verse/caps', patch);\n invalidate(VERSE_CAPS_KEY);\n invalidateControl();\n return result;\n}\n\nexport async function updateVerseScope(patch: VerseScopePatch): Promise<void> {\n await post<unknown>('/api/verse/scope', patch);\n invalidate(VERSE_SCOPE_KEY);\n invalidateControl();\n}\n\nexport async function runDaemonAction(action: VerseDaemonAction): Promise<VerseDaemonActionResult> {\n const result = await post<VerseDaemonActionResult>('/api/verse/daemon', { action });\n invalidateControl();\n invalidate('daemon');\n return result;\n}\n\n/**\n * ENGAGE the global kill switch (`~/.ashlr/KILL`). This is `POST\n * /api/fleet/pause` under its honest name: it stops the daemon AND refuses\n * the agent's own mcp-native write tools. Never surface it as \"pause\".\n */\nexport async function engageEmergencyStop(): Promise<void> {\n await pauseFleet();\n invalidateControl();\n}\n\n/** Clear the kill switch — writes become possible again fleet-wide. */\nexport async function releaseEmergencyStop(): Promise<void> {\n await resumeFleet();\n invalidateControl();\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"control-queries-B9K-wmcB.js","names":[],"sources":["../../../../../../src/core/verse/control-types.ts","../../../../../../src/web-ui/routes/verse/autonomy/control-queries.ts"],"sourcesContent":["/**\n * Ashlr Verse — autonomy control-plane contract (V2).\n *\n * V1 (`./types.ts`) is frozen: it describes interactive chat sessions. This\n * module adds the shapes the Autonomy cockpit needs to run the hub's existing\n * autonomous fleet without a terminal — the CONFIGURED caps, the enrollment\n * scope, the audit trail, the kill switch, and the daemon lifecycle.\n *\n * Two hard rules are encoded here rather than left to the UI:\n *\n * 1. The global kill switch (`~/.ashlr/KILL`) is an EMERGENCY STOP, not a\n * pause. It also refuses the agent's own `mcp-native` write tools. Every\n * shape that carries it is named `killSwitch`, and the action that engages\n * it is named `emergencyStop`. It is never called \"pause\".\n *\n * V2.1 adds the control that name was being withheld from: the\n * DAEMON-SCOPED pause (`~/.ashlr/daemon.paused`, see core/daemon/pause.ts).\n * It halts autonomous dispatch and NOTHING else — `assertMayMutate`,\n * `mcp-native`, and `mcp-native-engineer` do not read it. It travels as\n * `pause: VerseDaemonPause`, always a FIELD OF ITS OWN, never merged into\n * `killSwitch`, because the whole point is that the two have different\n * blast radii and the operator must be able to see which one is on.\n * 2. Nothing in this module is a secret. Launcher commands, tokens, and env\n * values never appear in any of these shapes — the daemon lifecycle result\n * carries a pid, never an argv.\n *\n * Everything is a projection of state the hub already computes; nothing here\n * introduces a new source of truth.\n */\n\nimport type { AuditEntry } from '../types.js';\nimport type { PublicDaemonObservation } from '../daemon/public-observation.js';\nimport type { FrontierEngineUsage } from '../usage/frontier-usage.js';\nimport type { SafetyReport } from '../../cli/verify-safety.js';\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\n/**\n * Error codes for `/api/verse/{control,caps,scope,audit,daemon,safety}`.\n * `VERSE_INVALID` / `VERSE_TOO_LARGE` are deliberately the SAME codes V1 uses,\n * so one client error mapper covers both halves of the Verse API.\n */\nexport type VerseControlErrorCode =\n | 'VERSE_INVALID'\n | 'VERSE_REFUSED'\n | 'VERSE_TOO_LARGE'\n | 'VERSE_UNAVAILABLE';\n\n/** Every error body on these routes. */\nexport interface VerseControlError {\n error: string;\n code: VerseControlErrorCode;\n}\n\n// ---------------------------------------------------------------------------\n// Caps — the CONFIGURED limits (GET/POST /api/verse/caps)\n// ---------------------------------------------------------------------------\n\n/** One `cfg.foundry.limits[engine]` entry, flattened for transport. */\nexport interface VerseFoundryLimit {\n /** EngineId key, e.g. 'claude' | 'codex'. */\n engine: string;\n /** Rolling window label, e.g. '1m' | '5m' | '1h' | '1d'. */\n window: string;\n /** Max dispatches per window. 0 means \"no dispatches allowed\". */\n max: number;\n}\n\n/** `cfg.daemon.concurrency` — null per tier means \"not configured, using the default\". */\nexport interface VerseCapsConcurrency {\n local: number | null;\n cloud: number | null;\n total: number | null;\n}\n\n/**\n * The configured autonomy limits. These are the values the daemon actually\n * reads — no route exposed them before V2, which is why the cockpit could not\n * show a cap next to the usage burning against it.\n */\nexport interface VerseCaps {\n /** HARD daily spend ceiling (USD). 0 means the daemon is stopped by budget. */\n dailyBudgetUsd: number;\n /** Backlog items processed per tick. */\n perTickItems: number;\n /** Concurrent sandboxed swarms per tick (batch mode). */\n parallel: number;\n /** Tick interval in loop mode (ms). */\n intervalMs: number;\n /** Daemon execution mode. */\n mode: 'batch' | 'continuous';\n /** Ceiling on in-flight dispatches in continuous mode; null when unset. */\n maxConcurrent: number | null;\n /** Per-tier concurrency budgets; null per tier when unset. */\n concurrency: VerseCapsConcurrency;\n /** Subscription-window throttle percentage (1–100). */\n subscriptionMaxPercent: number;\n /** Per-engine dispatch limits, sorted by engine id. */\n foundryLimits: VerseFoundryLimit[];\n /**\n * HONEST STATE: the cap keys whose value is a built-in default rather than\n * something configured on disk. The UI renders these as \"default\", never as\n * a deliberate choice the operator made. Sorted, stable.\n */\n defaulted: VerseCapKey[];\n}\n\n/** The scalar cap keys a client may update. `foundryLimits` is handled separately. */\nexport type VerseCapKey =\n | 'dailyBudgetUsd'\n | 'perTickItems'\n | 'parallel'\n | 'intervalMs'\n | 'mode'\n | 'maxConcurrent'\n | 'concurrency'\n | 'subscriptionMaxPercent'\n | 'foundryLimits';\n\n/** POST /api/verse/caps — a partial update. Unknown keys are rejected. */\nexport interface VerseCapsUpdate {\n dailyBudgetUsd?: number;\n perTickItems?: number;\n parallel?: number;\n intervalMs?: number;\n mode?: 'batch' | 'continuous';\n maxConcurrent?: number;\n concurrency?: { local?: number; cloud?: number; total?: number };\n subscriptionMaxPercent?: number;\n /** Replaces the named engines' limits; engines not listed are left alone. */\n foundryLimits?: VerseFoundryLimit[];\n}\n\n/**\n * POST /api/verse/caps result. `live: true` is not decoration — the daemon\n * re-reads config at the top of every tick, so a saved cap binds on the next\n * tick without a restart.\n */\nexport interface VerseCapsUpdateResult {\n ok: true;\n /** The cap keys this request actually changed, in request order. */\n applied: VerseCapKey[];\n live: true;\n /** The full caps AFTER the write, re-read from disk. */\n caps: VerseCaps;\n}\n\n// ---------------------------------------------------------------------------\n// Scope — the enrollment registry (GET/POST /api/verse/scope)\n// ---------------------------------------------------------------------------\n\nexport interface VerseScopeRepo {\n path: string;\n name: string;\n /** False when the registry still lists a directory that is gone. */\n exists: boolean;\n}\n\n/**\n * GET /api/verse/scope. An EMPTY `repos` with no `degradedReason` is the\n * valid default state and means the daemon will do nothing at all — the UI\n * must say that plainly rather than rendering an innocuous empty list.\n */\nexport interface VerseScope {\n repos: VerseScopeRepo[];\n /** Present only when enrollment authority could not be read at all. */\n degradedReason?: string;\n}\n\nexport type VerseScopeAction = 'enroll' | 'unenroll';\n\n/** POST /api/verse/scope body. */\nexport interface VerseScopeRequest {\n action: VerseScopeAction;\n path: string;\n}\n\nexport interface VerseScopeResult {\n ok: boolean;\n action: VerseScopeAction;\n /** The canonical (realpath'd) registry path this acted on. */\n path: string;\n /** False when the registry already had the requested state (idempotent). */\n changed: boolean;\n /** Policy reason string, e.g. 'enrolled' | 'already-unenrolled'. */\n reason: string;\n /** The scope AFTER the mutation. */\n scope: VerseScope;\n}\n\n// ---------------------------------------------------------------------------\n// Audit (GET /api/verse/audit)\n// ---------------------------------------------------------------------------\n\nexport type VerseAuditResult = AuditEntry['result'];\n\n/** GET /api/verse/audit?limit=&action=&result= */\nexport interface VerseAuditResponse {\n /** Newest first, already filtered, at most `limit` entries. */\n entries: AuditEntry[];\n /** The effective cap applied to `entries` (never above 500). */\n limit: number;\n /** Echo of the applied filter so the UI cannot drift from what it shows. */\n filter: { action: string | null; result: VerseAuditResult | null };\n /** How many raw entries were scanned before filtering. */\n scanned: number;\n /**\n * True when the scan filled its own ceiling, so older entries MAY exist\n * beyond what was read. Conservative by design: it never claims the reader\n * reached the end of history when it cannot prove that.\n */\n truncated: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Kill switch\n// ---------------------------------------------------------------------------\n\n/**\n * The GLOBAL kill switch (`~/.ashlr/KILL`). `state: 'unknown'` is a real,\n * distinct outcome — the sentinel was uninspectable — and must never be\n * rendered as \"off\".\n */\nexport interface VerseKillSwitch {\n state: 'active' | 'inactive' | 'unknown';\n sourceState: 'healthy' | 'degraded';\n reason: string;\n /**\n * Plain-language statement of blast radius, shipped with the state so no\n * surface can show the switch without the warning.\n */\n note: string;\n}\n\n// ---------------------------------------------------------------------------\n// Daemon pause — the NARROW stop (POST /api/verse/daemon {action:'pause'})\n// ---------------------------------------------------------------------------\n\n/**\n * The DAEMON-SCOPED pause sentinel (`~/.ashlr/daemon.paused`), projected for\n * transport. Shares `VerseKillSwitch`'s shape on purpose — both are sentinels\n * read the same way, and both keep `'unknown'` as a real third state that must\n * never render as \"off\".\n *\n * `state: 'unknown'` is treated by the daemon as PAUSED (fail safe), so the UI\n * must say \"paused — the sentinel could not be read\", not \"running\".\n *\n * The sentinel PATH is deliberately absent: it is machine-local detail the\n * cockpit has no use for, the same omission `VerseKillSwitch` makes.\n */\nexport interface VerseDaemonPause {\n /** 'paused' = dispatch halted. 'running' = proven not paused. */\n state: 'paused' | 'running' | 'unknown';\n sourceState: 'healthy' | 'degraded';\n reason: string;\n /** ISO time the pause was requested; null when not paused or unknown. */\n pausedAt: string | null;\n /** Which surface paused it ('cli' | 'verse-control-plane' | 'unknown'). */\n by: string | null;\n /** Plain-language statement of the NARROW blast radius, shipped with the state. */\n note: string;\n}\n\n// ---------------------------------------------------------------------------\n// Daemon lifecycle (POST /api/verse/daemon)\n// ---------------------------------------------------------------------------\n\n/**\n * 'start' launches the autonomous loop detached (exactly `ashlr daemon start`).\n * 'once' runs a single tick the same way.\n *\n * Three stops, three honestly different scopes:\n * - 'pause' — halts autonomous DISPATCH only. Reversible with 'resume'.\n * Leaves the agent's own write tools alone. The default choice.\n * - 'stop' — the ordinary stop, which today engages the GLOBAL kill switch\n * (`stopDaemon()` is `setKill(true)`), so it is wider than a\n * pause and the result's `note` says so.\n * - emergency stop — not on this route at all (`POST /api/fleet/pause`).\n */\nexport type VerseDaemonAction = 'start' | 'stop' | 'once' | 'pause' | 'resume';\n\n/** Non-secret projection of `~/.ashlr/daemon.json`. */\nexport interface VerseDaemonStateProjection {\n running: boolean;\n pid: number | null;\n startedAt: string | null;\n lastTickAt: string | null;\n todayDate: string | null;\n todaySpentUsd: number;\n itemsProcessed: number;\n}\n\n/**\n * POST /api/verse/daemon result. `pid` is the only thing that ever escapes the\n * spawn — the argv, the env, and the resolved launcher path never do.\n */\nexport interface VerseDaemonActionResult {\n ok: boolean;\n action: VerseDaemonAction;\n /** True when a detached child was launched by this request. */\n spawned: boolean;\n /** The detached child's pid for 'start'/'once'; null otherwise. */\n pid: number | null;\n state: VerseDaemonStateProjection;\n killSwitch: VerseKillSwitch;\n /** The daemon-scoped pause AFTER this action. Never folded into killSwitch. */\n pause: VerseDaemonPause;\n /** One line of plain language about what just happened, for the UI to echo. */\n note: string;\n}\n\n// ---------------------------------------------------------------------------\n// Fleet essentials + control aggregate (GET /api/verse/control)\n// ---------------------------------------------------------------------------\n\n/**\n * The small honest slice of FleetStatus/ControlSnapshot the cockpit needs.\n * Deliberately excludes service file paths and error-log paths: the cockpit\n * does not need them, and keeping them out keeps this payload trivially\n * provable as free of machine-local command detail.\n */\nexport interface VerseFleetEssentials {\n /** Mode the autonomy control loop last directed, when known. */\n directionMode: string | null;\n directionAt: string | null;\n directionReason: string | null;\n autonomyControlLoop: boolean;\n autonomyControlMode: string;\n service: {\n registrationState: 'present' | 'absent' | 'unknown';\n installed: boolean;\n running: boolean;\n runtimeState: string | null;\n };\n /** Freshness of the shared fleet-status cache backing these values. */\n freshness: { stale: boolean; ageMs: number };\n}\n\n/** Today's spend against the configured ceiling. */\nexport interface VerseSpend {\n /** null when the daemon ledger could not be read (NOT zero). */\n todayUsd: number | null;\n /** Calendar day the counter applies to; null before the first tick. */\n todayDate: string | null;\n dailyBudgetUsd: number;\n}\n\n/**\n * GET /api/verse/control — the ONE aggregate the Autonomy view reads.\n * Every field is a projection of an existing snapshot; nothing is recomputed.\n */\nexport interface VerseControlSnapshot {\n generatedAt: string;\n daemon: PublicDaemonObservation;\n fleet: VerseFleetEssentials;\n caps: VerseCaps;\n scope: VerseScope;\n killSwitch: VerseKillSwitch;\n /**\n * The DAEMON-SCOPED pause, as its own field. A cockpit that folded this into\n * `killSwitch` would be back to one control with two names; keeping them\n * separate is what lets the Autonomy view render \"paused\" and \"kill switch\n * engaged\" as the different situations they are.\n */\n pause: VerseDaemonPause;\n /** Pending inbox proposals awaiting a human decision. */\n pendingApprovals: number;\n spend: VerseSpend;\n /** Per-engine quota usage against the configured foundry limits. */\n quota: FrontierEngineUsage[];\n /** False when this server was started without --allow-dispatch: all POSTs 404. */\n dispatchEnabled: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Safety (GET /api/verse/safety)\n// ---------------------------------------------------------------------------\n\n/** GET /api/verse/safety — the `ashlr verify-safety --json` report, unmodified. */\nexport type VerseSafetyReport = SafetyReport;\n\n// ---------------------------------------------------------------------------\n// Bounds (single source of truth — the API validator and the UI share these)\n// ---------------------------------------------------------------------------\n\nexport const VERSE_CAPS_BOUNDS = {\n dailyBudgetUsd: { min: 0, max: 1_000 },\n perTickItems: { min: 1, max: 50 },\n parallel: { min: 1, max: 16 },\n intervalMs: { min: 30_000, max: 86_400_000 },\n maxConcurrent: { min: 1, max: 32 },\n /**\n * DELIBERATE DEVIATION from VERSE-CONTRACT-V2's \"concurrency 0-32 each\".\n *\n * The daemon cannot honour a zero tier. `resolveCfg` (daemon/loop.ts) only\n * adopts a tier when it is `> 0`, and `TieredPool`'s constructor floors\n * every cap at `Math.max(1, …)` on top of that — so a stored 0 came back as\n * the built-in 2/6/8 while the cockpit displayed 0. Teaching the pool to\n * accept 0 is not a fix either: `tieredBounded` would then never start a\n * task on that tier and never resolve, i.e. a hung tick.\n *\n * A floor of 1 is therefore the only value that is true in both places. To\n * stop dispatch entirely, the honest lever is `dailyBudgetUsd: 0`, which the\n * daemon now really does obey.\n */\n concurrency: { min: 1, max: 32 },\n subscriptionMaxPercent: { min: 1, max: 100 },\n foundryLimitMax: { min: 0, max: 1_000_000 },\n} as const;\n\n/** Hard ceiling on GET /api/verse/audit `limit`. */\nexport const VERSE_AUDIT_MAX_LIMIT = 500;\n/** Default `limit` when the query omits one. */\nexport const VERSE_AUDIT_DEFAULT_LIMIT = 100;\n/**\n * Hard ceiling on how many raw audit entries a single request will read before\n * filtering. Bounds the work a filtered query can ask of the disk.\n */\nexport const VERSE_AUDIT_MAX_SCAN = 5_000;\n\n/** The kill switch's blast-radius warning — one string, used everywhere. */\nexport const VERSE_KILL_SWITCH_NOTE =\n 'Emergency stop: the global kill switch also refuses the agent\\'s own write tools, not just the daemon. Use the daemon pause action for an ordinary, reversible halt.';\n\n/**\n * The pause's blast-radius statement — the counterpart to\n * VERSE_KILL_SWITCH_NOTE, shipped with every pause projection so no surface\n * can show the state without the scope. Says what it does NOT do, because\n * that is the entire difference from the control next to it.\n */\nexport const VERSE_DAEMON_PAUSE_NOTE =\n 'Pause: halts autonomous dispatch only. Your own write tools keep working, nothing in flight is rolled back, and Resume restores the loop without a restart.';\n","/**\n * routes/verse/autonomy/control-queries.ts — every `/api/verse/{control,caps,\n * scope,audit,daemon,safety}` call the Autonomy cockpit makes, plus the two\n * existing read-only feeds it borrows (`/api/goals`, `/api/backlog`).\n *\n * Same contract as routes/verse/verse-queries.ts: reads are QueryDefs consumed\n * through useQuery (cache-backed, so a background refresh never blanks a\n * populated panel); writes pull the held mutation token from auth-store, touch\n * the hold on success, and invalidate exactly the keys they affect.\n *\n * Two deliberate choices worth knowing before editing:\n *\n * 1. **The envelopes are now fixed, so nothing is normalized.**\n * `/api/verse/scope` and `/api/verse/audit` are declared in\n * `src/core/verse/control-types.ts` (`VerseScope`, `VerseAuditResponse`)\n * and the handlers serialize exactly those, so these fetchers are typed\n * straight through. The speculative bare-array/wrapper normalization that\n * let this surface ship before the routes existed has been deleted.\n * `/api/backlog` keeps its normalizer — that route really does answer\n * `loadBacklog() ?? null` and is not part of the V2 contract.\n * 2. **Emergency stop is not a route of its own.** The global kill switch is\n * `POST /api/fleet/pause` (and `/resume` to clear), already wrapped in\n * data/mutations.ts. It is re-exported here under honest names so no call\n * site in this folder can accidentally call it \"pause\".\n */\nimport { VERSE_AUDIT_MAX_LIMIT } from './control-types.js';\nimport type { GoalSummary, QueryDef } from '../../../data/queries.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { apiGet, apiPost } from '../../../data/client.js';\nimport { invalidate } from '../../../data/cache.js';\nimport { pauseFleet, resumeFleet } from '../../../data/mutations.js';\nimport type {\n VerseAuditFilters,\n VerseAuditPage,\n VerseCaps,\n VerseCapsApplyResult,\n VerseCapsPatch,\n VerseControlSnapshot,\n VerseDaemonAction,\n VerseDaemonActionResult,\n VerseSafetyReport,\n VerseScope,\n VerseScopePatch,\n} from './control-types.js';\n\nexport const VERSE_CONTROL_KEY = 'verse-control';\nexport const VERSE_CAPS_KEY = 'verse-caps';\nexport const VERSE_SCOPE_KEY = 'verse-scope';\nexport const VERSE_SAFETY_KEY = 'verse-safety';\nexport const VERSE_AUDIT_PREFIX = 'verse-audit:';\n\n/**\n * Server-side cap on `/api/verse/audit`, re-exported from the backend\n * contract module so the client cannot drift from the value the route\n * actually clamps to.\n */\nexport const VERSE_AUDIT_MAX = VERSE_AUDIT_MAX_LIMIT;\n/** Enough rows that the table is the real \"while I was asleep\" view. */\nexport const VERSE_AUDIT_DEFAULT_LIMIT = 200;\n\nexport const verseControlQuery: QueryDef<VerseControlSnapshot> = {\n key: VERSE_CONTROL_KEY,\n fetch: (signal) => apiGet<VerseControlSnapshot>('/api/verse/control', signal),\n};\n\nexport const verseCapsQuery: QueryDef<VerseCaps> = {\n key: VERSE_CAPS_KEY,\n fetch: (signal) => apiGet<VerseCaps>('/api/verse/caps', signal),\n};\n\nexport const verseSafetyQuery: QueryDef<VerseSafetyReport> = {\n key: VERSE_SAFETY_KEY,\n fetch: (signal) => apiGet<VerseSafetyReport>('/api/verse/safety', signal),\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport const verseScopeQuery: QueryDef<VerseScope> = {\n key: VERSE_SCOPE_KEY,\n fetch: (signal) => apiGet<VerseScope>('/api/verse/scope', signal),\n};\n\nexport function verseAuditQuery(filters: VerseAuditFilters = {}): QueryDef<VerseAuditPage> {\n const limit = Math.min(filters.limit ?? VERSE_AUDIT_DEFAULT_LIMIT, VERSE_AUDIT_MAX);\n const params = new URLSearchParams();\n params.set('limit', String(limit));\n if (filters.action) params.set('action', filters.action);\n if (filters.result) params.set('result', filters.result);\n return {\n key: `${VERSE_AUDIT_PREFIX}${limit}:${filters.action ?? ''}:${filters.result ?? ''}`,\n fetch: (signal) => apiGet<VerseAuditPage>(`/api/verse/audit?${params.toString()}`, signal),\n };\n}\n\n/**\n * Read-only in V2 — the contract is explicit that no goal-mutation routes get\n * built here. `/api/goals` returns a bare array; `/api/backlog` returns\n * `loadBacklog() ?? null`, i.e. `null` is \"no backlog on disk\", not an error.\n */\nexport const verseGoalsQuery: QueryDef<GoalSummary[]> = {\n key: 'goals',\n fetch: (signal) => apiGet<GoalSummary[]>('/api/goals', signal),\n};\n\n/** One backlog row, narrowed to what the read-only summary renders. */\nexport interface VerseBacklogItem {\n id?: string;\n title?: string;\n repo?: string;\n score?: number;\n source?: string;\n}\n\nexport interface VerseBacklogSummary {\n items: VerseBacklogItem[];\n /** True when the server answered `null` — no backlog has been built yet. */\n absent: boolean;\n}\n\nexport function normalizeBacklog(raw: unknown): VerseBacklogSummary {\n if (raw === null || raw === undefined) return { items: [], absent: true };\n if (Array.isArray(raw)) return { items: raw as VerseBacklogItem[], absent: false };\n if (isRecord(raw) && Array.isArray(raw['items'])) {\n return { items: raw['items'] as VerseBacklogItem[], absent: false };\n }\n return { items: [], absent: true };\n}\n\nexport const verseBacklogQuery: QueryDef<VerseBacklogSummary> = {\n key: 'backlog',\n fetch: (signal) => apiGet<unknown>('/api/backlog', signal).then(normalizeBacklog),\n};\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\n/** Thrown before any network call when no mutation token is held. */\nexport class VerseControlLockedError extends Error {\n constructor() {\n super('Unlock actions with the mutation token before changing the loop.');\n this.name = 'VerseControlLockedError';\n }\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/** Every panel in the cockpit reads through one of these three. */\nexport function invalidateControl(): void {\n invalidate(VERSE_CONTROL_KEY);\n}\n\nexport async function updateVerseCaps(patch: VerseCapsPatch): Promise<VerseCapsApplyResult> {\n const result = await post<VerseCapsApplyResult>('/api/verse/caps', patch);\n invalidate(VERSE_CAPS_KEY);\n invalidateControl();\n return result;\n}\n\nexport async function updateVerseScope(patch: VerseScopePatch): Promise<void> {\n await post<unknown>('/api/verse/scope', patch);\n invalidate(VERSE_SCOPE_KEY);\n invalidateControl();\n}\n\nexport async function runDaemonAction(action: VerseDaemonAction): Promise<VerseDaemonActionResult> {\n const result = await post<VerseDaemonActionResult>('/api/verse/daemon', { action });\n invalidateControl();\n invalidate('daemon');\n return result;\n}\n\n/**\n * ENGAGE the global kill switch (`~/.ashlr/KILL`). This is `POST\n * /api/fleet/pause` under its honest name: it stops the daemon AND refuses\n * the agent's own mcp-native write tools. Never surface it as \"pause\".\n */\nexport async function engageEmergencyStop(): Promise<void> {\n await pauseFleet();\n invalidateControl();\n}\n\n/** Clear the kill switch — writes become possible again fleet-wide. */\nexport async function releaseEmergencyStop(): Promise<void> {\n await resumeFleet();\n invalidateControl();\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{B as e}from"./VerseConsoleApp-DXDv1aOi.js";import{t}from"./command-catalog-ffCAijVY.js";import{t as n}from"./clipboard-DkZdqlxf.js";async function r(r=t){let i=await n(r),a=r===`ashlr authority setup`?`add --dry-run to see every step first.`:`then rerun \`${t}\`.`;return e(i?`Copied \`${r}\`. Run it in a terminal; ${a}`:`Could not reach the clipboard. Run \`${r}\` in a terminal.`,i?`success`:`neutral`),i}export{r as copyAutonomySetupCommand};
2
- //# sourceMappingURL=copy-setup-BIp0iaiZ.js.map
1
+ import{B as e}from"./VerseConsoleApp-CWU6R3By.js";import{t}from"./command-catalog-BIntSa9l.js";import{t as n}from"./clipboard-DkZdqlxf.js";async function r(r=t){let i=await n(r),a=r===`ashlr authority setup`?`add --dry-run to see every step first.`:`then rerun \`${t}\`.`;return e(i?`Copied \`${r}\`. Run it in a terminal; ${a}`:`Could not reach the clipboard. Run \`${r}\` in a terminal.`,i?`success`:`neutral`),i}export{r as copyAutonomySetupCommand};
2
+ //# sourceMappingURL=copy-setup-XMgCC5f8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"copy-setup-BIp0iaiZ.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/copy-setup.ts"],"sourcesContent":["/**\n * routes/verse/shell/copy-setup.ts — ⌘K \"Copy autonomy setup command\" and\n * onboarding's Copy button: put `ashlr authority setup` (or the setup\n * checklist's next command) on the clipboard and say what to do with it.\n *\n * Split from run-command.ts for the same reason guarded-runners.ts is:\n * run-command is on the chat first-paint path (the shell's key handler runs\n * through it), and nothing here is needed until someone asks to copy — so\n * run-command loads this module with import() when the command runs.\n */\nimport { copyText } from '../../../components/primitives/clipboard.js';\nimport { AUTONOMY_SETUP_COMMAND } from './command-catalog.js';\nimport { shellNotify } from './run-command.js';\n\n/** Copy the setup command (or the checklist's next one) and toast the outcome; resolves to whether it was copied. */\nexport async function copyAutonomySetupCommand(command: string = AUTONOMY_SETUP_COMMAND): Promise<boolean> {\n const ok = await copyText(command);\n const then = command === AUTONOMY_SETUP_COMMAND\n ? 'add --dry-run to see every step first.'\n : `then rerun \\`${AUTONOMY_SETUP_COMMAND}\\`.`;\n shellNotify(\n ok\n ? `Copied \\`${command}\\`. Run it in a terminal; ${then}`\n : `Could not reach the clipboard. Run \\`${command}\\` in a terminal.`,\n ok ? 'success' : 'neutral',\n );\n return ok;\n}\n"],"mappings":"2IAeA,eAAsB,EAAyB,EAAkB,EAA0C,CACzG,IAAM,EAAK,MAAM,EAAS,CAAO,EAC3B,EAAO,IAAA,wBACT,yCACA,gBAAgB,EAAuB,KAO3C,OANA,EACE,EACI,YAAY,EAAQ,4BAA4B,IAChD,wCAAwC,EAAQ,mBACpD,EAAK,UAAY,SACnB,EACO,CACT"}
1
+ {"version":3,"file":"copy-setup-XMgCC5f8.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/copy-setup.ts"],"sourcesContent":["/**\n * routes/verse/shell/copy-setup.ts — ⌘K \"Copy autonomy setup command\" and\n * onboarding's Copy button: put `ashlr authority setup` (or the setup\n * checklist's next command) on the clipboard and say what to do with it.\n *\n * Split from run-command.ts for the same reason guarded-runners.ts is:\n * run-command is on the chat first-paint path (the shell's key handler runs\n * through it), and nothing here is needed until someone asks to copy — so\n * run-command loads this module with import() when the command runs.\n */\nimport { copyText } from '../../../components/primitives/clipboard.js';\nimport { AUTONOMY_SETUP_COMMAND } from './command-catalog.js';\nimport { shellNotify } from './run-command.js';\n\n/** Copy the setup command (or the checklist's next one) and toast the outcome; resolves to whether it was copied. */\nexport async function copyAutonomySetupCommand(command: string = AUTONOMY_SETUP_COMMAND): Promise<boolean> {\n const ok = await copyText(command);\n const then = command === AUTONOMY_SETUP_COMMAND\n ? 'add --dry-run to see every step first.'\n : `then rerun \\`${AUTONOMY_SETUP_COMMAND}\\`.`;\n shellNotify(\n ok\n ? `Copied \\`${command}\\`. Run it in a terminal; ${then}`\n : `Could not reach the clipboard. Run \\`${command}\\` in a terminal.`,\n ok ? 'success' : 'neutral',\n );\n return ok;\n}\n"],"mappings":"2IAeA,eAAsB,EAAyB,EAAkB,EAA0C,CACzG,IAAM,EAAK,MAAM,EAAS,CAAO,EAC3B,EAAO,IAAA,wBACT,yCACA,gBAAgB,EAAuB,KAO3C,OANA,EACE,EACI,YAAY,EAAQ,4BAA4B,IAChD,wCAAwC,EAAQ,mBACpD,EAAK,UAAY,SACnB,EACO,CACT"}
@@ -1,2 +1,2 @@
1
- import{a as e,c as t,n}from"./index-CyK31YRm.js";import{w as r}from"./verse-model-JTuvRBVK.js";import{a as i}from"./tool-semantics-GX8ScuSH.js";var a=t(e(),1),o=[],s=(0,a.createContext)(o);function c(e){return e}function l(e){return e.replace(/\\/g,`/`).replace(/\/+$/,``).replace(/^\/private(?=\/(?:tmp|var|etc)(?:\/|$))/,``).replace(/^[A-Z](?=:)/,e=>e.toLowerCase())}function u(e,t=o){let n=l(e),r=``;for(let e of t){let t=l(e);t.length>r.length&&!/^(?:[a-z]:)?$/.test(t)&&(n===t||n.startsWith(`${t}/`))&&(r=t)}let i=e.replace(/[\\/]+$/,``);if(r){let e=n.length-r.length-1;return e>0?i.slice(i.length-e):i.slice(Math.max(i.lastIndexOf(`/`),i.lastIndexOf(`\\`))+1)}if(!/^(?:[\\/]|[A-Za-z]:[\\/])/.test(e))return e.replace(/^\.[\\/]/,``);let a=e.includes(`/`)?`/`:`\\`,s=e.replace(/^[A-Za-z]:/,``).split(/[\\/]/).filter(Boolean);return s.length>4?`…${a}${s.slice(-3).join(a)}`:e}function d(e){let t=typeof e==`object`&&e?e:null;return t&&typeof t.command!=`string`&&typeof t.cmd!=`string`?i(t)[0]??null:null}function f(){let e=(0,a.useContext)(s);return(0,a.useCallback)(t=>u(t,e),[e])}var p={live:`_live_ytrey_7`,line:`_line_ytrey_14`,pulse:`_pulse_ytrey_24`,"live-pulse":`_live-pulse_ytrey_1`,text:`_text_ytrey_34`,word:`_word_ytrey_43`,sep:`_sep_ytrey_44`,figure:`_figure_ytrey_45`,detail:`_detail_ytrey_49`,stop:`_stop_ytrey_58`,stopIcon:`_stopIcon_ytrey_75`,notice:`_notice_ytrey_82`,noticeWord:`_noticeWord_ytrey_94`,noticeText:`_noticeText_ytrey_96`},m=n();function h(e,t){for(let t=e.length-1;t>=0;--t){let n=e[t];if(n.kind===`user`)break;if(n.kind===`tool`){if(n.result===null)return{phase:`tool`,detail:r(n.input)||n.name,path:d(n.input)};break}if(n.kind===`assistant`&&n.streaming)return{phase:`writing`,detail:null};if(n.kind===`assistant`||n.kind===`thinking`)break}return t.thinking?{phase:`thinking`,detail:null}:{phase:`waiting`,detail:null}}var g={thinking:`Thinking`,tool:`Running`,writing:`Writing`,waiting:`Waiting`},_={retry:`Retrying`,preflight:`Preflight`,watchdog:`Still running`};function v(e){if(!Number.isFinite(e)||e<0)return`0s`;let t=Math.floor(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60);return n<60?`${n}m ${t%60}s`:`${Math.floor(n/60)}h ${n%60}m`}function y(e,t,n){let r=e.progress,i=t.phase===`tool`||t.phase===`writing`?t.phase:r?.phase??t.phase,a=r?r.elapsedMs+Math.max(0,n-r.receivedAt):e.startedAt===null?null:Math.max(0,n-e.startedAt),o=i===`tool`?t.detail??r?.tool??null:null,s=r?.tokPerSec??null,c=(i===`writing`||i===`thinking`)&&s!==null&&s>0?`${s>=10?Math.round(s):s.toFixed(1)} tok/s`:null;return{phase:i,word:g[i],elapsedMs:a,detail:o,rate:c}}var b=(0,a.memo)(function({live:e,derived:t,onStop:n,showNotice:r=!0}){let[i,o]=(0,a.useState)(()=>Date.now());(0,a.useEffect)(()=>{o(Date.now());let e=setInterval(()=>o(Date.now()),1e3);return()=>clearInterval(e)},[e.turnId]);let s=f(),c=y(e,t,i),l=c.phase===`tool`&&t.path?{...c,detail:s(t.path)}:c,u=l.detail?`${l.word}: ${l.detail}`:l.word,d=r?e.notice:null;return(0,m.jsxs)(`div`,{className:p.live,"data-phase":l.phase,children:[(0,m.jsxs)(`div`,{className:p.line,children:[(0,m.jsx)(`span`,{className:p.pulse,"aria-hidden":`true`}),(0,m.jsxs)(`span`,{className:p.text,"aria-hidden":`true`,children:[(0,m.jsx)(`span`,{className:p.word,children:l.word}),l.elapsedMs===null?null:(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`span`,{className:p.sep,children:`·`}),(0,m.jsx)(`span`,{className:p.figure,children:v(l.elapsedMs)})]}),l.detail?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`span`,{className:p.sep,children:`·`}),(0,m.jsx)(`span`,{className:p.detail,title:t.path??l.detail,children:l.detail})]}):null,l.rate?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`span`,{className:p.sep,children:`·`}),(0,m.jsx)(`span`,{className:p.figure,children:l.rate})]}):null]}),(0,m.jsx)(`span`,{className:`visually-hidden`,role:`status`,children:u}),n?(0,m.jsxs)(`button`,{type:`button`,className:p.stop,onClick:n,"aria-label":`Stop this turn`,title:`Stop this turn (⌘.)`,children:[(0,m.jsx)(`span`,{className:p.stopIcon,"aria-hidden":`true`}),`Stop`]}):null]}),d?(0,m.jsxs)(`p`,{className:p.notice,"data-kind":d.kind,role:`status`,children:[(0,m.jsx)(`span`,{className:p.noticeWord,children:_[d.kind]}),(0,m.jsx)(`span`,{className:p.noticeText,children:d.message})]}):null]})}),x=new Set,S=null,C=Date.now();function w(e){return x.add(e),S===null&&(C=Date.now(),S=setInterval(()=>{C=Date.now();for(let e of[...x])e()},1e3)),()=>{x.delete(e),x.size===0&&S!==null&&(clearInterval(S),S=null)}}function T(){return C}var E=()=>()=>{},D=()=>0;function O(e=!0){let t=(0,a.useSyncExternalStore)(e?w:E,e?T:D,e?T:D);return Math.max(t,Date.now())}function k(e){if(typeof e==`number`)return Number.isFinite(e)?e:null;if(typeof e!=`string`)return null;let t=Date.parse(e);return Number.isFinite(t)?t:null}function A({since:e,className:t,label:n}){let r=k(e),i=O(r!==null);if(r===null)return null;let a=v(Math.max(0,i-r));return(0,m.jsx)(`span`,{className:t,"data-live-timer":``,"aria-hidden":!n||void 0,"aria-label":n?`${n} ${a}`:void 0,role:n?`timer`:void 0,children:a})}function j({size:e=16,children:t,...n}){return(0,m.jsx)(`svg`,{width:e,height:e,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:1.5,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,focusable:`false`,...n,children:t})}function M(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`10.5`,rx:`1.5`}),(0,m.jsx)(`path`,{d:`m4.5 6.25 2 1.75-2 1.75M8.25 10h3`})]})}function N(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`10.5`,rx:`1.5`}),(0,m.jsx)(`path`,{d:`M1.75 5.75h12.5M4 4.25h.01M5.75 4.25h.01`})]})}function P(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`path`,{d:`M5 2.5v5M2.5 5h5M9 11h4.5`}),(0,m.jsx)(`path`,{d:`M11.5 2.5 4.5 13.5`})]})}function F(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`path`,{d:`M6.5 4h7M6.5 8h7M6.5 12h7`}),(0,m.jsx)(`path`,{d:`m2.25 4 1 1 1.5-2M2.5 8h1.75M2.5 12h1.75`})]})}function I(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`path`,{d:`m8 2 6 3-6 3-6-3 6-3Z`}),(0,m.jsx)(`path`,{d:`m2 8 6 3 6-3M2 11l6 3 6-3`})]})}function L(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`rect`,{x:`2.25`,y:`2.25`,width:`11.5`,height:`11.5`,rx:`1.5`}),(0,m.jsx)(`path`,{d:`M2.25 8h11.5`})]})}function R(e){return(0,m.jsx)(j,{...e,children:(0,m.jsx)(`path`,{d:`m4 4 8 8M12 4l-8 8`})})}function z(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`circle`,{cx:`3.5`,cy:`8`,r:`0.9`,fill:`currentColor`,stroke:`none`}),(0,m.jsx)(`circle`,{cx:`8`,cy:`8`,r:`0.9`,fill:`currentColor`,stroke:`none`}),(0,m.jsx)(`circle`,{cx:`12.5`,cy:`8`,r:`0.9`,fill:`currentColor`,stroke:`none`})]})}function B(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`path`,{d:`M9.75 2.25 13.75 6.25 11 7.5 8.5 10l.25 2.75-5-5L6.5 8 9 5.25Z`}),(0,m.jsx)(`path`,{d:`m5 11-2.75 2.75`})]})}function V(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`3`,rx:`1`}),(0,m.jsx)(`path`,{d:`M2.75 5.75v6.5a1 1 0 0 0 1 1h8.5a1 1 0 0 0 1-1v-6.5M6.5 8.5h3`})]})}function H(e){return(0,m.jsx)(j,{...e,children:(0,m.jsx)(`path`,{d:`M10.5 2.75 13.25 5.5 6 12.75H3.25V10Z`})})}function U(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`path`,{d:`M2.5 8h9M8.5 4.5 12 8l-3.5 3.5`}),(0,m.jsx)(`path`,{d:`M13.75 3v10`})]})}function W(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`rect`,{x:`5.25`,y:`5.25`,width:`8.5`,height:`8.5`,rx:`1.5`}),(0,m.jsx)(`path`,{d:`M10.75 5.25V3.75a1.5 1.5 0 0 0-1.5-1.5h-5.5a1.5 1.5 0 0 0-1.5 1.5v5.5a1.5 1.5 0 0 0 1.5 1.5h1.5`})]})}function G(e){return(0,m.jsx)(j,{...e,children:(0,m.jsx)(`path`,{d:`M2.75 4.25h10.5M6.25 4.25V2.75h3.5v1.5M4.25 4.25l.6 9h6.3l.6-9`})})}var K={terminal:M,preview:N,diff:P,tasks:F,context:I};export{U as a,H as c,A as d,b as f,f as g,c as h,K as i,L as l,s as m,R as n,z as o,h as p,W as r,B as s,V as t,G as u};
2
- //# sourceMappingURL=dock-icons-Cc43W7r4.js.map
1
+ import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";import{T as r}from"./verse-model-DAVevkNe.js";import{a as i}from"./tool-semantics-GX8ScuSH.js";var a=t(e(),1),o=[],s=(0,a.createContext)(o);function c(e){return e}function l(e){return e.replace(/\\/g,`/`).replace(/\/+$/,``).replace(/^\/private(?=\/(?:tmp|var|etc)(?:\/|$))/,``).replace(/^[A-Z](?=:)/,e=>e.toLowerCase())}function u(e,t=o){let n=l(e),r=``;for(let e of t){let t=l(e);t.length>r.length&&!/^(?:[a-z]:)?$/.test(t)&&(n===t||n.startsWith(`${t}/`))&&(r=t)}let i=e.replace(/[\\/]+$/,``);if(r){let e=n.length-r.length-1;return e>0?i.slice(i.length-e):i.slice(Math.max(i.lastIndexOf(`/`),i.lastIndexOf(`\\`))+1)}if(!/^(?:[\\/]|[A-Za-z]:[\\/])/.test(e))return e.replace(/^\.[\\/]/,``);let a=e.includes(`/`)?`/`:`\\`,s=e.replace(/^[A-Za-z]:/,``).split(/[\\/]/).filter(Boolean);return s.length>4?`…${a}${s.slice(-3).join(a)}`:e}function d(e){let t=typeof e==`object`&&e?e:null;return t&&typeof t.command!=`string`&&typeof t.cmd!=`string`?i(t)[0]??null:null}function f(){let e=(0,a.useContext)(s);return(0,a.useCallback)(t=>u(t,e),[e])}var p={live:`_live_ytrey_7`,line:`_line_ytrey_14`,pulse:`_pulse_ytrey_24`,"live-pulse":`_live-pulse_ytrey_1`,text:`_text_ytrey_34`,word:`_word_ytrey_43`,sep:`_sep_ytrey_44`,figure:`_figure_ytrey_45`,detail:`_detail_ytrey_49`,stop:`_stop_ytrey_58`,stopIcon:`_stopIcon_ytrey_75`,notice:`_notice_ytrey_82`,noticeWord:`_noticeWord_ytrey_94`,noticeText:`_noticeText_ytrey_96`},m=n();function h(e,t){for(let t=e.length-1;t>=0;--t){let n=e[t];if(n.kind===`user`)break;if(n.kind===`tool`){if(n.result===null)return{phase:`tool`,detail:r(n.input)||n.name,path:d(n.input)};break}if(n.kind===`assistant`&&n.streaming)return{phase:`writing`,detail:null};if(n.kind===`assistant`||n.kind===`thinking`)break}return t.thinking?{phase:`thinking`,detail:null}:{phase:`waiting`,detail:null}}var g={thinking:`Thinking`,tool:`Running`,writing:`Writing`,waiting:`Waiting`},_={retry:`Retrying`,preflight:`Preflight`,watchdog:`Still running`};function v(e){if(!Number.isFinite(e)||e<0)return`0s`;let t=Math.floor(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60);return n<60?`${n}m ${t%60}s`:`${Math.floor(n/60)}h ${n%60}m`}function y(e,t,n){let r=e.progress,i=t.phase===`tool`||t.phase===`writing`?t.phase:r?.phase??t.phase,a=r?r.elapsedMs+Math.max(0,n-r.receivedAt):e.startedAt===null?null:Math.max(0,n-e.startedAt),o=i===`tool`?t.detail??r?.tool??null:null,s=r?.tokPerSec??null,c=(i===`writing`||i===`thinking`)&&s!==null&&s>0?`${s>=10?Math.round(s):s.toFixed(1)} tok/s`:null;return{phase:i,word:g[i],elapsedMs:a,detail:o,rate:c}}var b=(0,a.memo)(function({live:e,derived:t,onStop:n,showNotice:r=!0}){let[i,o]=(0,a.useState)(()=>Date.now());(0,a.useEffect)(()=>{o(Date.now());let e=setInterval(()=>o(Date.now()),1e3);return()=>clearInterval(e)},[e.turnId]);let s=f(),c=y(e,t,i),l=c.phase===`tool`&&t.path?{...c,detail:s(t.path)}:c,u=l.detail?`${l.word}: ${l.detail}`:l.word,d=r?e.notice:null;return(0,m.jsxs)(`div`,{className:p.live,"data-phase":l.phase,children:[(0,m.jsxs)(`div`,{className:p.line,children:[(0,m.jsx)(`span`,{className:p.pulse,"aria-hidden":`true`}),(0,m.jsxs)(`span`,{className:p.text,"aria-hidden":`true`,children:[(0,m.jsx)(`span`,{className:p.word,children:l.word}),l.elapsedMs===null?null:(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`span`,{className:p.sep,children:`·`}),(0,m.jsx)(`span`,{className:p.figure,children:v(l.elapsedMs)})]}),l.detail?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`span`,{className:p.sep,children:`·`}),(0,m.jsx)(`span`,{className:p.detail,title:t.path??l.detail,children:l.detail})]}):null,l.rate?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`span`,{className:p.sep,children:`·`}),(0,m.jsx)(`span`,{className:p.figure,children:l.rate})]}):null]}),(0,m.jsx)(`span`,{className:`visually-hidden`,role:`status`,children:u}),n?(0,m.jsxs)(`button`,{type:`button`,className:p.stop,onClick:n,"aria-label":`Stop this turn`,title:`Stop this turn (⌘.)`,children:[(0,m.jsx)(`span`,{className:p.stopIcon,"aria-hidden":`true`}),`Stop`]}):null]}),d?(0,m.jsxs)(`p`,{className:p.notice,"data-kind":d.kind,role:`status`,children:[(0,m.jsx)(`span`,{className:p.noticeWord,children:_[d.kind]}),(0,m.jsx)(`span`,{className:p.noticeText,children:d.message})]}):null]})}),x=new Set,S=null,C=Date.now();function w(e){return x.add(e),S===null&&(C=Date.now(),S=setInterval(()=>{C=Date.now();for(let e of[...x])e()},1e3)),()=>{x.delete(e),x.size===0&&S!==null&&(clearInterval(S),S=null)}}function T(){return C}var E=()=>()=>{},D=()=>0;function O(e=!0){let t=(0,a.useSyncExternalStore)(e?w:E,e?T:D,e?T:D);return Math.max(t,Date.now())}function k(e){if(typeof e==`number`)return Number.isFinite(e)?e:null;if(typeof e!=`string`)return null;let t=Date.parse(e);return Number.isFinite(t)?t:null}function A({since:e,className:t,label:n}){let r=k(e),i=O(r!==null);if(r===null)return null;let a=v(Math.max(0,i-r));return(0,m.jsx)(`span`,{className:t,"data-live-timer":``,"aria-hidden":!n||void 0,"aria-label":n?`${n} ${a}`:void 0,role:n?`timer`:void 0,children:a})}function j({size:e=16,children:t,...n}){return(0,m.jsx)(`svg`,{width:e,height:e,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:1.5,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,focusable:`false`,...n,children:t})}function M(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`10.5`,rx:`1.5`}),(0,m.jsx)(`path`,{d:`m4.5 6.25 2 1.75-2 1.75M8.25 10h3`})]})}function N(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`10.5`,rx:`1.5`}),(0,m.jsx)(`path`,{d:`M1.75 5.75h12.5M4 4.25h.01M5.75 4.25h.01`})]})}function P(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`path`,{d:`M5 2.5v5M2.5 5h5M9 11h4.5`}),(0,m.jsx)(`path`,{d:`M11.5 2.5 4.5 13.5`})]})}function F(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`path`,{d:`M6.5 4h7M6.5 8h7M6.5 12h7`}),(0,m.jsx)(`path`,{d:`m2.25 4 1 1 1.5-2M2.5 8h1.75M2.5 12h1.75`})]})}function I(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`path`,{d:`m8 2 6 3-6 3-6-3 6-3Z`}),(0,m.jsx)(`path`,{d:`m2 8 6 3 6-3M2 11l6 3 6-3`})]})}function L(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`rect`,{x:`2.25`,y:`2.25`,width:`11.5`,height:`11.5`,rx:`1.5`}),(0,m.jsx)(`path`,{d:`M2.25 8h11.5`})]})}function R(e){return(0,m.jsx)(j,{...e,children:(0,m.jsx)(`path`,{d:`m4 4 8 8M12 4l-8 8`})})}function z(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`circle`,{cx:`3.5`,cy:`8`,r:`0.9`,fill:`currentColor`,stroke:`none`}),(0,m.jsx)(`circle`,{cx:`8`,cy:`8`,r:`0.9`,fill:`currentColor`,stroke:`none`}),(0,m.jsx)(`circle`,{cx:`12.5`,cy:`8`,r:`0.9`,fill:`currentColor`,stroke:`none`})]})}function B(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`path`,{d:`M9.75 2.25 13.75 6.25 11 7.5 8.5 10l.25 2.75-5-5L6.5 8 9 5.25Z`}),(0,m.jsx)(`path`,{d:`m5 11-2.75 2.75`})]})}function V(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`3`,rx:`1`}),(0,m.jsx)(`path`,{d:`M2.75 5.75v6.5a1 1 0 0 0 1 1h8.5a1 1 0 0 0 1-1v-6.5M6.5 8.5h3`})]})}function H(e){return(0,m.jsx)(j,{...e,children:(0,m.jsx)(`path`,{d:`M10.5 2.75 13.25 5.5 6 12.75H3.25V10Z`})})}function U(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`path`,{d:`M2.5 8h9M8.5 4.5 12 8l-3.5 3.5`}),(0,m.jsx)(`path`,{d:`M13.75 3v10`})]})}function W(e){return(0,m.jsxs)(j,{...e,children:[(0,m.jsx)(`rect`,{x:`5.25`,y:`5.25`,width:`8.5`,height:`8.5`,rx:`1.5`}),(0,m.jsx)(`path`,{d:`M10.75 5.25V3.75a1.5 1.5 0 0 0-1.5-1.5h-5.5a1.5 1.5 0 0 0-1.5 1.5v5.5a1.5 1.5 0 0 0 1.5 1.5h1.5`})]})}function G(e){return(0,m.jsx)(j,{...e,children:(0,m.jsx)(`path`,{d:`M2.75 4.25h10.5M6.25 4.25V2.75h3.5v1.5M4.25 4.25l.6 9h6.3l.6-9`})})}var K={terminal:M,preview:N,diff:P,tasks:F,context:I};export{U as a,H as c,A as d,b as f,f as g,c as h,K as i,L as l,s as m,R as n,z as o,h as p,W as r,B as s,V as t,G as u};
2
+ //# sourceMappingURL=dock-icons-BJ6ZqB2t.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dock-icons-Cc43W7r4.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/path-display.ts","../../../../../../src/web-ui/routes/verse/chat/LiveStatus.module.css","../../../../../../src/web-ui/routes/verse/chat/LiveStatus.tsx","../../../../../../src/web-ui/routes/verse/chat/LiveTimer.tsx","../../../../../../src/web-ui/routes/verse/dock/dock-icons.tsx"],"sourcesContent":["/**\n * routes/verse/chat/path-display.ts — how a file path READS in the chat.\n *\n * Tool payloads carry whatever path the CLI used, and that is usually\n * absolute: `/private/tmp/…/scratchpad/e2e-proj-39/math.ts` for a file the\n * operator knows as `math.ts`. Shown raw, the one part that identifies the\n * file is what the row's ellipsis clips. So every path the transcript draws\n * goes through `displayPath`:\n *\n * 1. relative to the chat's roots (the longest root that contains it wins —\n * a worktree nested in its repo is its own root). Paths and roots are\n * compared as `keyOf`s, so `\\` vs `/`, a trailing separator, macOS's\n * `/private/tmp` for `/tmp` and `c:` for `C:` all still match; the rest\n * is sliced out of the ORIGINAL path, in the CLI's own separators;\n * 2. otherwise as the hub sent it when it is relative or `~/…`;\n * 3. otherwise, when it is long, its last three segments behind `…/`.\n *\n * HOME. The hub rewrites the operator's OWN home to `~` on every payload\n * (sanitizePublicJson) and is the only side that knows which home that is —\n * so a `~/…` path or root already says it, and matches as-is. Nothing here\n * guesses a home from `/Users/<x>`, `/home/<x>` or `C:\\Users\\<x>`: one that\n * reaches the browser is another account's or /Users/Shared, and drawing it\n * as `~` (or as in-project, via a `~` root) passes it off as the operator's.\n *\n * Display only. The full path stays in the tooltip and is never rewritten in\n * anything handed back to a tool, a search or a jump anchor. (It is in the\n * chat's first-paint chunk, hence the terse body.)\n */\nimport { createContext, useCallback, useContext } from 'react';\nimport { pathsIn } from './tool-semantics.js';\n\nconst NO_ROOTS: readonly string[] = [];\n\n/** The chat's roots, primary first (Workspace provides them; Transcript can override). */\nexport const PathRootsContext = createContext<readonly string[]>(NO_ROOTS);\n\n/**\n * A path as the operator's home reads: unchanged. The hub already spelled\n * that home `~`; any other `/Users/<x>` is someone else's (see HOME above).\n * Kept as the one seam home display goes through (SessionRoots uses it).\n */\nexport function abbreviateHome(path: string): string {\n return path;\n}\n\n/**\n * One folder's comparable form: `/` separators, no trailing one, the\n * `/private` alias folded (/tmp, /var and /etc are symlinks into it and roots\n * are not realpath'd), a lower-case drive letter. Only the fold changes the\n * length, and only at the head — so a matched tail maps back onto the original.\n */\nfunction keyOf(path: string): string {\n return path.replace(/\\\\/g, '/').replace(/\\/+$/, '')\n .replace(/^\\/private(?=\\/(?:tmp|var|etc)(?:\\/|$))/, '')\n .replace(/^[A-Z](?=:)/, (d) => d.toLowerCase());\n}\n\n/** What the transcript draws for `path`; the full path belongs in the tooltip. */\nexport function displayPath(path: string, roots: readonly string[] = NO_ROOTS): string {\n const key = keyOf(path);\n let root = '';\n for (const raw of roots) {\n const r = keyOf(raw);\n // A bare `/`, `C:` or `\\\\` root would claim every path on the machine.\n if (r.length > root.length && !/^(?:[a-z]:)?$/.test(r) && (key === r || key.startsWith(`${r}/`))) root = r;\n }\n const own = path.replace(/[\\\\/]+$/, '');\n // Inside a root: the rest of the path, or — for the root itself — its name.\n if (root) {\n const rest = key.length - root.length - 1;\n return rest > 0 ? own.slice(own.length - rest) : own.slice(Math.max(own.lastIndexOf('/'), own.lastIndexOf('\\\\')) + 1);\n }\n if (!/^(?:[\\\\/]|[A-Za-z]:[\\\\/])/.test(path)) return path.replace(/^\\.[\\\\/]/, '');\n const sep = path.includes('/') ? '/' : '\\\\';\n const parts = path.replace(/^[A-Za-z]:/, '').split(/[\\\\/]/).filter(Boolean);\n return parts.length > 4 ? `…${sep}${parts.slice(-3).join(sep)}` : path;\n}\n\n/**\n * The file a tool call names, when it runs no command — a shell call keeps\n * its command line verbatim (rewriting a command is not display).\n */\nexport function inputPath(input: unknown): string | null {\n const rec = input !== null && typeof input === 'object' ? input as Record<string, unknown> : null;\n return rec && typeof rec.command !== 'string' && typeof rec.cmd !== 'string' ? pathsIn(rec)[0] ?? null : null;\n}\n\n/** `displayPath` bound to the roots in context. */\nexport function useDisplayPath(): (path: string) => string {\n const roots = useContext(PathRootsContext);\n return useCallback((path: string) => displayPath(path, roots), [roots]);\n}\n","/**\n * The live line sits where the caret used to: under the running turn, on\n * the reading measure, in tertiary text with tabular figures. Colour means\n * state only — the running pulse — and a notice is a 2px rule in the warning\n * colour with its kind in words (DESIGN §6: never colour alone).\n */\n.live {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n min-width: 0;\n}\n\n.line {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n min-height: var(--control-h-sm);\n min-width: 0;\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n}\n\n.pulse {\n width: 8px;\n height: 8px;\n flex: none;\n border-radius: var(--radius-full);\n background: var(--status-running-solid);\n animation: live-pulse 1.4s var(--ease-standard) infinite;\n}\n.live[data-phase='waiting'] .pulse { background: var(--border-strong); }\n\n.text {\n display: inline-flex;\n align-items: baseline;\n gap: var(--space-2);\n min-width: 0;\n flex: 1 1 auto;\n overflow: hidden;\n white-space: nowrap;\n}\n.word { color: var(--text-secondary); font-weight: var(--font-weight-medium); }\n.sep { color: var(--text-tertiary); }\n.figure {\n font-family: var(--font-display);\n font-variant-numeric: tabular-nums;\n}\n.detail {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n}\n\n.stop {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n min-height: var(--control-h-xs);\n padding: 0 var(--space-2);\n border: 1px solid transparent;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n cursor: pointer;\n transition: color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard);\n}\n.stop:hover { color: var(--text-primary); background: var(--bg-hover); border-color: var(--border-default); }\n.stop:active { background: var(--bg-active); }\n.stopIcon {\n width: 8px;\n height: 8px;\n border-radius: 1px;\n background: currentColor;\n}\n\n.notice {\n display: flex;\n gap: var(--space-2);\n margin: 0;\n padding-left: var(--space-3);\n border-left: 2px solid var(--status-warning-solid);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n overflow-wrap: anywhere;\n}\n.notice[data-kind='preflight'] { border-left-color: var(--status-info-solid); }\n.noticeWord { color: var(--status-warning-fg); font-weight: var(--font-weight-medium); white-space: nowrap; }\n.notice[data-kind='preflight'] .noticeWord { color: var(--status-info-fg); }\n.noticeText { min-width: 0; }\n\n@keyframes live-pulse { 50% { opacity: 0.3; } }\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .pulse { animation: none; }\n}\n:root[data-motion=\"reduce\"] .pulse { animation: none; }\n\n@media (max-width: 480px) {\n /* 3.10: one line above the composer, beside the tasks chip — the text\n ellipsises (its detail first) rather than wrapping Stop onto a row of\n its own. */\n .line { flex-wrap: nowrap; }\n}\n","/**\n * routes/verse/chat/LiveStatus.tsx — the line under a running turn (V3.10):\n *\n * ● Running · 14s · npm test Stop\n * ● Writing · 1m 3s · 38 tok/s Stop\n *\n * It replaces the bare caret that used to be the ONLY live signal: a turn\n * that had been silently retrying an overloaded API for four minutes looked\n * exactly like one that was about to answer.\n *\n * Sources, best first:\n * 1. transient `progress` frames (phase, server-measured elapsed, tok/s);\n * 2. the transcript itself — a pending tool call means \"running that\n * tool\", a streaming bubble means \"writing\" — so a server that sends no\n * progress frames still gets an honest line;\n * 3. the turn's own start stamp for the clock.\n * A figure nobody measured (tok/s, the tool) is left out, never guessed.\n *\n * Under it, when the engine says so, one plumbing notice: an API retry, a\n * failed preflight (e.g. Ollama not answering), or the no-output watchdog.\n * It clears itself once output resumes (verse-store livePersisted).\n *\n * Accessibility: the visible line ticks every second, so it is NOT a live\n * region; a visually hidden status announces only phase/tool changes, and a\n * notice is announced once when it appears.\n */\nimport { memo, useEffect, useState } from 'react';\nimport type { VerseProgressPhase, VerseStatusKind } from '../../../../core/verse/types.js';\nimport { summarizeToolInput } from '../verse-model.js';\nimport type { TranscriptItem, VerseLiveState } from '../verse-store.js';\nimport { inputPath, useDisplayPath } from './path-display.js';\nimport styles from './LiveStatus.module.css';\n\nexport interface LivePhase {\n phase: VerseProgressPhase;\n /** What the phase is about: the running command/path, when known. */\n detail: string | null;\n /** 3.10.1: the file the running call names, drawn relative to the chat's roots. */\n path?: string | null;\n}\n\n/**\n * What the transcript says the running turn is doing right now — the\n * fallback for a server that sends no `progress` frames, and the source of\n * the tool's human-readable argument even when one does.\n */\nexport function derivePhaseFromTranscript(items: readonly TranscriptItem[], live: Pick<VerseLiveState, 'thinking'>): LivePhase {\n for (let i = items.length - 1; i >= 0; i -= 1) {\n const item = items[i]!;\n if (item.kind === 'user') break;\n if (item.kind === 'tool') {\n if (item.result === null) return { phase: 'tool', detail: summarizeToolInput(item.input) || item.name, path: inputPath(item.input) };\n break;\n }\n if (item.kind === 'assistant' && item.streaming) return { phase: 'writing', detail: null };\n if (item.kind === 'assistant' || item.kind === 'thinking') break;\n }\n if (live.thinking) return { phase: 'thinking', detail: null };\n return { phase: 'waiting', detail: null };\n}\n\nconst PHASE_WORD: Record<VerseProgressPhase, string> = {\n thinking: 'Thinking',\n tool: 'Running',\n writing: 'Writing',\n waiting: 'Waiting',\n};\n\nconst NOTICE_WORD: Record<VerseStatusKind, string> = {\n retry: 'Retrying',\n preflight: 'Preflight',\n watchdog: 'Still running',\n};\n\n/** \"14s\" / \"1m 3s\" / \"1h 2m\". */\nexport function formatLiveElapsed(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) return '0s';\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${s % 60}s`;\n return `${Math.floor(m / 60)}h ${m % 60}m`;\n}\n\nexport interface LiveStatusLine {\n phase: VerseProgressPhase;\n word: string;\n elapsedMs: number | null;\n detail: string | null;\n rate: string | null;\n}\n\n/** Pure: the parts of the line at clock time `now` (exported for tests). */\nexport function liveStatusLine(live: VerseLiveState, derived: LivePhase, now: number): LiveStatusLine {\n const progress = live.progress;\n // The transcript knows a tool call is pending before (or without) a\n // progress frame saying so, and it knows the call's argument; a progress\n // frame knows about reasoning and waiting, which the transcript cannot see.\n const phase: VerseProgressPhase = derived.phase === 'tool' || derived.phase === 'writing'\n ? derived.phase\n : progress?.phase ?? derived.phase;\n const elapsedMs = progress\n ? progress.elapsedMs + Math.max(0, now - progress.receivedAt)\n : live.startedAt !== null ? Math.max(0, now - live.startedAt) : null;\n const detail = phase === 'tool' ? derived.detail ?? progress?.tool ?? null : null;\n const tps = progress?.tokPerSec ?? null;\n const rate = (phase === 'writing' || phase === 'thinking') && tps !== null && tps > 0 ? `${tps >= 10 ? Math.round(tps) : tps.toFixed(1)} tok/s` : null;\n return { phase, word: PHASE_WORD[phase], elapsedMs, detail, rate };\n}\n\nexport interface LiveStatusProps {\n live: VerseLiveState;\n derived: LivePhase;\n onStop?: () => void;\n /**\n * 3.10: above the composer the engine's notice goes to the notice slot\n * (one notice at a time, in priority order), so the line omits it.\n */\n showNotice?: boolean;\n}\n\nexport const LiveStatus = memo(function LiveStatus({ live, derived, onStop, showNotice = true }: LiveStatusProps) {\n const [now, setNow] = useState(() => Date.now());\n // The clock only; never a request. Re-armed per turn.\n useEffect(() => {\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [live.turnId]);\n\n const show = useDisplayPath();\n const computed = liveStatusLine(live, derived, now);\n // A running Read names its file as the transcript does — relative, not the\n // head of an absolute path (chat/path-display.ts); the full path is the title.\n const line = computed.phase === 'tool' && derived.path ? { ...computed, detail: show(derived.path) } : computed;\n const spoken = line.detail ? `${line.word}: ${line.detail}` : line.word;\n const notice = showNotice ? live.notice : null;\n\n return (\n <div className={styles.live} data-phase={line.phase}>\n <div className={styles.line}>\n <span className={styles.pulse} aria-hidden=\"true\" />\n <span className={styles.text} aria-hidden=\"true\">\n <span className={styles.word}>{line.word}</span>\n {line.elapsedMs !== null ? <><span className={styles.sep}>·</span><span className={styles.figure}>{formatLiveElapsed(line.elapsedMs)}</span></> : null}\n {line.detail ? <><span className={styles.sep}>·</span><span className={styles.detail} title={derived.path ?? line.detail}>{line.detail}</span></> : null}\n {line.rate ? <><span className={styles.sep}>·</span><span className={styles.figure}>{line.rate}</span></> : null}\n </span>\n <span className=\"visually-hidden\" role=\"status\">{spoken}</span>\n {onStop ? (\n <button type=\"button\" className={styles.stop} onClick={onStop} aria-label=\"Stop this turn\" title=\"Stop this turn (⌘.)\">\n <span className={styles.stopIcon} aria-hidden=\"true\" />Stop\n </button>\n ) : null}\n </div>\n {notice ? (\n <p className={styles.notice} data-kind={notice.kind} role=\"status\">\n <span className={styles.noticeWord}>{NOTICE_WORD[notice.kind]}</span>\n <span className={styles.noticeText}>{notice.message}</span>\n </p>\n ) : null}\n </div>\n );\n});\n","/**\n * routes/verse/chat/LiveTimer.tsx — \"12s\", counting, for anything running\n * (unit C2): a pending tool row, an activity group, a running chat in the\n * sidebar, a task in the Tasks pane.\n *\n * ONE shared one-second clock for every timer on the page. A long session\n * can show dozens of running rows at once (a group of parallel tool calls,\n * the sidebar's running chats, the tasks list); a `setInterval` each would\n * be dozens of timers re-rendering out of phase. Subscribers join a single\n * interval that exists only while at least one of them is mounted, and all\n * of them tick on the same beat.\n *\n * It is a clock, never a request (SPEC-310A §0: no polling faster than 2 s —\n * this polls nothing).\n */\nimport { useSyncExternalStore } from 'react';\nimport { formatLiveElapsed } from './LiveStatus.js';\n\nconst listeners = new Set<() => void>();\nlet timer: ReturnType<typeof setInterval> | null = null;\nlet now = Date.now();\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n if (timer === null) {\n now = Date.now();\n timer = setInterval(() => {\n now = Date.now();\n for (const l of [...listeners]) l();\n }, 1000);\n }\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0 && timer !== null) {\n clearInterval(timer);\n timer = null;\n }\n };\n}\n\nfunction snapshot(): number {\n return now;\n}\n\nconst idle = () => () => {};\n// A constant: useSyncExternalStore requires a stable snapshot between\n// renders, and `Date.now` as a snapshot would loop.\nconst idleSnapshot = () => 0;\n\n/**\n * The shared clock (ms). While `active` is false the component does not\n * subscribe at all — a settled row costs nothing — and reads the wall clock\n * once per render instead.\n */\nexport function useSecondClock(active = true): number {\n const tick = useSyncExternalStore(active ? subscribe : idle, active ? snapshot : idleSnapshot, active ? snapshot : idleSnapshot);\n // A freshly mounted subscriber must not show the clock as it stood when the\n // previous beat fired (up to a second stale): take the later of the two.\n return Math.max(tick, Date.now());\n}\n\n/** Parse an ISO stamp or client-clock ms into ms; null when unusable. */\nexport function startMs(since: string | number | null | undefined): number | null {\n if (typeof since === 'number') return Number.isFinite(since) ? since : null;\n if (typeof since !== 'string') return null;\n const ms = Date.parse(since);\n return Number.isFinite(ms) ? ms : null;\n}\n\nexport interface LiveTimerProps {\n /** ISO start stamp or client-clock ms. Unparseable → renders nothing (an unknown start is not \"0s\"). */\n since: string | number | null | undefined;\n className?: string;\n /** Spoken label prefix, e.g. \"running for\". Omit to hide the timer from assistive tech (it ticks every second). */\n label?: string;\n}\n\nexport function LiveTimer({ since, className, label }: LiveTimerProps) {\n const start = startMs(since);\n const clock = useSecondClock(start !== null);\n if (start === null) return null;\n const text = formatLiveElapsed(Math.max(0, clock - start));\n return (\n <span className={className} data-live-timer=\"\" aria-hidden={label ? undefined : true}\n aria-label={label ? `${label} ${text}` : undefined} role={label ? 'timer' : undefined}>\n {text}\n </span>\n );\n}\n","/**\n * routes/verse/dock/dock-icons.tsx — the chat surface's own 16px glyphs\n * (unit C2): the dock's pane tabs and the header's pane toggles, the ⋯\n * menu, pin and archive. Same drawing grammar as components/primitives/icons\n * (16-unit box, 1.5 stroke, round caps, currentColor) so they sit beside the\n * shared set without looking borrowed; kept here because verse-icons.tsx is\n * the shell's file.\n */\nimport type { ReactNode, SVGProps } from 'react';\nimport type { DockPaneId } from '../shell/dock-catalog.js';\n\nexport interface GlyphProps extends Omit<SVGProps<SVGSVGElement>, 'children' | 'viewBox'> {\n size?: number;\n}\n\nfunction Glyph({ size = 16, children, ...rest }: GlyphProps & { children: ReactNode }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}\n strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" focusable=\"false\" {...rest}>\n {children}\n </svg>\n );\n}\n\nexport function TerminalGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"m4.5 6.25 2 1.75-2 1.75M8.25 10h3\" /></Glyph>;\n}\n\nexport function PreviewGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"M1.75 5.75h12.5M4 4.25h.01M5.75 4.25h.01\" /></Glyph>;\n}\n\nexport function ReviewGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M5 2.5v5M2.5 5h5M9 11h4.5\" /><path d=\"M11.5 2.5 4.5 13.5\" /></Glyph>;\n}\n\nexport function TasksGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M6.5 4h7M6.5 8h7M6.5 12h7\" /><path d=\"m2.25 4 1 1 1.5-2M2.5 8h1.75M2.5 12h1.75\" /></Glyph>;\n}\n\nexport function ContextGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"m8 2 6 3-6 3-6-3 6-3Z\" /><path d=\"m2 8 6 3 6-3M2 11l6 3 6-3\" /></Glyph>;\n}\n\nexport function SplitGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"2.25\" y=\"2.25\" width=\"11.5\" height=\"11.5\" rx=\"1.5\" /><path d=\"M2.25 8h11.5\" /></Glyph>;\n}\n\nexport function CloseGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"m4 4 8 8M12 4l-8 8\" /></Glyph>;\n}\n\nexport function MoreGlyph(p: GlyphProps) {\n return (\n <Glyph {...p}>\n <circle cx=\"3.5\" cy=\"8\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"8\" cy=\"8\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12.5\" cy=\"8\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\" />\n </Glyph>\n );\n}\n\nexport function PinGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M9.75 2.25 13.75 6.25 11 7.5 8.5 10l.25 2.75-5-5L6.5 8 9 5.25Z\" /><path d=\"m5 11-2.75 2.75\" /></Glyph>;\n}\n\nexport function ArchiveGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"3\" rx=\"1\" /><path d=\"M2.75 5.75v6.5a1 1 0 0 0 1 1h8.5a1 1 0 0 0 1-1v-6.5M6.5 8.5h3\" /></Glyph>;\n}\n\nexport function RenameGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M10.5 2.75 13.25 5.5 6 12.75H3.25V10Z\" /></Glyph>;\n}\n\nexport function HandoffGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M2.5 8h9M8.5 4.5 12 8l-3.5 3.5\" /><path d=\"M13.75 3v10\" /></Glyph>;\n}\n\nexport function CopyGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.5\" /><path d=\"M10.75 5.25V3.75a1.5 1.5 0 0 0-1.5-1.5h-5.5a1.5 1.5 0 0 0-1.5 1.5v5.5a1.5 1.5 0 0 0 1.5 1.5h1.5\" /></Glyph>;\n}\n\nexport function TrashGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M2.75 4.25h10.5M6.25 4.25V2.75h3.5v1.5M4.25 4.25l.6 9h6.3l.6-9\" /></Glyph>;\n}\n\nexport const DOCK_PANE_GLYPH: Readonly<Record<DockPaneId, (p: GlyphProps) => ReactNode>> = {\n terminal: TerminalGlyph,\n preview: PreviewGlyph,\n diff: ReviewGlyph,\n tasks: TasksGlyph,\n context: ContextGlyph,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"dock-icons-BJ6ZqB2t.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/path-display.ts","../../../../../../src/web-ui/routes/verse/chat/LiveStatus.module.css","../../../../../../src/web-ui/routes/verse/chat/LiveStatus.tsx","../../../../../../src/web-ui/routes/verse/chat/LiveTimer.tsx","../../../../../../src/web-ui/routes/verse/dock/dock-icons.tsx"],"sourcesContent":["/**\n * routes/verse/chat/path-display.ts — how a file path READS in the chat.\n *\n * Tool payloads carry whatever path the CLI used, and that is usually\n * absolute: `/private/tmp/…/scratchpad/e2e-proj-39/math.ts` for a file the\n * operator knows as `math.ts`. Shown raw, the one part that identifies the\n * file is what the row's ellipsis clips. So every path the transcript draws\n * goes through `displayPath`:\n *\n * 1. relative to the chat's roots (the longest root that contains it wins —\n * a worktree nested in its repo is its own root). Paths and roots are\n * compared as `keyOf`s, so `\\` vs `/`, a trailing separator, macOS's\n * `/private/tmp` for `/tmp` and `c:` for `C:` all still match; the rest\n * is sliced out of the ORIGINAL path, in the CLI's own separators;\n * 2. otherwise as the hub sent it when it is relative or `~/…`;\n * 3. otherwise, when it is long, its last three segments behind `…/`.\n *\n * HOME. The hub rewrites the operator's OWN home to `~` on every payload\n * (sanitizePublicJson) and is the only side that knows which home that is —\n * so a `~/…` path or root already says it, and matches as-is. Nothing here\n * guesses a home from `/Users/<x>`, `/home/<x>` or `C:\\Users\\<x>`: one that\n * reaches the browser is another account's or /Users/Shared, and drawing it\n * as `~` (or as in-project, via a `~` root) passes it off as the operator's.\n *\n * Display only. The full path stays in the tooltip and is never rewritten in\n * anything handed back to a tool, a search or a jump anchor. (It is in the\n * chat's first-paint chunk, hence the terse body.)\n */\nimport { createContext, useCallback, useContext } from 'react';\nimport { pathsIn } from './tool-semantics.js';\n\nconst NO_ROOTS: readonly string[] = [];\n\n/** The chat's roots, primary first (Workspace provides them; Transcript can override). */\nexport const PathRootsContext = createContext<readonly string[]>(NO_ROOTS);\n\n/**\n * A path as the operator's home reads: unchanged. The hub already spelled\n * that home `~`; any other `/Users/<x>` is someone else's (see HOME above).\n * Kept as the one seam home display goes through (SessionRoots uses it).\n */\nexport function abbreviateHome(path: string): string {\n return path;\n}\n\n/**\n * One folder's comparable form: `/` separators, no trailing one, the\n * `/private` alias folded (/tmp, /var and /etc are symlinks into it and roots\n * are not realpath'd), a lower-case drive letter. Only the fold changes the\n * length, and only at the head — so a matched tail maps back onto the original.\n */\nfunction keyOf(path: string): string {\n return path.replace(/\\\\/g, '/').replace(/\\/+$/, '')\n .replace(/^\\/private(?=\\/(?:tmp|var|etc)(?:\\/|$))/, '')\n .replace(/^[A-Z](?=:)/, (d) => d.toLowerCase());\n}\n\n/** What the transcript draws for `path`; the full path belongs in the tooltip. */\nexport function displayPath(path: string, roots: readonly string[] = NO_ROOTS): string {\n const key = keyOf(path);\n let root = '';\n for (const raw of roots) {\n const r = keyOf(raw);\n // A bare `/`, `C:` or `\\\\` root would claim every path on the machine.\n if (r.length > root.length && !/^(?:[a-z]:)?$/.test(r) && (key === r || key.startsWith(`${r}/`))) root = r;\n }\n const own = path.replace(/[\\\\/]+$/, '');\n // Inside a root: the rest of the path, or — for the root itself — its name.\n if (root) {\n const rest = key.length - root.length - 1;\n return rest > 0 ? own.slice(own.length - rest) : own.slice(Math.max(own.lastIndexOf('/'), own.lastIndexOf('\\\\')) + 1);\n }\n if (!/^(?:[\\\\/]|[A-Za-z]:[\\\\/])/.test(path)) return path.replace(/^\\.[\\\\/]/, '');\n const sep = path.includes('/') ? '/' : '\\\\';\n const parts = path.replace(/^[A-Za-z]:/, '').split(/[\\\\/]/).filter(Boolean);\n return parts.length > 4 ? `…${sep}${parts.slice(-3).join(sep)}` : path;\n}\n\n/**\n * The file a tool call names, when it runs no command — a shell call keeps\n * its command line verbatim (rewriting a command is not display).\n */\nexport function inputPath(input: unknown): string | null {\n const rec = input !== null && typeof input === 'object' ? input as Record<string, unknown> : null;\n return rec && typeof rec.command !== 'string' && typeof rec.cmd !== 'string' ? pathsIn(rec)[0] ?? null : null;\n}\n\n/** `displayPath` bound to the roots in context. */\nexport function useDisplayPath(): (path: string) => string {\n const roots = useContext(PathRootsContext);\n return useCallback((path: string) => displayPath(path, roots), [roots]);\n}\n","/**\n * The live line sits where the caret used to: under the running turn, on\n * the reading measure, in tertiary text with tabular figures. Colour means\n * state only — the running pulse — and a notice is a 2px rule in the warning\n * colour with its kind in words (DESIGN §6: never colour alone).\n */\n.live {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n min-width: 0;\n}\n\n.line {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n min-height: var(--control-h-sm);\n min-width: 0;\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n}\n\n.pulse {\n width: 8px;\n height: 8px;\n flex: none;\n border-radius: var(--radius-full);\n background: var(--status-running-solid);\n animation: live-pulse 1.4s var(--ease-standard) infinite;\n}\n.live[data-phase='waiting'] .pulse { background: var(--border-strong); }\n\n.text {\n display: inline-flex;\n align-items: baseline;\n gap: var(--space-2);\n min-width: 0;\n flex: 1 1 auto;\n overflow: hidden;\n white-space: nowrap;\n}\n.word { color: var(--text-secondary); font-weight: var(--font-weight-medium); }\n.sep { color: var(--text-tertiary); }\n.figure {\n font-family: var(--font-display);\n font-variant-numeric: tabular-nums;\n}\n.detail {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n}\n\n.stop {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n min-height: var(--control-h-xs);\n padding: 0 var(--space-2);\n border: 1px solid transparent;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n cursor: pointer;\n transition: color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard);\n}\n.stop:hover { color: var(--text-primary); background: var(--bg-hover); border-color: var(--border-default); }\n.stop:active { background: var(--bg-active); }\n.stopIcon {\n width: 8px;\n height: 8px;\n border-radius: 1px;\n background: currentColor;\n}\n\n.notice {\n display: flex;\n gap: var(--space-2);\n margin: 0;\n padding-left: var(--space-3);\n border-left: 2px solid var(--status-warning-solid);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n overflow-wrap: anywhere;\n}\n.notice[data-kind='preflight'] { border-left-color: var(--status-info-solid); }\n.noticeWord { color: var(--status-warning-fg); font-weight: var(--font-weight-medium); white-space: nowrap; }\n.notice[data-kind='preflight'] .noticeWord { color: var(--status-info-fg); }\n.noticeText { min-width: 0; }\n\n@keyframes live-pulse { 50% { opacity: 0.3; } }\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .pulse { animation: none; }\n}\n:root[data-motion=\"reduce\"] .pulse { animation: none; }\n\n@media (max-width: 480px) {\n /* 3.10: one line above the composer, beside the tasks chip — the text\n ellipsises (its detail first) rather than wrapping Stop onto a row of\n its own. */\n .line { flex-wrap: nowrap; }\n}\n","/**\n * routes/verse/chat/LiveStatus.tsx — the line under a running turn (V3.10):\n *\n * ● Running · 14s · npm test Stop\n * ● Writing · 1m 3s · 38 tok/s Stop\n *\n * It replaces the bare caret that used to be the ONLY live signal: a turn\n * that had been silently retrying an overloaded API for four minutes looked\n * exactly like one that was about to answer.\n *\n * Sources, best first:\n * 1. transient `progress` frames (phase, server-measured elapsed, tok/s);\n * 2. the transcript itself — a pending tool call means \"running that\n * tool\", a streaming bubble means \"writing\" — so a server that sends no\n * progress frames still gets an honest line;\n * 3. the turn's own start stamp for the clock.\n * A figure nobody measured (tok/s, the tool) is left out, never guessed.\n *\n * Under it, when the engine says so, one plumbing notice: an API retry, a\n * failed preflight (e.g. Ollama not answering), or the no-output watchdog.\n * It clears itself once output resumes (verse-store livePersisted).\n *\n * Accessibility: the visible line ticks every second, so it is NOT a live\n * region; a visually hidden status announces only phase/tool changes, and a\n * notice is announced once when it appears.\n */\nimport { memo, useEffect, useState } from 'react';\nimport type { VerseProgressPhase, VerseStatusKind } from '../../../../core/verse/types.js';\nimport { summarizeToolInput } from '../verse-model.js';\nimport type { TranscriptItem, VerseLiveState } from '../verse-store.js';\nimport { inputPath, useDisplayPath } from './path-display.js';\nimport styles from './LiveStatus.module.css';\n\nexport interface LivePhase {\n phase: VerseProgressPhase;\n /** What the phase is about: the running command/path, when known. */\n detail: string | null;\n /** 3.10.1: the file the running call names, drawn relative to the chat's roots. */\n path?: string | null;\n}\n\n/**\n * What the transcript says the running turn is doing right now — the\n * fallback for a server that sends no `progress` frames, and the source of\n * the tool's human-readable argument even when one does.\n */\nexport function derivePhaseFromTranscript(items: readonly TranscriptItem[], live: Pick<VerseLiveState, 'thinking'>): LivePhase {\n for (let i = items.length - 1; i >= 0; i -= 1) {\n const item = items[i]!;\n if (item.kind === 'user') break;\n if (item.kind === 'tool') {\n if (item.result === null) return { phase: 'tool', detail: summarizeToolInput(item.input) || item.name, path: inputPath(item.input) };\n break;\n }\n if (item.kind === 'assistant' && item.streaming) return { phase: 'writing', detail: null };\n if (item.kind === 'assistant' || item.kind === 'thinking') break;\n }\n if (live.thinking) return { phase: 'thinking', detail: null };\n return { phase: 'waiting', detail: null };\n}\n\nconst PHASE_WORD: Record<VerseProgressPhase, string> = {\n thinking: 'Thinking',\n tool: 'Running',\n writing: 'Writing',\n waiting: 'Waiting',\n};\n\nconst NOTICE_WORD: Record<VerseStatusKind, string> = {\n retry: 'Retrying',\n preflight: 'Preflight',\n watchdog: 'Still running',\n};\n\n/** \"14s\" / \"1m 3s\" / \"1h 2m\". */\nexport function formatLiveElapsed(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) return '0s';\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${s % 60}s`;\n return `${Math.floor(m / 60)}h ${m % 60}m`;\n}\n\nexport interface LiveStatusLine {\n phase: VerseProgressPhase;\n word: string;\n elapsedMs: number | null;\n detail: string | null;\n rate: string | null;\n}\n\n/** Pure: the parts of the line at clock time `now` (exported for tests). */\nexport function liveStatusLine(live: VerseLiveState, derived: LivePhase, now: number): LiveStatusLine {\n const progress = live.progress;\n // The transcript knows a tool call is pending before (or without) a\n // progress frame saying so, and it knows the call's argument; a progress\n // frame knows about reasoning and waiting, which the transcript cannot see.\n const phase: VerseProgressPhase = derived.phase === 'tool' || derived.phase === 'writing'\n ? derived.phase\n : progress?.phase ?? derived.phase;\n const elapsedMs = progress\n ? progress.elapsedMs + Math.max(0, now - progress.receivedAt)\n : live.startedAt !== null ? Math.max(0, now - live.startedAt) : null;\n const detail = phase === 'tool' ? derived.detail ?? progress?.tool ?? null : null;\n const tps = progress?.tokPerSec ?? null;\n const rate = (phase === 'writing' || phase === 'thinking') && tps !== null && tps > 0 ? `${tps >= 10 ? Math.round(tps) : tps.toFixed(1)} tok/s` : null;\n return { phase, word: PHASE_WORD[phase], elapsedMs, detail, rate };\n}\n\nexport interface LiveStatusProps {\n live: VerseLiveState;\n derived: LivePhase;\n onStop?: () => void;\n /**\n * 3.10: above the composer the engine's notice goes to the notice slot\n * (one notice at a time, in priority order), so the line omits it.\n */\n showNotice?: boolean;\n}\n\nexport const LiveStatus = memo(function LiveStatus({ live, derived, onStop, showNotice = true }: LiveStatusProps) {\n const [now, setNow] = useState(() => Date.now());\n // The clock only; never a request. Re-armed per turn.\n useEffect(() => {\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [live.turnId]);\n\n const show = useDisplayPath();\n const computed = liveStatusLine(live, derived, now);\n // A running Read names its file as the transcript does — relative, not the\n // head of an absolute path (chat/path-display.ts); the full path is the title.\n const line = computed.phase === 'tool' && derived.path ? { ...computed, detail: show(derived.path) } : computed;\n const spoken = line.detail ? `${line.word}: ${line.detail}` : line.word;\n const notice = showNotice ? live.notice : null;\n\n return (\n <div className={styles.live} data-phase={line.phase}>\n <div className={styles.line}>\n <span className={styles.pulse} aria-hidden=\"true\" />\n <span className={styles.text} aria-hidden=\"true\">\n <span className={styles.word}>{line.word}</span>\n {line.elapsedMs !== null ? <><span className={styles.sep}>·</span><span className={styles.figure}>{formatLiveElapsed(line.elapsedMs)}</span></> : null}\n {line.detail ? <><span className={styles.sep}>·</span><span className={styles.detail} title={derived.path ?? line.detail}>{line.detail}</span></> : null}\n {line.rate ? <><span className={styles.sep}>·</span><span className={styles.figure}>{line.rate}</span></> : null}\n </span>\n <span className=\"visually-hidden\" role=\"status\">{spoken}</span>\n {onStop ? (\n <button type=\"button\" className={styles.stop} onClick={onStop} aria-label=\"Stop this turn\" title=\"Stop this turn (⌘.)\">\n <span className={styles.stopIcon} aria-hidden=\"true\" />Stop\n </button>\n ) : null}\n </div>\n {notice ? (\n <p className={styles.notice} data-kind={notice.kind} role=\"status\">\n <span className={styles.noticeWord}>{NOTICE_WORD[notice.kind]}</span>\n <span className={styles.noticeText}>{notice.message}</span>\n </p>\n ) : null}\n </div>\n );\n});\n","/**\n * routes/verse/chat/LiveTimer.tsx — \"12s\", counting, for anything running\n * (unit C2): a pending tool row, an activity group, a running chat in the\n * sidebar, a task in the Tasks pane.\n *\n * ONE shared one-second clock for every timer on the page. A long session\n * can show dozens of running rows at once (a group of parallel tool calls,\n * the sidebar's running chats, the tasks list); a `setInterval` each would\n * be dozens of timers re-rendering out of phase. Subscribers join a single\n * interval that exists only while at least one of them is mounted, and all\n * of them tick on the same beat.\n *\n * It is a clock, never a request (SPEC-310A §0: no polling faster than 2 s —\n * this polls nothing).\n */\nimport { useSyncExternalStore } from 'react';\nimport { formatLiveElapsed } from './LiveStatus.js';\n\nconst listeners = new Set<() => void>();\nlet timer: ReturnType<typeof setInterval> | null = null;\nlet now = Date.now();\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n if (timer === null) {\n now = Date.now();\n timer = setInterval(() => {\n now = Date.now();\n for (const l of [...listeners]) l();\n }, 1000);\n }\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0 && timer !== null) {\n clearInterval(timer);\n timer = null;\n }\n };\n}\n\nfunction snapshot(): number {\n return now;\n}\n\nconst idle = () => () => {};\n// A constant: useSyncExternalStore requires a stable snapshot between\n// renders, and `Date.now` as a snapshot would loop.\nconst idleSnapshot = () => 0;\n\n/**\n * The shared clock (ms). While `active` is false the component does not\n * subscribe at all — a settled row costs nothing — and reads the wall clock\n * once per render instead.\n */\nexport function useSecondClock(active = true): number {\n const tick = useSyncExternalStore(active ? subscribe : idle, active ? snapshot : idleSnapshot, active ? snapshot : idleSnapshot);\n // A freshly mounted subscriber must not show the clock as it stood when the\n // previous beat fired (up to a second stale): take the later of the two.\n return Math.max(tick, Date.now());\n}\n\n/** Parse an ISO stamp or client-clock ms into ms; null when unusable. */\nexport function startMs(since: string | number | null | undefined): number | null {\n if (typeof since === 'number') return Number.isFinite(since) ? since : null;\n if (typeof since !== 'string') return null;\n const ms = Date.parse(since);\n return Number.isFinite(ms) ? ms : null;\n}\n\nexport interface LiveTimerProps {\n /** ISO start stamp or client-clock ms. Unparseable → renders nothing (an unknown start is not \"0s\"). */\n since: string | number | null | undefined;\n className?: string;\n /** Spoken label prefix, e.g. \"running for\". Omit to hide the timer from assistive tech (it ticks every second). */\n label?: string;\n}\n\nexport function LiveTimer({ since, className, label }: LiveTimerProps) {\n const start = startMs(since);\n const clock = useSecondClock(start !== null);\n if (start === null) return null;\n const text = formatLiveElapsed(Math.max(0, clock - start));\n return (\n <span className={className} data-live-timer=\"\" aria-hidden={label ? undefined : true}\n aria-label={label ? `${label} ${text}` : undefined} role={label ? 'timer' : undefined}>\n {text}\n </span>\n );\n}\n","/**\n * routes/verse/dock/dock-icons.tsx — the chat surface's own 16px glyphs\n * (unit C2): the dock's pane tabs and the header's pane toggles, the ⋯\n * menu, pin and archive. Same drawing grammar as components/primitives/icons\n * (16-unit box, 1.5 stroke, round caps, currentColor) so they sit beside the\n * shared set without looking borrowed; kept here because verse-icons.tsx is\n * the shell's file.\n */\nimport type { ReactNode, SVGProps } from 'react';\nimport type { DockPaneId } from '../shell/dock-catalog.js';\n\nexport interface GlyphProps extends Omit<SVGProps<SVGSVGElement>, 'children' | 'viewBox'> {\n size?: number;\n}\n\nfunction Glyph({ size = 16, children, ...rest }: GlyphProps & { children: ReactNode }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}\n strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" focusable=\"false\" {...rest}>\n {children}\n </svg>\n );\n}\n\nexport function TerminalGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"m4.5 6.25 2 1.75-2 1.75M8.25 10h3\" /></Glyph>;\n}\n\nexport function PreviewGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"M1.75 5.75h12.5M4 4.25h.01M5.75 4.25h.01\" /></Glyph>;\n}\n\nexport function ReviewGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M5 2.5v5M2.5 5h5M9 11h4.5\" /><path d=\"M11.5 2.5 4.5 13.5\" /></Glyph>;\n}\n\nexport function TasksGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M6.5 4h7M6.5 8h7M6.5 12h7\" /><path d=\"m2.25 4 1 1 1.5-2M2.5 8h1.75M2.5 12h1.75\" /></Glyph>;\n}\n\nexport function ContextGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"m8 2 6 3-6 3-6-3 6-3Z\" /><path d=\"m2 8 6 3 6-3M2 11l6 3 6-3\" /></Glyph>;\n}\n\nexport function SplitGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"2.25\" y=\"2.25\" width=\"11.5\" height=\"11.5\" rx=\"1.5\" /><path d=\"M2.25 8h11.5\" /></Glyph>;\n}\n\nexport function CloseGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"m4 4 8 8M12 4l-8 8\" /></Glyph>;\n}\n\nexport function MoreGlyph(p: GlyphProps) {\n return (\n <Glyph {...p}>\n <circle cx=\"3.5\" cy=\"8\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"8\" cy=\"8\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12.5\" cy=\"8\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\" />\n </Glyph>\n );\n}\n\nexport function PinGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M9.75 2.25 13.75 6.25 11 7.5 8.5 10l.25 2.75-5-5L6.5 8 9 5.25Z\" /><path d=\"m5 11-2.75 2.75\" /></Glyph>;\n}\n\nexport function ArchiveGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"3\" rx=\"1\" /><path d=\"M2.75 5.75v6.5a1 1 0 0 0 1 1h8.5a1 1 0 0 0 1-1v-6.5M6.5 8.5h3\" /></Glyph>;\n}\n\nexport function RenameGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M10.5 2.75 13.25 5.5 6 12.75H3.25V10Z\" /></Glyph>;\n}\n\nexport function HandoffGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M2.5 8h9M8.5 4.5 12 8l-3.5 3.5\" /><path d=\"M13.75 3v10\" /></Glyph>;\n}\n\nexport function CopyGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.5\" /><path d=\"M10.75 5.25V3.75a1.5 1.5 0 0 0-1.5-1.5h-5.5a1.5 1.5 0 0 0-1.5 1.5v5.5a1.5 1.5 0 0 0 1.5 1.5h1.5\" /></Glyph>;\n}\n\nexport function TrashGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M2.75 4.25h10.5M6.25 4.25V2.75h3.5v1.5M4.25 4.25l.6 9h6.3l.6-9\" /></Glyph>;\n}\n\nexport const DOCK_PANE_GLYPH: Readonly<Record<DockPaneId, (p: GlyphProps) => ReactNode>> = {\n terminal: TerminalGlyph,\n preview: PreviewGlyph,\n diff: ReviewGlyph,\n tasks: TasksGlyph,\n context: ContextGlyph,\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{_ as e,c as t}from"./format-BmH2yWL6.js";function n(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function r(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:null}function i(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:null}function a(e,t){let n=i(e,t);return n===null?null:Math.max(0,Math.round(n))}function o(e,t){let n=e[t];return typeof n==`boolean`?n:null}function s(e,t){let n=e[t];return Array.isArray(n)?n.filter(e=>typeof e==`string`):[]}var c=[`llama-server`,`ollama`,`vllm`,`unknown`],l=[`running`,`starting`,`stopping`,`stopped`,`unknown`],u=[`queued`,`running`,`finishing`],d=[`off`,`config`,`env`,`config+env`,`latch`,`unknown`];function f(e,t,n,r){let i=e[t];return typeof i==`string`&&n.includes(i)?i:r}function p(e){let t=n(e);return t?{capable:o(t,`capable`),refusal:r(t,`refusal`),slots:a(t,`slots`)}:{capable:null,refusal:null,slots:null}}var m={up:`running`,down:`stopped`,loading:`starting`,unknown:`unknown`};function h(e){let t=e.state;if(typeof t!=`string`||!(t in m))return null;let i=n(e.slots),s=r(e,`host`),c=a(e,`port`),l=i?a(i,`configured`):null,u=i?a(i,`busy`):null,d=i?r(i,`source`):null,f=d!==null&&d!==`unknown`,p=f?l:null,h=r(e,`parallelRefusal`),_=r(e,`runtimeKind`),v=a(e,`contextPerSlot`),y=a(e,`contextTotal`);return{kind:_===`ollama`?`ollama`:_===`unknown`?`unknown`:`llama-server`,state:m[t]??`unknown`,endpoint:s!==null&&c!==null?`${s}:${c}`:r(e,`origin`)??null,model:g(r(e,`modelName`))??g(r(e,`model`)),slotsTotal:p,slotsBusy:f?u:null,contextTokens:v??(p!==null&&p>0&&y!==null&&y>0?Math.floor(y/p):null),startedAt:r(e,`startedAt`),parallel:{capable:h===null?f&&p!==null?!0:null:!1,refusal:h,slots:p},reason:r(e,`lastError`),supervised:o(e,`managed`)??!1,sampledAt:r(e,`checkedAt`)}}function g(e){if(e===null||e.length===0)return null;let t=e.split(`/`).pop()??e;return t.length===0||/^sha256[-:][0-9a-f]{16,}$/i.test(t)?null:t}function _(e){let t=n(e);if(!t)return null;if(!(`kind`in t)&&`slots`in t&&`state`in t){let e=h(t);if(e!==null)return e}return{kind:f(t,`kind`,c,`unknown`),state:f(t,`state`,l,`unknown`),endpoint:r(t,`endpoint`),model:r(t,`model`),slotsTotal:a(t,`slotsTotal`),slotsBusy:a(t,`slotsBusy`),contextTokens:a(t,`contextTokens`),startedAt:r(t,`startedAt`),parallel:p(t.parallel),reason:r(t,`reason`),supervised:o(t,`supervised`)??!1,sampledAt:r(t,`sampledAt`)}}function v(e){let t=n(e);if(!t)return null;let i=r(t,`id`);return i===null?null:{id:i,task:r(t,`task`),repo:r(t,`repo`),engine:r(t,`engine`),model:r(t,`model`),state:f(t,`state`,u,`running`),startedAt:r(t,`startedAt`),slot:a(t,`slot`)}}function y(e){let t=n(e);return t?{agents:(Array.isArray(t.agents)?t.agents:[]).map(v).filter(e=>e!==null),queueDepth:a(t,`queueDepth`),slotsTotal:a(t,`slotsTotal`),slotsBusy:a(t,`slotsBusy`),notes:s(t,`notes`),sampledAt:r(t,`sampledAt`)}:null}function b(e){let t=n(e);if(!t)return null;let i=r(t,`engine`);return i===null?null:{engine:i,reason:r(t,`reason`)??`The dispatcher refuses this engine while local-only is on.`}}var x=new Set([`env`,`config+env`,`latch`,`unknown`]);function S(e){let t=n(e);if(!t)return null;let i=Array.isArray(t.refuses)?t.refuses:[],a=f(t,`source`,d,`unknown`);return{enabled:o(t,`enabled`)??!1,source:a,refuses:i.map(b).filter(e=>e!==null),mutable:x.has(a)?!1:o(t,`mutable`)??!1,detail:r(t,`detail`),sampledAt:r(t,`sampledAt`)??r(t,`checkedAt`)}}function C(e){switch(e){case`llama-server`:return`llama-server`;case`ollama`:return`Ollama`;case`vllm`:return`vLLM`;default:return`the serving runtime`}}function w(e){if(e===null)return{verdict:`unknown`,effectiveConcurrency:null,configuredSlots:null,overstated:!1,headline:`No serving runtime reported`,detail:`Serving runtime unavailable — concurrency unknown.`,tone:`unknown`};let t=e.slotsTotal??e.parallel.slots,n=C(e.kind);if(e.state!==`running`)return{verdict:`offline`,effectiveConcurrency:null,configuredSlots:t,overstated:!1,headline:e.state===`stopped`?`Not serving`:`Serving runtime is ${e.state}`,detail:e.state===`stopped`?`${n} is not running, so no local agent can take a turn. Start it before dispatching a fleet.`:`${n} is ${e.state}; capacity is not settled until it reports running.`,tone:e.state===`stopped`?`neutral`:`warning`};if(e.parallel.capable===!1){let e=t!==null&&t>1;return{verdict:`serialized`,effectiveConcurrency:1,configuredSlots:t,overstated:e,headline:`${n} serializes requests`,detail:e?`${n} has ${t} slots configured but runs one request at a time for this model, so the real capacity is one agent. The other ${t-1} would queue, and a queue looks like slowness rather than a wait.`:`${n} runs one request at a time for this model. A second agent waits for the first to finish.`,tone:`danger`}}return e.parallel.capable===null?{verdict:`unknown`,effectiveConcurrency:null,configuredSlots:t,overstated:!1,headline:`Batching not confirmed`,detail:`${n} is running${t===null?``:` with ${t} slots configured`}, but it has not reported whether it batches concurrent requests for this model. Until it does, this panel will not quote a concurrency it cannot stand behind.`,tone:`unknown`}:t===null?{verdict:`batched`,effectiveConcurrency:null,configuredSlots:null,overstated:!1,headline:`${n} batches concurrent requests`,detail:`${n} batches, but reported no slot count, so the ceiling on concurrent agents is unknown.`,tone:`unknown`}:{verdict:`batched`,effectiveConcurrency:t,configuredSlots:t,overstated:!1,headline:`${t} agent${t===1?``:`s`} in parallel`,detail:`${n} batches across ${t} slot${t===1?``:`s`} sharing one copy of the weights, so ${t} agent${t===1?``:`s`} can be mid-turn at once.`,tone:`success`}}var T=[{runtime:`Ollama`,perRequestSeconds:[3.7,7.6,11.4,15.2],wallSeconds:15.2,verdict:`staggered — the requests queued`},{runtime:`llama-server`,perRequestSeconds:[8.6,8.9,9,9],wallSeconds:9.1,verdict:`together — the requests batched`}];function E(t,n){if(t===null||n===null||n<=0)return{busy:t,total:n,percent:null,percentText:null,saturated:!1,label:t===null?`Slot occupancy is not reported.`:`${t} in flight; the number of slots is not known, so occupancy cannot be drawn.`};let r=Math.min(t,n)/n*100,i=Math.round(r),a=t>=n;return{busy:t,total:n,percent:i,percentText:e(r),saturated:a,label:a?`All ${n} slot${n===1?``:`s`} busy — new turns wait for one to free up.`:`${t} of ${n} slot${n===1?``:`s`} busy.`}}function D(e,t,n){if(e===null)return{state:`unknown`,headline:`Fleet not reported`,detail:`Fleet status unavailable.`,tone:`unknown`};let r=e.agents.filter(e=>e.state!==`queued`).length,i=e.queueDepth??e.agents.filter(e=>e.state===`queued`).length;return i>0?{state:`queued`,headline:`${i} waiting for a slot`,detail:n.verdict===`serialized`?`${r} turn${r===1?``:`s`} in flight and ${i} queued. This runtime serializes, so the queue drains one at a time — the wait is a wait, not slow inference.`:`${r} turn${r===1?``:`s`} in flight and ${i} queued behind ${t.total===null?`the available slots`:`${t.total} slots`}. Queued turns have not started; their wall time is queueing, not work.`,tone:`warning`}:r===0?{state:`idle`,headline:`Nothing in flight`,detail:`No agent is mid-turn.`,tone:`neutral`}:t.saturated?{state:`saturated`,headline:`All slots busy · ${r} in flight`,detail:`Every slot is working and nothing is queued behind them. The next turn will wait, but none is waiting yet.`,tone:`running`}:{state:`working`,headline:`${r} in flight`,detail:t.label,tone:`running`}}var O=`Refused: local-only is on and this engine is not local.`;function k(e,t){let n=t.filter(e=>e.engine!==`local`),r=t.filter(e=>e.engine===`local`),i=new Map;for(let t of e?.refuses??[])i.set(t.engine,t.reason);return{blocked:n,allowed:r,refusalFor:e=>i.get(e)??O,summary:t.length===0?`No seats are configured, so there is nothing for this policy to block yet.`:n.length===0?`Every one of your ${t.length} seat${t.length===1?``:`s`} is local, so this policy would block nothing today.`:`${n.length} of ${t.length} seat${t.length===1?``:`s`} would become unreachable; ${r.length} local seat${r.length===1?``:`s`} would keep working.`}}function A(e){if(e===null)return null;if(e.detail!==null)return e.detail;switch(e.source){case`env`:case`config+env`:return`This policy is pinned by an environment variable on the server process, so it cannot be changed from here — restart the server without it to take the switch back.`;case`latch`:return`This process already observed a persisted local-only and has pinned it for its own lifetime, so turning it off takes effect for new dispatches but not for the seams that latched. Restart the server to clear it.`;case`config`:return`Stored in the hub config and applied on the next dispatch.`;case`off`:return`Not configured; cloud engines are reachable.`;default:return`The server did not say where this setting came from.`}}function j(e,n){if(!e)return`—`;let r=Date.parse(e);return Number.isNaN(r)?`—`:t(Math.max(0,n-r))}function M(e,n){if(!e)return`—`;let r=Date.parse(e);return Number.isNaN(r)?`—`:`up ${t(Math.max(0,n-r))}`}function N(e){let t={running:0,finishing:1,queued:2};return[...e].sort((e,n)=>{let r=t[e.state]-t[n.state];if(r!==0)return r;let i=e.startedAt?Date.parse(e.startedAt):NaN,a=n.startedAt?Date.parse(n.startedAt):NaN;return Number.isNaN(i)&&Number.isNaN(a)?e.id.localeCompare(n.id):Number.isNaN(i)?1:Number.isNaN(a)?-1:i-a})}export{k as a,y as c,w as d,C as f,M as i,S as l,j as n,A as o,E as p,D as r,N as s,T as t,_ as u};
2
- //# sourceMappingURL=fleet-model-DOK8ZtEt.js.map
1
+ import{_ as e,c as t}from"./format-CH4g_sl1.js";function n(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function r(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:null}function i(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:null}function a(e,t){let n=i(e,t);return n===null?null:Math.max(0,Math.round(n))}function o(e,t){let n=e[t];return typeof n==`boolean`?n:null}function s(e,t){let n=e[t];return Array.isArray(n)?n.filter(e=>typeof e==`string`):[]}var c=[`llama-server`,`ollama`,`vllm`,`unknown`],l=[`running`,`starting`,`stopping`,`stopped`,`unknown`],u=[`queued`,`running`,`finishing`],d=[`off`,`config`,`env`,`config+env`,`latch`,`unknown`];function f(e,t,n,r){let i=e[t];return typeof i==`string`&&n.includes(i)?i:r}function p(e){let t=n(e);return t?{capable:o(t,`capable`),refusal:r(t,`refusal`),slots:a(t,`slots`)}:{capable:null,refusal:null,slots:null}}var m={up:`running`,down:`stopped`,loading:`starting`,unknown:`unknown`};function h(e){let t=e.state;if(typeof t!=`string`||!(t in m))return null;let i=n(e.slots),s=r(e,`host`),c=a(e,`port`),l=i?a(i,`configured`):null,u=i?a(i,`busy`):null,d=i?r(i,`source`):null,f=d!==null&&d!==`unknown`,p=f?l:null,h=r(e,`parallelRefusal`),_=r(e,`runtimeKind`),v=a(e,`contextPerSlot`),y=a(e,`contextTotal`);return{kind:_===`ollama`?`ollama`:_===`unknown`?`unknown`:`llama-server`,state:m[t]??`unknown`,endpoint:s!==null&&c!==null?`${s}:${c}`:r(e,`origin`)??null,model:g(r(e,`modelName`))??g(r(e,`model`)),slotsTotal:p,slotsBusy:f?u:null,contextTokens:v??(p!==null&&p>0&&y!==null&&y>0?Math.floor(y/p):null),startedAt:r(e,`startedAt`),parallel:{capable:h===null?f&&p!==null?!0:null:!1,refusal:h,slots:p},reason:r(e,`lastError`),supervised:o(e,`managed`)??!1,sampledAt:r(e,`checkedAt`)}}function g(e){if(e===null||e.length===0)return null;let t=e.split(`/`).pop()??e;return t.length===0||/^sha256[-:][0-9a-f]{16,}$/i.test(t)?null:t}function _(e){let t=n(e);if(!t)return null;if(!(`kind`in t)&&`slots`in t&&`state`in t){let e=h(t);if(e!==null)return e}return{kind:f(t,`kind`,c,`unknown`),state:f(t,`state`,l,`unknown`),endpoint:r(t,`endpoint`),model:r(t,`model`),slotsTotal:a(t,`slotsTotal`),slotsBusy:a(t,`slotsBusy`),contextTokens:a(t,`contextTokens`),startedAt:r(t,`startedAt`),parallel:p(t.parallel),reason:r(t,`reason`),supervised:o(t,`supervised`)??!1,sampledAt:r(t,`sampledAt`)}}function v(e){let t=n(e);if(!t)return null;let i=r(t,`id`);return i===null?null:{id:i,task:r(t,`task`),repo:r(t,`repo`),engine:r(t,`engine`),model:r(t,`model`),state:f(t,`state`,u,`running`),startedAt:r(t,`startedAt`),slot:a(t,`slot`)}}function y(e){let t=n(e);return t?{agents:(Array.isArray(t.agents)?t.agents:[]).map(v).filter(e=>e!==null),queueDepth:a(t,`queueDepth`),slotsTotal:a(t,`slotsTotal`),slotsBusy:a(t,`slotsBusy`),notes:s(t,`notes`),sampledAt:r(t,`sampledAt`)}:null}function b(e){let t=n(e);if(!t)return null;let i=r(t,`engine`);return i===null?null:{engine:i,reason:r(t,`reason`)??`The dispatcher refuses this engine while local-only is on.`}}var x=new Set([`env`,`config+env`,`latch`,`unknown`]);function S(e){let t=n(e);if(!t)return null;let i=Array.isArray(t.refuses)?t.refuses:[],a=f(t,`source`,d,`unknown`);return{enabled:o(t,`enabled`)??!1,source:a,refuses:i.map(b).filter(e=>e!==null),mutable:x.has(a)?!1:o(t,`mutable`)??!1,detail:r(t,`detail`),sampledAt:r(t,`sampledAt`)??r(t,`checkedAt`)}}function C(e){switch(e){case`llama-server`:return`llama-server`;case`ollama`:return`Ollama`;case`vllm`:return`vLLM`;default:return`the serving runtime`}}function w(e){if(e===null)return{verdict:`unknown`,effectiveConcurrency:null,configuredSlots:null,overstated:!1,headline:`No serving runtime reported`,detail:`Serving runtime unavailable — concurrency unknown.`,tone:`unknown`};let t=e.slotsTotal??e.parallel.slots,n=C(e.kind);if(e.state!==`running`)return{verdict:`offline`,effectiveConcurrency:null,configuredSlots:t,overstated:!1,headline:e.state===`stopped`?`Not serving`:`Serving runtime is ${e.state}`,detail:e.state===`stopped`?`${n} is not running, so no local agent can take a turn. Start it before dispatching a fleet.`:`${n} is ${e.state}; capacity is not settled until it reports running.`,tone:e.state===`stopped`?`neutral`:`warning`};if(e.parallel.capable===!1){let e=t!==null&&t>1;return{verdict:`serialized`,effectiveConcurrency:1,configuredSlots:t,overstated:e,headline:`${n} serializes requests`,detail:e?`${n} has ${t} slots configured but runs one request at a time for this model, so the real capacity is one agent. The other ${t-1} would queue, and a queue looks like slowness rather than a wait.`:`${n} runs one request at a time for this model. A second agent waits for the first to finish.`,tone:`danger`}}return e.parallel.capable===null?{verdict:`unknown`,effectiveConcurrency:null,configuredSlots:t,overstated:!1,headline:`Batching not confirmed`,detail:`${n} is running${t===null?``:` with ${t} slots configured`}, but it has not reported whether it batches concurrent requests for this model. Until it does, this panel will not quote a concurrency it cannot stand behind.`,tone:`unknown`}:t===null?{verdict:`batched`,effectiveConcurrency:null,configuredSlots:null,overstated:!1,headline:`${n} batches concurrent requests`,detail:`${n} batches, but reported no slot count, so the ceiling on concurrent agents is unknown.`,tone:`unknown`}:{verdict:`batched`,effectiveConcurrency:t,configuredSlots:t,overstated:!1,headline:`${t} agent${t===1?``:`s`} in parallel`,detail:`${n} batches across ${t} slot${t===1?``:`s`} sharing one copy of the weights, so ${t} agent${t===1?``:`s`} can be mid-turn at once.`,tone:`success`}}var T=[{runtime:`Ollama`,perRequestSeconds:[3.7,7.6,11.4,15.2],wallSeconds:15.2,verdict:`staggered — the requests queued`},{runtime:`llama-server`,perRequestSeconds:[8.6,8.9,9,9],wallSeconds:9.1,verdict:`together — the requests batched`}];function E(t,n){if(t===null||n===null||n<=0)return{busy:t,total:n,percent:null,percentText:null,saturated:!1,label:t===null?`Slot occupancy is not reported.`:`${t} in flight; the number of slots is not known, so occupancy cannot be drawn.`};let r=Math.min(t,n)/n*100,i=Math.round(r),a=t>=n;return{busy:t,total:n,percent:i,percentText:e(r),saturated:a,label:a?`All ${n} slot${n===1?``:`s`} busy — new turns wait for one to free up.`:`${t} of ${n} slot${n===1?``:`s`} busy.`}}function D(e,t,n){if(e===null)return{state:`unknown`,headline:`Fleet not reported`,detail:`Fleet status unavailable.`,tone:`unknown`};let r=e.agents.filter(e=>e.state!==`queued`).length,i=e.queueDepth??e.agents.filter(e=>e.state===`queued`).length;return i>0?{state:`queued`,headline:`${i} waiting for a slot`,detail:n.verdict===`serialized`?`${r} turn${r===1?``:`s`} in flight and ${i} queued. This runtime serializes, so the queue drains one at a time — the wait is a wait, not slow inference.`:`${r} turn${r===1?``:`s`} in flight and ${i} queued behind ${t.total===null?`the available slots`:`${t.total} slots`}. Queued turns have not started; their wall time is queueing, not work.`,tone:`warning`}:r===0?{state:`idle`,headline:`Nothing in flight`,detail:`No agent is mid-turn.`,tone:`neutral`}:t.saturated?{state:`saturated`,headline:`All slots busy · ${r} in flight`,detail:`Every slot is working and nothing is queued behind them. The next turn will wait, but none is waiting yet.`,tone:`running`}:{state:`working`,headline:`${r} in flight`,detail:t.label,tone:`running`}}var O=`Refused: local-only is on and this engine is not local.`;function k(e,t){let n=t.filter(e=>e.engine!==`local`),r=t.filter(e=>e.engine===`local`),i=new Map;for(let t of e?.refuses??[])i.set(t.engine,t.reason);return{blocked:n,allowed:r,refusalFor:e=>i.get(e)??O,summary:t.length===0?`No seats are configured, so there is nothing for this policy to block yet.`:n.length===0?`Every one of your ${t.length} seat${t.length===1?``:`s`} is local, so this policy would block nothing today.`:`${n.length} of ${t.length} seat${t.length===1?``:`s`} would become unreachable; ${r.length} local seat${r.length===1?``:`s`} would keep working.`}}function A(e){if(e===null)return null;if(e.detail!==null)return e.detail;switch(e.source){case`env`:case`config+env`:return`This policy is pinned by an environment variable on the server process, so it cannot be changed from here — restart the server without it to take the switch back.`;case`latch`:return`This process already observed a persisted local-only and has pinned it for its own lifetime, so turning it off takes effect for new dispatches but not for the seams that latched. Restart the server to clear it.`;case`config`:return`Stored in the hub config and applied on the next dispatch.`;case`off`:return`Not configured; cloud engines are reachable.`;default:return`The server did not say where this setting came from.`}}function j(e,n){if(!e)return`—`;let r=Date.parse(e);return Number.isNaN(r)?`—`:t(Math.max(0,n-r))}function M(e,n){if(!e)return`—`;let r=Date.parse(e);return Number.isNaN(r)?`—`:`up ${t(Math.max(0,n-r))}`}function N(e){let t={running:0,finishing:1,queued:2};return[...e].sort((e,n)=>{let r=t[e.state]-t[n.state];if(r!==0)return r;let i=e.startedAt?Date.parse(e.startedAt):NaN,a=n.startedAt?Date.parse(n.startedAt):NaN;return Number.isNaN(i)&&Number.isNaN(a)?e.id.localeCompare(n.id):Number.isNaN(i)?1:Number.isNaN(a)?-1:i-a})}export{k as a,y as c,w as d,C as f,M as i,S as l,j as n,A as o,E as p,D as r,N as s,T as t,_ as u};
2
+ //# sourceMappingURL=fleet-model-BvDR3gjp.js.map