@ashlr/hub 3.13.0 → 3.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +74 -0
- package/dist/authority-surface.json +204 -124
- package/dist/build-identity.json +2 -2
- package/dist/cli/authority.js +112 -18
- package/dist/cli/authority.js.map +1 -1
- package/dist/cli/comms.d.ts +33 -19
- package/dist/cli/comms.js +128 -151
- package/dist/cli/comms.js.map +1 -1
- package/dist/cli/completions.js +1 -1
- package/dist/cli/completions.js.map +1 -1
- package/dist/cli/daemon.js +29 -0
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/director.d.ts +8 -12
- package/dist/cli/director.js +17 -52
- package/dist/cli/director.js.map +1 -1
- package/dist/cli/fleet.js +4 -1
- package/dist/cli/fleet.js.map +1 -1
- package/dist/cli/help.js +1 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/leader.d.ts +27 -3
- package/dist/cli/leader.js +253 -4
- package/dist/cli/leader.js.map +1 -1
- package/dist/core/authority/server-enforcement.d.ts +110 -0
- package/dist/core/authority/server-enforcement.js +260 -0
- package/dist/core/authority/server-enforcement.js.map +1 -0
- package/dist/core/authority/standing-grant.d.ts +24 -4
- package/dist/core/authority/standing-grant.js +19 -3
- package/dist/core/authority/standing-grant.js.map +1 -1
- package/dist/core/cloud/timeline.js +13 -7
- package/dist/core/cloud/timeline.js.map +1 -1
- package/dist/core/comms/change-digest.d.ts +130 -0
- package/dist/core/comms/change-digest.js +451 -0
- package/dist/core/comms/change-digest.js.map +1 -0
- package/dist/core/comms/director-prompt.d.ts +4 -5
- package/dist/core/comms/director-prompt.js +4 -71
- package/dist/core/comms/director-prompt.js.map +1 -1
- package/dist/core/comms/director.d.ts +24 -61
- package/dist/core/comms/director.js +29 -382
- package/dist/core/comms/director.js.map +1 -1
- package/dist/core/comms/dispatch.d.ts +37 -12
- package/dist/core/comms/dispatch.js +244 -177
- package/dist/core/comms/dispatch.js.map +1 -1
- package/dist/core/comms/elon-dialogue.d.ts +23 -15
- package/dist/core/comms/elon-dialogue.js +36 -307
- package/dist/core/comms/elon-dialogue.js.map +1 -1
- package/dist/core/comms/fleet-pulse.js +4 -7
- package/dist/core/comms/fleet-pulse.js.map +1 -1
- package/dist/core/comms/handlers.d.ts +10 -6
- package/dist/core/comms/handlers.js +14 -48
- package/dist/core/comms/handlers.js.map +1 -1
- package/dist/core/comms/migrations.d.ts +47 -0
- package/dist/core/comms/migrations.js +125 -0
- package/dist/core/comms/migrations.js.map +1 -0
- package/dist/core/comms/requests.d.ts +32 -5
- package/dist/core/comms/requests.js +101 -5
- package/dist/core/comms/requests.js.map +1 -1
- package/dist/core/comms/telegram-channel.d.ts +104 -0
- package/dist/core/comms/telegram-channel.js +622 -0
- package/dist/core/comms/telegram-channel.js.map +1 -0
- package/dist/core/comms/telegram-thread-map.d.ts +56 -0
- package/dist/core/comms/telegram-thread-map.js +144 -0
- package/dist/core/comms/telegram-thread-map.js.map +1 -0
- package/dist/core/daemon/capacity-publisher.d.ts +8 -1
- package/dist/core/daemon/capacity-publisher.js +40 -2
- package/dist/core/daemon/capacity-publisher.js.map +1 -1
- package/dist/core/daemon/loop.js +18 -4
- package/dist/core/daemon/loop.js.map +1 -1
- package/dist/core/daemon/tick-deadline.d.ts +44 -0
- package/dist/core/daemon/tick-deadline.js +83 -0
- package/dist/core/daemon/tick-deadline.js.map +1 -0
- package/dist/core/daemon/tick-hooks.d.ts +7 -0
- package/dist/core/daemon/tick-hooks.js.map +1 -1
- package/dist/core/daemon/tick-progress.d.ts +39 -0
- package/dist/core/daemon/tick-progress.js +194 -0
- package/dist/core/daemon/tick-progress.js.map +1 -0
- package/dist/core/dashboard.js +3 -1
- package/dist/core/dashboard.js.map +1 -1
- package/dist/core/fleet/fleet-merge-state.d.ts +6 -0
- package/dist/core/fleet/fleet-merge-state.js.map +1 -1
- package/dist/core/fleet/host-merge.d.ts +9 -0
- package/dist/core/fleet/host-merge.js +13 -2
- package/dist/core/fleet/host-merge.js.map +1 -1
- package/dist/core/fleet/merge-gates.d.ts +13 -0
- package/dist/core/fleet/merge-gates.js +14 -0
- package/dist/core/fleet/merge-gates.js.map +1 -1
- package/dist/core/fleet/mirrors.d.ts +162 -6
- package/dist/core/fleet/mirrors.js +1051 -49
- package/dist/core/fleet/mirrors.js.map +1 -1
- package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
- package/dist/core/fleet/standing-merge-pass.js +72 -1
- package/dist/core/fleet/standing-merge-pass.js.map +1 -1
- package/dist/core/fleet/status.d.ts +17 -0
- package/dist/core/fleet/status.js +22 -0
- package/dist/core/fleet/status.js.map +1 -1
- package/dist/core/fleet/tick-hooks-live.d.ts +1 -1
- package/dist/core/fleet/tick-hooks-live.js +13 -3
- package/dist/core/fleet/tick-hooks-live.js.map +1 -1
- package/dist/core/git.d.ts +17 -0
- package/dist/core/git.js +124 -25
- package/dist/core/git.js.map +1 -1
- package/dist/core/goals/open-goals.d.ts +47 -0
- package/dist/core/goals/open-goals.js +33 -0
- package/dist/core/goals/open-goals.js.map +1 -0
- package/dist/core/inbox/merge.d.ts +5 -0
- package/dist/core/inbox/merge.js +58 -2
- package/dist/core/inbox/merge.js.map +1 -1
- package/dist/core/integrations/locus.d.ts +28 -0
- package/dist/core/integrations/locus.js +155 -30
- package/dist/core/integrations/locus.js.map +1 -1
- package/dist/core/integrations/telegram-format.d.ts +40 -0
- package/dist/core/integrations/telegram-format.js +123 -0
- package/dist/core/integrations/telegram-format.js.map +1 -0
- package/dist/core/integrations/telegram.d.ts +60 -4
- package/dist/core/integrations/telegram.js +161 -28
- package/dist/core/integrations/telegram.js.map +1 -1
- package/dist/core/mcp-registry.d.ts +12 -0
- package/dist/core/mcp-registry.js +70 -0
- package/dist/core/mcp-registry.js.map +1 -1
- package/dist/core/observability/rollup.d.ts +12 -10
- package/dist/core/observability/rollup.js +44 -17
- package/dist/core/observability/rollup.js.map +1 -1
- package/dist/core/resources/connection-monitor.d.ts +9 -0
- package/dist/core/resources/connection-monitor.js +19 -9
- package/dist/core/resources/connection-monitor.js.map +1 -1
- package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
- package/dist/core/resources/quota-refresh-lease.js +34 -1
- package/dist/core/resources/quota-refresh-lease.js.map +1 -1
- package/dist/core/routing/budget-api.d.ts +7 -1
- package/dist/core/routing/budget-api.js +56 -2
- package/dist/core/routing/budget-api.js.map +1 -1
- package/dist/core/routing/readiness-types.d.ts +82 -0
- package/dist/core/routing/readiness-types.js +23 -0
- package/dist/core/routing/readiness-types.js.map +1 -0
- package/dist/core/routing/readiness.d.ts +103 -0
- package/dist/core/routing/readiness.js +480 -0
- package/dist/core/routing/readiness.js.map +1 -0
- package/dist/core/sandbox/confine.js +22 -1
- package/dist/core/sandbox/confine.js.map +1 -1
- package/dist/core/sandbox/policy.d.ts +23 -0
- package/dist/core/sandbox/policy.js +100 -0
- package/dist/core/sandbox/policy.js.map +1 -1
- package/dist/core/types.d.ts +13 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
- package/dist/core/usage/frontier-usage.d.ts +20 -2
- package/dist/core/usage/frontier-usage.js +75 -17
- package/dist/core/usage/frontier-usage.js.map +1 -1
- package/dist/core/verse/accounts.d.ts +45 -0
- package/dist/core/verse/accounts.js +246 -17
- package/dist/core/verse/accounts.js.map +1 -1
- package/dist/core/verse/apps-api.js +23 -11
- package/dist/core/verse/apps-api.js.map +1 -1
- package/dist/core/verse/apps.d.ts +11 -9
- package/dist/core/verse/apps.js +2 -2
- package/dist/core/verse/apps.js.map +1 -1
- package/dist/core/verse/authority-api.d.ts +8 -2
- package/dist/core/verse/authority-api.js +40 -5
- package/dist/core/verse/authority-api.js.map +1 -1
- package/dist/core/verse/autonomy-ladder.d.ts +172 -0
- package/dist/core/verse/autonomy-ladder.js +251 -0
- package/dist/core/verse/autonomy-ladder.js.map +1 -0
- package/dist/core/verse/context-fit.js +7 -5
- package/dist/core/verse/context-fit.js.map +1 -1
- package/dist/core/verse/control-api.d.ts +23 -1
- package/dist/core/verse/control-api.js +117 -10
- package/dist/core/verse/control-api.js.map +1 -1
- package/dist/core/verse/fleet-live-api.js +13 -5
- package/dist/core/verse/fleet-live-api.js.map +1 -1
- package/dist/core/verse/folder-io.d.ts +50 -0
- package/dist/core/verse/folder-io.js +142 -0
- package/dist/core/verse/folder-io.js.map +1 -0
- package/dist/core/verse/git-api.js +5 -4
- package/dist/core/verse/git-api.js.map +1 -1
- package/dist/core/verse/git-ops.d.ts +10 -1
- package/dist/core/verse/git-ops.js +18 -2
- package/dist/core/verse/git-ops.js.map +1 -1
- package/dist/core/verse/github-api.d.ts +1 -1
- package/dist/core/verse/github-api.js +5 -4
- package/dist/core/verse/github-api.js.map +1 -1
- package/dist/core/verse/github-repo.js +118 -14
- package/dist/core/verse/github-repo.js.map +1 -1
- package/dist/core/verse/leader-api.d.ts +5 -4
- package/dist/core/verse/leader-api.js +237 -10
- package/dist/core/verse/leader-api.js.map +1 -1
- package/dist/core/verse/local-models.d.ts +10 -0
- package/dist/core/verse/local-models.js +10 -1
- package/dist/core/verse/local-models.js.map +1 -1
- package/dist/core/verse/login-path.d.ts +73 -0
- package/dist/core/verse/login-path.js +123 -14
- package/dist/core/verse/login-path.js.map +1 -1
- package/dist/core/verse/mcp-control-api.js +4 -4
- package/dist/core/verse/mcp-control-api.js.map +1 -1
- package/dist/core/verse/mcp-scope.d.ts +22 -0
- package/dist/core/verse/mcp-scope.js +41 -1
- package/dist/core/verse/mcp-scope.js.map +1 -1
- package/dist/core/verse/mcp-seat-view.d.ts +10 -0
- package/dist/core/verse/mcp-seat-view.js +30 -4
- package/dist/core/verse/mcp-seat-view.js.map +1 -1
- package/dist/core/verse/overnight-api.js +20 -2
- package/dist/core/verse/overnight-api.js.map +1 -1
- package/dist/core/verse/path-guard.d.ts +24 -0
- package/dist/core/verse/path-guard.js +91 -22
- package/dist/core/verse/path-guard.js.map +1 -1
- package/dist/core/verse/preview-api.js +22 -0
- package/dist/core/verse/preview-api.js.map +1 -1
- package/dist/core/verse/projects.d.ts +21 -0
- package/dist/core/verse/projects.js +82 -0
- package/dist/core/verse/projects.js.map +1 -1
- package/dist/core/verse/session-controls-api.js +5 -3
- package/dist/core/verse/session-controls-api.js.map +1 -1
- package/dist/core/verse/session-handoff.d.ts +26 -0
- package/dist/core/verse/session-handoff.js +90 -12
- package/dist/core/verse/session-handoff.js.map +1 -1
- package/dist/core/verse/terminal-api.js +7 -4
- package/dist/core/verse/terminal-api.js.map +1 -1
- package/dist/core/verse/terminal.js +9 -5
- package/dist/core/verse/terminal.js.map +1 -1
- package/dist/core/verse/verse-api.js +81 -27
- package/dist/core/verse/verse-api.js.map +1 -1
- package/dist/core/verse/workspaces.d.ts +51 -0
- package/dist/core/verse/workspaces.js +177 -47
- package/dist/core/verse/workspaces.js.map +1 -1
- package/dist/core/vision/leader-apply.d.ts +40 -0
- package/dist/core/vision/leader-apply.js +101 -30
- package/dist/core/vision/leader-apply.js.map +1 -1
- package/dist/core/vision/leader-cadence.d.ts +114 -0
- package/dist/core/vision/leader-cadence.js +127 -0
- package/dist/core/vision/leader-cadence.js.map +1 -0
- package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
- package/dist/core/vision/leader-goal-evidence.js +36 -0
- package/dist/core/vision/leader-goal-evidence.js.map +1 -0
- package/dist/core/vision/leader-health.d.ts +53 -0
- package/dist/core/vision/leader-health.js +92 -0
- package/dist/core/vision/leader-health.js.map +1 -0
- package/dist/core/vision/leader-operator.d.ts +176 -0
- package/dist/core/vision/leader-operator.js +355 -0
- package/dist/core/vision/leader-operator.js.map +1 -0
- package/dist/core/vision/leader-run-chain.d.ts +41 -0
- package/dist/core/vision/leader-run-chain.js +54 -0
- package/dist/core/vision/leader-run-chain.js.map +1 -0
- package/dist/core/vision/leader-seat-plan.d.ts +68 -0
- package/dist/core/vision/leader-seat-plan.js +93 -0
- package/dist/core/vision/leader-seat-plan.js.map +1 -0
- package/dist/core/vision/leader-seat.d.ts +71 -5
- package/dist/core/vision/leader-seat.js +235 -33
- package/dist/core/vision/leader-seat.js.map +1 -1
- package/dist/core/vision/leader-thread-types.d.ts +104 -0
- package/dist/core/vision/leader-thread-types.js +9 -0
- package/dist/core/vision/leader-thread-types.js.map +1 -0
- package/dist/core/vision/leader-thread.d.ts +138 -0
- package/dist/core/vision/leader-thread.js +926 -0
- package/dist/core/vision/leader-thread.js.map +1 -0
- package/dist/core/vision/leader-types.d.ts +75 -1
- package/dist/core/vision/leader.d.ts +88 -18
- package/dist/core/vision/leader.js +269 -69
- package/dist/core/vision/leader.js.map +1 -1
- package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js → ActionMenu-CIiX2X8w.js} +2 -2
- package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
- package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
- package/dist/core/web/public/next/assets/{Advanced-cVYTAsfB.js.map → Advanced-DHsysoIL.js.map} +1 -1
- package/dist/core/web/public/next/assets/{App-IsaWDsdF.js → App-CMeAocmW.js} +5 -5
- package/dist/core/web/public/next/assets/{App-IsaWDsdF.js.map → App-CMeAocmW.js.map} +1 -1
- package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
- package/dist/core/web/public/next/assets/{AppsSection-DDqeSrty.js.map → AppsSection-DISYnMnc.js.map} +1 -1
- package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
- package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js → AutonomyOffState-CEPSZToP.js} +3 -3
- package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js.map → AutonomyOffState-CEPSZToP.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
- package/dist/core/web/public/next/assets/{AutonomySection-Dwn8UtOy.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
- package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js → BranchBar-BxhdiIpx.js} +2 -2
- package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
- package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js → BudgetControl-C-0KhjRS.js} +2 -2
- package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js.map → BudgetControl-C-0KhjRS.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js → Button-D90dzI_o.js} +2 -2
- package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js.map → Button-D90dzI_o.js.map} +1 -1
- package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js → CapacityStrip-qKDBC65C.js} +2 -2
- package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
- package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
- package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
- package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
- package/dist/core/web/public/next/assets/{ChatSection-C9myY4ei.js.map → ChatSection-DlT4QU6a.js.map} +1 -1
- package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
- package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
- package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
- package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
- package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
- package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
- package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js → DeleteChatDialog-BCfP12GH.js} +2 -2
- package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js → Dialog-D3msQlCj.js} +2 -2
- package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js.map → Dialog-D3msQlCj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js → DiffPane-Ix6hvXlY.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js → DiffViewer-C4WKsCIe.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
- package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
- package/dist/core/web/public/next/assets/{DockHost-BcEq2qaS.js.map → DockHost-aWP7liri.js.map} +1 -1
- package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js → EmptyState-D2IRy3Cg.js} +2 -2
- package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js → Epistemic-DMr18muX.js} +2 -2
- package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js.map → Epistemic-DMr18muX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js → EvidenceTimeline-DXmmz6Fi.js} +2 -2
- package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js.map → EvidenceTimeline-DXmmz6Fi.js.map} +1 -1
- package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
- package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
- package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js → GearTray-Dt-ee32-.js} +2 -2
- package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js.map → GearTray-Dt-ee32-.js.map} +1 -1
- package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
- package/dist/core/web/public/next/assets/{GrowthSection-BvZezOsX.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
- package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js → HandoffDialog-CLJQLe7M.js} +2 -2
- package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js → Input-D_KRJA9V.js} +2 -2
- package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js.map → Input-D_KRJA9V.js.map} +1 -1
- package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
- package/dist/core/web/public/next/assets/{McpSection-nuXer4K-.js.map → McpSection-DGbRcyv8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js → MessageMarkdown-DFvk06qG.js} +3 -3
- package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js → Meter-CMj-VafN.js} +2 -2
- package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js.map → Meter-CMj-VafN.js.map} +1 -1
- package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
- package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
- package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
- package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
- package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js → NeedsYouList-CCsijdWt.js} +2 -2
- package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
- package/dist/core/web/public/next/assets/{NewChatDialog-BqFTWgHU.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
- package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js → OnboardingFlow-Cy9BA9eR.js} +3 -3
- package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js.map → OnboardingFlow-Cy9BA9eR.js.map} +1 -1
- package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
- package/dist/core/web/public/next/assets/{OnboardingGate-BZafM1Vf.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
- package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
- package/dist/core/web/public/next/assets/{PreviewPane-zT3gK9TD.js.map → PreviewPane-COid5A0f.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js → ProviderLogo-Cq-CYIwT.js} +2 -2
- package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js → RailStatus-Co5UB6We.js} +2 -2
- package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js.map → RailStatus-Co5UB6We.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js → RefreshIndicator-DO9ibnSq.js} +2 -2
- package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CAxPQ4sZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
- package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js → SeatSelector-J5R3zDkB.js} +3 -3
- package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js → Segmented-CGh_-tBb.js} +2 -2
- package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js.map → Segmented-CGh_-tBb.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Select-By-V9lMc.js → Select-CWnmUzs3.js} +2 -2
- package/dist/core/web/public/next/assets/{Select-By-V9lMc.js.map → Select-CWnmUzs3.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js → SessionGate-sp4KsnUo.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js → SessionInsightChip-DLFAzdbi.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js → SessionSearch-DbFjwR1h.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SettingsSection-Bf74l0Gj.js → SettingsSection-Ch23msJ5.js} +2 -2
- package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
- package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js → SetupChecklist-Bd76MBAR.js} +2 -2
- package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js.map → SetupChecklist-Bd76MBAR.js.map} +1 -1
- package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
- package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js → Sheet-BZ2AG4Eo.js} +2 -2
- package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
- package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
- package/dist/core/web/public/next/assets/{Sidebar-C9YtBYVZ.js.map → Sidebar-DN--cPYN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js → Slider-KVoJLDD6.js} +2 -2
- package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js.map → Slider-KVoJLDD6.js.map} +1 -1
- package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
- package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
- package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js → StatusBadge-CXsYqmdU.js} +2 -2
- package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
- package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
- package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js → Surface-BfDmQcKe.js} +2 -2
- package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js.map → Surface-BfDmQcKe.js.map} +1 -1
- package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
- package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
- package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js → Switch-9NtO_6Lj.js} +2 -2
- package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js.map → Switch-9NtO_6Lj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js → Tag-DscCRFcN.js} +2 -2
- package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js.map → Tag-DscCRFcN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js → TerminalPane-B668-DJW.js} +5 -5
- package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js.map → TerminalPane-B668-DJW.js.map} +1 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-BpphLqoz.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js → UniverseView-DG70zH0W.js} +4 -4
- package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js.map → UniverseView-DG70zH0W.js.map} +1 -1
- package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
- package/dist/core/web/public/next/assets/{Workspace-RXy0pqp6.js.map → Workspace-D1nP9BhD.js.map} +1 -1
- package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
- package/dist/core/web/public/next/assets/{actions-BZTidCXZ.js.map → actions-CY-PjpGc.js.map} +1 -1
- package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
- package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js → apps-model-Du02KhAf.js} +2 -2
- package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js.map → apps-model-Du02KhAf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js → authority-model-79SeuKlJ.js} +2 -2
- package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js.map → authority-model-79SeuKlJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
- package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
- package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
- package/dist/core/web/public/next/assets/{budget-queries-DFF-3ICg.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
- package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
- package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
- package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
- package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js → cloud-model-BDivRMqv.js} +2 -2
- package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js.map → cloud-model-BDivRMqv.js.map} +1 -1
- package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js → cloud-queries-BPQQ5_pJ.js} +2 -2
- package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
- package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{command-catalog-ffCAijVY.js → command-catalog-BIntSa9l.js} +2 -2
- package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
- package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js → context-model-Br8t9jgG.js} +2 -2
- package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js.map → context-model-Br8t9jgG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js → context-model-CokrgEUq.js} +3 -3
- package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js.map → context-model-CokrgEUq.js.map} +1 -1
- package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
- package/dist/core/web/public/next/assets/{context-queries-_9bFWb9v.js.map → context-queries-eL3caKVG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js → control-queries-B9K-wmcB.js} +2 -2
- package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js.map → control-queries-B9K-wmcB.js.map} +1 -1
- package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js → copy-setup-XMgCC5f8.js} +2 -2
- package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js.map → copy-setup-XMgCC5f8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js → dock-icons-BJ6ZqB2t.js} +2 -2
- package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js → fleet-model-BvDR3gjp.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js → fleet-queries-W2UFVMZJ.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js → focus-trap-CtI1SlMX.js} +2 -2
- package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{format-BmH2yWL6.js → format-CH4g_sl1.js} +2 -2
- package/dist/core/web/public/next/assets/{format-BmH2yWL6.js.map → format-CH4g_sl1.js.map} +1 -1
- package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
- package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js → git-model-Dnkd1TnK.js} +2 -2
- package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js.map → git-model-Dnkd1TnK.js.map} +1 -1
- package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
- package/dist/core/web/public/next/assets/{global-y_exIyAP.js.map → global-CMNW_dqn.js.map} +1 -1
- package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
- package/dist/core/web/public/next/assets/{guarded-runners-Cd4POBtI.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{icons-CygCEFWs.js → icons-D1sYbCTQ.js} +2 -2
- package/dist/core/web/public/next/assets/{icons-CygCEFWs.js.map → icons-D1sYbCTQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{index-CyK31YRm.js → index-DZ-UQ7v8.js} +3 -3
- package/dist/core/web/public/next/assets/{index-CyK31YRm.js.map → index-DZ-UQ7v8.js.map} +1 -1
- package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
- package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
- package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
- package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
- package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js → live-model-D_32RAOR.js} +2 -2
- package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js.map → live-model-D_32RAOR.js.map} +1 -1
- package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js → mind.module-7hA92hRg.js} +2 -2
- package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js.map → mind.module-7hA92hRg.js.map} +1 -1
- package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
- package/dist/core/web/public/next/assets/{mutations-CWlxEMEm.js.map → mutations-DQPbFdRJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{nav-mimleI0R.js → nav-0dOYe2rJ.js} +2 -2
- package/dist/core/web/public/next/assets/{nav-mimleI0R.js.map → nav-0dOYe2rJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js → overnight-queries-C4wOnFtE.js} +2 -2
- package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
- package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
- package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js → queries-BTXWdZzU.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js.map → queries-BTXWdZzU.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js → reasoning-pref-Ca6lN6x_.js} +2 -2
- package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js → reveal-anchor-DfNLgK_I.js} +2 -2
- package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
- package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
- package/dist/core/web/public/next/assets/{seat-subscription-BhUUz7VL.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js → sidebar-model-CLCdqwkR.js} +2 -2
- package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
- package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js → slots-C-qBeu-8.js} +3 -3
- package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js.map → slots-C-qBeu-8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js → surface-data-Dj71tdD-.js} +2 -2
- package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js.map → surface-data-Dj71tdD-.js.map} +1 -1
- package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
- package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js → tasks-model-O8yR5YXp.js} +2 -2
- package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js → terminal-icons-CoRZq9iO.js} +2 -2
- package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
- package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
- package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
- package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js → usage-queries-AdjEyEtn.js} +2 -2
- package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js → use-guarded-action-CuuMHeDX.js} +2 -2
- package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js → use-ticker-BBcp02SZ.js} +2 -2
- package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js → use-token-gate-CbXVYQYI.js} +2 -2
- package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js → useOnboarding-C_Fpe_sH.js} +2 -2
- package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
- package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js → useVerseTranscript-DgbigUlV.js} +2 -2
- package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
- package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js → verse-icons-S56hIiXS.js} +2 -2
- package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js.map → verse-icons-S56hIiXS.js.map} +1 -1
- package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
- package/dist/core/web/public/next/assets/{verse-model-JTuvRBVK.js.map → verse-model-DAVevkNe.js.map} +1 -1
- package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js → warmup-B_RAtNZ_.js} +3 -3
- package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js.map → warmup-B_RAtNZ_.js.map} +1 -1
- package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js → why-seat-model-M_r0wX3b.js} +2 -2
- package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js.map → why-seat-model-M_r0wX3b.js.map} +1 -1
- package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js → workspace-model-dji5-Al3.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js.map → workspace-model-dji5-Al3.js.map} +1 -1
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/core/web/read-projection-worker.js +2 -1
- package/dist/core/web/read-projection-worker.js.map +1 -1
- package/dist/core/web/read-projections.d.ts +3 -0
- package/dist/core/web/read-projections.js +2 -2
- package/dist/core/web/read-projections.js.map +1 -1
- package/dist/core/web/visibility.js +3 -4
- package/dist/core/web/visibility.js.map +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/package.json +3 -2
- package/dist/core/web/public/next/assets/Advanced-cVYTAsfB.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-DDqeSrty.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-Dwn8UtOy.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js +0 -3
- package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js +0 -2
- package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
- package/dist/core/web/public/next/assets/DockHost-BcEq2qaS.js +0 -2
- package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js +0 -3
- package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-BvZezOsX.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-nuXer4K-.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js +0 -3
- package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js.map +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BqFTWgHU.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingGate-BZafM1Vf.js +0 -3
- package/dist/core/web/public/next/assets/PreviewPane-zT3gK9TD.js +0 -2
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CAxPQ4sZ.js +0 -7
- package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js +0 -2
- package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-Bf74l0Gj.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js +0 -3
- package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
- package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-BpphLqoz.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-RXy0pqp6.js +0 -10
- package/dist/core/web/public/next/assets/actions-BZTidCXZ.js +0 -2
- package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
- package/dist/core/web/public/next/assets/budget-queries-DFF-3ICg.js +0 -2
- package/dist/core/web/public/next/assets/charts-CzxWrZn7.js +0 -2
- package/dist/core/web/public/next/assets/charts-CzxWrZn7.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
- package/dist/core/web/public/next/assets/command-catalog-ffCAijVY.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-_9bFWb9v.js +0 -2
- package/dist/core/web/public/next/assets/global-y_exIyAP.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-Cd4POBtI.js +0 -2
- package/dist/core/web/public/next/assets/mutations-CWlxEMEm.js +0 -2
- package/dist/core/web/public/next/assets/primitives-DMijqcu0.js +0 -1
- package/dist/core/web/public/next/assets/seat-subscription-BhUUz7VL.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-model-JTuvRBVK.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NewChatDialog-BqFTWgHU.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’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’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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"}
|
package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js → OnboardingFlow-Cy9BA9eR.js}
RENAMED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SetupChecklist-
|
|
2
|
-
import{a as e,c as t,n,t as r}from"./index-CyK31YRm.js";import{m as i}from"./global-y_exIyAP.js";import{M as a,at as o,lt as s,q as c,z as l}from"./VerseConsoleApp-DXDv1aOi.js";import{y as u}from"./format-BmH2yWL6.js";import{r as d}from"./CapacityStrip-DKbKA_Aa.js";import{t as f}from"./Button-DtE0rlWD.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-CygCEFWs.js";import{s as C}from"./verse-icons-DsG1dOQx.js";import"./command-catalog-ffCAijVY.js";import{r as w,u as T}from"./AutonomyOffState-CpFYS3tQ.js";import{n as E}from"./surface-data-C3UAQ4QX.js";import"./primitives-DMijqcu0.js";import{a as D,s as O}from"./usage-queries-pXxvy54x.js";import{a as k,o as A}from"./authority-model-8NeAEwAF.js";import{copyAutonomySetupCommand as j}from"./copy-setup-BIp0iaiZ.js";import{a as M,i as N,n as P,r as F,s as I,t as L}from"./useOnboarding-Bk0VnkxQ.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-CzpEcfOl.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(D),t=(0,R.useMemo)(()=>{let t=e.data?.reason??e.error?.message??null;return U({snapshot:e.data?.available?O(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(E),[t,n]=(0,R.useState)(null),r=e.data?.value??null,a=e.data===void 0&&e.status!==`error`,o=A(r),c=k(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-
|
|
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
|