@ashlr/hub 3.12.0 → 3.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (719) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/README.md +29 -16
  3. package/dist/authority-surface.json +274 -148
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/authority.d.ts +145 -33
  6. package/dist/cli/authority.js +1292 -315
  7. package/dist/cli/authority.js.map +1 -1
  8. package/dist/cli/cloud.js +12 -3
  9. package/dist/cli/cloud.js.map +1 -1
  10. package/dist/cli/comms.d.ts +33 -19
  11. package/dist/cli/comms.js +128 -151
  12. package/dist/cli/comms.js.map +1 -1
  13. package/dist/cli/completions.js +1 -1
  14. package/dist/cli/completions.js.map +1 -1
  15. package/dist/cli/daemon.js +29 -0
  16. package/dist/cli/daemon.js.map +1 -1
  17. package/dist/cli/director.d.ts +8 -12
  18. package/dist/cli/director.js +17 -52
  19. package/dist/cli/director.js.map +1 -1
  20. package/dist/cli/fleet.js +4 -1
  21. package/dist/cli/fleet.js.map +1 -1
  22. package/dist/cli/help.js +1 -0
  23. package/dist/cli/help.js.map +1 -1
  24. package/dist/cli/leader.d.ts +27 -3
  25. package/dist/cli/leader.js +253 -4
  26. package/dist/cli/leader.js.map +1 -1
  27. package/dist/core/authority/protected-paths.js +11 -0
  28. package/dist/core/authority/protected-paths.js.map +1 -1
  29. package/dist/core/authority/resident.d.ts +101 -0
  30. package/dist/core/authority/resident.js +246 -0
  31. package/dist/core/authority/resident.js.map +1 -0
  32. package/dist/core/authority/server-enforcement.d.ts +110 -0
  33. package/dist/core/authority/server-enforcement.js +260 -0
  34. package/dist/core/authority/server-enforcement.js.map +1 -0
  35. package/dist/core/authority/standing-grant.d.ts +24 -4
  36. package/dist/core/authority/standing-grant.js +19 -3
  37. package/dist/core/authority/standing-grant.js.map +1 -1
  38. package/dist/core/authority/types.d.ts +43 -0
  39. package/dist/core/authority/types.js +6 -0
  40. package/dist/core/authority/types.js.map +1 -1
  41. package/dist/core/cloud/budget.js +11 -1
  42. package/dist/core/cloud/budget.js.map +1 -1
  43. package/dist/core/cloud/cloud-api.d.ts +25 -2
  44. package/dist/core/cloud/cloud-api.js +139 -5
  45. package/dist/core/cloud/cloud-api.js.map +1 -1
  46. package/dist/core/cloud/pr-actions.d.ts +93 -0
  47. package/dist/core/cloud/pr-actions.js +436 -0
  48. package/dist/core/cloud/pr-actions.js.map +1 -0
  49. package/dist/core/cloud/pr-preview.d.ts +128 -0
  50. package/dist/core/cloud/pr-preview.js +228 -0
  51. package/dist/core/cloud/pr-preview.js.map +1 -0
  52. package/dist/core/cloud/store.d.ts +2 -0
  53. package/dist/core/cloud/store.js +28 -0
  54. package/dist/core/cloud/store.js.map +1 -1
  55. package/dist/core/cloud/timeline-api.d.ts +24 -0
  56. package/dist/core/cloud/timeline-api.js +46 -0
  57. package/dist/core/cloud/timeline-api.js.map +1 -0
  58. package/dist/core/cloud/timeline-types.d.ts +62 -0
  59. package/dist/core/cloud/timeline-types.js +36 -0
  60. package/dist/core/cloud/timeline-types.js.map +1 -0
  61. package/dist/core/cloud/timeline.d.ts +102 -0
  62. package/dist/core/cloud/timeline.js +925 -0
  63. package/dist/core/cloud/timeline.js.map +1 -0
  64. package/dist/core/cloud/tracker.js +67 -0
  65. package/dist/core/cloud/tracker.js.map +1 -1
  66. package/dist/core/cloud/types.d.ts +38 -0
  67. package/dist/core/cloud/types.js +1 -1
  68. package/dist/core/cloud/types.js.map +1 -1
  69. package/dist/core/comms/change-digest.d.ts +130 -0
  70. package/dist/core/comms/change-digest.js +451 -0
  71. package/dist/core/comms/change-digest.js.map +1 -0
  72. package/dist/core/comms/director-prompt.d.ts +4 -5
  73. package/dist/core/comms/director-prompt.js +4 -71
  74. package/dist/core/comms/director-prompt.js.map +1 -1
  75. package/dist/core/comms/director.d.ts +24 -61
  76. package/dist/core/comms/director.js +29 -382
  77. package/dist/core/comms/director.js.map +1 -1
  78. package/dist/core/comms/dispatch.d.ts +37 -12
  79. package/dist/core/comms/dispatch.js +244 -177
  80. package/dist/core/comms/dispatch.js.map +1 -1
  81. package/dist/core/comms/elon-dialogue.d.ts +23 -15
  82. package/dist/core/comms/elon-dialogue.js +36 -307
  83. package/dist/core/comms/elon-dialogue.js.map +1 -1
  84. package/dist/core/comms/fleet-pulse.js +4 -7
  85. package/dist/core/comms/fleet-pulse.js.map +1 -1
  86. package/dist/core/comms/handlers.d.ts +10 -6
  87. package/dist/core/comms/handlers.js +14 -48
  88. package/dist/core/comms/handlers.js.map +1 -1
  89. package/dist/core/comms/migrations.d.ts +47 -0
  90. package/dist/core/comms/migrations.js +125 -0
  91. package/dist/core/comms/migrations.js.map +1 -0
  92. package/dist/core/comms/requests.d.ts +32 -5
  93. package/dist/core/comms/requests.js +101 -5
  94. package/dist/core/comms/requests.js.map +1 -1
  95. package/dist/core/comms/telegram-channel.d.ts +104 -0
  96. package/dist/core/comms/telegram-channel.js +622 -0
  97. package/dist/core/comms/telegram-channel.js.map +1 -0
  98. package/dist/core/comms/telegram-thread-map.d.ts +56 -0
  99. package/dist/core/comms/telegram-thread-map.js +144 -0
  100. package/dist/core/comms/telegram-thread-map.js.map +1 -0
  101. package/dist/core/daemon/capacity-publisher.d.ts +8 -1
  102. package/dist/core/daemon/capacity-publisher.js +40 -2
  103. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  104. package/dist/core/daemon/loop.js +18 -4
  105. package/dist/core/daemon/loop.js.map +1 -1
  106. package/dist/core/daemon/service-install-authority.d.ts +10 -2
  107. package/dist/core/daemon/service-install-authority.js +14 -5
  108. package/dist/core/daemon/service-install-authority.js.map +1 -1
  109. package/dist/core/daemon/service.d.ts +15 -0
  110. package/dist/core/daemon/service.js +26 -0
  111. package/dist/core/daemon/service.js.map +1 -1
  112. package/dist/core/daemon/tick-deadline.d.ts +44 -0
  113. package/dist/core/daemon/tick-deadline.js +83 -0
  114. package/dist/core/daemon/tick-deadline.js.map +1 -0
  115. package/dist/core/daemon/tick-hooks.d.ts +7 -0
  116. package/dist/core/daemon/tick-hooks.js.map +1 -1
  117. package/dist/core/daemon/tick-progress.d.ts +39 -0
  118. package/dist/core/daemon/tick-progress.js +194 -0
  119. package/dist/core/daemon/tick-progress.js.map +1 -0
  120. package/dist/core/dashboard.js +3 -1
  121. package/dist/core/dashboard.js.map +1 -1
  122. package/dist/core/fleet/cloud-intake.d.ts +95 -0
  123. package/dist/core/fleet/cloud-intake.js +557 -0
  124. package/dist/core/fleet/cloud-intake.js.map +1 -0
  125. package/dist/core/fleet/dispatch-router.d.ts +13 -0
  126. package/dist/core/fleet/dispatch-router.js +32 -8
  127. package/dist/core/fleet/dispatch-router.js.map +1 -1
  128. package/dist/core/fleet/fleet-merge-state.d.ts +16 -0
  129. package/dist/core/fleet/fleet-merge-state.js.map +1 -1
  130. package/dist/core/fleet/host-merge.d.ts +14 -0
  131. package/dist/core/fleet/host-merge.js +24 -2
  132. package/dist/core/fleet/host-merge.js.map +1 -1
  133. package/dist/core/fleet/merge-gates.d.ts +21 -0
  134. package/dist/core/fleet/merge-gates.js +39 -5
  135. package/dist/core/fleet/merge-gates.js.map +1 -1
  136. package/dist/core/fleet/mirrors.d.ts +162 -6
  137. package/dist/core/fleet/mirrors.js +1051 -49
  138. package/dist/core/fleet/mirrors.js.map +1 -1
  139. package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
  140. package/dist/core/fleet/standing-merge-pass.js +102 -1
  141. package/dist/core/fleet/standing-merge-pass.js.map +1 -1
  142. package/dist/core/fleet/status.d.ts +17 -0
  143. package/dist/core/fleet/status.js +22 -0
  144. package/dist/core/fleet/status.js.map +1 -1
  145. package/dist/core/fleet/tick-hooks-live.d.ts +10 -1
  146. package/dist/core/fleet/tick-hooks-live.js +57 -8
  147. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  148. package/dist/core/fleet/verify-check-run.d.ts +90 -0
  149. package/dist/core/fleet/verify-check-run.js +274 -0
  150. package/dist/core/fleet/verify-check-run.js.map +1 -0
  151. package/dist/core/git.d.ts +17 -0
  152. package/dist/core/git.js +124 -25
  153. package/dist/core/git.js.map +1 -1
  154. package/dist/core/goals/open-goals.d.ts +47 -0
  155. package/dist/core/goals/open-goals.js +33 -0
  156. package/dist/core/goals/open-goals.js.map +1 -0
  157. package/dist/core/inbox/merge.d.ts +5 -0
  158. package/dist/core/inbox/merge.js +58 -2
  159. package/dist/core/inbox/merge.js.map +1 -1
  160. package/dist/core/integrations/locus.d.ts +28 -0
  161. package/dist/core/integrations/locus.js +155 -30
  162. package/dist/core/integrations/locus.js.map +1 -1
  163. package/dist/core/integrations/telegram-format.d.ts +40 -0
  164. package/dist/core/integrations/telegram-format.js +123 -0
  165. package/dist/core/integrations/telegram-format.js.map +1 -0
  166. package/dist/core/integrations/telegram.d.ts +60 -4
  167. package/dist/core/integrations/telegram.js +161 -28
  168. package/dist/core/integrations/telegram.js.map +1 -1
  169. package/dist/core/mcp-registry.d.ts +12 -0
  170. package/dist/core/mcp-registry.js +70 -0
  171. package/dist/core/mcp-registry.js.map +1 -1
  172. package/dist/core/observability/rollup.d.ts +12 -10
  173. package/dist/core/observability/rollup.js +44 -17
  174. package/dist/core/observability/rollup.js.map +1 -1
  175. package/dist/core/resources/connection-monitor.d.ts +9 -0
  176. package/dist/core/resources/connection-monitor.js +19 -9
  177. package/dist/core/resources/connection-monitor.js.map +1 -1
  178. package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
  179. package/dist/core/resources/quota-refresh-lease.js +34 -1
  180. package/dist/core/resources/quota-refresh-lease.js.map +1 -1
  181. package/dist/core/routing/budget-api.d.ts +18 -1
  182. package/dist/core/routing/budget-api.js +120 -10
  183. package/dist/core/routing/budget-api.js.map +1 -1
  184. package/dist/core/routing/budget-store.d.ts +22 -1
  185. package/dist/core/routing/budget-store.js +22 -8
  186. package/dist/core/routing/budget-store.js.map +1 -1
  187. package/dist/core/routing/readiness-types.d.ts +82 -0
  188. package/dist/core/routing/readiness-types.js +23 -0
  189. package/dist/core/routing/readiness-types.js.map +1 -0
  190. package/dist/core/routing/readiness.d.ts +103 -0
  191. package/dist/core/routing/readiness.js +480 -0
  192. package/dist/core/routing/readiness.js.map +1 -0
  193. package/dist/core/sandbox/confine.js +22 -1
  194. package/dist/core/sandbox/confine.js.map +1 -1
  195. package/dist/core/sandbox/policy.d.ts +23 -0
  196. package/dist/core/sandbox/policy.js +100 -0
  197. package/dist/core/sandbox/policy.js.map +1 -1
  198. package/dist/core/types.d.ts +13 -0
  199. package/dist/core/types.js.map +1 -1
  200. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  201. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
  202. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
  203. package/dist/core/usage/frontier-usage.d.ts +20 -2
  204. package/dist/core/usage/frontier-usage.js +75 -17
  205. package/dist/core/usage/frontier-usage.js.map +1 -1
  206. package/dist/core/verse/account-health.js +9 -3
  207. package/dist/core/verse/account-health.js.map +1 -1
  208. package/dist/core/verse/accounts.d.ts +45 -0
  209. package/dist/core/verse/accounts.js +246 -17
  210. package/dist/core/verse/accounts.js.map +1 -1
  211. package/dist/core/verse/activity-api.d.ts +5 -1
  212. package/dist/core/verse/activity-api.js +62 -14
  213. package/dist/core/verse/activity-api.js.map +1 -1
  214. package/dist/core/verse/apps-api.js +23 -11
  215. package/dist/core/verse/apps-api.js.map +1 -1
  216. package/dist/core/verse/apps.d.ts +11 -9
  217. package/dist/core/verse/apps.js +2 -2
  218. package/dist/core/verse/apps.js.map +1 -1
  219. package/dist/core/verse/authority-api.d.ts +17 -3
  220. package/dist/core/verse/authority-api.js +122 -7
  221. package/dist/core/verse/authority-api.js.map +1 -1
  222. package/dist/core/verse/autonomy-ladder.d.ts +172 -0
  223. package/dist/core/verse/autonomy-ladder.js +251 -0
  224. package/dist/core/verse/autonomy-ladder.js.map +1 -0
  225. package/dist/core/verse/context-fit.js +7 -5
  226. package/dist/core/verse/context-fit.js.map +1 -1
  227. package/dist/core/verse/control-api.d.ts +23 -1
  228. package/dist/core/verse/control-api.js +117 -10
  229. package/dist/core/verse/control-api.js.map +1 -1
  230. package/dist/core/verse/fleet-live-api.js +13 -5
  231. package/dist/core/verse/fleet-live-api.js.map +1 -1
  232. package/dist/core/verse/folder-io.d.ts +50 -0
  233. package/dist/core/verse/folder-io.js +142 -0
  234. package/dist/core/verse/folder-io.js.map +1 -0
  235. package/dist/core/verse/git-api.js +5 -4
  236. package/dist/core/verse/git-api.js.map +1 -1
  237. package/dist/core/verse/git-ops.d.ts +10 -1
  238. package/dist/core/verse/git-ops.js +18 -2
  239. package/dist/core/verse/git-ops.js.map +1 -1
  240. package/dist/core/verse/github-api.d.ts +1 -1
  241. package/dist/core/verse/github-api.js +5 -4
  242. package/dist/core/verse/github-api.js.map +1 -1
  243. package/dist/core/verse/github-repo.js +118 -14
  244. package/dist/core/verse/github-repo.js.map +1 -1
  245. package/dist/core/verse/leader-api.d.ts +5 -4
  246. package/dist/core/verse/leader-api.js +237 -10
  247. package/dist/core/verse/leader-api.js.map +1 -1
  248. package/dist/core/verse/local-models.d.ts +10 -0
  249. package/dist/core/verse/local-models.js +10 -1
  250. package/dist/core/verse/local-models.js.map +1 -1
  251. package/dist/core/verse/login-path.d.ts +73 -0
  252. package/dist/core/verse/login-path.js +123 -14
  253. package/dist/core/verse/login-path.js.map +1 -1
  254. package/dist/core/verse/mcp-control-api.js +4 -4
  255. package/dist/core/verse/mcp-control-api.js.map +1 -1
  256. package/dist/core/verse/mcp-scope.d.ts +22 -0
  257. package/dist/core/verse/mcp-scope.js +41 -1
  258. package/dist/core/verse/mcp-scope.js.map +1 -1
  259. package/dist/core/verse/mcp-seat-view.d.ts +10 -0
  260. package/dist/core/verse/mcp-seat-view.js +30 -4
  261. package/dist/core/verse/mcp-seat-view.js.map +1 -1
  262. package/dist/core/verse/overnight-api.js +20 -2
  263. package/dist/core/verse/overnight-api.js.map +1 -1
  264. package/dist/core/verse/path-guard.d.ts +24 -0
  265. package/dist/core/verse/path-guard.js +91 -22
  266. package/dist/core/verse/path-guard.js.map +1 -1
  267. package/dist/core/verse/preview-api.js +22 -0
  268. package/dist/core/verse/preview-api.js.map +1 -1
  269. package/dist/core/verse/projects.d.ts +21 -0
  270. package/dist/core/verse/projects.js +82 -0
  271. package/dist/core/verse/projects.js.map +1 -1
  272. package/dist/core/verse/seat-readiness.d.ts +25 -0
  273. package/dist/core/verse/seat-readiness.js +43 -6
  274. package/dist/core/verse/seat-readiness.js.map +1 -1
  275. package/dist/core/verse/session-controls-api.js +5 -3
  276. package/dist/core/verse/session-controls-api.js.map +1 -1
  277. package/dist/core/verse/session-handoff.d.ts +26 -0
  278. package/dist/core/verse/session-handoff.js +90 -12
  279. package/dist/core/verse/session-handoff.js.map +1 -1
  280. package/dist/core/verse/terminal-api.js +7 -4
  281. package/dist/core/verse/terminal-api.js.map +1 -1
  282. package/dist/core/verse/terminal.js +9 -5
  283. package/dist/core/verse/terminal.js.map +1 -1
  284. package/dist/core/verse/verse-api.d.ts +3 -1
  285. package/dist/core/verse/verse-api.js +87 -27
  286. package/dist/core/verse/verse-api.js.map +1 -1
  287. package/dist/core/verse/workspaces.d.ts +51 -0
  288. package/dist/core/verse/workspaces.js +177 -47
  289. package/dist/core/verse/workspaces.js.map +1 -1
  290. package/dist/core/vision/leader-apply.d.ts +40 -0
  291. package/dist/core/vision/leader-apply.js +101 -30
  292. package/dist/core/vision/leader-apply.js.map +1 -1
  293. package/dist/core/vision/leader-cadence.d.ts +114 -0
  294. package/dist/core/vision/leader-cadence.js +127 -0
  295. package/dist/core/vision/leader-cadence.js.map +1 -0
  296. package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
  297. package/dist/core/vision/leader-goal-evidence.js +36 -0
  298. package/dist/core/vision/leader-goal-evidence.js.map +1 -0
  299. package/dist/core/vision/leader-health.d.ts +53 -0
  300. package/dist/core/vision/leader-health.js +92 -0
  301. package/dist/core/vision/leader-health.js.map +1 -0
  302. package/dist/core/vision/leader-operator.d.ts +176 -0
  303. package/dist/core/vision/leader-operator.js +355 -0
  304. package/dist/core/vision/leader-operator.js.map +1 -0
  305. package/dist/core/vision/leader-run-chain.d.ts +41 -0
  306. package/dist/core/vision/leader-run-chain.js +54 -0
  307. package/dist/core/vision/leader-run-chain.js.map +1 -0
  308. package/dist/core/vision/leader-seat-plan.d.ts +68 -0
  309. package/dist/core/vision/leader-seat-plan.js +93 -0
  310. package/dist/core/vision/leader-seat-plan.js.map +1 -0
  311. package/dist/core/vision/leader-seat.d.ts +71 -5
  312. package/dist/core/vision/leader-seat.js +235 -33
  313. package/dist/core/vision/leader-seat.js.map +1 -1
  314. package/dist/core/vision/leader-thread-types.d.ts +104 -0
  315. package/dist/core/vision/leader-thread-types.js +9 -0
  316. package/dist/core/vision/leader-thread-types.js.map +1 -0
  317. package/dist/core/vision/leader-thread.d.ts +138 -0
  318. package/dist/core/vision/leader-thread.js +926 -0
  319. package/dist/core/vision/leader-thread.js.map +1 -0
  320. package/dist/core/vision/leader-types.d.ts +75 -1
  321. package/dist/core/vision/leader.d.ts +88 -18
  322. package/dist/core/vision/leader.js +269 -69
  323. package/dist/core/vision/leader.js.map +1 -1
  324. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js → ActionMenu-CIiX2X8w.js} +2 -2
  325. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
  327. package/dist/core/web/public/next/assets/{Advanced-B-LqYXvd.js.map → Advanced-DHsysoIL.js.map} +1 -1
  328. package/dist/core/web/public/next/assets/App-CMeAocmW.js +7 -0
  329. package/dist/core/web/public/next/assets/{App-E2zCDRxm.js.map → App-CMeAocmW.js.map} +1 -1
  330. package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
  331. package/dist/core/web/public/next/assets/{AppsSection-8wXPPhZb.js.map → AppsSection-DISYnMnc.js.map} +1 -1
  332. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
  333. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
  334. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js +3 -0
  335. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js.map +1 -0
  336. package/dist/core/web/public/next/assets/AutonomyOffState-CmSSTHVe.css +1 -0
  337. package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
  338. package/dist/core/web/public/next/assets/{AutonomySection-B46igJKR.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
  339. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
  340. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
  341. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js → BranchBar-BxhdiIpx.js} +2 -2
  342. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
  343. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js +2 -0
  344. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js.map +1 -0
  345. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js → Button-D90dzI_o.js} +2 -2
  346. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js.map → Button-D90dzI_o.js.map} +1 -1
  347. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js → CapacityStrip-qKDBC65C.js} +2 -2
  348. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
  350. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
  351. package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
  352. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
  353. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js.map +1 -0
  354. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
  355. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
  356. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
  357. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
  358. package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
  359. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
  360. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
  361. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
  362. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
  363. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js → DeleteChatDialog-BCfP12GH.js} +2 -2
  364. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
  365. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js → Dialog-D3msQlCj.js} +2 -2
  366. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js.map → Dialog-D3msQlCj.js.map} +1 -1
  367. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js → DiffPane-Ix6hvXlY.js} +2 -2
  368. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
  369. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js → DiffViewer-C4WKsCIe.js} +2 -2
  370. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
  371. package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
  372. package/dist/core/web/public/next/assets/{DockHost-DW9q0NdR.js.map → DockHost-aWP7liri.js.map} +1 -1
  373. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js → EmptyState-D2IRy3Cg.js} +2 -2
  374. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
  375. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js → Epistemic-DMr18muX.js} +2 -2
  376. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js.map → Epistemic-DMr18muX.js.map} +1 -1
  377. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js +2 -0
  378. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js.map +1 -0
  379. package/dist/core/web/public/next/assets/EvidenceTimeline-PBDAiSuG.css +1 -0
  380. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
  381. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
  382. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
  383. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
  384. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js → GearTray-Dt-ee32-.js} +2 -2
  385. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js.map → GearTray-Dt-ee32-.js.map} +1 -1
  386. package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
  387. package/dist/core/web/public/next/assets/{GrowthSection-iiQg6wvK.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
  388. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js → HandoffDialog-CLJQLe7M.js} +2 -2
  389. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
  390. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js → Input-D_KRJA9V.js} +2 -2
  391. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js.map → Input-D_KRJA9V.js.map} +1 -1
  392. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
  393. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
  394. package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
  395. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
  396. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
  397. package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
  398. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
  399. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
  400. package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
  401. package/dist/core/web/public/next/assets/{McpSection-BRuCcTjT.js.map → McpSection-DGbRcyv8.js.map} +1 -1
  402. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js → MessageMarkdown-DFvk06qG.js} +3 -3
  403. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
  404. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
  405. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
  406. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js → Meter-CMj-VafN.js} +2 -2
  407. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js.map → Meter-CMj-VafN.js.map} +1 -1
  408. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
  409. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
  410. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
  411. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
  412. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
  413. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
  414. package/dist/core/web/public/next/assets/NeedsYouList-CCsijdWt.js +2 -0
  415. package/dist/core/web/public/next/assets/{NeedsYouList-BgH8ezqf.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
  416. package/dist/core/web/public/next/assets/NeedsYouList-CH6Mq-E_.css +1 -0
  417. package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
  418. package/dist/core/web/public/next/assets/{NewChatDialog-Db5Xjrk8.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
  419. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js +3 -0
  420. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js.map +1 -0
  421. package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
  422. package/dist/core/web/public/next/assets/{OnboardingGate-C4VXn7BJ.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
  423. package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
  424. package/dist/core/web/public/next/assets/{PreviewPane-BPBbcROb.js.map → PreviewPane-COid5A0f.js.map} +1 -1
  425. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js → ProviderLogo-Cq-CYIwT.js} +2 -2
  426. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
  427. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js → RailStatus-Co5UB6We.js} +2 -2
  428. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js.map → RailStatus-Co5UB6We.js.map} +1 -1
  429. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js → RefreshIndicator-DO9ibnSq.js} +2 -2
  430. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
  431. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
  432. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BX2nkdmZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
  433. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
  434. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
  435. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
  436. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
  437. package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
  438. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
  439. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
  440. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
  441. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
  442. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js → SeatSelector-J5R3zDkB.js} +3 -3
  443. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
  444. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js → Segmented-CGh_-tBb.js} +2 -2
  445. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js.map → Segmented-CGh_-tBb.js.map} +1 -1
  446. package/dist/core/web/public/next/assets/{Select-De52fghU.js → Select-CWnmUzs3.js} +2 -2
  447. package/dist/core/web/public/next/assets/{Select-De52fghU.js.map → Select-CWnmUzs3.js.map} +1 -1
  448. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js → SessionGate-sp4KsnUo.js} +2 -2
  449. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
  450. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js → SessionInsightChip-DLFAzdbi.js} +2 -2
  451. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
  452. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js → SessionSearch-DbFjwR1h.js} +2 -2
  453. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
  454. package/dist/core/web/public/next/assets/{SettingsSection-mI9wQYZg.js → SettingsSection-Ch23msJ5.js} +2 -2
  455. package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
  456. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js +2 -0
  457. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js.map +1 -0
  458. package/dist/core/web/public/next/assets/SetupChecklist-BhZpFLsj.css +1 -0
  459. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
  460. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
  461. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js → Sheet-BZ2AG4Eo.js} +2 -2
  462. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
  463. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
  464. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
  465. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
  466. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js.map +1 -0
  467. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js → Slider-KVoJLDD6.js} +2 -2
  468. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js.map → Slider-KVoJLDD6.js.map} +1 -1
  469. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
  470. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
  471. package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
  472. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js → StatusBadge-CXsYqmdU.js} +2 -2
  473. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
  474. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
  475. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
  476. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js → Surface-BfDmQcKe.js} +2 -2
  477. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js.map → Surface-BfDmQcKe.js.map} +1 -1
  478. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
  479. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
  480. package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
  481. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js → Switch-9NtO_6Lj.js} +2 -2
  482. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js.map → Switch-9NtO_6Lj.js.map} +1 -1
  483. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js → Tag-DscCRFcN.js} +2 -2
  484. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js.map → Tag-DscCRFcN.js.map} +1 -1
  485. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js → TerminalPane-B668-DJW.js} +5 -5
  486. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js.map → TerminalPane-B668-DJW.js.map} +1 -1
  487. package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
  488. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DtXFhAhw.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
  489. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js → UniverseView-DG70zH0W.js} +4 -4
  490. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js.map → UniverseView-DG70zH0W.js.map} +1 -1
  491. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
  492. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
  493. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
  494. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
  495. package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
  496. package/dist/core/web/public/next/assets/{Workspace-BQSZFSeO.js.map → Workspace-D1nP9BhD.js.map} +1 -1
  497. package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
  498. package/dist/core/web/public/next/assets/{actions-Ci6I4C0l.js.map → actions-CY-PjpGc.js.map} +1 -1
  499. package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
  500. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js → apps-model-Du02KhAf.js} +2 -2
  501. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js.map → apps-model-Du02KhAf.js.map} +1 -1
  502. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js → authority-model-79SeuKlJ.js} +2 -2
  503. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js.map → authority-model-79SeuKlJ.js.map} +1 -1
  504. package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
  505. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
  506. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
  507. package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
  508. package/dist/core/web/public/next/assets/{budget-queries-DsAjH8ac.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
  509. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
  510. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
  511. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
  512. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
  513. package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
  514. package/dist/core/web/public/next/assets/cloud-model-BDivRMqv.js +2 -0
  515. package/dist/core/web/public/next/assets/{cloud-model-CX407gPY.js.map → cloud-model-BDivRMqv.js.map} +1 -1
  516. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js → cloud-queries-BPQQ5_pJ.js} +2 -2
  517. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
  518. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
  519. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
  520. package/dist/core/web/public/next/assets/{command-catalog-CF0cQQac.js → command-catalog-BIntSa9l.js} +2 -2
  521. package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
  522. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js → context-model-Br8t9jgG.js} +2 -2
  523. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js.map → context-model-Br8t9jgG.js.map} +1 -1
  524. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js → context-model-CokrgEUq.js} +3 -3
  525. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js.map → context-model-CokrgEUq.js.map} +1 -1
  526. package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
  527. package/dist/core/web/public/next/assets/{context-queries-CktFQqSS.js.map → context-queries-eL3caKVG.js.map} +1 -1
  528. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js → control-queries-B9K-wmcB.js} +2 -2
  529. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js.map → control-queries-B9K-wmcB.js.map} +1 -1
  530. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js +2 -0
  531. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js.map +1 -0
  532. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js → dock-icons-BJ6ZqB2t.js} +2 -2
  533. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
  534. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js → fleet-model-BvDR3gjp.js} +2 -2
  535. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
  536. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js → fleet-queries-W2UFVMZJ.js} +2 -2
  537. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
  538. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js → focus-trap-CtI1SlMX.js} +2 -2
  539. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
  540. package/dist/core/web/public/next/assets/format-CH4g_sl1.js +2 -0
  541. package/dist/core/web/public/next/assets/format-CH4g_sl1.js.map +1 -0
  542. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
  543. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
  544. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js → git-model-Dnkd1TnK.js} +2 -2
  545. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js.map → git-model-Dnkd1TnK.js.map} +1 -1
  546. package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
  547. package/dist/core/web/public/next/assets/{global-CNNGMril.js.map → global-CMNW_dqn.js.map} +1 -1
  548. package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
  549. package/dist/core/web/public/next/assets/{guarded-runners-DPh2d32e.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
  550. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js → icons-D1sYbCTQ.js} +2 -2
  551. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js.map → icons-D1sYbCTQ.js.map} +1 -1
  552. package/dist/core/web/public/next/assets/{index-QesfXBsb.js → index-DZ-UQ7v8.js} +3 -3
  553. package/dist/core/web/public/next/assets/{index-QesfXBsb.js.map → index-DZ-UQ7v8.js.map} +1 -1
  554. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
  555. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
  556. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
  557. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
  558. package/dist/core/web/public/next/assets/{live-model-De-q0ZFK.js → live-model-D_32RAOR.js} +2 -2
  559. package/dist/core/web/public/next/assets/live-model-D_32RAOR.js.map +1 -0
  560. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js → mind.module-7hA92hRg.js} +2 -2
  561. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js.map → mind.module-7hA92hRg.js.map} +1 -1
  562. package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
  563. package/dist/core/web/public/next/assets/{mutations-DTCtKCn_.js.map → mutations-DQPbFdRJ.js.map} +1 -1
  564. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js → nav-0dOYe2rJ.js} +2 -2
  565. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js.map → nav-0dOYe2rJ.js.map} +1 -1
  566. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js → overnight-queries-C4wOnFtE.js} +2 -2
  567. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
  568. package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
  569. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js → queries-BTXWdZzU.js} +2 -2
  570. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js.map → queries-BTXWdZzU.js.map} +1 -1
  571. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js → reasoning-pref-Ca6lN6x_.js} +2 -2
  572. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
  573. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js → reveal-anchor-DfNLgK_I.js} +2 -2
  574. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
  575. package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
  576. package/dist/core/web/public/next/assets/{seat-subscription-C5Tvr0WQ.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
  577. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js → sidebar-model-CLCdqwkR.js} +2 -2
  578. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
  579. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js → slots-C-qBeu-8.js} +3 -3
  580. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js.map → slots-C-qBeu-8.js.map} +1 -1
  581. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js → surface-data-Dj71tdD-.js} +2 -2
  582. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js.map → surface-data-Dj71tdD-.js.map} +1 -1
  583. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
  584. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
  585. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js → tasks-model-O8yR5YXp.js} +2 -2
  586. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
  587. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js → terminal-icons-CoRZq9iO.js} +2 -2
  588. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
  589. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
  590. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
  591. package/dist/core/web/public/next/assets/types-IYKrYLku.js +2 -0
  592. package/dist/core/web/public/next/assets/types-IYKrYLku.js.map +1 -0
  593. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js → usage-queries-AdjEyEtn.js} +2 -2
  594. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
  595. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js → use-guarded-action-CuuMHeDX.js} +2 -2
  596. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
  597. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js → use-ticker-BBcp02SZ.js} +2 -2
  598. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
  599. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js → use-token-gate-CbXVYQYI.js} +2 -2
  600. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
  601. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js → useOnboarding-C_Fpe_sH.js} +2 -2
  602. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
  603. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
  604. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
  605. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js → useVerseTranscript-DgbigUlV.js} +2 -2
  606. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
  607. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js → verse-icons-S56hIiXS.js} +2 -2
  608. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js.map → verse-icons-S56hIiXS.js.map} +1 -1
  609. package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
  610. package/dist/core/web/public/next/assets/{verse-model-MMySehjj.js.map → verse-model-DAVevkNe.js.map} +1 -1
  611. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js → warmup-B_RAtNZ_.js} +3 -3
  612. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js.map → warmup-B_RAtNZ_.js.map} +1 -1
  613. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js +2 -0
  614. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js.map +1 -0
  615. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js → workspace-model-dji5-Al3.js} +2 -2
  616. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js.map → workspace-model-dji5-Al3.js.map} +1 -1
  617. package/dist/core/web/public/next/index.html +1 -1
  618. package/dist/core/web/read-projection-worker.js +2 -1
  619. package/dist/core/web/read-projection-worker.js.map +1 -1
  620. package/dist/core/web/read-projections.d.ts +3 -0
  621. package/dist/core/web/read-projections.js +2 -2
  622. package/dist/core/web/read-projections.js.map +1 -1
  623. package/dist/core/web/visibility.js +3 -4
  624. package/dist/core/web/visibility.js.map +1 -1
  625. package/dist/release-dependency-inventory.json +1 -1
  626. package/docs/AUTONOMY-GAP.md +1 -1
  627. package/package.json +3 -2
  628. package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js +0 -2
  629. package/dist/core/web/public/next/assets/App-E2zCDRxm.js +0 -7
  630. package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js +0 -2
  631. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js +0 -2
  632. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js.map +0 -1
  633. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js +0 -2
  634. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js.map +0 -1
  635. package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +0 -1
  636. package/dist/core/web/public/next/assets/AutonomySection-B46igJKR.js +0 -2
  637. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js +0 -2
  638. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js.map +0 -1
  639. package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
  640. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js +0 -2
  641. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js.map +0 -1
  642. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js +0 -3
  643. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js.map +0 -1
  644. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js +0 -2
  645. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js.map +0 -1
  646. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
  647. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js +0 -2
  648. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js.map +0 -1
  649. package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js +0 -2
  650. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js +0 -3
  651. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js.map +0 -1
  652. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js +0 -2
  653. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js.map +0 -1
  654. package/dist/core/web/public/next/assets/GrowthSection-iiQg6wvK.js +0 -2
  655. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js +0 -2
  656. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js.map +0 -1
  657. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js +0 -2
  658. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js.map +0 -1
  659. package/dist/core/web/public/next/assets/McpSection-BRuCcTjT.js +0 -2
  660. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js +0 -2
  661. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js.map +0 -1
  662. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js +0 -2
  663. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js.map +0 -1
  664. package/dist/core/web/public/next/assets/NeedsYouList-BgH8ezqf.js +0 -2
  665. package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +0 -1
  666. package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js +0 -3
  667. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js +0 -2
  668. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js.map +0 -1
  669. package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js +0 -3
  670. package/dist/core/web/public/next/assets/PreviewPane-BPBbcROb.js +0 -2
  671. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BX2nkdmZ.js +0 -7
  672. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js +0 -3
  673. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js.map +0 -1
  674. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
  675. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js +0 -2
  676. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js.map +0 -1
  677. package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js.map +0 -1
  678. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js +0 -3
  679. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js.map +0 -1
  680. package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
  681. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js +0 -2
  682. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js.map +0 -1
  683. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js +0 -2
  684. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js.map +0 -1
  685. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js +0 -2
  686. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js.map +0 -1
  687. package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
  688. package/dist/core/web/public/next/assets/UniverseConsoleApp-DtXFhAhw.js +0 -2
  689. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js +0 -3
  690. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js.map +0 -1
  691. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js +0 -3
  692. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js.map +0 -1
  693. package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js +0 -10
  694. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
  695. package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js +0 -2
  696. package/dist/core/web/public/next/assets/budget-queries-DsAjH8ac.js +0 -2
  697. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js +0 -2
  698. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js.map +0 -1
  699. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
  700. package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js +0 -2
  701. package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js.map +0 -1
  702. package/dist/core/web/public/next/assets/context-queries-CktFQqSS.js +0 -2
  703. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js +0 -2
  704. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js.map +0 -1
  705. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js +0 -2
  706. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js.map +0 -1
  707. package/dist/core/web/public/next/assets/global-CNNGMril.js +0 -2
  708. package/dist/core/web/public/next/assets/guarded-runners-DPh2d32e.js +0 -2
  709. package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js.map +0 -1
  710. package/dist/core/web/public/next/assets/mutations-DTCtKCn_.js +0 -2
  711. package/dist/core/web/public/next/assets/primitives-D0Fb3TtS.js +0 -1
  712. package/dist/core/web/public/next/assets/seat-subscription-C5Tvr0WQ.js +0 -2
  713. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js +0 -2
  714. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js.map +0 -1
  715. package/dist/core/web/public/next/assets/types-D5XOdyw8.js +0 -2
  716. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +0 -1
  717. package/dist/core/web/public/next/assets/verse-model-MMySehjj.js +0 -2
  718. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js +0 -2
  719. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"NewChatDialog-Db5Xjrk8.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/git/WorktreeOption.module.css","../../../../../../src/web-ui/routes/verse/git/WorktreeOption.tsx","../../../../../../src/web-ui/routes/verse/NewChatDialog.module.css","../../../../../../src/web-ui/routes/verse/NewChatDialog.tsx"],"sourcesContent":[".option {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n margin: 0;\n padding: 0;\n border: 0;\n min-width: 0;\n}\n.option:disabled { opacity: 0.6; }\n\n.toggle {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n min-height: var(--control-h-sm);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n cursor: pointer;\n}\n.toggle input { width: 16px; height: 16px; accent-color: var(--accent-600); }\n\n.details {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding-left: calc(16px + var(--space-2));\n}\n.nameLabel { font-size: var(--text-sm-size); color: var(--text-secondary); }\n.name {\n flex: 1 1 auto;\n min-width: 0;\n min-height: var(--control-h-sm);\n padding: 0 var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n}\n.name:focus-visible { outline: none; border-color: var(--border-focus); box-shadow: var(--shadow-focus-ring); }\n.name[aria-invalid='true'] { border-color: var(--status-danger-solid); }\n\n.hint {\n margin: 0;\n padding-left: calc(16px + var(--space-2));\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n overflow-wrap: anywhere;\n}\n.hint code {\n font-family: var(--font-mono);\n color: var(--text-secondary);\n}\n","/**\n * routes/verse/git/WorktreeOption.tsx — \"Isolate in worktree\" for the New\n * chat dialog (unit C5; SPEC-310C §2 \"Worktrees\", P1).\n *\n * NewChatDialog is C2's; this is the piece it mounts (CROSS-UNIT request in\n * the C5 report): a checkbox, a name, and one sentence saying exactly what\n * will be created. On submit C2 calls `resolveChatFolder(root, value)` and\n * starts the chat in the folder it returns — the worktree when isolation is\n * on, the project itself when it is off.\n *\n * The name is a slug (the server enforces the same rule); a default is\n * offered so isolation is one click, not a naming exercise.\n */\nimport { useId } from 'react';\nimport { createGitWorktree } from './git-queries.js';\nimport styles from './WorktreeOption.module.css';\n\nexport interface WorktreeValue {\n enabled: boolean;\n name: string;\n}\n\n/** Same rule as core/verse/worktrees.ts WORKTREE_NAME_RE. */\nexport const WORKTREE_NAME_PATTERN = /^[a-z0-9][a-z0-9._-]{0,62}$/i;\n\nexport function isValidWorktreeName(name: string): boolean {\n return WORKTREE_NAME_PATTERN.test(name) && !name.endsWith('.lock') && !name.includes('..');\n}\n\n/** A readable default: `chat-0924-1432` (month, day, hour, minute). */\nexport function defaultWorktreeName(now: Date = new Date()): string {\n const pad = (n: number) => String(n).padStart(2, '0');\n return `chat-${pad(now.getMonth() + 1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}`;\n}\n\n/** Turn free typing into a valid slug as the operator types (\"Fix login!\" → \"fix-login\"). */\nexport function slugifyWorktreeName(raw: string): string {\n return raw\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/^[^a-z0-9]+/, '')\n .replace(/-{2,}/g, '-')\n .slice(0, 63);\n}\n\nexport interface WorktreeOptionProps {\n /** The project folder the chat would start in (its repository name is shown). */\n repoName: string;\n value: WorktreeValue;\n onChange: (next: WorktreeValue) => void;\n disabled?: boolean;\n}\n\nexport function WorktreeOption({ repoName, value, onChange, disabled = false }: WorktreeOptionProps) {\n const nameId = useId();\n const hintId = useId();\n const valid = isValidWorktreeName(value.name);\n return (\n <fieldset className={styles.option} disabled={disabled}>\n <label className={styles.toggle}>\n <input\n type=\"checkbox\"\n checked={value.enabled}\n onChange={(e) => onChange({ enabled: e.target.checked, name: value.name || defaultWorktreeName() })}\n aria-describedby={hintId}\n />\n Isolate in a worktree\n </label>\n {value.enabled ? (\n <div className={styles.details}>\n <label className={styles.nameLabel} htmlFor={nameId}>\n Name\n </label>\n <input\n id={nameId}\n className={styles.name}\n value={value.name}\n onChange={(e) => onChange({ ...value, name: slugifyWorktreeName(e.target.value) })}\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n aria-invalid={!valid || undefined}\n aria-describedby={hintId}\n maxLength={63}\n />\n </div>\n ) : null}\n <p id={hintId} className={styles.hint}>\n {value.enabled ? (\n valid ? (\n <>\n Creates <code>~/.ashlr-worktrees/{repoName}/{value.name}</code> on a new branch <code>verse/{value.name}</code>, from the current commit.\n Uncommitted changes stay in {repoName}.\n </>\n ) : (\n 'Use letters, digits, dots, dashes or underscores.'\n )\n ) : (\n 'The chat works on its own branch in its own folder, so your checkout is untouched.'\n )}\n </p>\n </fieldset>\n );\n}\n\n/**\n * The folder a new chat should start in: the new worktree when isolation is\n * on (created now, through the mutation token like every git write), the\n * project itself when it is off. Throws the server's refusal (a taken name, a\n * repository with no commits) for the dialog to show.\n */\nexport async function resolveChatFolder(root: string, value: WorktreeValue): Promise<string> {\n if (!value.enabled) return root;\n const created = await createGitWorktree(root, value.name);\n return created.path;\n}\n",".width { width: min(520px, calc(100vw - 32px)); }\n\n.form { display: grid; gap: var(--space-4); }\n.field { display: grid; gap: var(--space-1); min-width: 0; }\n.label {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n.optional { font-weight: var(--font-weight-regular); letter-spacing: 0; text-transform: none; opacity: 0.8; }\n\n.select,\n.input {\n width: 100%;\n min-height: var(--control-h);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n text-overflow: ellipsis;\n}\n.input::placeholder { color: var(--text-tertiary); }\n.select,\n.input {\n transition: border-color var(--duration-fast) var(--ease-standard), box-shadow var(--duration-fast) var(--ease-standard);\n}\n.select:hover:not(:disabled),\n.input:hover:not(:disabled) { border-color: var(--border-strong); }\n/* Same focus treatment as the Input/Select primitives: accent edge plus the\n system ring, so a field in this dialog and a field in Settings read\n identically — and both are actually visible (see Input.module.css). */\n.select:focus-visible,\n.input:focus-visible { border-color: var(--border-focus); box-shadow: var(--shadow-focus-ring); }\n\n.hint { font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-tertiary); }\n.error {\n padding-left: var(--space-3);\n border-left: 2px solid var(--status-danger-solid);\n color: var(--status-danger-fg);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n\n.actions { display: flex; justify-content: flex-end; gap: var(--space-2); }\n.cancel,\n.create {\n min-height: var(--control-h);\n padding: 0 var(--space-4);\n border: 1px solid transparent;\n border-radius: var(--radius-sm);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n transition: background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);\n}\n.cancel { color: var(--text-secondary); }\n.cancel:hover { background: var(--bg-hover); color: var(--text-primary); }\n.cancel:active { background: var(--bg-active); }\n.create { background: var(--accent-600); color: var(--accent-contrast); }\n.create:hover:not(:disabled) { background: var(--accent-700); }\n.create:active:not(:disabled) { background: var(--accent-700); }\n.create:disabled { opacity: 0.4; cursor: not-allowed; }\n\n/* The chosen seat's capacity, directly under the picker: this is where the\n choice is made, so the cost of making it belongs here and not one section\n away. Indented on the engine-neutral hairline the error state also uses, so\n it reads as commentary on the field above rather than a new field. */\n.capacity {\n padding-left: var(--space-3);\n border-left: 1px solid var(--border-default);\n}\n\n/* Extra workspace folders: one row per folder, with its own Remove. */\n.rootRow {\n display: flex;\n gap: var(--space-2);\n align-items: center;\n margin-top: var(--space-2);\n}\n\n.rootRow .input { flex: 1 1 auto; min-width: 0; }\n\n.removeRoot,\n.addRoot {\n flex: none;\n padding: var(--space-1) var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n background: var(--surface-raised);\n color: var(--text-default);\n font-size: var(--text-xs);\n cursor: pointer;\n}\n\n.addRoot { margin-top: var(--space-2); align-self: flex-start; }\n\n.removeRoot:hover,\n.addRoot:hover { border-color: var(--border-strong, var(--border-subtle)); }\n\n/* ---- V3.9 context --------------------------------------------------------\n The chosen model's context budget, mode, fit and seat facts. Hung off the\n same hairline as the capacity note above it: both are commentary on the\n seat field, not new fields of their own. */\n.context {\n display: grid;\n gap: var(--space-2);\n min-width: 0;\n padding-left: var(--space-3);\n border-left: 1px solid var(--border-default);\n}\n.contextHead {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-2);\n}\n.contextBudget {\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n font-variant-numeric: tabular-nums;\n color: var(--text-primary);\n}\n/* A model the pinned CLI cannot run: it blocks \"Start chat\", so it reads as a\n warning, in words — the disabled button alone would not say why. */\n.warn {\n padding-left: var(--space-3);\n border-left: 2px solid var(--status-warning-solid);\n color: var(--status-warning-fg);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n.fit { display: grid; gap: var(--space-1); min-width: 0; }\n.fitLine {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n/* The verdict is a WORD first; the tint only repeats it (DESIGN-V2 §6). */\n.fitBadge {\n flex: none;\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-full);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n font-weight: var(--font-weight-semibold);\n line-height: 18px;\n white-space: nowrap;\n color: var(--text-secondary);\n}\n.fitBadge[data-fit='fits'] { border-color: var(--status-success-solid); color: var(--status-success-fg); background: var(--status-success-bg); }\n.fitBadge[data-fit='tight'] { border-color: var(--status-warning-solid); color: var(--status-warning-fg); background: var(--status-warning-bg); }\n.fitBadge[data-fit='expansive'] { border-color: var(--status-info-solid); color: var(--status-info-fg); background: var(--status-info-bg); }\n.fitBadge[data-fit='split'] { border-color: var(--status-danger-solid); color: var(--status-danger-fg); background: var(--status-danger-bg); }\n/* The seat's own facts: its pinned CLI and any note it carries (binary skew,\n catalog not fetched yet). Same quiet treatment as the resources panel. */\n.seatFacts {\n list-style: none;\n margin: 0;\n padding: 0;\n display: grid;\n gap: var(--space-1);\n}\n.seatFacts li {\n font-size: var(--text-2xs-size, 11px);\n line-height: var(--text-2xs-line, 14px);\n color: var(--text-tertiary);\n overflow-wrap: anywhere;\n}\n","/**\n * routes/verse/NewChatDialog.tsx — start a chat: pick a project (saved\n * projects + enrolled repos + any project a previous chat used, or \"Other\n * folder…\" with an absolute path), pick a seat + model, optionally title it.\n * Built on the shared Dialog primitive so focus trap / Escape / return-focus\n * come free.\n *\n * A folder typed here can be KEPT: \"Save as a project\" writes it to the\n * workspace registry and it is in this picker from then on. Before that\n * button existed the only folders that came back were ones a chat had already\n * been created on (core/verse/projects.ts remembers those), so a folder\n * opened and not chatted on was gone by the next launch.\n *\n * The native directory chooser is offered ALONGSIDE the text input, never\n * instead of it — the same console runs in a plain browser, where there is no\n * chooser at all.\n *\n * The seat list is where the choice actually GETS MADE, so the picked seat's\n * capacity is shown here too, under the picker: plan, the binding window as a\n * meter, its reset verbatim, and any credit balance — the same projection the\n * resources panel renders, so the two can never describe one seat differently.\n *\n * Opening the dialog also re-reads the roster. `bootstrap` has no SSE\n * invalidation and the account collector needs ~75s to warm, so a dialog\n * opened early in a session would otherwise show the cold, empty reading\n * taken at mount and present it as the state of the world.\n *\n * V3.9 — THE CONTEXT A CHAT WILL HAVE IS DECIDED HERE TOO (docs/VERSE-CONTEXT.md):\n *\n * - CONTEXT MODE. For a model with a real expansive budget (1M Claude\n * models, GPT-6 / GPT-5.6 on Codex) the operator picks Standard or\n * Expansive, defaulting to the seat's saved preference, and can make the\n * choice that seat's default. The mode is sent explicitly whenever there\n * was a choice, so the chat is created in exactly the mode on screen — even\n * if the preference changed underneath the open dialog.\n * - CONTEXT FIT. The chosen folders (or saved project) are sized by\n * GET /context-fit — git ls-files, bytes ÷ 4, zero spend — and every model\n * row says whether that code would fit, with the chosen model's verdict\n * explained in words (\"split\" says how: fan out, or narrow the folders).\n * Suggests, never switches: nothing here changes the mode on its own.\n * - SEAT FACTS. The chosen seat's pinned CLI version and its own notes\n * (binary skew, catalog not fetched yet) are shown in visible text; a\n * model the pinned CLI cannot run is refused here, with the reason, rather\n * than at turn time.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type FormEvent } from 'react';\nimport type { VerseCreateSessionRequest, VerseModelOption, VerseProject, VerseSeat, VerseWorkspace } from '../../data/api-types.js';\nimport type { VerseContextFit, VerseContextMode, VersePreferences } from '../../../core/verse/types.js';\nimport { budgetFor, hasExpansiveMode } from '../../../core/verse/context-math.js';\nimport { Dialog } from '../../components/primitives/Dialog.js';\nimport { Segmented } from '../../components/primitives/Segmented.js';\nimport { ApiError } from '../../data/client.js';\nimport { useRefetch } from '../../data/hooks.js';\nimport { fetchContextFit, fetchPreferences, updatePreferences } from './context/context-queries.js';\nimport { defaultWorktreeName, isValidWorktreeName, resolveChatFolder, WorktreeOption, type WorktreeValue } from './git/WorktreeOption.js';\nimport { describeGitError } from './git/git-model.js';\nimport { defaultSeatChoice, SeatSelector, type SeatChoice } from './SeatSelector.js';\nimport { LiveCapacityStrip } from './usage/CapacityStrip.js';\nimport {\n CONTEXT_MODE_LABEL,\n FIT_LABEL,\n fitMethodNote,\n contextModeDescription,\n effectiveBudget,\n fitExplanation,\n fitIsFloor,\n modelFit,\n modelUnavailableReason,\n noModeReason,\n resolveContextMode,\n seatCliLine,\n seatContextNotes,\n seatModelOption,\n} from './usage/context-model.js';\nimport { WINDOW_SOURCE_TEXT } from './verse-model.js';\nimport {\n defaultWorkspaceName,\n extraRootsCaveat,\n extraRootsNote,\n MAX_WORKSPACE_ROOTS,\n validateRootSet,\n workspaceSummary,\n} from './workspace-model.js';\nimport { createVerseWorkspace, verseBootstrapQuery, VerseMutationLockedError } from './verse-queries.js';\nimport { formatTokens } from './verse-readouts.js';\nimport { nativePickerAvailable, pickDirectory } from './folder-picker.js';\nimport styles from './NewChatDialog.module.css';\n\n/**\n * Prefix marking a select value as a WORKSPACE id rather than a folder path.\n * Safe for the same reason `OTHER` is: it starts with a NUL, and a filesystem\n * path can never contain one.\n */\nconst WORKSPACE_PREFIX = '\\0workspace:';\n\nconst OTHER = '\u0000other';\n\n/**\n * How long a typed path must sit still before it is sized. Sizing is cheap\n * and cached server-side (60 s), but a request per keystroke would still\n * spawn `git ls-files` for every prefix of a path being typed.\n */\nexport const FIT_DEBOUNCE_MS = 350;\n\n/**\n * Runs a write that needs the mutation token. ChatSection passes its own guard\n * (which opens the token dialog and resumes); resolving `null` means the\n * operator dismissed that dialog and nothing was written.\n */\nexport type RunMutation = <T>(reason: string, action: () => Promise<T>) => Promise<T | null>;\n\nconst runDirectly: RunMutation = (_reason, action) => action();\n\n/** How a \"make this the default\" write ended — carried as a value so no guard can swallow a failure. */\ntype DefaultSave = { ok: true; prefs: VersePreferences } | { ok: false; error: unknown };\n\ntype FitState =\n | { status: 'idle' }\n | { status: 'loading'; key: string }\n | { status: 'ready'; key: string; fit: VerseContextFit }\n | { status: 'error'; key: string; message: string };\n\n/** The seat's saved default mode for new chats; `standard` when none, or when preferences are unread. */\nexport function seatPreferredMode(prefs: VersePreferences | null, seatId: string): VerseContextMode {\n return prefs?.seats[seatId]?.contextMode ?? 'standard';\n}\n\n/**\n * Whether the create request carries `contextMode`, and which.\n *\n * Sent whenever the operator HAD a choice (the model has an expansive budget),\n * so the chat starts in exactly the mode on screen. Also sent — as `standard` —\n * when the seat's saved default is a mode this model does not have, so the\n * server's default resolution can never reject a model the operator was\n * allowed to pick. Otherwise omitted: the server's own default is the only\n * possible answer, and a model with no known window has no budget to name.\n */\nexport function requestContextMode(option: VerseModelOption | null, mode: VerseContextMode, preferred: VerseContextMode): VerseContextMode | null {\n if (!option) return null;\n if (hasExpansiveMode(option)) return resolveContextMode(option, mode);\n if (preferred !== 'standard' && budgetFor(option, 'standard') !== null) return 'standard';\n return null;\n}\n\n/** The operator-facing sentence for a failed read or write: the server's own words first. */\nfunction describeError(err: unknown): string {\n if (err instanceof VerseMutationLockedError) return 'Unlock actions with the mutation token to save a default.';\n if (err instanceof ApiError) return err.detail ?? err.message;\n return err instanceof Error ? err.message : String(err);\n}\n\nexport interface NewChatDialogProps {\n open: boolean;\n onClose: () => void;\n projects: readonly VerseProject[];\n seats: readonly VerseSeat[];\n /** Named multi-folder workspaces. Absent on an older server. */\n workspaces?: readonly VerseWorkspace[];\n /** Pre-fill (e.g. \"same project, different seat\" from the composer). */\n initialProjectPath?: string | null;\n initialSeat?: SeatChoice | null;\n busy?: boolean;\n error?: string | null;\n onCreate: (req: VerseCreateSessionRequest) => Promise<void> | void;\n /** Guard for the one write this dialog makes itself (a seat's default mode). */\n runMutation?: RunMutation;\n}\n\nexport function NewChatDialog({ open, onClose, projects, seats, workspaces = [], initialProjectPath, initialSeat, busy = false, error, onCreate, runMutation = runDirectly }: NewChatDialogProps) {\n const titleId = useId();\n const projectId = useId();\n const pathId = useId();\n const nameId = useId();\n const seatId = useId();\n const firstField = useRef<HTMLSelectElement>(null);\n const [projectChoice, setProjectChoice] = useState<string>('');\n const [customPath, setCustomPath] = useState('');\n const [seat, setSeat] = useState<SeatChoice | null>(null);\n const [title, setTitle] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n /** Ad-hoc folders beyond the primary, when not binding to a workspace. */\n const [extraRoots, setExtraRoots] = useState<string[]>([]);\n /**\n * Projects saved from THIS dialog, held locally as well as sent.\n *\n * `workspaces` is refreshed by the cache invalidation the mutation triggers,\n * but that is a round trip. Keeping the created record here means the option\n * the operator just saved is in the picker on the very next paint — the\n * whole promise of the button is that the folder is now kept, so a second of\n * \"did that work?\" would undo it.\n */\n const [saved, setSaved] = useState<VerseWorkspace[]>([]);\n const [savingProject, setSavingProject] = useState(false);\n const [savedNote, setSavedNote] = useState<string | null>(null);\n /** The operator's standing choices; null until read (or when the read failed — then every seat defaults to Standard). */\n const [prefs, setPrefs] = useState<VersePreferences | null>(null);\n const [prefsError, setPrefsError] = useState<string | null>(null);\n /** An explicit mode pick for the chosen model; null = follow the seat's saved default. */\n const [modeChoice, setModeChoice] = useState<VerseContextMode | null>(null);\n const [savingDefault, setSavingDefault] = useState(false);\n const [defaultNote, setDefaultNote] = useState<{ ok: boolean; text: string } | null>(null);\n const [fitState, setFitState] = useState<FitState>({ status: 'idle' });\n /** \"Isolate in a worktree\" (C5): off by default; a name is offered once it is turned on. */\n const [worktree, setWorktree] = useState<WorktreeValue>({ enabled: false, name: '' });\n /** True while the worktree is being created, before the chat is. */\n const [isolating, setIsolating] = useState(false);\n /** Readings taken while this dialog is open, so flipping between folders does not re-ask. */\n const fitCache = useRef(new Map<string, VerseContextFit>());\n\n const sortedProjects = useMemo(() => [...projects].sort((a, b) => Number(b.enrolled) - Number(a.enrolled) || a.name.localeCompare(b.name)), [projects]);\n\n // Reset to the caller's pre-fill ONLY on the open transition. The pre-fill\n // inputs are read through a ref: `projects`/`seats` are fresh arrays on\n // every bootstrap refetch (which any turn finishing elsewhere triggers),\n // and re-running the reset on those would wipe a half-typed path or title.\n const prefill = useRef({ initialProjectPath, initialSeat, projects, seats, sortedProjects });\n prefill.current = { initialProjectPath, initialSeat, projects, seats, sortedProjects };\n useEffect(() => {\n if (!open) return;\n const { initialProjectPath: path, initialSeat: seatChoice, projects: known, seats: available, sortedProjects: sorted } = prefill.current;\n const knownPath = path && known.some((p) => p.path === path) ? path : null;\n setProjectChoice(knownPath ?? (path ? OTHER : sorted[0]?.path ?? OTHER));\n setCustomPath(knownPath ? '' : path ?? '');\n setSeat(normalizeChoice(seatChoice ?? null, available) ?? defaultSeatChoice(available));\n setTitle('');\n setLocalError(null);\n setExtraRoots([]);\n setSavedNote(null);\n setSavingProject(false);\n setSaved([]);\n setModeChoice(null);\n setDefaultNote(null);\n setSavingDefault(false);\n setWorktree({ enabled: false, name: defaultWorktreeName() });\n setIsolating(false);\n fitCache.current = new Map();\n }, [open]);\n\n // Preferences are re-read on every open: a default saved from another tab\n // (or by the CLI) must be what this dialog starts from.\n useEffect(() => {\n if (!open) return undefined;\n let cancelled = false;\n setPrefsError(null);\n fetchPreferences()\n .then((next) => {\n if (!cancelled) setPrefs(next);\n })\n .catch((err: unknown) => {\n if (cancelled) return;\n setPrefs(null);\n setPrefsError(describeError(err));\n });\n return () => {\n cancelled = true;\n };\n }, [open]);\n\n // Seats that arrive after the dialog opened (slow bootstrap) fill an empty\n // seat once, without touching anything the operator has typed.\n useEffect(() => {\n if (!open || seat !== null || seats.length === 0) return;\n setSeat(normalizeChoice(initialSeat ?? null, seats) ?? defaultSeatChoice(seats));\n }, [open, seat, seats, initialSeat]);\n\n // One re-read per open, not per render: the roster is worth a fresh look at\n // the moment a seat is about to be chosen, and worth nothing after that.\n const refetchBootstrap = useRefetch(verseBootstrapQuery);\n useEffect(() => {\n if (open) refetchBootstrap();\n }, [open, refetchBootstrap]);\n\n // The picker's saved-project list: what the server has, plus anything saved\n // in this dialog that the refreshed list has not caught up with yet.\n const savedProjects = useMemo(() => {\n const byId = new Map<string, VerseWorkspace>();\n for (const w of workspaces) byId.set(w.id, w);\n for (const w of saved) if (!byId.has(w.id)) byId.set(w.id, w);\n return [...byId.values()];\n }, [workspaces, saved]);\n\n const usingWorkspace = projectChoice.startsWith(WORKSPACE_PREFIX);\n const workspaceId = usingWorkspace ? projectChoice.slice(WORKSPACE_PREFIX.length) : null;\n const projectPath = usingWorkspace ? '' : projectChoice === OTHER ? customPath.trim() : projectChoice;\n const chosenSeat = seat === null ? null : seats.find((s) => s.id === seat.seatId) ?? null;\n const chosenOption = chosenSeat === null || seat === null ? null : seatModelOption(chosenSeat, seat.model);\n const disabledSeat = chosenSeat?.health.state === 'unavailable';\n // A model the pinned CLI cannot run is refused HERE, with its reason, not at\n // turn time — and a model the seat no longer lists is not a choice at all.\n const modelReason = chosenSeat !== null && chosenOption !== null ? modelUnavailableReason(chosenSeat, chosenOption) : null;\n // Isolation applies to an ad-hoc folder only: a saved project's roots are\n // fixed in the registry (the same reason extra folders are hidden for one).\n const offersWorktree = !usingWorkspace && projectPath.length > 0;\n const isolate = offersWorktree && worktree.enabled;\n const canCreate = !busy && !isolating && (usingWorkspace || projectPath.length > 0) && seat !== null && !disabledSeat\n && chosenOption !== null && modelReason === null && (!isolate || isValidWorktreeName(worktree.name));\n const chosenWorkspace = workspaceId === null ? null : savedProjects.find((w) => w.id === workspaceId) ?? null;\n\n // ---- context mode ------------------------------------------------------\n const preferredMode = seat === null ? 'standard' : seatPreferredMode(prefs, seat.seatId);\n const chatMode = resolveContextMode(chosenOption, modeChoice ?? preferredMode);\n const offersModes = hasExpansiveMode(chosenOption);\n const savedDefault = resolveContextMode(chosenOption, preferredMode);\n\n /** Every OTHER row shows its seat's default mode; the chosen row shows the mode picked for it. */\n const modeFor = useCallback((rowSeat: VerseSeat, model: VerseModelOption): VerseContextMode => {\n if (seat !== null && rowSeat.id === seat.seatId && model.id === seat.model) return chatMode;\n return resolveContextMode(model, seatPreferredMode(prefs, rowSeat.id));\n }, [seat, chatMode, prefs]);\n\n function chooseSeat(choice: SeatChoice) {\n setSeat(choice);\n // A mode picked for one model says nothing about another: follow the new\n // seat's saved default until the operator picks again.\n setModeChoice(null);\n setDefaultNote(null);\n }\n\n async function makeSeatDefault() {\n if (seat === null || chosenSeat === null) return;\n const mode = chatMode;\n setSavingDefault(true);\n setDefaultNote(null);\n try {\n // The action SETTLES as a value, never as a rejection. A guard that parks\n // the action behind the token prompt and runs it after the unlock may not\n // forward a rejection (ChatSection's `withToken` resolves only), and then\n // this function's catch/finally would never run: the button would sit on\n // \"Saving…\" for the rest of the dialog with no error shown. Catching\n // here makes both outcomes reach the code below whichever guard runs it.\n const outcome = await runMutation(`Saving ${CONTEXT_MODE_LABEL[mode]} as the default context mode for ${chosenSeat.label}.`,\n () => updatePreferences({ seatId: seat.seatId, contextMode: mode }).then(\n (saved): DefaultSave => ({ ok: true, prefs: saved }),\n (error: unknown): DefaultSave => ({ ok: false, error }),\n ));\n if (outcome === null) return; // the operator closed the token prompt: nothing was sent\n if (!outcome.ok) {\n setDefaultNote({ ok: false, text: describeError(outcome.error) });\n return;\n }\n setPrefs(outcome.prefs);\n setModeChoice(null);\n setDefaultNote({ ok: true, text: `New chats on ${chosenSeat.label} now start in ${CONTEXT_MODE_LABEL[mode]}.` });\n } catch (err) {\n // Only the guard itself can still throw here (e.g. a direct run with no token held).\n setDefaultNote({ ok: false, text: describeError(err) });\n } finally {\n setSavingDefault(false);\n }\n }\n\n // ---- context fit -------------------------------------------------------\n // What to size: the saved project by id (the server reads its roots), or\n // the ad-hoc folder set once it validates. Nothing is sized for a path that\n // is still being typed into something invalid.\n const fitRequest = useMemo((): { key: string; query: { workspaceId?: string; projectPath?: string; extraRoots?: string[] } } | null => {\n if (workspaceId !== null) return { key: `w:${workspaceId}`, query: { workspaceId } };\n if (usingWorkspace) return null;\n const validation = validateRootSet(projectPath, extraRoots);\n if (!validation.ok) return null;\n const [primary, ...rest] = validation.roots;\n return {\n key: `p:${validation.roots.join('\\n')}`,\n query: rest.length > 0 ? { projectPath: primary!, extraRoots: rest } : { projectPath: primary! },\n };\n }, [workspaceId, usingWorkspace, projectPath, extraRoots]);\n const fitRequestRef = useRef(fitRequest);\n fitRequestRef.current = fitRequest;\n const fitKey = fitRequest?.key ?? null;\n\n useEffect(() => {\n const request = fitRequestRef.current;\n if (!open || fitKey === null || request === null) {\n setFitState({ status: 'idle' });\n return undefined;\n }\n const cached = fitCache.current.get(fitKey);\n if (cached) {\n setFitState({ status: 'ready', key: fitKey, fit: cached });\n return undefined;\n }\n let cancelled = false;\n setFitState({ status: 'loading', key: fitKey });\n const timer = setTimeout(() => {\n fetchContextFit(request.query)\n .then((fit) => {\n fitCache.current.set(fitKey, fit);\n if (!cancelled) setFitState({ status: 'ready', key: fitKey, fit });\n })\n .catch((err: unknown) => {\n if (!cancelled) setFitState({ status: 'error', key: fitKey, message: describeError(err) });\n });\n }, FIT_DEBOUNCE_MS);\n return () => {\n cancelled = true;\n clearTimeout(timer);\n };\n }, [open, fitKey]);\n\n // The reading for the folders on screen NOW. Between a change and the\n // effect that re-reads, the held state belongs to the previous folders, so\n // it is shown as \"sizing\" rather than attributed to the new ones.\n const currentFit: FitState = fitKey === null\n ? { status: 'idle' }\n : fitState.status !== 'idle' && fitState.key === fitKey ? fitState : { status: 'loading', key: fitKey };\n const fit = currentFit.status === 'ready' ? currentFit.fit : null;\n\n // A seat whose CLI takes no additional-directory flag reaches only the\n // primary folder. Say that at the point the extra folders are chosen, rather\n // than letting the operator discover it from a diff that will not apply.\n // This holds for a SAVED project too — a project saved with three folders\n // still reaches one of them on a Grok seat, and the picker is the only place\n // that knows both facts at once.\n const adHocNote = extraRootsNote(chosenSeat?.engine ?? null, 1 + extraRoots.length);\n const workspaceCaveat = extraRootsCaveat(chosenSeat?.engine ?? null, chosenWorkspace?.roots.length ?? 0);\n\n /** The native chooser, where there is one. The text input never goes away. */\n const showPicker = nativePickerAvailable();\n async function choosePrimary() {\n const picked = await pickDirectory();\n if (picked !== null && picked.length > 0) {\n setProjectChoice(OTHER);\n setCustomPath(picked);\n }\n }\n async function chooseExtra(index: number) {\n const picked = await pickDirectory();\n if (picked !== null && picked.length > 0) {\n setExtraRoots(extraRoots.map((r, i) => (i === index ? picked : r)));\n }\n }\n\n /**\n * Keep the folder set that is on screen, so it is in this picker next time.\n *\n * Deliberately one press with no naming step: the folder's own name is very\n * nearly always the right one, and the project can be renamed from the\n * sidebar. A dialog inside a dialog to collect a name would cost more than\n * it is worth at the moment someone just wants to keep a folder.\n */\n async function saveProject() {\n const validation = validateRootSet(projectPath, extraRoots);\n if (!validation.ok) {\n setLocalError(validation.error);\n return;\n }\n setSavingProject(true);\n setLocalError(null);\n setSavedNote(null);\n try {\n const name = defaultWorkspaceName(validation.roots[0]!);\n const workspace = await createVerseWorkspace({ name, roots: validation.roots });\n setSaved((prev) => [...prev, workspace]);\n setProjectChoice(`${WORKSPACE_PREFIX}${workspace.id}`);\n setSavedNote(`Saved. “${workspace.name}” is in this list from now on.`);\n } catch (err) {\n setLocalError(err instanceof Error ? err.message : String(err));\n } finally {\n setSavingProject(false);\n }\n }\n\n function submit(event: FormEvent) {\n event.preventDefault();\n if (!seat) {\n setLocalError('Pick a seat first.');\n return;\n }\n if (chosenOption === null) {\n setLocalError('Pick a model this seat offers.');\n return;\n }\n if (modelReason !== null) {\n setLocalError(`${chosenOption.label} cannot run on this seat: ${modelReason}.`);\n return;\n }\n // Bound to a named workspace: the server reads the roots from the\n // registry, so no path is sent at all and the two cannot disagree.\n if (workspaceId !== null) {\n setLocalError(null);\n const req: VerseCreateSessionRequest = {\n // `projectPath` is filled in by the server from the workspace primary;\n // the field is required by the type, and the server rejects the pair.\n workspaceId,\n seatId: seat.seatId,\n model: seat.model,\n } as VerseCreateSessionRequest;\n delete (req as Partial<VerseCreateSessionRequest>).projectPath;\n const named = title.trim();\n if (named) req.title = named;\n const wsMode = requestContextMode(chosenOption, chatMode, preferredMode);\n if (wsMode !== null) req.contextMode = wsMode;\n void onCreate(req);\n return;\n }\n\n const validation = validateRootSet(projectPath, extraRoots);\n if (!validation.ok) {\n setLocalError(validation.error);\n return;\n }\n if (isolate && !isValidWorktreeName(worktree.name)) {\n setLocalError('Name the worktree with letters, digits, dots, dashes or underscores.');\n return;\n }\n setLocalError(null);\n const [primary, ...rest] = validation.roots;\n const req: VerseCreateSessionRequest = { projectPath: primary!, seatId: seat.seatId, model: seat.model };\n if (rest.length > 0) req.extraRoots = rest;\n const trimmed = title.trim();\n if (trimmed) req.title = trimmed;\n const mode = requestContextMode(chosenOption, chatMode, preferredMode);\n if (mode !== null) req.contextMode = mode;\n if (!isolate) {\n void onCreate(req);\n return;\n }\n void createIsolated(primary!, req);\n }\n\n /**\n * \"Isolate in a worktree\": create `~/.ashlr-worktrees/<repo>/<name>` on\n * `verse/<name>` FIRST (a git write — through the same token guard as every\n * other write this dialog makes), then start the chat in it. Only the\n * primary folder moves; extra folders stay where they are. A refusal (a\n * taken name, a folder that is not a repository, a repo with no commits)\n * is shown here and no chat is created.\n */\n async function createIsolated(primary: string, req: VerseCreateSessionRequest) {\n setIsolating(true);\n try {\n const outcome = await runMutation(`Creating the worktree ${worktree.name} (a new branch verse/${worktree.name}) for this chat.`,\n () => resolveChatFolder(primary, worktree).then(\n (folder): { ok: true; folder: string } | { ok: false; error: unknown } => ({ ok: true, folder }),\n (error: unknown): { ok: false; error: unknown } => ({ ok: false, error }),\n ));\n if (outcome === null) return; // the token prompt was dismissed: nothing was created\n if (!outcome.ok) {\n setLocalError(`The worktree could not be created: ${describeGitError(outcome.error)}`);\n return;\n }\n await onCreate({ ...req, projectPath: outcome.folder });\n } catch (err) {\n setLocalError(describeGitError(err));\n } finally {\n setIsolating(false);\n }\n }\n\n const message = localError ?? error ?? null;\n\n return (\n <Dialog open={open} onClose={onClose} titleId={titleId} title=\"New chat\" initialFocusRef={firstField} widthClassName={styles.width}>\n <form className={styles.form} onSubmit={submit} noValidate>\n <label className={styles.field} htmlFor={projectId}>\n <span className={styles.label}>Project</span>\n <select id={projectId} ref={firstField} value={projectChoice} onChange={(event) => setProjectChoice(event.target.value)} className={styles.select}>\n {/* The group exists only when there is something in it. An empty\n \"Saved projects\" heading is a promise the console cannot keep,\n and until this dialog could create one it was exactly that. */}\n {savedProjects.length > 0 ? (\n <optgroup label=\"Saved projects\">\n {savedProjects.map((w) => (\n <option key={w.id} value={`${WORKSPACE_PREFIX}${w.id}`}>\n {w.name} — {workspaceSummary(w)}\n </option>\n ))}\n </optgroup>\n ) : null}\n {sortedProjects.map((p) => (\n <option key={p.path} value={p.path}>{p.name}{p.enrolled ? '' : ' (recent)'} — {p.path}</option>\n ))}\n <option value={OTHER}>Other folder…</option>\n </select>\n </label>\n {projectChoice === OTHER && !usingWorkspace ? (\n <label className={styles.field} htmlFor={pathId}>\n <span className={styles.label}>Folder path</span>\n {/* The text input is unconditional: the console also runs in a\n plain browser, which has no directory chooser at all. The\n native button is an ADDITION where a shell can provide one. */}\n <div className={styles.rootRow}>\n <input id={pathId} className={styles.input} value={customPath} onChange={(event) => setCustomPath(event.target.value)}\n placeholder=\"/absolute/path/to/project\" autoComplete=\"off\" spellCheck={false} />\n {showPicker ? (\n <button type=\"button\" className={styles.addRoot} onClick={() => void choosePrimary()}>Choose folder…</button>\n ) : null}\n </div>\n </label>\n ) : null}\n {workspaceCaveat ? <p className={styles.hint}>{workspaceCaveat}</p> : null}\n {/* Extra folders, for the very common \"this service plus the shared\n library it depends on\". Hidden for a workspace, whose roots are\n defined once in the registry and must not be edited per chat —\n that is the difference between a workspace and an ad-hoc set. */}\n {usingWorkspace ? null : (\n <div className={styles.field}>\n <span className={styles.label}>\n Also include <span className={styles.optional}>optional</span>\n </span>\n {extraRoots.map((root, index) => (\n <div key={index} className={styles.rootRow}>\n <input\n className={styles.input}\n value={root}\n onChange={(event) => setExtraRoots(extraRoots.map((r, i) => (i === index ? event.target.value : r)))}\n placeholder=\"/absolute/path/to/another/folder\"\n aria-label={`Additional folder ${index + 1}`}\n autoComplete=\"off\"\n spellCheck={false}\n />\n {showPicker ? (\n <button\n type=\"button\"\n className={styles.removeRoot}\n onClick={() => void chooseExtra(index)}\n aria-label={`Choose additional folder ${index + 1}`}\n >Choose folder…</button>\n ) : null}\n <button\n type=\"button\"\n className={styles.removeRoot}\n onClick={() => setExtraRoots(extraRoots.filter((_, i) => i !== index))}\n aria-label={`Remove additional folder ${index + 1}`}\n >Remove</button>\n </div>\n ))}\n {extraRoots.length + 1 < MAX_WORKSPACE_ROOTS ? (\n <button type=\"button\" className={styles.addRoot} onClick={() => setExtraRoots([...extraRoots, ''])}>\n Add a folder\n </button>\n ) : null}\n {adHocNote ? <p className={styles.hint}>{adHocNote}</p> : null}\n {/* Keep this folder set. Nothing about a SAVED project can be\n edited per chat — that is the difference between a project and\n an ad-hoc set — so the offer appears only on the ad-hoc path. */}\n <div className={styles.rootRow}>\n <button type=\"button\" className={styles.addRoot} onClick={() => void saveProject()}\n disabled={savingProject || projectPath.length === 0}>\n {savingProject ? 'Saving…' : 'Save as a project'}\n </button>\n <span className={styles.hint}>Keeps these folders in the list above. No chat needed first.</span>\n </div>\n </div>\n )}\n {/* OUTSIDE the ad-hoc block on purpose: saving switches the picker to\n the project it just created, which unmounts that block — and the\n confirmation that the folder was kept is exactly what must not\n disappear at that moment. */}\n {savedNote ? <p role=\"status\" className={styles.hint}>{savedNote}</p> : null}\n\n {offersWorktree ? (\n <WorktreeOption repoName={folderName(projectPath)} value={worktree} onChange={setWorktree} disabled={isolating || busy} />\n ) : null}\n\n <SeatSelector id={seatId} seats={seats} value={seat} onChange={chooseSeat}\n workingSetTokens={fit?.totalEstTokens ?? null} modeFor={modeFor} />\n {/* THE shared capacity view (usage/CapacityStrip, SPEC-310C §4), for\n the chosen seat. Full density on purpose: the verbatim reset and\n any credit balance are what decide \"can I start this now\", and\n the compact row drops both. */}\n {chosenSeat === null ? null : (\n <div className={styles.capacity}>\n <LiveCapacityStrip seats={seats} seatIds={[chosenSeat.id]} local=\"each\" headline={false}\n title={`${chosenSeat.label} capacity`} />\n </div>\n )}\n {chosenSeat === null || chosenOption === null ? null : (\n <ContextChoice\n seat={chosenSeat}\n option={chosenOption}\n unavailableReason={modelReason}\n mode={chatMode}\n offersModes={offersModes}\n savedDefault={savedDefault}\n prefsLoaded={prefs !== null}\n prefsError={prefsError}\n onMode={(mode) => {\n setModeChoice(mode);\n setDefaultNote(null);\n }}\n savingDefault={savingDefault}\n defaultNote={defaultNote}\n onMakeDefault={() => void makeSeatDefault()}\n fitState={currentFit}\n />\n )}\n {seats.length === 0 ? <p className={styles.hint}>No seats yet — connect an account or start Ollama, then reload.</p> : null}\n <label className={styles.field} htmlFor={nameId}>\n <span className={styles.label}>Title <span className={styles.optional}>optional</span></span>\n <input id={nameId} className={styles.input} value={title} onChange={(event) => setTitle(event.target.value)}\n placeholder=\"Defaults to your first message\" maxLength={120} />\n </label>\n {message ? <p role=\"alert\" className={styles.error}>{message}</p> : null}\n <div className={styles.actions}>\n <button type=\"button\" className={styles.cancel} onClick={onClose}>Cancel</button>\n <button type=\"submit\" className={styles.create} disabled={!canCreate}>\n {isolating ? 'Creating worktree…' : busy ? 'Creating…' : 'Start chat'}\n </button>\n </div>\n </form>\n </Dialog>\n );\n}\n\n/** The last segment of a folder path — the repository name the worktree hint shows. */\nfunction folderName(path: string): string {\n const parts = path.replace(/[\\\\/]+$/, '').split(/[\\\\/]/);\n return parts[parts.length - 1] || path;\n}\n\n/**\n * A pre-fill resolved against the CURRENT roster: an aliased model id (a chat\n * remembered on `claude-opus-5.5`) becomes the seat's own spelling, so the\n * picker shows the choice instead of \"Choose a seat…\". Nothing else changes —\n * a remembered model the pinned CLI cannot run stays chosen, so its reason is\n * shown rather than the choice being silently swapped for another.\n */\nexport function normalizeChoice(choice: SeatChoice | null, seats: readonly VerseSeat[]): SeatChoice | null {\n if (choice === null) return null;\n const seat = seats.find((s) => s.id === choice.seatId);\n const option = seatModelOption(seat, choice.model);\n return option === null ? choice : { seatId: choice.seatId, model: option.id };\n}\n\ninterface ContextChoiceProps {\n seat: VerseSeat;\n option: VerseModelOption;\n unavailableReason: string | null;\n mode: VerseContextMode;\n offersModes: boolean;\n /** The seat's saved default, resolved for this model. */\n savedDefault: VerseContextMode;\n prefsLoaded: boolean;\n prefsError: string | null;\n onMode: (mode: VerseContextMode) => void;\n savingDefault: boolean;\n defaultNote: { ok: boolean; text: string } | null;\n onMakeDefault: () => void;\n fitState: FitState;\n}\n\n/**\n * The chosen model's context, under the picker: its budget and provenance,\n * the mode selector (only where a real second budget exists), the fit verdict\n * for the chosen folders, and the seat's pinned CLI and notes.\n */\nfunction ContextChoice({\n seat,\n option,\n unavailableReason,\n mode,\n offersModes,\n savedDefault,\n prefsLoaded,\n prefsError,\n onMode,\n savingDefault,\n defaultNote,\n onMakeDefault,\n fitState,\n}: ContextChoiceProps) {\n const labelId = useId();\n const budget = effectiveBudget(option, mode);\n const cli = seatCliLine(seat);\n const notes = seatContextNotes(seat);\n const verdict = fitState.status === 'ready' ? modelFit(fitState.fit.totalEstTokens, option, mode, seat.engine) : null;\n\n return (\n <div className={styles.context} role=\"group\" aria-labelledby={labelId}>\n <div className={styles.contextHead}>\n <span id={labelId} className={styles.label}>Context</span>\n <span className={styles.contextBudget}>\n {budget === null\n ? 'Window unknown'\n : `${formatTokens(budget.contextWindow)} window${budget.autoCompactAt === null ? '' : ` · compacts ≈${formatTokens(budget.autoCompactAt)}`}`}\n </span>\n </div>\n {budget !== null && option.windowSource ? (\n <p className={styles.hint}>Window {WINDOW_SOURCE_TEXT[option.windowSource]}.</p>\n ) : null}\n\n {unavailableReason !== null ? (\n <p className={styles.warn}>{option.label} cannot run on this seat: {unavailableReason}. Pick another model.</p>\n ) : null}\n\n {offersModes ? (\n <>\n <Segmented<VerseContextMode>\n aria-label=\"Context mode\"\n size=\"sm\"\n value={mode}\n onChange={onMode}\n options={(['standard', 'expansive'] as const).map((m) => {\n const b = budgetFor(option, m);\n return {\n value: m,\n label: b === null ? CONTEXT_MODE_LABEL[m] : `${CONTEXT_MODE_LABEL[m]} · ≈${formatTokens(b.autoCompactAt ?? b.contextWindow)}`,\n ariaLabel: CONTEXT_MODE_LABEL[m],\n };\n })}\n />\n <p className={styles.hint}>{contextModeDescription(seat.engine, option, mode)}</p>\n {prefsLoaded && mode !== savedDefault ? (\n <div className={styles.rootRow}>\n <button type=\"button\" className={styles.addRoot} onClick={onMakeDefault} disabled={savingDefault}>\n {savingDefault ? 'Saving…' : `Make ${CONTEXT_MODE_LABEL[mode]} the default for ${seat.label}`}\n </button>\n </div>\n ) : null}\n {defaultNote !== null ? (\n <p role={defaultNote.ok ? 'status' : 'alert'} className={defaultNote.ok ? styles.hint : styles.error}>{defaultNote.text}</p>\n ) : null}\n {prefsError !== null ? (\n <p className={styles.hint}>Saved defaults could not be read ({prefsError}); this chat starts in {CONTEXT_MODE_LABEL[mode]} unless you pick otherwise.</p>\n ) : null}\n </>\n ) : (\n <p className={styles.hint}>{noModeReason(seat.engine, option)}</p>\n )}\n\n <div className={styles.fit} aria-live=\"polite\">\n {fitState.status === 'idle' ? null\n : fitState.status === 'loading' ? <p className={styles.hint}>Sizing the chosen folders…</p>\n : fitState.status === 'error' ? <p className={styles.hint}>Could not size the chosen folders: {fitState.message}</p>\n : verdict === null ? (\n <p className={styles.hint}>\n ~{formatTokens(fitState.fit.totalEstTokens)} tokens of tracked code; this model&rsquo;s budget is unknown, so no fit is claimed.\n </p>\n ) : (\n <>\n <p className={styles.fitLine}>\n <span className={styles.fitBadge} data-fit={verdict}>{FIT_LABEL[verdict]}</span>\n <span>{fitExplanation({ verdict, tokens: fitState.fit.totalEstTokens, option, mode, floor: fitIsFloor(fitState.fit) })}</span>\n </p>\n <p className={styles.hint}>{fitMethodNote(seat.engine)}</p>\n </>\n )}\n </div>\n\n {cli === null && notes.length === 0 ? null : (\n <ul className={styles.seatFacts} aria-label={`${seat.label} facts`}>\n {cli === null ? null : <li>Runs {cli}.</li>}\n {notes.map((note) => <li key={note}>{note}</li>)}\n </ul>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"NewChatDialog-BlCHtOIr.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/git/WorktreeOption.module.css","../../../../../../src/web-ui/routes/verse/git/WorktreeOption.tsx","../../../../../../src/web-ui/routes/verse/NewChatDialog.module.css","../../../../../../src/web-ui/routes/verse/NewChatDialog.tsx"],"sourcesContent":[".option {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n margin: 0;\n padding: 0;\n border: 0;\n min-width: 0;\n}\n.option:disabled { opacity: 0.6; }\n\n.toggle {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n min-height: var(--control-h-sm);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n cursor: pointer;\n}\n.toggle input { width: 16px; height: 16px; accent-color: var(--accent-600); }\n\n.details {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding-left: calc(16px + var(--space-2));\n}\n.nameLabel { font-size: var(--text-sm-size); color: var(--text-secondary); }\n.name {\n flex: 1 1 auto;\n min-width: 0;\n min-height: var(--control-h-sm);\n padding: 0 var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n}\n.name:focus-visible { outline: none; border-color: var(--border-focus); box-shadow: var(--shadow-focus-ring); }\n.name[aria-invalid='true'] { border-color: var(--status-danger-solid); }\n\n.hint {\n margin: 0;\n padding-left: calc(16px + var(--space-2));\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n overflow-wrap: anywhere;\n}\n.hint code {\n font-family: var(--font-mono);\n color: var(--text-secondary);\n}\n","/**\n * routes/verse/git/WorktreeOption.tsx — \"Isolate in worktree\" for the New\n * chat dialog (unit C5; SPEC-310C §2 \"Worktrees\", P1).\n *\n * NewChatDialog is C2's; this is the piece it mounts (CROSS-UNIT request in\n * the C5 report): a checkbox, a name, and one sentence saying exactly what\n * will be created. On submit C2 calls `resolveChatFolder(root, value)` and\n * starts the chat in the folder it returns — the worktree when isolation is\n * on, the project itself when it is off.\n *\n * The name is a slug (the server enforces the same rule); a default is\n * offered so isolation is one click, not a naming exercise.\n */\nimport { useId } from 'react';\nimport { createGitWorktree } from './git-queries.js';\nimport styles from './WorktreeOption.module.css';\n\nexport interface WorktreeValue {\n enabled: boolean;\n name: string;\n}\n\n/** Same rule as core/verse/worktrees.ts WORKTREE_NAME_RE. */\nexport const WORKTREE_NAME_PATTERN = /^[a-z0-9][a-z0-9._-]{0,62}$/i;\n\nexport function isValidWorktreeName(name: string): boolean {\n return WORKTREE_NAME_PATTERN.test(name) && !name.endsWith('.lock') && !name.includes('..');\n}\n\n/** A readable default: `chat-0924-1432` (month, day, hour, minute). */\nexport function defaultWorktreeName(now: Date = new Date()): string {\n const pad = (n: number) => String(n).padStart(2, '0');\n return `chat-${pad(now.getMonth() + 1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}`;\n}\n\n/** Turn free typing into a valid slug as the operator types (\"Fix login!\" → \"fix-login\"). */\nexport function slugifyWorktreeName(raw: string): string {\n return raw\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/^[^a-z0-9]+/, '')\n .replace(/-{2,}/g, '-')\n .slice(0, 63);\n}\n\nexport interface WorktreeOptionProps {\n /** The project folder the chat would start in (its repository name is shown). */\n repoName: string;\n value: WorktreeValue;\n onChange: (next: WorktreeValue) => void;\n disabled?: boolean;\n}\n\nexport function WorktreeOption({ repoName, value, onChange, disabled = false }: WorktreeOptionProps) {\n const nameId = useId();\n const hintId = useId();\n const valid = isValidWorktreeName(value.name);\n return (\n <fieldset className={styles.option} disabled={disabled}>\n <label className={styles.toggle}>\n <input\n type=\"checkbox\"\n checked={value.enabled}\n onChange={(e) => onChange({ enabled: e.target.checked, name: value.name || defaultWorktreeName() })}\n aria-describedby={hintId}\n />\n Isolate in a worktree\n </label>\n {value.enabled ? (\n <div className={styles.details}>\n <label className={styles.nameLabel} htmlFor={nameId}>\n Name\n </label>\n <input\n id={nameId}\n className={styles.name}\n value={value.name}\n onChange={(e) => onChange({ ...value, name: slugifyWorktreeName(e.target.value) })}\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n aria-invalid={!valid || undefined}\n aria-describedby={hintId}\n maxLength={63}\n />\n </div>\n ) : null}\n <p id={hintId} className={styles.hint}>\n {value.enabled ? (\n valid ? (\n <>\n Creates <code>~/.ashlr-worktrees/{repoName}/{value.name}</code> on a new branch <code>verse/{value.name}</code>, from the current commit.\n Uncommitted changes stay in {repoName}.\n </>\n ) : (\n 'Use letters, digits, dots, dashes or underscores.'\n )\n ) : (\n 'The chat works on its own branch in its own folder, so your checkout is untouched.'\n )}\n </p>\n </fieldset>\n );\n}\n\n/**\n * The folder a new chat should start in: the new worktree when isolation is\n * on (created now, through the mutation token like every git write), the\n * project itself when it is off. Throws the server's refusal (a taken name, a\n * repository with no commits) for the dialog to show.\n */\nexport async function resolveChatFolder(root: string, value: WorktreeValue): Promise<string> {\n if (!value.enabled) return root;\n const created = await createGitWorktree(root, value.name);\n return created.path;\n}\n",".width { width: min(520px, calc(100vw - 32px)); }\n\n.form { display: grid; gap: var(--space-4); }\n.field { display: grid; gap: var(--space-1); min-width: 0; }\n.label {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n.optional { font-weight: var(--font-weight-regular); letter-spacing: 0; text-transform: none; opacity: 0.8; }\n\n.select,\n.input {\n width: 100%;\n min-height: var(--control-h);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n text-overflow: ellipsis;\n}\n.input::placeholder { color: var(--text-tertiary); }\n.select,\n.input {\n transition: border-color var(--duration-fast) var(--ease-standard), box-shadow var(--duration-fast) var(--ease-standard);\n}\n.select:hover:not(:disabled),\n.input:hover:not(:disabled) { border-color: var(--border-strong); }\n/* Same focus treatment as the Input/Select primitives: accent edge plus the\n system ring, so a field in this dialog and a field in Settings read\n identically — and both are actually visible (see Input.module.css). */\n.select:focus-visible,\n.input:focus-visible { border-color: var(--border-focus); box-shadow: var(--shadow-focus-ring); }\n\n.hint { font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-tertiary); }\n.error {\n padding-left: var(--space-3);\n border-left: 2px solid var(--status-danger-solid);\n color: var(--status-danger-fg);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n\n.actions { display: flex; justify-content: flex-end; gap: var(--space-2); }\n.cancel,\n.create {\n min-height: var(--control-h);\n padding: 0 var(--space-4);\n border: 1px solid transparent;\n border-radius: var(--radius-sm);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n transition: background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);\n}\n.cancel { color: var(--text-secondary); }\n.cancel:hover { background: var(--bg-hover); color: var(--text-primary); }\n.cancel:active { background: var(--bg-active); }\n.create { background: var(--accent-600); color: var(--accent-contrast); }\n.create:hover:not(:disabled) { background: var(--accent-700); }\n.create:active:not(:disabled) { background: var(--accent-700); }\n.create:disabled { opacity: 0.4; cursor: not-allowed; }\n\n/* The chosen seat's capacity, directly under the picker: this is where the\n choice is made, so the cost of making it belongs here and not one section\n away. Indented on the engine-neutral hairline the error state also uses, so\n it reads as commentary on the field above rather than a new field. */\n.capacity {\n padding-left: var(--space-3);\n border-left: 1px solid var(--border-default);\n}\n\n/* Extra workspace folders: one row per folder, with its own Remove. */\n.rootRow {\n display: flex;\n gap: var(--space-2);\n align-items: center;\n margin-top: var(--space-2);\n}\n\n.rootRow .input { flex: 1 1 auto; min-width: 0; }\n\n.removeRoot,\n.addRoot {\n flex: none;\n padding: var(--space-1) var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n background: var(--surface-raised);\n color: var(--text-default);\n font-size: var(--text-xs);\n cursor: pointer;\n}\n\n.addRoot { margin-top: var(--space-2); align-self: flex-start; }\n\n.removeRoot:hover,\n.addRoot:hover { border-color: var(--border-strong, var(--border-subtle)); }\n\n/* ---- V3.9 context --------------------------------------------------------\n The chosen model's context budget, mode, fit and seat facts. Hung off the\n same hairline as the capacity note above it: both are commentary on the\n seat field, not new fields of their own. */\n.context {\n display: grid;\n gap: var(--space-2);\n min-width: 0;\n padding-left: var(--space-3);\n border-left: 1px solid var(--border-default);\n}\n.contextHead {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-2);\n}\n.contextBudget {\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n font-variant-numeric: tabular-nums;\n color: var(--text-primary);\n}\n/* A model the pinned CLI cannot run: it blocks \"Start chat\", so it reads as a\n warning, in words — the disabled button alone would not say why. */\n.warn {\n padding-left: var(--space-3);\n border-left: 2px solid var(--status-warning-solid);\n color: var(--status-warning-fg);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n.fit { display: grid; gap: var(--space-1); min-width: 0; }\n.fitLine {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n/* The verdict is a WORD first; the tint only repeats it (DESIGN-V2 §6). */\n.fitBadge {\n flex: none;\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-full);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n font-weight: var(--font-weight-semibold);\n line-height: 18px;\n white-space: nowrap;\n color: var(--text-secondary);\n}\n.fitBadge[data-fit='fits'] { border-color: var(--status-success-solid); color: var(--status-success-fg); background: var(--status-success-bg); }\n.fitBadge[data-fit='tight'] { border-color: var(--status-warning-solid); color: var(--status-warning-fg); background: var(--status-warning-bg); }\n.fitBadge[data-fit='expansive'] { border-color: var(--status-info-solid); color: var(--status-info-fg); background: var(--status-info-bg); }\n.fitBadge[data-fit='split'] { border-color: var(--status-danger-solid); color: var(--status-danger-fg); background: var(--status-danger-bg); }\n/* The seat's own facts: its pinned CLI and any note it carries (binary skew,\n catalog not fetched yet). Same quiet treatment as the resources panel. */\n.seatFacts {\n list-style: none;\n margin: 0;\n padding: 0;\n display: grid;\n gap: var(--space-1);\n}\n.seatFacts li {\n font-size: var(--text-2xs-size, 11px);\n line-height: var(--text-2xs-line, 14px);\n color: var(--text-tertiary);\n overflow-wrap: anywhere;\n}\n","/**\n * routes/verse/NewChatDialog.tsx — start a chat: pick a project (saved\n * projects + enrolled repos + any project a previous chat used, or \"Other\n * folder…\" with an absolute path), pick a seat + model, optionally title it.\n * Built on the shared Dialog primitive so focus trap / Escape / return-focus\n * come free.\n *\n * A folder typed here can be KEPT: \"Save as a project\" writes it to the\n * workspace registry and it is in this picker from then on. Before that\n * button existed the only folders that came back were ones a chat had already\n * been created on (core/verse/projects.ts remembers those), so a folder\n * opened and not chatted on was gone by the next launch.\n *\n * The native directory chooser is offered ALONGSIDE the text input, never\n * instead of it — the same console runs in a plain browser, where there is no\n * chooser at all.\n *\n * The seat list is where the choice actually GETS MADE, so the picked seat's\n * capacity is shown here too, under the picker: plan, the binding window as a\n * meter, its reset verbatim, and any credit balance — the same projection the\n * resources panel renders, so the two can never describe one seat differently.\n *\n * Opening the dialog also re-reads the roster. `bootstrap` has no SSE\n * invalidation and the account collector needs ~75s to warm, so a dialog\n * opened early in a session would otherwise show the cold, empty reading\n * taken at mount and present it as the state of the world.\n *\n * V3.9 — THE CONTEXT A CHAT WILL HAVE IS DECIDED HERE TOO (docs/VERSE-CONTEXT.md):\n *\n * - CONTEXT MODE. For a model with a real expansive budget (1M Claude\n * models, GPT-6 / GPT-5.6 on Codex) the operator picks Standard or\n * Expansive, defaulting to the seat's saved preference, and can make the\n * choice that seat's default. The mode is sent explicitly whenever there\n * was a choice, so the chat is created in exactly the mode on screen — even\n * if the preference changed underneath the open dialog.\n * - CONTEXT FIT. The chosen folders (or saved project) are sized by\n * GET /context-fit — git ls-files, bytes ÷ 4, zero spend — and every model\n * row says whether that code would fit, with the chosen model's verdict\n * explained in words (\"split\" says how: fan out, or narrow the folders).\n * Suggests, never switches: nothing here changes the mode on its own.\n * - SEAT FACTS. The chosen seat's pinned CLI version and its own notes\n * (binary skew, catalog not fetched yet) are shown in visible text; a\n * model the pinned CLI cannot run is refused here, with the reason, rather\n * than at turn time.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type FormEvent } from 'react';\nimport type { VerseCreateSessionRequest, VerseModelOption, VerseProject, VerseSeat, VerseWorkspace } from '../../data/api-types.js';\nimport type { VerseContextFit, VerseContextMode, VersePreferences } from '../../../core/verse/types.js';\nimport { budgetFor, hasExpansiveMode } from '../../../core/verse/context-math.js';\nimport { Dialog } from '../../components/primitives/Dialog.js';\nimport { Segmented } from '../../components/primitives/Segmented.js';\nimport { ApiError } from '../../data/client.js';\nimport { useRefetch } from '../../data/hooks.js';\nimport { fetchContextFit, fetchPreferences, updatePreferences } from './context/context-queries.js';\nimport { defaultWorktreeName, isValidWorktreeName, resolveChatFolder, WorktreeOption, type WorktreeValue } from './git/WorktreeOption.js';\nimport { describeGitError } from './git/git-model.js';\nimport { defaultSeatChoice, SeatSelector, type SeatChoice } from './SeatSelector.js';\nimport { LiveCapacityStrip } from './usage/CapacityStrip.js';\nimport {\n CONTEXT_MODE_LABEL,\n FIT_LABEL,\n fitMethodNote,\n contextModeDescription,\n effectiveBudget,\n fitExplanation,\n fitIsFloor,\n modelFit,\n modelUnavailableReason,\n noModeReason,\n resolveContextMode,\n seatCliLine,\n seatContextNotes,\n seatModelOption,\n} from './usage/context-model.js';\nimport { WINDOW_SOURCE_TEXT } from './verse-model.js';\nimport {\n defaultWorkspaceName,\n extraRootsCaveat,\n extraRootsNote,\n MAX_WORKSPACE_ROOTS,\n validateRootSet,\n workspaceSummary,\n} from './workspace-model.js';\nimport { createVerseWorkspace, verseBootstrapQuery, VerseMutationLockedError } from './verse-queries.js';\nimport { formatTokens } from './verse-readouts.js';\nimport { nativePickerAvailable, pickDirectory } from './folder-picker.js';\nimport styles from './NewChatDialog.module.css';\n\n/**\n * Prefix marking a select value as a WORKSPACE id rather than a folder path.\n * Safe for the same reason `OTHER` is: it starts with a NUL, and a filesystem\n * path can never contain one.\n */\nconst WORKSPACE_PREFIX = '\\0workspace:';\n\nconst OTHER = '\u0000other';\n\n/**\n * How long a typed path must sit still before it is sized. Sizing is cheap\n * and cached server-side (60 s), but a request per keystroke would still\n * spawn `git ls-files` for every prefix of a path being typed.\n */\nexport const FIT_DEBOUNCE_MS = 350;\n\n/**\n * Runs a write that needs the mutation token. ChatSection passes its own guard\n * (which opens the token dialog and resumes); resolving `null` means the\n * operator dismissed that dialog and nothing was written.\n */\nexport type RunMutation = <T>(reason: string, action: () => Promise<T>) => Promise<T | null>;\n\nconst runDirectly: RunMutation = (_reason, action) => action();\n\n/** How a \"make this the default\" write ended — carried as a value so no guard can swallow a failure. */\ntype DefaultSave = { ok: true; prefs: VersePreferences } | { ok: false; error: unknown };\n\ntype FitState =\n | { status: 'idle' }\n | { status: 'loading'; key: string }\n | { status: 'ready'; key: string; fit: VerseContextFit }\n | { status: 'error'; key: string; message: string };\n\n/** The seat's saved default mode for new chats; `standard` when none, or when preferences are unread. */\nexport function seatPreferredMode(prefs: VersePreferences | null, seatId: string): VerseContextMode {\n return prefs?.seats[seatId]?.contextMode ?? 'standard';\n}\n\n/**\n * Whether the create request carries `contextMode`, and which.\n *\n * Sent whenever the operator HAD a choice (the model has an expansive budget),\n * so the chat starts in exactly the mode on screen. Also sent — as `standard` —\n * when the seat's saved default is a mode this model does not have, so the\n * server's default resolution can never reject a model the operator was\n * allowed to pick. Otherwise omitted: the server's own default is the only\n * possible answer, and a model with no known window has no budget to name.\n */\nexport function requestContextMode(option: VerseModelOption | null, mode: VerseContextMode, preferred: VerseContextMode): VerseContextMode | null {\n if (!option) return null;\n if (hasExpansiveMode(option)) return resolveContextMode(option, mode);\n if (preferred !== 'standard' && budgetFor(option, 'standard') !== null) return 'standard';\n return null;\n}\n\n/** The operator-facing sentence for a failed read or write: the server's own words first. */\nfunction describeError(err: unknown): string {\n if (err instanceof VerseMutationLockedError) return 'Unlock actions with the mutation token to save a default.';\n if (err instanceof ApiError) return err.detail ?? err.message;\n return err instanceof Error ? err.message : String(err);\n}\n\nexport interface NewChatDialogProps {\n open: boolean;\n onClose: () => void;\n projects: readonly VerseProject[];\n seats: readonly VerseSeat[];\n /** Named multi-folder workspaces. Absent on an older server. */\n workspaces?: readonly VerseWorkspace[];\n /** Pre-fill (e.g. \"same project, different seat\" from the composer). */\n initialProjectPath?: string | null;\n initialSeat?: SeatChoice | null;\n busy?: boolean;\n error?: string | null;\n onCreate: (req: VerseCreateSessionRequest) => Promise<void> | void;\n /** Guard for the one write this dialog makes itself (a seat's default mode). */\n runMutation?: RunMutation;\n}\n\nexport function NewChatDialog({ open, onClose, projects, seats, workspaces = [], initialProjectPath, initialSeat, busy = false, error, onCreate, runMutation = runDirectly }: NewChatDialogProps) {\n const titleId = useId();\n const projectId = useId();\n const pathId = useId();\n const nameId = useId();\n const seatId = useId();\n const firstField = useRef<HTMLSelectElement>(null);\n const [projectChoice, setProjectChoice] = useState<string>('');\n const [customPath, setCustomPath] = useState('');\n const [seat, setSeat] = useState<SeatChoice | null>(null);\n const [title, setTitle] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n /** Ad-hoc folders beyond the primary, when not binding to a workspace. */\n const [extraRoots, setExtraRoots] = useState<string[]>([]);\n /**\n * Projects saved from THIS dialog, held locally as well as sent.\n *\n * `workspaces` is refreshed by the cache invalidation the mutation triggers,\n * but that is a round trip. Keeping the created record here means the option\n * the operator just saved is in the picker on the very next paint — the\n * whole promise of the button is that the folder is now kept, so a second of\n * \"did that work?\" would undo it.\n */\n const [saved, setSaved] = useState<VerseWorkspace[]>([]);\n const [savingProject, setSavingProject] = useState(false);\n const [savedNote, setSavedNote] = useState<string | null>(null);\n /** The operator's standing choices; null until read (or when the read failed — then every seat defaults to Standard). */\n const [prefs, setPrefs] = useState<VersePreferences | null>(null);\n const [prefsError, setPrefsError] = useState<string | null>(null);\n /** An explicit mode pick for the chosen model; null = follow the seat's saved default. */\n const [modeChoice, setModeChoice] = useState<VerseContextMode | null>(null);\n const [savingDefault, setSavingDefault] = useState(false);\n const [defaultNote, setDefaultNote] = useState<{ ok: boolean; text: string } | null>(null);\n const [fitState, setFitState] = useState<FitState>({ status: 'idle' });\n /** \"Isolate in a worktree\" (C5): off by default; a name is offered once it is turned on. */\n const [worktree, setWorktree] = useState<WorktreeValue>({ enabled: false, name: '' });\n /** True while the worktree is being created, before the chat is. */\n const [isolating, setIsolating] = useState(false);\n /** Readings taken while this dialog is open, so flipping between folders does not re-ask. */\n const fitCache = useRef(new Map<string, VerseContextFit>());\n\n const sortedProjects = useMemo(() => [...projects].sort((a, b) => Number(b.enrolled) - Number(a.enrolled) || a.name.localeCompare(b.name)), [projects]);\n\n // Reset to the caller's pre-fill ONLY on the open transition. The pre-fill\n // inputs are read through a ref: `projects`/`seats` are fresh arrays on\n // every bootstrap refetch (which any turn finishing elsewhere triggers),\n // and re-running the reset on those would wipe a half-typed path or title.\n const prefill = useRef({ initialProjectPath, initialSeat, projects, seats, sortedProjects });\n prefill.current = { initialProjectPath, initialSeat, projects, seats, sortedProjects };\n useEffect(() => {\n if (!open) return;\n const { initialProjectPath: path, initialSeat: seatChoice, projects: known, seats: available, sortedProjects: sorted } = prefill.current;\n const knownPath = path && known.some((p) => p.path === path) ? path : null;\n setProjectChoice(knownPath ?? (path ? OTHER : sorted[0]?.path ?? OTHER));\n setCustomPath(knownPath ? '' : path ?? '');\n setSeat(normalizeChoice(seatChoice ?? null, available) ?? defaultSeatChoice(available));\n setTitle('');\n setLocalError(null);\n setExtraRoots([]);\n setSavedNote(null);\n setSavingProject(false);\n setSaved([]);\n setModeChoice(null);\n setDefaultNote(null);\n setSavingDefault(false);\n setWorktree({ enabled: false, name: defaultWorktreeName() });\n setIsolating(false);\n fitCache.current = new Map();\n }, [open]);\n\n // Preferences are re-read on every open: a default saved from another tab\n // (or by the CLI) must be what this dialog starts from.\n useEffect(() => {\n if (!open) return undefined;\n let cancelled = false;\n setPrefsError(null);\n fetchPreferences()\n .then((next) => {\n if (!cancelled) setPrefs(next);\n })\n .catch((err: unknown) => {\n if (cancelled) return;\n setPrefs(null);\n setPrefsError(describeError(err));\n });\n return () => {\n cancelled = true;\n };\n }, [open]);\n\n // Seats that arrive after the dialog opened (slow bootstrap) fill an empty\n // seat once, without touching anything the operator has typed.\n useEffect(() => {\n if (!open || seat !== null || seats.length === 0) return;\n setSeat(normalizeChoice(initialSeat ?? null, seats) ?? defaultSeatChoice(seats));\n }, [open, seat, seats, initialSeat]);\n\n // One re-read per open, not per render: the roster is worth a fresh look at\n // the moment a seat is about to be chosen, and worth nothing after that.\n const refetchBootstrap = useRefetch(verseBootstrapQuery);\n useEffect(() => {\n if (open) refetchBootstrap();\n }, [open, refetchBootstrap]);\n\n // The picker's saved-project list: what the server has, plus anything saved\n // in this dialog that the refreshed list has not caught up with yet.\n const savedProjects = useMemo(() => {\n const byId = new Map<string, VerseWorkspace>();\n for (const w of workspaces) byId.set(w.id, w);\n for (const w of saved) if (!byId.has(w.id)) byId.set(w.id, w);\n return [...byId.values()];\n }, [workspaces, saved]);\n\n const usingWorkspace = projectChoice.startsWith(WORKSPACE_PREFIX);\n const workspaceId = usingWorkspace ? projectChoice.slice(WORKSPACE_PREFIX.length) : null;\n const projectPath = usingWorkspace ? '' : projectChoice === OTHER ? customPath.trim() : projectChoice;\n const chosenSeat = seat === null ? null : seats.find((s) => s.id === seat.seatId) ?? null;\n const chosenOption = chosenSeat === null || seat === null ? null : seatModelOption(chosenSeat, seat.model);\n const disabledSeat = chosenSeat?.health.state === 'unavailable';\n // A model the pinned CLI cannot run is refused HERE, with its reason, not at\n // turn time — and a model the seat no longer lists is not a choice at all.\n const modelReason = chosenSeat !== null && chosenOption !== null ? modelUnavailableReason(chosenSeat, chosenOption) : null;\n // Isolation applies to an ad-hoc folder only: a saved project's roots are\n // fixed in the registry (the same reason extra folders are hidden for one).\n const offersWorktree = !usingWorkspace && projectPath.length > 0;\n const isolate = offersWorktree && worktree.enabled;\n const canCreate = !busy && !isolating && (usingWorkspace || projectPath.length > 0) && seat !== null && !disabledSeat\n && chosenOption !== null && modelReason === null && (!isolate || isValidWorktreeName(worktree.name));\n const chosenWorkspace = workspaceId === null ? null : savedProjects.find((w) => w.id === workspaceId) ?? null;\n\n // ---- context mode ------------------------------------------------------\n const preferredMode = seat === null ? 'standard' : seatPreferredMode(prefs, seat.seatId);\n const chatMode = resolveContextMode(chosenOption, modeChoice ?? preferredMode);\n const offersModes = hasExpansiveMode(chosenOption);\n const savedDefault = resolveContextMode(chosenOption, preferredMode);\n\n /** Every OTHER row shows its seat's default mode; the chosen row shows the mode picked for it. */\n const modeFor = useCallback((rowSeat: VerseSeat, model: VerseModelOption): VerseContextMode => {\n if (seat !== null && rowSeat.id === seat.seatId && model.id === seat.model) return chatMode;\n return resolveContextMode(model, seatPreferredMode(prefs, rowSeat.id));\n }, [seat, chatMode, prefs]);\n\n function chooseSeat(choice: SeatChoice) {\n setSeat(choice);\n // A mode picked for one model says nothing about another: follow the new\n // seat's saved default until the operator picks again.\n setModeChoice(null);\n setDefaultNote(null);\n }\n\n async function makeSeatDefault() {\n if (seat === null || chosenSeat === null) return;\n const mode = chatMode;\n setSavingDefault(true);\n setDefaultNote(null);\n try {\n // The action SETTLES as a value, never as a rejection. A guard that parks\n // the action behind the token prompt and runs it after the unlock may not\n // forward a rejection (ChatSection's `withToken` resolves only), and then\n // this function's catch/finally would never run: the button would sit on\n // \"Saving…\" for the rest of the dialog with no error shown. Catching\n // here makes both outcomes reach the code below whichever guard runs it.\n const outcome = await runMutation(`Saving ${CONTEXT_MODE_LABEL[mode]} as the default context mode for ${chosenSeat.label}.`,\n () => updatePreferences({ seatId: seat.seatId, contextMode: mode }).then(\n (saved): DefaultSave => ({ ok: true, prefs: saved }),\n (error: unknown): DefaultSave => ({ ok: false, error }),\n ));\n if (outcome === null) return; // the operator closed the token prompt: nothing was sent\n if (!outcome.ok) {\n setDefaultNote({ ok: false, text: describeError(outcome.error) });\n return;\n }\n setPrefs(outcome.prefs);\n setModeChoice(null);\n setDefaultNote({ ok: true, text: `New chats on ${chosenSeat.label} now start in ${CONTEXT_MODE_LABEL[mode]}.` });\n } catch (err) {\n // Only the guard itself can still throw here (e.g. a direct run with no token held).\n setDefaultNote({ ok: false, text: describeError(err) });\n } finally {\n setSavingDefault(false);\n }\n }\n\n // ---- context fit -------------------------------------------------------\n // What to size: the saved project by id (the server reads its roots), or\n // the ad-hoc folder set once it validates. Nothing is sized for a path that\n // is still being typed into something invalid.\n const fitRequest = useMemo((): { key: string; query: { workspaceId?: string; projectPath?: string; extraRoots?: string[] } } | null => {\n if (workspaceId !== null) return { key: `w:${workspaceId}`, query: { workspaceId } };\n if (usingWorkspace) return null;\n const validation = validateRootSet(projectPath, extraRoots);\n if (!validation.ok) return null;\n const [primary, ...rest] = validation.roots;\n return {\n key: `p:${validation.roots.join('\\n')}`,\n query: rest.length > 0 ? { projectPath: primary!, extraRoots: rest } : { projectPath: primary! },\n };\n }, [workspaceId, usingWorkspace, projectPath, extraRoots]);\n const fitRequestRef = useRef(fitRequest);\n fitRequestRef.current = fitRequest;\n const fitKey = fitRequest?.key ?? null;\n\n useEffect(() => {\n const request = fitRequestRef.current;\n if (!open || fitKey === null || request === null) {\n setFitState({ status: 'idle' });\n return undefined;\n }\n const cached = fitCache.current.get(fitKey);\n if (cached) {\n setFitState({ status: 'ready', key: fitKey, fit: cached });\n return undefined;\n }\n let cancelled = false;\n setFitState({ status: 'loading', key: fitKey });\n const timer = setTimeout(() => {\n fetchContextFit(request.query)\n .then((fit) => {\n fitCache.current.set(fitKey, fit);\n if (!cancelled) setFitState({ status: 'ready', key: fitKey, fit });\n })\n .catch((err: unknown) => {\n if (!cancelled) setFitState({ status: 'error', key: fitKey, message: describeError(err) });\n });\n }, FIT_DEBOUNCE_MS);\n return () => {\n cancelled = true;\n clearTimeout(timer);\n };\n }, [open, fitKey]);\n\n // The reading for the folders on screen NOW. Between a change and the\n // effect that re-reads, the held state belongs to the previous folders, so\n // it is shown as \"sizing\" rather than attributed to the new ones.\n const currentFit: FitState = fitKey === null\n ? { status: 'idle' }\n : fitState.status !== 'idle' && fitState.key === fitKey ? fitState : { status: 'loading', key: fitKey };\n const fit = currentFit.status === 'ready' ? currentFit.fit : null;\n\n // A seat whose CLI takes no additional-directory flag reaches only the\n // primary folder. Say that at the point the extra folders are chosen, rather\n // than letting the operator discover it from a diff that will not apply.\n // This holds for a SAVED project too — a project saved with three folders\n // still reaches one of them on a Grok seat, and the picker is the only place\n // that knows both facts at once.\n const adHocNote = extraRootsNote(chosenSeat?.engine ?? null, 1 + extraRoots.length);\n const workspaceCaveat = extraRootsCaveat(chosenSeat?.engine ?? null, chosenWorkspace?.roots.length ?? 0);\n\n /** The native chooser, where there is one. The text input never goes away. */\n const showPicker = nativePickerAvailable();\n async function choosePrimary() {\n const picked = await pickDirectory();\n if (picked !== null && picked.length > 0) {\n setProjectChoice(OTHER);\n setCustomPath(picked);\n }\n }\n async function chooseExtra(index: number) {\n const picked = await pickDirectory();\n if (picked !== null && picked.length > 0) {\n setExtraRoots(extraRoots.map((r, i) => (i === index ? picked : r)));\n }\n }\n\n /**\n * Keep the folder set that is on screen, so it is in this picker next time.\n *\n * Deliberately one press with no naming step: the folder's own name is very\n * nearly always the right one, and the project can be renamed from the\n * sidebar. A dialog inside a dialog to collect a name would cost more than\n * it is worth at the moment someone just wants to keep a folder.\n */\n async function saveProject() {\n const validation = validateRootSet(projectPath, extraRoots);\n if (!validation.ok) {\n setLocalError(validation.error);\n return;\n }\n setSavingProject(true);\n setLocalError(null);\n setSavedNote(null);\n try {\n const name = defaultWorkspaceName(validation.roots[0]!);\n const workspace = await createVerseWorkspace({ name, roots: validation.roots });\n setSaved((prev) => [...prev, workspace]);\n setProjectChoice(`${WORKSPACE_PREFIX}${workspace.id}`);\n setSavedNote(`Saved. “${workspace.name}” is in this list from now on.`);\n } catch (err) {\n setLocalError(err instanceof Error ? err.message : String(err));\n } finally {\n setSavingProject(false);\n }\n }\n\n function submit(event: FormEvent) {\n event.preventDefault();\n if (!seat) {\n setLocalError('Pick a seat first.');\n return;\n }\n if (chosenOption === null) {\n setLocalError('Pick a model this seat offers.');\n return;\n }\n if (modelReason !== null) {\n setLocalError(`${chosenOption.label} cannot run on this seat: ${modelReason}.`);\n return;\n }\n // Bound to a named workspace: the server reads the roots from the\n // registry, so no path is sent at all and the two cannot disagree.\n if (workspaceId !== null) {\n setLocalError(null);\n const req: VerseCreateSessionRequest = {\n // `projectPath` is filled in by the server from the workspace primary;\n // the field is required by the type, and the server rejects the pair.\n workspaceId,\n seatId: seat.seatId,\n model: seat.model,\n } as VerseCreateSessionRequest;\n delete (req as Partial<VerseCreateSessionRequest>).projectPath;\n const named = title.trim();\n if (named) req.title = named;\n const wsMode = requestContextMode(chosenOption, chatMode, preferredMode);\n if (wsMode !== null) req.contextMode = wsMode;\n void onCreate(req);\n return;\n }\n\n const validation = validateRootSet(projectPath, extraRoots);\n if (!validation.ok) {\n setLocalError(validation.error);\n return;\n }\n if (isolate && !isValidWorktreeName(worktree.name)) {\n setLocalError('Name the worktree with letters, digits, dots, dashes or underscores.');\n return;\n }\n setLocalError(null);\n const [primary, ...rest] = validation.roots;\n const req: VerseCreateSessionRequest = { projectPath: primary!, seatId: seat.seatId, model: seat.model };\n if (rest.length > 0) req.extraRoots = rest;\n const trimmed = title.trim();\n if (trimmed) req.title = trimmed;\n const mode = requestContextMode(chosenOption, chatMode, preferredMode);\n if (mode !== null) req.contextMode = mode;\n if (!isolate) {\n void onCreate(req);\n return;\n }\n void createIsolated(primary!, req);\n }\n\n /**\n * \"Isolate in a worktree\": create `~/.ashlr-worktrees/<repo>/<name>` on\n * `verse/<name>` FIRST (a git write — through the same token guard as every\n * other write this dialog makes), then start the chat in it. Only the\n * primary folder moves; extra folders stay where they are. A refusal (a\n * taken name, a folder that is not a repository, a repo with no commits)\n * is shown here and no chat is created.\n */\n async function createIsolated(primary: string, req: VerseCreateSessionRequest) {\n setIsolating(true);\n try {\n const outcome = await runMutation(`Creating the worktree ${worktree.name} (a new branch verse/${worktree.name}) for this chat.`,\n () => resolveChatFolder(primary, worktree).then(\n (folder): { ok: true; folder: string } | { ok: false; error: unknown } => ({ ok: true, folder }),\n (error: unknown): { ok: false; error: unknown } => ({ ok: false, error }),\n ));\n if (outcome === null) return; // the token prompt was dismissed: nothing was created\n if (!outcome.ok) {\n setLocalError(`The worktree could not be created: ${describeGitError(outcome.error)}`);\n return;\n }\n await onCreate({ ...req, projectPath: outcome.folder });\n } catch (err) {\n setLocalError(describeGitError(err));\n } finally {\n setIsolating(false);\n }\n }\n\n const message = localError ?? error ?? null;\n\n return (\n <Dialog open={open} onClose={onClose} titleId={titleId} title=\"New chat\" initialFocusRef={firstField} widthClassName={styles.width}>\n <form className={styles.form} onSubmit={submit} noValidate>\n <label className={styles.field} htmlFor={projectId}>\n <span className={styles.label}>Project</span>\n <select id={projectId} ref={firstField} value={projectChoice} onChange={(event) => setProjectChoice(event.target.value)} className={styles.select}>\n {/* The group exists only when there is something in it. An empty\n \"Saved projects\" heading is a promise the console cannot keep,\n and until this dialog could create one it was exactly that. */}\n {savedProjects.length > 0 ? (\n <optgroup label=\"Saved projects\">\n {savedProjects.map((w) => (\n <option key={w.id} value={`${WORKSPACE_PREFIX}${w.id}`}>\n {w.name} — {workspaceSummary(w)}\n </option>\n ))}\n </optgroup>\n ) : null}\n {sortedProjects.map((p) => (\n <option key={p.path} value={p.path}>{p.name}{p.enrolled ? '' : ' (recent)'} — {p.path}</option>\n ))}\n <option value={OTHER}>Other folder…</option>\n </select>\n </label>\n {projectChoice === OTHER && !usingWorkspace ? (\n <label className={styles.field} htmlFor={pathId}>\n <span className={styles.label}>Folder path</span>\n {/* The text input is unconditional: the console also runs in a\n plain browser, which has no directory chooser at all. The\n native button is an ADDITION where a shell can provide one. */}\n <div className={styles.rootRow}>\n <input id={pathId} className={styles.input} value={customPath} onChange={(event) => setCustomPath(event.target.value)}\n placeholder=\"/absolute/path/to/project\" autoComplete=\"off\" spellCheck={false} />\n {showPicker ? (\n <button type=\"button\" className={styles.addRoot} onClick={() => void choosePrimary()}>Choose folder…</button>\n ) : null}\n </div>\n </label>\n ) : null}\n {workspaceCaveat ? <p className={styles.hint}>{workspaceCaveat}</p> : null}\n {/* Extra folders, for the very common \"this service plus the shared\n library it depends on\". Hidden for a workspace, whose roots are\n defined once in the registry and must not be edited per chat —\n that is the difference between a workspace and an ad-hoc set. */}\n {usingWorkspace ? null : (\n <div className={styles.field}>\n <span className={styles.label}>\n Also include <span className={styles.optional}>optional</span>\n </span>\n {extraRoots.map((root, index) => (\n <div key={index} className={styles.rootRow}>\n <input\n className={styles.input}\n value={root}\n onChange={(event) => setExtraRoots(extraRoots.map((r, i) => (i === index ? event.target.value : r)))}\n placeholder=\"/absolute/path/to/another/folder\"\n aria-label={`Additional folder ${index + 1}`}\n autoComplete=\"off\"\n spellCheck={false}\n />\n {showPicker ? (\n <button\n type=\"button\"\n className={styles.removeRoot}\n onClick={() => void chooseExtra(index)}\n aria-label={`Choose additional folder ${index + 1}`}\n >Choose folder…</button>\n ) : null}\n <button\n type=\"button\"\n className={styles.removeRoot}\n onClick={() => setExtraRoots(extraRoots.filter((_, i) => i !== index))}\n aria-label={`Remove additional folder ${index + 1}`}\n >Remove</button>\n </div>\n ))}\n {extraRoots.length + 1 < MAX_WORKSPACE_ROOTS ? (\n <button type=\"button\" className={styles.addRoot} onClick={() => setExtraRoots([...extraRoots, ''])}>\n Add a folder\n </button>\n ) : null}\n {adHocNote ? <p className={styles.hint}>{adHocNote}</p> : null}\n {/* Keep this folder set. Nothing about a SAVED project can be\n edited per chat — that is the difference between a project and\n an ad-hoc set — so the offer appears only on the ad-hoc path. */}\n <div className={styles.rootRow}>\n <button type=\"button\" className={styles.addRoot} onClick={() => void saveProject()}\n disabled={savingProject || projectPath.length === 0}>\n {savingProject ? 'Saving…' : 'Save as a project'}\n </button>\n <span className={styles.hint}>Keeps these folders in the list above. No chat needed first.</span>\n </div>\n </div>\n )}\n {/* OUTSIDE the ad-hoc block on purpose: saving switches the picker to\n the project it just created, which unmounts that block — and the\n confirmation that the folder was kept is exactly what must not\n disappear at that moment. */}\n {savedNote ? <p role=\"status\" className={styles.hint}>{savedNote}</p> : null}\n\n {offersWorktree ? (\n <WorktreeOption repoName={folderName(projectPath)} value={worktree} onChange={setWorktree} disabled={isolating || busy} />\n ) : null}\n\n <SeatSelector id={seatId} seats={seats} value={seat} onChange={chooseSeat}\n workingSetTokens={fit?.totalEstTokens ?? null} modeFor={modeFor} />\n {/* THE shared capacity view (usage/CapacityStrip, SPEC-310C §4), for\n the chosen seat. Full density on purpose: the verbatim reset and\n any credit balance are what decide \"can I start this now\", and\n the compact row drops both. */}\n {chosenSeat === null ? null : (\n <div className={styles.capacity}>\n <LiveCapacityStrip seats={seats} seatIds={[chosenSeat.id]} local=\"each\" headline={false}\n title={`${chosenSeat.label} capacity`} />\n </div>\n )}\n {chosenSeat === null || chosenOption === null ? null : (\n <ContextChoice\n seat={chosenSeat}\n option={chosenOption}\n unavailableReason={modelReason}\n mode={chatMode}\n offersModes={offersModes}\n savedDefault={savedDefault}\n prefsLoaded={prefs !== null}\n prefsError={prefsError}\n onMode={(mode) => {\n setModeChoice(mode);\n setDefaultNote(null);\n }}\n savingDefault={savingDefault}\n defaultNote={defaultNote}\n onMakeDefault={() => void makeSeatDefault()}\n fitState={currentFit}\n />\n )}\n {seats.length === 0 ? <p className={styles.hint}>No seats yet — connect an account or start Ollama, then reload.</p> : null}\n <label className={styles.field} htmlFor={nameId}>\n <span className={styles.label}>Title <span className={styles.optional}>optional</span></span>\n <input id={nameId} className={styles.input} value={title} onChange={(event) => setTitle(event.target.value)}\n placeholder=\"Defaults to your first message\" maxLength={120} />\n </label>\n {message ? <p role=\"alert\" className={styles.error}>{message}</p> : null}\n <div className={styles.actions}>\n <button type=\"button\" className={styles.cancel} onClick={onClose}>Cancel</button>\n <button type=\"submit\" className={styles.create} disabled={!canCreate}>\n {isolating ? 'Creating worktree…' : busy ? 'Creating…' : 'Start chat'}\n </button>\n </div>\n </form>\n </Dialog>\n );\n}\n\n/** The last segment of a folder path — the repository name the worktree hint shows. */\nfunction folderName(path: string): string {\n const parts = path.replace(/[\\\\/]+$/, '').split(/[\\\\/]/);\n return parts[parts.length - 1] || path;\n}\n\n/**\n * A pre-fill resolved against the CURRENT roster: an aliased model id (a chat\n * remembered on `claude-opus-5.5`) becomes the seat's own spelling, so the\n * picker shows the choice instead of \"Choose a seat…\". Nothing else changes —\n * a remembered model the pinned CLI cannot run stays chosen, so its reason is\n * shown rather than the choice being silently swapped for another.\n */\nexport function normalizeChoice(choice: SeatChoice | null, seats: readonly VerseSeat[]): SeatChoice | null {\n if (choice === null) return null;\n const seat = seats.find((s) => s.id === choice.seatId);\n const option = seatModelOption(seat, choice.model);\n return option === null ? choice : { seatId: choice.seatId, model: option.id };\n}\n\ninterface ContextChoiceProps {\n seat: VerseSeat;\n option: VerseModelOption;\n unavailableReason: string | null;\n mode: VerseContextMode;\n offersModes: boolean;\n /** The seat's saved default, resolved for this model. */\n savedDefault: VerseContextMode;\n prefsLoaded: boolean;\n prefsError: string | null;\n onMode: (mode: VerseContextMode) => void;\n savingDefault: boolean;\n defaultNote: { ok: boolean; text: string } | null;\n onMakeDefault: () => void;\n fitState: FitState;\n}\n\n/**\n * The chosen model's context, under the picker: its budget and provenance,\n * the mode selector (only where a real second budget exists), the fit verdict\n * for the chosen folders, and the seat's pinned CLI and notes.\n */\nfunction ContextChoice({\n seat,\n option,\n unavailableReason,\n mode,\n offersModes,\n savedDefault,\n prefsLoaded,\n prefsError,\n onMode,\n savingDefault,\n defaultNote,\n onMakeDefault,\n fitState,\n}: ContextChoiceProps) {\n const labelId = useId();\n const budget = effectiveBudget(option, mode);\n const cli = seatCliLine(seat);\n const notes = seatContextNotes(seat);\n const verdict = fitState.status === 'ready' ? modelFit(fitState.fit.totalEstTokens, option, mode, seat.engine) : null;\n\n return (\n <div className={styles.context} role=\"group\" aria-labelledby={labelId}>\n <div className={styles.contextHead}>\n <span id={labelId} className={styles.label}>Context</span>\n <span className={styles.contextBudget}>\n {budget === null\n ? 'Window unknown'\n : `${formatTokens(budget.contextWindow)} window${budget.autoCompactAt === null ? '' : ` · compacts ≈${formatTokens(budget.autoCompactAt)}`}`}\n </span>\n </div>\n {budget !== null && option.windowSource ? (\n <p className={styles.hint}>Window {WINDOW_SOURCE_TEXT[option.windowSource]}.</p>\n ) : null}\n\n {unavailableReason !== null ? (\n <p className={styles.warn}>{option.label} cannot run on this seat: {unavailableReason}. Pick another model.</p>\n ) : null}\n\n {offersModes ? (\n <>\n <Segmented<VerseContextMode>\n aria-label=\"Context mode\"\n size=\"sm\"\n value={mode}\n onChange={onMode}\n options={(['standard', 'expansive'] as const).map((m) => {\n const b = budgetFor(option, m);\n return {\n value: m,\n label: b === null ? CONTEXT_MODE_LABEL[m] : `${CONTEXT_MODE_LABEL[m]} · ≈${formatTokens(b.autoCompactAt ?? b.contextWindow)}`,\n ariaLabel: CONTEXT_MODE_LABEL[m],\n };\n })}\n />\n <p className={styles.hint}>{contextModeDescription(seat.engine, option, mode)}</p>\n {prefsLoaded && mode !== savedDefault ? (\n <div className={styles.rootRow}>\n <button type=\"button\" className={styles.addRoot} onClick={onMakeDefault} disabled={savingDefault}>\n {savingDefault ? 'Saving…' : `Make ${CONTEXT_MODE_LABEL[mode]} the default for ${seat.label}`}\n </button>\n </div>\n ) : null}\n {defaultNote !== null ? (\n <p role={defaultNote.ok ? 'status' : 'alert'} className={defaultNote.ok ? styles.hint : styles.error}>{defaultNote.text}</p>\n ) : null}\n {prefsError !== null ? (\n <p className={styles.hint}>Saved defaults could not be read ({prefsError}); this chat starts in {CONTEXT_MODE_LABEL[mode]} unless you pick otherwise.</p>\n ) : null}\n </>\n ) : (\n <p className={styles.hint}>{noModeReason(seat.engine, option)}</p>\n )}\n\n <div className={styles.fit} aria-live=\"polite\">\n {fitState.status === 'idle' ? null\n : fitState.status === 'loading' ? <p className={styles.hint}>Sizing the chosen folders…</p>\n : fitState.status === 'error' ? <p className={styles.hint}>Could not size the chosen folders: {fitState.message}</p>\n : verdict === null ? (\n <p className={styles.hint}>\n ~{formatTokens(fitState.fit.totalEstTokens)} tokens of tracked code; this model&rsquo;s budget is unknown, so no fit is claimed.\n </p>\n ) : (\n <>\n <p className={styles.fitLine}>\n <span className={styles.fitBadge} data-fit={verdict}>{FIT_LABEL[verdict]}</span>\n <span>{fitExplanation({ verdict, tokens: fitState.fit.totalEstTokens, option, mode, floor: fitIsFloor(fitState.fit) })}</span>\n </p>\n <p className={styles.hint}>{fitMethodNote(seat.engine)}</p>\n </>\n )}\n </div>\n\n {cli === null && notes.length === 0 ? null : (\n <ul className={styles.seatFacts} aria-label={`${seat.label} facts`}>\n {cli === null ? null : <li>Runs {cli}.</li>}\n {notes.map((note) => <li key={note}>{note}</li>)}\n </ul>\n )}\n </div>\n );\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/SetupChecklist-Bd76MBAR.js","assets/global-BlI2BYa1.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.css","assets/Button-DrnKsvnQ.css","assets/AutonomyOffState-CmSSTHVe.css","assets/SetupChecklist-BhZpFLsj.css"])))=>i.map(i=>d[i]);
