@ashlr/hub 3.11.3 → 3.12.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 (558) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +44 -18
  3. package/dist/authority-surface.json +74 -59
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/authority.d.ts +39 -0
  6. package/dist/cli/authority.js +222 -55
  7. package/dist/cli/authority.js.map +1 -1
  8. package/dist/cli/help.js +1 -1
  9. package/dist/cli/help.js.map +1 -1
  10. package/dist/cli/verse.d.ts +3 -0
  11. package/dist/cli/verse.js +10 -0
  12. package/dist/cli/verse.js.map +1 -1
  13. package/dist/core/authority/trust-roots.js +7 -1
  14. package/dist/core/authority/trust-roots.js.map +1 -1
  15. package/dist/core/authority/types.d.ts +2 -2
  16. package/dist/core/cloud/cloud-api.js +1 -1
  17. package/dist/core/cloud/cloud-api.js.map +1 -1
  18. package/dist/core/cloud/delivery-contract.d.ts +1 -1
  19. package/dist/core/cloud/delivery-contract.js +25 -15
  20. package/dist/core/cloud/delivery-contract.js.map +1 -1
  21. package/dist/core/cloud/store.js +6 -0
  22. package/dist/core/cloud/store.js.map +1 -1
  23. package/dist/core/cloud/tracker.d.ts +2 -0
  24. package/dist/core/cloud/tracker.js +140 -37
  25. package/dist/core/cloud/tracker.js.map +1 -1
  26. package/dist/core/cloud/types.d.ts +9 -1
  27. package/dist/core/cloud/types.js.map +1 -1
  28. package/dist/core/comms/dispatch.d.ts +5 -0
  29. package/dist/core/comms/dispatch.js +12 -1
  30. package/dist/core/comms/dispatch.js.map +1 -1
  31. package/dist/core/comms/requests.d.ts +27 -1
  32. package/dist/core/comms/requests.js +50 -1
  33. package/dist/core/comms/requests.js.map +1 -1
  34. package/dist/core/daemon/loop.d.ts +14 -0
  35. package/dist/core/daemon/loop.js +35 -0
  36. package/dist/core/daemon/loop.js.map +1 -1
  37. package/dist/core/fabric/claude-usage.js +23 -1
  38. package/dist/core/fabric/claude-usage.js.map +1 -1
  39. package/dist/core/fleet/dispatch-router.d.ts +7 -0
  40. package/dist/core/fleet/dispatch-router.js +4 -1
  41. package/dist/core/fleet/dispatch-router.js.map +1 -1
  42. package/dist/core/fleet/tick-hooks-live.d.ts +5 -1
  43. package/dist/core/fleet/tick-hooks-live.js +10 -1
  44. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  45. package/dist/core/local-runtime/llama/config.d.ts +14 -0
  46. package/dist/core/local-runtime/llama/config.js +20 -2
  47. package/dist/core/local-runtime/llama/config.js.map +1 -1
  48. package/dist/core/local-runtime/llama/process.d.ts +19 -0
  49. package/dist/core/local-runtime/llama/process.js +67 -17
  50. package/dist/core/local-runtime/llama/process.js.map +1 -1
  51. package/dist/core/local-runtime/llama/supervisor.js +14 -3
  52. package/dist/core/local-runtime/llama/supervisor.js.map +1 -1
  53. package/dist/core/observability/rollup.d.ts +12 -0
  54. package/dist/core/observability/rollup.js +37 -2
  55. package/dist/core/observability/rollup.js.map +1 -1
  56. package/dist/core/observability/usage-source.js +49 -1
  57. package/dist/core/observability/usage-source.js.map +1 -1
  58. package/dist/core/resources/connection-monitor.js +47 -4
  59. package/dist/core/resources/connection-monitor.js.map +1 -1
  60. package/dist/core/resources/engineering-mission-store.d.ts +1 -1
  61. package/dist/core/routing/headroom.js +7 -2
  62. package/dist/core/routing/headroom.js.map +1 -1
  63. package/dist/core/routing/router.d.ts +48 -0
  64. package/dist/core/routing/router.js +129 -13
  65. package/dist/core/routing/router.js.map +1 -1
  66. package/dist/core/run/best-of-n.d.ts +7 -0
  67. package/dist/core/run/best-of-n.js +3 -0
  68. package/dist/core/run/best-of-n.js.map +1 -1
  69. package/dist/core/run/harness-dispatch.d.ts +147 -0
  70. package/dist/core/run/harness-dispatch.js +234 -0
  71. package/dist/core/run/harness-dispatch.js.map +1 -0
  72. package/dist/core/run/orchestrator.js +3 -0
  73. package/dist/core/run/orchestrator.js.map +1 -1
  74. package/dist/core/run/provider-client.d.ts +8 -0
  75. package/dist/core/run/provider-client.js +4 -0
  76. package/dist/core/run/provider-client.js.map +1 -1
  77. package/dist/core/run/sandboxed-engine.d.ts +8 -0
  78. package/dist/core/run/sandboxed-engine.js +60 -7
  79. package/dist/core/run/sandboxed-engine.js.map +1 -1
  80. package/dist/core/types.d.ts +14 -0
  81. package/dist/core/types.js.map +1 -1
  82. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  83. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +188 -6
  84. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +187 -5
  85. package/dist/core/universe/firm-demo.d.ts +1 -1
  86. package/dist/core/universe/firm-graph.d.ts +2 -2
  87. package/dist/core/util/scrub.js +16 -3
  88. package/dist/core/util/scrub.js.map +1 -1
  89. package/dist/core/verse/accounts.d.ts +9 -1
  90. package/dist/core/verse/accounts.js +52 -11
  91. package/dist/core/verse/accounts.js.map +1 -1
  92. package/dist/core/verse/apps-api.d.ts +12 -0
  93. package/dist/core/verse/apps-api.js +22 -4
  94. package/dist/core/verse/apps-api.js.map +1 -1
  95. package/dist/core/verse/apps.js +22 -12
  96. package/dist/core/verse/apps.js.map +1 -1
  97. package/dist/core/verse/local-models.js +3 -7
  98. package/dist/core/verse/local-models.js.map +1 -1
  99. package/dist/core/verse/model-display-name.d.ts +34 -0
  100. package/dist/core/verse/model-display-name.js +125 -0
  101. package/dist/core/verse/model-display-name.js.map +1 -0
  102. package/dist/core/verse/seats.d.ts +11 -2
  103. package/dist/core/verse/seats.js +42 -18
  104. package/dist/core/verse/seats.js.map +1 -1
  105. package/dist/core/verse/transient-events.d.ts +21 -0
  106. package/dist/core/verse/transient-events.js +12 -0
  107. package/dist/core/verse/transient-events.js.map +1 -0
  108. package/dist/core/verse/types.d.ts +6 -13
  109. package/dist/core/verse/types.js +5 -36
  110. package/dist/core/verse/types.js.map +1 -1
  111. package/dist/core/web/public/next/assets/ActionMenu-B4-39f2S.js +2 -0
  112. package/dist/core/web/public/next/assets/{ActionMenu-FxXeRbPx.js.map → ActionMenu-B4-39f2S.js.map} +1 -1
  113. package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js +2 -0
  114. package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js.map +1 -0
  115. package/dist/core/web/public/next/assets/App-E2zCDRxm.js +7 -0
  116. package/dist/core/web/public/next/assets/App-E2zCDRxm.js.map +1 -0
  117. package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js +2 -0
  118. package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js.map +1 -0
  119. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js +2 -0
  120. package/dist/core/web/public/next/assets/{AreaTrend-CDxrQU4b.js.map → AreaTrend-BFimExYn.js.map} +1 -1
  121. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js +2 -0
  122. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js.map +1 -0
  123. package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +1 -0
  124. package/dist/core/web/public/next/assets/AutonomySection-B46igJKR.js +2 -0
  125. package/dist/core/web/public/next/assets/{AutonomySection-DuQkHGD_.js.map → AutonomySection-B46igJKR.js.map} +1 -1
  126. package/dist/core/web/public/next/assets/BranchBar-BRkrEQGs.js +2 -0
  127. package/dist/core/web/public/next/assets/{BranchBar-CLsvOcyK.js.map → BranchBar-BRkrEQGs.js.map} +1 -1
  128. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js +2 -0
  129. package/dist/core/web/public/next/assets/{BudgetControl-TL3FeZ1D.js.map → BudgetControl-T_RjPrw9.js.map} +1 -1
  130. package/dist/core/web/public/next/assets/{Button-HHXgoXGr.js → Button-BhO-WKPp.js} +2 -2
  131. package/dist/core/web/public/next/assets/{Button-HHXgoXGr.js.map → Button-BhO-WKPp.js.map} +1 -1
  132. package/dist/core/web/public/next/assets/CapacityStrip-CkFz5vq2.js +2 -0
  133. package/dist/core/web/public/next/assets/{CapacityStrip-qReu0RaF.js.map → CapacityStrip-CkFz5vq2.js.map} +1 -1
  134. package/dist/core/web/public/next/assets/{useChartWidth-BW6SwYIK.css → ChartFrame-BVuBe6RP.css} +1 -1
  135. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js +2 -0
  136. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js.map +1 -0
  137. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js +3 -0
  138. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js.map +1 -0
  139. package/dist/core/web/public/next/assets/CloudBudgetForm-Bd91iStN.js +2 -0
  140. package/dist/core/web/public/next/assets/CloudBudgetForm-Bd91iStN.js.map +1 -0
  141. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js +2 -0
  142. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js.map +1 -0
  143. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +1 -0
  144. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js +2 -0
  145. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js.map +1 -0
  146. package/dist/core/web/public/next/assets/ConfirmDialog-Bv4hdK2T.js +2 -0
  147. package/dist/core/web/public/next/assets/{ConfirmDialog-DLrLKM0c.js.map → ConfirmDialog-Bv4hdK2T.js.map} +1 -1
  148. package/dist/core/web/public/next/assets/DeleteChatDialog-CH1Ix8Eh.js +2 -0
  149. package/dist/core/web/public/next/assets/DeleteChatDialog-CH1Ix8Eh.js.map +1 -0
  150. package/dist/core/web/public/next/assets/Dialog-BSsIFNqD.js +2 -0
  151. package/dist/core/web/public/next/assets/{Dialog-BS9Dxi3G.js.map → Dialog-BSsIFNqD.js.map} +1 -1
  152. package/dist/core/web/public/next/assets/DiffPane-BpNuJmth.js +2 -0
  153. package/dist/core/web/public/next/assets/{DiffPane-TOmUf3b2.js.map → DiffPane-BpNuJmth.js.map} +1 -1
  154. package/dist/core/web/public/next/assets/DiffViewer-CJarUvs0.js +2 -0
  155. package/dist/core/web/public/next/assets/{DiffViewer-BpH56302.js.map → DiffViewer-CJarUvs0.js.map} +1 -1
  156. package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js +2 -0
  157. package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js.map +1 -0
  158. package/dist/core/web/public/next/assets/{EmptyState-BqR5YAmf.js → EmptyState-DPrd2aak.js} +2 -2
  159. package/dist/core/web/public/next/assets/{EmptyState-BqR5YAmf.js.map → EmptyState-DPrd2aak.js.map} +1 -1
  160. package/dist/core/web/public/next/assets/{Epistemic-dhvDTwAZ.js → Epistemic-D7MxSmED.js} +2 -2
  161. package/dist/core/web/public/next/assets/{Epistemic-dhvDTwAZ.js.map → Epistemic-D7MxSmED.js.map} +1 -1
  162. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js +3 -0
  163. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js.map +1 -0
  164. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js +2 -0
  165. package/dist/core/web/public/next/assets/{Funnel-D2u7Wlzc.js.map → Funnel-BeNQZWv2.js.map} +1 -1
  166. package/dist/core/web/public/next/assets/GearTray-CIPtzeIx.js +2 -0
  167. package/dist/core/web/public/next/assets/{GearTray-Cb2npoxM.js.map → GearTray-CIPtzeIx.js.map} +1 -1
  168. package/dist/core/web/public/next/assets/GrowthSection-iiQg6wvK.js +2 -0
  169. package/dist/core/web/public/next/assets/{GrowthSection-C5aDPs8B.js.map → GrowthSection-iiQg6wvK.js.map} +1 -1
  170. package/dist/core/web/public/next/assets/HandoffDialog-DrQ6ofuy.js +2 -0
  171. package/dist/core/web/public/next/assets/{HandoffDialog-BF3AYg-X.js.map → HandoffDialog-DrQ6ofuy.js.map} +1 -1
  172. package/dist/core/web/public/next/assets/Input-C0MQxEM6.js +2 -0
  173. package/dist/core/web/public/next/assets/{Input-B5dmGLZx.js.map → Input-C0MQxEM6.js.map} +1 -1
  174. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js +2 -0
  175. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js.map +1 -0
  176. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js +2 -0
  177. package/dist/core/web/public/next/assets/{MatrixHeatmap-BgEUs2Eu.js.map → MatrixHeatmap-DZvZeWXL.js.map} +1 -1
  178. package/dist/core/web/public/next/assets/McpSection-BRuCcTjT.js +2 -0
  179. package/dist/core/web/public/next/assets/{McpSection-DZkiOuoq.js.map → McpSection-BRuCcTjT.js.map} +1 -1
  180. package/dist/core/web/public/next/assets/MessageMarkdown-bRvD5nSc.js +3 -0
  181. package/dist/core/web/public/next/assets/{MessageMarkdown-BauY8ZTY.js.map → MessageMarkdown-bRvD5nSc.js.map} +1 -1
  182. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DLBNLfsn.js → MessageMarkdownRenderer-FjjkPKA2.js} +4 -4
  183. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DLBNLfsn.js.map → MessageMarkdownRenderer-FjjkPKA2.js.map} +1 -1
  184. package/dist/core/web/public/next/assets/{Meter-DNeocJnD.js → Meter-CFNLpwA-.js} +2 -2
  185. package/dist/core/web/public/next/assets/{Meter-DNeocJnD.js.map → Meter-CFNLpwA-.js.map} +1 -1
  186. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js +2 -0
  187. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js.map +1 -0
  188. package/dist/core/web/public/next/assets/MutationTokenDialog-T7gv3a9r.js +2 -0
  189. package/dist/core/web/public/next/assets/{MutationTokenDialog-mxrw0Yvy.js.map → MutationTokenDialog-T7gv3a9r.js.map} +1 -1
  190. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js +2 -0
  191. package/dist/core/web/public/next/assets/{NeedsYouDrawer-CO-Balfp.js.map → NeedsYouDrawer-lYN4G_aM.js.map} +1 -1
  192. package/dist/core/web/public/next/assets/NeedsYouList-BgH8ezqf.js +2 -0
  193. package/dist/core/web/public/next/assets/{NeedsYouList-CzDZbzRD.js.map → NeedsYouList-BgH8ezqf.js.map} +1 -1
  194. package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js +3 -0
  195. package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js.map +1 -0
  196. package/dist/core/web/public/next/assets/OnboardingFlow-HUNQGQuU.css +1 -0
  197. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js +2 -0
  198. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js.map +1 -0
  199. package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js +3 -0
  200. package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js.map +1 -0
  201. package/dist/core/web/public/next/assets/PreviewPane-BPBbcROb.js +2 -0
  202. package/dist/core/web/public/next/assets/{PreviewPane-BS-CleCd.js.map → PreviewPane-BPBbcROb.js.map} +1 -1
  203. package/dist/core/web/public/next/assets/{ProviderLogo-C5mBg8i0.js → ProviderLogo-CT2cSfkg.js} +2 -2
  204. package/dist/core/web/public/next/assets/{ProviderLogo-C5mBg8i0.js.map → ProviderLogo-CT2cSfkg.js.map} +1 -1
  205. package/dist/core/web/public/next/assets/RailStatus-Vgl0GYtd.js +2 -0
  206. package/dist/core/web/public/next/assets/{RailStatus-cPRyOmrk.js.map → RailStatus-Vgl0GYtd.js.map} +1 -1
  207. package/dist/core/web/public/next/assets/{RefreshIndicator-CMwSCiz5.js → RefreshIndicator-CSyqpY_q.js} +2 -2
  208. package/dist/core/web/public/next/assets/{RefreshIndicator-CMwSCiz5.js.map → RefreshIndicator-CSyqpY_q.js.map} +1 -1
  209. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BFi1opsC.js → ResourcePoolConsoleApp-BX2nkdmZ.js} +4 -4
  210. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BFi1opsC.js.map → ResourcePoolConsoleApp-BX2nkdmZ.js.map} +1 -1
  211. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js +3 -0
  212. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js.map +1 -0
  213. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +1 -0
  214. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js +2 -0
  215. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js.map +1 -0
  216. package/dist/core/web/public/next/assets/RouteErrorBoundary-BaC7YVzR.js +2 -0
  217. package/dist/core/web/public/next/assets/{RouteErrorBoundary-DYtwc2ja.js.map → RouteErrorBoundary-BaC7YVzR.js.map} +1 -1
  218. package/dist/core/web/public/next/assets/RunInCloudAction-D5PDHJPE.js +2 -0
  219. package/dist/core/web/public/next/assets/{RunInCloudAction-BEGEEM8O.js.map → RunInCloudAction-D5PDHJPE.js.map} +1 -1
  220. package/dist/core/web/public/next/assets/SeatSelector-Cg75LInq.js +3 -0
  221. package/dist/core/web/public/next/assets/{SeatSelector-CYHRR7Wp.js.map → SeatSelector-Cg75LInq.js.map} +1 -1
  222. package/dist/core/web/public/next/assets/Segmented-CametjLt.js +2 -0
  223. package/dist/core/web/public/next/assets/{Segmented-BE53BenI.js.map → Segmented-CametjLt.js.map} +1 -1
  224. package/dist/core/web/public/next/assets/Select-De52fghU.js +2 -0
  225. package/dist/core/web/public/next/assets/{Select-BwSGkHCS.js.map → Select-De52fghU.js.map} +1 -1
  226. package/dist/core/web/public/next/assets/SessionGate-CzlcNq3O.js +2 -0
  227. package/dist/core/web/public/next/assets/{SessionGate-e0dFJm9d.js.map → SessionGate-CzlcNq3O.js.map} +1 -1
  228. package/dist/core/web/public/next/assets/SessionInsightChip-Bk_Owa7u.js +2 -0
  229. package/dist/core/web/public/next/assets/{SessionInsightChip-CxlSyueJ.js.map → SessionInsightChip-Bk_Owa7u.js.map} +1 -1
  230. package/dist/core/web/public/next/assets/SessionSearch-C6C8DHN8.js +2 -0
  231. package/dist/core/web/public/next/assets/{SessionSearch-_yp7S2TP.js.map → SessionSearch-C6C8DHN8.js.map} +1 -1
  232. package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js +2 -0
  233. package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js.map +1 -0
  234. package/dist/core/web/public/next/assets/Sheet-CJhK9Dqv.js +2 -0
  235. package/dist/core/web/public/next/assets/{Sheet-DVP2Mgy6.js.map → Sheet-CJhK9Dqv.js.map} +1 -1
  236. package/dist/core/web/public/next/assets/ShortcutsOverlay-DDW-i9Fc.js +2 -0
  237. package/dist/core/web/public/next/assets/{ShortcutsOverlay-BcIcoClX.js.map → ShortcutsOverlay-DDW-i9Fc.js.map} +1 -1
  238. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js +3 -0
  239. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js.map +1 -0
  240. package/dist/core/web/public/next/assets/Slider-Bwd9HfXl.js +2 -0
  241. package/dist/core/web/public/next/assets/{Slider-BypUWjpH.js.map → Slider-Bwd9HfXl.js.map} +1 -1
  242. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js +2 -0
  243. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js.map +1 -0
  244. package/dist/core/web/public/next/assets/{StatusBadge-HCZp416_.js → StatusBadge-DHKRtttH.js} +2 -2
  245. package/dist/core/web/public/next/assets/{StatusBadge-HCZp416_.js.map → StatusBadge-DHKRtttH.js.map} +1 -1
  246. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js +2 -0
  247. package/dist/core/web/public/next/assets/{StepBand-Duz1PUes.js.map → StepBand-DQykLkk_.js.map} +1 -1
  248. package/dist/core/web/public/next/assets/Surface-D--LXgQm.js +2 -0
  249. package/dist/core/web/public/next/assets/Surface-D--LXgQm.js.map +1 -0
  250. package/dist/core/web/public/next/assets/Surface-e1z6GdZt.css +1 -0
  251. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js +2 -0
  252. package/dist/core/web/public/next/assets/{Swimlane-DGcIcnNA.js.map → Swimlane-BzH6OCee.js.map} +1 -1
  253. package/dist/core/web/public/next/assets/{Switch-iveI-8NY.js → Switch-PMixU6b0.js} +2 -2
  254. package/dist/core/web/public/next/assets/{Switch-iveI-8NY.js.map → Switch-PMixU6b0.js.map} +1 -1
  255. package/dist/core/web/public/next/assets/{Tag-DH15CUJp.js → Tag-fordBsrJ.js} +2 -2
  256. package/dist/core/web/public/next/assets/{Tag-DH15CUJp.js.map → Tag-fordBsrJ.js.map} +1 -1
  257. package/dist/core/web/public/next/assets/TerminalPane-BSnGdUuF.js +7 -0
  258. package/dist/core/web/public/next/assets/TerminalPane-BSnGdUuF.js.map +1 -0
  259. package/dist/core/web/public/next/assets/UniverseConsoleApp-DtXFhAhw.js +2 -0
  260. package/dist/core/web/public/next/assets/{UniverseConsoleApp-C8yQ0AaR.js.map → UniverseConsoleApp-DtXFhAhw.js.map} +1 -1
  261. package/dist/core/web/public/next/assets/{UniverseView-_nPURPqe.js → UniverseView-sWm3pnTW.js} +3 -3
  262. package/dist/core/web/public/next/assets/{UniverseView-_nPURPqe.js.map → UniverseView-sWm3pnTW.js.map} +1 -1
  263. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js +3 -0
  264. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js.map +1 -0
  265. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js +3 -0
  266. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js.map +1 -0
  267. package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js +10 -0
  268. package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js.map +1 -0
  269. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +1 -0
  270. package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js +2 -0
  271. package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js.map +1 -0
  272. package/dist/core/web/public/next/assets/apps-model-DlwnfqwJ.js +2 -0
  273. package/dist/core/web/public/next/assets/apps-model-DlwnfqwJ.js.map +1 -0
  274. package/dist/core/web/public/next/assets/authority-model-BFuPezSo.js +2 -0
  275. package/dist/core/web/public/next/assets/authority-model-BFuPezSo.js.map +1 -0
  276. package/dist/core/web/public/next/assets/binding-left-DZpq5sLf.js +2 -0
  277. package/dist/core/web/public/next/assets/binding-left-DZpq5sLf.js.map +1 -0
  278. package/dist/core/web/public/next/assets/{budget-queries-V3wcJVK_.js → budget-queries-DsAjH8ac.js} +2 -2
  279. package/dist/core/web/public/next/assets/{budget-queries-V3wcJVK_.js.map → budget-queries-DsAjH8ac.js.map} +1 -1
  280. package/dist/core/web/public/next/assets/capacity-strip-model-Dn1cNOhz.js +2 -0
  281. package/dist/core/web/public/next/assets/capacity-strip-model-Dn1cNOhz.js.map +1 -0
  282. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js +2 -0
  283. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js.map +1 -0
  284. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +1 -0
  285. package/dist/core/web/public/next/assets/clipboard-DkZdqlxf.js +2 -0
  286. package/dist/core/web/public/next/assets/clipboard-DkZdqlxf.js.map +1 -0
  287. package/dist/core/web/public/next/assets/cloud-D-HXms6q.css +1 -0
  288. package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js +2 -0
  289. package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js.map +1 -0
  290. package/dist/core/web/public/next/assets/cloud-queries-QAhpExlz.js +2 -0
  291. package/dist/core/web/public/next/assets/cloud-queries-QAhpExlz.js.map +1 -0
  292. package/dist/core/web/public/next/assets/cloud.module-DOP-N4Ch.js +2 -0
  293. package/dist/core/web/public/next/assets/cloud.module-DOP-N4Ch.js.map +1 -0
  294. package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js +2 -0
  295. package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js.map +1 -0
  296. package/dist/core/web/public/next/assets/context-model-Co4wh3SM.js +2 -0
  297. package/dist/core/web/public/next/assets/context-model-Co4wh3SM.js.map +1 -0
  298. package/dist/core/web/public/next/assets/context-model-DV1zCfAm.js +3 -0
  299. package/dist/core/web/public/next/assets/context-model-DV1zCfAm.js.map +1 -0
  300. package/dist/core/web/public/next/assets/{context-queries-CrPcHWTz.js → context-queries-CktFQqSS.js} +2 -2
  301. package/dist/core/web/public/next/assets/{context-queries-CrPcHWTz.js.map → context-queries-CktFQqSS.js.map} +1 -1
  302. package/dist/core/web/public/next/assets/{control-queries-CmgBgKV7.js → control-queries-DAvlh_YM.js} +2 -2
  303. package/dist/core/web/public/next/assets/{control-queries-CmgBgKV7.js.map → control-queries-DAvlh_YM.js.map} +1 -1
  304. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js +2 -0
  305. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js.map +1 -0
  306. package/dist/core/web/public/next/assets/dock-icons-BFuBbqJl.js +2 -0
  307. package/dist/core/web/public/next/assets/{dock-icons-CUh8dOxJ.js.map → dock-icons-BFuBbqJl.js.map} +1 -1
  308. package/dist/core/web/public/next/assets/fleet-model-Dfd5JyLR.js +2 -0
  309. package/dist/core/web/public/next/assets/fleet-model-Dfd5JyLR.js.map +1 -0
  310. package/dist/core/web/public/next/assets/fleet-queries-RtMTd5rR.js +2 -0
  311. package/dist/core/web/public/next/assets/fleet-queries-RtMTd5rR.js.map +1 -0
  312. package/dist/core/web/public/next/assets/{focus-trap-HtcoXeEq.js → focus-trap-BdrbWfC4.js} +2 -2
  313. package/dist/core/web/public/next/assets/{focus-trap-HtcoXeEq.js.map → focus-trap-BdrbWfC4.js.map} +1 -1
  314. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js +2 -0
  315. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js.map +1 -0
  316. package/dist/core/web/public/next/assets/{git-model-bk_RXh3y.js → git-model-_BnI_Ogh.js} +2 -2
  317. package/dist/core/web/public/next/assets/{git-model-bk_RXh3y.js.map → git-model-_BnI_Ogh.js.map} +1 -1
  318. package/dist/core/web/public/next/assets/global-CNNGMril.js +2 -0
  319. package/dist/core/web/public/next/assets/{global-oEl9Qj8u.js.map → global-CNNGMril.js.map} +1 -1
  320. package/dist/core/web/public/next/assets/{guarded-runners-LHLXmXIk.js → guarded-runners-DPh2d32e.js} +2 -2
  321. package/dist/core/web/public/next/assets/{guarded-runners-LHLXmXIk.js.map → guarded-runners-DPh2d32e.js.map} +1 -1
  322. package/dist/core/web/public/next/assets/icons-0haWy6nh.js +2 -0
  323. package/dist/core/web/public/next/assets/icons-0haWy6nh.js.map +1 -0
  324. package/dist/core/web/public/next/assets/{index-BVxOlseC.js → index-QesfXBsb.js} +3 -3
  325. package/dist/core/web/public/next/assets/{index-BVxOlseC.js.map → index-QesfXBsb.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js +2 -0
  327. package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js.map +1 -0
  328. package/dist/core/web/public/next/assets/local-model-C9xNi9fN.js +2 -0
  329. package/dist/core/web/public/next/assets/local-model-C9xNi9fN.js.map +1 -0
  330. package/dist/core/web/public/next/assets/mind.module-BrK2nFOL.js +2 -0
  331. package/dist/core/web/public/next/assets/{mind.module-gTGAuJt1.js.map → mind.module-BrK2nFOL.js.map} +1 -1
  332. package/dist/core/web/public/next/assets/mutations-DTCtKCn_.js +2 -0
  333. package/dist/core/web/public/next/assets/{mutations-C5S7okTW.js.map → mutations-DTCtKCn_.js.map} +1 -1
  334. package/dist/core/web/public/next/assets/nav-KmGX0CVz.js +2 -0
  335. package/dist/core/web/public/next/assets/{nav-NVtnuG7A.js.map → nav-KmGX0CVz.js.map} +1 -1
  336. package/dist/core/web/public/next/assets/{overnight-queries-DGm3qL1b.js → overnight-queries-mlO0xzsr.js} +2 -2
  337. package/dist/core/web/public/next/assets/{overnight-queries-DGm3qL1b.js.map → overnight-queries-mlO0xzsr.js.map} +1 -1
  338. package/dist/core/web/public/next/assets/primitives-D0Fb3TtS.js +1 -0
  339. package/dist/core/web/public/next/assets/{queries-CYisSAAB.js → queries-CyBE8nsW.js} +2 -2
  340. package/dist/core/web/public/next/assets/{queries-CYisSAAB.js.map → queries-CyBE8nsW.js.map} +1 -1
  341. package/dist/core/web/public/next/assets/reasoning-pref-CaoA4_Vl.js +2 -0
  342. package/dist/core/web/public/next/assets/{reasoning-pref-BUcFF_5G.js.map → reasoning-pref-CaoA4_Vl.js.map} +1 -1
  343. package/dist/core/web/public/next/assets/{reveal-anchor-D-tV8xau.js → reveal-anchor-BP1VqnPU.js} +2 -2
  344. package/dist/core/web/public/next/assets/{reveal-anchor-D-tV8xau.js.map → reveal-anchor-BP1VqnPU.js.map} +1 -1
  345. package/dist/core/web/public/next/assets/seat-subscription-C5Tvr0WQ.js +2 -0
  346. package/dist/core/web/public/next/assets/{seat-subscription-B-f9ViU2.js.map → seat-subscription-C5Tvr0WQ.js.map} +1 -1
  347. package/dist/core/web/public/next/assets/{sidebar-model-DQ-FyBHW.js → sidebar-model-B5Qk95k_.js} +2 -2
  348. package/dist/core/web/public/next/assets/{sidebar-model-DQ-FyBHW.js.map → sidebar-model-B5Qk95k_.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/slots-DHKQDoE6.js +3 -0
  350. package/dist/core/web/public/next/assets/{slots-BhP8b8tf.js.map → slots-DHKQDoE6.js.map} +1 -1
  351. package/dist/core/web/public/next/assets/surface-data-CchClvHo.js +2 -0
  352. package/dist/core/web/public/next/assets/surface-data-CchClvHo.js.map +1 -0
  353. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js +2 -0
  354. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js.map +1 -0
  355. package/dist/core/web/public/next/assets/{tasks-model-BKDNqmmt.js → tasks-model-D6WFVULI.js} +2 -2
  356. package/dist/core/web/public/next/assets/{tasks-model-BKDNqmmt.js.map → tasks-model-D6WFVULI.js.map} +1 -1
  357. package/dist/core/web/public/next/assets/{terminal-icons-D2xe-aM1.js → terminal-icons-BvCvuXk2.js} +2 -2
  358. package/dist/core/web/public/next/assets/{terminal-icons-D2xe-aM1.js.map → terminal-icons-BvCvuXk2.js.map} +1 -1
  359. package/dist/core/web/public/next/assets/transient-events-nTLhMBND.js +2 -0
  360. package/dist/core/web/public/next/assets/transient-events-nTLhMBND.js.map +1 -0
  361. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +1 -1
  362. package/dist/core/web/public/next/assets/{usage-queries-BZuAANlI.js → usage-queries-D1SU1t7r.js} +2 -2
  363. package/dist/core/web/public/next/assets/{usage-queries-BZuAANlI.js.map → usage-queries-D1SU1t7r.js.map} +1 -1
  364. package/dist/core/web/public/next/assets/{use-guarded-action-Cf4MeNBa.js → use-guarded-action-BZmBv7CJ.js} +2 -2
  365. package/dist/core/web/public/next/assets/{use-guarded-action-Cf4MeNBa.js.map → use-guarded-action-BZmBv7CJ.js.map} +1 -1
  366. package/dist/core/web/public/next/assets/{use-ticker-D9yi49my.js → use-ticker-CkJ4-0wU.js} +2 -2
  367. package/dist/core/web/public/next/assets/{use-ticker-D9yi49my.js.map → use-ticker-CkJ4-0wU.js.map} +1 -1
  368. package/dist/core/web/public/next/assets/{use-token-gate-DqrSXdX6.js → use-token-gate-CYcfk_GS.js} +2 -2
  369. package/dist/core/web/public/next/assets/{use-token-gate-DqrSXdX6.js.map → use-token-gate-CYcfk_GS.js.map} +1 -1
  370. package/dist/core/web/public/next/assets/useOnboarding-CujRS6PK.js +2 -0
  371. package/dist/core/web/public/next/assets/useOnboarding-CujRS6PK.js.map +1 -0
  372. package/dist/core/web/public/next/assets/useSeatsRefresh-BEaQdkZs.js +2 -0
  373. package/dist/core/web/public/next/assets/useSeatsRefresh-BEaQdkZs.js.map +1 -0
  374. package/dist/core/web/public/next/assets/useVerseTranscript-BQ0J6Xhx.js +2 -0
  375. package/dist/core/web/public/next/assets/{useVerseTranscript-CDYrrWOO.js.map → useVerseTranscript-BQ0J6Xhx.js.map} +1 -1
  376. package/dist/core/web/public/next/assets/verse-icons-DndgEgKS.js +2 -0
  377. package/dist/core/web/public/next/assets/verse-icons-DndgEgKS.js.map +1 -0
  378. package/dist/core/web/public/next/assets/verse-model-MMySehjj.js +2 -0
  379. package/dist/core/web/public/next/assets/verse-model-MMySehjj.js.map +1 -0
  380. package/dist/core/web/public/next/assets/verse-store-DNVRuiJL.js +2 -0
  381. package/dist/core/web/public/next/assets/verse-store-DNVRuiJL.js.map +1 -0
  382. package/dist/core/web/public/next/assets/warmup-CNEH_-be.js +3 -0
  383. package/dist/core/web/public/next/assets/{warmup-HG5vYbsN.js.map → warmup-CNEH_-be.js.map} +1 -1
  384. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js +2 -0
  385. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js.map +1 -0
  386. package/dist/core/web/public/next/assets/{workspace-model-CbhdPhei.js → workspace-model-Dukb2wwv.js} +2 -2
  387. package/dist/core/web/public/next/assets/{workspace-model-CbhdPhei.js.map → workspace-model-Dukb2wwv.js.map} +1 -1
  388. package/dist/core/web/public/next/index.html +1 -1
  389. package/dist/release-dependency-inventory.json +1 -1
  390. package/docs/README.md +2 -1
  391. package/package.json +1 -1
  392. package/dist/core/web/public/next/assets/ActionMenu-FxXeRbPx.js +0 -2
  393. package/dist/core/web/public/next/assets/Advanced-D_eS4472.js +0 -2
  394. package/dist/core/web/public/next/assets/Advanced-D_eS4472.js.map +0 -1
  395. package/dist/core/web/public/next/assets/App-Cj4zKbG3.js +0 -7
  396. package/dist/core/web/public/next/assets/App-Cj4zKbG3.js.map +0 -1
  397. package/dist/core/web/public/next/assets/AppsSection-Ddu_RCQE.js +0 -2
  398. package/dist/core/web/public/next/assets/AppsSection-Ddu_RCQE.js.map +0 -1
  399. package/dist/core/web/public/next/assets/AreaTrend-CDxrQU4b.js +0 -2
  400. package/dist/core/web/public/next/assets/AutonomySection-DuQkHGD_.js +0 -2
  401. package/dist/core/web/public/next/assets/BranchBar-CLsvOcyK.js +0 -2
  402. package/dist/core/web/public/next/assets/BudgetControl-TL3FeZ1D.js +0 -2
  403. package/dist/core/web/public/next/assets/BurnDown-sFXkUGdB.js +0 -2
  404. package/dist/core/web/public/next/assets/BurnDown-sFXkUGdB.js.map +0 -1
  405. package/dist/core/web/public/next/assets/CapacityStrip-qReu0RaF.js +0 -2
  406. package/dist/core/web/public/next/assets/ChatSection-DZuZfTaC.js +0 -3
  407. package/dist/core/web/public/next/assets/ChatSection-DZuZfTaC.js.map +0 -1
  408. package/dist/core/web/public/next/assets/CloudBudgetForm-DJbiT1wi.js +0 -2
  409. package/dist/core/web/public/next/assets/CloudBudgetForm-DJbiT1wi.js.map +0 -1
  410. package/dist/core/web/public/next/assets/CommandPalette-zYLFZRnj.js +0 -2
  411. package/dist/core/web/public/next/assets/CommandPalette-zYLFZRnj.js.map +0 -1
  412. package/dist/core/web/public/next/assets/CommandSection-rIeMK5Ch.js +0 -2
  413. package/dist/core/web/public/next/assets/CommandSection-rIeMK5Ch.js.map +0 -1
  414. package/dist/core/web/public/next/assets/ConfirmDialog-DLrLKM0c.js +0 -2
  415. package/dist/core/web/public/next/assets/Dialog-BS9Dxi3G.js +0 -2
  416. package/dist/core/web/public/next/assets/DiffPane-TOmUf3b2.js +0 -2
  417. package/dist/core/web/public/next/assets/DiffViewer-BpH56302.js +0 -2
  418. package/dist/core/web/public/next/assets/DockHost-DzkzR-HD.js +0 -2
  419. package/dist/core/web/public/next/assets/DockHost-DzkzR-HD.js.map +0 -1
  420. package/dist/core/web/public/next/assets/FleetSection-ViAb549H.js +0 -3
  421. package/dist/core/web/public/next/assets/FleetSection-ViAb549H.js.map +0 -1
  422. package/dist/core/web/public/next/assets/Funnel-D2u7Wlzc.js +0 -2
  423. package/dist/core/web/public/next/assets/GearTray-Cb2npoxM.js +0 -2
  424. package/dist/core/web/public/next/assets/GrowthSection-C5aDPs8B.js +0 -2
  425. package/dist/core/web/public/next/assets/HandoffDialog-BF3AYg-X.js +0 -2
  426. package/dist/core/web/public/next/assets/Input-B5dmGLZx.js +0 -2
  427. package/dist/core/web/public/next/assets/LeaderCard-DZrmjDbI.js +0 -2
  428. package/dist/core/web/public/next/assets/LeaderCard-DZrmjDbI.js.map +0 -1
  429. package/dist/core/web/public/next/assets/MatrixHeatmap-BgEUs2Eu.js +0 -2
  430. package/dist/core/web/public/next/assets/McpSection-DZkiOuoq.js +0 -2
  431. package/dist/core/web/public/next/assets/MessageMarkdown-BauY8ZTY.js +0 -3
  432. package/dist/core/web/public/next/assets/MindSection-BvJXFjyX.js +0 -2
  433. package/dist/core/web/public/next/assets/MindSection-BvJXFjyX.js.map +0 -1
  434. package/dist/core/web/public/next/assets/MutationTokenDialog-mxrw0Yvy.js +0 -2
  435. package/dist/core/web/public/next/assets/NeedsYouDrawer-CO-Balfp.js +0 -2
  436. package/dist/core/web/public/next/assets/NeedsYouList-CzDZbzRD.js +0 -2
  437. package/dist/core/web/public/next/assets/NewChatDialog-B8eJjlFf.js +0 -3
  438. package/dist/core/web/public/next/assets/NewChatDialog-B8eJjlFf.js.map +0 -1
  439. package/dist/core/web/public/next/assets/OnboardingFlow-Cij6KWat.js +0 -2
  440. package/dist/core/web/public/next/assets/OnboardingFlow-Cij6KWat.js.map +0 -1
  441. package/dist/core/web/public/next/assets/OnboardingFlow-DSpPj8UE.css +0 -1
  442. package/dist/core/web/public/next/assets/PreviewPane-BS-CleCd.js +0 -2
  443. package/dist/core/web/public/next/assets/RailStatus-cPRyOmrk.js +0 -2
  444. package/dist/core/web/public/next/assets/ResourcesChrome-BJCauW_t.js +0 -3
  445. package/dist/core/web/public/next/assets/ResourcesChrome-BJCauW_t.js.map +0 -1
  446. package/dist/core/web/public/next/assets/ResourcesDrawer-BDecg6nO.js +0 -2
  447. package/dist/core/web/public/next/assets/ResourcesDrawer-BDecg6nO.js.map +0 -1
  448. package/dist/core/web/public/next/assets/ResourcesDrawer-CSKIO_wZ.css +0 -1
  449. package/dist/core/web/public/next/assets/RouteErrorBoundary-DYtwc2ja.js +0 -2
  450. package/dist/core/web/public/next/assets/RunInCloudAction-BEGEEM8O.js +0 -2
  451. package/dist/core/web/public/next/assets/SeatSelector-CYHRR7Wp.js +0 -3
  452. package/dist/core/web/public/next/assets/Segmented-BE53BenI.js +0 -2
  453. package/dist/core/web/public/next/assets/Select-BwSGkHCS.js +0 -2
  454. package/dist/core/web/public/next/assets/SessionGate-e0dFJm9d.js +0 -2
  455. package/dist/core/web/public/next/assets/SessionInsightChip-CxlSyueJ.js +0 -2
  456. package/dist/core/web/public/next/assets/SessionSearch-_yp7S2TP.js +0 -2
  457. package/dist/core/web/public/next/assets/SettingsSection-wGnpWeGW.js +0 -2
  458. package/dist/core/web/public/next/assets/SettingsSection-wGnpWeGW.js.map +0 -1
  459. package/dist/core/web/public/next/assets/Sheet-DVP2Mgy6.js +0 -2
  460. package/dist/core/web/public/next/assets/ShortcutsOverlay-BcIcoClX.js +0 -2
  461. package/dist/core/web/public/next/assets/Sidebar-DjQOqPbm.js +0 -3
  462. package/dist/core/web/public/next/assets/Sidebar-DjQOqPbm.js.map +0 -1
  463. package/dist/core/web/public/next/assets/Slider-BypUWjpH.js +0 -2
  464. package/dist/core/web/public/next/assets/StepBand-Duz1PUes.js +0 -2
  465. package/dist/core/web/public/next/assets/Surface-B75lVfzm.js +0 -2
  466. package/dist/core/web/public/next/assets/Surface-B75lVfzm.js.map +0 -1
  467. package/dist/core/web/public/next/assets/Surface-DMca0gAe.css +0 -1
  468. package/dist/core/web/public/next/assets/Swimlane-DGcIcnNA.js +0 -2
  469. package/dist/core/web/public/next/assets/TerminalPane-MQT-veKZ.js +0 -7
  470. package/dist/core/web/public/next/assets/TerminalPane-MQT-veKZ.js.map +0 -1
  471. package/dist/core/web/public/next/assets/UniverseConsoleApp-C8yQ0AaR.js +0 -2
  472. package/dist/core/web/public/next/assets/UsageSection-CqxRGJ40.js +0 -2
  473. package/dist/core/web/public/next/assets/UsageSection-CqxRGJ40.js.map +0 -1
  474. package/dist/core/web/public/next/assets/VerseConsoleApp-DTjDpGCd.js +0 -3
  475. package/dist/core/web/public/next/assets/VerseConsoleApp-DTjDpGCd.js.map +0 -1
  476. package/dist/core/web/public/next/assets/Workspace-DfcFGzME.js +0 -10
  477. package/dist/core/web/public/next/assets/Workspace-DfcFGzME.js.map +0 -1
  478. package/dist/core/web/public/next/assets/actions-Ddfg2iLl.css +0 -1
  479. package/dist/core/web/public/next/assets/actions-tWevL9HV.js +0 -2
  480. package/dist/core/web/public/next/assets/actions-tWevL9HV.js.map +0 -1
  481. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js +0 -2
  482. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js.map +0 -1
  483. package/dist/core/web/public/next/assets/capacity-strip-model-BDbmQ3e3.js +0 -2
  484. package/dist/core/web/public/next/assets/capacity-strip-model-BDbmQ3e3.js.map +0 -1
  485. package/dist/core/web/public/next/assets/charts-CfAjuKMv.js +0 -2
  486. package/dist/core/web/public/next/assets/charts-CfAjuKMv.js.map +0 -1
  487. package/dist/core/web/public/next/assets/charts-uSX6xVYN.css +0 -1
  488. package/dist/core/web/public/next/assets/cloud-C1KPNRHC.css +0 -1
  489. package/dist/core/web/public/next/assets/cloud-queries-Br_r0UAz.js +0 -2
  490. package/dist/core/web/public/next/assets/cloud-queries-Br_r0UAz.js.map +0 -1
  491. package/dist/core/web/public/next/assets/cloud.module-ascz58c3.js +0 -2
  492. package/dist/core/web/public/next/assets/cloud.module-ascz58c3.js.map +0 -1
  493. package/dist/core/web/public/next/assets/command-bus-xYZoK9nQ.js +0 -2
  494. package/dist/core/web/public/next/assets/command-bus-xYZoK9nQ.js.map +0 -1
  495. package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js +0 -2
  496. package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js.map +0 -1
  497. package/dist/core/web/public/next/assets/composer-keys-su0g1h9o.js +0 -2
  498. package/dist/core/web/public/next/assets/composer-keys-su0g1h9o.js.map +0 -1
  499. package/dist/core/web/public/next/assets/context-model-BC-HOmPo.js +0 -2
  500. package/dist/core/web/public/next/assets/context-model-BC-HOmPo.js.map +0 -1
  501. package/dist/core/web/public/next/assets/context-model-CIBmSugV.js +0 -2
  502. package/dist/core/web/public/next/assets/context-model-CIBmSugV.js.map +0 -1
  503. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js +0 -2
  504. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js.map +0 -1
  505. package/dist/core/web/public/next/assets/dock-icons-CUh8dOxJ.js +0 -2
  506. package/dist/core/web/public/next/assets/dock-store-B2vlxqPu.js +0 -2
  507. package/dist/core/web/public/next/assets/dock-store-B2vlxqPu.js.map +0 -1
  508. package/dist/core/web/public/next/assets/fleet-model-7i-FbzKI.js +0 -2
  509. package/dist/core/web/public/next/assets/fleet-model-7i-FbzKI.js.map +0 -1
  510. package/dist/core/web/public/next/assets/fleet-queries-DzGoqq8X.js +0 -2
  511. package/dist/core/web/public/next/assets/fleet-queries-DzGoqq8X.js.map +0 -1
  512. package/dist/core/web/public/next/assets/format-BkWdOQDL.js +0 -2
  513. package/dist/core/web/public/next/assets/format-BkWdOQDL.js.map +0 -1
  514. package/dist/core/web/public/next/assets/global-oEl9Qj8u.js +0 -2
  515. package/dist/core/web/public/next/assets/guarded-action-OzqcPjmh.js +0 -3
  516. package/dist/core/web/public/next/assets/guarded-action-OzqcPjmh.js.map +0 -1
  517. package/dist/core/web/public/next/assets/icon-base-DvM1eI5V.js +0 -2
  518. package/dist/core/web/public/next/assets/icon-base-DvM1eI5V.js.map +0 -1
  519. package/dist/core/web/public/next/assets/icons-DEQa2rTx.js +0 -2
  520. package/dist/core/web/public/next/assets/icons-DEQa2rTx.js.map +0 -1
  521. package/dist/core/web/public/next/assets/live-model-bmsJgnYD.js +0 -2
  522. package/dist/core/web/public/next/assets/live-model-bmsJgnYD.js.map +0 -1
  523. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js +0 -2
  524. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js.map +0 -1
  525. package/dist/core/web/public/next/assets/mind.module-gTGAuJt1.js +0 -2
  526. package/dist/core/web/public/next/assets/mutations-C5S7okTW.js +0 -2
  527. package/dist/core/web/public/next/assets/nav-NVtnuG7A.js +0 -2
  528. package/dist/core/web/public/next/assets/preloaded-Cwf9rsnZ.js +0 -2
  529. package/dist/core/web/public/next/assets/preloaded-Cwf9rsnZ.js.map +0 -1
  530. package/dist/core/web/public/next/assets/primitives-DyCKYSBG.js +0 -1
  531. package/dist/core/web/public/next/assets/reasoning-pref-BUcFF_5G.js +0 -2
  532. package/dist/core/web/public/next/assets/seat-subscription-B-f9ViU2.js +0 -2
  533. package/dist/core/web/public/next/assets/section-visibility-Yctxu-if.js +0 -2
  534. package/dist/core/web/public/next/assets/section-visibility-Yctxu-if.js.map +0 -1
  535. package/dist/core/web/public/next/assets/slots-BhP8b8tf.js +0 -3
  536. package/dist/core/web/public/next/assets/surface-data-DTI7LjvH.js +0 -2
  537. package/dist/core/web/public/next/assets/surface-data-DTI7LjvH.js.map +0 -1
  538. package/dist/core/web/public/next/assets/surface-prefetch-CdUEBFrl.js +0 -2
  539. package/dist/core/web/public/next/assets/surface-prefetch-CdUEBFrl.js.map +0 -1
  540. package/dist/core/web/public/next/assets/useChartWidth-owwodNVz.js +0 -2
  541. package/dist/core/web/public/next/assets/useChartWidth-owwodNVz.js.map +0 -1
  542. package/dist/core/web/public/next/assets/useSeatsRefresh-DgFy-Ph4.js +0 -2
  543. package/dist/core/web/public/next/assets/useSeatsRefresh-DgFy-Ph4.js.map +0 -1
  544. package/dist/core/web/public/next/assets/useVerseTranscript-CDYrrWOO.js +0 -2
  545. package/dist/core/web/public/next/assets/verse-icons-F9VwX07_.js +0 -2
  546. package/dist/core/web/public/next/assets/verse-icons-F9VwX07_.js.map +0 -1
  547. package/dist/core/web/public/next/assets/verse-model-DyCwZF-M.js +0 -2
  548. package/dist/core/web/public/next/assets/verse-model-DyCwZF-M.js.map +0 -1
  549. package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js +0 -3
  550. package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js.map +0 -1
  551. package/dist/core/web/public/next/assets/verse-ui-store-62DxpVHS.js +0 -3
  552. package/dist/core/web/public/next/assets/verse-ui-store-62DxpVHS.js.map +0 -1
  553. package/dist/core/web/public/next/assets/viewport-nTubFCwf.js +0 -2
  554. package/dist/core/web/public/next/assets/viewport-nTubFCwf.js.map +0 -1
  555. package/dist/core/web/public/next/assets/warmup-HG5vYbsN.js +0 -3
  556. package/dist/core/web/public/next/assets/workbench-types-DzN-5trg.js +0 -2
  557. package/dist/core/web/public/next/assets/workbench-types-DzN-5trg.js.map +0 -1
  558. /package/dist/core/web/public/next/assets/{BurnDown-BuLMsJMx.css → StatTile-BuLMsJMx.css} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verse-store-DNVRuiJL.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/verse-store.ts"],"sourcesContent":["/**\n * routes/verse/verse-store.ts — per-session transcript state for the Verse\n * console. Framework-free (useSyncExternalStore glue lives in\n * useVerseSession.ts, the live stream in session-stream.ts), same split as\n * data/cache.ts + data/hooks.ts.\n *\n * One entry per session id holds the ordered, seq-deduplicated event log,\n * the latest session record we know of, the stream connection state, and —\n * V3.10 — the LIVE state of a running turn (reasoning streaming in, what the\n * turn is doing, retry/watchdog notices), which is fed by transient events\n * that are never persisted and never enter the event log.\n * Snapshots are replaced wholesale on every change (Object.is semantics —\n * see DESIGN.md §3 for the bug that rule prevents).\n *\n * V3.10 DATA PATH. The previous store merged every event with a Map + spread\n * + sort and told every subscriber about it: replaying 5k events took 2.45 s\n * and 10k took 17 s, and every streamed token re-rendered the whole Chat\n * section. Now:\n *\n * - `applyVerseEvents` applies a BATCH: an event past the newest seq is a\n * plain append (one array copy per batch, not per event), an older one\n * is binary-searched (duplicate → dropped, gap → inserted in place);\n * - subscribers are per session (`subscribeVerseSession`) and read one of\n * three snapshots that change independently:\n * · the HEAD (`getVerseSessionHead`) — session record, stream state\n * and the event log as of the last STRUCTURAL event. A text-delta\n * alone does not republish it, so the sidebar, header and resources\n * panel do not re-render per token;\n * · the TRANSCRIPT (`getVerseTranscript`, verse-transcript.ts) —\n * derived lazily, per turn segment, with unchanged turns returned as\n * the same objects so the renderer can skip them;\n * · the LIVE state (`getVerseLive`) — transient signals only.\n * - the stream (session-stream.ts) calls `applyVerseEvents` once per\n * animation frame, so a burst of frames costs one render.\n *\n * The transcript derivation (`buildTranscript`, `getVerseTranscript`,\n * `groupTranscriptItems`) lives in verse-transcript.ts: this store is on the\n * chat first-paint path and the derivation is not (only lazy chunks render a\n * transcript). Its types are re-exported below so type imports keep working;\n * never re-export a VALUE from there, or the derivation rides along again.\n */\nimport type { VerseEvent, VerseSession, VerseUsage } from '../../data/api-types.js';\nimport type {\n VerseProgressPhase,\n VerseStatusKind,\n VerseTransientEvent,\n VerseWindowSource,\n} from '../../../core/verse/types.js';\n// transient-events, not types: a value imported from types.ts brings every\n// runtime value exported there (the handoff prompt, the effort tables) into\n// this store's first-paint chunk.\nimport { isTransientVerseEvent } from '../../../core/verse/transient-events.js';\n// compaction-point, not context-math: this store is on the chat first-paint\n// path and needs only this formula (context-math re-exports it).\nimport { reconcileAutoCompactAt } from '../../../core/verse/compaction-point.js';\n\nexport type {\n BuildTranscriptOptions,\n ToolGroupItem,\n ToolGroupMember,\n Transcript,\n TranscriptCache,\n TranscriptItem,\n TranscriptRenderItem,\n TranscriptSegment,\n} from './verse-transcript.js';\n\nexport type VerseStreamState = 'idle' | 'connecting' | 'open' | 'reconnecting' | 'closed';\n\n// ---------------------------------------------------------------------------\n// Live (transient) state\n// ---------------------------------------------------------------------------\n\n/** The reasoning block currently streaming in (`thinking-delta` / `thinking-progress`). */\nexport interface VerseLiveThinking {\n turnId: string;\n /** Streamed text so far; empty when the CLI reports only a token estimate. */\n text: string;\n /** Client clock (ms) when this block's first signal arrived. */\n startedAt: number;\n /** Latest `thinking-progress` estimate; null when the CLI sent none (unknown, never 0). */\n estimatedTokens: number | null;\n}\n\nexport interface VerseLiveProgress {\n phase: VerseProgressPhase;\n tool: string | null;\n /** Server-measured turn wall time when the frame was sent. */\n elapsedMs: number;\n outTokens: number | null;\n tokPerSec: number | null;\n /** Client clock (ms) the frame arrived, so elapsed can keep counting between frames. */\n receivedAt: number;\n}\n\nexport interface VerseLiveNotice {\n kind: VerseStatusKind;\n message: string;\n at: string;\n receivedAt: number;\n}\n\nexport interface VerseLiveState {\n /** The running turn these signals belong to; null when none is running. */\n turnId: string | null;\n /** Client clock (ms) the running turn started, from its `turn-started` stamp when parseable. */\n startedAt: number | null;\n progress: VerseLiveProgress | null;\n thinking: VerseLiveThinking | null;\n /** The latest plumbing notice (API retry, preflight, no-output watchdog); cleared when output resumes. */\n notice: VerseLiveNotice | null;\n /** Last turn that settled, so a late transient frame for it cannot resurrect the live line. */\n settledTurnId: string | null;\n}\n\n/** What this tab measured about a reasoning block while it streamed — keyed by the persisted `thinking` event's seq. */\nexport interface VerseThinkingStat {\n durationMs: number | null;\n estimatedTokens: number | null;\n}\n\nconst EMPTY_LIVE: VerseLiveState = {\n turnId: null,\n startedAt: null,\n progress: null,\n thinking: null,\n notice: null,\n settledTurnId: null,\n};\n\n// ---------------------------------------------------------------------------\n// Entries, heads and subscriptions\n// ---------------------------------------------------------------------------\n\nexport interface VerseSessionState {\n sessionId: string;\n session: VerseSession | null;\n events: VerseEvent[];\n /** Highest PERSISTED seq held — the resume cursor. Transient frames never move it. */\n lastSeq: number;\n loaded: boolean;\n loadError: string | null;\n stream: VerseStreamState;\n /** V3.10 transient signals of the running turn. */\n live: VerseLiveState;\n}\n\n/**\n * Everything about a session EXCEPT its live signals, republished only on\n * structural change. `events` is the log as of the last non-`text-delta`\n * event: streamed tokens reach the transcript through its own subscription,\n * so a consumer of the head (session record, meters, activity stats) never\n * re-renders per token. Code that needs every delta reads\n * `getVerseSessionState` or `getVerseTranscript` instead.\n */\nexport type VerseSessionHead = Omit<VerseSessionState, 'live'>;\n\nconst EMPTY: Omit<VerseSessionState, 'sessionId'> = {\n session: null,\n events: [],\n lastSeq: 0,\n loaded: false,\n loadError: null,\n stream: 'idle',\n live: EMPTY_LIVE,\n};\n\nconst sessions = new Map<string, VerseSessionState>();\nconst heads = new Map<string, VerseSessionHead>();\nconst thinkingStats = new Map<string, Map<number, VerseThinkingStat>>();\nconst listeners = new Set<() => void>();\nconst sessionListeners = new Map<string, Set<() => void>>();\n\nexport type VerseStoreLifecycle = { kind: 'reset' } | { kind: 'forget'; sessionId: string };\nconst lifecycleListeners = new Set<(event: VerseStoreLifecycle) => void>();\n\nfunction notify(sessionId: string | null): void {\n if (sessionId !== null) {\n const scoped = sessionListeners.get(sessionId);\n if (scoped) for (const l of [...scoped]) l();\n } else {\n for (const set of [...sessionListeners.values()]) for (const l of [...set]) l();\n }\n for (const l of [...listeners]) l();\n}\n\n/** Every change to every session. Prefer `subscribeVerseSession` in components. */\nexport function subscribeVerseStore(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/** Changes to ONE session only — what a component showing that session subscribes to. */\nexport function subscribeVerseSession(sessionId: string, listener: () => void): () => void {\n let set = sessionListeners.get(sessionId);\n if (!set) {\n set = new Set();\n sessionListeners.set(sessionId, set);\n }\n set.add(listener);\n return () => {\n const current = sessionListeners.get(sessionId);\n if (!current) return;\n current.delete(listener);\n if (current.size === 0) sessionListeners.delete(sessionId);\n };\n}\n\n/**\n * Reset / forget notifications, so the live-stream registry can close the\n * connection of a chat that was deleted or of a store that was cleared on\n * logout (and so tests never inherit a previous test's stream).\n */\nexport function subscribeVerseStoreLifecycle(listener: (event: VerseStoreLifecycle) => void): () => void {\n lifecycleListeners.add(listener);\n return () => lifecycleListeners.delete(listener);\n}\n\nfunction headOf(state: VerseSessionState): VerseSessionHead {\n return {\n sessionId: state.sessionId,\n session: state.session,\n events: state.events,\n lastSeq: state.lastSeq,\n loaded: state.loaded,\n loadError: state.loadError,\n stream: state.stream,\n };\n}\n\nfunction entryFor(sessionId: string): VerseSessionState {\n let e = sessions.get(sessionId);\n if (!e) {\n e = { sessionId, ...EMPTY };\n sessions.set(sessionId, e);\n heads.set(sessionId, headOf(e));\n }\n return e;\n}\n\n/**\n * Store `next` and republish the head when anything it carries changed.\n * `structural` = the event log gained something other than a text-delta.\n */\nfunction commit(sessionId: string, next: VerseSessionState, structural: boolean): void {\n sessions.set(sessionId, next);\n const head = heads.get(sessionId);\n if (\n !head || structural || head.session !== next.session || head.loaded !== next.loaded ||\n head.loadError !== next.loadError || head.stream !== next.stream\n ) {\n heads.set(sessionId, headOf(next));\n }\n}\n\nfunction patch(sessionId: string, delta: Partial<VerseSessionState>, structural = false): void {\n const current = entryFor(sessionId);\n commit(sessionId, { ...current, ...delta }, structural);\n notify(sessionId);\n}\n\nconst NONE: VerseSessionState = { sessionId: '', ...EMPTY };\nconst NONE_HEAD: VerseSessionHead = headOf(NONE);\n\n/** Stable reference until the entry changes, so useSyncExternalStore is happy. */\nexport function getVerseSessionState(sessionId: string | null): VerseSessionState {\n if (!sessionId) return NONE;\n return entryFor(sessionId);\n}\n\n/** The head snapshot (see VerseSessionHead) — stable across text-deltas. */\nexport function getVerseSessionHead(sessionId: string | null): VerseSessionHead {\n if (!sessionId) return NONE_HEAD;\n entryFor(sessionId);\n return heads.get(sessionId)!;\n}\n\n/** Live signals of the running turn; the same object until one of them changes. */\nexport function getVerseLive(sessionId: string | null): VerseLiveState {\n if (!sessionId) return EMPTY_LIVE;\n return entryFor(sessionId).live;\n}\n\n/**\n * What this tab measured about the session's reasoning blocks while they\n * streamed (read by verse-transcript.ts when it derives the transcript).\n */\nexport function getVerseThinkingStats(sessionId: string): ReadonlyMap<number, VerseThinkingStat> | undefined {\n return thinkingStats.get(sessionId);\n}\n\n/** Merge a fetched detail (session + full event log) into the entry. Events\n * already known (same seq) are kept once; the union stays sorted by seq. The\n * detail fetch can race a live stream, so a `turn-done` that streamed in\n * meanwhile wins over the older `running` snapshot. A refetch that brings\n * nothing new changes nothing — no re-render. */\nexport function seedVerseSession(sessionId: string, session: VerseSession, events: readonly VerseEvent[]): void {\n const current = entryFor(sessionId);\n const merged = mergeEvents(current.events, events);\n const settled = settledStatus(session, merged);\n const nextSession = current.session && sameSession(current.session, settled) ? current.session : settled;\n const eventsChanged = merged !== current.events;\n const live = eventsChanged || nextSession !== current.session ? liveFromLog(current.live, merged, nextSession) : current.live;\n if (!eventsChanged && nextSession === current.session && current.loaded && current.loadError === null && live === current.live) return;\n commit(sessionId, {\n ...current,\n session: nextSession,\n events: merged,\n lastSeq: merged.length ? Math.max(current.lastSeq, merged[merged.length - 1]!.seq) : current.lastSeq,\n loaded: true,\n loadError: null,\n live,\n }, eventsChanged);\n notify(sessionId);\n}\n\nexport function setVerseLoadError(sessionId: string, message: string): void {\n patch(sessionId, { loadError: message, loaded: true });\n}\n\nexport function setVerseStreamState(sessionId: string, stream: VerseStreamState): void {\n if (entryFor(sessionId).stream === stream) return;\n patch(sessionId, { stream });\n}\n\n/**\n * Replace the session record (after a turn POST / rename / list refresh).\n * `turnId` is the turn the snapshot claims is running (POST …/turns returns\n * it): when the log already holds that turn's `turn-done`/`cancelled` — a\n * spawn failure settles in the same tick as the 202 — the snapshot is stale\n * and must not drag the composer back to running.\n */\nexport function setVerseSession(sessionId: string, session: VerseSession, turnId?: string): void {\n const current = entryFor(sessionId);\n patch(sessionId, { session: settledStatus(session, current.events, turnId) });\n}\n\n/**\n * Reconcile a `running` snapshot against the event log. Without a `turnId`\n * the running turn is the last `user-message`/`turn-started` in the log; a\n * later `turn-done`/`cancelled` means the server already settled it. With a\n * `turnId`, only that turn's terminal event counts (its `user-message` may\n * not have streamed in yet, so a previous turn's `turn-done` proves nothing).\n * Status follows the same rules applyVerseEvent uses: cancelled → idle,\n * `turn-done ok:false` → error only when an `error` event was logged for it.\n */\nexport function settledStatus(session: VerseSession, events: readonly VerseEvent[], turnId?: string): VerseSession {\n if (session.status !== 'running') return session;\n let anchorSeq = -1;\n let anchorTurn: string | null = turnId ?? null;\n if (!turnId) {\n for (const e of events) {\n if (e.type === 'user-message' || e.type === 'turn-started') {\n anchorSeq = e.seq;\n anchorTurn = e.turnId;\n }\n }\n if (anchorTurn === null) return session;\n }\n let terminal: Extract<VerseEvent, { type: 'turn-done' | 'cancelled' }> | null = null;\n let lastError: string | null = null;\n for (const e of events) {\n if (e.seq <= anchorSeq) continue;\n if (e.type === 'error' && e.turnId === anchorTurn) lastError = e.message;\n if ((e.type === 'turn-done' || e.type === 'cancelled') && e.turnId === anchorTurn) terminal = e;\n }\n if (!terminal) return session;\n const failed = terminal.type === 'turn-done' && !terminal.ok && lastError !== null;\n return {\n ...session,\n status: failed ? 'error' : 'idle',\n lastError: failed ? lastError : null,\n updatedAt: terminal.at > session.updatedAt ? terminal.at : session.updatedAt,\n };\n}\n\n/** Optimistic status flip (e.g. right after POST …/turns returns 202). */\nexport function setVerseSessionStatus(sessionId: string, status: VerseSession['status']): void {\n const current = entryFor(sessionId);\n if (!current.session || current.session.status === status) return;\n patch(sessionId, { session: { ...current.session, status } });\n}\n\nexport interface VerseApplyResult {\n /** Persisted events newly added to the log (duplicates excluded). */\n applied: number;\n /** A newly added event settled a turn (`turn-done` / `cancelled` / `error`) — the lists may be stale. */\n settled: boolean;\n /** A transient frame changed the live state. */\n liveChanged: boolean;\n}\n\n/**\n * Apply a BATCH of live events in arrival order, then notify once.\n *\n * Persisted events: duplicates (a stream that replays from the start, or a\n * resume that overlaps the detail fetch) are dropped by seq; an event past\n * the newest seq is appended; an older unseen one is inserted in place.\n * Session-level side effects: `usage` and `context` update the live context\n * meter, `compaction` counts a native compaction, `turn-started` flips\n * status to running, `turn-done`/`cancelled`/`error` settle it, and a codex\n * `turn-done.nativeSessionId` is captured.\n *\n * Transient events (VERSE_TRANSIENT_EVENT_TYPES) never enter the log and\n * never move `lastSeq`: they carry the last PERSISTED seq, so deduping them\n * by seq would drop every one of them. They only update `live`.\n */\nexport function applyVerseEvents(sessionId: string, incoming: readonly VerseEvent[]): VerseApplyResult {\n const current = entryFor(sessionId);\n let events: VerseEvent[] = current.events;\n let copied = false;\n let lastSeq = current.lastSeq;\n let session = current.session;\n let live = current.live;\n let applied = 0;\n let settled = false;\n let structural = false;\n let liveChanged = false;\n const now = Date.now();\n\n for (const event of incoming) {\n if (isTransientVerseEvent(event)) {\n const next = applyTransient(live, event, now);\n if (next !== live) {\n live = next;\n liveChanged = true;\n }\n continue;\n }\n if (!Number.isFinite(event.seq)) continue;\n const tail = events.length > 0 ? events[events.length - 1]!.seq : -Infinity;\n if (event.seq > tail) {\n if (!copied) {\n events = events.slice();\n copied = true;\n }\n events.push(event);\n } else {\n const at = seqIndex(events, event.seq);\n if (at.found) continue;\n if (!copied) {\n events = events.slice();\n copied = true;\n }\n events.splice(at.index, 0, event);\n }\n applied += 1;\n lastSeq = Math.max(lastSeq, event.seq);\n if (event.type !== 'text-delta') structural = true;\n if (event.type === 'turn-done' || event.type === 'cancelled' || event.type === 'error') settled = true;\n if (session) session = sessionAfter(session, event);\n const nextLive = livePersisted(live, event, now, sessionId);\n if (nextLive !== live) live = nextLive;\n }\n\n if (applied === 0 && !liveChanged) return { applied: 0, settled: false, liveChanged: false };\n commit(sessionId, { ...current, events, lastSeq, session, live }, structural);\n notify(sessionId);\n return { applied, settled, liveChanged };\n}\n\n/**\n * Apply one live event (the single-event form of applyVerseEvents). Returns\n * true when the log gained the event, or — for a transient frame — when the\n * live state changed.\n */\nexport function applyVerseEvent(sessionId: string, event: VerseEvent): boolean {\n const result = applyVerseEvents(sessionId, [event]);\n return result.applied > 0 || result.liveChanged;\n}\n\n/** A persisted event's effect on the session record (the old applyVerseEvent switch). */\nfunction sessionAfter(session: VerseSession, event: VerseEvent): VerseSession {\n switch (event.type) {\n case 'turn-started':\n return { ...session, status: 'running', lastError: null, updatedAt: event.at };\n case 'usage':\n return { ...session, usage: applyUsageFrame(session, event.usage), updatedAt: event.at };\n case 'context':\n return { ...session, usage: applyContextReading(session, event), updatedAt: event.at };\n case 'compaction':\n // Counted exactly as the server counts it (session-engine), so a reload\n // shows the same number the live stream did. Occupancy is NOT touched\n // here: the next `usage`/`context` reading is the measurement.\n return { ...session, compactionCount: (session.compactionCount ?? 0) + 1, updatedAt: event.at };\n case 'turn-done':\n return {\n ...session,\n status: event.ok ? 'idle' : session.lastError ? 'error' : 'idle',\n turnCount: session.turnCount + 1,\n nativeSessionId: event.nativeSessionId ?? session.nativeSessionId,\n updatedAt: event.at,\n };\n case 'error':\n return { ...session, status: 'error', lastError: event.message, updatedAt: event.at };\n case 'cancelled':\n return { ...session, status: 'idle', updatedAt: event.at };\n default:\n return session;\n }\n}\n\nfunction stampMs(at: string, fallback: number): number {\n const parsed = Date.parse(at);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\n/** Enter (or stay in) the live context of `turnId`. */\nfunction liveForTurn(live: VerseLiveState, turnId: string, startedAt: number): VerseLiveState {\n if (live.turnId === turnId) return live;\n return { ...EMPTY_LIVE, turnId, startedAt, settledTurnId: live.settledTurnId };\n}\n\nfunction applyTransient(live: VerseLiveState, event: VerseTransientEvent, now: number): VerseLiveState {\n // A frame for a turn that already settled (late delivery after turn-done)\n // must not bring the live line back.\n if (event.turnId !== null && event.turnId === live.settledTurnId) return live;\n const base = event.turnId !== null ? liveForTurn(live, event.turnId, now) : live;\n switch (event.type) {\n case 'thinking-delta': {\n if (event.text.length === 0) return base;\n const block = base.thinking && base.thinking.turnId === event.turnId\n ? { ...base.thinking, text: base.thinking.text + event.text }\n : { turnId: event.turnId, text: event.text, startedAt: now, estimatedTokens: null };\n return { ...base, thinking: block, notice: null };\n }\n case 'thinking-progress': {\n const block = base.thinking && base.thinking.turnId === event.turnId\n ? { ...base.thinking, estimatedTokens: event.estimatedTokens }\n : { turnId: event.turnId, text: '', startedAt: now, estimatedTokens: event.estimatedTokens };\n return { ...base, thinking: block };\n }\n case 'progress':\n return {\n ...base,\n progress: {\n phase: event.phase,\n tool: typeof event.tool === 'string' && event.tool.length > 0 ? event.tool : null,\n elapsedMs: event.elapsedMs,\n outTokens: event.outTokens ?? null,\n tokPerSec: event.tokPerSec ?? null,\n receivedAt: now,\n },\n };\n case 'status':\n return { ...base, notice: { kind: event.kind, message: event.message, at: event.at, receivedAt: now } };\n default:\n return base;\n }\n}\n\n/** A persisted event's effect on the live state. */\nfunction livePersisted(live: VerseLiveState, event: VerseEvent, now: number, sessionId: string): VerseLiveState {\n switch (event.type) {\n case 'turn-started':\n if (event.turnId === live.settledTurnId) return live;\n return live.turnId === event.turnId\n ? { ...live, startedAt: stampMs(event.at, live.startedAt ?? now) }\n : { ...EMPTY_LIVE, turnId: event.turnId, startedAt: stampMs(event.at, now), settledTurnId: live.settledTurnId };\n case 'thinking': {\n // The persisted block supersedes the streamed one. What this tab\n // measured while it streamed (duration, the CLI's token estimate) is\n // kept beside the log, by seq, so the finished block can still say\n // \"Thought 12s · ~1.8k tok\" — the event itself is immutable.\n const streamed = live.thinking && live.thinking.turnId === event.turnId ? live.thinking : null;\n if (streamed) {\n let stats = thinkingStats.get(sessionId);\n if (!stats) {\n stats = new Map();\n thinkingStats.set(sessionId, stats);\n }\n stats.set(event.seq, {\n durationMs: typeof event.durationMs === 'number' ? event.durationMs : Math.max(0, now - streamed.startedAt),\n estimatedTokens: streamed.estimatedTokens,\n });\n }\n return streamed || live.notice ? { ...live, thinking: streamed ? null : live.thinking, notice: null } : live;\n }\n case 'text-delta':\n case 'assistant-message':\n case 'tool-use':\n case 'tool-result':\n // Output resumed: a retry went through, the watchdog's silence ended.\n return live.notice && (event.turnId === live.turnId || live.turnId === null) ? { ...live, notice: null } : live;\n case 'turn-done':\n case 'cancelled':\n return { ...EMPTY_LIVE, settledTurnId: event.turnId };\n default:\n return live;\n }\n}\n\n/**\n * Live state implied by a freshly merged log: a chat opened (or reloaded)\n * mid-turn still shows its live line, timed from the turn's own stamp; a\n * log whose last turn is settled shows none.\n */\nfunction liveFromLog(live: VerseLiveState, events: readonly VerseEvent[], session: VerseSession | null): VerseLiveState {\n let openTurn: Extract<VerseEvent, { type: 'turn-started' }> | null = null;\n let settledTurnId: string | null = live.settledTurnId;\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const e = events[i]!;\n if (e.type === 'turn-done' || e.type === 'cancelled') {\n settledTurnId = e.turnId;\n break;\n }\n if (e.type === 'turn-started') {\n openTurn = e;\n break;\n }\n }\n if (!openTurn) {\n if (live.turnId !== null && live.turnId === settledTurnId) return { ...EMPTY_LIVE, settledTurnId };\n // No turn-started in the log yet (the POST just went out): keep whatever\n // the stream already told us; nothing in the log contradicts it.\n return live.settledTurnId === settledTurnId ? live : { ...live, settledTurnId };\n }\n if (session && session.status !== 'running') return live.turnId === null ? live : { ...EMPTY_LIVE, settledTurnId: live.settledTurnId };\n if (live.turnId === openTurn.turnId) return live;\n return { ...EMPTY_LIVE, turnId: openTurn.turnId, startedAt: stampMs(openTurn.at, Date.now()), settledTurnId: live.settledTurnId };\n}\n\n/**\n * Fold one `usage` frame into the session record. The frame carries THIS\n * turn's counts; the record keeps the session totals (server: session-engine\n * applyUsage). Occupancy and the window are live values, not sums.\n *\n * V3.9 fields are adopted only when the frame carries them (spread-when-\n * present), so a pre-3.9 server's frames leave the record's shape unchanged.\n * The one exception is a local seat: Verse SETS that window\n * (`CLAUDE_CODE_MAX_CONTEXT_TOKENS`), so a window a frame reports without\n * provenance is not allowed to replace it — the server ignores runtime\n * windows on local for the same reason.\n */\nexport function applyUsageFrame(session: VerseSession, frame: VerseUsage): VerseUsage {\n const prev = session.usage;\n const next: VerseUsage = {\n ...prev,\n inputTokens: prev.inputTokens + frame.inputTokens,\n outputTokens: prev.outputTokens + frame.outputTokens,\n cacheReadTokens: prev.cacheReadTokens + frame.cacheReadTokens,\n cacheCreationTokens: prev.cacheCreationTokens + frame.cacheCreationTokens,\n contextTokens: frame.contextTokens,\n };\n const frameWindow = typeof frame.contextWindow === 'number' && frame.contextWindow > 0 ? frame.contextWindow : null;\n const trusted = frame.contextWindowSource !== undefined || session.engine !== 'local';\n if (frameWindow !== null && trusted) next.contextWindow = frameWindow;\n if (frame.contextWindowSource !== undefined) next.contextWindowSource = frame.contextWindowSource;\n if (frame.autoCompactAt !== undefined) next.autoCompactAt = frame.autoCompactAt;\n // The server marks an EXACT reading by OMITTING the key (it only writes\n // `false`), so a resolved frame without it must clear an earlier \"≤\" — a\n // frame from a pre-3.9 server (no V3.9 fields at all) leaves it alone.\n if (frame.contextTokensExact === false) next.contextTokensExact = false;\n else if (frame.contextWindowSource !== undefined) delete next.contextTokensExact;\n return next;\n}\n\n/** The provenance values a frame may carry; anything else is ignored, never stored. */\nconst WINDOW_SOURCES: ReadonlySet<string> = new Set<VerseWindowSource>(['runtime', 'provider-catalog', 'cli-catalog', 'documented', 'fallback']);\n\nfunction frameWindowSource(value: unknown): VerseWindowSource | null {\n return typeof value === 'string' && WINDOW_SOURCES.has(value) ? (value as VerseWindowSource) : null;\n}\n\n/**\n * Apply a `context` reading: it REPLACES occupancy (never summed). When it\n * names a window, the window's provenance is the one the EVENT states\n * (`contextWindowSource`, V3.9): the engine also emits a `context` event\n * after a MODE SWITCH, carrying the new mode's CATALOG budget, and stamping\n * that 'runtime' made the tooltip say \"reported by the CLI on the last turn\"\n * for a number no CLI reported — and pinned it ahead of later catalog\n * corrections (sessionContextBudget precedence 1). Only an event from a\n * server that predates the field (no source at all) is taken as a runtime\n * reading, which is what every such event was.\n *\n * The engine fills `autoCompactAt` for the window in force; a frame without\n * it (an older server) is reconciled from the previous budget rather than\n * left pointing at a compaction point that belonged to a different window.\n */\nexport function applyContextReading(\n session: VerseSession,\n event: Extract<VerseEvent, { type: 'context' }>,\n): VerseUsage {\n const prev = session.usage;\n const next: VerseUsage = {\n ...prev,\n contextTokens: Math.max(0, Math.floor(event.contextTokens)),\n contextTokensExact: event.exact,\n };\n const window = typeof event.contextWindow === 'number' && event.contextWindow > 0 ? event.contextWindow : null;\n const stated = frameWindowSource(event.contextWindowSource);\n // Local windows are SET by Verse (CLAUDE_CODE_MAX_CONTEXT_TOKENS), not\n // measured: a window without provenance is not allowed to move one (see\n // applyUsageFrame). A V3.9 event that states its source is the engine's\n // own record of the window it just launched with, so it is adopted.\n if (window === null || (session.engine === 'local' && stated === null)) {\n if (event.autoCompactAt !== undefined && event.autoCompactAt !== null) next.autoCompactAt = event.autoCompactAt;\n return next;\n }\n next.contextWindow = window;\n next.contextWindowSource = stated ?? 'runtime';\n if (event.autoCompactAt !== undefined) {\n next.autoCompactAt = event.autoCompactAt;\n } else if (window !== prev.contextWindow) {\n next.autoCompactAt = reconcileAutoCompactAt({\n engine: session.engine,\n runtimeWindow: window,\n budget: prev.contextWindow ? { contextWindow: prev.contextWindow, autoCompactAt: prev.autoCompactAt ?? null } : null,\n });\n }\n return next;\n}\n\nexport function forgetVerseSession(sessionId: string): void {\n const existed = sessions.delete(sessionId);\n heads.delete(sessionId);\n thinkingStats.delete(sessionId);\n for (const l of [...lifecycleListeners]) l({ kind: 'forget', sessionId });\n if (existed) notify(sessionId);\n}\n\n/** Test/logout hygiene. */\nexport function resetVerseStore(): void {\n sessions.clear();\n heads.clear();\n thinkingStats.clear();\n for (const l of [...lifecycleListeners]) l({ kind: 'reset' });\n notify(null);\n}\n\n/** Position of `seq` in a seq-sorted log (binary search). */\nfunction seqIndex(events: readonly VerseEvent[], seq: number): { found: boolean; index: number } {\n let lo = 0;\n let hi = events.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const s = events[mid]!.seq;\n if (s === seq) return { found: true, index: mid };\n if (s < seq) lo = mid + 1;\n else hi = mid;\n }\n return { found: false, index: lo };\n}\n\n/** Sorted by seq, one event per seq (first occurrence wins), non-finite seqs dropped. */\nfunction normalizeEvents(events: readonly VerseEvent[]): VerseEvent[] {\n let ascending = true;\n for (let i = 0; i < events.length; i += 1) {\n const seq = events[i]!.seq;\n if (!Number.isFinite(seq) || (i > 0 && seq <= events[i - 1]!.seq)) {\n ascending = false;\n break;\n }\n }\n if (ascending) return events.slice();\n const bySeq = new Map<number, VerseEvent>();\n for (const e of events) if (Number.isFinite(e.seq) && !bySeq.has(e.seq)) bySeq.set(e.seq, e);\n return [...bySeq.values()].sort((a, b) => a.seq - b.seq);\n}\n\n/**\n * Union of two logs by seq, existing events winning. Returns `existing`\n * itself when `incoming` adds nothing, so a refetch that brought no news is\n * not a change. Linear in the two lengths (both are seq-sorted).\n */\nfunction mergeEvents(existing: VerseEvent[], incomingRaw: readonly VerseEvent[]): VerseEvent[] {\n if (incomingRaw.length === 0) return existing;\n const incoming = normalizeEvents(incomingRaw);\n if (incoming.length === 0) return existing;\n if (existing.length === 0) return incoming;\n if (incoming[0]!.seq > existing[existing.length - 1]!.seq) return existing.concat(incoming);\n const out: VerseEvent[] = [];\n let added = 0;\n let i = 0;\n let j = 0;\n while (i < existing.length || j < incoming.length) {\n const a = existing[i];\n const b = incoming[j];\n if (b === undefined || (a !== undefined && a.seq < b.seq)) {\n out.push(a!);\n i += 1;\n } else if (a === undefined || b.seq < a.seq) {\n out.push(b);\n added += 1;\n j += 1;\n } else {\n out.push(a);\n i += 1;\n j += 1;\n }\n }\n return added === 0 ? existing : out;\n}\n\nfunction shallowEqualValue(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (!a || !b || typeof a !== 'object' || typeof b !== 'object' || Array.isArray(a) !== Array.isArray(b)) return false;\n const ka = Object.keys(a as object);\n const kb = Object.keys(b as object);\n if (ka.length !== kb.length) return false;\n for (const k of ka) {\n if (!Object.is((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k])) return false;\n }\n return true;\n}\n\n/** Same record, one level deep — a refetched but unchanged session must not re-render its chat. */\nfunction sameSession(a: VerseSession, b: VerseSession): boolean {\n if (a === b) return true;\n const ka = Object.keys(a) as Array<keyof VerseSession>;\n if (ka.length !== Object.keys(b).length) return false;\n return ka.every((k) => shallowEqualValue(a[k], b[k]));\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/surface-prefetch-BWr0LBQn.js","assets/queries-CyBE8nsW.js","assets/budget-queries-DsAjH8ac.js","assets/cloud-queries-QAhpExlz.js","assets/types-D5XOdyw8.js","assets/overnight-queries-mlO0xzsr.js","assets/format-Dk4Fmxax.js","assets/format-DKrNjdwD.js","assets/verse-model-MMySehjj.js","assets/compaction-point-VL9oegWS.js","assets/control-queries-DAvlh_YM.js","assets/mutations-DTCtKCn_.js","assets/surface-data-CchClvHo.js","assets/global-BlI2BYa1.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.css"])))=>i.map(i=>d[i]);
2
+ import{t as e}from"./index-QesfXBsb.js";import{Q as t,q as n}from"./VerseConsoleApp-BCY5uSok.js";var r=[`pointerdown`,`keydown`,`wheel`,`touchstart`],i={capture:!0,passive:!0};function a(e={}){let t=e.win??window,n=e.doc??document,a=e.now??(()=>Date.now()),o=e.quietMs??2e3,s=Math.max(1,e.pollMs??250),c=e.busy??(()=>!1),l=e.timeoutMs??3e3,u=!1,d=a(),f=new Set,p=()=>{d=a()};for(let e of r)n.addEventListener(e,p,i);let m=()=>d+o-a(),h=()=>n.visibilityState!==`hidden`&&m()<=0&&!c();function g(){return u?Promise.resolve(!1):new Promise(e=>{let r=()=>void 0,i=()=>{r(),e(!1)},o=()=>{f.delete(i),e(!0)};f.add(i);let u=()=>{if(r=()=>void 0,n.visibilityState===`hidden`){let e=()=>{n.visibilityState!==`hidden`&&(n.removeEventListener(`visibilitychange`,e),d=a(),u())};n.addEventListener(`visibilitychange`,e),r=()=>n.removeEventListener(`visibilitychange`,e);return}let e=m();if(e>0||c()){let n=t.setTimeout(u,e>0?e:s);r=()=>t.clearTimeout(n);return}if(typeof t.requestIdleCallback==`function`){let e=t.requestIdleCallback(()=>h()?o():u(),{timeout:l});r=()=>t.cancelIdleCallback?.(e);return}o()};u()})}function _(e){return u?Promise.resolve(!1):new Promise(n=>{let r=0,i=()=>{t.clearTimeout(r),n(!1)};r=t.setTimeout(()=>{f.delete(i),n(!0)},e),f.add(i)})}function v(){if(!u){u=!0;for(let e of r)n.removeEventListener(e,p,i);for(let e of[...f])e();f.clear()}}return{wait:g,pause:_,cancel:v}}function o(e,t={}){let n=a(t),r=t.gapMs??400;return(async()=>{for(let[t,i]of e.entries()){if(t>0&&r>0&&!await n.pause(r)||!await n.wait())return;try{await i(n)}catch{}}n.cancel()})(),n.cancel}var s=()=>e(()=>import(`./surface-prefetch-BWr0LBQn.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]));function c(e,r={}){let i=e=>async()=>{await e()},a=n=>async r=>{if(t().mounted.includes(n))return;await e.loadSection(n);let{prefetchSurfaceData:i}=await s();await i(n,{beforeEach:()=>r.wait()})};return o([...e.overlays.map(i),...n.map(e=>a(e.id))],{busy:e.readsInFlight,...r})}export{c as warmUpAfterFirstPaint};
3
+ //# sourceMappingURL=warmup-CNEH_-be.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/idle-prefetch.ts","../../../../../../src/web-ui/routes/verse/shell/warmup.ts"],"sourcesContent":["/**\n * routes/verse/shell/idle-prefetch.ts — run warm-up work in the gaps the\n * operator leaves, never in front of them (unit C1; review 3.10.1).\n *\n * createIdleGate() \"is the operator idle?\" as a promise: the window\n * is shown, no input for `quietMs`, none of the\n * operator's reads in flight (`busy`), and — where\n * the browser can tell — an idle callback;\n * runIdleSteps(steps) the steps one at a time: each waits for the gate,\n * and the next starts only after the previous one\n * has FINISHED (its promise settled) plus `gapMs`.\n *\n * WHY A GATE AND NOT A TIMER. WebKit — so the desktop app's WKWebView — has\n * no requestIdleCallback. 3.10.1 first fell back to fixed timers there (1.5 s,\n * then a step every 400 ms counted from each step's kickoff, not its end), so\n * the warm-up started ~9 reads in about a second whatever the operator was\n * doing, and a chat opened two seconds after launch queued behind the 90-day\n * history and the reasoning digest. The gate instead measures the two things\n * that matter: the operator's hands (pointer, keys, wheel, touch — observed\n * in the capture phase, passively, never delayed) and the operator's reads\n * (the caller's `busy`, which the shell wires to the query cache's gate).\n * Every wait re-checks both, so warm-up work yields the moment the operator\n * does something and resumes only after a fresh quiet period.\n *\n * A HIDDEN document runs nothing: a wait parks on `visibilitychange`, and\n * coming back counts as input (a fresh quiet period — the operator is about\n * to act). Cancel stops everything still pending — timers, idle callbacks,\n * the visibility and input listeners — and resolves every open wait `false`;\n * a step already running finishes on its own. The runner cancels its gate\n * when the last step is done, so a finished warm-up listens to nothing.\n *\n * LAZY ONLY. Framework- and dependency-free, and never imported statically by\n * VerseApp: shell/warmup.ts (itself loaded with import()) is its only user,\n * so none of this costs chat first-paint bytes (VerseApp.first-paint.test.ts).\n */\n\ntype IdleWindow = Pick<Window, 'setTimeout' | 'clearTimeout'> & {\n requestIdleCallback?: (cb: () => void, options?: { timeout: number }) => number;\n cancelIdleCallback?: (id: number) => void;\n};\n\ntype GateDocument = Pick<Document, 'visibilityState' | 'addEventListener' | 'removeEventListener'>;\n\nexport interface IdleGateOptions {\n /** No operator input for this long before anything runs. */\n quietMs?: number;\n /** How often a wait re-checks `busy` once the quiet period is met. */\n pollMs?: number;\n /** True while the operator's own work is in flight (the shell: the query cache's gate). */\n busy?: () => boolean;\n /** requestIdleCallback's deadline, where it exists. */\n timeoutMs?: number;\n /** Test seams. */\n win?: IdleWindow;\n doc?: GateDocument;\n now?: () => number;\n}\n\nexport interface IdleGate {\n /** Resolves true once the operator is idle; false if the gate is (or gets) cancelled first. */\n wait(): Promise<boolean>;\n /** A plain pause that cancel also ends (false). */\n pause(ms: number): Promise<boolean>;\n cancel(): void;\n}\n\nexport const IDLE_QUIET_MS = 2_000;\nexport const IDLE_POLL_MS = 250;\nexport const IDLE_TIMEOUT_MS = 3_000;\nexport const IDLE_STEP_GAP_MS = 400;\n\n/** What counts as the operator doing something. */\nexport const IDLE_INPUT_EVENTS = ['pointerdown', 'keydown', 'wheel', 'touchstart'] as const;\n\nconst LISTEN = { capture: true, passive: true } as const;\n\nexport function createIdleGate(options: IdleGateOptions = {}): IdleGate {\n const win = options.win ?? (window as IdleWindow);\n const doc = options.doc ?? document;\n const now = options.now ?? (() => Date.now());\n const quietMs = options.quietMs ?? IDLE_QUIET_MS;\n const pollMs = Math.max(1, options.pollMs ?? IDLE_POLL_MS);\n const busy = options.busy ?? (() => false);\n const timeoutMs = options.timeoutMs ?? IDLE_TIMEOUT_MS;\n\n let cancelled = false;\n // The gate is created at first paint: the quiet period counts from there.\n let lastInput = now();\n /** One abort per open wait / pause: disarms what it armed and settles it `false`. */\n const open = new Set<() => void>();\n\n const onInput = (): void => {\n lastInput = now();\n };\n for (const type of IDLE_INPUT_EVENTS) doc.addEventListener(type, onInput, LISTEN);\n\n const quietLeft = (): number => lastInput + quietMs - now();\n const idleNow = (): boolean => doc.visibilityState !== 'hidden' && quietLeft() <= 0 && !busy();\n\n function wait(): Promise<boolean> {\n if (cancelled) return Promise.resolve(false);\n return new Promise<boolean>((resolve) => {\n let disarm = (): void => undefined;\n const abort = (): void => {\n disarm();\n resolve(false);\n };\n const done = (): void => {\n open.delete(abort);\n resolve(true);\n };\n open.add(abort);\n\n const check = (): void => {\n disarm = () => undefined;\n if (doc.visibilityState === 'hidden') {\n const onShown = (): void => {\n if (doc.visibilityState === 'hidden') return;\n doc.removeEventListener('visibilitychange', onShown);\n lastInput = now();\n check();\n };\n doc.addEventListener('visibilitychange', onShown);\n disarm = () => doc.removeEventListener('visibilitychange', onShown);\n return;\n }\n const left = quietLeft();\n if (left > 0 || busy()) {\n const id = win.setTimeout(check, left > 0 ? left : pollMs);\n disarm = () => win.clearTimeout(id);\n return;\n }\n if (typeof win.requestIdleCallback === 'function') {\n // Input or a read may have started while the browser was busy: re-check on the way out.\n const id = win.requestIdleCallback(() => (idleNow() ? done() : check()), { timeout: timeoutMs });\n disarm = () => win.cancelIdleCallback?.(id);\n return;\n }\n done();\n };\n check();\n });\n }\n\n function pause(ms: number): Promise<boolean> {\n if (cancelled) return Promise.resolve(false);\n return new Promise<boolean>((resolve) => {\n let id = 0;\n const abort = (): void => {\n win.clearTimeout(id);\n resolve(false);\n };\n id = win.setTimeout(() => {\n open.delete(abort);\n resolve(true);\n }, ms);\n open.add(abort);\n });\n }\n\n function cancel(): void {\n if (cancelled) return;\n cancelled = true;\n for (const type of IDLE_INPUT_EVENTS) doc.removeEventListener(type, onInput, LISTEN);\n for (const abort of [...open]) abort();\n open.clear();\n }\n\n return { wait, pause, cancel };\n}\n\nexport type IdleStep = (gate: IdleGate) => void | Promise<void>;\n\nexport interface IdleStepsOptions extends IdleGateOptions {\n /** Pause after one step has finished before the next waits for the gate. */\n gapMs?: number;\n}\n\n/**\n * Run `steps` in order, each once the operator is idle and only after the\n * previous one has settled (plus `gapMs`). A step receives the gate so it can\n * wait again between its own pieces of work. A step that throws or rejects is\n * skipped, never fatal. Returns a cancel that stops every step not yet started\n * and every wait a running step is parked on.\n */\nexport function runIdleSteps(steps: readonly IdleStep[], options: IdleStepsOptions = {}): () => void {\n const gate = createIdleGate(options);\n const gapMs = options.gapMs ?? IDLE_STEP_GAP_MS;\n void (async () => {\n for (const [index, step] of steps.entries()) {\n if (index > 0 && gapMs > 0 && !(await gate.pause(gapMs))) return;\n if (!(await gate.wait())) return;\n try {\n await step(gate);\n } catch {\n // Warm-up only: a step that fails costs the operator a skeleton later, nothing more.\n }\n }\n gate.cancel();\n })();\n return gate.cancel;\n}\n","/**\n * routes/verse/shell/warmup.ts — what the shell warms after first paint, in\n * what order, and when (unit C1; review 3.10.1).\n *\n * 1. the overlay chunks, one at a time, so the first ⌘K / ⌘J / ⌘/ never\n * waits on the network;\n * 2. each rail surface not yet open, in rail order — its chunk (VerseApp's\n * one-per-tab load, so the first visit mounts it directly) and then the\n * reads it opens with (shell/surface-prefetch.ts, one read at a time).\n * A first visit then paints from cache instead of a skeleton.\n *\n * WHEN: every chunk and every read waits for the idle gate\n * (shell/idle-prefetch.ts): window shown, no operator input for a quiet\n * period, and NOTHING in the query cache's gate — no read of the operator's\n * running or queued. The warm-up therefore holds at most one of the gate's\n * four slots, never while the operator's own reads wait, and never in front\n * of the chat's first actions: a click or ⌘N restarts the quiet period, and\n * the reads it causes are waited out before the next warm-up read starts.\n *\n * LAZY ONLY. VerseApp loads this module with import() from a mount effect,\n * so neither the scheduler nor the surface table costs chat first-paint\n * bytes; the surface table is a further import() from here, at the first\n * surface step (VerseApp.first-paint.test.ts pins both).\n */\nimport { getVerseUiState, RAIL_SECTIONS, type VerseSectionId } from '../verse-ui-store.js';\nimport { runIdleSteps, type IdleGate, type IdleStep, type IdleStepsOptions } from './idle-prefetch.js';\n\nexport type WarmupOptions = IdleStepsOptions;\n\nexport interface WarmupDeps {\n /** VerseApp's one load per section (its lazy component shares it). */\n loadSection: (id: VerseSectionId) => Promise<unknown>;\n /** The overlay chunks, in the order they are worth having. */\n overlays: ReadonlyArray<() => Promise<unknown>>;\n /**\n * True while any read is running or queued in the query cache's gate\n * (VerseApp reads `queryGateStats`). Injected rather than imported: a\n * static data/cache.ts import from this chunk made the bundler split the\n * cache out of its shared first-paint chunk (+1.2 KB of chat critical JS,\n * more than moving the scheduler out saved).\n */\n readsInFlight: () => boolean;\n}\n\nconst importSurfacePrefetch = () => import('./surface-prefetch.js');\n\n/** Start the warm-up. Returns a cancel (VerseApp calls it on unmount). */\nexport function warmUpAfterFirstPaint(deps: WarmupDeps, options: WarmupOptions = {}): () => void {\n const overlay = (load: () => Promise<unknown>): IdleStep => async () => {\n await load();\n };\n const surface = (id: VerseSectionId): IdleStep => async (gate: IdleGate) => {\n // Already open: its reads are live, and its chunk is in.\n if (getVerseUiState().mounted.includes(id)) return;\n await deps.loadSection(id);\n const { prefetchSurfaceData } = await importSurfacePrefetch();\n await prefetchSurfaceData(id, { beforeEach: () => gate.wait() });\n };\n return runIdleSteps([...deps.overlays.map(overlay), ...RAIL_SECTIONS.map((s) => surface(s.id))], {\n busy: deps.readsInFlight,\n ...options,\n });\n}\n"],"file":"warmup-HG5vYbsN.js"}
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/idle-prefetch.ts","../../../../../../src/web-ui/routes/verse/shell/warmup.ts"],"sourcesContent":["/**\n * routes/verse/shell/idle-prefetch.ts — run warm-up work in the gaps the\n * operator leaves, never in front of them (unit C1; review 3.10.1).\n *\n * createIdleGate() \"is the operator idle?\" as a promise: the window\n * is shown, no input for `quietMs`, none of the\n * operator's reads in flight (`busy`), and — where\n * the browser can tell — an idle callback;\n * runIdleSteps(steps) the steps one at a time: each waits for the gate,\n * and the next starts only after the previous one\n * has FINISHED (its promise settled) plus `gapMs`.\n *\n * WHY A GATE AND NOT A TIMER. WebKit — so the desktop app's WKWebView — has\n * no requestIdleCallback. 3.10.1 first fell back to fixed timers there (1.5 s,\n * then a step every 400 ms counted from each step's kickoff, not its end), so\n * the warm-up started ~9 reads in about a second whatever the operator was\n * doing, and a chat opened two seconds after launch queued behind the 90-day\n * history and the reasoning digest. The gate instead measures the two things\n * that matter: the operator's hands (pointer, keys, wheel, touch — observed\n * in the capture phase, passively, never delayed) and the operator's reads\n * (the caller's `busy`, which the shell wires to the query cache's gate).\n * Every wait re-checks both, so warm-up work yields the moment the operator\n * does something and resumes only after a fresh quiet period.\n *\n * A HIDDEN document runs nothing: a wait parks on `visibilitychange`, and\n * coming back counts as input (a fresh quiet period — the operator is about\n * to act). Cancel stops everything still pending — timers, idle callbacks,\n * the visibility and input listeners — and resolves every open wait `false`;\n * a step already running finishes on its own. The runner cancels its gate\n * when the last step is done, so a finished warm-up listens to nothing.\n *\n * LAZY ONLY. Framework- and dependency-free, and never imported statically by\n * VerseApp: shell/warmup.ts (itself loaded with import()) is its only user,\n * so none of this costs chat first-paint bytes (VerseApp.first-paint.test.ts).\n */\n\ntype IdleWindow = Pick<Window, 'setTimeout' | 'clearTimeout'> & {\n requestIdleCallback?: (cb: () => void, options?: { timeout: number }) => number;\n cancelIdleCallback?: (id: number) => void;\n};\n\ntype GateDocument = Pick<Document, 'visibilityState' | 'addEventListener' | 'removeEventListener'>;\n\nexport interface IdleGateOptions {\n /** No operator input for this long before anything runs. */\n quietMs?: number;\n /** How often a wait re-checks `busy` once the quiet period is met. */\n pollMs?: number;\n /** True while the operator's own work is in flight (the shell: the query cache's gate). */\n busy?: () => boolean;\n /** requestIdleCallback's deadline, where it exists. */\n timeoutMs?: number;\n /** Test seams. */\n win?: IdleWindow;\n doc?: GateDocument;\n now?: () => number;\n}\n\nexport interface IdleGate {\n /** Resolves true once the operator is idle; false if the gate is (or gets) cancelled first. */\n wait(): Promise<boolean>;\n /** A plain pause that cancel also ends (false). */\n pause(ms: number): Promise<boolean>;\n cancel(): void;\n}\n\nexport const IDLE_QUIET_MS = 2_000;\nexport const IDLE_POLL_MS = 250;\nexport const IDLE_TIMEOUT_MS = 3_000;\nexport const IDLE_STEP_GAP_MS = 400;\n\n/** What counts as the operator doing something. */\nexport const IDLE_INPUT_EVENTS = ['pointerdown', 'keydown', 'wheel', 'touchstart'] as const;\n\nconst LISTEN = { capture: true, passive: true } as const;\n\nexport function createIdleGate(options: IdleGateOptions = {}): IdleGate {\n const win = options.win ?? (window as IdleWindow);\n const doc = options.doc ?? document;\n const now = options.now ?? (() => Date.now());\n const quietMs = options.quietMs ?? IDLE_QUIET_MS;\n const pollMs = Math.max(1, options.pollMs ?? IDLE_POLL_MS);\n const busy = options.busy ?? (() => false);\n const timeoutMs = options.timeoutMs ?? IDLE_TIMEOUT_MS;\n\n let cancelled = false;\n // The gate is created at first paint: the quiet period counts from there.\n let lastInput = now();\n /** One abort per open wait / pause: disarms what it armed and settles it `false`. */\n const open = new Set<() => void>();\n\n const onInput = (): void => {\n lastInput = now();\n };\n for (const type of IDLE_INPUT_EVENTS) doc.addEventListener(type, onInput, LISTEN);\n\n const quietLeft = (): number => lastInput + quietMs - now();\n const idleNow = (): boolean => doc.visibilityState !== 'hidden' && quietLeft() <= 0 && !busy();\n\n function wait(): Promise<boolean> {\n if (cancelled) return Promise.resolve(false);\n return new Promise<boolean>((resolve) => {\n let disarm = (): void => undefined;\n const abort = (): void => {\n disarm();\n resolve(false);\n };\n const done = (): void => {\n open.delete(abort);\n resolve(true);\n };\n open.add(abort);\n\n const check = (): void => {\n disarm = () => undefined;\n if (doc.visibilityState === 'hidden') {\n const onShown = (): void => {\n if (doc.visibilityState === 'hidden') return;\n doc.removeEventListener('visibilitychange', onShown);\n lastInput = now();\n check();\n };\n doc.addEventListener('visibilitychange', onShown);\n disarm = () => doc.removeEventListener('visibilitychange', onShown);\n return;\n }\n const left = quietLeft();\n if (left > 0 || busy()) {\n const id = win.setTimeout(check, left > 0 ? left : pollMs);\n disarm = () => win.clearTimeout(id);\n return;\n }\n if (typeof win.requestIdleCallback === 'function') {\n // Input or a read may have started while the browser was busy: re-check on the way out.\n const id = win.requestIdleCallback(() => (idleNow() ? done() : check()), { timeout: timeoutMs });\n disarm = () => win.cancelIdleCallback?.(id);\n return;\n }\n done();\n };\n check();\n });\n }\n\n function pause(ms: number): Promise<boolean> {\n if (cancelled) return Promise.resolve(false);\n return new Promise<boolean>((resolve) => {\n let id = 0;\n const abort = (): void => {\n win.clearTimeout(id);\n resolve(false);\n };\n id = win.setTimeout(() => {\n open.delete(abort);\n resolve(true);\n }, ms);\n open.add(abort);\n });\n }\n\n function cancel(): void {\n if (cancelled) return;\n cancelled = true;\n for (const type of IDLE_INPUT_EVENTS) doc.removeEventListener(type, onInput, LISTEN);\n for (const abort of [...open]) abort();\n open.clear();\n }\n\n return { wait, pause, cancel };\n}\n\nexport type IdleStep = (gate: IdleGate) => void | Promise<void>;\n\nexport interface IdleStepsOptions extends IdleGateOptions {\n /** Pause after one step has finished before the next waits for the gate. */\n gapMs?: number;\n}\n\n/**\n * Run `steps` in order, each once the operator is idle and only after the\n * previous one has settled (plus `gapMs`). A step receives the gate so it can\n * wait again between its own pieces of work. A step that throws or rejects is\n * skipped, never fatal. Returns a cancel that stops every step not yet started\n * and every wait a running step is parked on.\n */\nexport function runIdleSteps(steps: readonly IdleStep[], options: IdleStepsOptions = {}): () => void {\n const gate = createIdleGate(options);\n const gapMs = options.gapMs ?? IDLE_STEP_GAP_MS;\n void (async () => {\n for (const [index, step] of steps.entries()) {\n if (index > 0 && gapMs > 0 && !(await gate.pause(gapMs))) return;\n if (!(await gate.wait())) return;\n try {\n await step(gate);\n } catch {\n // Warm-up only: a step that fails costs the operator a skeleton later, nothing more.\n }\n }\n gate.cancel();\n })();\n return gate.cancel;\n}\n","/**\n * routes/verse/shell/warmup.ts — what the shell warms after first paint, in\n * what order, and when (unit C1; review 3.10.1).\n *\n * 1. the overlay chunks, one at a time, so the first ⌘K / ⌘J / ⌘/ never\n * waits on the network;\n * 2. each rail surface not yet open, in rail order — its chunk (VerseApp's\n * one-per-tab load, so the first visit mounts it directly) and then the\n * reads it opens with (shell/surface-prefetch.ts, one read at a time).\n * A first visit then paints from cache instead of a skeleton.\n *\n * WHEN: every chunk and every read waits for the idle gate\n * (shell/idle-prefetch.ts): window shown, no operator input for a quiet\n * period, and NOTHING in the query cache's gate — no read of the operator's\n * running or queued. The warm-up therefore holds at most one of the gate's\n * four slots, never while the operator's own reads wait, and never in front\n * of the chat's first actions: a click or ⌘N restarts the quiet period, and\n * the reads it causes are waited out before the next warm-up read starts.\n *\n * LAZY ONLY. VerseApp loads this module with import() from a mount effect,\n * so neither the scheduler nor the surface table costs chat first-paint\n * bytes; the surface table is a further import() from here, at the first\n * surface step (VerseApp.first-paint.test.ts pins both).\n */\nimport { getVerseUiState, RAIL_SECTIONS, type VerseSectionId } from '../verse-ui-store.js';\nimport { runIdleSteps, type IdleGate, type IdleStep, type IdleStepsOptions } from './idle-prefetch.js';\n\nexport type WarmupOptions = IdleStepsOptions;\n\nexport interface WarmupDeps {\n /** VerseApp's one load per section (its lazy component shares it). */\n loadSection: (id: VerseSectionId) => Promise<unknown>;\n /** The overlay chunks, in the order they are worth having. */\n overlays: ReadonlyArray<() => Promise<unknown>>;\n /**\n * True while any read is running or queued in the query cache's gate\n * (VerseApp reads `queryGateStats`). Injected rather than imported: a\n * static data/cache.ts import from this chunk made the bundler split the\n * cache out of its shared first-paint chunk (+1.2 KB of chat critical JS,\n * more than moving the scheduler out saved).\n */\n readsInFlight: () => boolean;\n}\n\nconst importSurfacePrefetch = () => import('./surface-prefetch.js');\n\n/** Start the warm-up. Returns a cancel (VerseApp calls it on unmount). */\nexport function warmUpAfterFirstPaint(deps: WarmupDeps, options: WarmupOptions = {}): () => void {\n const overlay = (load: () => Promise<unknown>): IdleStep => async () => {\n await load();\n };\n const surface = (id: VerseSectionId): IdleStep => async (gate: IdleGate) => {\n // Already open: its reads are live, and its chunk is in.\n if (getVerseUiState().mounted.includes(id)) return;\n await deps.loadSection(id);\n const { prefetchSurfaceData } = await importSurfacePrefetch();\n await prefetchSurfaceData(id, { beforeEach: () => gate.wait() });\n };\n return runIdleSteps([...deps.overlays.map(overlay), ...RAIL_SECTIONS.map((s) => surface(s.id))], {\n busy: deps.readsInFlight,\n ...options,\n });\n}\n"],"file":"warmup-CNEH_-be.js"}
@@ -0,0 +1,2 @@
1
+ import{b as e,n as t}from"./format-Dk4Fmxax.js";var n=new Set([`headroom`,`switched-off`,`signed-out`,`unreachable`,`spent`,`reserve`,`session-ceiling`,`unknown-usage`,`spend-cap`,`model-window`,`context`,`grant`,`lane`,`demoted`,`other`]);function r(e){return e.map(t).filter(Boolean).join(` `)}function i(e){return e.length<=1?e[0]??``:`${e.slice(0,-1).join(`, `)} and ${e[e.length-1]}`}var a=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}/,o=/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,9})?)?(?:Z|[+-]\d{2}:?\d{2})?(?![\w:])/g;function s(t,n=Date.now()){return t.replace(o,t=>e(t,n)??t)}function c(e){return typeof e==`string`&&a.test(e)&&Number.isFinite(Date.parse(e))}function l(e){return/^autonomy is switched off/i.test(e)?`switched-off`:/^signed out/i.test(e)?`signed-out`:/not reachable/i.test(e)?`unreachable`:/limits that model only/.test(e)?`model-window`:/ is spent — /.test(e)?`spent`:/is kept for you, so autonomy stops at/.test(e)?`reserve`:/used; autonomy stops at .* to protect your live session/.test(e)?`session-ceiling`:/unknown usage is not headroom|too stale to spend against|too uncertain to spend against/.test(e)?`unknown-usage`:/daily cap/.test(e)?`spend-cap`:/tokens of context/.test(e)?`context`:/is demoted/.test(e)?`demoted`:/\bgrant\b/i.test(e)?`grant`:/\blanes?\b|\bslots?\b|producer slice is held/i.test(e)?`lane`:`other`}var u=[[/(?<![\w-])grok-cli(?![\w-])/g,`Grok`],[/(?<![\w-])claude-cli(?![\w-])/g,`Claude`],[/(?<![\w-])codex(?![\w-])/g,`Codex`]];function d(e){let t=e.trim();t=t.replace(/^Codex lanes stay off until the Leader enables them\b/,`Codex stays off until the Leader turns it on`),t=t.replace(/\s*\(an? class-([A-Za-z])\s+action\)/g,(e,t)=>/^[ab]$/i.test(t)?` (you can veto it)`:``),t=t.replace(/\b(\d+)((?:\s+[A-Za-z-]+)*?)\s+([A-Za-z]+)\(s\)/g,(e,t,n,r)=>`${t}${n} ${r}${Number(t)===1?``:`s`}`),t=t.replace(/\b([A-Za-z]+)\(s\)/g,`$1s`);for(let[e,n]of u)t=t.replace(e,n);return t}function f(e){let t=e.trim(),n=/^([\s\S]*?) \(resets ([\s\S]+)\)\.?$/.exec(t),r=n?`${n[1]}.`:t,i=n?n[2].trim():null,a=c(i)?i:null,o=/ is demoted until (\S+): /.exec(r);return o&&c(o[1])&&(a=o[1],r=r.replace(` until ${o[1]}:`,`:`)),{kind:l(r),text:r,resetsAt:a,resetDescription:i!==null&&!c(i)?i:null}}function p(e){return Array.isArray(e.details)&&(e.details.length>0||e.reasons.length===0)?e.details.map(e=>n.has(e.kind)?e:{...e,kind:`other`}):e.reasons.map(f)}function m(e){return r(p(e).filter(e=>e.kind!==`headroom`).map(e=>e.kind===`lane`?d(e.text):e.text))}var h={"switched-off":`you switch autonomy on for this seat`,"signed-out":`you reconnect this account`,unreachable:`it is reachable again`,"unknown-usage":`a fresh usage reading arrives`,"spend-cap":`its daily spend cap resets`,grant:`the standing grant allows it`,lane:`its lane has a free slot`},g=new Set([`spent`,`reserve`,`session-ceiling`,`demoted`]);function _(e){return e.trim().replace(/^resets\s+/i,``)}function v(e){let t=[],n=[],r=null,i=!1,a=null;for(let o of p(e)){if(o.kind===`context`){a=`not for this task — it needs a larger context window than this seat has`;continue}let e=h[o.kind];if(e&&!t.includes(e)&&t.push(e),g.has(o.kind)){if(c(o.resetsAt))(r===null||Date.parse(o.resetsAt)>Date.parse(r))&&(r=o.resetsAt);else if(o.resetDescription){let e=_(o.resetDescription);n.includes(e)||n.push(e)}else i=!0}}return r===null&&n.length===0&&c(e.nextEligibleAt)&&(r=e.nextEligibleAt,i=!1),{conditions:t,at:r,prose:n,timeUnknown:i,never:a}}function y(t,n=Date.now()){if(t.never)return t.never;let r=[...t.at?[e(t.at,n)??t.at]:[],...t.prose],a=r.length>0?r.join(` and `):null,o=t.conditions.length>0?`when ${i(t.conditions)}`:null;return o&&a?`${o}, not before ${a}`:o||a||`unknown`}var b=/^Routed (?:autonomous )?[\w-]+-difficulty \w+ work to (.+?) \(([^()]+)\)(?: with (\d+)% of its (5-hour|weekly) window left for autonomy| (at no cost))?: ([\w-]+) mode prefers (.+?) first for this work(?:; held back [\s\S]*)?\.$/,x=/^(No seat (?:the grant lets produce )?can take [\s\S]*?) \([\s\S]*\)(?:; the earliest known reopening is \S+)?\.$/;function S(e){let t=e.trim(),n=b.exec(t);if(n){let[,e,,t,r,i,a,o]=n,s=t?` — ${t}% of its ${r} window left`:i?` — free, no usage window`:``;return s?`${e}${s}; ${a} mode prefers ${o} for this work.`:`${e} — ${a} mode prefers ${o} for this work.`}let r=x.exec(t);return r?`${r[1]}.`:t}function C(e){let n=t(e.summary??S(e.why)),r=e.exclusions.length;return r===0?n:`${n} ${r===1?`1 seat`:`${r} seats`} held back.`}export{d as a,m as i,y as n,s as o,v as r,f as s,C as t};
2
+ //# sourceMappingURL=why-seat-model-jlDTwYSc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"why-seat-model-jlDTwYSc.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/fleet/why-seat-model.ts"],"sourcesContent":["/**\n * routes/verse/fleet/why-seat-model.ts — \"Why this seat\" in words (3.10.1).\n *\n * The card used to print the router's log sentence verbatim — one run-on with\n * every held-back seat's first reason in nested parentheses and a literal\n * \"…\" — and each HELD BACK entry as `reasons.join('; ')` (hence \".;\"), with\n * raw UTC instants and \"eligible again: unknown\" for seats whose reset was\n * known all along. Now:\n *\n * - the headline is one short sentence (`SeatDecision.summary`, or the\n * same words recovered from a 3.10.0 `why`) plus \"N seats held back.\";\n * - each held-back seat lists its reasons as prose sentences, without the\n * reset clauses — those move to \"eligible again\";\n * - \"eligible again\" is derived from the reasons AS DATA: every condition\n * that must change first (\"when you switch autonomy on for this seat\")\n * and the time every time-bound blocker has lifted, in the viewer's zone\n * (\"Fri 11:46 PM\") or, for Claude, the provider's own words verbatim.\n * \"unknown\" only when nothing says.\n *\n * Records written before 3.10.1 carry only sentences; `parseLegacyReason`\n * recovers the same data from them.\n *\n * Framework-free; tested directly.\n */\nimport type { SeatDecision, SeatExclusion, SeatReason, SeatReasonKind } from '../../../../core/routing/types.js';\nimport { describeResetAt } from '../../../../core/verse/seat-readiness.js';\nimport { asSentence } from '../autonomy/format.js';\n\nconst KINDS: ReadonlySet<string> = new Set<SeatReasonKind>([\n 'headroom', 'switched-off', 'signed-out', 'unreachable', 'spent', 'reserve', 'session-ceiling',\n 'unknown-usage', 'spend-cap', 'model-window', 'context', 'grant', 'lane', 'demoted', 'other',\n]);\n\n// ---------------------------------------------------------------------------\n// Sentences\n// ---------------------------------------------------------------------------\n\n// `asSentence` lives with the other shared prose helpers (autonomy/format.ts);\n// re-exported here so this module's callers keep one import.\nexport { asSentence };\n\n/** Sentences as prose — \"A. B.\" — never \"A.; B\" and never \"A.. B\". */\nexport function joinSentences(texts: readonly string[]): string {\n return texts.map(asSentence).filter(Boolean).join(' ');\n}\n\n/** \"a\", \"a and b\", \"a, b and c\". */\nfunction listWords(words: readonly string[]): string {\n if (words.length <= 1) return words[0] ?? '';\n return `${words.slice(0, -1).join(', ')} and ${words[words.length - 1]}`;\n}\n\n// ---------------------------------------------------------------------------\n// Reasons as data\n// ---------------------------------------------------------------------------\n\nconst ISO_INSTANT = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/;\nconst ISO_IN_TEXT = /\\b\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{1,9})?)?(?:Z|[+-]\\d{2}:?\\d{2})?(?![\\w:])/g;\n\n/**\n * Server prose with every ISO instant in it shown in the viewer's zone (\"the\n * earliest known reopening is Fri 2:25 PM\") — for sentences the server keeps\n * machine-exact for its logs, like a park hold's reason.\n */\nexport function localTimes(text: string, now: number = Date.now()): string {\n return text.replace(ISO_IN_TEXT, (iso) => describeResetAt(iso, now) ?? iso);\n}\n\nfunction isInstant(text: string | null | undefined): text is string {\n return typeof text === 'string' && ISO_INSTANT.test(text) && Number.isFinite(Date.parse(text));\n}\n\nfunction legacyKind(text: string): SeatReasonKind {\n if (/^autonomy is switched off/i.test(text)) return 'switched-off';\n if (/^signed out/i.test(text)) return 'signed-out';\n if (/not reachable/i.test(text)) return 'unreachable';\n if (/limits that model only/.test(text)) return 'model-window';\n if (/ is spent — /.test(text)) return 'spent';\n if (/is kept for you, so autonomy stops at/.test(text)) return 'reserve';\n if (/used; autonomy stops at .* to protect your live session/.test(text)) return 'session-ceiling';\n if (/unknown usage is not headroom|too stale to spend against|too uncertain to spend against/.test(text)) return 'unknown-usage';\n if (/daily cap/.test(text)) return 'spend-cap';\n if (/tokens of context/.test(text)) return 'context';\n if (/is demoted/.test(text)) return 'demoted';\n if (/\\bgrant\\b/i.test(text)) return 'grant';\n // A lane cap, as 3.10.0's router wrote it into exclusions: \"Codex lanes\n // stay off until…\", \"The Leader set 0 grok-cli lanes.\", \"The local runtime\n // serves 0 slot(s).\", \"…the Claude producer slice is held for your own\n // session.\" (3.10.1 sends these as `kind: 'lane'`.)\n if (/\\blanes?\\b|\\bslots?\\b|producer slice is held/i.test(text)) return 'lane';\n return 'other';\n}\n\n// ---------------------------------------------------------------------------\n// Lane cap reasons in operator words\n// ---------------------------------------------------------------------------\n\n/** Lane ids as the operator reads them — never inside a seat id (`codex-cmp`). */\nconst LANE_WORDS: ReadonlyArray<readonly [RegExp, string]> = [\n [/(?<![\\w-])grok-cli(?![\\w-])/g, 'Grok'],\n [/(?<![\\w-])claude-cli(?![\\w-])/g, 'Claude'],\n [/(?<![\\w-])codex(?![\\w-])/g, 'Codex'],\n];\n\n/**\n * A lane cap reason (the router's `capReason`, also a held-back seat's lane\n * reason) in plain words. The router words these for its log: \"The local\n * runtime serves 2 slot(s).\", \"A harness experiment is using 1 local\n * slot(s).\", \"Codex lanes stay off until the Leader enables them after the\n * usage reset (a class-B action).\", \"The Leader set 0 grok-cli lanes.\" The\n * operator reads \"2 slots\", \"1 local slot\", \"Codex stays off until the Leader\n * turns it on after the usage reset (you can veto it)\" and \"0 Grok lanes\".\n * Anything it does not recognise passes through unchanged.\n */\nexport function laneReasonText(reason: string): string {\n let text = reason.trim();\n text = text.replace(/^Codex lanes stay off until the Leader enables them\\b/, 'Codex stays off until the Leader turns it on');\n // A class-A/B Leader action waits out a veto window; class C does not.\n text = text.replace(/\\s*\\(an? class-([A-Za-z])\\s+action\\)/g, (_m, cls: string) => (/^[ab]$/i.test(cls) ? ' (you can veto it)' : ''));\n // \"2 slot(s)\" → \"2 slots\"; \"1 local slot(s)\" → \"1 local slot\".\n text = text.replace(/\\b(\\d+)((?:\\s+[A-Za-z-]+)*?)\\s+([A-Za-z]+)\\(s\\)/g, (_m, n: string, mid: string, word: string) => `${n}${mid} ${word}${Number(n) === 1 ? '' : 's'}`);\n text = text.replace(/\\b([A-Za-z]+)\\(s\\)/g, '$1s');\n for (const [re, word] of LANE_WORDS) text = text.replace(re, word);\n return text;\n}\n\n/**\n * A pre-3.10.1 reason sentence, back into data: the \" (resets …)\" clause the\n * server appended is split off (an instant → `resetsAt`, Claude's prose →\n * `resetDescription`), as is a demotion's \"until <instant>\".\n */\nexport function parseLegacyReason(sentence: string): SeatReason {\n const trimmed = sentence.trim();\n const clause = /^([\\s\\S]*?) \\(resets ([\\s\\S]+)\\)\\.?$/.exec(trimmed);\n let text = clause ? `${clause[1]}.` : trimmed;\n const reset = clause ? clause[2]!.trim() : null;\n let resetsAt: string | null = isInstant(reset) ? reset : null;\n const demoted = / is demoted until (\\S+): /.exec(text);\n if (demoted && isInstant(demoted[1])) {\n resetsAt = demoted[1];\n text = text.replace(` until ${demoted[1]}:`, ':');\n }\n return {\n kind: legacyKind(text),\n text,\n resetsAt,\n resetDescription: reset !== null && !isInstant(reset) ? reset : null,\n };\n}\n\n/** An exclusion's reasons as data: its 3.10.1 `details`, or its sentences parsed. */\nexport function exclusionReasons(x: SeatExclusion): SeatReason[] {\n if (Array.isArray(x.details) && (x.details.length > 0 || x.reasons.length === 0)) {\n // A newer server may add kinds; anything unrecognised reads as `other`.\n return x.details.map((r) => (KINDS.has(r.kind) ? r : { ...r, kind: 'other' as const }));\n }\n return x.reasons.map(parseLegacyReason);\n}\n\n/** The reasons a HELD BACK row prints: blockers and notes, never the \"N% left\" line; lane caps in plain words. */\nexport function heldBackText(x: SeatExclusion): string {\n return joinSentences(exclusionReasons(x).filter((r) => r.kind !== 'headroom').map((r) => (r.kind === 'lane' ? laneReasonText(r.text) : r.text)));\n}\n\n// ---------------------------------------------------------------------------\n// Eligible again\n// ---------------------------------------------------------------------------\n\n/** What must change before the seat can take this work again. */\nexport interface EligibleAgain {\n /** Conditions a person or the fleet must meet first, in words. */\n conditions: string[];\n /** The instant every time-bound blocker has lifted (the LATEST reset among them); null when none is known. */\n at: string | null;\n /** Provider reset wording with no instant (Claude), verbatim. */\n prose: string[];\n /** A time-bound blocker whose lift time nobody reported. */\n timeUnknown: boolean;\n /** Set when the seat can never take THIS work (it does not fit). */\n never: string | null;\n}\n\nconst CONDITION: Partial<Record<SeatReasonKind, string>> = {\n 'switched-off': 'you switch autonomy on for this seat',\n 'signed-out': 'you reconnect this account',\n unreachable: 'it is reachable again',\n 'unknown-usage': 'a fresh usage reading arrives',\n 'spend-cap': 'its daily spend cap resets',\n grant: 'the standing grant allows it',\n lane: 'its lane has a free slot',\n};\n\n/** Blockers that lift on their own at a time: a window reset, a demotion's end. */\nconst TIMED: ReadonlySet<SeatReasonKind> = new Set<SeatReasonKind>(['spent', 'reserve', 'session-ceiling', 'demoted']);\n\n/** Claude's wording, without the \"resets\" some sources lead with. */\nfunction resetWords(text: string): string {\n return text.trim().replace(/^resets\\s+/i, '');\n}\n\nexport function eligibleAgain(x: SeatExclusion): EligibleAgain {\n const conditions: string[] = [];\n const prose: string[] = [];\n let at: string | null = null;\n let timeUnknown = false;\n let never: string | null = null;\n for (const r of exclusionReasons(x)) {\n if (r.kind === 'context') {\n never = 'not for this task — it needs a larger context window than this seat has';\n continue;\n }\n const condition = CONDITION[r.kind];\n if (condition && !conditions.includes(condition)) conditions.push(condition);\n if (!TIMED.has(r.kind)) continue;\n // The seat is free only once EVERY time-bound blocker has lifted.\n if (isInstant(r.resetsAt)) {\n if (at === null || Date.parse(r.resetsAt) > Date.parse(at)) at = r.resetsAt;\n } else if (r.resetDescription) {\n const words = resetWords(r.resetDescription);\n if (!prose.includes(words)) prose.push(words);\n } else {\n timeUnknown = true;\n }\n }\n // The server's own estimate, when the reasons themselves carried no time.\n if (at === null && prose.length === 0 && isInstant(x.nextEligibleAt)) {\n at = x.nextEligibleAt;\n timeUnknown = false;\n }\n return { conditions, at, prose, timeUnknown, never };\n}\n\n/**\n * \"Fri 11:46 PM\"; \"when you switch autonomy on for this seat, not before Fri\n * 11:46 PM\"; \"Sep 25 at 6:59pm (America/New_York)\" (Claude's words); and\n * \"unknown\" only when nothing says.\n */\nexport function describeEligibleAgain(e: EligibleAgain, now: number = Date.now()): string {\n if (e.never) return e.never;\n const times = [...(e.at ? [describeResetAt(e.at, now) ?? e.at] : []), ...e.prose];\n const time = times.length > 0 ? times.join(' and ') : null;\n const when = e.conditions.length > 0 ? `when ${listWords(e.conditions)}` : null;\n if (when && time) return `${when}, not before ${time}`;\n if (when) return when;\n if (time) return time;\n return 'unknown';\n}\n\n// ---------------------------------------------------------------------------\n// Headline\n// ---------------------------------------------------------------------------\n\nconst ROUTED = /^Routed (?:autonomous )?[\\w-]+-difficulty \\w+ work to (.+?) \\(([^()]+)\\)(?: with (\\d+)% of its (5-hour|weekly) window left for autonomy| (at no cost))?: ([\\w-]+) mode prefers (.+?) first for this work(?:; held back [\\s\\S]*)?\\.$/;\nconst NOTHING = /^(No seat (?:the grant lets produce )?can take [\\s\\S]*?) \\([\\s\\S]*\\)(?:; the earliest known reopening is \\S+)?\\.$/;\n\n/**\n * The short headline recovered from a 3.10.0 `why` — the same words a 3.10.1\n * router writes as `summary` (\"Grok — 94% of its weekly window left; balanced\n * mode prefers Grok for this work.\"). Anything unrecognised is returned as is.\n */\nexport function legacySummary(why: string): string {\n const text = why.trim();\n const routed = ROUTED.exec(text);\n if (routed) {\n const [, label, , room, windowWord, free, mode, engine] = routed;\n const lead = room ? ` — ${room}% of its ${windowWord} window left` : free ? ' — free, no usage window' : '';\n return lead ? `${label}${lead}; ${mode} mode prefers ${engine} for this work.` : `${label} — ${mode} mode prefers ${engine} for this work.`;\n }\n const nothing = NOTHING.exec(text);\n if (nothing) return `${nothing[1]}.`;\n return text;\n}\n\n/** The card's one-line headline: the choice and why, then how many seats were held back. */\nexport function decisionSummary(d: SeatDecision): string {\n const lead = asSentence(d.summary ?? legacySummary(d.why));\n const n = d.exclusions.length;\n return n === 0 ? lead : `${lead} ${n === 1 ? '1 seat' : `${n} seats`} held back.`;\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{d as e}from"./verse-model-DyCwZF-M.js";function t(e){if(e.git===null)return null;let t=[e.git.branch];return t.push(e.git.dirty===0?`clean`:`${e.git.dirty} changed`),e.git.ahead>0&&t.push(`${e.git.ahead} ahead`),e.git.behind>0&&t.push(`${e.git.behind} behind`),t.join(` · `)}function n(e){return e.exists?e.reachable?e.primary?`primary`:`extra`:`unreachable`:`missing`}function r(e){return e.exists?e.reachable?e.enrolled?null:`not enrolled — autonomous lane refuses it`:`this engine cannot reach it`:`missing on disk`}var i={critical:`Critical`,high:`High`,normal:`Normal`,low:`Low`},a=[`critical`,`high`,`normal`,`low`],o=`Priority orders the repositories the fleet already has. It never adds one — a repository that is not enrolled stays out of reach at every priority.`;function s(e,t){return t?.[e]??`normal`}function c(t,n){let r=t.trim();if(r.length===0)return{ok:!1,error:`Pick a primary folder.`,roots:[]};if(!e(r))return{ok:!1,error:`The primary folder must be an absolute path on this machine.`,roots:[]};let i=[r];for(let t of n){let n=t.trim();if(n.length!==0){if(!e(n))return{ok:!1,error:`Not an absolute path: ${n}`,roots:[]};i.includes(n)||i.push(n)}}return i.length>8?{ok:!1,error:`A workspace holds at most 8 folders.`,roots:[]}:{ok:!0,error:null,roots:i}}function l(e){return(e.roots.find(e=>e.primary)??e.roots[0])?.path??null}function u(e){return e.roots.length-1<=0?`1 folder`:`${e.roots.length} folders`}function d(e){let t=e.roots.find(e=>e.primary);return t?[t,...e.roots.filter(e=>e!==t)]:[...e.roots]}function f(e){return d(e).map(e=>e.path)}function p(e){return e==null||e===`claude`||e===`codex`||e===`local`}var m=`This seat’s CLI takes no additional-directory flag, so it will reach only the primary folder. The other folders will be unreachable — pick a Claude, Codex or local seat to use more than one.`;function h(e,t){return t<=1||p(e)?null:m}function g(e,t){return t<=1?null:h(e,t)??`The agent can read and write these folders for the life of this chat. Enrolment is separate — an unenrolled folder stays out of reach of the autonomous lane.`}var _=`Claude, Codex and local seats reach every folder here. A Grok seat reaches only the primary one.`;function v(e){let t=e.trim().replace(/[/\\]+$/,``),n=t.split(/[/\\]/).pop()??``;return n.length>0?n:t}function y(e,t){let[n=``,...r]=t,i=c(n,r);if(!i.ok)return{ok:!1,error:i.error,name:``,roots:[]};let a=e.trim(),o=a.length>0?a:v(i.roots[0]);return o.length===0?{ok:!1,error:`Give this project a name.`,name:``,roots:[]}:{ok:!0,error:null,name:o,roots:i.roots}}function b(e,t,n){let r=[...e],i=n===`up`?t-1:t+1;if(t<0||t>=r.length||i<0||i>=r.length)return r;let a=r[t];return r[t]=r[i],r[i]=a,r}function x(e){return e===0?`Primary folder`:`Folder ${e+1}`}export{f as _,v as a,b as c,t as d,x as f,l as g,y as h,a as i,s as l,c as m,i as n,h as o,n as p,o as r,g as s,_ as t,r as u,u as v};
2
- //# sourceMappingURL=workspace-model-CbhdPhei.js.map
1
+ import{f as e}from"./verse-model-MMySehjj.js";function t(e){if(e.git===null)return null;let t=[e.git.branch];return t.push(e.git.dirty===0?`clean`:`${e.git.dirty} changed`),e.git.ahead>0&&t.push(`${e.git.ahead} ahead`),e.git.behind>0&&t.push(`${e.git.behind} behind`),t.join(` · `)}function n(e){return e.exists?e.reachable?e.primary?`primary`:`extra`:`unreachable`:`missing`}function r(e){return e.exists?e.reachable?e.enrolled?null:`not enrolled — autonomous lane refuses it`:`this engine cannot reach it`:`missing on disk`}var i={critical:`Critical`,high:`High`,normal:`Normal`,low:`Low`},a=[`critical`,`high`,`normal`,`low`],o=`Priority orders the repositories the fleet already has. It never adds one — a repository that is not enrolled stays out of reach at every priority.`;function s(e,t){return t?.[e]??`normal`}function c(t,n){let r=t.trim();if(r.length===0)return{ok:!1,error:`Pick a primary folder.`,roots:[]};if(!e(r))return{ok:!1,error:`The primary folder must be an absolute path on this machine.`,roots:[]};let i=[r];for(let t of n){let n=t.trim();if(n.length!==0){if(!e(n))return{ok:!1,error:`Not an absolute path: ${n}`,roots:[]};i.includes(n)||i.push(n)}}return i.length>8?{ok:!1,error:`A workspace holds at most 8 folders.`,roots:[]}:{ok:!0,error:null,roots:i}}function l(e){return(e.roots.find(e=>e.primary)??e.roots[0])?.path??null}function u(e){return e.roots.length-1<=0?`1 folder`:`${e.roots.length} folders`}function d(e){let t=e.roots.find(e=>e.primary);return t?[t,...e.roots.filter(e=>e!==t)]:[...e.roots]}function f(e){return d(e).map(e=>e.path)}function p(e){return e==null||e===`claude`||e===`codex`||e===`local`}var m=`This seat’s CLI takes no additional-directory flag, so it will reach only the primary folder. The other folders will be unreachable — pick a Claude, Codex or local seat to use more than one.`;function h(e,t){return t<=1||p(e)?null:m}function g(e,t){return t<=1?null:h(e,t)??`The agent can read and write these folders for the life of this chat. Enrolment is separate — an unenrolled folder stays out of reach of the autonomous lane.`}var _=`Claude, Codex and local seats reach every folder here. A Grok seat reaches only the primary one.`;function v(e){let t=e.trim().replace(/[/\\]+$/,``),n=t.split(/[/\\]/).pop()??``;return n.length>0?n:t}function y(e,t){let[n=``,...r]=t,i=c(n,r);if(!i.ok)return{ok:!1,error:i.error,name:``,roots:[]};let a=e.trim(),o=a.length>0?a:v(i.roots[0]);return o.length===0?{ok:!1,error:`Give this project a name.`,name:``,roots:[]}:{ok:!0,error:null,name:o,roots:i.roots}}function b(e,t,n){let r=[...e],i=n===`up`?t-1:t+1;if(t<0||t>=r.length||i<0||i>=r.length)return r;let a=r[t];return r[t]=r[i],r[i]=a,r}function x(e){return e===0?`Primary folder`:`Folder ${e+1}`}export{f as _,v as a,b as c,t as d,x as f,l as g,y as h,a as i,s as l,c as m,i as n,h as o,n as p,o as r,g as s,_ as t,r as u,u as v};
2
+ //# sourceMappingURL=workspace-model-Dukb2wwv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-model-CbhdPhei.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/workspace-model.ts"],"sourcesContent":["/**\n * routes/verse/workspace-model.ts — pure helpers for multi-root sessions.\n * No React, no I/O, so every rule below is testable without a DOM.\n *\n * The honesty rules these encode, and why each exists:\n *\n * - A root with no git repo shows \"not a git repo\", never a blank space where\n * a branch would be. An empty slot reads as \"clean on the default branch\".\n * - `dirty` is a COUNT of changed entries, so it is rendered as a count.\n * \"modified\" alone hides whether that is one file or forty.\n * - An unenrolled root says the autonomous lane refuses it, rather than\n * showing a warning that could be read as \"this chat cannot use it\" — it\n * can, and does.\n * - An unreachable root (a Grok seat, which has no additional-directory flag)\n * is listed and marked, never hidden. Hiding it would misrepresent the\n * workspace the operator chose.\n */\nimport type {\n VerseEngine,\n VerseRootPriority,\n VerseRootStatus,\n VerseSession,\n VerseWorkspace,\n VerseWorkspaceRoot,\n} from '../../data/api-types.js';\nimport { isAbsolutePath } from './verse-model.js';\n\n/** Hard cap, mirroring VERSE_MAX_WORKSPACE_ROOTS on the server. */\nexport const MAX_WORKSPACE_ROOTS = 8;\n\n/** Every root a session can reach, primary first. Mirrors `verseSessionRoots`. */\nexport function sessionRootPaths(session: Pick<VerseSession, 'projectPath' | 'extraRoots'>): string[] {\n const out = [session.projectPath];\n for (const root of session.extraRoots ?? []) {\n if (typeof root === 'string' && root.length > 0 && !out.includes(root)) out.push(root);\n }\n return out;\n}\n\n/** True when this session reaches more than its primary folder. */\nexport function isMultiRoot(session: Pick<VerseSession, 'projectPath' | 'extraRoots'>): boolean {\n return sessionRootPaths(session).length > 1;\n}\n\n/**\n * Short label for a session's folder scope: the primary's name, plus how many\n * more it carries. Used where only one line fits (a sidebar row, a pill).\n */\nexport function rootScopeLabel(\n session: Pick<VerseSession, 'projectPath' | 'extraRoots'>,\n primaryName: string,\n): string {\n const extra = sessionRootPaths(session).length - 1;\n return extra > 0 ? `${primaryName} +${extra}` : primaryName;\n}\n\n/**\n * One line of git identity for a root.\n *\n * Returns null when the root is not a repo, so the caller renders the \"not a\n * git repo\" wording ONCE rather than each caller inventing its own.\n */\nexport function rootGitLine(root: VerseRootStatus): string | null {\n if (root.git === null) return null;\n const parts = [root.git.branch];\n parts.push(root.git.dirty === 0 ? 'clean' : `${root.git.dirty} changed`);\n if (root.git.ahead > 0) parts.push(`${root.git.ahead} ahead`);\n if (root.git.behind > 0) parts.push(`${root.git.behind} behind`);\n return parts.join(' · ');\n}\n\nexport type RootTone = 'primary' | 'extra' | 'unreachable' | 'missing';\n\n/** Which visual treatment a root row gets. Missing beats unreachable. */\nexport function rootTone(root: VerseRootStatus): RootTone {\n if (!root.exists) return 'missing';\n if (!root.reachable) return 'unreachable';\n return root.primary ? 'primary' : 'extra';\n}\n\n/**\n * The plain-language caveat for one root, or null when there is nothing to\n * say. Word, never colour alone (DESIGN-V2 §6).\n */\nexport function rootCaveat(root: VerseRootStatus): string | null {\n if (!root.exists) return 'missing on disk';\n if (!root.reachable) return 'this engine cannot reach it';\n if (!root.enrolled) return 'not enrolled — autonomous lane refuses it';\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Priority\n// ---------------------------------------------------------------------------\n\nexport const ROOT_PRIORITY_LABEL: Record<VerseRootPriority, string> = {\n critical: 'Critical',\n high: 'High',\n normal: 'Normal',\n low: 'Low',\n};\n\nexport const ROOT_PRIORITY_ORDER: readonly VerseRootPriority[] =\n ['critical', 'high', 'normal', 'low'];\n\n/**\n * How a priority must be explained wherever it is offered.\n *\n * Priority orders what the autonomous lane already reaches. It is NOT a grant,\n * and the copy has to say so at the point of the choice — otherwise ranking a\n * repo `critical` reads as turning it on.\n */\nexport const ROOT_PRIORITY_NOTE =\n 'Priority orders the repositories the fleet already has. It never adds one — a repository that is not enrolled stays out of reach at every priority.';\n\n/**\n * Sort weight; lower sorts first. Mirrors `VERSE_ROOT_PRIORITY_RANK` on the\n * server so the list the operator re-ranks here and the list the autonomous\n * lane walks cannot be ordered differently.\n */\nexport const ROOT_PRIORITY_RANK: Record<VerseRootPriority, number> = {\n critical: 0,\n high: 1,\n normal: 2,\n low: 3,\n};\n\n/** A path's priority, treating an absent key as `normal` (as the server does). */\nexport function priorityOf(\n path: string,\n priorities: Readonly<Record<string, VerseRootPriority>> | undefined,\n): VerseRootPriority {\n return priorities?.[path] ?? 'normal';\n}\n\n/**\n * Paths most-important-first.\n *\n * STABLE: two paths at the same priority keep the order they were given, so\n * re-ranking one repo never silently shuffles the rest. Ordering only — this\n * neither adds nor removes a path.\n */\nexport function rankPathsByPriority(\n paths: readonly string[],\n priorities: Readonly<Record<string, VerseRootPriority>> | undefined,\n): string[] {\n return paths\n .map((path, index) => ({ path, index, rank: ROOT_PRIORITY_RANK[priorityOf(path, priorities)] }))\n .sort((a, b) => a.rank - b.rank || a.index - b.index)\n .map((entry) => entry.path);\n}\n\n// ---------------------------------------------------------------------------\n// Root-set editing (the new-chat dialog and the workspace editor share this)\n// ---------------------------------------------------------------------------\n\nexport interface RootSetValidation {\n ok: boolean;\n /** One message, or null when the set is usable. */\n error: string | null;\n /** The set as it would be sent: trimmed, de-duplicated, primary first. */\n roots: string[];\n}\n\n/**\n * Validate a root set typed by hand.\n *\n * COURTESY ONLY. The server re-checks every path against the same deny roots\n * the enrollment registry uses, and it is the authority — this cannot know the\n * real home directory behind a `~`, and it must not pretend to.\n */\nexport function validateRootSet(primary: string, extras: readonly string[]): RootSetValidation {\n const trimmedPrimary = primary.trim();\n if (trimmedPrimary.length === 0) {\n return { ok: false, error: 'Pick a primary folder.', roots: [] };\n }\n if (!isAbsolutePath(trimmedPrimary)) {\n return { ok: false, error: 'The primary folder must be an absolute path on this machine.', roots: [] };\n }\n const roots = [trimmedPrimary];\n for (const raw of extras) {\n const root = raw.trim();\n if (root.length === 0) continue;\n if (!isAbsolutePath(root)) {\n return { ok: false, error: `Not an absolute path: ${root}`, roots: [] };\n }\n if (roots.includes(root)) continue;\n roots.push(root);\n }\n if (roots.length > MAX_WORKSPACE_ROOTS) {\n return { ok: false, error: `A workspace holds at most ${MAX_WORKSPACE_ROOTS} folders.`, roots: [] };\n }\n return { ok: true, error: null, roots };\n}\n\n/** The primary root of a stored workspace (the one a session uses as its cwd). */\nexport function workspacePrimary(workspace: VerseWorkspace): string | null {\n return (workspace.roots.find((r) => r.primary) ?? workspace.roots[0])?.path ?? null;\n}\n\n/** \"service +2 folders\" — how a workspace reads in a picker. */\nexport function workspaceSummary(workspace: VerseWorkspace): string {\n const extra = workspace.roots.length - 1;\n if (extra <= 0) return '1 folder';\n return `${workspace.roots.length} folders`;\n}\n\n/**\n * A workspace's roots in SEND order: the primary first, then the rest as\n * stored.\n *\n * `VerseWorkspace.roots` is documented primary-first, but the flag is the\n * authority and an update replaces the set wholesale with \"first entry is\n * primary\". Normalising here means a reorder can never accidentally demote\n * the primary because a stored record listed it second.\n */\nexport function orderedWorkspaceRoots(workspace: VerseWorkspace): VerseWorkspaceRoot[] {\n const primary = workspace.roots.find((r) => r.primary);\n if (!primary) return [...workspace.roots];\n return [primary, ...workspace.roots.filter((r) => r !== primary)];\n}\n\n/** The same order, as the bare paths `updateVerseWorkspace` takes. */\nexport function workspaceRootPaths(workspace: VerseWorkspace): string[] {\n return orderedWorkspaceRoots(workspace).map((r) => r.path);\n}\n\n// ---------------------------------------------------------------------------\n// Which engines reach more than the primary folder\n// ---------------------------------------------------------------------------\n\n/**\n * Whether this engine's CLI takes an additional-directory flag.\n *\n * Mirrors `engineSupportsExtraRoots` in src/core/verse/workspaces.ts. Grok\n * exposes no such flag at all (checked on grok 0.2.118), so a Grok seat gets\n * its primary root and nothing else — and the UI has to SAY that at the point\n * the seat is chosen rather than let the operator discover it from a diff that\n * never applies.\n *\n * `null` (no seat picked yet) reaches everything: there is nothing to warn\n * about until a seat exists.\n */\nexport function engineReachesExtraRoots(engine: VerseEngine | null | undefined): boolean {\n if (engine === null || engine === undefined) return true;\n return engine === 'claude' || engine === 'codex' || engine === 'local';\n}\n\nexport const EXTRA_ROOTS_REACHABLE_NOTE =\n 'The agent can read and write these folders for the life of this chat. Enrolment is separate — an unenrolled folder stays out of reach of the autonomous lane.';\n\nexport const EXTRA_ROOTS_UNREACHABLE_NOTE =\n 'This seat’s CLI takes no additional-directory flag, so it will reach only the primary folder. The other folders will be unreachable — pick a Claude, Codex or local seat to use more than one.';\n\n/**\n * The caveat for handing `rootCount` folders to a seat, or null when there is\n * nothing to warn about. Only ever the BAD news, so a caller can render it as\n * a warning without having to decide which sentence it got.\n */\nexport function extraRootsCaveat(\n engine: VerseEngine | null | undefined,\n rootCount: number,\n): string | null {\n if (rootCount <= 1) return null;\n return engineReachesExtraRoots(engine) ? null : EXTRA_ROOTS_UNREACHABLE_NOTE;\n}\n\n/** The full note for a multi-folder set: the caveat when there is one, the\n * enrolment reminder otherwise. Null when only one folder is in play. */\nexport function extraRootsNote(\n engine: VerseEngine | null | undefined,\n rootCount: number,\n): string | null {\n if (rootCount <= 1) return null;\n return extraRootsCaveat(engine, rootCount) ?? EXTRA_ROOTS_REACHABLE_NOTE;\n}\n\n/** Said once wherever a multi-folder project is DEFINED, where no seat is\n * chosen yet and so no per-seat caveat can be given. */\nexport const MULTI_ROOT_ENGINE_NOTE =\n 'Claude, Codex and local seats reach every folder here. A Grok seat reaches only the primary one.';\n\n// ---------------------------------------------------------------------------\n// Saved projects (the create/edit form behind the workspace routes)\n// ---------------------------------------------------------------------------\n\n/** The folder's own name, used when the operator names nothing. */\nexport function defaultWorkspaceName(primaryPath: string): string {\n const trimmed = primaryPath.trim().replace(/[/\\\\]+$/, '');\n const base = trimmed.split(/[/\\\\]/).pop() ?? '';\n return base.length > 0 ? base : trimmed;\n}\n\nexport interface WorkspaceDraftValidation {\n ok: boolean;\n /** One message, or null when the draft is sendable. */\n error: string | null;\n /** The name as it would be sent — never empty when `ok`. */\n name: string;\n /** Trimmed, de-duplicated, primary first. */\n roots: string[];\n}\n\n/**\n * Validate a saved project before it is sent.\n *\n * COURTESY ONLY, exactly like `validateRootSet`: the server re-checks every\n * path against the enrollment registry's deny roots and is the authority.\n */\nexport function validateWorkspaceDraft(\n name: string,\n roots: readonly string[],\n): WorkspaceDraftValidation {\n const [primary = '', ...extras] = roots;\n const set = validateRootSet(primary, extras);\n if (!set.ok) return { ok: false, error: set.error, name: '', roots: [] };\n const trimmed = name.trim();\n const resolved = trimmed.length > 0 ? trimmed : defaultWorkspaceName(set.roots[0]!);\n if (resolved.length === 0) {\n return { ok: false, error: 'Give this project a name.', name: '', roots: [] };\n }\n return { ok: true, error: null, name: resolved, roots: set.roots };\n}\n\n/**\n * Move one entry up or down by one place.\n *\n * Returns a NEW array, and returns the order unchanged when the move would\n * fall off either end — so a caller can wire it to a button that is disabled\n * at the ends without the two disagreeing.\n */\nexport function moveRoot<T>(roots: readonly T[], index: number, direction: 'up' | 'down'): T[] {\n const next = [...roots];\n const target = direction === 'up' ? index - 1 : index + 1;\n if (index < 0 || index >= next.length || target < 0 || target >= next.length) return next;\n const moved = next[index]!;\n next[index] = next[target]!;\n next[target] = moved;\n return next;\n}\n\n/**\n * How the first row must be described. The first root IS the primary — it is\n * the session's cwd and the only folder a Grok seat reaches — so the reorder\n * control is not cosmetic and the label has to say what it does.\n */\nexport function rootRowLabel(index: number): string {\n return index === 0 ? 'Primary folder' : `Folder ${index + 1}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"workspace-model-Dukb2wwv.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/workspace-model.ts"],"sourcesContent":["/**\n * routes/verse/workspace-model.ts — pure helpers for multi-root sessions.\n * No React, no I/O, so every rule below is testable without a DOM.\n *\n * The honesty rules these encode, and why each exists:\n *\n * - A root with no git repo shows \"not a git repo\", never a blank space where\n * a branch would be. An empty slot reads as \"clean on the default branch\".\n * - `dirty` is a COUNT of changed entries, so it is rendered as a count.\n * \"modified\" alone hides whether that is one file or forty.\n * - An unenrolled root says the autonomous lane refuses it, rather than\n * showing a warning that could be read as \"this chat cannot use it\" — it\n * can, and does.\n * - An unreachable root (a Grok seat, which has no additional-directory flag)\n * is listed and marked, never hidden. Hiding it would misrepresent the\n * workspace the operator chose.\n */\nimport type {\n VerseEngine,\n VerseRootPriority,\n VerseRootStatus,\n VerseSession,\n VerseWorkspace,\n VerseWorkspaceRoot,\n} from '../../data/api-types.js';\nimport { isAbsolutePath } from './verse-model.js';\n\n/** Hard cap, mirroring VERSE_MAX_WORKSPACE_ROOTS on the server. */\nexport const MAX_WORKSPACE_ROOTS = 8;\n\n/** Every root a session can reach, primary first. Mirrors `verseSessionRoots`. */\nexport function sessionRootPaths(session: Pick<VerseSession, 'projectPath' | 'extraRoots'>): string[] {\n const out = [session.projectPath];\n for (const root of session.extraRoots ?? []) {\n if (typeof root === 'string' && root.length > 0 && !out.includes(root)) out.push(root);\n }\n return out;\n}\n\n/** True when this session reaches more than its primary folder. */\nexport function isMultiRoot(session: Pick<VerseSession, 'projectPath' | 'extraRoots'>): boolean {\n return sessionRootPaths(session).length > 1;\n}\n\n/**\n * Short label for a session's folder scope: the primary's name, plus how many\n * more it carries. Used where only one line fits (a sidebar row, a pill).\n */\nexport function rootScopeLabel(\n session: Pick<VerseSession, 'projectPath' | 'extraRoots'>,\n primaryName: string,\n): string {\n const extra = sessionRootPaths(session).length - 1;\n return extra > 0 ? `${primaryName} +${extra}` : primaryName;\n}\n\n/**\n * One line of git identity for a root.\n *\n * Returns null when the root is not a repo, so the caller renders the \"not a\n * git repo\" wording ONCE rather than each caller inventing its own.\n */\nexport function rootGitLine(root: VerseRootStatus): string | null {\n if (root.git === null) return null;\n const parts = [root.git.branch];\n parts.push(root.git.dirty === 0 ? 'clean' : `${root.git.dirty} changed`);\n if (root.git.ahead > 0) parts.push(`${root.git.ahead} ahead`);\n if (root.git.behind > 0) parts.push(`${root.git.behind} behind`);\n return parts.join(' · ');\n}\n\nexport type RootTone = 'primary' | 'extra' | 'unreachable' | 'missing';\n\n/** Which visual treatment a root row gets. Missing beats unreachable. */\nexport function rootTone(root: VerseRootStatus): RootTone {\n if (!root.exists) return 'missing';\n if (!root.reachable) return 'unreachable';\n return root.primary ? 'primary' : 'extra';\n}\n\n/**\n * The plain-language caveat for one root, or null when there is nothing to\n * say. Word, never colour alone (DESIGN-V2 §6).\n */\nexport function rootCaveat(root: VerseRootStatus): string | null {\n if (!root.exists) return 'missing on disk';\n if (!root.reachable) return 'this engine cannot reach it';\n if (!root.enrolled) return 'not enrolled — autonomous lane refuses it';\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Priority\n// ---------------------------------------------------------------------------\n\nexport const ROOT_PRIORITY_LABEL: Record<VerseRootPriority, string> = {\n critical: 'Critical',\n high: 'High',\n normal: 'Normal',\n low: 'Low',\n};\n\nexport const ROOT_PRIORITY_ORDER: readonly VerseRootPriority[] =\n ['critical', 'high', 'normal', 'low'];\n\n/**\n * How a priority must be explained wherever it is offered.\n *\n * Priority orders what the autonomous lane already reaches. It is NOT a grant,\n * and the copy has to say so at the point of the choice — otherwise ranking a\n * repo `critical` reads as turning it on.\n */\nexport const ROOT_PRIORITY_NOTE =\n 'Priority orders the repositories the fleet already has. It never adds one — a repository that is not enrolled stays out of reach at every priority.';\n\n/**\n * Sort weight; lower sorts first. Mirrors `VERSE_ROOT_PRIORITY_RANK` on the\n * server so the list the operator re-ranks here and the list the autonomous\n * lane walks cannot be ordered differently.\n */\nexport const ROOT_PRIORITY_RANK: Record<VerseRootPriority, number> = {\n critical: 0,\n high: 1,\n normal: 2,\n low: 3,\n};\n\n/** A path's priority, treating an absent key as `normal` (as the server does). */\nexport function priorityOf(\n path: string,\n priorities: Readonly<Record<string, VerseRootPriority>> | undefined,\n): VerseRootPriority {\n return priorities?.[path] ?? 'normal';\n}\n\n/**\n * Paths most-important-first.\n *\n * STABLE: two paths at the same priority keep the order they were given, so\n * re-ranking one repo never silently shuffles the rest. Ordering only — this\n * neither adds nor removes a path.\n */\nexport function rankPathsByPriority(\n paths: readonly string[],\n priorities: Readonly<Record<string, VerseRootPriority>> | undefined,\n): string[] {\n return paths\n .map((path, index) => ({ path, index, rank: ROOT_PRIORITY_RANK[priorityOf(path, priorities)] }))\n .sort((a, b) => a.rank - b.rank || a.index - b.index)\n .map((entry) => entry.path);\n}\n\n// ---------------------------------------------------------------------------\n// Root-set editing (the new-chat dialog and the workspace editor share this)\n// ---------------------------------------------------------------------------\n\nexport interface RootSetValidation {\n ok: boolean;\n /** One message, or null when the set is usable. */\n error: string | null;\n /** The set as it would be sent: trimmed, de-duplicated, primary first. */\n roots: string[];\n}\n\n/**\n * Validate a root set typed by hand.\n *\n * COURTESY ONLY. The server re-checks every path against the same deny roots\n * the enrollment registry uses, and it is the authority — this cannot know the\n * real home directory behind a `~`, and it must not pretend to.\n */\nexport function validateRootSet(primary: string, extras: readonly string[]): RootSetValidation {\n const trimmedPrimary = primary.trim();\n if (trimmedPrimary.length === 0) {\n return { ok: false, error: 'Pick a primary folder.', roots: [] };\n }\n if (!isAbsolutePath(trimmedPrimary)) {\n return { ok: false, error: 'The primary folder must be an absolute path on this machine.', roots: [] };\n }\n const roots = [trimmedPrimary];\n for (const raw of extras) {\n const root = raw.trim();\n if (root.length === 0) continue;\n if (!isAbsolutePath(root)) {\n return { ok: false, error: `Not an absolute path: ${root}`, roots: [] };\n }\n if (roots.includes(root)) continue;\n roots.push(root);\n }\n if (roots.length > MAX_WORKSPACE_ROOTS) {\n return { ok: false, error: `A workspace holds at most ${MAX_WORKSPACE_ROOTS} folders.`, roots: [] };\n }\n return { ok: true, error: null, roots };\n}\n\n/** The primary root of a stored workspace (the one a session uses as its cwd). */\nexport function workspacePrimary(workspace: VerseWorkspace): string | null {\n return (workspace.roots.find((r) => r.primary) ?? workspace.roots[0])?.path ?? null;\n}\n\n/** \"service +2 folders\" — how a workspace reads in a picker. */\nexport function workspaceSummary(workspace: VerseWorkspace): string {\n const extra = workspace.roots.length - 1;\n if (extra <= 0) return '1 folder';\n return `${workspace.roots.length} folders`;\n}\n\n/**\n * A workspace's roots in SEND order: the primary first, then the rest as\n * stored.\n *\n * `VerseWorkspace.roots` is documented primary-first, but the flag is the\n * authority and an update replaces the set wholesale with \"first entry is\n * primary\". Normalising here means a reorder can never accidentally demote\n * the primary because a stored record listed it second.\n */\nexport function orderedWorkspaceRoots(workspace: VerseWorkspace): VerseWorkspaceRoot[] {\n const primary = workspace.roots.find((r) => r.primary);\n if (!primary) return [...workspace.roots];\n return [primary, ...workspace.roots.filter((r) => r !== primary)];\n}\n\n/** The same order, as the bare paths `updateVerseWorkspace` takes. */\nexport function workspaceRootPaths(workspace: VerseWorkspace): string[] {\n return orderedWorkspaceRoots(workspace).map((r) => r.path);\n}\n\n// ---------------------------------------------------------------------------\n// Which engines reach more than the primary folder\n// ---------------------------------------------------------------------------\n\n/**\n * Whether this engine's CLI takes an additional-directory flag.\n *\n * Mirrors `engineSupportsExtraRoots` in src/core/verse/workspaces.ts. Grok\n * exposes no such flag at all (checked on grok 0.2.118), so a Grok seat gets\n * its primary root and nothing else — and the UI has to SAY that at the point\n * the seat is chosen rather than let the operator discover it from a diff that\n * never applies.\n *\n * `null` (no seat picked yet) reaches everything: there is nothing to warn\n * about until a seat exists.\n */\nexport function engineReachesExtraRoots(engine: VerseEngine | null | undefined): boolean {\n if (engine === null || engine === undefined) return true;\n return engine === 'claude' || engine === 'codex' || engine === 'local';\n}\n\nexport const EXTRA_ROOTS_REACHABLE_NOTE =\n 'The agent can read and write these folders for the life of this chat. Enrolment is separate — an unenrolled folder stays out of reach of the autonomous lane.';\n\nexport const EXTRA_ROOTS_UNREACHABLE_NOTE =\n 'This seat’s CLI takes no additional-directory flag, so it will reach only the primary folder. The other folders will be unreachable — pick a Claude, Codex or local seat to use more than one.';\n\n/**\n * The caveat for handing `rootCount` folders to a seat, or null when there is\n * nothing to warn about. Only ever the BAD news, so a caller can render it as\n * a warning without having to decide which sentence it got.\n */\nexport function extraRootsCaveat(\n engine: VerseEngine | null | undefined,\n rootCount: number,\n): string | null {\n if (rootCount <= 1) return null;\n return engineReachesExtraRoots(engine) ? null : EXTRA_ROOTS_UNREACHABLE_NOTE;\n}\n\n/** The full note for a multi-folder set: the caveat when there is one, the\n * enrolment reminder otherwise. Null when only one folder is in play. */\nexport function extraRootsNote(\n engine: VerseEngine | null | undefined,\n rootCount: number,\n): string | null {\n if (rootCount <= 1) return null;\n return extraRootsCaveat(engine, rootCount) ?? EXTRA_ROOTS_REACHABLE_NOTE;\n}\n\n/** Said once wherever a multi-folder project is DEFINED, where no seat is\n * chosen yet and so no per-seat caveat can be given. */\nexport const MULTI_ROOT_ENGINE_NOTE =\n 'Claude, Codex and local seats reach every folder here. A Grok seat reaches only the primary one.';\n\n// ---------------------------------------------------------------------------\n// Saved projects (the create/edit form behind the workspace routes)\n// ---------------------------------------------------------------------------\n\n/** The folder's own name, used when the operator names nothing. */\nexport function defaultWorkspaceName(primaryPath: string): string {\n const trimmed = primaryPath.trim().replace(/[/\\\\]+$/, '');\n const base = trimmed.split(/[/\\\\]/).pop() ?? '';\n return base.length > 0 ? base : trimmed;\n}\n\nexport interface WorkspaceDraftValidation {\n ok: boolean;\n /** One message, or null when the draft is sendable. */\n error: string | null;\n /** The name as it would be sent — never empty when `ok`. */\n name: string;\n /** Trimmed, de-duplicated, primary first. */\n roots: string[];\n}\n\n/**\n * Validate a saved project before it is sent.\n *\n * COURTESY ONLY, exactly like `validateRootSet`: the server re-checks every\n * path against the enrollment registry's deny roots and is the authority.\n */\nexport function validateWorkspaceDraft(\n name: string,\n roots: readonly string[],\n): WorkspaceDraftValidation {\n const [primary = '', ...extras] = roots;\n const set = validateRootSet(primary, extras);\n if (!set.ok) return { ok: false, error: set.error, name: '', roots: [] };\n const trimmed = name.trim();\n const resolved = trimmed.length > 0 ? trimmed : defaultWorkspaceName(set.roots[0]!);\n if (resolved.length === 0) {\n return { ok: false, error: 'Give this project a name.', name: '', roots: [] };\n }\n return { ok: true, error: null, name: resolved, roots: set.roots };\n}\n\n/**\n * Move one entry up or down by one place.\n *\n * Returns a NEW array, and returns the order unchanged when the move would\n * fall off either end — so a caller can wire it to a button that is disabled\n * at the ends without the two disagreeing.\n */\nexport function moveRoot<T>(roots: readonly T[], index: number, direction: 'up' | 'down'): T[] {\n const next = [...roots];\n const target = direction === 'up' ? index - 1 : index + 1;\n if (index < 0 || index >= next.length || target < 0 || target >= next.length) return next;\n const moved = next[index]!;\n next[index] = next[target]!;\n next[target] = moved;\n return next;\n}\n\n/**\n * How the first row must be described. The first root IS the primary — it is\n * the session's cwd and the only folder a Grok seat reaches — so the reorder\n * control is not cosmetic and the label has to say what it does.\n */\nexport function rootRowLabel(index: number): string {\n return index === 0 ? 'Primary folder' : `Folder ${index + 1}`;\n}\n"],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  <meta name="color-scheme" content="light dark" />
7
7
  <title>Ashlrverse — operator console</title>
8
8
  <meta name="referrer" content="no-referrer" />
9
- <script type="module" crossorigin src="/next/assets/index-BVxOlseC.js"></script>
9
+ <script type="module" crossorigin src="/next/assets/index-QesfXBsb.js"></script>
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
@@ -1 +1 @@
1
- {"algorithm":"sha256","assurance":"packaged-build-byte-observation","inventoryDigest":"47018194e2a479e299b9dd97496006062c80143136788786a470ec874c19878e","package":{"manifestSha256":"918016473fe1f050d42b056fc5eb0c05e4a5c9aa670509e92904e4d21d53565a","name":"@ashlr/hub","version":"3.11.3"},"packages":[{"archiveModeSha256":"e593537ea027a53342e9c95325f3823e507298732511cd61c314537000cb008c","contentSha256":"39703185cd013059db3eb5ac351625fa9dfd1eef0509fb47ff04fcc0a4cec6f5","fileCount":25,"name":"@hono/node-server","path":"@hono/node-server","size":120353,"version":"2.0.12"},{"archiveModeSha256":"f331e808f8ff6d9d2e9cbf1ad1bc05f35c36b7ac1489084d24460c345a354819","contentSha256":"ef4367c4587f87b13b688ecafe7010c2764623bfbf1f386a1943d7392f545551","fileCount":13,"name":"@isaacs/fs-minipass","path":"@isaacs/fs-minipass","size":100617,"version":"4.0.1"},{"archiveModeSha256":"212ef6ab48b10cfc61481fdb4d517d5aefa8a9e78f321c9483e13f8f0854aade","contentSha256":"54ecfe6624026e35139d2f943de8626043145c82c1d6580882a4adf4ee6b3c90","fileCount":693,"name":"@modelcontextprotocol/sdk","path":"@modelcontextprotocol/sdk","size":4322438,"version":"1.30.0"},{"archiveModeSha256":"30bd56bd2c26086e14f1b0c58123fc916fea96c6c86f7bd8e7e2fba1526cb30f","contentSha256":"78052c66ba1f5f3d3310d2685ee84af5b060c6960c06eba5cb1d08da860019ff","fileCount":466,"name":"ajv","path":"@modelcontextprotocol/sdk/node_modules/ajv","size":1033496,"version":"8.20.0"},{"archiveModeSha256":"0e9ff2b53d7e42a61c51248833683dfc6b09c9726c3f0c50663af0a6b6f83fea","contentSha256":"18bc9ecab93292b6f357a0bef6b26e39e8d7b14c46fb9b1adc8a0826f7ad419b","fileCount":12,"name":"json-schema-traverse","path":"@modelcontextprotocol/sdk/node_modules/json-schema-traverse","size":22220,"version":"1.0.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"93bc4d919570486c9dac1184c65d89802a5d7e5e51d2ad2c9c79e9229b0d2bfd","fileCount":5,"name":"accepts","path":"accepts","size":16917,"version":"2.0.0"},{"archiveModeSha256":"338fe03444b2468ffb84fa0a62e4ad26985fbe9063f5b6500fc00baab52687a7","contentSha256":"a570e5cd740441f9e2ad9e20aab09d6ff5f01c54b5ca63889fb9cc65aa22ed38","fileCount":15,"name":"ajv-formats","path":"ajv-formats","size":56763,"version":"3.0.1"},{"archiveModeSha256":"30bd56bd2c26086e14f1b0c58123fc916fea96c6c86f7bd8e7e2fba1526cb30f","contentSha256":"78052c66ba1f5f3d3310d2685ee84af5b060c6960c06eba5cb1d08da860019ff","fileCount":466,"name":"ajv","path":"ajv-formats/node_modules/ajv","size":1033496,"version":"8.20.0"},{"archiveModeSha256":"0e9ff2b53d7e42a61c51248833683dfc6b09c9726c3f0c50663af0a6b6f83fea","contentSha256":"18bc9ecab93292b6f357a0bef6b26e39e8d7b14c46fb9b1adc8a0826f7ad419b","fileCount":12,"name":"json-schema-traverse","path":"ajv-formats/node_modules/json-schema-traverse","size":22220,"version":"1.0.0"},{"archiveModeSha256":"99258e0ccfd899459bc7f95949a5bec9039234f80f0a96cfbf7de4cfd9deaad9","contentSha256":"e6f71097d1bf22309cc2010ba116320dbe0b37b53af324631969ccef03817448","fileCount":10,"name":"body-parser","path":"body-parser","size":42536,"version":"2.3.0"},{"archiveModeSha256":"b06c6eaf0b12f13ca2978123c3bc1ee1a6f8bacabea1533868e34accee2145ec","contentSha256":"a90e26ff6b282c4ec28742358f45cffa2a4736aceb4abc7cb558bd6fc740f73b","fileCount":6,"name":"content-type","path":"body-parser/node_modules/content-type","size":20751,"version":"2.0.0"},{"archiveModeSha256":"51df0d122ab1b5f510d0a80e73a4d33fcb1ab44cf00e903f505c384be80528c8","contentSha256":"048d4140095d01f76e5d5a576d5a10de4e1cebcc64cab6ea49f14afc54939be6","fileCount":5,"name":"bytes","path":"bytes","size":12270,"version":"3.1.2"},{"archiveModeSha256":"df415aae8a21af7234f013c4d934c5074b07e617f6189084a43c78a49bafcb78","contentSha256":"870b383c07315fef9619399c2450297d079b1398583984a5ccb9cd2b1005cb59","fileCount":21,"name":"call-bind-apply-helpers","path":"call-bind-apply-helpers","size":15952,"version":"1.0.2"},{"archiveModeSha256":"fd4de57fefcfd077cce1a9e57bd1b208bf59a7da3ae9f25a7e787ab17b10490f","contentSha256":"01be39d7156b173ffe2869dcd589e2080dcf2f1bcbcfa2f20409582ccb21cfaf","fileCount":11,"name":"call-bound","path":"call-bound","size":17106,"version":"1.0.4"},{"archiveModeSha256":"155b84d16e5a3094314970a26a6b1a157604be8a208c32a0562ce579ec994c2c","contentSha256":"e1ec1eb1cc0367f01e1e8a9a8366d040942612a277ba4034707a130d6d70a0ce","fileCount":13,"name":"chownr","path":"chownr","size":22048,"version":"3.0.0"},{"archiveModeSha256":"9838afc4a08f6acf39bb46bba0c8cb523556b2fc61d2958c7bdcb1ae66ca13dd","contentSha256":"4f967d79760cd06bcfdbf918d30b3a77752d03e6e76582aeac4b3a81dcd6a6a9","fileCount":4,"name":"content-disposition","path":"content-disposition","size":19928,"version":"1.1.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"1ad93015c6082464b41e63397fc9ee739d6bb7cb93755c9fbef749cff39b8675","fileCount":5,"name":"content-type","path":"content-type","size":10471,"version":"1.0.5"},{"archiveModeSha256":"2048aee59eb971a928e2fcac3881a222b2c9140ec980dfd14756de04a3885902","contentSha256":"ca8dd7ddd6a3970df6e3efff74247cd6f985dfdcc596ac0f58cd50c5b88555e8","fileCount":5,"name":"cookie","path":"cookie","size":23382,"version":"0.7.2"},{"archiveModeSha256":"51df0d122ab1b5f510d0a80e73a4d33fcb1ab44cf00e903f505c384be80528c8","contentSha256":"360601ff3d56cfdb8de7d836940caa5d74a437474129017697aab4696fc84e03","fileCount":5,"name":"cookie-signature","path":"cookie-signature","size":4993,"version":"1.2.2"},{"archiveModeSha256":"3bf3b01496f9ce98ec5c58c595c317975f470de6da6599d5d405c60c294f12c6","contentSha256":"9a628bd867c40f8bd4753d84f5f364a5ce92fcdd73fb164977d566275580786e","fileCount":4,"name":"cors","path":"cors","size":19956,"version":"2.8.6"},{"archiveModeSha256":"0c4b2570bd695c455ca6e9f67aaabdf88b1d486e39e9e52f4b8cc0c595e08f33","contentSha256":"9666a5f3074e7ff71dab89ccc0fecd79699b6c68e85087cc3416e9b220e9369e","fileCount":9,"name":"cross-spawn","path":"cross-spawn","size":16094,"version":"7.0.6"},{"archiveModeSha256":"fd7ec5fdf7ea41f349416d375406faf41b35702e2e23f02d2c015acb72adc8f2","contentSha256":"e9f41fdd4e55dc936295270bdb7c994d9ad85dd2bd6f2fb3d46767a16ee1a03e","fileCount":7,"name":"debug","path":"debug","size":42793,"version":"4.4.3"},{"archiveModeSha256":"bb32a6d3c5b9088943cd629938024c4c8d207814db8194313063fe3844cbbc8c","contentSha256":"cfc74892a99b215bdc61d9817f90b235318267ddbf8a29ef52b2906d8b26e980","fileCount":6,"name":"depd","path":"depd","size":27117,"version":"2.0.0"},{"archiveModeSha256":"305af32d2ba2d5fe89c9acaa17537f1a06e7e131bf81112cb11d623fdbb9c6f1","contentSha256":"5c4728d83554a1fc2fd51c01cf2d30bb89adbe1c6469a52201eed72b68af0f91","fileCount":15,"name":"dunder-proto","path":"dunder-proto","size":13003,"version":"1.0.1"},{"archiveModeSha256":"9838afc4a08f6acf39bb46bba0c8cb523556b2fc61d2958c7bdcb1ae66ca13dd","contentSha256":"bae9f4988b2d279e16b4bb3e5527647300137f2978aef97f40acd1b453a8d5a7","fileCount":4,"name":"ee-first","path":"ee-first","size":6259,"version":"1.1.1"},{"archiveModeSha256":"9838afc4a08f6acf39bb46bba0c8cb523556b2fc61d2958c7bdcb1ae66ca13dd","contentSha256":"1c50e3d3cd38c66e1e462f0004781f789e59959aec798aef31f9a2f049d216e5","fileCount":4,"name":"encodeurl","path":"encodeurl","size":6980,"version":"2.0.0"},{"archiveModeSha256":"fd4de57fefcfd077cce1a9e57bd1b208bf59a7da3ae9f25a7e787ab17b10490f","contentSha256":"a2dd73d6e2d58eda48469112f2eacae1fec583f84f72643b3593c6092bd3e877","fileCount":11,"name":"es-define-property","path":"es-define-property","size":10217,"version":"1.0.1"},{"archiveModeSha256":"23a440c46333c31a4ae0a1ffdc2ec6db818da1c36a039abc189b118e1bcdc625","contentSha256":"fd08a46013bf09d90a2240c6a8a97f12ff7106507456c73e7db53f608b41214e","fileCount":22,"name":"es-errors","path":"es-errors","size":12324,"version":"1.3.0"},{"archiveModeSha256":"b6b95f08bcc5f254eddbff61393e6efa09637b9fe2996a163d3c2c71c28bb681","contentSha256":"893e26d760872fd0c233391eff242a717320d6b2d6ab004ad827d1dd6c517ea5","fileCount":16,"name":"es-object-atoms","path":"es-object-atoms","size":11967,"version":"1.1.2"},{"archiveModeSha256":"764d64b5de2e2faa2387d92a5ed5dcbc1822797787a67ee46e827d4d353a2cb5","contentSha256":"27b564cee7701979ecc9ba3ad9b57c4eb185ddfe14f6fbef7961b9d95fc51789","fileCount":4,"name":"escape-html","path":"escape-html","size":3660,"version":"1.0.3"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"53b09a946276069cc9e202851404809b0b27f9616f6398ba1ba053cf27a9b61f","fileCount":5,"name":"etag","path":"etag","size":10809,"version":"1.8.1"},{"archiveModeSha256":"15cc21147f13500c581198be8a82187d7d2cd38a2c23b9459c89f22990a5b971","contentSha256":"fda71ef638beebe2ebae12fe705f63cb2276d6b35564064714ad352727e6f0a9","fileCount":13,"name":"eventsource","path":"eventsource","size":147304,"version":"3.0.7"},{"archiveModeSha256":"57e54f8cb946a2072d2c928cce29ff71a0383916edbb50e97042f859f043677f","contentSha256":"57456c2bbbfd8965c4466cf8a120581c6de9c67c1e04bf815189370f5f76ec3f","fileCount":21,"name":"eventsource-parser","path":"eventsource-parser","size":123218,"version":"3.1.0"},{"archiveModeSha256":"e882878862f5bfd4ff0cb5120df0b9e29758544fabad522563cc91a5102513a0","contentSha256":"c4cccb2f6077128bc31e51f7f772663988796261352298821eea234de1f42281","fileCount":10,"name":"express","path":"express","size":75429,"version":"5.2.1"},{"archiveModeSha256":"0f783761dfb7c14c80535b5a3d2f282398f8621985ed04be794ef3144740784e","contentSha256":"332479fcc3eaa25713fa7df0d4e3a953b7a008fde6413d4278aa667d7e4473e1","fileCount":9,"name":"express-rate-limit","path":"express-rate-limit","size":146332,"version":"8.5.2"},{"archiveModeSha256":"78e09d25ac30efc25d5604344654f3158820dbd9d45a1900b9f44e0e500839cf","contentSha256":"5ca43c0737026213eee30eb17e40859c918af2ae30f16d3882fdfbd8bcb03afd","fileCount":11,"name":"fast-deep-equal","path":"fast-deep-equal","size":12966,"version":"3.1.3"},{"archiveModeSha256":"f75ddef45cc69b6bfbcad49bde00345a7e27f27d03cd67d1083d2a334122fc1a","contentSha256":"36e796ba92bcc878b9b3c6b939c0aa1dba25e4c2ed8609f0ed748aa17c80347e","fileCount":44,"name":"fast-uri","path":"fast-uri","size":215561,"version":"3.1.6"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"a184198d4d20e0177fd4f9e5d82bc40d34143c3a8279e7200511905b08e91d1a","fileCount":5,"name":"finalhandler","path":"finalhandler","size":18111,"version":"2.1.1"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"5a3882ea4acfd16ac4851f43587d6ab87fd08de45665981db6e8ee5944486118","fileCount":5,"name":"forwarded","path":"forwarded","size":5876,"version":"0.2.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"c3d3cc5e56026a726c20ed1d516509608bddb667d5cc999f01cd3971a92e4406","fileCount":5,"name":"fresh","path":"fresh","size":10289,"version":"2.0.0"},{"archiveModeSha256":"6f10ab8235c8a46f648cd17681016bf68595208a48d01f1351bd0b19bcb4301c","contentSha256":"8afcdc5f094efcac14509859ce70157ec7daff89642bc5d604b235f6917dd5b0","fileCount":12,"name":"function-bind","path":"function-bind","size":31427,"version":"1.1.2"},{"archiveModeSha256":"2d4c82c10091157e0f33c6a4a049ef4b2609c8f2a6d70882fa538122b54c1ce3","contentSha256":"1b862b6fe457cd272bb8bce8407ac7f972c857ac317189afe7a29ba378f0f6ac","fileCount":9,"name":"get-intrinsic","path":"get-intrinsic","size":46542,"version":"1.3.0"},{"archiveModeSha256":"995b5a61ce2e3cb963405de061067b699b48e90eb6ce2ac0d88e88bd9c38549a","contentSha256":"3dc759afa7e26cd60cc642b39bffcbd22dd574469e4ac2174cc9b57b97599f82","fileCount":15,"name":"get-proto","path":"get-proto","size":10840,"version":"1.0.1"},{"archiveModeSha256":"169ecf4d0c444e719e5bcd4e912e3ceb193138b5ab7eef8f727798759a4331d3","contentSha256":"6f2eeeb1483b34581df01b15d1b80b2b45be2c7ce06496c72a90351194858738","fileCount":12,"name":"gopd","path":"gopd","size":9869,"version":"1.2.0"},{"archiveModeSha256":"2f2262ae382d511cef7d373ff151a1a662ae623e50cb17d3a920d9e87593011d","contentSha256":"617f42cde01c4ca5a0bdab28f544a70e5f52c8707daad05016cb789193ba0554","fileCount":16,"name":"has-symbols","path":"has-symbols","size":23409,"version":"1.1.0"},{"archiveModeSha256":"35386dc8ee83de6dc1f61324623e1d9907205a1bd2fa66b02bc7c0429bdf85cc","contentSha256":"e6b281a2b3f6100d9b44f0916c797da53c254e8a38cb357134e80eddf5181a48","fileCount":10,"name":"hasown","path":"hasown","size":10332,"version":"2.0.4"},{"archiveModeSha256":"6c607d433127ab8aa7eae155e5777360167dc436457ed7fbfe66ff391f0988fa","contentSha256":"ab285a621121201b7aed9fa2a4447836246643db498bf1a4b71888d5fce36f83","fileCount":568,"name":"hono","path":"hono","size":1386244,"version":"4.13.5"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"b34d2d8fdbf41450767591b746eb2adaa4a22b59aa55c94ef0ce65ff1ba6fe6d","fileCount":5,"name":"http-errors","path":"http-errors","size":19064,"version":"2.0.1"},{"archiveModeSha256":"086f9d977a09c672ced4c2d703944875d8db454fe8fdd7fe8882f0888ed7c20f","contentSha256":"762b205b641d142557d0b3fb5d376d571e7823473661004f6cb319b7c0603976","fileCount":27,"name":"iconv-lite","path":"iconv-lite","size":343635,"version":"0.7.2"},{"archiveModeSha256":"7b3e1bd04c00f38ad3e4f4fb20e65a4eeb707527b4fd7c84ea7764cef9cebdff","contentSha256":"7c50865fdccbf6c6b44600a997d13c0c5c215ded131f0a4c98acd8d15694e632","fileCount":5,"name":"inherits","path":"inherits","size":3958,"version":"2.0.4"},{"archiveModeSha256":"3ef444401f83c959cfda73e7e9fd50d0796f6f141f36f458a3f132b362e6c375","contentSha256":"0e8533c4762708d8f61d9a21b3fa5f10d7f4907a36609490e71edaadb1186c1e","fileCount":30,"name":"ip-address","path":"ip-address","size":299533,"version":"10.4.0"},{"archiveModeSha256":"a710aacb72996fbfa6d514e678b50cfe4d17619a71648b516a3a09a96479c2c8","contentSha256":"272599141de35d28a1e92b1aec64154c866998a44310163040e6499b6ec1d9c3","fileCount":6,"name":"ipaddr.js","path":"ipaddr.js","size":42145,"version":"1.9.1"},{"archiveModeSha256":"969b492deb1f22a61f85cf9f98cc0f7c1984c3c0fd162d3ba5a600f0f6181ed8","contentSha256":"31aa30a6fbd5f134714c0ae7bc1e4c7a00b1c5bfabd2931e92618a4121bd6fa8","fileCount":6,"name":"is-promise","path":"is-promise","size":2958,"version":"4.0.0"},{"archiveModeSha256":"8f22f331a576ff070646bb75a80918007ff2b93be80520594930dd04865a6e44","contentSha256":"a560d4935c162172bd5feede21bc62536cec616c166de516cd5c367a7ca23f98","fileCount":8,"name":"isexe","path":"isexe","size":10956,"version":"2.0.0"},{"archiveModeSha256":"ec3d3c0b513b0905f208bc029bc355c1cf7038f95e2e7b1e2d19ddac26e374ea","contentSha256":"e3633b6af5ec16f6448989dd91dad2798a190e52e7a3d16d90ceca23d52c5b35","fileCount":88,"name":"jose","path":"jose","size":257736,"version":"6.2.3"},{"archiveModeSha256":"bdba5b2b7f19b131522a9af3d6cd30db94ee97690d535e5c3c84d1bce068c2a9","contentSha256":"efcb8d289875749e930bf8f745c132edf832c0f9a25768fcd97e129851288174","fileCount":9,"name":"json-schema-typed","path":"json-schema-typed","size":197188,"version":"8.0.2"},{"archiveModeSha256":"3353a1cbd727174e11aa6b1a8b1163caeb467c3ac3cad2ddb7d4c230da64bdd8","contentSha256":"251a6d99cfc3364a8732128487bbd422d3964f990fe1755b0b78046b65328731","fileCount":12,"name":"marked","path":"marked","size":469664,"version":"18.0.10"},{"archiveModeSha256":"74a40513091b687e690f49f4110e314302d0b8b3c9f196cf587c9d702c4cd7e9","contentSha256":"a4884adbf4399adaff50d30983c4afa402a1d15b56a371824ea5c7c7cab385fa","fileCount":38,"name":"math-intrinsics","path":"math-intrinsics","size":17323,"version":"1.1.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"1ec2d844bc07543d41a6ab6d78008dd2998877609cc16ba532204995fb4339c5","fileCount":5,"name":"media-typer","path":"media-typer","size":9256,"version":"1.1.0"},{"archiveModeSha256":"320af631be54ba1ce035560718a037511184c1d85329f83345fbe80f2527e8c9","contentSha256":"983f0d7028b74df8828007fabcab26e7f36e42fc7db74e321a110f6f40aa3fa7","fileCount":5,"name":"merge-descriptors","path":"merge-descriptors","size":4373,"version":"2.0.0"},{"archiveModeSha256":"2cb256014f7e1eda905b4809694ab3b06e8c1f1c5b78cb4de5da514e4e57659a","contentSha256":"c979d86230ca6688633d5ef7c89397f312c6d556a1964cb8dfe33596b8b548b9","fileCount":6,"name":"mime-db","path":"mime-db","size":225566,"version":"1.54.0"},{"archiveModeSha256":"20c4497e7b68189571962123cabb12dc852bb2346c45deed91c081c899659249","contentSha256":"28ee29177b736969ce0a555c11ae5275280510007a2670dcdd7ea6b1868f46c3","fileCount":6,"name":"mime-types","path":"mime-types","size":22871,"version":"3.0.2"},{"archiveModeSha256":"155b84d16e5a3094314970a26a6b1a157604be8a208c32a0562ce579ec994c2c","contentSha256":"46d898fe1f0594d49333d4bc32bce63349d6f124c78dfc3eda96c9f9b2f796fe","fileCount":13,"name":"minipass","path":"minipass","size":366791,"version":"7.1.3"},{"archiveModeSha256":"78b1977130401dbbba561837630370f3061275bb5a1963454b5f092e3cf208fe","contentSha256":"19c7cff62b036e6f0aad440e776cc94134bb6434c0c96939de864df88e2b0f21","fileCount":21,"name":"minizlib","path":"minizlib","size":117811,"version":"3.1.0"},{"archiveModeSha256":"20014b85b0431588ccd9c0e6c6afeffc10e21d0ee7de53e2ba2296fd52bb1a7c","contentSha256":"667f3d7d170cb303a69e67dc3a69a08255a3e5cfb8703f4904417b0362bc0d28","fileCount":4,"name":"ms","path":"ms","size":6721,"version":"2.1.3"},{"archiveModeSha256":"5602cdc50f925bdc25002fe3756f55c3e1117229d22c2b2c600e8ffca90295f6","contentSha256":"84851509ca06e7b5b721720762592fa23f696ba1d72172dbc1e692c1dfa7b567","fileCount":9,"name":"negotiator","path":"negotiator","size":28710,"version":"1.0.0"},{"archiveModeSha256":"99458992876825b1bc4dca80d075db820436a88fcf71baefbc25db39f52760e9","contentSha256":"501ecc61ad148476eb5316bad6418e95bb6ed9bfc794c23fcec15bc2c592ccf1","fileCount":4,"name":"object-assign","path":"object-assign","size":5493,"version":"4.1.1"},{"archiveModeSha256":"e3c2f2fe74f79d600564d5d6af9a6bd278aee46db5e0ec18493cdc9d895e0bbf","contentSha256":"7d76d46a138318bcabde842b6a8b994da11a2e3d2e8ecbc0f8780f50e17f2ca8","fileCount":34,"name":"object-inspect","path":"object-inspect","size":102920,"version":"1.13.4"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"ffb31d328870b95d8218c54f26f73d6e122847c7289052f57bf1569b0027593b","fileCount":5,"name":"on-finished","path":"on-finished","size":13679,"version":"2.4.1"},{"archiveModeSha256":"71f44c60c38bc2c3e17382504bf0dae39045eeec535cf6f4e1283e0514e8c2f4","contentSha256":"dc238bfc47820f9fb5bb56f1f3aae901657074482f52f91545784f041efb0210","fileCount":4,"name":"once","path":"once","size":4046,"version":"1.4.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"ca67e36d858cdb2f3a4eefd00d0bf7284143c1241b9ad06feec17799fc587638","fileCount":5,"name":"parseurl","path":"parseurl","size":10299,"version":"1.3.3"},{"archiveModeSha256":"320af631be54ba1ce035560718a037511184c1d85329f83345fbe80f2527e8c9","contentSha256":"a3945cbf1aaf19b6dba601c948b6522566517f9b9f4181c964d5a0d8ee34270e","fileCount":5,"name":"path-key","path":"path-key","size":4553,"version":"3.1.1"},{"archiveModeSha256":"1514e7595cbbb9d1902c24ce60454e544df780b8fc73b7967218c3491dd3cefb","contentSha256":"17d110a00db54cd903aba2283f1d027f5acfbf7ce0003590c3abeb6059b5d221","fileCount":6,"name":"path-to-regexp","path":"path-to-regexp","size":59680,"version":"8.4.2"},{"archiveModeSha256":"f0a8527de334749bd26e70302ee03517ec50ff590e93cb3ea9a45ce4124a3829","contentSha256":"d5a9fd4846acac4b5ce086c88eca29de645c535aeee06df4a99a69cf4317e397","fileCount":10,"name":"pkce-challenge","path":"pkce-challenge","size":18211,"version":"5.0.1"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"d05e2db9e9d803ea440dd46461d51f482ed09978f2688eeda51a5711f1f41320","fileCount":5,"name":"proxy-addr","path":"proxy-addr","size":15399,"version":"2.0.7"},{"archiveModeSha256":"5ab250cd90dfced7c9429dd43d78846951b7b961947594e9f5175faee4c88a56","contentSha256":"fc8bdb9e912132fa5d83b22283d4f7f816f2e24a36761387e13cd942024186c1","fileCount":20,"name":"qs","path":"qs","size":374851,"version":"6.16.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"d12cb812790fa7b85393df185775b6c9ad8d05fd313f2b31cfb817d6296b1888","fileCount":5,"name":"range-parser","path":"range-parser","size":8457,"version":"1.2.1"},{"archiveModeSha256":"42cc208595e23f148383e3b4292ce5922102522b8bfd5f77417b06d1306d7aa1","contentSha256":"8f8dedbaf8d48e5de26e87910168aa505b7403e4c7739edc953cf5b25240839c","fileCount":5,"name":"raw-body","path":"raw-body","size":18495,"version":"3.0.2"},{"archiveModeSha256":"99458992876825b1bc4dca80d075db820436a88fcf71baefbc25db39f52760e9","contentSha256":"4d281fcce32339c1f532a6e128db448b5d4c02ff371243a5c5696b40c86d3680","fileCount":4,"name":"require-from-string","path":"require-from-string","size":3422,"version":"2.0.2"},{"archiveModeSha256":"e09f32c46d1a5885aae361e487ce603fd60a9fbff1d5dcaab0f6236f971a9837","contentSha256":"99b97f87c5ffc0951428a30eea4a95cbe83f9a70122dbcc8a4b2e7634f8e8dcd","fileCount":7,"name":"router","path":"router","size":46851,"version":"2.2.0"},{"archiveModeSha256":"a462b8a4b54a0e6b8dcfc3d87612450f34478e7dc5845d4b16f239a578821a2c","contentSha256":"e075173c0c6569f0b806c5802462e19b25ed330b11040151ca5e0d8ea9e276d1","fileCount":7,"name":"safer-buffer","path":"safer-buffer","size":42299,"version":"2.1.2"},{"archiveModeSha256":"9838afc4a08f6acf39bb46bba0c8cb523556b2fc61d2958c7bdcb1ae66ca13dd","contentSha256":"3a396c8597fbbc013b13e4cf5dd7f05f798ee9809ad21d3966616d4f50964f02","fileCount":4,"name":"send","path":"send","size":32200,"version":"1.2.1"},{"archiveModeSha256":"9838afc4a08f6acf39bb46bba0c8cb523556b2fc61d2958c7bdcb1ae66ca13dd","contentSha256":"1724d9fc1a50078597419e4a1014f0d179522a46ed0e2a3a94b71f2f78575513","fileCount":4,"name":"serve-static","path":"serve-static","size":14335,"version":"2.2.1"},{"archiveModeSha256":"e1fd687bea7843794dae9ff84fa5a22ca00f6bea6583da85ed3e27d3d8444230","contentSha256":"db27148aba2fa1340dc867179dbccee745a7311c870a68bee4cea1e3fe2f3f8a","fileCount":6,"name":"setprototypeof","path":"setprototypeof","size":4025,"version":"1.2.0"},{"archiveModeSha256":"99458992876825b1bc4dca80d075db820436a88fcf71baefbc25db39f52760e9","contentSha256":"6754ac701a5f6a41aface06678b945984b2c4088d9c81a9beae10d2f236ebbad","fileCount":4,"name":"shebang-command","path":"shebang-command","size":2556,"version":"2.0.0"},{"archiveModeSha256":"320af631be54ba1ce035560718a037511184c1d85329f83345fbe80f2527e8c9","contentSha256":"a793c341e7bf38ef241be3075c0420da5b2c2df9c71b3aa64f16e8d80751acac","fileCount":5,"name":"shebang-regex","path":"shebang-regex","size":2828,"version":"3.0.0"},{"archiveModeSha256":"0e4409f8c28db8f2663ca9ff448e6029ee7e54e7d9d11f23f416dd0b83289589","contentSha256":"28e3e44b391a232fea118591ef73556f7f3bd207d35a4fa6c2d8b04bf11be322","fileCount":12,"name":"side-channel","path":"side-channel","size":22864,"version":"1.1.1"},{"archiveModeSha256":"d7170194465bf2624edfb7844fea886827d0f714bb09d49567d5c7a1c3ce78c0","contentSha256":"6959587507edce3ca38987daa64c966a2f802e6ef85b8c9f96e36b51b7d63752","fileCount":13,"name":"side-channel-list","path":"side-channel-list","size":16973,"version":"1.0.1"},{"archiveModeSha256":"0e4409f8c28db8f2663ca9ff448e6029ee7e54e7d9d11f23f416dd0b83289589","contentSha256":"c69ec67d49924576f5b78d598fe950d7a9464c1c61ad256cbebcda7641e1630a","fileCount":12,"name":"side-channel-map","path":"side-channel-map","size":13348,"version":"1.0.1"},{"archiveModeSha256":"0e4409f8c28db8f2663ca9ff448e6029ee7e54e7d9d11f23f416dd0b83289589","contentSha256":"3f830eae8141c06d7395d4c9ae072ae767e98aace4720762ebded0ae32fca96c","fileCount":12,"name":"side-channel-weakmap","path":"side-channel-weakmap","size":14667,"version":"1.0.2"},{"archiveModeSha256":"c0228c165b333628d8971a1ebdeb334786829db2fa1c9cb6ba374a9214cd4d11","contentSha256":"0b9e6a3e2e50328afbb9254550c688707172bd481eb1084c02af1456aa803249","fileCount":6,"name":"statuses","path":"statuses","size":12505,"version":"2.0.2"},{"archiveModeSha256":"fbfe9587c1875404cd616f4b49a10531431b12aed0b44210e21f3459beb3eacd","contentSha256":"6d854be5694f54f83a7cec190bcd141318a1c8a78df8b42ab64fbae2c5dc4518","fileCount":249,"name":"tar","path":"tar","size":2298662,"version":"7.5.22"},{"archiveModeSha256":"155b84d16e5a3094314970a26a6b1a157604be8a208c32a0562ce579ec994c2c","contentSha256":"7db31cac4d54315057535dd080e4423ab16e09e9161e8b83191c58e2a90f7ea5","fileCount":13,"name":"yallist","path":"tar/node_modules/yallist","size":80297,"version":"5.0.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"0c7b3b8db791f787793c0968ec6f6b9dc48d14783c4c34ada0e0475eb3c011d4","fileCount":5,"name":"toidentifier","path":"toidentifier","size":4685,"version":"1.0.1"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"79ce0363e01b714db55735699052b2534d0f6ef84d785b137323647cf779657a","fileCount":5,"name":"type-is","path":"type-is","size":21269,"version":"2.1.0"},{"archiveModeSha256":"b06c6eaf0b12f13ca2978123c3bc1ee1a6f8bacabea1533868e34accee2145ec","contentSha256":"a90e26ff6b282c4ec28742358f45cffa2a4736aceb4abc7cb558bd6fc740f73b","fileCount":6,"name":"content-type","path":"type-is/node_modules/content-type","size":20751,"version":"2.0.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"99534b97972283845db4ef41d39156d6720030a2307f2f0649a7f1c8fabf68c6","fileCount":5,"name":"unpipe","path":"unpipe","size":4311,"version":"1.0.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"880e12feeb6220ce4cdb0bd7f19ddb9d693666a77059502e9d667e06b3e04ce8","fileCount":5,"name":"vary","path":"vary","size":8747,"version":"1.1.2"},{"archiveModeSha256":"8fc892f4d8b9a44a1bfc252b556ebb01d424366ec71fb56f8b0fc2b81bbb5897","contentSha256":"dbe8a52a4c488ed54e7b60f93f89947ff828f9786a804b40a049152c35a47132","fileCount":5,"name":"which","path":"which","size":7308,"version":"2.0.2"},{"archiveModeSha256":"4b84777e08ccbe4ad45474b4248dc37be2c73b6467d369958cc06ca38507a13f","contentSha256":"4f5c30f228b020aca343e88dc0b15af855173a168663e687afd72c58cf586b99","fileCount":4,"name":"wrappy","path":"wrappy","size":2961,"version":"1.0.2"},{"archiveModeSha256":"b98a45815677c477e01457344c56184f50841e90f1f78c98f47d4f631140c4f3","contentSha256":"eaed4b517e605755ecde1e008133c5418c238657a3236735a1053f00b4a7e58b","fileCount":718,"name":"zod","path":"zod","size":4558122,"version":"4.4.3"},{"archiveModeSha256":"224107ce4653d3b406ca40837a05712425b14ff999773673d516eb31d8e9a34d","contentSha256":"d45857bb67c09b95d65c081b1afc095fcfd8d3e8d8bc3b57f645a1f369b1ea04","fileCount":130,"name":"zod-to-json-schema","path":"zod-to-json-schema","size":219264,"version":"3.25.2"}],"portability":"platform-independent-no-native-or-install-variance","rootDependencies":[{"name":"@modelcontextprotocol/sdk","requested":"^1.30.0"},{"name":"marked","requested":"18.0.10"},{"name":"tar","requested":"7.5.22"}],"schemaVersion":2}
1
+ {"algorithm":"sha256","assurance":"packaged-build-byte-observation","inventoryDigest":"54fd8d7a1c6962309d0e7f3b5467668664ac97543e9a749d77a762525a88c53b","package":{"manifestSha256":"1a7229899bdcadb4e8a256656e0546b066009cb5693f0063c8e5e9d6d61dd0cf","name":"@ashlr/hub","version":"3.12.0"},"packages":[{"archiveModeSha256":"e593537ea027a53342e9c95325f3823e507298732511cd61c314537000cb008c","contentSha256":"39703185cd013059db3eb5ac351625fa9dfd1eef0509fb47ff04fcc0a4cec6f5","fileCount":25,"name":"@hono/node-server","path":"@hono/node-server","size":120353,"version":"2.0.12"},{"archiveModeSha256":"f331e808f8ff6d9d2e9cbf1ad1bc05f35c36b7ac1489084d24460c345a354819","contentSha256":"ef4367c4587f87b13b688ecafe7010c2764623bfbf1f386a1943d7392f545551","fileCount":13,"name":"@isaacs/fs-minipass","path":"@isaacs/fs-minipass","size":100617,"version":"4.0.1"},{"archiveModeSha256":"212ef6ab48b10cfc61481fdb4d517d5aefa8a9e78f321c9483e13f8f0854aade","contentSha256":"54ecfe6624026e35139d2f943de8626043145c82c1d6580882a4adf4ee6b3c90","fileCount":693,"name":"@modelcontextprotocol/sdk","path":"@modelcontextprotocol/sdk","size":4322438,"version":"1.30.0"},{"archiveModeSha256":"30bd56bd2c26086e14f1b0c58123fc916fea96c6c86f7bd8e7e2fba1526cb30f","contentSha256":"78052c66ba1f5f3d3310d2685ee84af5b060c6960c06eba5cb1d08da860019ff","fileCount":466,"name":"ajv","path":"@modelcontextprotocol/sdk/node_modules/ajv","size":1033496,"version":"8.20.0"},{"archiveModeSha256":"0e9ff2b53d7e42a61c51248833683dfc6b09c9726c3f0c50663af0a6b6f83fea","contentSha256":"18bc9ecab93292b6f357a0bef6b26e39e8d7b14c46fb9b1adc8a0826f7ad419b","fileCount":12,"name":"json-schema-traverse","path":"@modelcontextprotocol/sdk/node_modules/json-schema-traverse","size":22220,"version":"1.0.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"93bc4d919570486c9dac1184c65d89802a5d7e5e51d2ad2c9c79e9229b0d2bfd","fileCount":5,"name":"accepts","path":"accepts","size":16917,"version":"2.0.0"},{"archiveModeSha256":"338fe03444b2468ffb84fa0a62e4ad26985fbe9063f5b6500fc00baab52687a7","contentSha256":"a570e5cd740441f9e2ad9e20aab09d6ff5f01c54b5ca63889fb9cc65aa22ed38","fileCount":15,"name":"ajv-formats","path":"ajv-formats","size":56763,"version":"3.0.1"},{"archiveModeSha256":"30bd56bd2c26086e14f1b0c58123fc916fea96c6c86f7bd8e7e2fba1526cb30f","contentSha256":"78052c66ba1f5f3d3310d2685ee84af5b060c6960c06eba5cb1d08da860019ff","fileCount":466,"name":"ajv","path":"ajv-formats/node_modules/ajv","size":1033496,"version":"8.20.0"},{"archiveModeSha256":"0e9ff2b53d7e42a61c51248833683dfc6b09c9726c3f0c50663af0a6b6f83fea","contentSha256":"18bc9ecab93292b6f357a0bef6b26e39e8d7b14c46fb9b1adc8a0826f7ad419b","fileCount":12,"name":"json-schema-traverse","path":"ajv-formats/node_modules/json-schema-traverse","size":22220,"version":"1.0.0"},{"archiveModeSha256":"99258e0ccfd899459bc7f95949a5bec9039234f80f0a96cfbf7de4cfd9deaad9","contentSha256":"e6f71097d1bf22309cc2010ba116320dbe0b37b53af324631969ccef03817448","fileCount":10,"name":"body-parser","path":"body-parser","size":42536,"version":"2.3.0"},{"archiveModeSha256":"b06c6eaf0b12f13ca2978123c3bc1ee1a6f8bacabea1533868e34accee2145ec","contentSha256":"a90e26ff6b282c4ec28742358f45cffa2a4736aceb4abc7cb558bd6fc740f73b","fileCount":6,"name":"content-type","path":"body-parser/node_modules/content-type","size":20751,"version":"2.0.0"},{"archiveModeSha256":"51df0d122ab1b5f510d0a80e73a4d33fcb1ab44cf00e903f505c384be80528c8","contentSha256":"048d4140095d01f76e5d5a576d5a10de4e1cebcc64cab6ea49f14afc54939be6","fileCount":5,"name":"bytes","path":"bytes","size":12270,"version":"3.1.2"},{"archiveModeSha256":"df415aae8a21af7234f013c4d934c5074b07e617f6189084a43c78a49bafcb78","contentSha256":"870b383c07315fef9619399c2450297d079b1398583984a5ccb9cd2b1005cb59","fileCount":21,"name":"call-bind-apply-helpers","path":"call-bind-apply-helpers","size":15952,"version":"1.0.2"},{"archiveModeSha256":"fd4de57fefcfd077cce1a9e57bd1b208bf59a7da3ae9f25a7e787ab17b10490f","contentSha256":"01be39d7156b173ffe2869dcd589e2080dcf2f1bcbcfa2f20409582ccb21cfaf","fileCount":11,"name":"call-bound","path":"call-bound","size":17106,"version":"1.0.4"},{"archiveModeSha256":"155b84d16e5a3094314970a26a6b1a157604be8a208c32a0562ce579ec994c2c","contentSha256":"e1ec1eb1cc0367f01e1e8a9a8366d040942612a277ba4034707a130d6d70a0ce","fileCount":13,"name":"chownr","path":"chownr","size":22048,"version":"3.0.0"},{"archiveModeSha256":"9838afc4a08f6acf39bb46bba0c8cb523556b2fc61d2958c7bdcb1ae66ca13dd","contentSha256":"4f967d79760cd06bcfdbf918d30b3a77752d03e6e76582aeac4b3a81dcd6a6a9","fileCount":4,"name":"content-disposition","path":"content-disposition","size":19928,"version":"1.1.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"1ad93015c6082464b41e63397fc9ee739d6bb7cb93755c9fbef749cff39b8675","fileCount":5,"name":"content-type","path":"content-type","size":10471,"version":"1.0.5"},{"archiveModeSha256":"2048aee59eb971a928e2fcac3881a222b2c9140ec980dfd14756de04a3885902","contentSha256":"ca8dd7ddd6a3970df6e3efff74247cd6f985dfdcc596ac0f58cd50c5b88555e8","fileCount":5,"name":"cookie","path":"cookie","size":23382,"version":"0.7.2"},{"archiveModeSha256":"51df0d122ab1b5f510d0a80e73a4d33fcb1ab44cf00e903f505c384be80528c8","contentSha256":"360601ff3d56cfdb8de7d836940caa5d74a437474129017697aab4696fc84e03","fileCount":5,"name":"cookie-signature","path":"cookie-signature","size":4993,"version":"1.2.2"},{"archiveModeSha256":"3bf3b01496f9ce98ec5c58c595c317975f470de6da6599d5d405c60c294f12c6","contentSha256":"9a628bd867c40f8bd4753d84f5f364a5ce92fcdd73fb164977d566275580786e","fileCount":4,"name":"cors","path":"cors","size":19956,"version":"2.8.6"},{"archiveModeSha256":"0c4b2570bd695c455ca6e9f67aaabdf88b1d486e39e9e52f4b8cc0c595e08f33","contentSha256":"9666a5f3074e7ff71dab89ccc0fecd79699b6c68e85087cc3416e9b220e9369e","fileCount":9,"name":"cross-spawn","path":"cross-spawn","size":16094,"version":"7.0.6"},{"archiveModeSha256":"fd7ec5fdf7ea41f349416d375406faf41b35702e2e23f02d2c015acb72adc8f2","contentSha256":"e9f41fdd4e55dc936295270bdb7c994d9ad85dd2bd6f2fb3d46767a16ee1a03e","fileCount":7,"name":"debug","path":"debug","size":42793,"version":"4.4.3"},{"archiveModeSha256":"bb32a6d3c5b9088943cd629938024c4c8d207814db8194313063fe3844cbbc8c","contentSha256":"cfc74892a99b215bdc61d9817f90b235318267ddbf8a29ef52b2906d8b26e980","fileCount":6,"name":"depd","path":"depd","size":27117,"version":"2.0.0"},{"archiveModeSha256":"305af32d2ba2d5fe89c9acaa17537f1a06e7e131bf81112cb11d623fdbb9c6f1","contentSha256":"5c4728d83554a1fc2fd51c01cf2d30bb89adbe1c6469a52201eed72b68af0f91","fileCount":15,"name":"dunder-proto","path":"dunder-proto","size":13003,"version":"1.0.1"},{"archiveModeSha256":"9838afc4a08f6acf39bb46bba0c8cb523556b2fc61d2958c7bdcb1ae66ca13dd","contentSha256":"bae9f4988b2d279e16b4bb3e5527647300137f2978aef97f40acd1b453a8d5a7","fileCount":4,"name":"ee-first","path":"ee-first","size":6259,"version":"1.1.1"},{"archiveModeSha256":"9838afc4a08f6acf39bb46bba0c8cb523556b2fc61d2958c7bdcb1ae66ca13dd","contentSha256":"1c50e3d3cd38c66e1e462f0004781f789e59959aec798aef31f9a2f049d216e5","fileCount":4,"name":"encodeurl","path":"encodeurl","size":6980,"version":"2.0.0"},{"archiveModeSha256":"fd4de57fefcfd077cce1a9e57bd1b208bf59a7da3ae9f25a7e787ab17b10490f","contentSha256":"a2dd73d6e2d58eda48469112f2eacae1fec583f84f72643b3593c6092bd3e877","fileCount":11,"name":"es-define-property","path":"es-define-property","size":10217,"version":"1.0.1"},{"archiveModeSha256":"23a440c46333c31a4ae0a1ffdc2ec6db818da1c36a039abc189b118e1bcdc625","contentSha256":"fd08a46013bf09d90a2240c6a8a97f12ff7106507456c73e7db53f608b41214e","fileCount":22,"name":"es-errors","path":"es-errors","size":12324,"version":"1.3.0"},{"archiveModeSha256":"b6b95f08bcc5f254eddbff61393e6efa09637b9fe2996a163d3c2c71c28bb681","contentSha256":"893e26d760872fd0c233391eff242a717320d6b2d6ab004ad827d1dd6c517ea5","fileCount":16,"name":"es-object-atoms","path":"es-object-atoms","size":11967,"version":"1.1.2"},{"archiveModeSha256":"764d64b5de2e2faa2387d92a5ed5dcbc1822797787a67ee46e827d4d353a2cb5","contentSha256":"27b564cee7701979ecc9ba3ad9b57c4eb185ddfe14f6fbef7961b9d95fc51789","fileCount":4,"name":"escape-html","path":"escape-html","size":3660,"version":"1.0.3"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"53b09a946276069cc9e202851404809b0b27f9616f6398ba1ba053cf27a9b61f","fileCount":5,"name":"etag","path":"etag","size":10809,"version":"1.8.1"},{"archiveModeSha256":"15cc21147f13500c581198be8a82187d7d2cd38a2c23b9459c89f22990a5b971","contentSha256":"fda71ef638beebe2ebae12fe705f63cb2276d6b35564064714ad352727e6f0a9","fileCount":13,"name":"eventsource","path":"eventsource","size":147304,"version":"3.0.7"},{"archiveModeSha256":"57e54f8cb946a2072d2c928cce29ff71a0383916edbb50e97042f859f043677f","contentSha256":"57456c2bbbfd8965c4466cf8a120581c6de9c67c1e04bf815189370f5f76ec3f","fileCount":21,"name":"eventsource-parser","path":"eventsource-parser","size":123218,"version":"3.1.0"},{"archiveModeSha256":"e882878862f5bfd4ff0cb5120df0b9e29758544fabad522563cc91a5102513a0","contentSha256":"c4cccb2f6077128bc31e51f7f772663988796261352298821eea234de1f42281","fileCount":10,"name":"express","path":"express","size":75429,"version":"5.2.1"},{"archiveModeSha256":"0f783761dfb7c14c80535b5a3d2f282398f8621985ed04be794ef3144740784e","contentSha256":"332479fcc3eaa25713fa7df0d4e3a953b7a008fde6413d4278aa667d7e4473e1","fileCount":9,"name":"express-rate-limit","path":"express-rate-limit","size":146332,"version":"8.5.2"},{"archiveModeSha256":"78e09d25ac30efc25d5604344654f3158820dbd9d45a1900b9f44e0e500839cf","contentSha256":"5ca43c0737026213eee30eb17e40859c918af2ae30f16d3882fdfbd8bcb03afd","fileCount":11,"name":"fast-deep-equal","path":"fast-deep-equal","size":12966,"version":"3.1.3"},{"archiveModeSha256":"f75ddef45cc69b6bfbcad49bde00345a7e27f27d03cd67d1083d2a334122fc1a","contentSha256":"36e796ba92bcc878b9b3c6b939c0aa1dba25e4c2ed8609f0ed748aa17c80347e","fileCount":44,"name":"fast-uri","path":"fast-uri","size":215561,"version":"3.1.6"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"a184198d4d20e0177fd4f9e5d82bc40d34143c3a8279e7200511905b08e91d1a","fileCount":5,"name":"finalhandler","path":"finalhandler","size":18111,"version":"2.1.1"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"5a3882ea4acfd16ac4851f43587d6ab87fd08de45665981db6e8ee5944486118","fileCount":5,"name":"forwarded","path":"forwarded","size":5876,"version":"0.2.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"c3d3cc5e56026a726c20ed1d516509608bddb667d5cc999f01cd3971a92e4406","fileCount":5,"name":"fresh","path":"fresh","size":10289,"version":"2.0.0"},{"archiveModeSha256":"6f10ab8235c8a46f648cd17681016bf68595208a48d01f1351bd0b19bcb4301c","contentSha256":"8afcdc5f094efcac14509859ce70157ec7daff89642bc5d604b235f6917dd5b0","fileCount":12,"name":"function-bind","path":"function-bind","size":31427,"version":"1.1.2"},{"archiveModeSha256":"2d4c82c10091157e0f33c6a4a049ef4b2609c8f2a6d70882fa538122b54c1ce3","contentSha256":"1b862b6fe457cd272bb8bce8407ac7f972c857ac317189afe7a29ba378f0f6ac","fileCount":9,"name":"get-intrinsic","path":"get-intrinsic","size":46542,"version":"1.3.0"},{"archiveModeSha256":"995b5a61ce2e3cb963405de061067b699b48e90eb6ce2ac0d88e88bd9c38549a","contentSha256":"3dc759afa7e26cd60cc642b39bffcbd22dd574469e4ac2174cc9b57b97599f82","fileCount":15,"name":"get-proto","path":"get-proto","size":10840,"version":"1.0.1"},{"archiveModeSha256":"169ecf4d0c444e719e5bcd4e912e3ceb193138b5ab7eef8f727798759a4331d3","contentSha256":"6f2eeeb1483b34581df01b15d1b80b2b45be2c7ce06496c72a90351194858738","fileCount":12,"name":"gopd","path":"gopd","size":9869,"version":"1.2.0"},{"archiveModeSha256":"2f2262ae382d511cef7d373ff151a1a662ae623e50cb17d3a920d9e87593011d","contentSha256":"617f42cde01c4ca5a0bdab28f544a70e5f52c8707daad05016cb789193ba0554","fileCount":16,"name":"has-symbols","path":"has-symbols","size":23409,"version":"1.1.0"},{"archiveModeSha256":"35386dc8ee83de6dc1f61324623e1d9907205a1bd2fa66b02bc7c0429bdf85cc","contentSha256":"e6b281a2b3f6100d9b44f0916c797da53c254e8a38cb357134e80eddf5181a48","fileCount":10,"name":"hasown","path":"hasown","size":10332,"version":"2.0.4"},{"archiveModeSha256":"6c607d433127ab8aa7eae155e5777360167dc436457ed7fbfe66ff391f0988fa","contentSha256":"ab285a621121201b7aed9fa2a4447836246643db498bf1a4b71888d5fce36f83","fileCount":568,"name":"hono","path":"hono","size":1386244,"version":"4.13.5"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"b34d2d8fdbf41450767591b746eb2adaa4a22b59aa55c94ef0ce65ff1ba6fe6d","fileCount":5,"name":"http-errors","path":"http-errors","size":19064,"version":"2.0.1"},{"archiveModeSha256":"086f9d977a09c672ced4c2d703944875d8db454fe8fdd7fe8882f0888ed7c20f","contentSha256":"762b205b641d142557d0b3fb5d376d571e7823473661004f6cb319b7c0603976","fileCount":27,"name":"iconv-lite","path":"iconv-lite","size":343635,"version":"0.7.2"},{"archiveModeSha256":"7b3e1bd04c00f38ad3e4f4fb20e65a4eeb707527b4fd7c84ea7764cef9cebdff","contentSha256":"7c50865fdccbf6c6b44600a997d13c0c5c215ded131f0a4c98acd8d15694e632","fileCount":5,"name":"inherits","path":"inherits","size":3958,"version":"2.0.4"},{"archiveModeSha256":"3ef444401f83c959cfda73e7e9fd50d0796f6f141f36f458a3f132b362e6c375","contentSha256":"0e8533c4762708d8f61d9a21b3fa5f10d7f4907a36609490e71edaadb1186c1e","fileCount":30,"name":"ip-address","path":"ip-address","size":299533,"version":"10.4.0"},{"archiveModeSha256":"a710aacb72996fbfa6d514e678b50cfe4d17619a71648b516a3a09a96479c2c8","contentSha256":"272599141de35d28a1e92b1aec64154c866998a44310163040e6499b6ec1d9c3","fileCount":6,"name":"ipaddr.js","path":"ipaddr.js","size":42145,"version":"1.9.1"},{"archiveModeSha256":"969b492deb1f22a61f85cf9f98cc0f7c1984c3c0fd162d3ba5a600f0f6181ed8","contentSha256":"31aa30a6fbd5f134714c0ae7bc1e4c7a00b1c5bfabd2931e92618a4121bd6fa8","fileCount":6,"name":"is-promise","path":"is-promise","size":2958,"version":"4.0.0"},{"archiveModeSha256":"8f22f331a576ff070646bb75a80918007ff2b93be80520594930dd04865a6e44","contentSha256":"a560d4935c162172bd5feede21bc62536cec616c166de516cd5c367a7ca23f98","fileCount":8,"name":"isexe","path":"isexe","size":10956,"version":"2.0.0"},{"archiveModeSha256":"ec3d3c0b513b0905f208bc029bc355c1cf7038f95e2e7b1e2d19ddac26e374ea","contentSha256":"e3633b6af5ec16f6448989dd91dad2798a190e52e7a3d16d90ceca23d52c5b35","fileCount":88,"name":"jose","path":"jose","size":257736,"version":"6.2.3"},{"archiveModeSha256":"bdba5b2b7f19b131522a9af3d6cd30db94ee97690d535e5c3c84d1bce068c2a9","contentSha256":"efcb8d289875749e930bf8f745c132edf832c0f9a25768fcd97e129851288174","fileCount":9,"name":"json-schema-typed","path":"json-schema-typed","size":197188,"version":"8.0.2"},{"archiveModeSha256":"3353a1cbd727174e11aa6b1a8b1163caeb467c3ac3cad2ddb7d4c230da64bdd8","contentSha256":"251a6d99cfc3364a8732128487bbd422d3964f990fe1755b0b78046b65328731","fileCount":12,"name":"marked","path":"marked","size":469664,"version":"18.0.10"},{"archiveModeSha256":"74a40513091b687e690f49f4110e314302d0b8b3c9f196cf587c9d702c4cd7e9","contentSha256":"a4884adbf4399adaff50d30983c4afa402a1d15b56a371824ea5c7c7cab385fa","fileCount":38,"name":"math-intrinsics","path":"math-intrinsics","size":17323,"version":"1.1.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"1ec2d844bc07543d41a6ab6d78008dd2998877609cc16ba532204995fb4339c5","fileCount":5,"name":"media-typer","path":"media-typer","size":9256,"version":"1.1.0"},{"archiveModeSha256":"320af631be54ba1ce035560718a037511184c1d85329f83345fbe80f2527e8c9","contentSha256":"983f0d7028b74df8828007fabcab26e7f36e42fc7db74e321a110f6f40aa3fa7","fileCount":5,"name":"merge-descriptors","path":"merge-descriptors","size":4373,"version":"2.0.0"},{"archiveModeSha256":"2cb256014f7e1eda905b4809694ab3b06e8c1f1c5b78cb4de5da514e4e57659a","contentSha256":"c979d86230ca6688633d5ef7c89397f312c6d556a1964cb8dfe33596b8b548b9","fileCount":6,"name":"mime-db","path":"mime-db","size":225566,"version":"1.54.0"},{"archiveModeSha256":"20c4497e7b68189571962123cabb12dc852bb2346c45deed91c081c899659249","contentSha256":"28ee29177b736969ce0a555c11ae5275280510007a2670dcdd7ea6b1868f46c3","fileCount":6,"name":"mime-types","path":"mime-types","size":22871,"version":"3.0.2"},{"archiveModeSha256":"155b84d16e5a3094314970a26a6b1a157604be8a208c32a0562ce579ec994c2c","contentSha256":"46d898fe1f0594d49333d4bc32bce63349d6f124c78dfc3eda96c9f9b2f796fe","fileCount":13,"name":"minipass","path":"minipass","size":366791,"version":"7.1.3"},{"archiveModeSha256":"78b1977130401dbbba561837630370f3061275bb5a1963454b5f092e3cf208fe","contentSha256":"19c7cff62b036e6f0aad440e776cc94134bb6434c0c96939de864df88e2b0f21","fileCount":21,"name":"minizlib","path":"minizlib","size":117811,"version":"3.1.0"},{"archiveModeSha256":"20014b85b0431588ccd9c0e6c6afeffc10e21d0ee7de53e2ba2296fd52bb1a7c","contentSha256":"667f3d7d170cb303a69e67dc3a69a08255a3e5cfb8703f4904417b0362bc0d28","fileCount":4,"name":"ms","path":"ms","size":6721,"version":"2.1.3"},{"archiveModeSha256":"5602cdc50f925bdc25002fe3756f55c3e1117229d22c2b2c600e8ffca90295f6","contentSha256":"84851509ca06e7b5b721720762592fa23f696ba1d72172dbc1e692c1dfa7b567","fileCount":9,"name":"negotiator","path":"negotiator","size":28710,"version":"1.0.0"},{"archiveModeSha256":"99458992876825b1bc4dca80d075db820436a88fcf71baefbc25db39f52760e9","contentSha256":"501ecc61ad148476eb5316bad6418e95bb6ed9bfc794c23fcec15bc2c592ccf1","fileCount":4,"name":"object-assign","path":"object-assign","size":5493,"version":"4.1.1"},{"archiveModeSha256":"e3c2f2fe74f79d600564d5d6af9a6bd278aee46db5e0ec18493cdc9d895e0bbf","contentSha256":"7d76d46a138318bcabde842b6a8b994da11a2e3d2e8ecbc0f8780f50e17f2ca8","fileCount":34,"name":"object-inspect","path":"object-inspect","size":102920,"version":"1.13.4"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"ffb31d328870b95d8218c54f26f73d6e122847c7289052f57bf1569b0027593b","fileCount":5,"name":"on-finished","path":"on-finished","size":13679,"version":"2.4.1"},{"archiveModeSha256":"71f44c60c38bc2c3e17382504bf0dae39045eeec535cf6f4e1283e0514e8c2f4","contentSha256":"dc238bfc47820f9fb5bb56f1f3aae901657074482f52f91545784f041efb0210","fileCount":4,"name":"once","path":"once","size":4046,"version":"1.4.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"ca67e36d858cdb2f3a4eefd00d0bf7284143c1241b9ad06feec17799fc587638","fileCount":5,"name":"parseurl","path":"parseurl","size":10299,"version":"1.3.3"},{"archiveModeSha256":"320af631be54ba1ce035560718a037511184c1d85329f83345fbe80f2527e8c9","contentSha256":"a3945cbf1aaf19b6dba601c948b6522566517f9b9f4181c964d5a0d8ee34270e","fileCount":5,"name":"path-key","path":"path-key","size":4553,"version":"3.1.1"},{"archiveModeSha256":"1514e7595cbbb9d1902c24ce60454e544df780b8fc73b7967218c3491dd3cefb","contentSha256":"17d110a00db54cd903aba2283f1d027f5acfbf7ce0003590c3abeb6059b5d221","fileCount":6,"name":"path-to-regexp","path":"path-to-regexp","size":59680,"version":"8.4.2"},{"archiveModeSha256":"f0a8527de334749bd26e70302ee03517ec50ff590e93cb3ea9a45ce4124a3829","contentSha256":"d5a9fd4846acac4b5ce086c88eca29de645c535aeee06df4a99a69cf4317e397","fileCount":10,"name":"pkce-challenge","path":"pkce-challenge","size":18211,"version":"5.0.1"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"d05e2db9e9d803ea440dd46461d51f482ed09978f2688eeda51a5711f1f41320","fileCount":5,"name":"proxy-addr","path":"proxy-addr","size":15399,"version":"2.0.7"},{"archiveModeSha256":"5ab250cd90dfced7c9429dd43d78846951b7b961947594e9f5175faee4c88a56","contentSha256":"fc8bdb9e912132fa5d83b22283d4f7f816f2e24a36761387e13cd942024186c1","fileCount":20,"name":"qs","path":"qs","size":374851,"version":"6.16.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"d12cb812790fa7b85393df185775b6c9ad8d05fd313f2b31cfb817d6296b1888","fileCount":5,"name":"range-parser","path":"range-parser","size":8457,"version":"1.2.1"},{"archiveModeSha256":"42cc208595e23f148383e3b4292ce5922102522b8bfd5f77417b06d1306d7aa1","contentSha256":"8f8dedbaf8d48e5de26e87910168aa505b7403e4c7739edc953cf5b25240839c","fileCount":5,"name":"raw-body","path":"raw-body","size":18495,"version":"3.0.2"},{"archiveModeSha256":"99458992876825b1bc4dca80d075db820436a88fcf71baefbc25db39f52760e9","contentSha256":"4d281fcce32339c1f532a6e128db448b5d4c02ff371243a5c5696b40c86d3680","fileCount":4,"name":"require-from-string","path":"require-from-string","size":3422,"version":"2.0.2"},{"archiveModeSha256":"e09f32c46d1a5885aae361e487ce603fd60a9fbff1d5dcaab0f6236f971a9837","contentSha256":"99b97f87c5ffc0951428a30eea4a95cbe83f9a70122dbcc8a4b2e7634f8e8dcd","fileCount":7,"name":"router","path":"router","size":46851,"version":"2.2.0"},{"archiveModeSha256":"a462b8a4b54a0e6b8dcfc3d87612450f34478e7dc5845d4b16f239a578821a2c","contentSha256":"e075173c0c6569f0b806c5802462e19b25ed330b11040151ca5e0d8ea9e276d1","fileCount":7,"name":"safer-buffer","path":"safer-buffer","size":42299,"version":"2.1.2"},{"archiveModeSha256":"9838afc4a08f6acf39bb46bba0c8cb523556b2fc61d2958c7bdcb1ae66ca13dd","contentSha256":"3a396c8597fbbc013b13e4cf5dd7f05f798ee9809ad21d3966616d4f50964f02","fileCount":4,"name":"send","path":"send","size":32200,"version":"1.2.1"},{"archiveModeSha256":"9838afc4a08f6acf39bb46bba0c8cb523556b2fc61d2958c7bdcb1ae66ca13dd","contentSha256":"1724d9fc1a50078597419e4a1014f0d179522a46ed0e2a3a94b71f2f78575513","fileCount":4,"name":"serve-static","path":"serve-static","size":14335,"version":"2.2.1"},{"archiveModeSha256":"e1fd687bea7843794dae9ff84fa5a22ca00f6bea6583da85ed3e27d3d8444230","contentSha256":"db27148aba2fa1340dc867179dbccee745a7311c870a68bee4cea1e3fe2f3f8a","fileCount":6,"name":"setprototypeof","path":"setprototypeof","size":4025,"version":"1.2.0"},{"archiveModeSha256":"99458992876825b1bc4dca80d075db820436a88fcf71baefbc25db39f52760e9","contentSha256":"6754ac701a5f6a41aface06678b945984b2c4088d9c81a9beae10d2f236ebbad","fileCount":4,"name":"shebang-command","path":"shebang-command","size":2556,"version":"2.0.0"},{"archiveModeSha256":"320af631be54ba1ce035560718a037511184c1d85329f83345fbe80f2527e8c9","contentSha256":"a793c341e7bf38ef241be3075c0420da5b2c2df9c71b3aa64f16e8d80751acac","fileCount":5,"name":"shebang-regex","path":"shebang-regex","size":2828,"version":"3.0.0"},{"archiveModeSha256":"0e4409f8c28db8f2663ca9ff448e6029ee7e54e7d9d11f23f416dd0b83289589","contentSha256":"28e3e44b391a232fea118591ef73556f7f3bd207d35a4fa6c2d8b04bf11be322","fileCount":12,"name":"side-channel","path":"side-channel","size":22864,"version":"1.1.1"},{"archiveModeSha256":"d7170194465bf2624edfb7844fea886827d0f714bb09d49567d5c7a1c3ce78c0","contentSha256":"6959587507edce3ca38987daa64c966a2f802e6ef85b8c9f96e36b51b7d63752","fileCount":13,"name":"side-channel-list","path":"side-channel-list","size":16973,"version":"1.0.1"},{"archiveModeSha256":"0e4409f8c28db8f2663ca9ff448e6029ee7e54e7d9d11f23f416dd0b83289589","contentSha256":"c69ec67d49924576f5b78d598fe950d7a9464c1c61ad256cbebcda7641e1630a","fileCount":12,"name":"side-channel-map","path":"side-channel-map","size":13348,"version":"1.0.1"},{"archiveModeSha256":"0e4409f8c28db8f2663ca9ff448e6029ee7e54e7d9d11f23f416dd0b83289589","contentSha256":"3f830eae8141c06d7395d4c9ae072ae767e98aace4720762ebded0ae32fca96c","fileCount":12,"name":"side-channel-weakmap","path":"side-channel-weakmap","size":14667,"version":"1.0.2"},{"archiveModeSha256":"c0228c165b333628d8971a1ebdeb334786829db2fa1c9cb6ba374a9214cd4d11","contentSha256":"0b9e6a3e2e50328afbb9254550c688707172bd481eb1084c02af1456aa803249","fileCount":6,"name":"statuses","path":"statuses","size":12505,"version":"2.0.2"},{"archiveModeSha256":"fbfe9587c1875404cd616f4b49a10531431b12aed0b44210e21f3459beb3eacd","contentSha256":"6d854be5694f54f83a7cec190bcd141318a1c8a78df8b42ab64fbae2c5dc4518","fileCount":249,"name":"tar","path":"tar","size":2298662,"version":"7.5.22"},{"archiveModeSha256":"155b84d16e5a3094314970a26a6b1a157604be8a208c32a0562ce579ec994c2c","contentSha256":"7db31cac4d54315057535dd080e4423ab16e09e9161e8b83191c58e2a90f7ea5","fileCount":13,"name":"yallist","path":"tar/node_modules/yallist","size":80297,"version":"5.0.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"0c7b3b8db791f787793c0968ec6f6b9dc48d14783c4c34ada0e0475eb3c011d4","fileCount":5,"name":"toidentifier","path":"toidentifier","size":4685,"version":"1.0.1"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"79ce0363e01b714db55735699052b2534d0f6ef84d785b137323647cf779657a","fileCount":5,"name":"type-is","path":"type-is","size":21269,"version":"2.1.0"},{"archiveModeSha256":"b06c6eaf0b12f13ca2978123c3bc1ee1a6f8bacabea1533868e34accee2145ec","contentSha256":"a90e26ff6b282c4ec28742358f45cffa2a4736aceb4abc7cb558bd6fc740f73b","fileCount":6,"name":"content-type","path":"type-is/node_modules/content-type","size":20751,"version":"2.0.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"99534b97972283845db4ef41d39156d6720030a2307f2f0649a7f1c8fabf68c6","fileCount":5,"name":"unpipe","path":"unpipe","size":4311,"version":"1.0.0"},{"archiveModeSha256":"6deab79d9a3bed680c53dd7207c0797080f88a1f668db456501aed3105c7eea5","contentSha256":"880e12feeb6220ce4cdb0bd7f19ddb9d693666a77059502e9d667e06b3e04ce8","fileCount":5,"name":"vary","path":"vary","size":8747,"version":"1.1.2"},{"archiveModeSha256":"8fc892f4d8b9a44a1bfc252b556ebb01d424366ec71fb56f8b0fc2b81bbb5897","contentSha256":"dbe8a52a4c488ed54e7b60f93f89947ff828f9786a804b40a049152c35a47132","fileCount":5,"name":"which","path":"which","size":7308,"version":"2.0.2"},{"archiveModeSha256":"4b84777e08ccbe4ad45474b4248dc37be2c73b6467d369958cc06ca38507a13f","contentSha256":"4f5c30f228b020aca343e88dc0b15af855173a168663e687afd72c58cf586b99","fileCount":4,"name":"wrappy","path":"wrappy","size":2961,"version":"1.0.2"},{"archiveModeSha256":"b98a45815677c477e01457344c56184f50841e90f1f78c98f47d4f631140c4f3","contentSha256":"eaed4b517e605755ecde1e008133c5418c238657a3236735a1053f00b4a7e58b","fileCount":718,"name":"zod","path":"zod","size":4558122,"version":"4.4.3"},{"archiveModeSha256":"224107ce4653d3b406ca40837a05712425b14ff999773673d516eb31d8e9a34d","contentSha256":"d45857bb67c09b95d65c081b1afc095fcfd8d3e8d8bc3b57f645a1f369b1ea04","fileCount":130,"name":"zod-to-json-schema","path":"zod-to-json-schema","size":219264,"version":"3.25.2"}],"portability":"platform-independent-no-native-or-install-variance","rootDependencies":[{"name":"@modelcontextprotocol/sdk","requested":"^1.30.0"},{"name":"marked","requested":"18.0.10"},{"name":"tar","requested":"7.5.22"}],"schemaVersion":2}
package/docs/README.md CHANGED
@@ -16,6 +16,7 @@ that every integration, provider or autonomous effect is active.
16
16
  | Separate tested firm machinery from remaining activation and integration work | [Autonomy gap map](AUTONOMY-GAP.md) |
17
17
  | Exercise signed graph execution and a deliberately lying candidate | [Firm graph fixture](FIRM-DEMO.md) |
18
18
  | Connect autonomy research to engineering acceptance | [Autonomy engineering brief](UNIVERSE-AUTONOMY-RESEARCH.md) |
19
+ | Compare Ashlrverse with current agent platforms using measurable acceptance gates | [Competitive acceptance](VERSE-COMPETITIVE-ACCEPTANCE.md) |
19
20
  | Run a first bounded experiment and inspect its results | [Quickstart](QUICKSTART.md) |
20
21
  | Understand the current components and their boundaries | [Architecture](ARCHITECTURE.md#current-runtime-map) |
21
22
  | Configure experiments, campaigns, portfolios and artifact delivery | [Ashlrverse operator guide](ASHLR-UNIVERSE.md) |
@@ -29,7 +30,7 @@ that every integration, provider or autonomous effect is active.
29
30
  | See what multi-folder workspaces, GitHub and MCP management still need | [Workspaces build contract](VERSE-WORKSPACES.md) |
30
31
  | Read a Verse chat's context meter, choose standard or expansive context, and continue a long session in a fresh chat | [Verse context windows — source guide](https://github.com/ashlrai/ashlr-hub/blob/master/docs/VERSE-CONTEXT.md) |
31
32
  | Use the Verse workbench: Command, Fleet, Growth, Mind and Chat, the Needs-you drawer, terminal, preview, review, budget modes and account health | [Ashlr Verse — source guide](https://github.com/ashlrai/ashlr-hub/blob/master/docs/VERSE.md) |
32
- | Let the fleet merge on its own inside a scope you signed with Touch ID, and run the one-time `ashlr authority setup` | [Standing authority — source guide](https://github.com/ashlrai/ashlr-hub/blob/master/docs/STANDING-AUTHORITY.md) |
33
+ | Understand the standing authority design and the currently dormant activation path | [Standing authority — source guide](https://github.com/ashlrai/ashlr-hub/blob/master/docs/STANDING-AUTHORITY.md) |
33
34
  | Find a Verse route family, its gates and wire shapes | [Verse build contract — source guide](https://github.com/ashlrai/ashlr-hub/blob/master/docs/VERSE-CONTRACT-V1.md#v310-additive-contract--the-workbench-and-the-autonomy-console) |
34
35
 
35
36
  The CLI's `universe help`, `resources pool --help` and `runtime help` describe