2
+ import{a as e,c as t,n,t as r}from"./index-DZ-UQ7v8.js";import{h as i}from"./global-CMNW_dqn.js";import{M as a,at as o,lt as s,q as c,z as l}from"./VerseConsoleApp-CWU6R3By.js";import{y as u}from"./format-CH4g_sl1.js";import{r as d}from"./CapacityStrip-qKDBC65C.js";import{t as f}from"./Button-D90dzI_o.js";import{C as p,a as m,b as h,f as g,i as _,o as v,r as y,s as b,t as x,u as S}from"./icons-D1sYbCTQ.js";import{s as C}from"./verse-icons-S56hIiXS.js";import"./command-catalog-BIntSa9l.js";import{r as w,u as T}from"./AutonomyOffState-CEPSZToP.js";import{a as E,o as D}from"./authority-model-79SeuKlJ.js";import{r as O}from"./surface-data-Dj71tdD-.js";import"./primitives-2A5Eq8FQ.js";import{a as k,s as A}from"./usage-queries-AdjEyEtn.js";import{copyAutonomySetupCommand as j}from"./copy-setup-XMgCC5f8.js";import{a as M,i as N,n as P,r as F,s as I,t as L}from"./useOnboarding-C_Fpe_sH.js";var R=t(e(),1),z=[{id:`welcome`,title:`Welcome to Verse`,subtitle:`Five sections, one rail.`},{id:`accounts`,title:`Your seats`,subtitle:`Which provider accounts this machine can actually dispatch to right now.`},{id:`local`,title:`Local runtime`,subtitle:`Whether there is a model on this machine, and what that changes.`},{id:`autonomy`,title:`Turn on autonomy`,subtitle:`It stays off until you set it up. Turning it down is always one click.`},{id:`stops`,title:`Three ways to stop`,subtitle:`They do not have the same blast radius. This is the one screen that says so.`},{id:`finish`,title:`Make it yours`,subtitle:`Theme, accent, density and font live in Settings. Then start a chat.`}];function B(e){return Number.isFinite(e)?Math.min(z.length-1,Math.max(0,Math.trunc(e))):0}var V=`Local seats cost nothing and consume no provider quota, so the autonomous loop can keep working after a cloud window is used up.`,H=`Without one, every turn and every autonomous tick spends a provider account, and a used-up window stops the work.`;function U(e){if(e.loading)return{tone:`unknown`,state:`checking`,summary:`Probing the local runtimes on this machine…`,meaning:V,fix:null,modelCount:0,toolCapableCount:0,stale:!1};if(!e.snapshot)return{tone:`unknown`,state:`not reported`,summary:`This server does not report local runtimes, so Verse cannot say whether one is available here.`,meaning:H,fix:e.unavailableReason,modelCount:0,toolCapableCount:0,stale:!1};let t=e.snapshot.models,n=t.filter(e=>e.supportsTools===!0).length,r=e.snapshot.runtimes.some(e=>e.stale);return e.snapshot.reachable?t.length===0?{tone:`attention`,state:`no models`,summary:`A local runtime answered, but it has no models installed.`,meaning:H,fix:`Pull a model into the runtime, then press Refresh in Usage.`,modelCount:0,toolCapableCount:0,stale:r}:{tone:`ok`,state:r?`available (retained reading)`:`available`,summary:`${t.length} local ${t.length===1?`model`:`models`} available`+(n>0?`, ${n} of them tool-capable.`:`, none of them tool-capable.`)+(r?` Last known reading.`:``),meaning:n>0?V:`${V} A model that cannot call tools can answer, but cannot run an agentic turn.`,fix:null,modelCount:t.length,toolCapableCount:n,stale:r}:{tone:`attention`,state:`unreachable`,summary:`No local runtime answered. Verse cannot tell whether one is not running or not installed — the probe only knows it got no answer.`,meaning:H,fix:`Start Ollama (or LM Studio) and press Refresh in Usage. If neither is installed, everything still works — it all runs on the cloud seats.`,modelCount:0,toolCapableCount:0,stale:r}}var W=[{name:`Pause`,scope:`Halts autonomous dispatch only. A running loop parks instead of exiting.`,limit:`Your own chats and the agent’s write tools keep working.`,reversible:`Reversible in one click, with no restart and no confirmation.`,tone:`ok`},{name:`Stop loop`,scope:`Stops the daemon — and engages the GLOBAL kill switch while doing it.`,limit:`That means it also refuses the agent’s own write tools, exactly like the emergency control.`,reversible:`Reversible, but confirm-guarded. For an ordinary halt, use Pause.`,tone:`attention`},{name:`Emergency stop`,scope:`Engages the global kill switch (~/.ashlr/KILL) directly.`,limit:`Every mutating path refuses: the loop, dispatch, and the agent’s own write tools.`,reversible:`Reversible, confirm-guarded, and deliberately separated from the other two.`,tone:`attention`}],G={card:`_card_10xpw_14`,"onboarding-in":`_onboarding-in_10xpw_1`,head:`_head_10xpw_56`,headText:`_headText_10xpw_64`,eyebrow:`_eyebrow_10xpw_72`,title:`_title_10xpw_80`,subtitle:`_subtitle_10xpw_88`,body:`_body_10xpw_96`,lead:`_lead_10xpw_107`,aside:`_aside_10xpw_113`,caveat:`_caveat_10xpw_114`,kbd:`_kbd_10xpw_125`,sections:`_sections_10xpw_138`,findings:`_findings_10xpw_139`,sectionRow:`_sectionRow_10xpw_148`,sectionIcon:`_sectionIcon_10xpw_160`,localIcon:`_localIcon_10xpw_161`,sectionText:`_sectionText_10xpw_173`,sectionName:`_sectionName_10xpw_180`,sectionBlurb:`_sectionBlurb_10xpw_190`,finding:`_finding_10xpw_139`,findingHead:`_findingHead_10xpw_210`,stopName:`_stopName_10xpw_218`,findingDetail:`_findingDetail_10xpw_225`,findingNote:`_findingNote_10xpw_231`,findingFix:`_findingFix_10xpw_237`,fixLabel:`_fixLabel_10xpw_245`,fixText:`_fixText_10xpw_254`,code:`_code_10xpw_260`,tone:`_tone_10xpw_276`,toneLabel:`_toneLabel_10xpw_283`,foot:`_foot_10xpw_305`,pips:`_pips_10xpw_315`,pip:`_pip_10xpw_315`,actions:`_actions_10xpw_338`,chip:`_chip_10xpw_362`,chipOpen:`_chipOpen_10xpw_378`,chipDismiss:`_chipDismiss_10xpw_379`,chipLabel:`_chipLabel_10xpw_399`,chipCount:`_chipCount_10xpw_407`},K=n(),q=(0,R.lazy)(()=>r(()=>import(`./SetupChecklist-Bd76MBAR.js`),__vite__mapDeps([0,1,2,3,4,5,6])));function J({tone:e,label:t}){let n=e===`ok`?y:e===`attention`?x:S;return(0,K.jsxs)(`span`,{className:G.tone,"data-tone":e,children:[(0,K.jsx)(n,{size:13,"aria-hidden":`true`,focusable:`false`}),(0,K.jsx)(`span`,{className:G.toneLabel,children:t})]})}function Y({children:e}){return(0,K.jsx)(`div`,{className:G.body,children:e})}function X(){return(0,K.jsxs)(Y,{children:[(0,K.jsx)(`p`,{className:G.lead,children:`Verse runs your chats and this machine’s agent fleet from one local server.`}),(0,K.jsx)(`ul`,{className:G.sections,children:c.map((e,t)=>{let n=C[e.id];return(0,K.jsxs)(`li`,{className:G.sectionRow,children:[(0,K.jsx)(`span`,{className:G.sectionIcon,"aria-hidden":`true`,children:(0,K.jsx)(n,{})}),(0,K.jsxs)(`span`,{className:G.sectionText,children:[(0,K.jsxs)(`span`,{className:G.sectionName,children:[e.label,` `,(0,K.jsxs)(`kbd`,{className:G.kbd,children:[`⌘`,t+1]})]}),(0,K.jsx)(`span`,{className:G.sectionBlurb,children:e.blurb})]})]},e.id)})}),(0,K.jsxs)(`p`,{className:G.sectionBlurb,children:[(0,K.jsx)(`kbd`,{className:G.kbd,children:`⌘K`}),` runs anything by name · `,(0,K.jsx)(`kbd`,{className:G.kbd,children:`⌘J`}),` is everything waiting on you · Settings, Apps & Accounts and Usage are under the gear.`]})]})}function Z(){return(0,K.jsxs)(Y,{children:[(0,K.jsx)(d,{density:`compact`,headline:!0,local:`collapse`,labelledBy:`verse-onboarding-title`,emptyText:`No seats reported yet. Connect an account in Apps & Accounts, or start Ollama for local models.`,renderActions:e=>e.connection?.fixCommand?(0,K.jsxs)(`p`,{className:G.findingFix,children:[(0,K.jsx)(`span`,{className:G.fixLabel,children:`Fix`}),(0,K.jsx)(`code`,{className:G.code,children:e.connection.fixCommand.join(` `)})]}):null}),(0,K.jsx)(`p`,{className:G.aside,children:`Every window, reset and reserve lives in Apps & Accounts, under the gear.`})]})}function Q(){let e=i(k),t=(0,R.useMemo)(()=>{let t=e.data?.reason??e.error?.message??null;return U({snapshot:e.data?.available?A(e.data.raw):null,loading:e.data===void 0&&e.status!==`error`,unavailableReason:t===null?null:u(t)})},[e.data,e.status,e.error]);return(0,K.jsxs)(Y,{children:[(0,K.jsxs)(`div`,{className:G.findingHead,children:[(0,K.jsx)(`span`,{className:G.localIcon,"aria-hidden":`true`,children:(0,K.jsx)(b,{size:15})}),(0,K.jsx)(J,{tone:t.tone,label:t.state})]}),(0,K.jsx)(`p`,{className:G.lead,children:t.summary}),(0,K.jsx)(`p`,{className:G.findingDetail,children:t.meaning}),t.fix?(0,K.jsxs)(`p`,{className:G.findingFix,children:[(0,K.jsx)(`span`,{className:G.fixLabel,children:`Fix`}),(0,K.jsx)(`span`,{className:G.fixText,children:t.fix})]}):null]})}function $(e){return e===`success`?`ok`:e===`warning`||e===`danger`?`attention`:`unknown`}function ee(){let e=i(O),[t,n]=(0,R.useState)(null),r=e.data?.value??null,a=e.data===void 0&&e.status!==`error`,o=D(r),c=E(r,Date.now()),u=w(r?.grant.state===`none`),d=!r||r.grant.state===`none`&&u.readiness!==`ready`,p=T(u.report)??`ashlr authority setup`,m=(0,K.jsxs)(`div`,{className:G.findingFix,children:[(0,K.jsx)(`span`,{className:G.fixLabel,children:p===`ashlr authority setup`?`Set up`:`Next`}),(0,K.jsx)(`code`,{className:G.code,children:p}),(0,K.jsx)(f,{variant:`subtle`,size:`sm`,icon:(0,K.jsx)(v,{size:13}),onClick:()=>{j(p).then(n)},children:t?`Copied`:`Copy`})]}),h=a?`Reading the autonomy state…`:r?c.detail:e.data?.reason??e.error?.message??`The autonomy state could not be read.`;return(0,K.jsxs)(Y,{children:[(0,K.jsxs)(`div`,{className:G.findingHead,children:[(0,K.jsx)(`span`,{className:G.stopName,children:`Right now`}),(0,K.jsx)(J,{tone:a?`unknown`:$(o.tone),label:a?`checking`:r?o.text:`not reported`})]}),(0,K.jsx)(`p`,{className:G.findingDetail,children:h}),(0,K.jsxs)(`p`,{className:G.lead,children:[`The switch on Command `,(0,K.jsx)(`kbd`,{className:G.kbd,children:`⌘1`}),` — Off, Propose, Autonomous — decides what the fleet may do on its own. Raising it past your grant asks for Touch ID; lowering it never does.`]}),d?(0,K.jsxs)(K.Fragment,{children:[u.report?(0,K.jsx)(R.Suspense,{fallback:m,children:(0,K.jsx)(q,{report:u.report,action:m,open:!0})}):m,(0,K.jsx)(`p`,{className:G.aside,role:t===!1?`alert`:void 0,children:t===!1?`The clipboard is not available here — select the command and copy it by hand.`:`Run it in a terminal. It stops for what only you can do — sudo, Touch ID, GitHub — and --dry-run prints every step first.`})]}):c.action?(0,K.jsx)(f,{variant:`subtle`,icon:(0,K.jsx)(g,{size:14}),onClick:()=>l(`autonomy.grant`,{via:`button`}),children:c.action===`re-approve`?`Re-approve grant…`:`Approve grant…`}):(0,K.jsx)(f,{variant:`subtle`,icon:(0,K.jsx)(g,{size:14}),onClick:()=>s(`command`),children:`Open Command`}),(0,K.jsxs)(`p`,{className:G.aside,children:[(0,K.jsx)(`kbd`,{className:G.kbd,children:`⌘K`}),` “Autonomy: …” and “Approve grant…” work from any surface.`]})]})}function te(){return(0,K.jsxs)(Y,{children:[(0,K.jsxs)(`p`,{className:G.lead,children:[`Fleet `,(0,K.jsx)(`kbd`,{className:G.kbd,children:`⌘2`}),` has three stop controls. They are not interchangeable, and the difference is the most important thing on this screen.`]}),(0,K.jsx)(`ul`,{className:G.findings,children:W.map(e=>(0,K.jsxs)(`li`,{className:G.finding,children:[(0,K.jsxs)(`div`,{className:G.findingHead,children:[(0,K.jsx)(`span`,{className:G.stopName,children:e.name}),(0,K.jsx)(J,{tone:e.tone,label:e.tone===`ok`?`narrow`:`global`})]}),(0,K.jsx)(`p`,{className:G.findingDetail,children:e.scope}),(0,K.jsx)(`p`,{className:G.findingDetail,children:e.limit}),(0,K.jsx)(`p`,{className:G.findingNote,children:e.reversible})]},e.name))})]})}function ne(){return(0,K.jsxs)(Y,{children:[(0,K.jsxs)(`p`,{className:G.lead,children:[`Settings `,(0,K.jsx)(`kbd`,{className:G.kbd,children:`⌘,`}),` carries theme, accent hue, density, display font, corner radius and reduced motion. Every change applies as you make it — there is no save button.`]}),(0,K.jsx)(f,{variant:`subtle`,icon:(0,K.jsx)(h,{size:14}),onClick:()=>s(`settings`),children:`Open Settings`}),(0,K.jsx)(`p`,{className:G.aside,children:`You can replay this tour any time from Settings → Onboarding.`})]})}var re=[X,Z,Q,ee,te,ne];function ie(){let{open:e,expanded:t,step:n}=L(),r=B(n),i=z[r],s=re[r],c=r===z.length-1,l=z.length,u=(0,R.useCallback)(()=>N(),[]),d=(0,R.useRef)(null),h=(0,R.useRef)(null),g=(0,R.useRef)(!1),v=(0,R.useCallback)(()=>{g.current=!0,M()},[]),y=(0,R.useCallback)(()=>{g.current=!0,P()},[]);return(0,R.useEffect)(()=>{g.current&&(g.current=!1,t?d.current?.focus():h.current?.focus())},[t]),(0,R.useEffect)(()=>{if(!e||!t)return;function n(e){if(e.key!==`Escape`)return;let t=d.current;t&&e.target instanceof Node&&t.contains(e.target)&&(e.preventDefault(),y())}return document.addEventListener(`keydown`,n),()=>document.removeEventListener(`keydown`,n)},[e,t,y]),e?t?(0,K.jsxs)(`aside`,{ref:d,tabIndex:-1,className:G.card,"aria-labelledby":`verse-onboarding-title`,role:`region`,children:[(0,K.jsxs)(`header`,{className:G.head,children:[(0,K.jsxs)(`div`,{className:G.headText,children:[(0,K.jsxs)(`p`,{className:G.eyebrow,children:[`Getting started · `,r+1,` of `,l]}),(0,K.jsx)(`h2`,{id:`verse-onboarding-title`,className:G.title,children:i.title}),(0,K.jsx)(`p`,{className:G.subtitle,children:i.subtitle})]}),(0,K.jsx)(f,{iconOnly:!0,variant:`ghost`,size:`sm`,"aria-label":`Minimize getting started`,title:`Minimize getting started`,"aria-expanded":`true`,icon:(0,K.jsx)(_,{size:14}),onClick:y})]}),(0,K.jsx)(s,{}),(0,K.jsxs)(`footer`,{className:G.foot,children:[(0,K.jsx)(`ol`,{className:G.pips,"aria-hidden":`true`,children:z.map((e,t)=>(0,K.jsx)(`li`,{className:G.pip,"data-state":t===r?`current`:t<r?`done`:`todo`},e.id))}),(0,K.jsxs)(`div`,{className:G.actions,children:[(0,K.jsx)(f,{variant:`ghost`,size:`sm`,onClick:u,children:`Skip setup`}),r>0?(0,K.jsx)(f,{variant:`subtle`,size:`sm`,onClick:()=>I(r-1),children:`Back`}):null,c?(0,K.jsx)(f,{variant:`primary`,size:`sm`,icon:(0,K.jsx)(a,{size:14}),onClick:()=>{F(),o(`new-chat`)},children:`Start a first chat`}):(0,K.jsx)(f,{variant:`primary`,size:`sm`,onClick:()=>I(r+1),children:`Next`})]})]})]}):(0,K.jsxs)(`div`,{className:G.chip,role:`region`,"aria-label":`Getting started`,children:[(0,K.jsxs)(`button`,{ref:h,type:`button`,className:G.chipOpen,"aria-expanded":`false`,title:`Getting started: ${i.title}`,onClick:v,children:[(0,K.jsx)(`span`,{className:G.chipLabel,children:`Getting started`}),(0,K.jsxs)(`span`,{className:G.chipCount,children:[r+1,`/`,l]}),(0,K.jsx)(m,{size:13,"aria-hidden":`true`,focusable:`false`})]}),(0,K.jsx)(`button`,{type:`button`,className:G.chipDismiss,"aria-label":`Dismiss getting started`,title:`Dismiss getting started — replay it any time from Settings`,onClick:u,children:(0,K.jsx)(p,{size:12,"aria-hidden":`true`,focusable:`false`})})]}):null}export{ie as OnboardingFlow};
3
+ //# sourceMappingURL=OnboardingFlow-Cy9BA9eR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/onboarding/onboarding-model.ts","../../../../../../src/web-ui/routes/verse/onboarding/OnboardingFlow.tsx"],"sourcesContent":["/**\n * routes/verse/onboarding/onboarding-model.ts — the first-run tour's facts,\n * derived from the same reads the Usage section uses, with the same honesty\n * rules (docs/VERSE-TELEMETRY-V2.md).\n *\n * Pure: no React, no I/O. Everything the tour asserts about the machine is\n * computed here so it can be tested without a DOM, and so the one rule that\n * matters is enforced in one place:\n *\n * AN ABSENT READ IS \"UNKNOWN\", NEVER \"FINE\" AND NEVER \"BROKEN\".\n *\n * A first-run screen is exactly where a confident lie does the most damage —\n * it is the operator's first and only calibration of how much this app's\n * claims can be trusted. So a route that 404s, a payload that does not\n * narrow, and a probe that could not reach a runtime each produce their own\n * sentence, and none of them produces a green check.\n *\n * The tour NEVER renders a command it invented: the seats step shows only\n * A2's own fix argv (through C6's capacity rows).\n */\nimport type { LocalModelsSnapshot } from '../usage/usage-contract.js';\n\n// ---------------------------------------------------------------------------\n// Steps\n// ---------------------------------------------------------------------------\n\nexport type OnboardingStepId = 'welcome' | 'accounts' | 'local' | 'autonomy' | 'stops' | 'finish';\n\nexport interface OnboardingStepMeta {\n id: OnboardingStepId;\n /** Shown as the card's heading. */\n title: string;\n /** One line under the heading. */\n subtitle: string;\n}\n\nexport const ONBOARDING_STEPS: readonly OnboardingStepMeta[] = [\n {\n id: 'welcome',\n title: 'Welcome to Verse',\n subtitle: 'Five sections, one rail.',\n },\n {\n id: 'accounts',\n title: 'Your seats',\n subtitle: 'Which provider accounts this machine can actually dispatch to right now.',\n },\n {\n id: 'local',\n title: 'Local runtime',\n subtitle: 'Whether there is a model on this machine, and what that changes.',\n },\n {\n id: 'autonomy',\n title: 'Turn on autonomy',\n subtitle: 'It stays off until you set it up. Turning it down is always one click.',\n },\n {\n id: 'stops',\n title: 'Three ways to stop',\n subtitle: 'They do not have the same blast radius. This is the one screen that says so.',\n },\n {\n id: 'finish',\n title: 'Make it yours',\n subtitle: 'Theme, accent, density and font live in Settings. Then start a chat.',\n },\n];\n\nexport function clampStep(step: number): number {\n if (!Number.isFinite(step)) return 0;\n return Math.min(ONBOARDING_STEPS.length - 1, Math.max(0, Math.trunc(step)));\n}\n\n// ---------------------------------------------------------------------------\n// Tone\n// ---------------------------------------------------------------------------\n\n/**\n * Step 2 (seats) is C6's shared LiveCapacityStrip since 3.10 — the tour no\n * longer narrows the accounts route itself, so the seats can never read\n * differently here than in Apps & Accounts. The tone below serves the local\n * runtime and the stops.\n */\nexport type FindingTone = 'ok' | 'attention' | 'unknown';\n\n// ---------------------------------------------------------------------------\n// Local runtime\n// ---------------------------------------------------------------------------\n\nexport interface LocalFinding {\n tone: FindingTone;\n state: string;\n summary: string;\n /** What having (or not having) a local runtime means for the operator. */\n meaning: string;\n /** Present only when there is something to do about it. */\n fix: string | null;\n modelCount: number;\n toolCapableCount: number;\n /** True when this reading was retained from an earlier probe. */\n stale: boolean;\n}\n\nexport interface LocalInput {\n snapshot: LocalModelsSnapshot | null;\n loading: boolean;\n unavailableReason: string | null;\n}\n\nconst LOCAL_MEANING_AVAILABLE =\n 'Local seats cost nothing and consume no provider quota, so the autonomous loop can keep working after a cloud window is used up.';\nconst LOCAL_MEANING_ABSENT =\n 'Without one, every turn and every autonomous tick spends a provider account, and a used-up window stops the work.';\n\nexport function buildLocalFinding(input: LocalInput): LocalFinding {\n if (input.loading) {\n return {\n tone: 'unknown',\n state: 'checking',\n summary: 'Probing the local runtimes on this machine…',\n meaning: LOCAL_MEANING_AVAILABLE,\n fix: null,\n modelCount: 0,\n toolCapableCount: 0,\n stale: false,\n };\n }\n\n if (!input.snapshot) {\n return {\n tone: 'unknown',\n state: 'not reported',\n summary: 'This server does not report local runtimes, so Verse cannot say whether one is available here.',\n meaning: LOCAL_MEANING_ABSENT,\n fix: input.unavailableReason,\n modelCount: 0,\n toolCapableCount: 0,\n stale: false,\n };\n }\n\n const models = input.snapshot.models;\n const toolCapable = models.filter((m) => m.supportsTools === true).length;\n const stale = input.snapshot.runtimes.some((r) => r.stale);\n\n if (!input.snapshot.reachable) {\n return {\n tone: 'attention',\n state: 'unreachable',\n // \"Not reachable\" and \"not installed\" are different facts and the probe\n // cannot tell them apart — so this does not claim either one.\n summary:\n 'No local runtime answered. Verse cannot tell whether one is not running or not installed — the probe only knows it got no answer.',\n meaning: LOCAL_MEANING_ABSENT,\n fix: 'Start Ollama (or LM Studio) and press Refresh in Usage. If neither is installed, everything still works — it all runs on the cloud seats.',\n modelCount: 0,\n toolCapableCount: 0,\n stale,\n };\n }\n\n if (models.length === 0) {\n return {\n tone: 'attention',\n state: 'no models',\n summary: 'A local runtime answered, but it has no models installed.',\n meaning: LOCAL_MEANING_ABSENT,\n fix: 'Pull a model into the runtime, then press Refresh in Usage.',\n modelCount: 0,\n toolCapableCount: 0,\n stale,\n };\n }\n\n return {\n tone: 'ok',\n state: stale ? 'available (retained reading)' : 'available',\n summary:\n `${models.length} local ${models.length === 1 ? 'model' : 'models'} available` +\n (toolCapable > 0 ? `, ${toolCapable} of them tool-capable.` : ', none of them tool-capable.') +\n (stale ? ' Last known reading.' : ''),\n meaning: toolCapable > 0\n ? LOCAL_MEANING_AVAILABLE\n : `${LOCAL_MEANING_AVAILABLE} A model that cannot call tools can answer, but cannot run an agentic turn.`,\n fix: null,\n modelCount: models.length,\n toolCapableCount: toolCapable,\n stale,\n };\n}\n\n// ---------------------------------------------------------------------------\n// The three stops\n// ---------------------------------------------------------------------------\n\nexport interface StopControl {\n name: string;\n /** What it halts. */\n scope: string;\n /** What it does NOT halt — the half people get wrong. */\n limit: string;\n reversible: string;\n tone: FindingTone;\n}\n\n/**\n * Verbatim against docs/VERSE-CONTRACT-V2.md's two footguns and the V2.1\n * amendment. The kill switch is never called a pause, and \"Stop loop\" is\n * stated as engaging the same global sentinel as the emergency control,\n * because it does (`stopDaemon()` is `setKill(true)`).\n */\nexport const STOP_CONTROLS: readonly StopControl[] = [\n {\n name: 'Pause',\n scope: 'Halts autonomous dispatch only. A running loop parks instead of exiting.',\n limit: 'Your own chats and the agent’s write tools keep working.',\n reversible: 'Reversible in one click, with no restart and no confirmation.',\n tone: 'ok',\n },\n {\n name: 'Stop loop',\n scope: 'Stops the daemon — and engages the GLOBAL kill switch while doing it.',\n limit: 'That means it also refuses the agent’s own write tools, exactly like the emergency control.',\n reversible: 'Reversible, but confirm-guarded. For an ordinary halt, use Pause.',\n tone: 'attention',\n },\n {\n name: 'Emergency stop',\n scope: 'Engages the global kill switch (~/.ashlr/KILL) directly.',\n limit: 'Every mutating path refuses: the loop, dispatch, and the agent’s own write tools.',\n reversible: 'Reversible, confirm-guarded, and deliberately separated from the other two.',\n tone: 'attention',\n },\n];\n","/**\n * routes/verse/onboarding/OnboardingFlow.tsx — the first-run tour.\n *\n * A first-time operator opens Verse to five unlabelled rail icons and no\n * guidance. This is six short steps that answer the questions that actually\n * block someone on day one: which of my accounts can this thing use, is\n * there anything local, how do I turn autonomy on, what do the three stop\n * buttons really do, where do I change how it looks, and how do I start.\n *\n * THREE RULES IT IS BUILT AROUND:\n *\n * 1. It never blocks the app. This is NOT a modal — no backdrop, no focus\n * trap, no `aria-modal`. It first appears as a one-line chip\n * (\"Getting started 1/6 →\") in the corner; only a click opens the card,\n * and every rail button, shortcut and section behind either stays\n * clickable. The card's minimise button and Escape fold it back to the\n * chip without answering it; Skip, or the chip's ×, silences it for good.\n *\n * 2. It never asserts more than it read. Step 2 is C6's shared capacity\n * strip (no reading is \"no reading\", never zero); step 3 reads the same\n * local-models route Usage reads, through the same narrower — an\n * unanswered probe is \"no answer\", never a green check (logic in\n * ./onboarding-model.ts, tested without a DOM); step 4 reads the same\n * authority entry Command's switch reads.\n *\n * 3. It costs no extra requests on the common path. The chip reads nothing.\n * Each data step mounts its own query only when the operator reaches it,\n * and those queries are the Usage / Command sections' own cache entries —\n * so a first-run user who walks the tour and then opens either finds the\n * reads already in cache and within the freshness window\n * (data/hooks.ts DEFAULT_QUERY_FRESH_MS).\n */\nimport { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { Button } from '../../../components/primitives/index.js';\nimport {\n IconAlert,\n IconCheckCircle,\n IconChat,\n IconChevronDown,\n IconChevronRight,\n IconCopy,\n IconCpu,\n IconInfo,\n IconLock,\n IconSliders,\n IconX,\n} from '../../../components/primitives/icons.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { SECTION_ICON } from '../verse-icons.js';\nimport { RAIL_SECTIONS, requestVerseCommand, setVerseSection } from '../verse-ui-store.js';\nimport { LiveCapacityStrip } from '../usage/CapacityStrip.js';\nimport { tidyProse } from '../autonomy/format.js';\nimport { verseLocalModelsQuery } from '../usage/usage-queries.js';\nimport { projectLocalModels } from '../usage/usage-contract.js';\nimport { authorityQuery } from '../command/surface-data.js';\nimport { grantChip, modeWord, type ChipTone } from '../command/authority-model.js';\nimport { useSetupChecklist } from '../autonomy/AutonomyOffState.js';\nimport { nextCommand } from '../autonomy/setup-checklist-model.js';\nimport { AUTONOMY_SETUP_COMMAND } from '../shell/command-catalog.js';\nimport { copyAutonomySetupCommand } from '../shell/copy-setup.js';\nimport { executeCatalogCommand } from '../shell/run-command.js';\nimport {\n ONBOARDING_STEPS,\n STOP_CONTROLS,\n buildLocalFinding,\n clampStep,\n type FindingTone,\n} from './onboarding-model.js';\nimport {\n collapseOnboarding,\n completeOnboarding,\n dismissOnboarding,\n expandOnboarding,\n setOnboardingStep,\n} from './onboarding-store.js';\nimport { useOnboarding } from './useOnboarding.js';\nimport styles from './onboarding.module.css';\n\n// The setup checklist is its own chunk (shared with the \"Autonomy is off\" state).\nconst SetupChecklist = lazy(() => import('../autonomy/SetupChecklist.js'));\n\n/**\n * Tone is paired with a glyph everywhere it appears, never carried by colour\n * alone (DESIGN-V2 §6).\n */\nfunction ToneMark({ tone, label }: { tone: FindingTone; label: string }) {\n const Glyph = tone === 'ok' ? IconCheckCircle : tone === 'attention' ? IconAlert : IconInfo;\n return (\n <span className={styles.tone} data-tone={tone}>\n <Glyph size={13} aria-hidden=\"true\" focusable=\"false\" />\n <span className={styles.toneLabel}>{label}</span>\n </span>\n );\n}\n\nfunction StepBody({ children }: { children: ReactNode }) {\n return <div className={styles.body}>{children}</div>;\n}\n\n// ---------------------------------------------------------------------------\n// Step 1 — what the rail is\n// ---------------------------------------------------------------------------\n\nfunction WelcomeStep() {\n return (\n <StepBody>\n <p className={styles.lead}>Verse runs your chats and this machine’s agent fleet from one local server.</p>\n {/*\n The five rail surfaces, in ⌘1–⌘5 order, with the same one-line blurbs\n the palette uses (VERSE_SECTIONS) — one description per surface, not\n a second copy that drifts. Settings, Apps and Usage live in the gear.\n */}\n <ul className={styles.sections}>\n {RAIL_SECTIONS.map((entry, index) => {\n const Icon = SECTION_ICON[entry.id];\n return (\n <li key={entry.id} className={styles.sectionRow}>\n <span className={styles.sectionIcon} aria-hidden=\"true\">\n <Icon />\n </span>\n <span className={styles.sectionText}>\n <span className={styles.sectionName}>\n {entry.label} <kbd className={styles.kbd}>⌘{index + 1}</kbd>\n </span>\n <span className={styles.sectionBlurb}>{entry.blurb}</span>\n </span>\n </li>\n );\n })}\n </ul>\n <p className={styles.sectionBlurb}>\n <kbd className={styles.kbd}>⌘K</kbd> runs anything by name · <kbd className={styles.kbd}>⌘J</kbd> is everything\n waiting on you · Settings, Apps &amp; Accounts and Usage are under the gear.\n </p>\n </StepBody>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Step 2 — seats\n// ---------------------------------------------------------------------------\n\n/**\n * Step 2 mounts C6's shared LiveCapacityStrip — the SAME projection Apps &\n * Accounts, Usage, the new-chat dialog and the rail's capacity ring read — so\n * the tour can never describe a seat differently from the rest of the app\n * (3.9 had its own accounts narrower here, which drifted from Usage). A seat\n * that is signed out or out of usage shows the exact command that fixes it,\n * straight from A2's health report; nothing is run from the tour.\n */\nfunction AccountsStep() {\n return (\n <StepBody>\n <LiveCapacityStrip\n density=\"compact\"\n headline\n local=\"collapse\"\n // The step's own heading (\"Your seats\") names the strip: a second,\n // hidden heading with the same words is noise to a screen reader.\n labelledBy=\"verse-onboarding-title\"\n emptyText=\"No seats reported yet. Connect an account in Apps & Accounts, or start Ollama for local models.\"\n renderActions={(row) =>\n row.connection?.fixCommand ? (\n <p className={styles.findingFix}>\n <span className={styles.fixLabel}>Fix</span>\n <code className={styles.code}>{row.connection.fixCommand.join(' ')}</code>\n </p>\n ) : null\n }\n />\n <p className={styles.aside}>\n Every window, reset and reserve lives in Apps &amp; Accounts, under the gear.\n </p>\n </StepBody>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Step 3 — local runtime\n// ---------------------------------------------------------------------------\n\nfunction LocalStep() {\n const read = useQuery(verseLocalModelsQuery);\n const finding = useMemo(() => {\n // The server's sentence, with any ISO instant in it read as local time.\n const reason = read.data?.reason ?? read.error?.message ?? null;\n return buildLocalFinding({\n snapshot: read.data?.available ? projectLocalModels(read.data.raw) : null,\n loading: read.data === undefined && read.status !== 'error',\n unavailableReason: reason === null ? null : tidyProse(reason),\n });\n }, [read.data, read.status, read.error]);\n\n return (\n <StepBody>\n <div className={styles.findingHead}>\n <span className={styles.localIcon} aria-hidden=\"true\">\n <IconCpu size={15} />\n </span>\n <ToneMark tone={finding.tone} label={finding.state} />\n </div>\n <p className={styles.lead}>{finding.summary}</p>\n <p className={styles.findingDetail}>{finding.meaning}</p>\n {finding.fix ? (\n <p className={styles.findingFix}>\n <span className={styles.fixLabel}>Fix</span>\n <span className={styles.fixText}>{finding.fix}</span>\n </p>\n ) : null}\n </StepBody>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Step 4 — autonomy\n// ---------------------------------------------------------------------------\n\n/** The Command bar's chip tones, in the tour's three (glyph + word, never colour alone). */\nfunction findingTone(tone: ChipTone | undefined): FindingTone {\n if (tone === 'success') return 'ok';\n if (tone === 'warning' || tone === 'danger') return 'attention';\n return 'unknown';\n}\n\n/**\n * Reads the SAME authority entry Command's bar reads (surface-data\n * authorityQuery), so \"Right now\" can never disagree with the switch — and\n * never claims a state it did not read: no answer is \"not reported\", with\n * the server's own reason.\n *\n * The next step is the one Command's \"Autonomy is off\" state names, decided\n * the same way (autonomy-off-model): with no grant, the live setup checklist\n * (every step, unfolded) and the command for its next open step while one\n * before the grant is open (or we cannot tell); once only the grant is left,\n * \"Approve grant…\" — the same ⌘K command, which opens the Touch ID sheet on\n * Command (the only place a grant is drafted). With a grant, the chip decides\n * (re-approve / renew), else Command itself.\n */\nfunction AutonomyStep() {\n const read = useQuery(authorityQuery);\n const [copied, setCopied] = useState<boolean | null>(null);\n const status = read.data?.value ?? null;\n const loading = read.data === undefined && read.status !== 'error';\n const mode = modeWord(status);\n const chip = grantChip(status, Date.now());\n const setup = useSetupChecklist(status?.grant.state === 'none');\n const needsSetup = !status || (status.grant.state === 'none' && setup.readiness !== 'ready');\n const command = nextCommand(setup.report) ?? AUTONOMY_SETUP_COMMAND;\n const fix = (\n <div className={styles.findingFix}>\n <span className={styles.fixLabel}>{command === AUTONOMY_SETUP_COMMAND ? 'Set up' : 'Next'}</span>\n <code className={styles.code}>{command}</code>\n <Button\n variant=\"subtle\"\n size=\"sm\"\n icon={<IconCopy size={13} />}\n onClick={() => {\n void copyAutonomySetupCommand(command).then(setCopied);\n }}\n >\n {copied ? 'Copied' : 'Copy'}\n </Button>\n </div>\n );\n const detail = loading\n ? 'Reading the autonomy state…'\n : status\n ? chip.detail\n : (read.data?.reason ?? read.error?.message ?? 'The autonomy state could not be read.');\n\n return (\n <StepBody>\n <div className={styles.findingHead}>\n <span className={styles.stopName}>Right now</span>\n <ToneMark tone={loading ? 'unknown' : findingTone(mode.tone)} label={loading ? 'checking' : status ? mode.text : 'not reported'} />\n </div>\n <p className={styles.findingDetail}>{detail}</p>\n <p className={styles.lead}>\n The switch on Command <kbd className={styles.kbd}>⌘1</kbd> — Off, Propose, Autonomous — decides what the fleet\n may do on its own. Raising it past your grant asks for Touch ID; lowering it never does.\n </p>\n {needsSetup ? (\n <>\n {setup.report ? (\n <Suspense fallback={fix}>\n <SetupChecklist report={setup.report} action={fix} open />\n </Suspense>\n ) : fix}\n <p className={styles.aside} role={copied === false ? 'alert' : undefined}>\n {copied === false\n ? 'The clipboard is not available here — select the command and copy it by hand.'\n : 'Run it in a terminal. It stops for what only you can do — sudo, Touch ID, GitHub — and --dry-run prints every step first.'}\n </p>\n </>\n ) : chip.action ? (\n <Button variant=\"subtle\" icon={<IconLock size={14} />} onClick={() => executeCatalogCommand('autonomy.grant', { via: 'button' })}>\n {chip.action === 're-approve' ? 'Re-approve grant…' : 'Approve grant…'}\n </Button>\n ) : (\n <Button variant=\"subtle\" icon={<IconLock size={14} />} onClick={() => setVerseSection('command')}>\n Open Command\n </Button>\n )}\n <p className={styles.aside}>\n <kbd className={styles.kbd}>⌘K</kbd> “Autonomy: …” and “Approve grant…” work from any surface.\n </p>\n </StepBody>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Step 5 — the three stops\n// ---------------------------------------------------------------------------\n\nfunction StopsStep() {\n return (\n <StepBody>\n <p className={styles.lead}>\n Fleet <kbd className={styles.kbd}>⌘2</kbd> has three stop controls. They are not interchangeable, and the\n difference is the most important thing on this screen.\n </p>\n <ul className={styles.findings}>\n {STOP_CONTROLS.map((control) => (\n <li key={control.name} className={styles.finding}>\n <div className={styles.findingHead}>\n <span className={styles.stopName}>{control.name}</span>\n <ToneMark tone={control.tone} label={control.tone === 'ok' ? 'narrow' : 'global'} />\n </div>\n <p className={styles.findingDetail}>{control.scope}</p>\n <p className={styles.findingDetail}>{control.limit}</p>\n <p className={styles.findingNote}>{control.reversible}</p>\n </li>\n ))}\n </ul>\n </StepBody>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Step 6 — appearance, then go\n// ---------------------------------------------------------------------------\n\nfunction FinishStep() {\n return (\n <StepBody>\n <p className={styles.lead}>\n Settings <kbd className={styles.kbd}>⌘,</kbd> carries theme, accent hue, density, display font, corner radius\n and reduced motion. Every change applies as you make it — there is no save button.\n </p>\n <Button\n variant=\"subtle\"\n icon={<IconSliders size={14} />}\n onClick={() => setVerseSection('settings')}\n >\n Open Settings\n </Button>\n <p className={styles.aside}>\n You can replay this tour any time from Settings → Onboarding.\n </p>\n </StepBody>\n );\n}\n\n/** In ONBOARDING_STEPS order (the model test pins the ids; the flow test walks them). */\nconst STEP_COMPONENTS = [WelcomeStep, AccountsStep, LocalStep, AutonomyStep, StopsStep, FinishStep] as const;\n\n// ---------------------------------------------------------------------------\n// The chip and the card\n// ---------------------------------------------------------------------------\n\nexport function OnboardingFlow() {\n const { open, expanded, step } = useOnboarding();\n const index = clampStep(step);\n const meta = ONBOARDING_STEPS[index]!;\n const Step = STEP_COMPONENTS[index]!;\n const last = index === ONBOARDING_STEPS.length - 1;\n const total = ONBOARDING_STEPS.length;\n\n const dismiss = useCallback(() => dismissOnboarding(), []);\n const cardRef = useRef<HTMLElement>(null);\n const chipRef = useRef<HTMLButtonElement>(null);\n // Focus follows a fold / unfold the operator asked for — never a mount:\n // the chip appearing on first launch must not steal focus from the composer.\n const moveFocus = useRef(false);\n\n const expand = useCallback(() => {\n moveFocus.current = true;\n expandOnboarding();\n }, []);\n const collapse = useCallback(() => {\n moveFocus.current = true;\n collapseOnboarding();\n }, []);\n\n useEffect(() => {\n if (!moveFocus.current) return;\n moveFocus.current = false;\n if (expanded) cardRef.current?.focus();\n else chipRef.current?.focus();\n }, [expanded]);\n\n // Escape folds the card back to the chip — but ONLY when the focus is\n // inside the card.\n //\n // This card is deliberately not a modal (rule 1 above): the operator works\n // behind it, and every Escape they press for something else — closing the\n // command palette, backing out of a seat menu, stopping dictation — used to\n // land here too and permanently dismiss the tour. Scoped to the card, and\n // folding rather than answering, an Escape can never cost the operator the\n // tour; Skip and the chip's × are the only ways to silence it.\n useEffect(() => {\n if (!open || !expanded) return undefined;\n function onKey(event: globalThis.KeyboardEvent) {\n if (event.key !== 'Escape') return;\n const card = cardRef.current;\n if (!card || !(event.target instanceof Node) || !card.contains(event.target)) return;\n event.preventDefault();\n collapse();\n }\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [open, expanded, collapse]);\n\n if (!open) return null;\n\n if (!expanded) {\n return (\n <div className={styles.chip} role=\"region\" aria-label=\"Getting started\">\n <button\n ref={chipRef}\n type=\"button\"\n className={styles.chipOpen}\n aria-expanded=\"false\"\n title={`Getting started: ${meta.title}`}\n onClick={expand}\n >\n <span className={styles.chipLabel}>Getting started</span>\n <span className={styles.chipCount}>\n {index + 1}/{total}\n </span>\n <IconChevronRight size={13} aria-hidden=\"true\" focusable=\"false\" />\n </button>\n <button\n type=\"button\"\n className={styles.chipDismiss}\n aria-label=\"Dismiss getting started\"\n title=\"Dismiss getting started — replay it any time from Settings\"\n onClick={dismiss}\n >\n <IconX size={12} aria-hidden=\"true\" focusable=\"false\" />\n </button>\n </div>\n );\n }\n\n return (\n <aside ref={cardRef} tabIndex={-1} className={styles.card} aria-labelledby=\"verse-onboarding-title\" role=\"region\">\n <header className={styles.head}>\n <div className={styles.headText}>\n <p className={styles.eyebrow}>\n Getting started · {index + 1} of {total}\n </p>\n <h2 id=\"verse-onboarding-title\" className={styles.title}>\n {meta.title}\n </h2>\n <p className={styles.subtitle}>{meta.subtitle}</p>\n </div>\n <Button\n iconOnly\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Minimize getting started\"\n title=\"Minimize getting started\"\n aria-expanded=\"true\"\n icon={<IconChevronDown size={14} />}\n onClick={collapse}\n />\n </header>\n\n <Step />\n\n <footer className={styles.foot}>\n <ol className={styles.pips} aria-hidden=\"true\">\n {ONBOARDING_STEPS.map((s, i) => (\n <li key={s.id} className={styles.pip} data-state={i === index ? 'current' : i < index ? 'done' : 'todo'} />\n ))}\n </ol>\n <div className={styles.actions}>\n <Button variant=\"ghost\" size=\"sm\" onClick={dismiss}>\n Skip setup\n </Button>\n {index > 0 ? (\n <Button variant=\"subtle\" size=\"sm\" onClick={() => setOnboardingStep(index - 1)}>\n Back\n </Button>\n ) : null}\n {last ? (\n <Button\n variant=\"primary\"\n size=\"sm\"\n icon={<IconChat size={14} />}\n onClick={() => {\n completeOnboarding();\n // Switches to Chat and raises the one-shot ⌘N command the\n // chat section consumes by nonce (verse-ui-store.ts).\n requestVerseCommand('new-chat');\n }}\n >\n Start a first chat\n </Button>\n ) : (\n <Button variant=\"primary\" size=\"sm\" onClick={() => setOnboardingStep(index + 1)}>\n Next\n </Button>\n )}\n </div>\n </footer>\n </aside>\n );\n}\n"],"file":"OnboardingFlow-Cy9BA9eR.js"}
@@ -0,0 +1,3 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OnboardingFlow-Cy9BA9eR.js","assets/global-CMNW_dqn.js","assets/VerseConsoleApp-CWU6R3By.js","assets/RouteErrorBoundary-SkNhhUbt.js","assets/format-CH4g_sl1.js","assets/format-D7nBg2bn.js","assets/verse-model-DAVevkNe.js","assets/compaction-point-VL9oegWS.js","assets/CapacityStrip-qKDBC65C.js","assets/ProviderLogo-Cq-CYIwT.js","assets/Tag-DscCRFcN.js","assets/budget-queries-D8QV5XtH.js","assets/capacity-strip-model-BwZ1ZbkU.js","assets/seat-subscription-C5uPHBsN.js","assets/context-model-CokrgEUq.js","assets/transient-events-nTLhMBND.js","assets/useSeatsRefresh-Co1CnxLc.js","assets/Button-D90dzI_o.js","assets/icons-D1sYbCTQ.js","assets/verse-icons-S56hIiXS.js","assets/command-catalog-BIntSa9l.js","assets/AutonomyOffState-CEPSZToP.js","assets/surface-data-Dj71tdD-.js","assets/control-queries-B9K-wmcB.js","assets/mutations-DQPbFdRJ.js","assets/nav-0dOYe2rJ.js","assets/clipboard-DkZdqlxf.js","assets/authority-model-79SeuKlJ.js","assets/primitives-2A5Eq8FQ.js","assets/focus-trap-CtI1SlMX.js","assets/Dialog-D3msQlCj.js","assets/Epistemic-DMr18muX.js","assets/StatusBadge-CXsYqmdU.js","assets/RefreshIndicator-DO9ibnSq.js","assets/Segmented-CGh_-tBb.js","assets/EmptyState-D2IRy3Cg.js","assets/Meter-CMj-VafN.js","assets/Slider-KVoJLDD6.js","assets/Switch-9NtO_6Lj.js","assets/Sheet-BZ2AG4Eo.js","assets/Select-CWnmUzs3.js","assets/Input-D_KRJA9V.js","assets/usage-queries-AdjEyEtn.js","assets/copy-setup-XMgCC5f8.js","assets/global-BlI2BYa1.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.css","assets/Tag-D0rAEciH.css","assets/CapacityStrip-Cc28CyWk.css","assets/Button-DrnKsvnQ.css","assets/AutonomyOffState-CmSSTHVe.css","assets/Dialog-tQ8kFulD.css","assets/Epistemic-OaGnEJkn.css","assets/StatusBadge-BVi0IBb9.css","assets/RefreshIndicator-CVv22U_j.css","assets/Segmented-BnjHbKzH.css","assets/EmptyState-B3YUPGaa.css","assets/Meter-CYt9KpM0.css","assets/Slider-AgAdMFpo.css","assets/Switch-CU044EaE.css","assets/Sheet-ChxlNivX.css","assets/Select-DSu5ghId.css","assets/Input-BQ3PR065.css","assets/OnboardingFlow-HUNQGQuU.css"])))=>i.map(i=>d[i]);
2
+ import{a as e,c as t,n,t as r}from"./index-DZ-UQ7v8.js";import{t as i}from"./useOnboarding-C_Fpe_sH.js";var a=t(e(),1),o=n(),s=(0,a.lazy)(()=>r(()=>import(`./OnboardingFlow-Cy9BA9eR.js`).then(e=>({default:e.OnboardingFlow})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63])));function c(){return i().open?(0,o.jsx)(s,{}):null}export{c as OnboardingGate};
3
+ //# sourceMappingURL=OnboardingGate-BXpNFoLt.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":";6HAcM,KAAiB,kBAAW,OAAO,+BAAsB,CAAC,KAAM,IAAO,CAAE,QAAS,EAAE,cAAe,EAAE,2MAAC,EAE5G,SAAgB,GAAiB,CAE/B,OADmB,EACZ,EAAW,MAAO,SAAC,EAAD,CAAiB,GAAI,IAChD","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/onboarding/OnboardingGate.tsx"],"sourcesContent":["/**\n * routes/verse/onboarding/OnboardingGate.tsx — whether the first-run tour is\n * on screen, and its chunk while it is.\n *\n * The shell mounts this lazily (VerseApp), so neither the tour's store nor\n * the tour itself is chat first-paint critical JS: the chip is a docked\n * corner affordance that asks for nothing, drawn a beat after the shell\n * (exactly as before, when the flow's own chunk already arrived after first\n * paint). Settings ▸ Replay reopens it through the same store, which this\n * gate is subscribed to for the life of the shell.\n */\nimport { lazy } from 'react';\nimport { useOnboarding } from './useOnboarding.js';\n\nconst OnboardingFlow = lazy(() => import('./OnboardingFlow.js').then((m) => ({ default: m.OnboardingFlow })));\n\nexport function OnboardingGate() {\n const onboarding = useOnboarding();\n return onboarding.open ? <OnboardingFlow /> : null;\n}\n"],"file":"OnboardingGate-C4VXn7BJ.js"}
1
+ {"version":3,"mappings":";6HAcM,KAAiB,kBAAW,OAAO,+BAAsB,CAAC,KAAM,IAAO,CAAE,QAAS,EAAE,cAAe,EAAE,2MAAC,EAE5G,SAAgB,GAAiB,CAE/B,OADmB,EACZ,EAAW,MAAO,SAAC,EAAD,CAAiB,GAAI,IAChD","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/onboarding/OnboardingGate.tsx"],"sourcesContent":["/**\n * routes/verse/onboarding/OnboardingGate.tsx — whether the first-run tour is\n * on screen, and its chunk while it is.\n *\n * The shell mounts this lazily (VerseApp), so neither the tour's store nor\n * the tour itself is chat first-paint critical JS: the chip is a docked\n * corner affordance that asks for nothing, drawn a beat after the shell\n * (exactly as before, when the flow's own chunk already arrived after first\n * paint). Settings ▸ Replay reopens it through the same store, which this\n * gate is subscribed to for the life of the shell.\n */\nimport { lazy } from 'react';\nimport { useOnboarding } from './useOnboarding.js';\n\nconst OnboardingFlow = lazy(() => import('./OnboardingFlow.js').then((m) => ({ default: m.OnboardingFlow })));\n\nexport function OnboardingGate() {\n const onboarding = useOnboarding();\n return onboarding.open ? <OnboardingFlow /> : null;\n}\n"],"file":"OnboardingGate-BXpNFoLt.js"}
@@ -0,0 +1,2 @@
1
+ import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";import{N as r,i,k as a,l as o,o as s}from"./global-CMNW_dqn.js";import{L as c,R as l,Xt as ee,Yt as u,kt as te,nn as d}from"./VerseConsoleApp-CWU6R3By.js";import{t as f}from"./MessageMarkdown-DFvk06qG.js";import{t as ne}from"./Segmented-CGh_-tBb.js";import{n as p,t as m}from"./Button-D90dzI_o.js";import{C as h,c as re,g as ie}from"./icons-D1sYbCTQ.js";import{t as g}from"./EmptyState-D2IRy3Cg.js";import{a as ae,c as oe,d as se,i as ce,l as le,n as ue,o as de,s as _,t as fe}from"./terminal-icons-CoRZq9iO.js";import{t as pe}from"./pane-chrome.module-D7o-fVd0.js";var v=t(e(),1),y=`/api/verse/preview/ticket`;function b(e){return new URLSearchParams(e).toString()}var x={targets:(e,t)=>o(`${ee}?${b({sessionId:e})}`,t),ticket:(e,t)=>o(`${y}?${b({sessionId:e,path:t})}`),text:async(e,t)=>{let n=`${u}?${b({sessionId:e,path:t})}`,i=await fetch(n,{credentials:`same-origin`,headers:{"x-ashlr-read-client":a()}});if(i.status===401)throw r(),new s(`Read session expired.`,401,n);if(!i.ok)throw new s(`GET ${n} failed (HTTP ${i.status}).`,i.status,n);return i.text()}};function S(e){return e.port||(e.protocol===`https:`?`443`:`80`)}function C(e,t){let n=e.trim();if(n.length===0||n.length>2048||/\s/.test(n))return{kind:`invalid`};let r=n;if(/^:?\d{2,5}$/.test(n))r=`http://localhost:${n.replace(`:`,``)}/`;else if(/^(?:localhost|127\.0\.0\.1)(?::\d{1,5})?(?:[/?#].*)?$/i.test(n))r=`http://${n}`;else if(!/^[a-z][a-z0-9+.-]*:/i.test(n)){if(!/^[\w-]+(?:\.[\w-]+)+(?::\d{1,5})?(?:[/?#].*)?$/.test(n))return{kind:`invalid`};r=`https://${n}`}let i;try{i=new URL(r)}catch{return{kind:`invalid`}}if(i.protocol!==`http:`&&i.protocol!==`https:`)return{kind:`invalid`};if(d(i.href)){let e=null;try{e=new URL(t)}catch{e=null}return e&&(e.hostname===`localhost`||e.hostname===`127.0.0.1`)&&S(e)===S(i)?{kind:`self`,url:i.href}:{kind:`loopback`,url:i.href}}return i.username||i.password?{kind:`invalid`}:{kind:`external`,url:i.href}}function w(e){try{let t=new URL(e),n=t.pathname===`/`?``:t.pathname;return`${t.host}${n}${t.search}`}catch{return e}}function T(e){return!Number.isFinite(e)||e<0?`—`:e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(+(e<10240))} KB`:`${(e/1048576).toFixed(1)} MB`}var E={pane:`_pane_k6hui_8`,strip:`_strip_k6hui_19`,tabs:`_tabs_k6hui_28`,tab:`_tab_k6hui_28`,tabButton:`_tabButton_k6hui_60`,tabClose:`_tabClose_k6hui_78`,noticeClose:`_noticeClose_k6hui_79`,external:`_external_k6hui_80`,tabTitle:`_tabTitle_k6hui_85`,newTab:`_newTab_k6hui_118`,toolbar:`_toolbar_k6hui_126`,nav:`_nav_k6hui_128`,addressForm:`_addressForm_k6hui_134`,address:`_address_k6hui_134`,addressNote:`_addressNote_k6hui_177`,notice:`_notice_k6hui_79`,waiting:`_waiting_k6hui_179`,waitingText:`_waitingText_k6hui_201`,pulse:`_pulse_k6hui_208`,body:`_body_k6hui_234`,loading:`_loading_k6hui_243`,stage:`_stage_k6hui_250`,frame:`_frame_k6hui_262`,frameHint:`_frameHint_k6hui_278`,imageStage:`_imageStage_k6hui_291`,image:`_image_k6hui_291`,markdown:`_markdown_k6hui_308`,launcher:`_launcher_k6hui_316`,section:`_section_k6hui_322`,sectionTitle:`_sectionTitle_k6hui_328`,muted:`_muted_k6hui_339`,rows:`_rows_k6hui_347`,row:`_row_k6hui_347`,dot:`_dot_k6hui_364`,fileIcon:`_fileIcon_k6hui_376`,rowMain:`_rowMain_k6hui_378`,rowTitle:`_rowTitle_k6hui_385`,rowMeta:`_rowMeta_k6hui_395`,rowCommand:`_rowCommand_k6hui_405`},D=n(),me={api:x,origin:()=>window.location.origin,now:()=>Date.now()},he=12e4,ge=2e3,_e=5e3,O=`ashlr.verse.preview.v1:`,k={"launch-json":`launch.json`,"package-json":`package.json`,listening:`running`},ve={html:`HTML`,md:`Markdown`,svg:`SVG`,image:`Image`,pdf:`PDF`},A=0,j=0,M=()=>`p${++j}`;function N(){A=0,j=0}function P(e){let t=e.toLowerCase().slice(e.lastIndexOf(`.`));return t===`.html`||t===`.htm`?`html`:t===`.md`||t===`.markdown`?`md`:t===`.svg`?`svg`:t===`.pdf`?`pdf`:[`.png`,`.jpg`,`.jpeg`,`.gif`,`.webp`,`.avif`,`.bmp`,`.ico`].includes(t)?`image`:null}function F(e){return e.slice(e.lastIndexOf(`/`)+1)||e}function ye(e){return e.kind===`launcher`?`New tab`:e.kind===`url`?w(e.history[e.index]??``):F(e.path)}function be(e){return e?.kind===`url`?e.history[e.index]??null:null}function xe(e,t){try{let n=localStorage.getItem(`${O}${e}`);if(!n)return null;let r=JSON.parse(n),i=[],a=null;return Array.isArray(r.tabs)&&r.tabs.slice(0,12).forEach((e,n)=>{if(!e||typeof e!=`object`)return;let o=e,s=M();if(o.url&&typeof o.url==`string`&&C(o.url,t).kind===`loopback`)i.push({id:s,kind:`url`,history:[o.url],index:0,reloadKey:0});else if(typeof o.path==`string`){let e=P(o.path);if(e)i.push({id:s,kind:`artifact`,path:o.path,artifactKind:e,reloadKey:0});else return}else return;r.active===n&&(a=s)}),{tabs:i,activeId:a??i.at(-1)?.id??null,device:r.device===`phone`?`phone`:`desktop`}}catch{return null}}function Se(e,t,n,r){try{let i=t.filter(e=>e.kind!==`launcher`);localStorage.setItem(`${O}${e}`,JSON.stringify({tabs:i.map(e=>e.kind===`url`?{url:e.history[e.index]}:e.kind===`artifact`?{path:e.path}:{}),active:i.findIndex(e=>e.id===n),device:r}))}catch{}}function I({sessionId:e,roots:t,request:n,onOpenTerminal:r,visible:i,deps:a}){let o=(0,v.useMemo)(()=>({...me,...a}),[a]),ee=l(),u=i&&ee,d=te().compact,[f]=(0,v.useState)(()=>xe(e,o.origin())),[g,_]=(0,v.useState)(()=>f?.tabs??[]),[y,b]=(0,v.useState)(()=>f?.activeId??null),[x,S]=(0,v.useState)(()=>f?.device??`desktop`),[T,he]=(0,v.useState)(e),[O,k]=(0,v.useState)(null),[ve,j]=(0,v.useState)(null),[N,F]=(0,v.useState)(``),[I,L]=(0,v.useState)(null),[R,z]=(0,v.useState)(null),[Ee,B]=(0,v.useState)(null),[V,H]=(0,v.useState)(()=>new Map),[De,Oe]=(0,v.useState)(()=>o.now()),U=(0,v.useRef)(!0),W=(0,v.useRef)(new Map),ke=(0,v.useRef)(null);if(T!==e){let t=xe(e,o.origin());he(e),_(t?.tabs??[]),b(t?.activeId??null),k(null),z(null),B(null)}let G=g.find(e=>e.id===y)??null,K=be(G),q=!G||G.kind===`launcher`;(0,v.useEffect)(()=>(U.current=!0,()=>{U.current=!1}),[]),(0,v.useEffect)(()=>{T===e&&Se(e,g,y,x)},[T,e,g,y,x]),(0,v.useEffect)(()=>{F(G?.kind===`url`?G.history[G.index]??``:G?.kind===`artifact`?G.path:``),L(null)},[G]);let J=(0,v.useCallback)(async()=>{try{let t=await o.api.targets(e);return U.current?(k(t),j(null),t):null}catch(e){return U.current&&j(e instanceof s&&e.detail?e.detail:`Dev servers and files could not be listed.`),null}},[o.api,e]),Ae=(0,v.useRef)(null);(0,v.useEffect)(()=>{u&&Ae.current!==e&&(Ae.current=e,J())},[u,e,J]),c(()=>{J()},R?ge:_e,{enabled:i&&(R!==null||q)});let Y=(0,v.useCallback)((e,t={})=>{B(null);let n=g.find(e=>e.id===y);if(!t.newTab&&n?.kind===`launcher`){_(g.map(t=>t.id===n.id?{id:t.id,kind:`url`,history:[e],index:0,reloadKey:0}:t));return}let r=g.find(t=>t.kind===`url`&&t.history[t.index]===e);if(r&&!t.newTab){b(r.id);return}let i=M();_([...g,{id:i,kind:`url`,history:[e],index:0,reloadKey:0}]),b(i)},[g,y]),je=(0,v.useCallback)(e=>{if(!G||G.kind!==`url`){Y(e);return}_(t=>t.map(t=>{if(t.id!==G.id||t.kind!==`url`)return t;let n=[...t.history.slice(0,t.index+1),e].slice(-50);return{...t,history:n,index:n.length-1}}))},[G,Y]),X=(0,v.useCallback)((e,t)=>{B(null);let n=g.find(t=>t.kind===`artifact`&&t.path===e);if(n){b(n.id);return}let r=g.find(e=>e.id===y);if(r?.kind===`launcher`){_(g.map(n=>n.id===r.id?{id:n.id,kind:`artifact`,path:e,artifactKind:t,reloadKey:0}:n));return}let i=M();_([...g,{id:i,kind:`artifact`,path:e,artifactKind:t,reloadKey:0}]),b(i)},[g,y]),Me=()=>{let e=g.find(e=>e.kind===`launcher`);if(e)b(e.id);else{let e=M();_(t=>[...t,{id:e,kind:`launcher`}]),b(e)}J()},Ne=e=>{let t=g.findIndex(t=>t.id===e.id),n=g.filter(t=>t.id!==e.id);_(n),H(t=>{let n=new Map(t);for(let r of t.keys())r.startsWith(`${e.id}:`)&&n.delete(r);return n}),y===e.id&&b((n[t]??n[t-1]??null)?.id??null)},Pe=(e,t)=>{let n=-1;if(e.key===`ArrowRight`?n=(t+1)%g.length:e.key===`ArrowLeft`?n=(t-1+g.length)%g.length:e.key===`Home`?n=0:e.key===`End`&&(n=g.length-1),n<0)return;e.preventDefault();let r=g[n];b(r.id),W.current.get(r.id)?.focus()},Fe=(0,v.useCallback)(e=>{B(null),r({root:e.root,devServerId:e.id}),z({server:e,since:o.now()})},[o,r]),Z=(0,v.useCallback)(e=>{e.running?Y(e.url):Fe(e)},[Y,Fe]);(0,v.useEffect)(()=>{if(R&&O){if(O.devServers.find(e=>e.running&&(e.id===R.server.id||e.port===R.server.port))){z(null),Y(R.server.url);return}o.now()-R.since>12e4&&(z(null),B(`Nothing answered on port ${R.server.port} within 2 minutes. Check the terminal for errors.`))}},[O,R,Y,o,De]),(0,v.useEffect)(()=>{if(!R)return;let e=setInterval(()=>Oe(o.now()),1e3);return()=>clearInterval(e)},[R,o]);let Q=(0,v.useCallback)(async e=>{if(e.url){let t=C(e.url,o.origin());t.kind===`loopback`?Y(t.url):L(t);return}if(e.artifactPath){let t=O?.artifacts.find(t=>t.path===e.artifactPath)?.kind??P(e.artifactPath);t?X(e.artifactPath,t):B(`That file cannot be previewed.`);return}if(e.devServerId){let t=(await J()??O)?.devServers.find(t=>t.id===e.devServerId);t?Z(t):B(`That dev server is no longer listed for this chat.`)}},[o,X,Z,Y,J,O]);(0,v.useEffect)(()=>{!n||n.nonce<=A||(A=n.nonce,Q(n))},[n,Q]);let $=G?.kind===`artifact`?`${G.id}:${G.reloadKey}`:null;(0,v.useEffect)(()=>{if(!u||!G||G.kind!==`artifact`||!$||V.has($))return;let t=G,n=$;H(e=>new Map(e).set(n,{status:`loading`})),(t.artifactKind===`md`?o.api.text(e,t.path).then(e=>({status:`text`,text:e})):o.api.ticket(e,t.path).then(e=>({status:`frame`,src:e.url}))).then(e=>{U.current&&H(t=>new Map(t).set(n,e))},e=>{let t=e instanceof s&&e.status===404?`This file is no longer in the chat's folder.`:e instanceof s&&e.status===413?`This file is larger than 5 MB, too large to preview.`:`This file could not be loaded.`;U.current&&H(e=>new Map(e).set(n,{status:`error`,message:t}))})},[u,G,$,V,o.api,e]);let Ie=e=>{G&&G.kind===`url`&&_(t=>t.map(t=>t.id===G.id&&t.kind===`url`?{...t,index:Math.min(t.history.length-1,Math.max(0,t.index+e))}:t))},Le=()=>{if(G){if(G.kind===`launcher`){J();return}_(e=>e.map(e=>e.id===G.id&&e.kind!==`launcher`?{...e,reloadKey:e.reloadKey+1}:e))}},Re=e=>{e.preventDefault();let t=C(N,o.origin());if(t.kind===`loopback`){L(null),G?.kind===`url`?je(t.url):Y(t.url);return}L(t)},ze=e=>{e.key===`Escape`&&(e.preventDefault(),F(K??(G?.kind===`artifact`?G.path:``)),L(null),e.currentTarget.blur())},Be=G?.kind===`url`&&G.index>0,Ve=G?.kind===`url`&&G.index<G.history.length-1;return(0,D.jsxs)(`div`,{className:E.pane,"data-compact":d||void 0,children:[(0,D.jsxs)(`div`,{className:E.strip,children:[(0,D.jsx)(`div`,{className:E.tabs,role:`tablist`,"aria-label":`Previews`,children:g.map((e,t)=>{let n=e.id===y,r=ye(e);return(0,D.jsxs)(`div`,{className:E.tab,"data-selected":n||void 0,role:`presentation`,children:[(0,D.jsxs)(`button`,{ref:t=>{t?W.current.set(e.id,t):W.current.delete(e.id)},type:`button`,role:`tab`,id:`preview-tab-${e.id}`,"aria-selected":n,"aria-controls":`preview-panel`,tabIndex:n?0:-1,className:E.tabButton,title:e.kind===`url`?e.history[e.index]:e.kind===`artifact`?e.path:`Choose what to preview`,onClick:()=>b(e.id),onKeyDown:e=>Pe(e,t),children:[e.kind===`artifact`?(0,D.jsx)(ae,{size:12}):e.kind===`url`?(0,D.jsx)(se,{size:12}):(0,D.jsx)(oe,{size:12}),(0,D.jsx)(`span`,{className:E.tabTitle,children:r})]}),(0,D.jsx)(`button`,{type:`button`,className:E.tabClose,"aria-label":`Close preview ${r}`,title:`Close`,onClick:()=>Ne(e),children:(0,D.jsx)(h,{size:12})})]},e.id)})}),(0,D.jsx)(p,{variant:`ghost`,size:`sm`,icon:(0,D.jsx)(ie,{}),"aria-label":`New preview tab`,title:`New preview tab`,className:E.newTab,onClick:Me})]}),(0,D.jsxs)(`div`,{className:`${pe.header} ${E.toolbar}`,children:[(0,D.jsxs)(`div`,{className:E.nav,children:[(0,D.jsx)(p,{variant:`ghost`,size:`sm`,icon:(0,D.jsx)(fe,{}),"aria-label":`Back`,title:`Back`,disabled:!Be,onClick:()=>Ie(-1)}),(0,D.jsx)(p,{variant:`ghost`,size:`sm`,icon:(0,D.jsx)(ue,{}),"aria-label":`Forward`,title:`Forward`,disabled:!Ve,onClick:()=>Ie(1)}),(0,D.jsx)(p,{variant:`ghost`,size:`sm`,icon:(0,D.jsx)(le,{}),"aria-label":q?`Refresh the list`:`Reload`,title:q?`Refresh the list`:`Reload`,disabled:!G&&q&&O===null,onClick:Le})]}),(0,D.jsx)(`form`,{className:E.addressForm,onSubmit:Re,role:`search`,"aria-label":`Preview address`,children:(0,D.jsx)(`input`,{ref:ke,className:E.address,value:N,onChange:e=>F(e.target.value),onKeyDown:ze,onFocus:e=>e.currentTarget.select(),placeholder:`localhost:5173`,"aria-label":`Address`,spellCheck:!1,autoCapitalize:`off`,autoCorrect:`off`,inputMode:`url`,readOnly:G?.kind===`artifact`})}),(0,D.jsxs)(`div`,{className:pe.actions,children:[d?null:(0,D.jsx)(ne,{"aria-label":`Frame width`,size:`sm`,value:x,onChange:S,options:[{value:`desktop`,label:(0,D.jsx)(ce,{size:14}),ariaLabel:`Desktop width`},{value:`phone`,label:(0,D.jsx)(de,{size:14}),ariaLabel:`375 px width`}]}),K?(0,D.jsx)(`a`,{className:E.external,href:K,target:`_blank`,rel:`noopener noreferrer`,"aria-label":`Open in browser`,title:`Open in browser`,children:(0,D.jsx)(re,{})}):(0,D.jsx)(`span`,{className:E.external,"data-placeholder":`true`,"aria-hidden":`true`})]})]}),I?(0,D.jsx)(Ce,{note:I,onDismiss:()=>L(null)}):null,R?(0,D.jsxs)(`div`,{className:E.waiting,role:`status`,children:[(0,D.jsx)(`span`,{className:E.pulse,"aria-hidden":`true`}),(0,D.jsxs)(`span`,{className:E.waitingText,children:[`Starting `,(0,D.jsx)(`code`,{children:R.server.command??R.server.label}),` — waiting for `,w(R.server.url),` · `,Math.max(0,Math.round((De-R.since)/1e3)),`s`]}),(0,D.jsx)(m,{size:`sm`,variant:`ghost`,onClick:()=>z(null),children:`Stop waiting`})]}):null,Ee?(0,D.jsxs)(`div`,{className:E.notice,role:`alert`,children:[(0,D.jsx)(`span`,{children:Ee}),(0,D.jsx)(`button`,{type:`button`,className:E.noticeClose,"aria-label":`Dismiss`,title:`Dismiss`,onClick:()=>B(null),children:(0,D.jsx)(h,{size:12})})]}):null,(0,D.jsx)(`div`,{className:E.body,id:`preview-panel`,role:`tabpanel`,"aria-labelledby":G?`preview-tab-${G.id}`:void 0,children:q?(0,D.jsx)(Te,{targets:O,error:ve,roots:t,onOpenServer:Z,onOpenArtifact:e=>X(e.path,e.kind),onRetry:()=>void J(),onOpenTerminal:()=>r(t[0]?{root:t[0]}:{}),waitingId:R?.server.id??null}):G?.kind===`url`?(0,D.jsxs)(`div`,{className:E.stage,"data-device":x,children:[(0,D.jsx)(`iframe`,{className:E.frame,src:G.history[G.index],title:`Preview of ${ye(G)}`,sandbox:`allow-scripts allow-same-origin allow-forms allow-popups allow-modals allow-downloads`,referrerPolicy:`no-referrer`},`${G.id}:${G.index}:${G.reloadKey}`),(0,D.jsxs)(`p`,{className:E.frameHint,children:[`Blank page? Some servers refuse to be framed.`,` `,(0,D.jsx)(`a`,{href:G.history[G.index],target:`_blank`,rel:`noopener noreferrer`,children:`Open in browser ↗`})]})]}):G?.kind===`artifact`?(0,D.jsx)(we,{tab:G,content:$?V.get($)??{status:`loading`}:{status:`loading`},device:x,onRetry:Le}):null})]})}function Ce({note:e,onDismiss:t}){return(0,D.jsxs)(`div`,{className:E.addressNote,role:`status`,children:[e.kind===`external`?(0,D.jsxs)(`span`,{children:[`Only local dev servers open here.`,` `,(0,D.jsx)(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,children:`Open in browser ↗`})]}):e.kind===`self`?(0,D.jsx)(`span`,{children:`That address is Verse itself.`}):(0,D.jsxs)(`span`,{children:[`Enter a local address, like `,(0,D.jsx)(`code`,{children:`localhost:5173`}),`.`]}),(0,D.jsx)(`button`,{type:`button`,className:E.noticeClose,"aria-label":`Dismiss`,title:`Dismiss`,onClick:t,children:(0,D.jsx)(h,{size:12})})]})}function we({tab:e,content:t,device:n,onRetry:r}){return t.status===`loading`?(0,D.jsxs)(`div`,{className:E.loading,"aria-busy":`true`,children:[(0,D.jsx)(i,{width:`50%`}),(0,D.jsx)(i,{width:`80%`})]}):t.status===`error`?(0,D.jsx)(g,{compact:!0,tone:`error`,title:`Preview unavailable`,body:t.message,action:(0,D.jsx)(m,{size:`sm`,variant:`subtle`,onClick:r,children:`Try again`})}):t.status===`text`?(0,D.jsx)(`article`,{className:E.markdown,"aria-label":e.path,children:(0,D.jsx)(f,{text:t.text})}):e.artifactKind===`image`?(0,D.jsx)(`div`,{className:E.imageStage,children:(0,D.jsx)(`img`,{className:E.image,src:t.src,alt:F(e.path)})}):(0,D.jsx)(`div`,{className:E.stage,"data-device":e.artifactKind===`pdf`?`desktop`:n,children:(0,D.jsx)(`iframe`,{className:E.frame,src:t.src,title:`Preview of ${e.path}`,...e.artifactKind===`pdf`?{}:{sandbox:`allow-scripts`},referrerPolicy:`no-referrer`},t.src)})}function Te({targets:e,error:t,roots:n,onOpenServer:r,onOpenArtifact:a,onRetry:o,onOpenTerminal:s,waitingId:c}){if(!e)return t?(0,D.jsx)(g,{compact:!0,tone:`error`,title:`Could not list what to preview`,body:t,action:(0,D.jsx)(m,{size:`sm`,variant:`subtle`,onClick:o,children:`Try again`})}):(0,D.jsxs)(`div`,{className:E.loading,"aria-busy":`true`,children:[(0,D.jsx)(i,{width:`35%`}),(0,D.jsx)(i,{width:`70%`}),(0,D.jsx)(i,{width:`60%`})]});let l=n.length>1;return e.devServers.length===0&&e.artifacts.length===0?(0,D.jsx)(g,{compact:!0,icon:(0,D.jsx)(oe,{size:20}),title:`Nothing to preview yet`,body:`Start a dev server in the terminal, or ask for an HTML report. Local servers and the files this chat writes show up here.`,action:(0,D.jsx)(m,{size:`sm`,variant:`subtle`,onClick:s,children:`Open a terminal`})}):(0,D.jsxs)(`div`,{className:E.launcher,children:[(0,D.jsxs)(`section`,{className:E.section,"aria-labelledby":`preview-servers-title`,children:[(0,D.jsx)(`h3`,{className:E.sectionTitle,id:`preview-servers-title`,children:`Dev servers`}),e.devServers.length===0?(0,D.jsxs)(`p`,{className:E.muted,children:[`No dev server found in this chat's folders. Add one to `,(0,D.jsx)(`code`,{children:`.claude/launch.json`}),`, or start it in the terminal.`]}):(0,D.jsx)(`ul`,{className:E.rows,children:e.devServers.map(e=>(0,D.jsxs)(`li`,{className:E.row,children:[(0,D.jsx)(`span`,{className:E.dot,"data-running":e.running||void 0,"aria-hidden":`true`}),(0,D.jsxs)(`span`,{className:E.rowMain,children:[(0,D.jsx)(`span`,{className:E.rowTitle,title:e.label,children:e.label}),(0,D.jsxs)(`span`,{className:E.rowMeta,title:`${w(e.url)} · ${e.running?`running`:`stopped`} · ${k[e.source]}${l?` · ${e.root}`:``}`,children:[w(e.url),` · `,e.running?`running`:`stopped`,` · `,k[e.source],l?` · ${F(e.root)}`:``]}),!e.running&&e.command&&e.command!==e.label?(0,D.jsx)(`code`,{className:E.rowCommand,title:e.command,children:e.command}):null]}),e.running?(0,D.jsx)(m,{size:`sm`,variant:`subtle`,onClick:()=>r(e),"aria-label":`Open ${e.label}`,children:`Open`}):(0,D.jsx)(m,{size:`sm`,variant:`subtle`,icon:(0,D.jsx)(_,{size:12}),busy:c===e.id,onClick:()=>r(e),"aria-label":`Start ${e.label}`,title:`Runs ${e.command??e.label} in a terminal tab`,children:`Start`})]},e.id))})]}),(0,D.jsxs)(`section`,{className:E.section,"aria-labelledby":`preview-files-title`,children:[(0,D.jsx)(`h3`,{className:E.sectionTitle,id:`preview-files-title`,children:`This chat's files`}),e.artifacts.length===0?(0,D.jsx)(`p`,{className:E.muted,children:`Ask the chat for a report or a page: HTML, Markdown, SVG, images and PDFs it writes appear here.`}):(0,D.jsx)(`ul`,{className:E.rows,children:e.artifacts.map(e=>{let t=e.bytes>5242880;return(0,D.jsxs)(`li`,{className:E.row,children:[(0,D.jsx)(ae,{size:14,className:E.fileIcon}),(0,D.jsxs)(`span`,{className:E.rowMain,children:[(0,D.jsx)(`span`,{className:E.rowTitle,title:e.path,children:e.path}),(0,D.jsxs)(`span`,{className:E.rowMeta,children:[ve[e.kind],` · `,T(e.bytes)]})]}),(0,D.jsx)(m,{size:`sm`,variant:`subtle`,disabled:t,title:t?`Larger than 5 MB`:void 0,onClick:()=>a(e),"aria-label":`Open ${e.path}`,children:`Open`})]},e.path)})})]})]})}export{he as PREVIEW_START_TIMEOUT_MS,I as PreviewPane,N as resetPreviewPaneForTest};
2
+ //# sourceMappingURL=PreviewPane-COid5A0f.js.map