@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,2 +0,0 @@
|
|
|
1
|
-
import{a as e,c as t,n}from"./index-CyK31YRm.js";import{d as r,f as i}from"./colors-BZ3a9wFf.js";import{a,c as o,n as s,o as c}from"./format-DKrNjdwD.js";import{t as l}from"./ProviderLogo-AwHn2sKm.js";var u=t(e(),1),d=n();function f(e,t,n=4,r={}){if(!Number.isFinite(e)||!Number.isFinite(t))return[0];if(t<e&&([e,t]=[t,e]),t===e){if(t===0)return[0,1];let i=Math.abs(t)*.5;return f(Math.min(0,e-i),t+i,n,r)}let i=(t-e)/Math.max(1,n),a=10**Math.floor(Math.log10(i)),o=i/a,s=(o<=1?1:o<=2?2:o<=2.5?a>=10?2.5:2:o<=5?5:10)*a;r.integer&&s<1&&(s=1),r.minStep!==void 0&&Number.isFinite(r.minStep)&&s<r.minStep&&(s=r.minStep);let c=Math.floor(e/s)*s,l=Math.ceil(t/s)*s,u=Math.round((l-c)/s),d=Math.max(0,-Math.floor(Math.log10(s))+1),p=[];for(let e=0;e<=u;e++)p.push(Number((c+e*s).toFixed(d))||0);return p}function p(e){return e.every(e=>Number.isInteger(e))}function m(e,t){return new Set(t).size===t.length&&e.every((e,n)=>{if(e===0)return!0;let r=/\d[\d,]*(?:\.\d+)?/.exec(t[n]??``);if(!r)return!0;let i=Number(r[0].replace(/,/g,``));if(!Number.isFinite(i)||i===0)return!1;let a=i/Math.abs(e),o=10**Math.round(Math.log10(a));return Math.abs(a/o-1)<1e-6})}function h(e,t,n={}){let r=Math.max(1,n.count??4),i=n.integer===!0,s=n.format,c=(n,r,i)=>{let c=f(e,t,n,{integer:r,minStep:i}),l=c.length>1?c[1]-c[0]:1;if(s)return{ticks:c,labels:c.map(e=>s(e)),step:l};let u=o(c,l);return{ticks:c,labels:c.map(e=>a(e,l,u)),step:l}},l=c(r,i);if(!n.format||m(l.ticks,l.labels)||!Number.isFinite(e)||!Number.isFinite(t)||!(l.step>0))return l;let u=(e,t)=>{for(let n=r;n>=1;n--){let r=c(n,e,t);if(m(r.ticks,r.labels))return r}return null},d=u(i);if(d)return d;let p=Math.max(Math.abs(e),Math.abs(t),1);for(let e=Math.floor(Math.log10(l.step))+1;10**e<=p*10;e++){let t=u(i,Number((10**e).toPrecision(1)));if(t)return t}return u(!0)??l}function g(e){let t=t=>{let n=e(t).trim();if(!n.endsWith(`%`))return null;let r=Number(n.slice(0,-1).replace(/[,\s+]/g,``));return Number.isFinite(r)?r:null};return t(50)===50?100:t(.5)===50?1:null}function _(e){return Number.isFinite(e)&&e>=9466848e5}function v(e){return e.some(_)}function ee(e){return v(e)?_:Number.isFinite}var y=6e5;function te(e,t,n,r=`center`){if(t<e&&([e,t]=[t,e]),t-e>=n)return[e,t];if(r===`end`)return[t-n,t];let i=(e+t)/2;return[i-n/2,i+n/2]}var b=12*.6;function x(e){return Number.isFinite(e)&&e>0?e:1}function S(e=1){return b*x(e)}function C(e,t=b){return e.length*t}var w=7;function T(e,t,n,r=1){let i=x(r),a=Math.max(0,...e.map(e=>e.length));return Math.min(n*i,Math.max(t,a*w*i+10))}function E(e,t,n){let r=n.gap??8,i=e.map((e,t)=>({s:e,i:t})).sort((e,t)=>t.s.priority-e.s.priority||e.i-t.i),a=[];for(let{s:e,i:o}of i){let i=e.variants[Math.min(t,e.variants.length-1)]??``;if(!i)continue;let s=C(i,n.charPx);if(s>n.max-n.min)continue;let c=e.anchor===`start`?e.x:e.anchor===`end`?e.x-s:e.x-s/2,l=e.x,u=e.anchor;c<n.min?(c=n.min,l=n.min,u=`start`):c+s>n.max&&(c=n.max-s,l=n.max,u=`end`);let d=c+s;a.some(e=>e.text===i||c<e.right+r&&e.left<d+r)||a.push({left:c,right:d,text:i,i:o,label:{key:e.key,text:i,x:l,anchor:u}})}return a.sort((e,t)=>e.i-t.i).map(e=>e.label)}function ne(e,t){if(e.length===0)return[];let n=Math.max(1,...e.map(e=>e.variants.length)),r=new Set(e.filter(e=>e.required!==!1).map(e=>e.key)),i=[],a=-1;for(let o=0;o<n;o++){let n=E(e,o,t),s=n.filter(e=>r.has(e.key)).length;if(s>a&&(i=n,a=s),a===r.size)break}return i}function re(e,t,n,r){if(e.length===0)return new Map;if((e.length-1)*t>r-n+1e-9)return null;let i=e.map((e,t)=>({...e,i:t})).sort((e,t)=>e.y-t.y||e.i-t.i),a=e=>{let i=e.reduce((e,t)=>e+t.y,0)/e.length,a=(e.length-1)*t;return{members:e,top:D(i-a/2,n,r-a)}},o=i.map(e=>a([e]));for(let e=!0;e;){e=!1;for(let n=0;n+1<o.length;n++){let r=o[n],i=o[n+1];if(r.top+r.members.length*t>i.top+1e-9){o=[...o.slice(0,n),a([...r.members,...i.members]),...o.slice(n+2)],e=!0;break}}}let s=new Map;for(let e of o)e.members.forEach((n,r)=>s.set(n.key,e.top+r*t));return s}function ie(e,t,n,r){let i=t-e;return i===0?()=>(n+r)/2:t=>n+(t-e)/i*(r-n)}function ae(e,t){if(e<=0)return[];if(t<=1)return[e-1];if(e<=t)return Array.from({length:e},(e,t)=>t);let n=Math.ceil((e-1)/(t-1)),r=[];for(let t=e-1;t>=0;t-=n)r.push(t);return r.reverse()}function D(e,t,n){return Math.min(n,Math.max(t,e))}function oe(e){let t=[],n=[];for(let r of e){if(r.y===null||!Number.isFinite(r.y)){n.length&&t.push(n),n=[];continue}n.push({x:r.x,y:r.y})}return n.length&&t.push(n),t}function O(e){return e.map((e,t)=>`${t===0?`M`:`L`}${A(e.x)},${A(e.y)}`).join(` `)}function k(e,t){if(e.length===0)return``;let n=[...t].reverse();return`${O(e)} ${n.map(e=>`L${A(e.x)},${A(e.y)}`).join(` `)} Z`}function A(e){return Math.round(e*10)/10}function j(e){let t=0,n=!1,r=0,i=[];return e.forEach((e,a)=>{if(e===null||!Number.isFinite(e)){n=!0;return}r++;let o=Math.max(0,e);o>0&&i.push({index:a,value:o,y0:t,y1:t+o}),t+=o}),{segments:i,total:t,incomplete:n,unknown:r===0&&e.length>0}}function M(e,t,n,r,i=4){if(r<=0||n<=0)return``;let a=Math.max(0,Math.min(i,n/2,r));return[`M${A(e)},${A(t+r)}`,`L${A(e)},${A(t+a)}`,`Q${A(e)},${A(t)} ${A(e+a)},${A(t)}`,`L${A(e+n-a)},${A(t)}`,`Q${A(e+n)},${A(t)} ${A(e+n)},${A(t+a)}`,`L${A(e+n)},${A(t+r)}`,`Z`].join(` `)}function N(e,t,n,r,i=4){if(r<=0||n<=0)return``;let a=Math.max(0,Math.min(i,r/2,n));return[`M${A(e)},${A(t)}`,`L${A(e+n-a)},${A(t)}`,`Q${A(e+n)},${A(t)} ${A(e+n)},${A(t+a)}`,`L${A(e+n)},${A(t+r-a)}`,`Q${A(e+n)},${A(t+r)} ${A(e+n-a)},${A(t+r)}`,`L${A(e)},${A(t+r)}`,`Z`].join(` `)}function P(e){let t=e[0]??null;return e.map((n,r)=>{let i=r>0?e[r-1]??null:null;return{value:n,ofFirst:n!==null&&t!==null&&t>0?n/t:null,ofPrevious:r>0&&n!==null&&i!==null&&i>0?n/i:null}})}var F=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`];function I(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return null;let t=Date.parse(`${e}T00:00:00Z`);return Number.isFinite(t)&&new Date(t).toISOString().slice(0,10)===e?t:null}function L(e,t=1){let n=new Map,r=1/0,i=-1/0;for(let t of e){let e=I(t.day);e===null||e<9466848e5||(n.set(t.day,t.value),r=Math.min(r,e),i=Math.max(i,e))}if(!Number.isFinite(r))return{cells:[],weeks:0,months:[]};let a=864e5,o=(new Date(r).getUTCDay()-t+7)%7,s=r-o*a,c=(new Date(i).getUTCDay()-t+7)%7,l=i+(6-c)*a,u=[],d=[],f=-1;for(let e=s,t=0;e<=l;e+=a,t++){let a=new Date(e).toISOString().slice(0,10),o=Math.floor(t/7),s=t%7,c=e<r||e>i;u.push({day:a,value:c?null:n.has(a)?n.get(a):null,week:o,weekday:s,outside:c});let l=new Date(e).getUTCMonth();!c&&l!==f&&(d.push({week:o,label:F[l]}),f=l)}return{cells:u,weeks:Math.floor((l-s)/a/7)+1,months:d}}function R(e,t,n=4){return e===null||!Number.isFinite(e)?null:e<=0||t<=0?0:D(Math.ceil(e/t*n),1,n)}function z(e,t,n={}){let r=t!==null&&Number.isFinite(t)?t:null,i=e.filter(e=>e.remaining!==null&&Number.isFinite(e.remaining)&&Number.isFinite(e.t)).sort((e,t)=>e.t-t.t),a=i.length?i[i.length-1]:null,o=i.slice(-(n.window??6));if(!a||o.length<2)return{slopePerMs:null,exhaustAt:null,reserveAt:null,remainingAtReset:null,from:a};let s=o.length,c=o.reduce((e,t)=>e+t.t,0)/s,l=o.reduce((e,t)=>e+t.remaining,0)/s,u=0,d=0;for(let e of o)u+=(e.t-c)*(e.remaining-l),d+=(e.t-c)**2;let f=d===0?0:u/d,p=e=>{if(a.remaining<=e)return a.t;if(f>=0||r===null)return null;let t=a.t+(e-a.remaining)/f;return t<=r?t:null},m=n.reserve??null;return{slopePerMs:f,exhaustAt:p(0),reserveAt:m===null?null:p(m),remainingAtReset:r===null?null:Math.max(0,a.remaining+f*Math.max(0,r-a.t)),from:a}}function B(e,t,n,r){return{x:e+n*Math.cos(r),y:t-n*Math.sin(r)}}function V(e,t,n,r,i){let a=D(r,0,1),o=D(i,0,1);if(o<=a)return``;let s=B(e,t,n,Math.PI*(1-a)),c=B(e,t,n,Math.PI*(1-o));return`M${A(s.x)},${A(s.y)} A${n},${n} 0 0 1 ${A(c.x)},${A(c.y)}`}function H(e,t,n){return e===null||!Number.isFinite(e)?`unknown`:e>=n?`danger`:e>=t?`warn`:`ok`}function U(e,t,n=640){let[r,i]=(0,u.useState)(null),[a,o]=(0,u.useState)(null);return(0,u.useLayoutEffect)(()=>{e.current!==a&&o(e.current)}),(0,u.useLayoutEffect)(()=>{if(t!==void 0)return;let e=a;if(!e)return;let n=()=>{let t=Math.floor(e.getBoundingClientRect().width);t>0&&i(e=>e===t?e:t)};if(n(),typeof ResizeObserver>`u`)return;let r=0,o=new ResizeObserver(()=>{cancelAnimationFrame(r),r=requestAnimationFrame(n)});return o.observe(e),()=>{cancelAnimationFrame(r),o.disconnect()}},[a,t]),Math.max(280,t??r??n)}function W(e=typeof document>`u`?null:document.documentElement){return!e||typeof getComputedStyle!=`function`?1:x(Number.parseFloat(getComputedStyle(e).getPropertyValue(`--ui-text-scale`)))}var G=new Set,K=null,q=null;function J(){let e=W();if(e!==K){K=e;for(let e of G)e()}}function se(){K=W();let e=document.documentElement,t=typeof MutationObserver>`u`?null:new MutationObserver(J);t?.observe(e,{attributes:!0,attributeFilter:[`data-ui-scale`,`style`]});let n=typeof requestAnimationFrame==`function`,r=0,i=()=>{if(!n)return J();cancelAnimationFrame(r),r=requestAnimationFrame(J)};return window.addEventListener(`resize`,i),()=>{t?.disconnect(),n&&cancelAnimationFrame(r),window.removeEventListener(`resize`,i)}}function ce(e){return G.add(e),G.size===1&&typeof document<`u`&&(q=se()),()=>{G.delete(e),!(G.size>0)&&(q?.(),q=null,K=null)}}function le(){return K??W()}function ue(){return(0,u.useSyncExternalStore)(ce,le,()=>1)}var Y={table:`_table_x2yvy_1`,numeric:`_numeric_x2yvy_22`,empty:`_empty_x2yvy_27`};function de({caption:e,columns:t,rows:n,rowKey:r,emptyMessage:i=`No rows.`}){return(0,d.jsxs)(`table`,{className:Y.table,children:[(0,d.jsx)(`caption`,{className:`visually-hidden`,children:e}),(0,d.jsx)(`thead`,{children:(0,d.jsx)(`tr`,{children:t.map(e=>(0,d.jsx)(`th`,{scope:`col`,className:e.numeric?Y.numeric:void 0,children:e.label},e.key))})}),(0,d.jsxs)(`tbody`,{children:[n.length===0?(0,d.jsx)(`tr`,{children:(0,d.jsx)(`td`,{colSpan:Math.max(1,t.length),className:Y.empty,children:i})}):null,n.map((e,n)=>(0,d.jsx)(`tr`,{children:t.map(t=>(0,d.jsx)(`td`,{className:t.numeric?Y.numeric:void 0,children:t.render(e)},t.key))},r(e,n)))]})]})}var X={plotWrap:`_plotWrap_1cs0k_3`,svg:`_svg_1cs0k_9`,grid:`_grid_1cs0k_15`,axis:`_axis_1cs0k_21`,tick:`_tick_1cs0k_27`,label:`_label_1cs0k_34`,labelStrong:`_labelStrong_1cs0k_40`,line:`_line_1cs0k_47`,wash:`_wash_1cs0k_54`,reference:`_reference_1cs0k_59`,projection:`_projection_1cs0k_66`,marker:`_marker_1cs0k_73`,crosshair:`_crosshair_1cs0k_78`,hit:`_hit_1cs0k_84`,focusable:`_focusable_1cs0k_98`,track:`_track_1cs0k_108`,trackEmpty:`_trackEmpty_1cs0k_122`,noData:`_noData_1cs0k_126`,tooltip:`_tooltip_1cs0k_133`,tooltipTitle:`_tooltipTitle_1cs0k_148`,tooltipRow:`_tooltipRow_1cs0k_153`,tooltipKey:`_tooltipKey_1cs0k_159`,tooltipValue:`_tooltipValue_1cs0k_166`,tooltipMuted:`_tooltipMuted_1cs0k_173`,legend:`_legend_1cs0k_178`,legendItem:`_legendItem_1cs0k_189`,swatch:`_swatch_1cs0k_195`,swatchLine:`_swatchLine_1cs0k_202`,swatchEmpty:`_swatchEmpty_1cs0k_208`,note:`_note_1cs0k_216`,srOnly:`_srOnly_1cs0k_222`,animated:`_animated_1cs0k_235`,monogram:`_monogram_1cs0k_241`,unknownMark:`_unknownMark_1cs0k_251`,swatchHatch:`_swatchHatch_1cs0k_257`,halo:`_halo_1cs0k_268`};function fe({items:e,min:t=2}){return e.length<t?null:(0,d.jsx)(`ul`,{className:X.legend,children:e.map(e=>(0,d.jsxs)(`li`,{className:X.legendItem,children:[(0,d.jsx)(`span`,{"aria-hidden":`true`,className:e.kind===`line`?X.swatchLine:e.kind===`empty`?X.swatchEmpty:e.kind===`hatch`?X.swatchHatch:X.swatch,style:e.kind===`empty`||e.kind===`hatch`?void 0:{background:e.color}}),e.label]},e.label))})}function pe({left:e,top:t,title:n,rows:r}){return(0,d.jsxs)(`div`,{className:X.tooltip,style:{left:e,top:t},role:`presentation`,children:[(0,d.jsx)(`div`,{className:X.tooltipTitle,children:n}),r.map(e=>(0,d.jsxs)(`div`,{className:X.tooltipRow,children:[e.color?(0,d.jsx)(`span`,{className:X.tooltipKey,style:{background:e.color},"aria-hidden":`true`}):null,(0,d.jsx)(`span`,{children:e.label}),e.value===null?(0,d.jsx)(`span`,{className:`${X.tooltipValue} ${X.tooltipMuted}`,children:`no data`}):(0,d.jsx)(`span`,{className:X.tooltipValue,children:e.value})]},e.key))]})}function me(e,t,n=70){return Math.min(Math.max(e,Math.min(n,t/2)),Math.max(t-n,t/2))}function he({id:e}){let{size:t,angle:n,strokeWidth:i,stroke:a}=r;return(0,d.jsx)(`pattern`,{id:e,width:t,height:t,patternUnits:`userSpaceOnUse`,patternTransform:`rotate(${n})`,children:(0,d.jsx)(`line`,{x1:0,y1:0,x2:0,y2:t,stroke:a,strokeWidth:i})})}function Z({engine:e,x:t,y:n,height:r}){return(0,d.jsxs)(`g`,{"data-engine":e,"aria-hidden":`true`,children:[(0,d.jsx)(`rect`,{x:t,y:n,width:2,height:r,rx:1,fill:i(e)}),(0,d.jsx)(l,{engine:e,x:t+5,y:n+r/2-6,size:12,className:X.monogram})]})}function ge(){return(0,d.jsxs)(`svg`,{width:16,height:16,viewBox:`0 0 16 16`,"aria-hidden":`true`,focusable:`false`,children:[(0,d.jsx)(`circle`,{cx:3.5,cy:8,r:1.4,fill:`currentColor`}),(0,d.jsx)(`circle`,{cx:8,cy:8,r:1.4,fill:`currentColor`}),(0,d.jsx)(`circle`,{cx:12.5,cy:8,r:1.4,fill:`currentColor`})]})}var Q={frame:`_frame_cmx6f_1`,header:`_header_cmx6f_11`,actions:`_actions_cmx6f_23`,menuWrap:`_menuWrap_cmx6f_31`,more:`_more_cmx6f_37`,menu:`_menu_cmx6f_31`,menuItem:`_menuItem_cmx6f_78`,check:`_check_cmx6f_100`,hint:`_hint_cmx6f_105`,heading:`_heading_cmx6f_17`,title:`_title_cmx6f_123`,description:`_description_cmx6f_129`,plot:`_plot_cmx6f_134`,table:`_table_cmx6f_140`,caveat:`_caveat_cmx6f_145`,state:`_state_cmx6f_155`,dark:`_dark_cmx6f_163`,darkTitle:`_darkTitle_cmx6f_170`,darkBody:`_darkBody_cmx6f_176`,unknown:`_unknown_cmx6f_182`};function _e(e){if(/^\d{4}-\d{2}-\d{2}$/.test(e))return s(e);let t=Date.parse(e);return Number.isFinite(t)?c(t):s(e.slice(0,10))}function ve({status:e}){switch(e.kind){case`loading`:return(0,d.jsx)(`p`,{className:Q.state,"aria-busy":`true`,children:`Loading…`});case`empty`:return(0,d.jsx)(`p`,{className:Q.state,children:e.message??`Nothing happened in this window.`});case`dark`:return(0,d.jsxs)(`div`,{className:`${Q.state} ${Q.dark}`,children:[(0,d.jsxs)(`p`,{className:Q.darkTitle,children:[e.subject??`Fleet`,` dark since `,_e(e.since)]}),(0,d.jsx)(`p`,{className:Q.darkBody,children:e.detail??`No runs or proposals have been recorded since then.`})]});case`unknown`:return(0,d.jsxs)(`p`,{className:`${Q.state} ${Q.unknown}`,role:`note`,children:[`Unknown — `,e.reason??`the data source could not be read.`,` Nothing is shown rather than a guess.`]})}}function ye(e){if(!(e instanceof HTMLElement))return!1;let t=e.tagName;return t===`INPUT`||t===`TEXTAREA`||t===`SELECT`||e.isContentEditable}var $=[{view:`chart`,label:`Show as chart`,hint:null},{view:`table`,label:`Show as table`,hint:`T`}];function be({title:e,view:t,onPick:n}){let[r,i]=(0,u.useState)(!1),[a,o]=(0,u.useState)(0),s=(0,u.useRef)(null),c=(0,u.useRef)(null),l=(0,u.useId)(),f=(0,u.useCallback)(e=>{i(!1),e&&s.current?.focus()},[]);(0,u.useEffect)(()=>{if(!r)return;let e=e=>{let t=e.target;t&&(c.current?.contains(t)||s.current?.contains(t))||i(!1)};return document.addEventListener(`pointerdown`,e),()=>document.removeEventListener(`pointerdown`,e)},[r]),(0,u.useEffect)(()=>{r&&c.current?.querySelectorAll(`[role="menuitemradio"]`)[a]?.focus()},[r,a]);function p(e){o(e),i(!0)}function m(e){(e.key===`ArrowDown`||e.key===`ArrowUp`)&&(e.preventDefault(),p(e.key===`ArrowUp`?$.length-1:0))}function h(e){e.key===`ArrowDown`?(e.preventDefault(),o(e=>(e+1)%$.length)):e.key===`ArrowUp`?(e.preventDefault(),o(e=>(e-1+$.length)%$.length)):e.key===`Home`?(e.preventDefault(),o(0)):e.key===`End`?(e.preventDefault(),o($.length-1)):e.key===`Escape`?(e.preventDefault(),e.stopPropagation(),f(!0)):e.key===`Tab`&&f(!1)}return(0,d.jsxs)(`span`,{className:Q.menuWrap,children:[(0,d.jsx)(`button`,{ref:s,type:`button`,className:Q.more,"aria-label":`${e}: view options`,"aria-haspopup":`menu`,"aria-expanded":r,"aria-controls":r?l:void 0,title:`View options (T toggles the table)`,onClick:()=>r?f(!1):p(Math.max(0,$.findIndex(e=>e.view===t))),onKeyDown:m,children:(0,d.jsx)(ge,{})}),r?(0,d.jsx)(`div`,{ref:c,id:l,role:`menu`,"aria-label":`${e} view`,className:Q.menu,onKeyDown:h,children:$.map((e,r)=>(0,d.jsxs)(`button`,{type:`button`,role:`menuitemradio`,"aria-checked":t===e.view,tabIndex:r===a?0:-1,className:Q.menuItem,onClick:()=>{n(e.view),f(!0)},children:[(0,d.jsx)(`span`,{className:Q.check,"aria-hidden":`true`,children:t===e.view?`✓`:``}),(0,d.jsx)(`span`,{children:e.label}),e.hint?(0,d.jsx)(`kbd`,{className:Q.hint,children:e.hint}):null]},e.view))}):null]})}function xe({title:e,description:t,caveat:n,status:r={kind:`ready`},defaultView:i=`chart`,hideToggle:a=!1,actions:o,children:s,table:c,footer:l}){let[f,p]=(0,u.useState)(i),m=(0,u.useId)(),h=r.kind===`ready`,g=h&&!a;function _(e){g&&!e.defaultPrevented&&(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey||e.key.toLowerCase()!==`t`||ye(e.target)||(e.preventDefault(),p(e=>e===`chart`?`table`:`chart`)))}return(0,d.jsxs)(`figure`,{className:Q.frame,"aria-labelledby":m,"data-chart-card":``,"data-view":f,onKeyDown:_,children:[(0,d.jsxs)(`figcaption`,{className:Q.header,children:[(0,d.jsxs)(`span`,{className:Q.heading,children:[(0,d.jsx)(`span`,{id:m,className:Q.title,children:e}),t?(0,d.jsx)(`span`,{className:Q.description,children:t}):null]}),o||g?(0,d.jsxs)(`span`,{className:Q.actions,children:[o,g?(0,d.jsx)(be,{title:e,view:f,onPick:p}):null]}):null]}),n?(0,d.jsx)(`p`,{className:Q.caveat,role:`note`,children:n}):null,h?f===`table`?(0,d.jsx)(`div`,{className:Q.table,children:c}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(`div`,{className:Q.plot,children:s}),l]}):(0,d.jsx)(ve,{status:r})]})}export{B as A,v as C,ie as D,O as E,j as F,ae as I,T as L,N as M,M as N,f as O,oe as P,ee as R,_ as S,ne as T,te as _,he as a,H as b,de as c,y as d,p as f,re as g,L as h,Z as i,z as j,g as k,ue as l,h as m,fe as n,me as o,k as p,pe as r,X as s,xe as t,U as u,P as v,S as w,R as x,V as y};
|
|
2
|
-
//# sourceMappingURL=ChartFrame-DK_BDXCt.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChartFrame-DK_BDXCt.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/chart-tokens.css","../../../../../../src/web-ui/components/charts/chart-math.ts","../../../../../../src/web-ui/components/charts/useChartWidth.ts","../../../../../../src/web-ui/components/charts/useTextScale.ts","../../../../../../src/web-ui/components/charts/TableView.module.css","../../../../../../src/web-ui/components/charts/TableView.tsx","../../../../../../src/web-ui/components/charts/plot.module.css","../../../../../../src/web-ui/components/charts/ChartParts.tsx","../../../../../../src/web-ui/components/charts/ChartFrame.module.css","../../../../../../src/web-ui/components/charts/ChartFrame.tsx"],"sourcesContent":["/**\n * components/charts/chart-tokens.css — chart-only aliases over the design\n * tokens (owner: unit C0, with colors.ts; the chart components are C7's).\n * Every value below is `var(--existing-token)`, never a hex: the raw values\n * and their light/dark variants live in design/tokens.css, so theming is\n * inherited and can never drift out of sync with the rest of the app.\n *\n * V3.10 COLOUR ROLES (SPEC-310C §6), one meaning per hue:\n *\n * QUANTITY — `--chart-seq-1..7`, the fixed azure ramp at 214°\n * (tokens.css --data-seq-*). Every magnitude — heat cells, a single\n * nominal series, gauge fills, the positive diverging pole — is azure.\n * It is NEVER the accent: the accent is interaction-only and the\n * operator can drag it to any hue, which used to re-colour every chart\n * (tokens-310.test.ts fails if a data token here points at --accent-*).\n *\n * CATEGORICAL — `--chart-series-1..6` (tokens.css --data-cat-*). Six\n * identity inks chosen to avoid every engine, status and quantity hue,\n * with the validator scores recorded in tokens.css. Order is identity,\n * never rank: a series keeps its slot even when others are filtered out.\n * A seventh series goes to `--chart-neutral` (\"Other\") — colors.ts never\n * cycles, because a repeated colour would say two series are one.\n *\n * UNKNOWN — gray, drawn as a 45° HATCH with an outline, never a solid\n * fill on a data ramp (a solid gray would read as \"zero\" or \"neutral\").\n * `--chart-unknown-hatch` for CSS fills; colors.ts UNKNOWN_HATCH for SVG.\n *\n * QUEUED / PARKED — a neutral OUTLINE with no fill (Fleet Gantt, Swimlane).\n *\n * ENGINES — identity only, and only in charts that show nothing else\n * (runs by engine, usage bars); passed explicitly via colors.ts\n * engineColor(), never picked by index.\n *\n * STATUS — unchanged; always travels with a text label.\n *\n * Mandatory secondary encoding (direct or legend labels, and the TableView\n * twin every chart has) stays in place whatever the palette scores — colour\n * is never the only carrier of meaning.\n */\n:root {\n /* Categorical identity (fixed order; see tokens.css for the derivation). */\n --chart-series-1: var(--data-cat-1); /* steel */\n --chart-series-2: var(--data-cat-2); /* olive */\n --chart-series-3: var(--data-cat-3); /* wine */\n --chart-series-4: var(--data-cat-4); /* purple */\n --chart-series-5: var(--data-cat-5); /* green */\n --chart-series-6: var(--data-cat-6); /* pink */\n\n /* Overflow \"Other\" bucket — never part of the identity rotation above. */\n --chart-neutral: var(--status-neutral-solid);\n\n /* Quantity: the fixed azure ramp, low → high. */\n --chart-seq-1: var(--data-seq-1);\n --chart-seq-2: var(--data-seq-2);\n --chart-seq-3: var(--data-seq-3);\n --chart-seq-4: var(--data-seq-4);\n --chart-seq-5: var(--data-seq-5);\n --chart-seq-6: var(--data-seq-6);\n --chart-seq-7: var(--data-seq-7);\n\n /* The single hue for magnitude and for one nominal series (one series\n needs no legend box — it takes this colour and a direct label). */\n --chart-sequential: var(--chart-seq-5);\n --chart-sequential-soft: var(--chart-seq-3);\n\n /* Diverging pair around a neutral midpoint: azure reads \"up / better\",\n danger reads \"down / worse\" (ForestPlot effect sizes, deltas). */\n --chart-diverging-pos: var(--chart-seq-5);\n --chart-diverging-neg: var(--status-danger-solid);\n --chart-diverging-mid: var(--border-strong);\n\n /* Unknown: gray, hatched at 45°, outlined. */\n --chart-unknown: var(--status-unknown-solid);\n --chart-unknown-hatch: repeating-linear-gradient(135deg, var(--chart-unknown) 0 1px, transparent 1px 5px);\n\n /* Queued / parked: an outline, no fill. */\n --chart-queued-outline: var(--status-neutral-solid);\n\n /* Chart chrome — hairline grid/axis, one step off the surface. */\n --chart-grid: var(--border-subtle);\n --chart-axis: var(--border-strong);\n --chart-surface: var(--bg-surface);\n --chart-tooltip-bg: var(--bg-surface-raised);\n --chart-tooltip-border: var(--border-default);\n\n /* Heat (CalendarHeatmap, MatrixHeatmap): four steps of the quantity ramp.\n Step 0 is a TRUE ZERO; \"no data\" is the unknown hatch or an outlined\n empty cell, never a colour on this ramp. */\n --chart-heat-0: var(--chart-grid);\n --chart-heat-1: var(--chart-seq-2);\n --chart-heat-2: var(--chart-seq-3);\n --chart-heat-3: var(--chart-seq-5);\n --chart-heat-4: var(--chart-seq-7);\n\n /* Gauge/meter track: the lightest step of the fill's own ramp. */\n --chart-track: var(--chart-seq-1);\n\n /* Ink for a number printed on a NEAR-surface quantity cell (colors.ts\n quantityInk, steps 1–4). The END of the gray ramp, not --text-primary:\n the two are the same #09090b in light, but in dark --text-primary is\n #f4f4f5, which measured 4.49:1 on --chart-seq-4 (rgb 31 110 214) — just\n under AA for 12 px digits. --gray-950 flips to #fafafa there: 4.72:1.\n Asserted per step and theme in charts/chart-contrast.test.ts. */\n --chart-quantity-ink: var(--gray-950);\n}\n","/**\n * components/charts/chart-math.ts — the pure geometry and statistics behind\n * the V3.10 chart kit (AreaTrend, BarStack, Swimlane, Funnel, CalendarHeatmap,\n * BurnDown, Gauge). No React, no DOM: every function here is unit tested\n * directly, so a chart component is only layout glue around numbers that are\n * already proven.\n *\n * Honesty rule shared with types.ts: `null` is UNKNOWN and is never coerced to\n * 0 by anything in this file. Functions that need a number skip nulls and say\n * so in their return value.\n */\nimport { formatTick, tickUnit } from './format.js';\n\n// ---------------------------------------------------------------------------\n// Scales and ticks\n// ---------------------------------------------------------------------------\n\nexport interface NiceTickOptions {\n /**\n * The data are whole counts: ticks land on integers only (a max of 1 run\n * gives 0 and 1, never 0 / 0.25 / 0.5 / 0.75 / 1 of a run).\n */\n integer?: boolean;\n /**\n * Never step finer than this (pass a power of ten). axisTicks raises it\n * one decade at a time to reach a resolution a caller's formatter can\n * print — 0.01 for a two-decimal \"$\" formatter — before it ever resorts\n * to integer ticks.\n */\n minStep?: number;\n}\n\n/**\n * \"Nice\" axis ticks: a step of 1, 2 or 5 × 10^n (and 25 × 10^n from 25 up)\n * chosen so there are about `count` intervals, starting at or below `min`\n * and ending at or above `max`. Clean numbers (0 / 250 / 500), never\n * 0 / 233.3 / 466.7.\n *\n * V3.10.1: a 2.5 step is only taken where it stays a whole number (25, 250,\n * …). 0.25 or 2.5 needs one more decimal than its magnitude, and every\n * one-decimal formatter in the app printed a 0–1 axis as\n * \"0 / 0.3 / 0.5 / 0.8 / 1\" — 0.2 steps say the same thing in clean numbers.\n */\nexport function niceTicks(min: number, max: number, count = 4, opts: NiceTickOptions = {}): number[] {\n if (!Number.isFinite(min) || !Number.isFinite(max)) return [0];\n if (max < min) [min, max] = [max, min];\n if (max === min) {\n if (max === 0) return [0, 1];\n const pad = Math.abs(max) * 0.5;\n return niceTicks(Math.min(0, min - pad), max + pad, count, opts);\n }\n const rawStep = (max - min) / Math.max(1, count);\n const magnitude = 10 ** Math.floor(Math.log10(rawStep));\n const residual = rawStep / magnitude;\n const allowQuarter = magnitude >= 10;\n const nice = residual <= 1 ? 1 : residual <= 2 ? 2 : residual <= 2.5 ? (allowQuarter ? 2.5 : 2) : residual <= 5 ? 5 : 10;\n let step = nice * magnitude;\n if (opts.integer && step < 1) step = 1;\n if (opts.minStep !== undefined && Number.isFinite(opts.minStep) && step < opts.minStep) step = opts.minStep;\n const start = Math.floor(min / step) * step;\n const end = Math.ceil(max / step) * step;\n const n = Math.round((end - start) / step);\n // Round away float drift (0.1 + 0.2) so labels stay clean; index-based so\n // the error never accumulates across a long axis.\n const decimals = Math.max(0, -Math.floor(Math.log10(step)) + 1);\n const ticks: number[] = [];\n for (let i = 0; i <= n; i++) ticks.push(Number((start + i * step).toFixed(decimals)) || 0);\n return ticks;\n}\n\n/** True when every value is a whole number — counts, not measurements. */\nexport function allIntegers(values: ReadonlyArray<number>): boolean {\n return values.every((v) => Number.isInteger(v));\n}\n\n/**\n * Does a caller's tick formatter print these ticks honestly? A formatter\n * that rounds (`${Math.round(v)}%`, one decimal, \"13K\") can print two ticks\n * the same, or print 0.25 as \"0.3\". Each label's first number must equal\n * its tick up to a power-of-ten unit change (50 % of 0.5, 12.5K of 12500);\n * labels with no number in them are taken at their word.\n */\nexport function labelsFaithful(ticks: ReadonlyArray<number>, labels: ReadonlyArray<string>): boolean {\n if (new Set(labels).size !== labels.length) return false;\n return ticks.every((tick, i) => {\n if (tick === 0) return true;\n const match = /\\d[\\d,]*(?:\\.\\d+)?/.exec(labels[i] ?? '');\n if (!match) return true;\n const shown = Number(match[0].replace(/,/g, ''));\n if (!Number.isFinite(shown) || shown === 0) return false;\n const ratio = shown / Math.abs(tick);\n const unit = 10 ** Math.round(Math.log10(ratio));\n return Math.abs(ratio / unit - 1) < 1e-6;\n });\n}\n\nexport interface AxisTicks {\n ticks: number[];\n labels: string[];\n step: number;\n}\n\n/**\n * Ticks AND their labels for a numeric axis. With no `format` the labels\n * take their precision from the step and share ONE unit, chosen from the\n * largest tick (format.ts tickUnit / formatTick). With a caller's `format`\n * (units: \"%\", \"$\", \"pts\") the ticks are coarsened until that formatter\n * prints every one of them faithfully — never a rounded label on a precise\n * tick.\n *\n * Coarsening order (V3.10.1 review): fewer ticks at the same resolution,\n * then one decade coarser at a time, and integer ticks only as the last\n * resort. Jumping straight to integers put a day of spend under half a cent\n * on a $0.00–$1.00 axis (the line drawn ~0.6 px off the baseline, reading as\n * a flat zero) when a $0.01 step prints faithfully.\n */\nexport function axisTicks(\n min: number,\n max: number,\n opts: { count?: number; integer?: boolean; format?: (v: number) => string } = {},\n): AxisTicks {\n const count = Math.max(1, opts.count ?? 4);\n const integer = opts.integer === true;\n const format = opts.format;\n const build = (c: number, asInteger: boolean, minStep?: number): AxisTicks => {\n const ticks = niceTicks(min, max, c, { integer: asInteger, minStep });\n const step = ticks.length > 1 ? ticks[1]! - ticks[0]! : 1;\n // One argument only: formatPercent(v, digits) must never get an index.\n if (format) return { ticks, labels: ticks.map((t) => format(t)), step };\n const unit = tickUnit(ticks, step);\n return { ticks, labels: ticks.map((t) => formatTick(t, step, unit)), step };\n };\n const first = build(count, integer);\n if (!opts.format || labelsFaithful(first.ticks, first.labels)) return first;\n if (!Number.isFinite(min) || !Number.isFinite(max) || !(first.step > 0)) return first;\n const faithfulAt = (asInteger: boolean, minStep?: number): AxisTicks | null => {\n for (let c = count; c >= 1; c--) {\n const candidate = build(c, asInteger, minStep);\n if (labelsFaithful(candidate.ticks, candidate.labels)) return candidate;\n }\n return null;\n };\n const sameResolution = faithfulAt(integer);\n if (sameResolution) return sameResolution;\n // One decade coarser at a time, up to ten times the data's own extent (a\n // step past that only draws the data flatter; the integer pass follows).\n const extent = Math.max(Math.abs(min), Math.abs(max), 1);\n for (let decade = Math.floor(Math.log10(first.step)) + 1; 10 ** decade <= extent * 10; decade++) {\n const coarser = faithfulAt(integer, Number((10 ** decade).toPrecision(1)));\n if (coarser) return coarser;\n }\n return faithfulAt(true) ?? first;\n}\n\n/**\n * What a formatter's \"%\" means: 100 when it prints 50 as \"50%\" (values are\n * percent points), 1 when it prints 0.5 as \"50%\" (values are fractions),\n * null when it is not a percent formatter at all.\n */\nexport function percentScale(format: (v: number) => string): 100 | 1 | null {\n const asPercent = (v: number): number | null => {\n const s = format(v).trim();\n if (!s.endsWith('%')) return null;\n const n = Number(s.slice(0, -1).replace(/[,\\s+]/g, ''));\n return Number.isFinite(n) ? n : null;\n };\n if (asPercent(50) === 50) return 100;\n if (asPercent(0.5) === 50) return 1;\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Time domains (V3.10.1)\n// ---------------------------------------------------------------------------\n\n/**\n * 2000-01-01T00:00:00Z. On a time axis anything earlier — 0 from a null\n * timestamp, a NaN from a failed parse — is a leak, not data: it drew an\n * axis starting \"Dec 31\" (1969, in the viewer's zone) on the live Verse.\n */\nexport const MIN_PLAUSIBLE_TIME = 946_684_800_000;\n\nexport function isPlausibleTime(ms: number): boolean {\n return Number.isFinite(ms) && ms >= MIN_PLAUSIBLE_TIME;\n}\n\n/**\n * An x axis is a time axis when any of its values is a plausible epoch-ms\n * timestamp. Small ordinals (0, 1, 2 — an index axis) are not, and keep\n * every finite value.\n */\nexport function isTimeAxis(xs: ReadonlyArray<number>): boolean {\n return xs.some(isPlausibleTime);\n}\n\n/** A filter for x values: on a time axis only plausible timestamps, otherwise any finite value. */\nexport function xKeeper(xs: ReadonlyArray<number>): (x: number) => boolean {\n return isTimeAxis(xs) ? isPlausibleTime : Number.isFinite;\n}\n\n/**\n * The narrowest time domain a chart draws: 10 minutes. A burst of readings\n * a few seconds apart used to stretch across the full width with three\n * identical time labels stacked on each other; widened, it sits as the\n * short cluster it is, on an axis whose ends read as two different times.\n */\nexport const MIN_TIME_SPAN_MS = 10 * 60_000;\n\n/**\n * Widen [min, max] to at least `minSpan`, around its middle ('center') or\n * keeping its right edge ('end' — for axes that end at now or a reset).\n */\nexport function ensureSpan(min: number, max: number, minSpan: number, align: 'center' | 'end' = 'center'): [number, number] {\n if (max < min) [min, max] = [max, min];\n if (max - min >= minSpan) return [min, max];\n if (align === 'end') return [max - minSpan, max];\n const mid = (min + max) / 2;\n return [mid - minSpan / 2, mid + minSpan / 2];\n}\n\n// ---------------------------------------------------------------------------\n// Label layout (V3.10.1): collision-free axis labels and dodged end labels\n// ---------------------------------------------------------------------------\n\n/**\n * Estimated advance of one label character at the DEFAULT display size:\n * --text-xs-size (12 px) × 0.6, the UI sans's average advance at medium\n * weight, rounded up so estimates err wide rather than letting two labels\n * touch.\n *\n * --text-xs-size is `12px * var(--ui-text-scale)`, and Appearance → Display\n * size sets that multiplier to 1.125 (Large) or 1.25 (XLarge). A chart must\n * budget at the size the text really renders — labelCharPx(useTextScale()) —\n * or the layout accepts a pair of 15 px labels as if they were 12 px ones\n * and prints them over each other (V3.10.1 review).\n */\nexport const LABEL_CHAR_PX = 12 * 0.6;\n\n/** A usable display text multiplier: anything non-finite or non-positive is the default, 1. */\nexport function validTextScale(textScale: number): number {\n return Number.isFinite(textScale) && textScale > 0 ? textScale : 1;\n}\n\n/** LABEL_CHAR_PX at a display text scale (1 Default, 1.125 Large, 1.25 XLarge). */\nexport function labelCharPx(textScale = 1): number {\n return LABEL_CHAR_PX * validTextScale(textScale);\n}\n\nexport function estimateTextWidth(text: string, charPx = LABEL_CHAR_PX): number {\n return text.length * charPx;\n}\n\n/**\n * Per-character budget of the y-axis tick gutters at 12 px — a shade under\n * LABEL_CHAR_PX because tick labels are mostly tabular digits.\n */\nconst TICK_CHAR_PX = 7;\n\n/**\n * Left gutter for right-aligned y tick labels: the widest label plus 10 px,\n * clamped to [floor, cap]. The per-character budget AND the cap scale with\n * the display text size (the cap was chosen for 12 px text); the floor is a\n * minimum, not a fit, and does not.\n */\nexport function tickGutter(labels: ReadonlyArray<string>, floor: number, cap: number, textScale = 1): number {\n const s = validTextScale(textScale);\n const widest = Math.max(0, ...labels.map((l) => l.length));\n return Math.min(cap * s, Math.max(floor, widest * TICK_CHAR_PX * s + 10));\n}\n\nexport type LabelAnchor = 'start' | 'middle' | 'end';\n\nexport interface AxisLabelSpec {\n key: string;\n /** Where the label points. */\n x: number;\n /** How it would like to hang off `x`. */\n anchor: LabelAnchor;\n /** Higher survives a collision: a marker / reset > the end > the start > interior ticks. */\n priority: number;\n /** The label at each detail level, most detailed first; the last entry repeats for deeper levels. */\n variants: ReadonlyArray<string>;\n /**\n * Required labels (the ends, markers) decide how far down the detail\n * ladder the axis goes; optional ones (interior ticks) are simply dropped\n * when they collide.\n */\n required?: boolean;\n}\n\nexport interface PlacedAxisLabel {\n key: string;\n text: string;\n x: number;\n anchor: LabelAnchor;\n}\n\nexport interface AxisLabelBounds {\n /** Leftmost / rightmost extent a label may occupy. */\n min: number;\n max: number;\n /** Minimum clear space between two labels. */\n gap?: number;\n charPx?: number;\n}\n\nfunction placeLevel(specs: ReadonlyArray<AxisLabelSpec>, level: number, bounds: AxisLabelBounds): PlacedAxisLabel[] {\n const gap = bounds.gap ?? 8;\n const order = specs.map((s, i) => ({ s, i })).sort((a, b) => b.s.priority - a.s.priority || a.i - b.i);\n const boxes: { left: number; right: number; text: string; i: number; label: PlacedAxisLabel }[] = [];\n for (const { s, i } of order) {\n const text = s.variants[Math.min(level, s.variants.length - 1)] ?? '';\n if (!text) continue;\n const w = estimateTextWidth(text, bounds.charPx);\n if (w > bounds.max - bounds.min) continue;\n let left = s.anchor === 'start' ? s.x : s.anchor === 'end' ? s.x - w : s.x - w / 2;\n let x = s.x;\n let anchor: LabelAnchor = s.anchor;\n // Keep the label inside the axis: pinned to an edge, it hangs off that edge.\n if (left < bounds.min) {\n left = bounds.min;\n x = bounds.min;\n anchor = 'start';\n } else if (left + w > bounds.max) {\n left = bounds.max - w;\n x = bounds.max;\n anchor = 'end';\n }\n const right = left + w;\n // Two labels that say the same thing are one label too many, wherever they sit.\n const clash = boxes.some((b) => b.text === text || (left < b.right + gap && b.left < right + gap));\n if (clash) continue;\n boxes.push({ left, right, text, i, label: { key: s.key, text, x, anchor } });\n }\n return boxes.sort((a, b) => a.i - b.i).map((b) => b.label);\n}\n\n/**\n * Lay out one axis's labels so none overlap. Every label at a level uses\n * the same rung of its detail ladder; the chosen level is the most detailed\n * one that places as many REQUIRED labels as any level can. Within a level,\n * higher priority wins a collision and the loser is dropped — so a tight\n * burn-down keeps \"Resets Sep 25\" and shortens or drops the start, rather\n * than printing the two over each other.\n */\nexport function layoutAxisLabels(specs: ReadonlyArray<AxisLabelSpec>, bounds: AxisLabelBounds): PlacedAxisLabel[] {\n if (specs.length === 0) return [];\n const levels = Math.max(1, ...specs.map((s) => s.variants.length));\n const requiredKeys = new Set(specs.filter((s) => s.required !== false).map((s) => s.key));\n let best: PlacedAxisLabel[] = [];\n let bestScore = -1;\n for (let level = 0; level < levels; level++) {\n const placed = placeLevel(specs, level, bounds);\n const score = placed.filter((p) => requiredKeys.has(p.key)).length;\n if (score > bestScore) {\n best = placed;\n bestScore = score;\n }\n if (bestScore === requiredKeys.size) break;\n }\n return best;\n}\n\n/**\n * Spread direct labels (end-of-line series names) vertically so none\n * overlaps: labels closer than `gap` merge into a cluster centred on their\n * own targets, clamped inside [top, bottom]. Returns each key's y, or null\n * when they cannot all fit — the caller then falls back to the legend\n * alone rather than drawing labels over each other. Ties keep input order.\n */\nexport function dodgeLabels(\n items: ReadonlyArray<{ key: string; y: number }>,\n gap: number,\n top: number,\n bottom: number,\n): Map<string, number> | null {\n if (items.length === 0) return new Map();\n if ((items.length - 1) * gap > bottom - top + 1e-9) return null;\n const sorted = items.map((it, i) => ({ ...it, i })).sort((a, b) => a.y - b.y || a.i - b.i);\n interface Cluster { members: typeof sorted; top: number }\n const place = (members: typeof sorted): Cluster => {\n const mean = members.reduce((s, m) => s + m.y, 0) / members.length;\n const extent = (members.length - 1) * gap;\n return { members, top: clamp(mean - extent / 2, top, bottom - extent) };\n };\n let clusters: Cluster[] = sorted.map((m) => place([m]));\n for (let merged = true; merged; ) {\n merged = false;\n for (let i = 0; i + 1 < clusters.length; i++) {\n const a = clusters[i]!;\n const b = clusters[i + 1]!;\n if (a.top + a.members.length * gap > b.top + 1e-9) {\n clusters = [...clusters.slice(0, i), place([...a.members, ...b.members]), ...clusters.slice(i + 2)];\n merged = true;\n break;\n }\n }\n }\n const out = new Map<string, number>();\n for (const c of clusters) c.members.forEach((m, k) => out.set(m.key, c.top + k * gap));\n return out;\n}\n\n/** Linear map from [d0, d1] to [r0, r1]; a zero-width domain maps to the range midpoint. */\nexport function linearScale(d0: number, d1: number, r0: number, r1: number): (v: number) => number {\n const span = d1 - d0;\n if (span === 0) return () => (r0 + r1) / 2;\n return (v: number) => r0 + ((v - d0) / span) * (r1 - r0);\n}\n\n/** Evenly thinned indexes so at most `max` labels are drawn, always keeping the last one. */\nexport function thinIndexes(length: number, max: number): number[] {\n if (length <= 0) return [];\n if (max <= 1) return [length - 1];\n if (length <= max) return Array.from({ length }, (_, i) => i);\n const step = Math.ceil((length - 1) / (max - 1));\n const out: number[] = [];\n for (let i = length - 1; i >= 0; i -= step) out.push(i);\n return out.reverse();\n}\n\n/** Clamp to [lo, hi]. */\nexport function clamp(v: number, lo: number, hi: number): number {\n return Math.min(hi, Math.max(lo, v));\n}\n\n// ---------------------------------------------------------------------------\n// Runs (null-aware line segments)\n// ---------------------------------------------------------------------------\n\nexport interface XY {\n x: number;\n y: number;\n}\n\n/** Split a series at nulls so a gap renders as a break, never as a dip to zero. */\nexport function splitRuns(points: ReadonlyArray<{ x: number; y: number | null }>): XY[][] {\n const runs: XY[][] = [];\n let current: XY[] = [];\n for (const p of points) {\n if (p.y === null || !Number.isFinite(p.y)) {\n if (current.length) runs.push(current);\n current = [];\n continue;\n }\n current.push({ x: p.x, y: p.y });\n }\n if (current.length) runs.push(current);\n return runs;\n}\n\nexport function linePath(run: ReadonlyArray<XY>): string {\n return run.map((p, i) => `${i === 0 ? 'M' : 'L'}${round(p.x)},${round(p.y)}`).join(' ');\n}\n\n/** Closed area under (or between) a run and a baseline run of equal length. */\nexport function areaPath(top: ReadonlyArray<XY>, bottom: ReadonlyArray<XY>): string {\n if (top.length === 0) return '';\n const back = [...bottom].reverse();\n return `${linePath(top)} ${back.map((p) => `L${round(p.x)},${round(p.y)}`).join(' ')} Z`;\n}\n\nexport function round(v: number): number {\n return Math.round(v * 10) / 10;\n}\n\n// ---------------------------------------------------------------------------\n// Stacking\n// ---------------------------------------------------------------------------\n\nexport interface StackSegment {\n /** Segment index in the caller's segment list. */\n index: number;\n value: number;\n y0: number;\n y1: number;\n}\n\nexport interface StackedColumn {\n segments: StackSegment[];\n /** Sum of known values. */\n total: number;\n /** True when at least one segment value is null (the total is a lower bound). */\n incomplete: boolean;\n /** True when every segment value is null (nothing is known). */\n unknown: boolean;\n}\n\n/** Stack one column's values bottom-up. Nulls are skipped and flagged, zeros take no height. */\nexport function stackColumn(values: ReadonlyArray<number | null>): StackedColumn {\n let acc = 0;\n let incomplete = false;\n let known = 0;\n const segments: StackSegment[] = [];\n values.forEach((value, index) => {\n if (value === null || !Number.isFinite(value)) {\n incomplete = true;\n return;\n }\n known++;\n const v = Math.max(0, value);\n if (v > 0) segments.push({ index, value: v, y0: acc, y1: acc + v });\n acc += v;\n });\n return { segments, total: acc, incomplete, unknown: known === 0 && values.length > 0 };\n}\n\n// ---------------------------------------------------------------------------\n// Rounded-end bars (4 px data end, square at the baseline)\n// ---------------------------------------------------------------------------\n\n/**\n * Path for a vertical bar whose TOP corners are rounded by `r` (the data end)\n * and whose bottom sits square on the baseline. `r` shrinks for short bars so\n * the corners never cross.\n */\nexport function roundedTopBar(x: number, y: number, w: number, h: number, r = 4): string {\n if (h <= 0 || w <= 0) return '';\n const rr = Math.max(0, Math.min(r, w / 2, h));\n return [\n `M${round(x)},${round(y + h)}`,\n `L${round(x)},${round(y + rr)}`,\n `Q${round(x)},${round(y)} ${round(x + rr)},${round(y)}`,\n `L${round(x + w - rr)},${round(y)}`,\n `Q${round(x + w)},${round(y)} ${round(x + w)},${round(y + rr)}`,\n `L${round(x + w)},${round(y + h)}`,\n 'Z',\n ].join(' ');\n}\n\n/** Horizontal twin: RIGHT corners rounded (the data end), left square on the baseline. */\nexport function roundedRightBar(x: number, y: number, w: number, h: number, r = 4): string {\n if (h <= 0 || w <= 0) return '';\n const rr = Math.max(0, Math.min(r, h / 2, w));\n return [\n `M${round(x)},${round(y)}`,\n `L${round(x + w - rr)},${round(y)}`,\n `Q${round(x + w)},${round(y)} ${round(x + w)},${round(y + rr)}`,\n `L${round(x + w)},${round(y + h - rr)}`,\n `Q${round(x + w)},${round(y + h)} ${round(x + w - rr)},${round(y + h)}`,\n `L${round(x)},${round(y + h)}`,\n 'Z',\n ].join(' ');\n}\n\n// ---------------------------------------------------------------------------\n// Funnel\n// ---------------------------------------------------------------------------\n\nexport interface FunnelStep {\n value: number | null;\n /** Share of the FIRST stage (0..1), null when either side is unknown or the first is 0. */\n ofFirst: number | null;\n /** Share of the PREVIOUS stage (0..1), null for the first stage or when unknown. */\n ofPrevious: number | null;\n}\n\nexport function funnelSteps(values: ReadonlyArray<number | null>): FunnelStep[] {\n const first = values[0] ?? null;\n return values.map((value, i) => {\n const previous = i > 0 ? values[i - 1] ?? null : null;\n return {\n value,\n ofFirst: value !== null && first !== null && first > 0 ? value / first : null,\n ofPrevious: i > 0 && value !== null && previous !== null && previous > 0 ? value / previous : null,\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Calendar heatmap\n// ---------------------------------------------------------------------------\n\nexport interface CalendarCell {\n day: string;\n value: number | null;\n /** Column (week index from the first rendered week). */\n week: number;\n /** Row, 0 = weekStart. */\n weekday: number;\n /** True for days before the first datum / after the last (padding cells). */\n outside: boolean;\n}\n\nexport interface CalendarGrid {\n cells: CalendarCell[];\n weeks: number;\n /** Week index where each month first appears, for the month labels. */\n months: { week: number; label: string }[];\n}\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nfunction utcDayMs(day: string): number | null {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(day)) return null;\n const ms = Date.parse(`${day}T00:00:00Z`);\n return Number.isFinite(ms) && new Date(ms).toISOString().slice(0, 10) === day ? ms : null;\n}\n\n/**\n * Lay out consecutive days on a weeks × weekdays grid. Input days may be\n * sparse or unordered; missing days in the span become `value: null`\n * (unknown), never 0. `weekStart` 1 = Monday (ISO), 0 = Sunday.\n */\nexport function calendarGrid(\n days: ReadonlyArray<{ day: string; value: number | null }>,\n weekStart: 0 | 1 = 1,\n): CalendarGrid {\n const byDay = new Map<string, number | null>();\n let minMs = Infinity;\n let maxMs = -Infinity;\n for (const d of days) {\n const ms = utcDayMs(d.day);\n // A pre-2000 day is a null/zero date that leaked through, not a datum —\n // one would stretch the grid back to 1970.\n if (ms === null || ms < MIN_PLAUSIBLE_TIME) continue;\n byDay.set(d.day, d.value);\n minMs = Math.min(minMs, ms);\n maxMs = Math.max(maxMs, ms);\n }\n if (!Number.isFinite(minMs)) return { cells: [], weeks: 0, months: [] };\n const DAY = 86_400_000;\n const firstWeekday = (new Date(minMs).getUTCDay() - weekStart + 7) % 7;\n const gridStart = minMs - firstWeekday * DAY;\n const lastWeekday = (new Date(maxMs).getUTCDay() - weekStart + 7) % 7;\n const gridEnd = maxMs + (6 - lastWeekday) * DAY;\n const cells: CalendarCell[] = [];\n const months: { week: number; label: string }[] = [];\n let lastMonth = -1;\n for (let ms = gridStart, i = 0; ms <= gridEnd; ms += DAY, i++) {\n const day = new Date(ms).toISOString().slice(0, 10);\n const week = Math.floor(i / 7);\n const weekday = i % 7;\n const outside = ms < minMs || ms > maxMs;\n cells.push({ day, value: outside ? null : byDay.has(day) ? byDay.get(day)! : null, week, weekday, outside });\n const month = new Date(ms).getUTCMonth();\n // First rendered week of each month; the component drops a label that\n // would collide with the previous one.\n if (!outside && month !== lastMonth) {\n months.push({ week, label: MONTHS[month]! });\n lastMonth = month;\n }\n }\n return { cells, weeks: Math.floor((gridEnd - gridStart) / DAY / 7) + 1, months };\n}\n\n/**\n * Bucket a value into 0..steps for a sequential ramp: 0 is reserved for a\n * true zero, 1..steps split (0, max] evenly. null → null (unknown).\n */\nexport function heatBucket(value: number | null, max: number, steps = 4): number | null {\n if (value === null || !Number.isFinite(value)) return null;\n if (value <= 0 || max <= 0) return 0;\n return clamp(Math.ceil((value / max) * steps), 1, steps);\n}\n\n// ---------------------------------------------------------------------------\n// Burn-down projection\n// ---------------------------------------------------------------------------\n\nexport interface BurnPoint {\n t: number;\n remaining: number | null;\n}\n\nexport interface BurnProjection {\n /** Units per millisecond (negative while burning). Null with fewer than two known points. */\n slopePerMs: number | null;\n /** When the projection crosses 0, if it does before `resetAt`. */\n exhaustAt: number | null;\n /** When it crosses `reserve`, if a reserve is set and it does before `resetAt`. */\n reserveAt: number | null;\n /** Projected remaining at reset (clamped at 0), or null when there is no slope. */\n remainingAtReset: number | null;\n /** The last known point the projection starts from. */\n from: { t: number; remaining: number } | null;\n}\n\n/**\n * Least-squares slope over the most recent `window` known points, projected\n * forward from the last known point. A flat or rising series never\n * \"exhausts\". Pure: the caller supplies `resetAt`.\n *\n * `resetAt` null (or non-finite) is an UNKNOWN reset: nothing is projected\n * forward — there is no moment to project to — so only a line the window\n * has ALREADY crossed is reported, and remainingAtReset is null. (An\n * epoch-0 reset used to fail every `at <= resetAt` check and come back as\n * \"no crossing, current remaining at reset\": a green verdict for a seat\n * burning 10%/h.)\n */\nexport function projectBurnDown(\n points: ReadonlyArray<BurnPoint>,\n resetAtIn: number | null,\n opts: { window?: number; reserve?: number | null } = {},\n): BurnProjection {\n const resetAt = resetAtIn !== null && Number.isFinite(resetAtIn) ? resetAtIn : null;\n const known = points\n .filter((p): p is { t: number; remaining: number } => p.remaining !== null && Number.isFinite(p.remaining) && Number.isFinite(p.t))\n .sort((a, b) => a.t - b.t);\n const from = known.length ? known[known.length - 1]! : null;\n const recent = known.slice(-(opts.window ?? 6));\n if (!from || recent.length < 2) {\n return { slopePerMs: null, exhaustAt: null, reserveAt: null, remainingAtReset: null, from };\n }\n const n = recent.length;\n const meanT = recent.reduce((s, p) => s + p.t, 0) / n;\n const meanR = recent.reduce((s, p) => s + p.remaining, 0) / n;\n let num = 0;\n let den = 0;\n for (const p of recent) {\n num += (p.t - meanT) * (p.remaining - meanR);\n den += (p.t - meanT) ** 2;\n }\n const slope = den === 0 ? 0 : num / den;\n const crossing = (level: number): number | null => {\n if (from.remaining <= level) return from.t;\n if (slope >= 0 || resetAt === null) return null;\n const at = from.t + (level - from.remaining) / slope;\n return at <= resetAt ? at : null;\n };\n const reserve = opts.reserve ?? null;\n return {\n slopePerMs: slope,\n exhaustAt: crossing(0),\n reserveAt: reserve === null ? null : crossing(reserve),\n remainingAtReset: resetAt === null ? null : Math.max(0, from.remaining + slope * Math.max(0, resetAt - from.t)),\n from,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Gauge arcs\n// ---------------------------------------------------------------------------\n\n/** Point on a circle; angle in radians, 0 = +x axis, measured counter-clockwise (SVG y flipped). */\nexport function polar(cx: number, cy: number, r: number, angle: number): XY {\n return { x: cx + r * Math.cos(angle), y: cy - r * Math.sin(angle) };\n}\n\n/**\n * SVG arc for a 180° gauge from fraction `f0` to `f1` (0 = left end, 1 =\n * right end, sweeping over the top). Fractions are clamped to [0, 1].\n */\nexport function gaugeArc(cx: number, cy: number, r: number, f0: number, f1: number): string {\n const a = clamp(f0, 0, 1);\n const b = clamp(f1, 0, 1);\n if (b <= a) return '';\n const start = polar(cx, cy, r, Math.PI * (1 - a));\n const end = polar(cx, cy, r, Math.PI * (1 - b));\n // A 180° gauge never needs the large-arc flag (the span is at most π).\n return `M${round(start.x)},${round(start.y)} A${r},${r} 0 0 1 ${round(end.x)},${round(end.y)}`;\n}\n\nexport type GaugeSeverity = 'ok' | 'warn' | 'danger' | 'unknown';\n\nexport function gaugeSeverity(value: number | null, warn: number, danger: number): GaugeSeverity {\n if (value === null || !Number.isFinite(value)) return 'unknown';\n if (value >= danger) return 'danger';\n if (value >= warn) return 'warn';\n return 'ok';\n}\n","/**\n * components/charts/useChartWidth.ts — the measured pixel width of a chart's\n * container, so the V3.10 charts draw at their REAL size (text stays 12 px at\n * 375 px wide) instead of scaling a fixed viewBox down until labels are\n * unreadable. Falls back to `fallback` until measured (jsdom, SSR, first paint).\n */\nimport { useLayoutEffect, useState, type RefObject } from 'react';\n\n/** Narrowest width any chart lays itself out for (a 375 px phone minus padding). */\nexport const MIN_CHART_WIDTH = 280;\n\nexport function useChartWidth(ref: RefObject<HTMLElement | null>, fixed: number | undefined, fallback = 640): number {\n const [measured, setMeasured] = useState<number | null>(null);\n // WHY track the node: a chart whose frame starts in a non-ready state\n // (loading / empty / dark) mounts its plot — and so this ref — LATER than\n // the hook. An effect keyed only on the ref object never re-ran, so every\n // chart that first rendered \"Loading…\" stayed at the 640 px fallback and\n // was scaled down by CSS (V3.10 fix, found in the 1440 harness).\n const [node, setNode] = useState<HTMLElement | null>(null);\n // Runs after every render on purpose (ref.current is not a dependency React\n // can see); the equality guard makes it settle in one pass, never a loop.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useLayoutEffect(() => {\n if (ref.current !== node) setNode(ref.current);\n });\n useLayoutEffect(() => {\n if (fixed !== undefined) return undefined;\n const el = node;\n if (!el) return undefined;\n const read = (): void => {\n const w = Math.floor(el.getBoundingClientRect().width);\n // 0 means \"not laid out yet\" (hidden tab, jsdom) — keep the fallback.\n if (w > 0) setMeasured((prev) => (prev === w ? prev : w));\n };\n read();\n if (typeof ResizeObserver === 'undefined') return undefined;\n // rAF-coalesced: a drag-resize fires many entries per frame.\n let frame = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(read);\n });\n observer.observe(el);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [node, fixed]);\n return Math.max(MIN_CHART_WIDTH, fixed ?? measured ?? fallback);\n}\n","/**\n * components/charts/useTextScale.ts — the operator's Display size, as the\n * multiplier every type token carries: --ui-text-scale is 1 at Default,\n * 1.125 at Large and 1.25 at XLarge (clamped back to 1.125 for XLarge under\n * 1100 px — see the [data-ui-scale] blocks in design/tokens.css).\n *\n * Charts lay labels out from WIDTH ESTIMATES (chart-math layoutAxisLabels,\n * dodgeLabels, tickGutter) written for 12 px text. This is what they\n * multiply those estimates by, so the no-overlap guarantee holds at the size\n * the labels actually render instead of only at Default (V3.10.1 review:\n * at XLarge a weekly burn-down's start and reset labels overprinted).\n *\n * Read from <html>, where data/appearance-store.ts sets data-ui-scale and\n * tokens.css resolves --ui-text-scale. ONE shared subscription for every\n * chart on screen — a MutationObserver for the setting and a resize\n * listener for the narrow-window clamp (a media query) — not one per chart.\n */\nimport { useSyncExternalStore } from 'react';\nimport { validTextScale } from './chart-math.js';\n\n/** --ui-text-scale as computed on `root` (default <html>); 1 when unset or unreadable. */\nexport function readTextScale(root: Element | null = typeof document === 'undefined' ? null : document.documentElement): number {\n if (!root || typeof getComputedStyle !== 'function') return 1;\n return validTextScale(Number.parseFloat(getComputedStyle(root).getPropertyValue('--ui-text-scale')));\n}\n\nconst listeners = new Set<() => void>();\nlet current: number | null = null;\nlet stopWatching: (() => void) | null = null;\n\nfunction refresh(): void {\n const next = readTextScale();\n if (next === current) return;\n current = next;\n for (const listener of listeners) listener();\n}\n\nfunction watch(): () => void {\n current = readTextScale();\n const root = document.documentElement;\n // `style` as well as the attribute: an inline --ui-text-scale is the same\n // setting, and the check is one computed-style read per mutation batch.\n const observer = typeof MutationObserver === 'undefined' ? null : new MutationObserver(refresh);\n observer?.observe(root, { attributes: true, attributeFilter: ['data-ui-scale', 'style'] });\n const raf = typeof requestAnimationFrame === 'function';\n let frame = 0;\n const onResize = (): void => {\n if (!raf) return refresh();\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(refresh);\n };\n window.addEventListener('resize', onResize);\n return () => {\n observer?.disconnect();\n if (raf) cancelAnimationFrame(frame);\n window.removeEventListener('resize', onResize);\n };\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n if (listeners.size === 1 && typeof document !== 'undefined') stopWatching = watch();\n return () => {\n listeners.delete(listener);\n if (listeners.size > 0) return;\n stopWatching?.();\n stopWatching = null;\n current = null;\n };\n}\n\nfunction getSnapshot(): number {\n return current ?? readTextScale();\n}\n\n/** The display text multiplier; re-renders the caller when the operator changes Display size. */\nexport function useTextScale(): number {\n return useSyncExternalStore(subscribe, getSnapshot, () => 1);\n}\n",".table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--text-xs-size);\n}\n\n.table th,\n.table td {\n text-align: left;\n padding: var(--space-1) var(--space-2);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.table th {\n color: var(--text-tertiary);\n font-weight: var(--font-weight-medium);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n font-size: var(--text-xs-size);\n}\n\n.numeric {\n text-align: right;\n font-variant-numeric: tabular-nums;\n}\n\n.empty {\n color: var(--text-tertiary);\n text-align: center;\n}\n","/**\n * components/charts/TableView.tsx — the WCAG-clean accessibility twin every\n * chart should ship (dataviz skill: \"no table view / color-only encoding on\n * a continuous scale\" is an anti-pattern). Every value a chart's tooltip or\n * direct label shows must also be reachable here without hovering anything.\n */\nimport type { ReactNode } from 'react';\nimport styles from './TableView.module.css';\n\nexport interface TableColumn<T> {\n key: string;\n label: string;\n numeric?: boolean;\n render: (row: T) => ReactNode;\n}\n\nexport function TableView<T>({\n caption,\n columns,\n rows,\n rowKey,\n emptyMessage = 'No rows.',\n}: {\n caption: string;\n columns: TableColumn<T>[];\n rows: T[];\n rowKey: (row: T, index: number) => string;\n /** Shown as a single full-width row when `rows` is empty (V3.10). */\n emptyMessage?: string;\n}) {\n return (\n <table className={styles.table}>\n <caption className=\"visually-hidden\">{caption}</caption>\n <thead>\n <tr>\n {columns.map((c) => (\n <th key={c.key} scope=\"col\" className={c.numeric ? styles.numeric : undefined}>\n {c.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 ? (\n <tr>\n <td colSpan={Math.max(1, columns.length)} className={styles.empty}>\n {emptyMessage}\n </td>\n </tr>\n ) : null}\n {rows.map((row, i) => (\n <tr key={rowKey(row, i)}>\n {columns.map((c) => (\n <td key={c.key} className={c.numeric ? styles.numeric : undefined}>\n {c.render(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n","/* Shared plot chrome for the V3.10 charts: recessive hairline grid/axes,\n text in text tokens (never the series colour), one tooltip style. */\n.plotWrap {\n position: relative;\n width: 100%;\n min-width: 0;\n}\n\n.svg {\n display: block;\n overflow: visible;\n max-width: 100%;\n}\n\n.grid {\n stroke: var(--chart-grid);\n stroke-width: 1;\n shape-rendering: crispEdges;\n}\n\n.axis {\n stroke: var(--chart-axis);\n stroke-width: 1;\n shape-rendering: crispEdges;\n}\n\n.tick {\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n fill: var(--text-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n.label {\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n fill: var(--text-secondary);\n}\n\n.labelStrong {\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-medium);\n fill: var(--text-primary);\n}\n\n.line {\n fill: none;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.wash {\n stroke: none;\n opacity: 0.1;\n}\n\n.reference {\n fill: none;\n stroke: var(--text-tertiary);\n stroke-width: 1;\n stroke-dasharray: 4 3;\n}\n\n.projection {\n fill: none;\n stroke-width: 2;\n stroke-dasharray: 5 4;\n stroke-linecap: round;\n}\n\n.marker {\n stroke: var(--chart-surface);\n stroke-width: 2;\n}\n\n.crosshair {\n stroke: var(--chart-axis);\n stroke-width: 1;\n pointer-events: none;\n}\n\n.hit {\n fill: transparent;\n cursor: default;\n}\n\n.hit:focus {\n outline: none;\n}\n\n.hit:focus-visible {\n stroke: var(--border-focus);\n stroke-width: 2;\n}\n\n.focusable:focus {\n outline: none;\n}\n\n.focusable:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 2px;\n border-radius: var(--radius-sm);\n}\n\n.track {\n fill: var(--chart-track);\n}\n\n/* V3.10.1 — the empty part of a bar that is a share of something (Funnel):\n NEUTRAL, because the azure --chart-track reads as \"a little\" — at zero a\n whole row of it read as 100%. It is the app's empty-meter token, not the\n heat-0 hairline gray it first borrowed: that measured 1.18:1 / 1.14:1 on\n the card, so a zero stage was blank space and a bar's length had nothing\n to be read against. --meter-track is 1.83:1 light / 2.06:1 dark (the\n floor tokens.css holds an empty meter to) while the azure fill stays\n 2.66:1 / 2.50:1 against it — a 3:1 track would cut that data edge to\n ~1.6:1, and each stage's count and rate are printed beside its bar.\n Asserted in charts/chart-contrast.test.ts. */\n.trackEmpty {\n fill: var(--meter-track);\n}\n\n.noData {\n fill: none;\n stroke: var(--chart-grid);\n stroke-width: 1;\n stroke-dasharray: 2 2;\n}\n\n.tooltip {\n position: absolute;\n z-index: var(--z-dropdown);\n pointer-events: none;\n transform: translate(-50%, calc(-100% - 8px));\n padding: var(--space-2);\n border: 1px solid var(--chart-tooltip-border);\n border-radius: var(--radius-sm);\n background: var(--chart-tooltip-bg);\n box-shadow: var(--shadow-md);\n color: var(--text-primary);\n font-size: var(--text-xs-size);\n white-space: nowrap;\n}\n\n.tooltipTitle {\n color: var(--text-tertiary);\n margin-bottom: var(--space-1);\n}\n\n.tooltipRow {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n}\n\n.tooltipKey {\n width: 8px;\n height: 8px;\n border-radius: 2px;\n flex: none;\n}\n\n.tooltipValue {\n margin-left: auto;\n padding-left: var(--space-3);\n font-weight: var(--font-weight-semibold);\n font-variant-numeric: tabular-nums;\n}\n\n.tooltipMuted {\n color: var(--text-tertiary);\n font-style: italic;\n}\n\n.legend {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-1) var(--space-3);\n margin: var(--space-2) 0 0;\n padding: 0;\n list-style: none;\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n\n.legendItem {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n}\n\n.swatch {\n width: 10px;\n height: 10px;\n border-radius: 2px;\n flex: none;\n}\n\n.swatchLine {\n width: 12px;\n height: 2px;\n flex: none;\n}\n\n.swatchEmpty {\n width: 10px;\n height: 10px;\n border-radius: 2px;\n flex: none;\n border: 1px dashed var(--chart-axis);\n}\n\n.note {\n margin: var(--space-2) 0 0;\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n\n.srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .animated {\n transition: opacity 120ms ease;\n }\n}\n\n/* V3.10 — engine monogram beside a lane label (EngineTick). */\n.monogram {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n fill: var(--text-secondary);\n /* 3.11.1: the tick draws a provider mark (nested svg, currentColor). */\n color: var(--text-secondary);\n}\n\n/* V3.10 — an unknown mark: hatch fill (set inline via url(#id)) + outline. */\n.unknownMark {\n stroke: var(--chart-unknown);\n stroke-width: 1;\n}\n\n/* A swatch in a legend that stands for \"unknown / not measured\". */\n.swatchHatch {\n width: 10px;\n height: 10px;\n border-radius: 2px;\n flex: none;\n border: 1px solid var(--chart-unknown);\n background: var(--chart-unknown-hatch);\n}\n\n/* Text laid over the plot (reference labels): a surface-coloured halo keeps it\n legible where it crosses a line, in both themes. */\n.halo {\n paint-order: stroke;\n stroke: var(--chart-surface);\n stroke-width: 3px;\n stroke-linejoin: round;\n}\n","/**\n * components/charts/ChartParts.tsx — small shared pieces of the V3.10 charts:\n * the legend list, the tooltip, the unknown hatch and the engine tick.\n * Identity is never colour alone: every swatch sits beside its text label,\n * and text always wears text tokens.\n */\nimport type { ReactNode } from 'react';\nimport { UNKNOWN_HATCH, engineColor, type ChartEngine } from './colors.js';\nimport plot from './plot.module.css';\nimport { ProviderLogo } from '../primitives/ProviderLogo.js';\n\nexport interface ChartLegendItem {\n label: string;\n color?: string;\n /** `hatch` = the unknown texture (not measured), never a colour. */\n kind?: 'swatch' | 'line' | 'empty' | 'hatch';\n}\n\n/** Renders nothing for fewer than `min` items (a lone series is named by the title). */\nexport function ChartLegend({ items, min = 2 }: { items: ChartLegendItem[]; min?: number }): ReactNode {\n if (items.length < min) return null;\n return (\n <ul className={plot.legend}>\n {items.map((item) => (\n <li key={item.label} className={plot.legendItem}>\n <span\n aria-hidden=\"true\"\n className={\n item.kind === 'line' ? plot.swatchLine : item.kind === 'empty' ? plot.swatchEmpty : item.kind === 'hatch' ? plot.swatchHatch : plot.swatch\n }\n style={item.kind === 'empty' || item.kind === 'hatch' ? undefined : { background: item.color }}\n />\n {item.label}\n </li>\n ))}\n </ul>\n );\n}\n\nexport interface TooltipRow {\n key: string;\n label: string;\n value: string | null;\n color?: string;\n}\n\n/**\n * Positioned in the plot's own pixel space (the plot wrapper is\n * position:relative). `left` is clamped by the caller so it never overflows.\n */\nexport function ChartTooltip({ left, top, title, rows }: { left: number; top: number; title: string; rows: TooltipRow[] }) {\n return (\n <div className={plot.tooltip} style={{ left, top }} role=\"presentation\">\n <div className={plot.tooltipTitle}>{title}</div>\n {rows.map((row) => (\n <div key={row.key} className={plot.tooltipRow}>\n {row.color ? <span className={plot.tooltipKey} style={{ background: row.color }} aria-hidden=\"true\" /> : null}\n <span>{row.label}</span>\n {row.value === null ? (\n <span className={`${plot.tooltipValue} ${plot.tooltipMuted}`}>no data</span>\n ) : (\n <span className={plot.tooltipValue}>{row.value}</span>\n )}\n </div>\n ))}\n </div>\n );\n}\n\n/** Keep a centred tooltip inside [margin, width - margin]. */\nexport function clampTooltipLeft(x: number, width: number, margin = 70): number {\n return Math.min(Math.max(x, Math.min(margin, width / 2)), Math.max(width - margin, width / 2));\n}\n\n// ---------------------------------------------------------------------------\n// Unknown hatch (V3.10) — one <pattern> per chart instance\n// ---------------------------------------------------------------------------\n\n/**\n * The 45° unknown hatch as an SVG <pattern>. Render it inside the chart's own\n * <svg><defs> with an id from `hatchPatternId(useId())` (colors.ts) — ids are\n * document-global, so a shared literal id would let one chart's unmount blank\n * another's hatch — then fill unknown marks with `url(#id)` and outline them\n * with CHART_UNKNOWN. Texture, not hue, is what separates \"not measured\" from\n * a low value, so it survives colour-blindness and greyscale print.\n */\nexport function HatchPattern({ id }: { id: string }) {\n const { size, angle, strokeWidth, stroke } = UNKNOWN_HATCH;\n return (\n <pattern id={id} width={size} height={size} patternUnits=\"userSpaceOnUse\" patternTransform={`rotate(${angle})`}>\n <line x1={0} y1={0} x2={0} y2={size} stroke={stroke} strokeWidth={strokeWidth} />\n </pattern>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Engine identity (V3.10) — a 2px tick plus a one-letter monogram\n// ---------------------------------------------------------------------------\n\nconst ENGINE_LETTER: Readonly<Record<ChartEngine, string>> = { claude: 'C', codex: 'X', grok: 'G', local: 'L' };\n\n/** The monogram letter for an engine (mirrors workbench-types ENGINE_MONOGRAM; charts stay core-free). */\nexport function engineLetter(engine: ChartEngine): string {\n return ENGINE_LETTER[engine];\n}\n\n/**\n * SVG engine mark for a lane label: the 2px identity tick and the provider's\n * mark (3.11.1, ProviderLogo). The engine's NAME still travels in the lane's\n * spoken summary and the table — the mark is a glance aid only.\n */\nexport function EngineTick({ engine, x, y, height }: { engine: ChartEngine; x: number; y: number; height: number }) {\n return (\n <g data-engine={engine} aria-hidden=\"true\">\n <rect x={x} y={y} width={2} height={height} rx={1} fill={engineColor(engine)} />\n <ProviderLogo engine={engine} x={x + 5} y={y + height / 2 - 6} size={12} className={plot.monogram} />\n </g>\n );\n}\n\n/** A quiet ⋯ glyph (three dots), currentColor, 16px. */\nexport function MoreGlyph() {\n return (\n <svg width={16} height={16} viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx={3.5} cy={8} r={1.4} fill=\"currentColor\" />\n <circle cx={8} cy={8} r={1.4} fill=\"currentColor\" />\n <circle cx={12.5} cy={8} r={1.4} fill=\"currentColor\" />\n </svg>\n );\n}\n",".frame {\n margin: 0;\n min-width: 0;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n /* V3.10: 16px (12px compact density) — the card-pad token follows density. */\n padding: var(--card-pad, var(--space-4));\n}\n\n.header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--space-3);\n /* Never wrap: the actions (and the ⋯ view menu) stay in the head beside the\n title at every width; a long description wraps inside .heading instead of\n pushing the menu below the caption (audit 16). */\n flex-wrap: nowrap;\n margin-bottom: var(--space-3);\n}\n\n.actions {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n flex: none;\n margin-left: auto;\n}\n\n.menuWrap {\n position: relative;\n display: inline-flex;\n}\n\n/* The ⋯ button: quiet until hovered or focused, but always a real control. */\n.more {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: calc(var(--control-h-xs, 20px) + 4px);\n height: calc(var(--control-h-xs, 20px) + 4px);\n padding: 0;\n border: 1px solid transparent;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-tertiary);\n cursor: pointer;\n transition: background-color var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);\n}\n\n.more:hover,\n.more[aria-expanded='true'] {\n background: var(--bg-hover);\n color: var(--text-primary);\n}\n\n.more:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 1px;\n}\n\n.menu {\n position: absolute;\n top: calc(100% + var(--space-1));\n right: 0;\n z-index: var(--z-dropdown);\n display: flex;\n flex-direction: column;\n min-width: 176px;\n padding: var(--space-1);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-md);\n background: var(--bg-surface-raised);\n box-shadow: var(--shadow-menu);\n}\n\n.menuItem {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding: var(--space-1) var(--space-2);\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n text-align: left;\n cursor: pointer;\n}\n\n.menuItem:hover,\n.menuItem:focus-visible {\n background: var(--bg-hover);\n outline: none;\n}\n\n.check {\n width: 1em;\n color: var(--text-secondary);\n}\n\n.hint {\n margin-left: auto;\n padding: 0 var(--space-1);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs, 3px);\n color: var(--text-tertiary);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n}\n\n.heading {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n gap: 2px;\n min-width: 0;\n}\n\n.title {\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.description {\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n\n.plot {\n position: relative;\n width: 100%;\n min-width: 0;\n}\n\n.table {\n max-height: 360px;\n overflow: auto;\n}\n\n.caveat {\n margin: 0 0 var(--space-3);\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-md);\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n font-size: var(--text-xs-size);\n line-height: var(--text-sm-line);\n}\n\n.state {\n margin: 0;\n padding: var(--space-6) var(--space-3);\n text-align: center;\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n}\n\n.dark {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n align-items: center;\n}\n\n.darkTitle {\n margin: 0;\n color: var(--text-secondary);\n font-weight: var(--font-weight-semibold);\n}\n\n.darkBody {\n margin: 0;\n font-size: var(--text-xs-size);\n max-width: 44ch;\n}\n\n.unknown {\n color: var(--status-unknown-fg);\n}\n","/**\n * components/charts/ChartFrame.tsx — the shell every V3.10 chart renders in:\n * title + description, an honest caveat, the Table twin (the WCAG-clean view,\n * reachable without hovering anything), and the designed non-ready states. A\n * chart never draws empty axes: it says what the emptiness means.\n *\n * loading — the previous render is held when there is one (no skeleton\n * flash on refetch); otherwise a quiet placeholder.\n * empty — \"No runs in this window.\" A genuine, known zero.\n * dark — \"Fleet dark since Sep 1\": nothing has happened since a date.\n * unknown — the source could not be read. Never drawn as zeros.\n *\n * V3.10 (SPEC-310C §6 \"Table toggle: moves into ⋯\"): the Chart | Table\n * segmented control used to sit beside every title — noise on a KPI-sized\n * card, and it wrapped against long titles (\"Memo hit rate\"). It is now a\n * quiet ⋯ menu button (still a real, labelled button: the table stays one\n * Tab + Enter away) plus the `T` key anywhere inside the card, which is the\n * `chart.table` command in routes/verse/shell/command-catalog.ts. The key is\n * matched here directly rather than through the catalog so this shared kit\n * (also used by the legacy console) never imports a route module; the chart\n * tests assert the two stay the same key.\n */\nimport { useCallback, useEffect, useId, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { MoreGlyph } from './ChartParts.js';\nimport { formatDayLabel, formatTimeLabel } from './format.js';\nimport './chart-tokens.css';\nimport styles from './ChartFrame.module.css';\n\nexport type ChartStatus =\n | { kind: 'ready' }\n | { kind: 'loading' }\n | { kind: 'empty'; message?: string }\n | { kind: 'dark'; since: string; subject?: string; detail?: string }\n | { kind: 'unknown'; reason?: string };\n\nexport type ChartView = 'chart' | 'table';\n\n/** The key that flips a focused chart card between plot and table (catalog `chart.table`). */\nexport const CHART_TABLE_KEY = 't';\n\nexport interface ChartFrameProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n /** Start on the table (e.g. a screen-reader-first surface, or a matrix at 375 px). */\n defaultView?: ChartView;\n /** Hide the view menu (only for a chart that already IS its numbers). */\n hideToggle?: boolean;\n /** Extra header controls (a facet picker), rendered before the ⋯ menu. */\n actions?: ReactNode;\n /** The plot. */\n children: ReactNode;\n table: ReactNode;\n /** Rendered under the plot in chart view (legends, notes). */\n footer?: ReactNode;\n}\n\n/**\n * \"Sep 1\" from a YYYY-MM-DD calendar day (printed as written) or an ISO\n * instant (its day in the VIEWER's zone). The instant used to be cut to its\n * UTC date, so fleet history's `darkSince` — an ISO instant — read \"dark\n * since Sep 26\" on a Sep 25 evening anywhere west of UTC.\n */\nexport function sinceLabel(since: string): string {\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(since)) return formatDayLabel(since);\n const ms = Date.parse(since);\n return Number.isFinite(ms) ? formatTimeLabel(ms) : formatDayLabel(since.slice(0, 10));\n}\n\nfunction StatusMessage({ status }: { status: Exclude<ChartStatus, { kind: 'ready' }> }): ReactNode {\n switch (status.kind) {\n case 'loading':\n return <p className={styles.state} aria-busy=\"true\">Loading…</p>;\n case 'empty':\n return <p className={styles.state}>{status.message ?? 'Nothing happened in this window.'}</p>;\n case 'dark':\n return (\n <div className={`${styles.state} ${styles.dark}`}>\n <p className={styles.darkTitle}>\n {status.subject ?? 'Fleet'} dark since {sinceLabel(status.since)}\n </p>\n <p className={styles.darkBody}>{status.detail ?? 'No runs or proposals have been recorded since then.'}</p>\n </div>\n );\n case 'unknown':\n return (\n <p className={`${styles.state} ${styles.unknown}`} role=\"note\">\n Unknown — {status.reason ?? 'the data source could not be read.'} Nothing is shown rather than a guess.\n </p>\n );\n }\n}\n\n/** True when a key press is typing into a field — never steal it for the T shortcut. */\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || target.isContentEditable;\n}\n\nconst VIEW_ITEMS: ReadonlyArray<{ view: ChartView; label: string; hint: string | null }> = [\n { view: 'chart', label: 'Show as chart', hint: null },\n { view: 'table', label: 'Show as table', hint: 'T' },\n];\n\n/**\n * The ⋯ menu: a menu button (WAI-ARIA menu-button pattern) with two\n * menuitemradio entries. Arrow keys move, Enter / Space pick, Escape and Tab\n * close; focus returns to the button on every close so the keyboard user is\n * never dropped at the top of the document.\n */\nfunction ViewMenu({ title, view, onPick }: { title: string; view: ChartView; onPick: (view: ChartView) => void }) {\n const [open, setOpen] = useState(false);\n const [active, setActive] = useState(0);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const menuId = useId();\n\n const close = useCallback((refocus: boolean) => {\n setOpen(false);\n if (refocus) buttonRef.current?.focus();\n }, []);\n\n useEffect(() => {\n if (!open) return undefined;\n const onDown = (e: PointerEvent): void => {\n const t = e.target as Node | null;\n if (t && (menuRef.current?.contains(t) || buttonRef.current?.contains(t))) return;\n setOpen(false);\n };\n document.addEventListener('pointerdown', onDown);\n return () => document.removeEventListener('pointerdown', onDown);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n menuRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitemradio\"]')[active]?.focus();\n }, [open, active]);\n\n function openAt(index: number): void {\n setActive(index);\n setOpen(true);\n }\n\n function onButtonKey(e: KeyboardEvent<HTMLButtonElement>): void {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n openAt(e.key === 'ArrowUp' ? VIEW_ITEMS.length - 1 : 0);\n }\n }\n\n function onMenuKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setActive((a) => (a + 1) % VIEW_ITEMS.length);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setActive((a) => (a - 1 + VIEW_ITEMS.length) % VIEW_ITEMS.length);\n } else if (e.key === 'Home') {\n e.preventDefault();\n setActive(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n setActive(VIEW_ITEMS.length - 1);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n close(true);\n } else if (e.key === 'Tab') {\n close(false);\n }\n }\n\n return (\n <span className={styles.menuWrap}>\n <button\n ref={buttonRef}\n type=\"button\"\n className={styles.more}\n aria-label={`${title}: view options`}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? menuId : undefined}\n title=\"View options (T toggles the table)\"\n onClick={() => (open ? close(false) : openAt(Math.max(0, VIEW_ITEMS.findIndex((i) => i.view === view))))}\n onKeyDown={onButtonKey}\n >\n <MoreGlyph />\n </button>\n {open ? (\n <div ref={menuRef} id={menuId} role=\"menu\" aria-label={`${title} view`} className={styles.menu} onKeyDown={onMenuKey}>\n {VIEW_ITEMS.map((item, i) => (\n <button\n key={item.view}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={view === item.view}\n tabIndex={i === active ? 0 : -1}\n className={styles.menuItem}\n onClick={() => {\n onPick(item.view);\n close(true);\n }}\n >\n <span className={styles.check} aria-hidden=\"true\">{view === item.view ? '✓' : ''}</span>\n <span>{item.label}</span>\n {item.hint ? <kbd className={styles.hint}>{item.hint}</kbd> : null}\n </button>\n ))}\n </div>\n ) : null}\n </span>\n );\n}\n\nexport function ChartFrame({\n title,\n description,\n caveat,\n status = { kind: 'ready' },\n defaultView = 'chart',\n hideToggle = false,\n actions,\n children,\n table,\n footer,\n}: ChartFrameProps) {\n const [view, setView] = useState<ChartView>(defaultView);\n const titleId = useId();\n const ready = status.kind === 'ready';\n const canToggle = ready && !hideToggle;\n\n function onKeyDown(e: KeyboardEvent<HTMLElement>): void {\n if (!canToggle || e.defaultPrevented) return;\n if (e.metaKey || e.ctrlKey || e.altKey || e.shiftKey) return;\n if (e.key.toLowerCase() !== CHART_TABLE_KEY || isEditableTarget(e.target)) return;\n e.preventDefault();\n setView((v) => (v === 'chart' ? 'table' : 'chart'));\n }\n\n return (\n <figure className={styles.frame} aria-labelledby={titleId} data-chart-card=\"\" data-view={view} onKeyDown={onKeyDown}>\n <figcaption className={styles.header}>\n <span className={styles.heading}>\n <span id={titleId} className={styles.title}>{title}</span>\n {description ? <span className={styles.description}>{description}</span> : null}\n </span>\n {actions || canToggle ? (\n <span className={styles.actions}>\n {actions}\n {canToggle ? <ViewMenu title={title} view={view} onPick={setView} /> : null}\n </span>\n ) : null}\n </figcaption>\n {caveat ? (\n <p className={styles.caveat} role=\"note\">\n {caveat}\n </p>\n ) : null}\n {!ready ? (\n <StatusMessage status={status} />\n ) : view === 'table' ? (\n <div className={styles.table}>{table}</div>\n ) : (\n <>\n <div className={styles.plot}>{children}</div>\n {footer}\n </>\n )}\n </figure>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DockHost-BcEq2qaS.js","assets/MutationTokenDialog-Bm34BNVV.js","assets/Dialog-BRd_B9OE.js","assets/focus-trap-ChZ5EFfM.js","assets/ProviderLogo-AwHn2sKm.js","assets/verse-model-JTuvRBVK.js","assets/format-BmH2yWL6.js","assets/format-DKrNjdwD.js","assets/context-queries-_9bFWb9v.js","assets/context-model-CDeyP0cA.js","assets/context-model-Bb15chFt.js","assets/workspace-model-D-SLfads.js","assets/ActionMenu-Dwjk6rUQ.js","assets/tool-semantics-GX8ScuSH.js","assets/line-diff-B5Eonif2.js","assets/dock-icons-Cc43W7r4.js","assets/command-catalog-ffCAijVY.js","assets/tasks-model-CzHvclVm.js","assets/sidebar-model-Dcd437cf.js","assets/use-token-gate-DSNIIpI6.js","assets/EmptyState-DsN1H6MC.js","assets/slots-BL_J5mmV.js","assets/Button-DtE0rlWD.js","assets/useVerseTranscript-CqH51rt9.js","assets/Switch-BmCzfFnu.js","assets/context.module-BijAfoJw.js","assets/global-BlI2BYa1.css","assets/Dialog-tQ8kFulD.css","assets/MutationTokenDialog-CrfJ0PdD.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.css","assets/ActionMenu-DPjsLU1g.css","assets/dock-icons-1w9hA2-h.css","assets/EmptyState-B3YUPGaa.css","assets/Button-DrnKsvnQ.css","assets/Switch-CU044EaE.css","assets/context-DiToyj6s.css","assets/DockHost-B4RaYOET.css","assets/NewChatDialog-BqFTWgHU.js","assets/Segmented-Wt1ATod9.js","assets/git-model-BFwAVbxF.js","assets/SeatSelector-DpwNiX8F.js","assets/seat-subscription-BhUUz7VL.js","assets/Composer.module-C8U73KdQ.js","assets/CapacityStrip-DKbKA_Aa.js","assets/Tag-WSUIaMVy.js","assets/budget-queries-DFF-3ICg.js","assets/capacity-strip-model-5ViUgUlP.js","assets/useSeatsRefresh-q7Id9RcW.js","assets/folder-picker-C8zo3A56.js","assets/Segmented-BnjHbKzH.css","assets/Composer-ByzxOJK6.css","assets/Tag-D0rAEciH.css","assets/CapacityStrip-Cc28CyWk.css","assets/NewChatDialog-yyQpA9p_.css","assets/Workspace-RXy0pqp6.js","assets/highlight-CMCZK9jW.js","assets/DiffViewer-CNwd0W3Q.js","assets/MessageMarkdown-BCe4TsXk.js","assets/icons-CygCEFWs.js","assets/verse-icons-DsG1dOQx.js","assets/reasoning-pref-KkhI_5-j.js","assets/Meter-b69LM0mU.js","assets/DiffViewer-C8HHTnVE.css","assets/MessageMarkdown-Cgh5f1-Q.css","assets/Meter-CYt9KpM0.css","assets/Workspace-Dwri2jFJ.css","assets/Sidebar-C9YtBYVZ.js","assets/RefreshIndicator-SEFZlMB2.js","assets/RefreshIndicator-CVv22U_j.css","assets/Sidebar-BRc1vGDF.css","assets/DeleteChatDialog-C_eDhV8b.js","assets/turn-files-BPHQzYuH.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{a as e,c as t,n,s as r,t as i}from"./index-CyK31YRm.js";import{E as a,I as o,O as s,g as c,h as l,i as u,m as d,o as f,p as ee,s as te,u as p,w as ne}from"./global-y_exIyAP.js";import{r as re}from"./RouteErrorBoundary-C8WGiixc.js";import{C as ie,Ct as ae,Dt as oe,E as se,H as m,L as ce,N as le,Nt as h,Ot as ue,Pt as g,R as de,S as fe,St as pe,T as me,Tt as he,Y as ge,_t as _e,a as ve,b as _,bn as ye,c as be,d as xe,et as Se,f as v,ft as Ce,h as we,i as Te,it as Ee,lt as De,m as Oe,o as ke,p as Ae,st as je,u as y,ut as b,v as Me,w as Ne,wt as Pe}from"./VerseConsoleApp-DXDv1aOi.js";import{a as Fe,c as Ie,d as x,f as Le,i as S,l as Re,m as ze,n as Be,r as C,s as Ve,t as He,u as Ue}from"./verse-store-DNVRuiJL.js";var w=t(e(),1),T=new Map;function We(e,t){return T.set(e,t),()=>{T.get(e)===t&&T.delete(e)}}function Ge(e,t){let n=t.replace(/\s+$/,``);return e.trim()?`${e.replace(/\s+$/,``)}\n\n${n}`:n}function E(e=document){let t=e.querySelector(`textarea[aria-label="Message"]`);return t instanceof HTMLTextAreaElement?t:null}function Ke(e,t){if(!t.trim())return!1;let n=T.get(e);if(n)return n(t),!0;let r=E();if(!r||r.disabled)return!1;let i=Ge(r.value,t),a=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,`value`)?.set;a?a.call(r,i):r.value=i,r.dispatchEvent(new Event(`input`,{bubbles:!0})),r.focus();let o=r.value.length;try{r.setSelectionRange(o,o)}catch{}return!0}function D(e){return`verse-session-roots:${e}`}var qe={key:`verse-session-roots:none`,fetch:async()=>null};function Je(e){return e?[e.projectPath,...(e.extraRoots??[]).filter(t=>t!==e.projectPath)]:[]}function Ye(e){let t=e?.id??null,n=(0,w.useMemo)(()=>t?{key:D(t),fetch:e=>xe(t,e)}:qe,[t]),r=d(n),i=l(n),a=e?.turnCount??0,o=(0,w.useRef)({id:t,turns:a});(0,w.useEffect)(()=>{let e=o.current;o.current={id:t,turns:a},e.id===t&&e.turns!==a&&t&&i()},[t,a,i]);let s=r.data??null,c=s!==null&&Array.isArray(s.roots)?s:null,u=(0,w.useMemo)(()=>Je(e),[e?.projectPath,e?.extraRoots]),f=(0,w.useMemo)(()=>{if(!c||c.roots.length===0)return u;let e=c.roots.filter(e=>e.primary).map(e=>e.path),t=c.roots.filter(e=>!e.primary).map(e=>e.path);return[...e,...t]},[c,u]),ee=c?.roots.find(e=>e.primary)??c?.roots[0]??null;return{data:c,error:r.status===`error`?r.error?.message??`could not read this chat’s folders`:null,roots:f,branch:ee?.git?.branch??null}}var O=new Set;function k(e){return O.add(e),()=>O.delete(e)}function A(e){let t=!1;for(let n of[...O])n(e)&&(t=!0);return t}var j=new Set;function M(e){return j.add(e),()=>j.delete(e)}function Xe(){let e=!1;for(let t of[...j])t()&&(e=!0);return e}var N=new Set;function P(e){return N.add(e),()=>N.delete(e)}function Ze(e){let t=!1;for(let n of[...N])n(e)&&(t=!0);return t}var F=n(),I=[`user-message`,`turn-started`,`text-delta`,`assistant-message`,`thinking`,`tool-use`,`tool-result`,`usage`,`turn-done`,`error`,`cancelled`,`compaction`,`context`,`thinking-delta`,`thinking-progress`,`progress`,`status`,`recovered`,`history-truncated`];function L(e){return Math.min(1e3*2**e,15e3)}var R=e=>e===null||typeof e==`number`&&Number.isFinite(e)&&e>=0;function Qe(e){return e.type===`context`?typeof e.contextTokens==`number`&&Number.isFinite(e.contextTokens)&&e.contextTokens>=0&&typeof e.exact==`boolean`&&R(e.contextWindow)&&(e.autoCompactAt===void 0||R(e.autoCompactAt)):e.type!==`compaction`||(e.trigger===`auto`||e.trigger===`manual`)&&R(e.preTokens)&&R(e.postTokens)&&R(e.durationMs)}var z=e=>e===void 0||typeof e==`number`&&Number.isFinite(e)&&e>=0;function $e(e){switch(e.type){case`thinking-delta`:return typeof e.text==`string`;case`thinking-progress`:return e.estimatedTokens!==void 0&&z(e.estimatedTokens);case`progress`:return(e.phase===`thinking`||e.phase===`tool`||e.phase===`writing`||e.phase===`waiting`)&&typeof e.elapsedMs==`number`&&Number.isFinite(e.elapsedMs)&&e.elapsedMs>=0&&(e.tool===void 0||typeof e.tool==`string`)&&z(e.outTokens)&&z(e.tokPerSec);case`status`:return(e.kind===`retry`||e.kind===`preflight`||e.kind===`watchdog`)&&typeof e.message==`string`;case`history-truncated`:return typeof e.droppedBefore==`number`&&Number.isFinite(e.droppedBefore);default:return!0}}function et(e){try{let t=JSON.parse(e);if(!t||typeof t!=`object`)return null;let n=t;return typeof n.seq!=`number`||typeof n.type!=`string`||!Qe(t)||!$e(t)?null:t}catch{return null}}var tt=`verse-sessions`;function nt(e=!0){return`/api/events?${e?`topics=${tt}&`:``}client=${encodeURIComponent(s())}`}var rt=!1;function it(){let e=null,t=null,n=0,r=!1,i=!1,o=()=>{if(r||typeof EventSource>`u`||a().phase!==`authenticated`)return;let s=!rt&&!i,c=new EventSource(nt(s),{withCredentials:!0}),l=!1;e=c,c.onopen=()=>{l=!0,n=0,i&&=(rt=!0,!1)},c.addEventListener(`verse-sessions`,()=>v()),c.onerror=()=>{if(c.close(),e===c&&(e=null),!(r||a().phase!==`authenticated`)){if(!l&&s){i=!0,o();return}i=!1,t=setTimeout(()=>{t=null,n+=1,o()},L(n))}}};return o(),()=>{r=!0,t&&clearTimeout(t),t=null,e?.close(),e=null}}var at=9e4,ot=250;function st(e,t){let n=Number.isSafeInteger(t)&&t>0?`after=${t}&`:``;return`${Ne(e,`/events`)}?${n}client=${encodeURIComponent(s())}`}function ct(e){return Math.min(1e3*2**e,15e3)}function lt(){return globalThis.IS_REACT_ACT_ENVIRONMENT===!0}var ut=e=>{let t=!1,n=()=>{t||(t=!0,r!==null&&typeof cancelAnimationFrame==`function`&&cancelAnimationFrame(r),clearTimeout(i),e())},r=(typeof document>`u`||document.visibilityState!==`hidden`)&&typeof requestAnimationFrame==`function`?requestAnimationFrame(n):null,i=setTimeout(n,r===null?0:ot);return()=>{t=!0,r!==null&&typeof cancelAnimationFrame==`function`&&cancelAnimationFrame(r),clearTimeout(i)}};function dt(e){return lt()?(e(),null):ut(e)}var ft=class{sessionId;queue=[];cancel=null;scheduled=!1;constructor(e){this.sessionId=e}push(e){if(this.queue.push(e),this.scheduled)return;this.scheduled=!0;let t=dt(()=>this.flush());this.scheduled&&(this.cancel=t)}flush(){if(this.scheduled=!1,this.cancel?.(),this.cancel=null,this.queue.length===0)return;let e=this.queue;this.queue=[],He(this.sessionId,e).settled&&v()}drop(){this.scheduled=!1,this.cancel?.(),this.cancel=null,this.queue=[]}},B=!1,V=0;function pt(e){let t=null,n=null,r=0,i=!1,o=!1,s=new ft(e),c=()=>{if(i||typeof EventSource>`u`||a().phase!==`authenticated`)return;x(e,r===0?`connecting`:`reconnecting`);let l=B||o?0:Fe(e).lastSeq,u=new EventSource(st(e,l),{withCredentials:!0}),d=!1;t=u,u.onopen=()=>{d=!0,r=0,o&&=(B=!0,!1),x(e,`open`)};for(let e of I)u.addEventListener(e,e=>{if(t!==u)return;let n=et(e.data);n&&s.push(n)});u.onerror=f=>{if(!(typeof MessageEvent<`u`&&f instanceof MessageEvent)&&(s.flush(),!i)){if(typeof u.readyState==`number`&&u.readyState===V){x(e,`reconnecting`);return}if(u.close(),t===u&&(t=null),x(e,`reconnecting`),a().phase===`authenticated`){if(!d&&l>0&&!o){o=!0,c();return}o=!1,n=setTimeout(()=>{n=null,r+=1,c()},ct(r))}}}},l=()=>{n&&clearTimeout(n),n=null,t?.close(),t=null};return c(),{close(){i||(i=!0,l(),s.flush(),s.drop(),x(e,`closed`))},restart(){i||(l(),s.flush(),r=0,c())}}}var H=new Map;function U(e){let t=H.get(e);t&&(H.delete(e),t.idleTimer&&clearTimeout(t.idleTimer),t.stream.close())}function mt(){let e=[...H.entries()].filter(([,e])=>e.refs===0).sort((e,t)=>e[1].releasedAt-t[1].releasedAt);for(;e.length>1;)U(e.shift()[0])}function ht(e){let t=H.get(e);t?(t.refs+=1,t.idleTimer&&clearTimeout(t.idleTimer),t.idleTimer=null):(t={stream:pt(e),refs:1,idleTimer:null,releasedAt:0},H.set(e,t));let n=t,r=!1;return()=>{r||(r=!0,H.get(e)===n&&(--n.refs,!(n.refs>0)&&(n.releasedAt=Date.now(),n.idleTimer=setTimeout(()=>{H.get(e)===n&&n.refs===0&&U(e)},at),mt())))}}function gt(){for(let e of[...H.keys()])U(e)}ze(e=>{e.kind===`reset`?gt():U(e.sessionId)});function _t(e,t={}){let n=new AbortController,r=null,i=!1,a=()=>{i||r||(r=ht(e))},o=Fe(e);return t.reload!==!0&&o.loaded&&o.loadError===null?a():(t.reload&&H.get(e)?.stream.restart(),y(e,n.signal).then(t=>{n.signal.aborted||(Ve(e,t.session,t.events),a())}).catch(t=>{n.signal.aborted||Ie(e,t instanceof Error?t.message:`Could not load this chat.`)})),()=>{i=!0,n.abort(),r?.(),r=null}}var W=()=>()=>{};function vt(e){return(0,w.useCallback)(t=>e?Le(e,t):W(),[e])}function yt(e,t=0){let n=vt(e),r=(0,w.useSyncExternalStore)(n,()=>S(e),()=>S(e)),i=(0,w.useRef)({sessionId:null,reload:t});return(0,w.useEffect)(()=>{let n=i.current;if(i.current={sessionId:e,reload:t},e)return _t(e,{reload:n.sessionId===e&&n.reload!==t})},[e,t]),r}function G(e){let t=vt(e);return(0,w.useSyncExternalStore)(t,()=>C(e),()=>C(e))}var bt=5e3,K=new Map,xt=new Set;function St(e){return xt.add(e),()=>xt.delete(e)}function Ct(){return K}function wt(e,t){if(!((K.get(e)??-1)>=t)){K=new Map(K).set(e,t);for(let e of[...xt])e();Ae(e,t)}}function Tt(){return(0,w.useSyncExternalStore)(St,Ct,Ct)}function Et(){let e=d(_,{freshMs:4500}),t=d(ie),n=l(_),r=(0,w.useCallback)(()=>n(),[n]);ce(r,bt);let i=Tt();return{activity:e.data??null,meta:t.data??null,metaError:t.status===`error`?p(t.error):null,localSeen:i}}var q={sidebar:{min:220,max:420,def:264},resources:{min:240,max:520,def:320}},Dt=1,Ot=`ashlr.verse.panels.v1`,kt=`ashlr.verse.ui.v2`,At={containerWidth:0,sidebarVisible:!0,resourcesVisible:!0};function J(e,t){let n=q[e],r=Number(t);return!Number.isFinite(r)||r<=0?n.def:Math.max(n.min,Math.min(n.max,Math.round(r)))}function jt(e,t){let n=J(`sidebar`,e.sidebar),r=J(`resources`,e.resources);if(!Number.isFinite(t.containerWidth)||t.containerWidth<=0)return{sidebar:n,resources:r};let i=(t.sidebarVisible?Dt:0)+(t.resourcesVisible?Dt:0),a=t.containerWidth-480-i,o=(t.sidebarVisible?n:0)+(t.resourcesVisible?r:0)-a;if(o<=0)return{sidebar:n,resources:r};if(t.resourcesVisible){let e=Math.min(o,r-q.resources.min);r-=e,o-=e}if(o>0&&t.sidebarVisible){let e=Math.min(o,n-q.sidebar.min);n-=e}return{sidebar:n,resources:r}}function Mt(){return{sidebar:q.sidebar.def,resources:q.resources.def}}function Nt(e){if(e===null||e===``)return null;let t;try{t=JSON.parse(e)}catch{return null}if(!t||typeof t!=`object`||Array.isArray(t))return null;let n=t,r=n.sidebar??n.sidebarWidth,i=n.resources??n.resourcesWidth;return r===void 0&&i===void 0?null:{sidebar:J(`sidebar`,r),resources:J(`resources`,i)}}function Pt(){try{return Nt(localStorage.getItem(Ot))||(Nt(localStorage.getItem(kt))??Mt())}catch{return Mt()}}function Ft(e){try{localStorage.setItem(Ot,JSON.stringify({sidebar:e.sidebar,resources:e.resources}))}catch{}}var Y=Pt(),X=At,Z={desired:Y,effective:jt(Y,X)},It=new Set;function Lt(e,t){return e.sidebar===t.sidebar&&e.resources===t.resources}function Rt(){let e=jt(Y,X);if(!(Lt(Z.desired,Y)&&Lt(Z.effective,e))){Z={desired:Y,effective:e};for(let e of It)e()}}function zt(e){return It.add(e),()=>{It.delete(e)}}function Bt(){return Z}function Vt(e){(X.containerWidth!==e.containerWidth||X.sidebarVisible!==e.sidebarVisible||X.resourcesVisible!==e.resourcesVisible)&&(X=e,Rt())}function Ht(e){Lt(Y,e)||(Y=e,Ft(Y),Rt())}function Q(e,t){Ht({...Y,[e]:J(e,t)})}function Ut(e,t){Q(e,Z.effective[e]+t)}function Wt(e){Q(e,q[e].def)}function Gt(){return(0,w.useSyncExternalStore)(zt,Bt,Bt)}var Kt=`verseResizing`;function qt(e){try{e?document.body.dataset[Kt]=`true`:delete document.body.dataset[Kt]}catch{}}function Jt({side:e,label:t,className:n}){let r=Gt(),i=q[e],a=r.effective[e],o=(0,w.useRef)(null),[s,c]=(0,w.useState)(!1),l=(0,w.useCallback)(()=>{o.current&&(o.current=null,c(!1),qt(!1))},[]),u=(0,w.useCallback)(e=>{if(e.button===0){e.preventDefault(),o.current={pointerId:e.pointerId,originX:e.clientX,startWidth:a},c(!0),qt(!0);try{e.currentTarget.setPointerCapture?.(e.pointerId)}catch{}}},[a]);(0,w.useEffect)(()=>{if(!s)return;let t=t=>{let n=o.current;if(!n||t.pointerId!==n.pointerId)return;let r=t.clientX-n.originX;Q(e,e===`sidebar`?n.startWidth+r:n.startWidth-r)},n=e=>{let t=o.current;t&&e.pointerId!==t.pointerId||l()},r=t=>{let n=o.current;n&&t.key===`Escape`&&(Q(e,n.startWidth),l())},i=()=>l();return window.addEventListener(`pointermove`,t),window.addEventListener(`pointerup`,n),window.addEventListener(`pointercancel`,n),window.addEventListener(`keydown`,r),window.addEventListener(`blur`,i),()=>{window.removeEventListener(`pointermove`,t),window.removeEventListener(`pointerup`,n),window.removeEventListener(`pointercancel`,n),window.removeEventListener(`keydown`,r),window.removeEventListener(`blur`,i),qt(!1)}},[s,e,l]);let d=(0,w.useCallback)(t=>{let n=t.shiftKey?64:16,r=e===`sidebar`?1:-1;switch(t.key){case`ArrowRight`:Ut(e,n*r);break;case`ArrowLeft`:Ut(e,-n*r);break;case`Home`:Q(e,i.min);break;case`End`:Q(e,i.max);break;case`Enter`:Wt(e);break;default:return}t.preventDefault()},[e,i.min,i.max]);return(0,F.jsx)(`div`,{className:n,"data-verse-resizer":e,"data-dragging":s?`true`:void 0,role:`separator`,"aria-orientation":`vertical`,"aria-label":t,"aria-valuemin":i.min,"aria-valuemax":i.max,"aria-valuenow":a,"aria-valuetext":`${a} pixels`,tabIndex:0,onPointerDown:u,onPointerUp:l,onPointerCancel:l,onLostPointerCapture:l,onKeyDown:d,onDoubleClick:()=>Wt(e)})}var $={chat:`_chat_14h0e_13`,main:`_main_14h0e_36`,banner:`_banner_14h0e_46`,bannerWarn:`_bannerWarn_14h0e_47`,resize:`_resize_14h0e_90`,scrim:`_scrim_14h0e_11`,dialogActions:`_dialogActions_14h0e_157`,sidebarSkeleton:`_sidebarSkeleton_14h0e_167`,workspaceSkeleton:`_workspaceSkeleton_14h0e_175`,skeletonHeader:`_skeletonHeader_14h0e_181`,skeletonBody:`_skeletonBody_14h0e_189`,skeletonComposer:`_skeletonComposer_14h0e_199`},Yt=r({ChatSection:()=>bn,describeChatError:()=>gn,preloadChatSurface:()=>dn}),Xt=(0,w.lazy)(()=>i(()=>import(`./DockHost-BcEq2qaS.js`).then(e=>({default:e.DockHost})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37]))),Zt=(0,w.lazy)(()=>i(()=>import(`./NewChatDialog-BqFTWgHU.js`).then(e=>({default:e.NewChatDialog})),__vite__mapDeps([38,2,3,5,39,8,6,7,40,9,41,42,43,44,4,45,46,47,10,48,11,49,26,27,29,30,50,51,52,53,54]))),Qt=h(()=>i(()=>import(`./Workspace-RXy0pqp6.js`).then(e=>e.Workspace),__vite__mapDeps([55,3,2,1,4,56,57,58,5,6,7,8,42,43,46,47,10,48,22,12,13,14,15,59,60,16,17,18,61,19,21,20,23,62,26,27,28,63,29,30,64,51,34,31,32,33,65,66]))),$t=Qt.Slot,en=h(()=>i(()=>import(`./Sidebar-C9YtBYVZ.js`).then(e=>e.Sidebar),__vite__mapDeps([67,2,3,68,5,42,6,7,11,49,22,12,15,13,14,18,60,59,16,26,27,69,29,30,34,31,32,70]))),tn=en.Slot,nn=h(()=>i(()=>import(`./DeleteChatDialog-C_eDhV8b.js`).then(e=>e.DeleteChatDialog),__vite__mapDeps([71,2,3,22,27,34]))),rn=nn.Slot,an=h(()=>i(()=>import(`./MutationTokenDialog-Bm34BNVV.js`).then(e=>e.n).then(e=>e.MutationTokenDialog),__vite__mapDeps([1,2,3,26,27,28]))),on=an.Slot,sn=g(()=>Promise.all([i(()=>import(`./tasks-model-CzHvclVm.js`),__vite__mapDeps([17,5,13,14,18,26,29,30])),i(()=>import(`./turn-files-BPHQzYuH.js`),__vite__mapDeps([72,13,14]))]).then(([e,t])=>({otherRunningChats:e.otherRunningChats,lastTurnFiles:t.lastTurnFiles}))),cn=g(()=>i(()=>import(`./verse-model-JTuvRBVK.js`).then(e=>e.T).then(e=>({firstRunnableModel:e.firstRunnableModel,seatById:e.seatById})),__vite__mapDeps([5,26,29,30]))),ln=[],un=[];function dn(){return Promise.all([Qt.ready(),en.ready(),nn.ready(),an.ready(),sn.ready(),cn.ready()])}function fn(){return(0,F.jsx)(`nav`,{className:$.sidebarSkeleton,"aria-busy":`true`,"aria-label":`Loading chat list`,children:[64,82,58,76,70].map(e=>(0,F.jsx)(u,{width:`${e}%`},e))})}function pn(){return(0,F.jsxs)(`div`,{className:$.workspaceSkeleton,role:`status`,"aria-label":`Loading chat`,children:[(0,F.jsx)(`div`,{className:$.skeletonHeader,children:(0,F.jsx)(u,{width:`32%`})}),(0,F.jsxs)(`div`,{className:$.skeletonBody,children:[(0,F.jsx)(u,{width:`72%`}),(0,F.jsx)(u,{width:`88%`}),(0,F.jsx)(u,{width:`64%`})]}),(0,F.jsx)(`div`,{className:$.skeletonComposer,children:(0,F.jsx)(u,{width:`100%`})})]})}var mn=`ashlr.verse.selected.v1`;function hn(){try{return localStorage.getItem(mn)}catch{return null}}function gn(e){return e instanceof te?"This server was started without dispatch — run `ashlr verse` to chat.":e instanceof f?e.code===`VERSE_MODEL_UNAVAILABLE`?`${(e.detail??`This chat's model cannot run on its seat.`).replace(/\.?$/,`.`)} Continue in a fresh chat on a model this seat can run, or re-pin the seat's CLI (\`ashlr resources profile repin\`).`:e.status===409&&(e.code===null||e.code===`VERSE_SESSION_BUSY`)?`A turn is already running in this chat. Stop it first.`:e.status===413?`That message is too large (64 KB max).`:e.status===401?`Mutation token was rejected. Unlock again with the token ashlr verse printed.`:e.detail??e.message:e instanceof Error?e.message:`Something went wrong.`}function _n(){let[e,t]=(0,w.useState)(()=>typeof window>`u`?1440:window.innerWidth||1440);return(0,w.useEffect)(()=>{let e=()=>t(window.innerWidth||1440);return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]),e}function vn(){requestAnimationFrame(()=>{document.querySelector(`textarea[aria-label="Message"]`)?.focus()})}function yn(e){return e instanceof Element&&e.closest(`[role="dialog"], [role="menu"], [role="listbox"], [aria-modal="true"]`)!==null}function bn(){let e=d(fe),t=d(me),n=c(me),r=c(fe),i=ee(),a=re(),s=le(),l=de(),u=Pe(),f=Et(),te=_n(),[p,ie]=(0,w.useState)(hn),[ce,h]=(0,w.useState)(``),[g,_]=(0,w.useState)({open:!1}),[xe,v]=(0,w.useState)(!1),[Ae,y]=(0,w.useState)(null),[Ne,Fe]=(0,w.useState)(0),[Ie,x]=(0,w.useState)({open:!1,reason:``}),[Le,S]=(0,w.useState)(null),[ze,C]=(0,w.useState)(null),[Ve,He]=(0,w.useState)(0),T=(0,w.useRef)(null),We=(0,w.useRef)(null),Ge=Gt(),E=(0,w.useMemo)(()=>e.data?.seats??[],[e.data]),D=(0,w.useMemo)(()=>e.data?.projects??[],[e.data]),qe=d(se),Je=(0,w.useMemo)(()=>qe.data?.workspaces??[],[qe.data]),O=e.data?.dispatchEnabled??!0,k=yt(p,Ne),A=Ye(k.session),j=(0,w.useMemo)(()=>{let n=t.data??e.data?.sessions??[];if(!k.session)return n;let r=k.session;return n.some(e=>e.id===r.id)?n.map(e=>e.id===r.id?r:e):[r,...n]},[t.data,e.data,k.session]),M=(0,w.useCallback)(e=>{ie(e);try{e?localStorage.setItem(mn,e):localStorage.removeItem(mn)}catch{}},[]);(0,w.useEffect)(()=>{p&&t.data&&!t.data.some(e=>e.id===p)&&!k.session&&M(null)},[p,t.data,k.session,M]),(0,w.useEffect)(()=>it(),[]);let N=(0,w.useRef)(p);(0,w.useEffect)(()=>{je(p),N.current!==p&&(N.current=p,Ce())},[p]);let P=k.session?.turnCount??null;(0,w.useEffect)(()=>{l&&p&&P!==null&&(typeof document>`u`||document.visibilityState!==`hidden`)&&wt(p,P)},[l,p,P]);let I=(0,w.useCallback)((e,t)=>i.hasHold?t():new Promise((n,r)=>{T.current={run:()=>{t().then(n,r)},cancel:()=>n(null)},x({open:!0,reason:e})}),[i.hasHold]),L=(0,w.useCallback)(e=>{e instanceof Te||a.show(gn(e),`danger`)},[a]),R=(0,w.useCallback)((e={})=>{y(null);let t=k.session,n=e.projectPath===void 0?t?.projectPath??null:e.projectPath,r=t&&n===t.projectPath?{seatId:t.seatId,model:t.model}:null,i=e.seat??r??Se(n);_({open:!0,projectPath:n,seat:i})},[k.session]),Qe=(0,w.useCallback)(async e=>{await I(`Starting a chat spawns an agent process for this project.`,async()=>{v(!0),y(null);try{let t=await ke(e);Ee(t.projectPath,{seatId:t.seatId,model:t.model}),Re(t.id,t),_({open:!1}),M(t.id),a.show(`Started “${t.title}”`,`success`)}catch(e){y(gn(e))}finally{v(!1)}})},[I,M,a]),z=(0,w.useCallback)(async e=>{let t=p;return t?await I(`Sending a message runs the agent against this project.`,async()=>{Ue(t,`running`);try{let n=await we(t,e);return Re(t,n.session,n.turnId),!0}catch(e){return Ue(t,`idle`),L(e),!1}})===!0:!1},[p,I,L]),$e=(0,w.useCallback)((e=p)=>{e&&I(`Stopping the running turn.`,async()=>{try{await ve(e)}catch(e){L(e)}})},[p,I,L]),et=(0,w.useCallback)(async(e,t)=>await I(`Renaming a chat.`,async()=>{try{let n=await Oe(e,t);return Re(e,n),!0}catch(e){return L(e),!1}})===!0,[I,L]),tt=(0,w.useCallback)(async e=>await I(`Deleting a chat removes its transcript from disk.`,async()=>{try{return await be(e),Be(e),o(e),e===p&&M(null),a.show(`Chat deleted.`,`neutral`),!0}catch(e){return L(e),!1}})===!0,[I,L,M,a,p]),nt=(0,w.useCallback)((e,t,n)=>{I(n,async()=>{try{await Me(e,t)}catch(e){L(e)}})},[I,L]),rt=(0,w.useCallback)(e=>{let t=k.session;t&&(R({projectPath:t.projectPath,seat:e}),a.show(`Chats are bound to one seat — starting a new chat on the same project.`,`neutral`))},[k.session,R,a]),at=(0,w.useCallback)(e=>{let t=j.find(t=>t.id===e)??null;t&&C(t)},[j]),ot=(0,w.useCallback)(e=>{e!==p&&M(e),S(e)},[p,M]),st=(0,w.useCallback)(e=>{M(e),window.matchMedia?.(`(max-width: 760px)`)?.matches===!0&&b(!0)},[M]),ct=(0,w.useCallback)(()=>b(!s.sidebarCollapsed),[s.sidebarCollapsed]),lt=u.state.open&&(u.state.active===`terminal`||u.state.splitWith===`terminal`),ut=(0,w.useCallback)(()=>{lt?ae(`terminal`):_e({})},[lt]),dt=(0,w.useCallback)(()=>_e({newTab:!0}),[]),ft=(0,w.useRef)(0),B=cn.useLoaded();(0,w.useEffect)(()=>{let e=s.command;if(e&&e.nonce!==ft.current&&(e.name!==`new-chat`||B)){switch(ft.current=e.nonce,e.name){case`open-session`:e.sessionId&&M(e.sessionId);break;case`focus-composer`:vn();break;case`new-chat`:{let{seatById:t,firstRunnableModel:n}=B,r=e.seatId?t(E,e.seatId):void 0,i=Se(e.projectPath??null),a=r?i?.seatId===r.id?i.model:n(r)?.id:void 0;R({...e.projectPath===void 0?{}:{projectPath:e.projectPath},...r&&a?{seat:{seatId:r.id,model:a}}:{}});break}}ge()}},[s.command,R,E,M,B]);let V=new Map([[`chat.sidebar`,ct],[`chat.find`,()=>Xe()],[`chat.turn-prev`,()=>Ze(-1)],[`chat.turn-next`,()=>Ze(1)],[`dock.toggle`,pe],[`dock.terminal`,ut],[`dock.terminal-new`,dt],[`dock.preview`,()=>ae(`preview`)],[`dock.diff`,()=>ae(`diff`)]]);m(`chat.sidebar`,V.get(`chat.sidebar`)),m(`chat.find`,V.get(`chat.find`)),m(`chat.turn-prev`,V.get(`chat.turn-prev`)),m(`chat.turn-next`,V.get(`chat.turn-next`)),m(`dock.toggle`,V.get(`dock.toggle`)),m(`dock.terminal`,V.get(`dock.terminal`)),m(`dock.terminal-new`,V.get(`dock.terminal-new`)),m(`dock.preview`,V.get(`dock.preview`)),m(`dock.diff`,V.get(`dock.diff`));let pt=(0,w.useRef)(V);pt.current=V,(0,w.useEffect)(()=>{if(!l)return;let e=e=>{if(e.defaultPrevented||yn(e.target))return;let t=ye(e,[`chat`]);if(!t||t.scope!==`chat`||t.id===`chat.find`||t.id===`chat.turn-prev`||t.id===`chat.turn-next`)return;let n=pt.current.get(t.id);n&&(e.preventDefault(),n())};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[l]);let H=e.data?!e.data.dispatchEnabled:!1,U=s.sidebarCollapsed,mt=ue(te),ht=u.state.open&&u.state.tabs.length>0,gt=ht&&mt===`column`,_t=U?0:q.sidebar.min,W=gt?Math.max(he.minWidth,Math.min(oe(u.state.width,te),Ve>0?Ve-480-_t:1/0)):0;(0,w.useEffect)(()=>{let e=We.current;if(!e)return;let t=()=>{He(e.clientWidth),Vt({containerWidth:Math.max(0,e.clientWidth-W),sidebarVisible:!U,resourcesVisible:!1})};t();let n=typeof ResizeObserver==`function`?new ResizeObserver(t):null;return n?.observe(e),window.addEventListener(`resize`,t),()=>{n?.disconnect(),window.removeEventListener(`resize`,t)}},[U,W]);let vt={"--verse-sidebar-width":`${Ge.effective.sidebar}px`,"--verse-dock-width":`${W}px`},G=sn.useLoaded(),bt=(0,w.useMemo)(()=>G?G.otherRunningChats(j,f.activity,p):ln,[G,j,f.activity,p]),K=(0,w.useMemo)(()=>G?G.lastTurnFiles(k.events,A.roots):un,[G,A.roots,k.events]),xt={setPinned:(e,t)=>nt(e,{pinned:t},t?`Pinning a chat.`:`Unpinning a chat.`),setArchived:(e,t)=>nt(e,{archived:t},t?`Archiving a chat.`:`Unarchiving a chat.`),rename:et,handoff:ot,requestDelete:at,dispatchEnabled:O};return(0,F.jsxs)(`div`,{ref:We,className:$.chat,style:vt,"data-sidebar":U?`collapsed`:`open`,"data-dock":gt?`open`:`closed`,children:[(0,F.jsx)(w.Suspense,{fallback:(0,F.jsx)(fn,{}),children:(0,F.jsx)(tn,{sessions:j,sessionsStatus:t.status,sessionsError:t.error?.message??null,projects:D,seats:E,selectedId:p,query:ce,onQuery:h,onSelect:st,onNew:()=>R(),onRetry:()=>{n(),r()},onCollapse:()=>b(!0),onDisconnect:()=>{ne()},activity:f.activity,meta:f.meta,metaError:f.metaError,localSeen:f.localSeen,actions:xt})}),U?null:(0,F.jsx)(Jt,{side:`sidebar`,label:`Resize chat list`,className:$.resize}),(0,F.jsx)(`button`,{type:`button`,className:$.scrim,"aria-label":`Close chat list`,tabIndex:-1,onClick:()=>b(!0)}),(0,F.jsxs)(`div`,{className:$.main,children:[e.status===`error`&&!e.data?(0,F.jsxs)(`div`,{role:`alert`,className:$.banner,children:[(0,F.jsx)(`span`,{children:e.error?.message??`Could not load Verse.`}),(0,F.jsx)(`button`,{type:`button`,onClick:r,children:`Retry`})]}):H?(0,F.jsxs)(`div`,{role:`status`,className:$.bannerWarn,children:[`Read-only: this server was started without dispatch. Run `,(0,F.jsx)(`code`,{children:`ashlr verse`}),` to send messages.`]}):null,(0,F.jsx)(w.Suspense,{fallback:(0,F.jsx)(pn,{}),children:(0,F.jsx)($t,{view:k,seats:E,projects:D,dispatchEnabled:O,locked:!i.hasHold,hasAnySessions:j.length>0,onSend:z,onStop:()=>$e(),onRename:e=>p?et(p,e):Promise.resolve(!1),onRequestDelete:()=>{p&&at(p)},onSeatChange:rt,onNew:()=>R(),onRetry:()=>Fe(e=>e+1),sidebarCollapsed:U,onToggleSidebar:()=>b(!U),onOpenSession:M,handoffOpen:Le!==null&&Le===p,onHandoffOpenChange:e=>S(e?p:null),otherRunning:bt})})]}),ht?(0,F.jsx)(w.Suspense,{fallback:null,children:(0,F.jsx)(Xt,{presentation:mt,windowWidth:te,columnWidth:W,session:k.session,seats:E,events:k.events,roots:A.roots,rootsData:A.data,rootsError:A.error,turnFiles:K,otherRunning:bt,dispatchEnabled:O,onOpenSession:M,onHandoff:e=>S(e),onOpenAccounts:()=>De(`apps`),onSendToChat:e=>{(!p||!Ke(p,e))&&a.show(`Open a chat to send this to it.`,`neutral`)},onAddToMessage:e=>{(!p||!Ke(p,e))&&a.show(`Open a chat to add this to its message.`,`neutral`)}})}):null,g.open?(0,F.jsx)(w.Suspense,{fallback:null,children:(0,F.jsx)(Zt,{open:!0,onClose:()=>_({open:!1}),projects:D,seats:E,workspaces:Je,initialProjectPath:g.projectPath??null,initialSeat:g.seat??null,busy:xe,error:Ae,onCreate:Qe,runMutation:I})}):null,(0,F.jsxs)(w.Suspense,{fallback:null,children:[(0,F.jsx)(rn,{target:ze,onClose:()=>C(null),onDelete:tt,actionsClassName:$.dialogActions}),(0,F.jsx)(on,{open:Ie.open,reason:Ie.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:()=>{x({open:!1,reason:``});let e=T.current;e&&setTimeout(()=>{T.current===e&&(T.current=null,e.cancel())},0)},onUnlocked:()=>{let e=T.current;T.current=null,e?.run()}})]})]})}export{bn as ChatSection,k as a,Ye as c,gn as describeChatError,M as i,Ge as l,vt as n,P as o,dn as preloadChatSurface,G as r,A as s,Yt as t,We as u};
|
|
3
|
-
//# sourceMappingURL=ChatSection-C9myY4ei.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,c as t,i as n,n as r}from"./index-CyK31YRm.js";import{m as i}from"./global-y_exIyAP.js";import{t as a}from"./focus-trap-ChZ5EFfM.js";import{t as o}from"./ProviderLogo-AwHn2sKm.js";import{Ht as s,I as c,N as l,S as u,T as d,X as f,_n as p,at as m,hn as h,rt as g,tt as _,z as v}from"./VerseConsoleApp-DXDv1aOi.js";import{o as y}from"./verse-icons-DsG1dOQx.js";import{a as b,n as x,r as S,s as C}from"./command-catalog-ffCAijVY.js";var w=t(e(),1),T=t(n(),1),E={...Object.fromEntries(x.map(e=>[e.id,e.label])),recent:`Recent`},D=[`needs-you`,`recent`,...x.map(e=>e.id).filter(e=>e!==`needs-you`)],O={"needs-you":5,recent:5,chats:8,actions:8,"go-to":6,"seats-apps":5,projects:5};function k(e,t){if(t===0)return!0;let n=e[t-1];return/[\s\-_/.:·›,(]/.test(n)||/[a-z]/.test(n)&&/[A-Z]/.test(e[t])}function A(e,t){let n=e.toLowerCase();if(!n)return 0;let r=t.toLowerCase(),i=r.indexOf(n);if(i>=0){let e=1e3-i*4;return k(t,i)&&(e+=400),i===0&&(e+=200),e}let a=0,o=0,s=-2;for(let e of n){let n=r.indexOf(e,o);if(n<0)return null;a+=n===s+1?30:5,k(t,n)&&(a+=20),a-=Math.min(20,n-o),s=n,o=n+1}return a}function j(e,t){let n=t.trim().split(/\s+/).filter(Boolean);if(n.length===0)return 0;let r=0;for(let t of n){let n=A(t,e.title);for(let r of[e.subtitle??``,...e.keywords]){if(!r)continue;let e=A(t,r);e!==null&&(n=Math.max(n??-1/0,e*.6))}if(n===null)return null;r+=n}return r}function M(e,t){let n=Math.max(0,Math.round((t-Date.parse(e))/1e3));if(!Number.isFinite(n))return`running`;if(n<60)return`running ${n}s`;let r=Math.floor(n/60);return r<60?`running ${r}m ${String(n%60).padStart(2,`0`)}s`:`running ${Math.floor(r/60)}h ${r%60}m`}function N(e,t){let n=Date.parse(e);if(!Number.isFinite(n))return``;let r=Math.round((t-n)/6e4);if(r<1)return`just now`;if(r<60)return`${r}m ago`;let i=Math.round(r/60);return i<36?`${i}h ago`:`${Math.round(i/24)}d ago`}function P(e){let t=e.split(/[\\/]/).filter(Boolean);return t[t.length-1]??e}function F(e,t,n){let r=e.keys[0];return{key:`${n}:cmd:${e.id}`,kind:`command`,group:n,title:e.title,subtitle:e.scope===`chat`||e.scope===`composer`?`in Chat`:e.surface===`command`?`on Command`:null,shortcut:r?p(r,t):null,monogram:null,engine:null,keywords:[...e.keywords??[],e.section.toLowerCase()],argument:e.argument?{...e.argument}:null,tone:e.guard?.confirm.destructive?`danger`:`neutral`,payload:{kind:`command`,commandId:e.id}}}function I(e){let t=e.now??Date.now(),n=[];for(let t of e.needsYou)n.push({key:`needs-you:${t.id}`,kind:`needs-you`,group:`needs-you`,title:t.title,subtitle:t.subject.repo??t.subject.seatId??null,shortcut:null,monogram:t.subject.engine?s[t.subject.engine]:null,engine:t.subject.engine,keywords:[t.kind.replace(/-/g,` `),t.source,`needs you`],argument:null,tone:t.severity===`high`?`danger`:t.severity===`warn`?`warn`:`neutral`,payload:{kind:`needs-you`,itemId:t.id}});let r=new Map(e.running.map(e=>[e.sessionId,e])),i=[...e.sessions].sort((e,t)=>{let n=r.has(e.id)||e.status===`running`?0:1,i=r.has(t.id)||t.status===`running`?0:1;return n===i?e.updatedAt<t.updatedAt?1:e.updatedAt>t.updatedAt?-1:0:n-i});for(let e of i){let i=r.get(e.id),a=!!i||e.status===`running`,o=a?i?M(i.startedAt,t):`running`:e.status===`error`?`failed`:N(e.updatedAt,t);n.push({key:`chat:${e.id}`,kind:`chat`,group:`chats`,title:e.title||`Untitled chat`,subtitle:[P(e.projectPath),o].filter(Boolean).join(` · `),shortcut:null,monogram:s[e.engine],engine:e.engine,keywords:[e.model,e.seatId,P(e.projectPath)],argument:null,tone:a?`running`:e.status===`error`?`warn`:`neutral`,payload:{kind:`chat`,sessionId:e.id}})}for(let t of C(`actions`))n.push(F(t,e.platform,`actions`));for(let t of C(`go-to`))n.push(F(t,e.platform,`go-to`));for(let t of e.seats)n.push({key:`seat:${t.id}`,kind:`seat`,group:`seats-apps`,title:`New chat on ${t.label}`,subtitle:t.id,shortcut:null,monogram:s[t.engine],engine:t.engine,keywords:[t.engine,t.label,`seat`,`account`],argument:null,tone:`neutral`,payload:{kind:`seat`,seatId:t.id,label:t.label}});for(let t of e.projects)n.push({key:`project:${t.path}`,kind:`project`,group:`projects`,title:`New chat in ${t.name||P(t.path)}`,subtitle:t.enrolled?`enrolled in the fleet`:null,shortcut:null,monogram:null,engine:null,keywords:[t.name,P(t.path)],argument:null,tone:`neutral`,payload:{kind:`project`,path:t.path,name:t.name||P(t.path)}});return n}function L(e,t){let n=(t,n,r,i,a)=>({key:`arg:${e}:${t}`,kind:`argument`,group:`actions`,title:n,subtitle:r,shortcut:null,monogram:i,engine:a,keywords:[t],argument:null,tone:`neutral`,payload:{kind:`argument`,argument:{kind:e,id:t,label:n}}});switch(e){case`seat`:return t.seats.map(e=>n(e.id,e.label,e.id,s[e.engine],e.engine));case`project`:return t.projects.map(e=>n(e.path,e.name||P(e.path),null,null,null));case`session`:return t.sessions.map(e=>n(e.id,e.title||`Untitled chat`,P(e.projectPath),s[e.engine],e.engine));case`section`:return[];default:return[]}}function R(e,t,n,r){let i=t,a=null,o=i.trimStart().charAt(0);(o===`>`||o===`#`)&&(a=o,i=i.trimStart().slice(1));let s=a?S[a]:null,c=i.trim(),l=new Map,u=(e,t,n)=>{let r=l.get(e.group)??[];r.push({item:e,score:t,order:n}),l.set(e.group,r)};if(c===``&&!a){e.filter(e=>e.group===`needs-you`).slice(0,3).forEach((e,t)=>u(e,0,t));let t=n.map(e=>b(e)).filter(e=>e!==null&&e.group!==null);(t.length>0?t:[`chat.new`,`needs-you.open`,`shortcuts.open`].map(e=>b(e))).slice(0,5).forEach((e,t)=>u(F(e,r,`recent`),0,t))}else e.forEach((e,t)=>{if(s&&e.group!==s)return;let n=c===``?0:j(e,c);n!==null&&u(e,n,t)});let d=[],f=[];for(let e of D){let t=l.get(e);if(!t||t.length===0)continue;let n=t=>e===`chats`&&t.item.tone===`running`?0:1;t.sort((e,t)=>n(e)-n(t)||t.score-e.score||e.order-t.order);let r=a?50:O[e],i=t.slice(0,r);for(let e of i)f.push(e.score);d.push({id:e,label:E[e],items:i.map(e=>e.item)})}let p=0;return c!==``&&f.forEach((e,t)=>{e>f[p]&&(p=t)}),{groups:d,flat:d.flatMap(e=>e.items),prefix:a,best:p}}var z={backdrop:`_backdrop_qk7b5_4`,fade:`_fade_qk7b5_1`,panel:`_panel_qk7b5_16`,rise:`_rise_qk7b5_1`,field:`_field_qk7b5_29`,crumb:`_crumb_qk7b5_37`,input:`_input_qk7b5_49`,list:`_list_qk7b5_66`,group:`_group_qk7b5_74`,groupLabel:`_groupLabel_qk7b5_76`,item:`_item_qk7b5_86`,lead:`_lead_qk7b5_100`,monogram:`_monogram_qk7b5_109`,bullet:`_bullet_qk7b5_128`,text:`_text_qk7b5_136`,title:`_title_qk7b5_143`,subtitle:`_subtitle_qk7b5_153`,trail:`_trail_qk7b5_168`,key:`_key_qk7b5_175`,empty:`_empty_qk7b5_190`,foot:`_foot_qk7b5_197`},B=r();function V({onClose:e=f}){let t=l(),n=c(),r=i(d),s=i(u),p=(0,w.useMemo)(()=>h(),[]),[x,S]=(0,w.useState)(``),[C,E]=(0,w.useState)(0),[D,O]=(0,w.useState)(null),k=(0,w.useRef)(null),A=(0,w.useRef)(null),j=(0,w.useRef)(null),M=(0,w.useId)(),N=(0,w.useId)(),P=(0,w.useRef)(null);P.current=D;let F=(0,w.useCallback)(()=>{P.current?O(null):e()},[e]);a({open:!0,containerRef:k,onClose:F,initialFocusRef:A});let V=(0,w.useMemo)(()=>({needsYou:n.data?.needsYou??[],running:n.data?.running??[],sessions:r.data??s.data?.sessions??[],seats:s.data?.seats??[],projects:s.data?.projects??[],recentActions:t.recentActions,platform:p}),[n.data,r.data,s.data,t.recentActions,p]),H=(0,w.useMemo)(()=>D?.argument?{...R(L(D.argument.kind,V),`>${x}`,[],p),prefix:null}:R(I(V),x,t.recentActions,p),[D,V,x,t.recentActions,p]),U=(0,w.useRef)(!1);(0,w.useEffect)(()=>{if(U.current){U.current=!1,E(H.best);return}E(e=>H.flat.length===0?0:Math.min(e,H.flat.length-1))},[H]),(0,w.useEffect)(()=>{(j.current?.querySelector(`[data-index="${C}"]`))?.scrollIntoView?.({block:`nearest`})},[C]);function W(e){O(e),S(``),E(0)}function G(t){if(!t)return;let n=t.payload;if(n.kind===`command`){let t=b(n.commandId);if(t?.argument){W(t);return}e(),v(n.commandId,{via:`palette`});return}switch(e(),n.kind){case`needs-you`:_({split:`all`,focusId:n.itemId});break;case`chat`:g(n.sessionId);break;case`seat`:v(`chat.new-on`,{via:`palette`,argument:{kind:`seat`,id:n.seatId,label:n.label}});break;case`project`:m(`new-chat`,{projectPath:n.path});break;case`argument`:D&&v(D.id,{via:`palette`,argument:n.argument})}}function K(t){let n=H.flat.length,r=t.key;if((t.metaKey||t.ctrlKey)&&r.toLowerCase()===`k`){t.preventDefault(),e();return}switch(r){case`ArrowDown`:t.preventDefault(),n>0&&E(e=>(e+1)%n);return;case`ArrowUp`:t.preventDefault(),n>0&&E(e=>(e-1+n)%n);return;case`Home`:n>0&&(t.preventDefault(),E(0));return;case`End`:n>0&&(t.preventDefault(),E(n-1));return;case`Enter`:t.preventDefault(),G(H.flat[C]);return;case`Tab`:{t.preventDefault();let e=H.flat[C],n=e?.payload.kind===`command`?b(e.payload.commandId):null;n?.argument&&W(n);return}case`Backspace`:D&&x===``&&(t.preventDefault(),O(null));return;case`Escape`:t.preventDefault(),t.stopPropagation(),D?O(null):e();return;default:return}}let q=H.flat[C],J=D?.argument?`${D.argument.prompt}…`:`Search chats, actions and places`,Y=-1;return(0,T.createPortal)((0,B.jsx)(`div`,{className:z.backdrop,onMouseDown:t=>t.target===t.currentTarget&&e(),children:(0,B.jsxs)(`div`,{ref:k,className:z.panel,role:`dialog`,"aria-modal":`true`,"aria-labelledby":N,"data-verse-overlay":`palette`,children:[(0,B.jsx)(`h2`,{id:N,className:`visually-hidden`,children:`Command palette`}),(0,B.jsxs)(`div`,{className:z.field,children:[D?(0,B.jsxs)(`span`,{className:z.crumb,children:[D.title.replace(/…$/,``),(0,B.jsx)(`span`,{"aria-hidden":`true`,children:` ›`})]}):null,(0,B.jsx)(`input`,{ref:A,className:z.input,value:x,placeholder:J,"aria-label":D?.argument?D.argument.prompt:`Search commands`,role:`combobox`,"aria-expanded":`true`,"aria-controls":M,"aria-autocomplete":`list`,"aria-activedescendant":q?`${M}-${C}`:void 0,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,onChange:e=>{S(e.target.value),U.current=!0},onKeyDown:K})]}),(0,B.jsx)(`div`,{ref:j,id:M,className:z.list,role:`listbox`,"aria-label":`Results`,children:H.flat.length===0?(0,B.jsx)(`p`,{className:z.empty,children:D?`No ${D.argument?.prompt.toLowerCase()??`match`} matches “${x}”.`:`Nothing matches “${x.trim()}”.`}):H.groups.map(e=>(0,B.jsxs)(`div`,{role:`group`,"aria-label":D?D.argument?.prompt??e.label:e.label,className:z.group,children:[(0,B.jsx)(`div`,{className:z.groupLabel,"aria-hidden":`true`,children:D?D.argument?.prompt:e.label}),e.items.map(e=>{Y+=1;let t=Y;return(0,B.jsxs)(`div`,{id:`${M}-${t}`,"data-index":t,role:`option`,"aria-selected":t===C,className:z.item,"data-tone":e.tone,onMouseMove:()=>t!==C&&E(t),onMouseDown:e=>e.preventDefault(),onClick:()=>G(e),children:[(0,B.jsx)(`span`,{className:z.lead,"aria-hidden":`true`,children:e.monogram?(0,B.jsx)(`span`,{className:z.monogram,"data-engine":e.engine??void 0,children:e.engine?(0,B.jsx)(o,{engine:e.engine,size:13}):e.monogram}):(0,B.jsx)(`span`,{className:z.bullet,"data-kind":e.kind})}),(0,B.jsxs)(`span`,{className:z.text,children:[(0,B.jsx)(`span`,{className:z.title,children:e.title}),e.subtitle?(0,B.jsx)(`span`,{className:z.subtitle,children:e.subtitle}):null]}),(0,B.jsxs)(`span`,{className:z.trail,children:[e.argument?(0,B.jsx)(`kbd`,{className:z.key,children:`⇥`}):null,e.shortcut?(0,B.jsx)(`kbd`,{className:z.key,children:e.shortcut}):null]})]},e.key)})]},e.id))}),(0,B.jsxs)(`div`,{className:z.foot,"aria-hidden":`true`,children:[(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`kbd`,{className:z.key,children:`↑↓`}),` move`]}),(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`kbd`,{className:z.key,children:(0,B.jsx)(y,{})}),` run`]}),q?.argument?(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`kbd`,{className:z.key,children:`⇥`}),` `,q.argument.prompt.toLowerCase()]}):null,(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`kbd`,{className:z.key,children:`esc`}),` `,D?`back`:`close`]}),D?null:(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`kbd`,{className:z.key,children:`>`}),` actions only · `,(0,B.jsx)(`kbd`,{className:z.key,children:`#`}),` chats only`]})]}),(0,B.jsx)(`p`,{className:`visually-hidden`,role:`status`,"aria-live":`polite`,children:H.flat.length===1?`1 result`:`${H.flat.length} results`})]})}),document.body)}export{V as CommandPalette};
|
|
2
|
-
//# sourceMappingURL=CommandPalette-DzPsth0u.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CommandPalette-DzPsth0u.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/palette-model.ts","../../../../../../src/web-ui/routes/verse/shell/CommandPalette.module.css","../../../../../../src/web-ui/routes/verse/shell/CommandPalette.tsx"],"sourcesContent":["/**\n * routes/verse/shell/palette-model.ts — the ⌘K palette as data (unit C1;\n * SPEC-310C §1 \"⌘K palette\"). Pure: items in, ranked groups out.\n *\n * Needs you › Chats (running first) › Actions › Go to › Seats & Apps › Projects\n *\n * `>` limits results to actions, `#` to chats (command-catalog PALETTE_PREFIXES).\n * An empty query shows what needs you (top 3) and the last 5 actions run.\n * Tab on an item with an argument (\"New chat on…\") lists its candidates.\n *\n * Ranking is a small fuzzy matcher, not a library: every query word must\n * match (title or keywords), contiguous and word-start matches win, and the\n * catalog's order breaks ties — so \"stop\" puts \"Stop running chats…\" above a\n * chat that merely contains an s, t, o and p.\n */\nimport type { VerseProject, VerseSeat, VerseSession } from '../../../data/api-types.js';\nimport {\n ENGINE_MONOGRAM,\n type NeedsYouItem,\n type VerseActivityRunning,\n} from '../../../../core/verse/workbench-types.js';\nimport {\n formatChord,\n paletteCommands,\n PALETTE_GROUPS,\n PALETTE_PREFIXES,\n PALETTE_RECENT_LIMIT,\n findCommand,\n type CommandArgumentKind,\n type KeyPlatform,\n type PaletteGroupId,\n type WorkbenchCommand,\n} from './command-catalog.js';\n\nexport type PaletteItemKind = 'needs-you' | 'chat' | 'command' | 'seat' | 'project' | 'argument';\n\nexport interface PaletteItem {\n /** Unique across the whole list (React key + active-descendant id). */\n key: string;\n kind: PaletteItemKind;\n group: PaletteGroupId | 'recent';\n title: string;\n /** Muted second part of the row. */\n subtitle: string | null;\n /** Right-aligned shortcut (\"⇧⌘B\"), when the command has one. */\n shortcut: string | null;\n /** A one-letter engine monogram for chats and seats; null otherwise. */\n monogram: string | null;\n engine: VerseSession['engine'] | null;\n /** Extra words that match but are not shown. */\n keywords: readonly string[];\n /** Tab fills this. */\n argument: { kind: CommandArgumentKind; prompt: string } | null;\n /** Painted as a warning (running chat, high-severity item). */\n tone: 'neutral' | 'running' | 'warn' | 'danger';\n /** What Enter does — interpreted by the component. */\n payload:\n | { kind: 'needs-you'; itemId: string }\n | { kind: 'chat'; sessionId: string }\n | { kind: 'command'; commandId: string }\n | { kind: 'seat'; seatId: string; label: string }\n | { kind: 'project'; path: string; name: string }\n | { kind: 'argument'; argument: { kind: CommandArgumentKind; id: string; label: string } };\n}\n\nexport interface PaletteInput {\n needsYou: readonly NeedsYouItem[];\n running: readonly VerseActivityRunning[];\n sessions: readonly VerseSession[];\n seats: readonly VerseSeat[];\n projects: readonly VerseProject[];\n recentActions: readonly string[];\n platform: KeyPlatform;\n now?: number;\n}\n\nexport const GROUP_LABEL: Readonly<Record<PaletteGroupId | 'recent', string>> = {\n ...(Object.fromEntries(PALETTE_GROUPS.map((g) => [g.id, g.label])) as Record<PaletteGroupId, string>),\n recent: 'Recent',\n};\n\nconst GROUP_ORDER: readonly (PaletteGroupId | 'recent')[] = [\n 'needs-you',\n 'recent',\n ...PALETTE_GROUPS.map((g) => g.id).filter((id) => id !== 'needs-you'),\n];\n\n/** Per-group caps with a query (the palette is for jumping, not browsing). */\nconst GROUP_CAP: Readonly<Record<PaletteGroupId | 'recent', number>> = {\n 'needs-you': 5,\n recent: PALETTE_RECENT_LIMIT,\n chats: 8,\n actions: 8,\n 'go-to': 6,\n 'seats-apps': 5,\n projects: 5,\n};\n\n// ---------------------------------------------------------------------------\n// Matching\n// ---------------------------------------------------------------------------\n\nfunction isWordStart(text: string, index: number): boolean {\n if (index === 0) return true;\n const prev = text[index - 1]!;\n return /[\\s\\-_/.:·›,(]/.test(prev) || (/[a-z]/.test(prev) && /[A-Z]/.test(text[index]!));\n}\n\n/**\n * Score one query word against one text; null = no match. Contiguous beats\n * scattered, word-start beats mid-word, earlier beats later.\n */\nexport function fuzzyScore(word: string, text: string): number | null {\n const q = word.toLowerCase();\n if (!q) return 0;\n const lower = text.toLowerCase();\n const at = lower.indexOf(q);\n if (at >= 0) {\n // No length penalty: two titles that both START with the word tie, and\n // the catalog's order decides (\"stop\" → Stop running chats… before Stop\n // the fleet…, the everyday action before the drastic one).\n let score = 1_000 - at * 4;\n if (isWordStart(text, at)) score += 400;\n if (at === 0) score += 200;\n return score;\n }\n // Subsequence: every character in order.\n let score = 0;\n let from = 0;\n let prevHit = -2;\n for (const ch of q) {\n const hit = lower.indexOf(ch, from);\n if (hit < 0) return null;\n score += hit === prevHit + 1 ? 30 : 5;\n if (isWordStart(text, hit)) score += 20;\n score -= Math.min(20, hit - from);\n prevHit = hit;\n from = hit + 1;\n }\n return score;\n}\n\n/** Every word must match the title or a keyword; the best field per word counts. */\nexport function matchItem(item: Pick<PaletteItem, 'title' | 'subtitle' | 'keywords'>, query: string): number | null {\n const words = query.trim().split(/\\s+/).filter(Boolean);\n if (words.length === 0) return 0;\n let total = 0;\n for (const word of words) {\n let best: number | null = fuzzyScore(word, item.title);\n for (const field of [item.subtitle ?? '', ...item.keywords]) {\n if (!field) continue;\n const s = fuzzyScore(word, field);\n // A keyword / subtitle hit counts, but less than the title itself.\n if (s !== null) best = Math.max(best ?? Number.NEGATIVE_INFINITY, s * 0.6);\n }\n if (best === null) return null;\n total += best;\n }\n return total;\n}\n\n// ---------------------------------------------------------------------------\n// Items\n// ---------------------------------------------------------------------------\n\nfunction elapsed(startedAt: string, now: number): string {\n const s = Math.max(0, Math.round((now - Date.parse(startedAt)) / 1000));\n if (!Number.isFinite(s)) return 'running';\n if (s < 60) return `running ${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `running ${m}m ${String(s % 60).padStart(2, '0')}s`;\n return `running ${Math.floor(m / 60)}h ${m % 60}m`;\n}\n\nfunction relative(iso: string, now: number): string {\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return '';\n const m = Math.round((now - t) / 60_000);\n if (m < 1) return 'just now';\n if (m < 60) return `${m}m ago`;\n const h = Math.round(m / 60);\n if (h < 36) return `${h}h ago`;\n return `${Math.round(h / 24)}d ago`;\n}\n\nfunction projectName(path: string): string {\n const parts = path.split(/[\\\\/]/).filter(Boolean);\n return parts[parts.length - 1] ?? path;\n}\n\nexport function commandItem(command: WorkbenchCommand, platform: KeyPlatform, group: PaletteGroupId | 'recent'): PaletteItem {\n const chord = command.keys[0];\n return {\n key: `${group}:cmd:${command.id}`,\n kind: 'command',\n group,\n title: command.title,\n subtitle: command.scope === 'chat' || command.scope === 'composer' ? 'in Chat' : command.surface === 'command' ? 'on Command' : null,\n shortcut: chord ? formatChord(chord, platform) : null,\n monogram: null,\n engine: null,\n keywords: [...(command.keywords ?? []), command.section.toLowerCase()],\n argument: command.argument ? { ...command.argument } : null,\n tone: command.guard?.confirm.destructive ? 'danger' : 'neutral',\n payload: { kind: 'command', commandId: command.id },\n };\n}\n\n/** Every candidate item, before the query. */\nexport function buildPaletteItems(input: PaletteInput): PaletteItem[] {\n const now = input.now ?? Date.now();\n const items: PaletteItem[] = [];\n\n for (const n of input.needsYou) {\n items.push({\n key: `needs-you:${n.id}`,\n kind: 'needs-you',\n group: 'needs-you',\n title: n.title,\n subtitle: n.subject.repo ?? n.subject.seatId ?? null,\n shortcut: null,\n monogram: n.subject.engine ? ENGINE_MONOGRAM[n.subject.engine] : null,\n engine: n.subject.engine,\n keywords: [n.kind.replace(/-/g, ' '), n.source, 'needs you'],\n argument: null,\n tone: n.severity === 'high' ? 'danger' : n.severity === 'warn' ? 'warn' : 'neutral',\n payload: { kind: 'needs-you', itemId: n.id },\n });\n }\n\n const running = new Map(input.running.map((r) => [r.sessionId, r] as const));\n const sessions = [...input.sessions].sort((a, b) => {\n const ra = running.has(a.id) || a.status === 'running' ? 0 : 1;\n const rb = running.has(b.id) || b.status === 'running' ? 0 : 1;\n if (ra !== rb) return ra - rb;\n return a.updatedAt < b.updatedAt ? 1 : a.updatedAt > b.updatedAt ? -1 : 0;\n });\n for (const s of sessions) {\n const live = running.get(s.id);\n const isRunning = !!live || s.status === 'running';\n const status = isRunning ? (live ? elapsed(live.startedAt, now) : 'running') : s.status === 'error' ? 'failed' : relative(s.updatedAt, now);\n items.push({\n key: `chat:${s.id}`,\n kind: 'chat',\n group: 'chats',\n title: s.title || 'Untitled chat',\n subtitle: [projectName(s.projectPath), status].filter(Boolean).join(' · '),\n shortcut: null,\n monogram: ENGINE_MONOGRAM[s.engine],\n engine: s.engine,\n keywords: [s.model, s.seatId, projectName(s.projectPath)],\n argument: null,\n tone: isRunning ? 'running' : s.status === 'error' ? 'warn' : 'neutral',\n payload: { kind: 'chat', sessionId: s.id },\n });\n }\n\n for (const command of paletteCommands('actions')) items.push(commandItem(command, input.platform, 'actions'));\n for (const command of paletteCommands('go-to')) items.push(commandItem(command, input.platform, 'go-to'));\n\n for (const seat of input.seats) {\n items.push({\n key: `seat:${seat.id}`,\n kind: 'seat',\n group: 'seats-apps',\n title: `New chat on ${seat.label}`,\n subtitle: seat.id,\n shortcut: null,\n monogram: ENGINE_MONOGRAM[seat.engine],\n engine: seat.engine,\n keywords: [seat.engine, seat.label, 'seat', 'account'],\n argument: null,\n tone: 'neutral',\n payload: { kind: 'seat', seatId: seat.id, label: seat.label },\n });\n }\n\n for (const project of input.projects) {\n items.push({\n key: `project:${project.path}`,\n kind: 'project',\n group: 'projects',\n title: `New chat in ${project.name || projectName(project.path)}`,\n subtitle: project.enrolled ? 'enrolled in the fleet' : null,\n shortcut: null,\n monogram: null,\n engine: null,\n keywords: [project.name, projectName(project.path)],\n argument: null,\n tone: 'neutral',\n payload: { kind: 'project', path: project.path, name: project.name || projectName(project.path) },\n });\n }\n\n return items;\n}\n\n/** The candidates Tab offers for an argument. */\nexport function argumentItems(kind: CommandArgumentKind, input: PaletteInput): PaletteItem[] {\n const base = (id: string, label: string, subtitle: string | null, monogram: string | null, engine: PaletteItem['engine']): PaletteItem => ({\n key: `arg:${kind}:${id}`,\n kind: 'argument',\n group: 'actions',\n title: label,\n subtitle,\n shortcut: null,\n monogram,\n engine,\n keywords: [id],\n argument: null,\n tone: 'neutral',\n payload: { kind: 'argument', argument: { kind, id, label } },\n });\n switch (kind) {\n case 'seat':\n return input.seats.map((s) => base(s.id, s.label, s.id, ENGINE_MONOGRAM[s.engine], s.engine));\n case 'project':\n return input.projects.map((p) => base(p.path, p.name || projectName(p.path), null, null, null));\n case 'session':\n return input.sessions.map((s) => base(s.id, s.title || 'Untitled chat', projectName(s.projectPath), ENGINE_MONOGRAM[s.engine], s.engine));\n case 'section':\n return [];\n default:\n return [];\n }\n}\n\nexport interface PaletteGroup {\n id: PaletteGroupId | 'recent';\n label: string;\n items: PaletteItem[];\n}\n\nexport interface PaletteView {\n groups: PaletteGroup[];\n /** Flattened, in display order — what ↑/↓ walks. */\n flat: PaletteItem[];\n /** The prefix in force (`>` / `#`), if any. */\n prefix: '>' | '#' | null;\n /**\n * Index into `flat` of the strongest match — what a fresh query highlights,\n * so Enter runs it. Groups keep their fixed order, which means the best hit\n * can sit in a LATER group: \"usage\" hits the resource-bar toggle's\n * \"usage bars\" keyword in Actions above \"Open Usage\" in Go to, and\n * highlighting row 0 made Enter toggle the bar instead of opening Usage.\n * 0 for an empty query (the rows there are unscored).\n */\n best: number;\n}\n\n/** Items → ranked, grouped, capped view for `rawQuery`. */\nexport function paletteView(items: readonly PaletteItem[], rawQuery: string, recentActions: readonly string[], platform: KeyPlatform): PaletteView {\n let query = rawQuery;\n let prefix: '>' | '#' | null = null;\n const first = query.trimStart().charAt(0);\n if (first === '>' || first === '#') {\n prefix = first;\n query = query.trimStart().slice(1);\n }\n const only: PaletteGroupId | null = prefix ? PALETTE_PREFIXES[prefix] : null;\n const trimmed = query.trim();\n\n const groups = new Map<PaletteGroupId | 'recent', Array<{ item: PaletteItem; score: number; order: number }>>();\n const push = (item: PaletteItem, score: number, order: number) => {\n const list = groups.get(item.group) ?? [];\n list.push({ item, score, order });\n groups.set(item.group, list);\n };\n\n if (trimmed === '' && !prefix) {\n // Empty query: what needs you, then what you did last.\n items.filter((i) => i.group === 'needs-you').slice(0, 3).forEach((item, order) => push(item, 0, order));\n const recent = recentActions.map((id) => findCommand(id)).filter((c): c is WorkbenchCommand => c !== null && c.group !== null);\n const shown = recent.length > 0 ? recent : (['chat.new', 'needs-you.open', 'shortcuts.open'] as const).map((id) => findCommand(id)!);\n shown.slice(0, PALETTE_RECENT_LIMIT).forEach((command, order) => push(commandItem(command, platform, 'recent'), 0, order));\n } else {\n items.forEach((item, order) => {\n if (only && item.group !== only) return;\n const score = trimmed === '' ? 0 : matchItem(item, trimmed);\n if (score === null) return;\n push(item, score, order);\n });\n }\n\n const out: PaletteGroup[] = [];\n const flatScores: number[] = [];\n for (const id of GROUP_ORDER) {\n const list = groups.get(id);\n if (!list || list.length === 0) continue;\n // Chats: running first (SPEC-310C §1), then by match. Everything else by\n // match, with catalog / recency order breaking ties.\n const runRank = (e: { item: PaletteItem }) => (id === 'chats' && e.item.tone === 'running' ? 0 : 1);\n list.sort((a, b) => runRank(a) - runRank(b) || b.score - a.score || a.order - b.order);\n const cap = prefix ? 50 : GROUP_CAP[id];\n const shown = list.slice(0, cap);\n for (const e of shown) flatScores.push(e.score);\n out.push({ id, label: GROUP_LABEL[id], items: shown.map((e) => e.item) });\n }\n // Strictly greater: on a tie the earlier row (group order, then rank) wins.\n let best = 0;\n if (trimmed !== '') {\n flatScores.forEach((score, i) => {\n if (score > flatScores[best]!) best = i;\n });\n }\n return { groups: out, flat: out.flatMap((g) => g.items), prefix, best };\n}\n","/* ⌘K — a raised panel over a dimmed workbench. Hairlines, one accent (the\n highlighted row), engine identity only as a monogram tile. */\n\n.backdrop {\n position: fixed;\n inset: 0;\n z-index: var(--z-command-palette);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: 12vh var(--space-4) var(--space-4);\n background: var(--bg-overlay);\n animation: fade var(--duration-fast) var(--ease-standard);\n}\n\n.panel {\n display: flex;\n flex-direction: column;\n width: min(640px, 100%);\n max-height: min(560px, 72vh);\n overflow: hidden;\n background: var(--bg-surface-raised);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-xl);\n box-shadow: var(--shadow-xl);\n animation: rise var(--duration-base) var(--ease-decelerate);\n}\n\n.field {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding: 0 var(--space-4);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.crumb {\n flex: none;\n padding: 2px var(--space-2);\n border-radius: var(--radius-sm);\n background: var(--bg-selected);\n color: var(--text-primary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-weight: var(--font-weight-medium);\n white-space: nowrap;\n}\n\n.input {\n flex: 1;\n min-width: 0;\n /* The palette's search field is a notch taller than a full control, so it\n reads as the palette's title: control + 20px = 52px comfortable, 48px\n compact. Derived rather than literal so Density reaches it. */\n height: calc(var(--control-h) + var(--space-5));\n border: 0;\n background: transparent;\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n}\n.input::placeholder { color: var(--text-tertiary); }\n.input:focus-visible { outline: none; box-shadow: none; }\n\n.list {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n padding: var(--space-1) var(--space-2) var(--space-2);\n}\n\n.group + .group { margin-top: var(--space-1); }\n\n.groupLabel {\n padding: var(--space-2) var(--space-2) var(--space-1);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.item {\n display: grid;\n grid-template-columns: 24px minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--space-3);\n /* A list row plus its 4px+4px padding: 40px comfortable, 34px compact. */\n min-height: calc(var(--density-row) + var(--space-2));\n padding: var(--space-1) var(--space-2);\n border-radius: var(--radius-md);\n color: var(--text-primary);\n cursor: pointer;\n}\n.item[aria-selected='true'] { background: var(--bg-selected); }\n\n.lead {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Engine identity: a letter on a tile with a 2px engine tick — never a logo.\n Its 20px is intrinsic glyph geometry (a square identity mark, like Apps'\n monogram tile), not a control height, so it does not follow Density. */\n.monogram {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: var(--radius-sm);\n background: var(--bg-hover);\n box-shadow: inset 2px 0 0 var(--text-tertiary);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.monogram[data-engine='claude'] { box-shadow: inset 2px 0 0 var(--engine-claude); }\n.monogram[data-engine='codex'] { box-shadow: inset 2px 0 0 var(--engine-codex); }\n.monogram[data-engine='grok'] { box-shadow: inset 2px 0 0 var(--engine-grok); }\n.monogram[data-engine='local'] { box-shadow: inset 2px 0 0 var(--engine-local); }\n\n.bullet {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n.bullet[data-kind='needs-you'] { background: var(--status-warning-solid); }\n\n.text {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n min-width: 0;\n}\n\n.title {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n\n.subtitle {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.item[data-tone='running'] .subtitle { color: var(--status-running-fg); }\n.item[data-tone='warn'] .subtitle { color: var(--status-warning-fg); }\n.item[data-tone='danger'] .bullet { background: var(--status-danger-solid); }\n\n.trail {\n display: flex;\n align-items: center;\n gap: var(--space-1);\n}\n\n/* <kbd> keycap: a non-interactive glyph sized to its chord (20px), not a control. */\n.key {\n display: inline-flex;\n align-items: center;\n min-width: 20px;\n height: 20px;\n padding: 0 var(--space-1);\n justify-content: center;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs);\n background: var(--bg-surface);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n color: var(--text-secondary);\n}\n\n.empty {\n padding: var(--space-8) var(--space-4);\n text-align: center;\n font-size: var(--text-sm-size);\n color: var(--text-tertiary);\n}\n\n.foot {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-4);\n padding: var(--space-2) var(--space-4);\n border-top: 1px solid var(--border-subtle);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n}\n.foot span { display: inline-flex; align-items: center; gap: var(--space-1); }\n\n@keyframes fade { from { opacity: 0; } }\n@keyframes rise { from { opacity: 0; transform: translateY(-4px); } }\n\n/* Phone: a full-width sheet from the top; no footer (no keyboard). */\n@media (max-width: 479.98px) {\n .backdrop { padding: var(--space-2); align-items: stretch; }\n .panel { width: 100%; max-height: 100%; border-radius: var(--radius-lg); }\n .foot { display: none; }\n .text { flex-direction: column; align-items: stretch; gap: 0; }\n /* A touch target on a phone — fixed on purpose: the DESKTOP density switch\n must not shrink a finger target (same rule as VerseApp's bottom bar). */\n .item { min-height: 48px; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .backdrop,\n :root:not([data-motion='full']) .panel { animation: none; }\n}\n:root[data-motion='reduce'] .backdrop,\n:root[data-motion='reduce'] .panel { animation: none; }\n","/**\n * routes/verse/shell/CommandPalette.tsx — ⌘K (unit C1; SPEC-310C §1).\n *\n * Lives in the SHELL chunk (VerseApp imports it statically), so opening it\n * costs one render — no chunk to fetch, no surface to mount — which is how\n * it opens inside the 50 ms budget. It NEVER switches surface on its own:\n * opening it on Fleet leaves Fleet on screen (the pre-3.10 switcher jumped to\n * Chat first). Only running an item navigates, and only when that is what\n * the item is.\n *\n * Keys (the palette owns every key while open):\n * ↑ ↓ move · ↩ run · ⇥ fill the argument (\"New chat on…\" → a seat) ·\n * ⌫ on an empty argument query steps back · Esc closes (or leaves the\n * argument step) · ⌘K closes.\n *\n * Accessibility: a combobox driving a listbox through aria-activedescendant\n * (focus never leaves the input); group headings are presentational labels\n * the options reference, and the result count is announced politely.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useFocusTrap } from '../../../components/primitives/focus-trap.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { verseBootstrapQuery, verseSessionsQuery } from '../verse-queries.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { ReturnKeyIcon } from '../verse-icons.js';\nimport { closeVerseOverlay, openVerseNeedsYou, openVerseSession, requestVerseCommand } from '../verse-ui-store.js';\nimport { detectKeyPlatform, findCommand, type WorkbenchCommand } from './command-catalog.js';\nimport { argumentItems, buildPaletteItems, paletteView, type PaletteItem } from './palette-model.js';\nimport { executeCatalogCommand } from './run-command.js';\nimport { useActivity } from './useActivity.js';\nimport styles from './CommandPalette.module.css';\nimport { ProviderLogo } from '../../../components/primitives/ProviderLogo.js';\n\nexport interface CommandPaletteProps {\n onClose?: () => void;\n}\n\nexport function CommandPalette({ onClose = closeVerseOverlay }: CommandPaletteProps) {\n const ui = useVerseUi();\n const activity = useActivity();\n const sessions = useQuery(verseSessionsQuery);\n const bootstrap = useQuery(verseBootstrapQuery);\n const platform = useMemo(() => detectKeyPlatform(), []);\n const [query, setQuery] = useState('');\n const [active, setActive] = useState(0);\n const [argFor, setArgFor] = useState<WorkbenchCommand | null>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const listId = useId();\n const labelId = useId();\n\n // The trap owns Escape (it listens in the capture phase, before the input\n // sees the key), so \"Esc leaves the argument step first\" lives here.\n const argRef = useRef<WorkbenchCommand | null>(null);\n argRef.current = argFor;\n const trapClose = useCallback(() => {\n if (argRef.current) setArgFor(null);\n else onClose();\n }, [onClose]);\n useFocusTrap({ open: true, containerRef: panelRef, onClose: trapClose, initialFocusRef: inputRef });\n\n const input = useMemo(\n () => ({\n needsYou: activity.data?.needsYou ?? [],\n running: activity.data?.running ?? [],\n sessions: sessions.data ?? bootstrap.data?.sessions ?? [],\n seats: bootstrap.data?.seats ?? [],\n projects: bootstrap.data?.projects ?? [],\n recentActions: ui.recentActions,\n platform,\n }),\n [activity.data, sessions.data, bootstrap.data, ui.recentActions, platform],\n );\n\n const view = useMemo(() => {\n if (argFor?.argument) {\n const candidates = argumentItems(argFor.argument.kind, input);\n const shown = paletteView(candidates, `>${query}`, [], platform);\n return { ...shown, prefix: null };\n }\n return paletteView(buildPaletteItems(input), query, ui.recentActions, platform);\n }, [argFor, input, query, ui.recentActions, platform]);\n\n // A new query highlights its best match (see PaletteView.best); a data\n // refresh under an unchanged query only keeps the highlight on a real row,\n // so it never yanks a highlight the operator arrowed to.\n const highlightBestRef = useRef(false);\n useEffect(() => {\n if (highlightBestRef.current) {\n highlightBestRef.current = false;\n setActive(view.best);\n return;\n }\n setActive((i) => (view.flat.length === 0 ? 0 : Math.min(i, view.flat.length - 1)));\n }, [view]);\n\n useEffect(() => {\n const row = listRef.current?.querySelector<HTMLElement>(`[data-index=\"${active}\"]`);\n row?.scrollIntoView?.({ block: 'nearest' });\n }, [active]);\n\n function enterArgument(command: WorkbenchCommand) {\n setArgFor(command);\n setQuery('');\n setActive(0);\n }\n\n function run(item: PaletteItem | undefined) {\n if (!item) return;\n const payload = item.payload;\n if (payload.kind === 'command') {\n const command = findCommand(payload.commandId);\n // Enter on an argument command asks for the argument, like Tab.\n if (command?.argument) {\n enterArgument(command);\n return;\n }\n onClose();\n executeCatalogCommand(payload.commandId, { via: 'palette' });\n return;\n }\n onClose();\n switch (payload.kind) {\n case 'needs-you':\n openVerseNeedsYou({ split: 'all', focusId: payload.itemId });\n break;\n case 'chat':\n openVerseSession(payload.sessionId);\n break;\n case 'seat':\n executeCatalogCommand('chat.new-on', { via: 'palette', argument: { kind: 'seat', id: payload.seatId, label: payload.label } });\n break;\n case 'project':\n requestVerseCommand('new-chat', { projectPath: payload.path });\n break;\n case 'argument':\n if (argFor) executeCatalogCommand(argFor.id, { via: 'palette', argument: payload.argument });\n break;\n default:\n break;\n }\n }\n\n function onKeyDown(event: ReactKeyboardEvent<HTMLInputElement>) {\n const count = view.flat.length;\n const key = event.key;\n if ((event.metaKey || event.ctrlKey) && key.toLowerCase() === 'k') {\n event.preventDefault();\n onClose();\n return;\n }\n switch (key) {\n case 'ArrowDown':\n event.preventDefault();\n if (count > 0) setActive((i) => (i + 1) % count);\n return;\n case 'ArrowUp':\n event.preventDefault();\n if (count > 0) setActive((i) => (i - 1 + count) % count);\n return;\n case 'Home':\n if (count > 0) { event.preventDefault(); setActive(0); }\n return;\n case 'End':\n if (count > 0) { event.preventDefault(); setActive(count - 1); }\n return;\n case 'Enter':\n event.preventDefault();\n run(view.flat[active]);\n return;\n case 'Tab': {\n // Tab never moves focus out of the palette: it fills an argument or does nothing.\n event.preventDefault();\n const item = view.flat[active];\n const command = item?.payload.kind === 'command' ? findCommand(item.payload.commandId) : null;\n if (command?.argument) enterArgument(command);\n return;\n }\n case 'Backspace':\n if (argFor && query === '') {\n event.preventDefault();\n setArgFor(null);\n }\n return;\n case 'Escape':\n event.preventDefault();\n event.stopPropagation();\n if (argFor) setArgFor(null);\n else onClose();\n return;\n default:\n return;\n }\n }\n\n const activeItem = view.flat[active];\n const placeholder = argFor?.argument\n ? `${argFor.argument.prompt}…`\n : 'Search chats, actions and places';\n let index = -1;\n\n return createPortal(\n <div className={styles.backdrop} onMouseDown={(e) => e.target === e.currentTarget && onClose()}>\n <div ref={panelRef} className={styles.panel} role=\"dialog\" aria-modal=\"true\" aria-labelledby={labelId} data-verse-overlay=\"palette\">\n <h2 id={labelId} className=\"visually-hidden\">Command palette</h2>\n <div className={styles.field}>\n {argFor ? (\n <span className={styles.crumb}>\n {argFor.title.replace(/…$/, '')}\n <span aria-hidden=\"true\"> ›</span>\n </span>\n ) : null}\n <input\n ref={inputRef}\n className={styles.input}\n value={query}\n placeholder={placeholder}\n aria-label={argFor?.argument ? argFor.argument.prompt : 'Search commands'}\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeItem ? `${listId}-${active}` : undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n onChange={(e) => {\n setQuery(e.target.value);\n highlightBestRef.current = true;\n }}\n onKeyDown={onKeyDown}\n />\n </div>\n <div ref={listRef} id={listId} className={styles.list} role=\"listbox\" aria-label=\"Results\">\n {view.flat.length === 0 ? (\n <p className={styles.empty}>\n {argFor ? `No ${argFor.argument?.prompt.toLowerCase() ?? 'match'} matches “${query}”.` : `Nothing matches “${query.trim()}”.`}\n </p>\n ) : (\n view.groups.map((group) => (\n <div key={group.id} role=\"group\" aria-label={argFor ? (argFor.argument?.prompt ?? group.label) : group.label} className={styles.group}>\n <div className={styles.groupLabel} aria-hidden=\"true\">\n {argFor ? argFor.argument?.prompt : group.label}\n </div>\n {group.items.map((item) => {\n index += 1;\n const i = index;\n return (\n <div\n key={item.key}\n id={`${listId}-${i}`}\n data-index={i}\n role=\"option\"\n aria-selected={i === active}\n className={styles.item}\n data-tone={item.tone}\n onMouseMove={() => i !== active && setActive(i)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => run(item)}\n >\n <span className={styles.lead} aria-hidden=\"true\">\n {item.monogram ? (\n <span className={styles.monogram} data-engine={item.engine ?? undefined}>{item.engine ? <ProviderLogo engine={item.engine} size={13} /> : item.monogram}</span>\n ) : (\n <span className={styles.bullet} data-kind={item.kind} />\n )}\n </span>\n <span className={styles.text}>\n <span className={styles.title}>{item.title}</span>\n {item.subtitle ? <span className={styles.subtitle}>{item.subtitle}</span> : null}\n </span>\n <span className={styles.trail}>\n {item.argument ? <kbd className={styles.key}>⇥</kbd> : null}\n {item.shortcut ? <kbd className={styles.key}>{item.shortcut}</kbd> : null}\n </span>\n </div>\n );\n })}\n </div>\n ))\n )}\n </div>\n <div className={styles.foot} aria-hidden=\"true\">\n <span><kbd className={styles.key}>↑↓</kbd> move</span>\n <span><kbd className={styles.key}><ReturnKeyIcon /></kbd> run</span>\n {activeItem?.argument ? <span><kbd className={styles.key}>⇥</kbd> {activeItem.argument.prompt.toLowerCase()}</span> : null}\n <span><kbd className={styles.key}>esc</kbd> {argFor ? 'back' : 'close'}</span>\n {argFor ? null : <span><kbd className={styles.key}>></kbd> actions only · <kbd className={styles.key}>#</kbd> chats only</span>}\n </div>\n <p className=\"visually-hidden\" role=\"status\" aria-live=\"polite\">\n {view.flat.length === 1 ? '1 result' : `${view.flat.length} results`}\n </p>\n </div>\n </div>,\n document.body,\n );\n}\n"],"mappings":"sdA4Ea,EAAmE,CAC9E,GAAI,OAAO,YAAY,EAAe,IAAK,GAAM,CAAC,EAAE,GAAI,EAAE,KAAK,CAAC,CAAC,EACjE,OAAQ,QACV,EAEM,EAAsD,CAC1D,YACA,SACA,GAAG,EAAe,IAAK,GAAM,EAAE,EAAE,CAAC,CAAC,OAAQ,GAAO,IAAO,WAAW,CACtE,EAGM,EAAiE,CACrE,YAAa,EACb,OAAA,EACA,MAAO,EACP,QAAS,EACT,QAAS,EACT,aAAc,EACd,SAAU,CACZ,EAMA,SAAS,EAAY,EAAc,EAAwB,CACzD,GAAI,IAAU,EAAG,MAAO,GACxB,IAAM,EAAO,EAAK,EAAQ,GAC1B,MAAO,iBAAiB,KAAK,CAAI,GAAM,QAAQ,KAAK,CAAI,GAAK,QAAQ,KAAK,EAAK,EAAO,CACxF,CAMA,SAAgB,EAAW,EAAc,EAA6B,CACpE,IAAM,EAAI,EAAK,YAAY,EAC3B,GAAI,CAAC,EAAG,MAAO,GACf,IAAM,EAAQ,EAAK,YAAY,EACzB,EAAK,EAAM,QAAQ,CAAC,EAC1B,GAAI,GAAM,EAAG,CAIX,IAAI,EAAQ,IAAQ,EAAK,EAGzB,OAFI,EAAY,EAAM,CAAE,IAAG,GAAS,KAChC,IAAO,IAAG,GAAS,KAChB,CACT,CAEA,IAAI,EAAQ,EACR,EAAO,EACP,EAAU,GACd,IAAK,IAAM,KAAM,EAAG,CAClB,IAAM,EAAM,EAAM,QAAQ,EAAI,CAAI,EAClC,GAAI,EAAM,EAAG,OAAO,KACpB,GAAS,IAAQ,EAAU,EAAI,GAAK,EAChC,EAAY,EAAM,CAAG,IAAG,GAAS,IACrC,GAAS,KAAK,IAAI,GAAI,EAAM,CAAI,EAChC,EAAU,EACV,EAAO,EAAM,CACf,CACA,OAAO,CACT,CAGA,SAAgB,EAAU,EAA4D,EAA8B,CAClH,IAAM,EAAQ,EAAM,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO,EACtD,GAAI,EAAM,SAAW,EAAG,MAAO,GAC/B,IAAI,EAAQ,EACZ,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAI,EAAsB,EAAW,EAAM,EAAK,KAAK,EACrD,IAAK,IAAM,IAAS,CAAC,EAAK,UAAY,GAAI,GAAG,EAAK,QAAQ,EAAG,CAC3D,GAAI,CAAC,EAAO,SACZ,IAAM,EAAI,EAAW,EAAM,CAAK,EAE5B,IAAM,OAAM,EAAO,KAAK,IAAI,GAAQ,KAA0B,EAAI,EAAG,EAC3E,CACA,GAAI,IAAS,KAAM,OAAO,KAC1B,GAAS,CACX,CACA,OAAO,CACT,CAMA,SAAS,EAAQ,EAAmB,EAAqB,CACvD,IAAM,EAAI,KAAK,IAAI,EAAG,KAAK,OAAO,EAAM,KAAK,MAAM,CAAS,GAAK,GAAI,CAAC,EACtE,GAAI,CAAC,OAAO,SAAS,CAAC,EAAG,MAAO,UAChC,GAAI,EAAI,GAAI,MAAO,WAAW,EAAE,GAChC,IAAM,EAAI,KAAK,MAAM,EAAI,EAAE,EAE3B,OADI,EAAI,GAAW,WAAW,EAAE,IAAI,OAAO,EAAI,EAAE,CAAC,CAAC,SAAS,EAAG,GAAG,EAAE,GAC7D,WAAW,KAAK,MAAM,EAAI,EAAE,EAAE,IAAI,EAAI,GAAG,EAClD,CAEA,SAAS,EAAS,EAAa,EAAqB,CAClD,IAAM,EAAI,KAAK,MAAM,CAAG,EACxB,GAAI,CAAC,OAAO,SAAS,CAAC,EAAG,MAAO,GAChC,IAAM,EAAI,KAAK,OAAO,EAAM,GAAK,GAAM,EACvC,GAAI,EAAI,EAAG,MAAO,WAClB,GAAI,EAAI,GAAI,MAAO,GAAG,EAAE,OACxB,IAAM,EAAI,KAAK,MAAM,EAAI,EAAE,EAE3B,OADI,EAAI,GAAW,GAAG,EAAE,OACjB,GAAG,KAAK,MAAM,EAAI,EAAE,EAAE,MAC/B,CAEA,SAAS,EAAY,EAAsB,CACzC,IAAM,EAAQ,EAAK,MAAM,OAAO,CAAC,CAAC,OAAO,OAAO,EAChD,OAAO,EAAM,EAAM,OAAS,IAAM,CACpC,CAEA,SAAgB,EAAY,EAA2B,EAAuB,EAA+C,CAC3H,IAAM,EAAQ,EAAQ,KAAK,GAC3B,MAAO,CACL,IAAK,GAAG,EAAM,OAAO,EAAQ,KAC7B,KAAM,UACN,QACA,MAAO,EAAQ,MACf,SAAU,EAAQ,QAAU,QAAU,EAAQ,QAAU,WAAa,UAAY,EAAQ,UAAY,UAAY,aAAe,KAChI,SAAU,EAAQ,EAAY,EAAO,CAAQ,EAAI,KACjD,SAAU,KACV,OAAQ,KACR,SAAU,CAAC,GAAI,EAAQ,UAAY,CAAC,EAAI,EAAQ,QAAQ,YAAY,CAAC,EACrE,SAAU,EAAQ,SAAW,CAAE,GAAG,EAAQ,QAAS,EAAI,KACvD,KAAM,EAAQ,OAAO,QAAQ,YAAc,SAAW,UACtD,QAAS,CAAE,KAAM,UAAW,UAAW,EAAQ,EAAG,CACpD,CACF,CAGA,SAAgB,EAAkB,EAAoC,CACpE,IAAM,EAAM,EAAM,KAAO,KAAK,IAAI,EAC5B,EAAuB,CAAC,EAE9B,IAAK,IAAM,KAAK,EAAM,SACpB,EAAM,KAAK,CACT,IAAK,aAAa,EAAE,KACpB,KAAM,YACN,MAAO,YACP,MAAO,EAAE,MACT,SAAU,EAAE,QAAQ,MAAQ,EAAE,QAAQ,QAAU,KAChD,SAAU,KACV,SAAU,EAAE,QAAQ,OAAS,EAAgB,EAAE,QAAQ,QAAU,KACjE,OAAQ,EAAE,QAAQ,OAClB,SAAU,CAAC,EAAE,KAAK,QAAQ,KAAM,GAAG,EAAG,EAAE,OAAQ,WAAW,EAC3D,SAAU,KACV,KAAM,EAAE,WAAa,OAAS,SAAW,EAAE,WAAa,OAAS,OAAS,UAC1E,QAAS,CAAE,KAAM,YAAa,OAAQ,EAAE,EAAG,CAC7C,CAAC,EAGH,IAAM,EAAU,IAAI,IAAI,EAAM,QAAQ,IAAK,GAAM,CAAC,EAAE,UAAW,CAAC,CAAU,CAAC,EACrE,EAAW,CAAC,GAAG,EAAM,QAAQ,CAAC,CAAC,MAAM,EAAG,IAAM,CAClD,IAAM,EAAK,EAAQ,IAAI,EAAE,EAAE,GAAK,EAAE,SAAW,UAAY,EAAI,EACvD,EAAK,EAAQ,IAAI,EAAE,EAAE,GAAK,EAAE,SAAW,UAAY,EAAI,EAE7D,OADI,IAAO,EACJ,EAAE,UAAY,EAAE,UAAY,EAAI,EAAE,UAAY,EAAE,UAAY,GAAK,EADlD,EAAK,CAE7B,CAAC,EACD,IAAK,IAAM,KAAK,EAAU,CACxB,IAAM,EAAO,EAAQ,IAAI,EAAE,EAAE,EACvB,EAAY,CAAC,CAAC,GAAQ,EAAE,SAAW,UACnC,EAAS,EAAa,EAAO,EAAQ,EAAK,UAAW,CAAG,EAAI,UAAa,EAAE,SAAW,QAAU,SAAW,EAAS,EAAE,UAAW,CAAG,EAC1I,EAAM,KAAK,CACT,IAAK,QAAQ,EAAE,KACf,KAAM,OACN,MAAO,QACP,MAAO,EAAE,OAAS,gBAClB,SAAU,CAAC,EAAY,EAAE,WAAW,EAAG,CAAM,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK,EACzE,SAAU,KACV,SAAU,EAAgB,EAAE,QAC5B,OAAQ,EAAE,OACV,SAAU,CAAC,EAAE,MAAO,EAAE,OAAQ,EAAY,EAAE,WAAW,CAAC,EACxD,SAAU,KACV,KAAM,EAAY,UAAY,EAAE,SAAW,QAAU,OAAS,UAC9D,QAAS,CAAE,KAAM,OAAQ,UAAW,EAAE,EAAG,CAC3C,CAAC,CACH,CAEA,IAAK,IAAM,KAAW,EAAgB,SAAS,EAAG,EAAM,KAAK,EAAY,EAAS,EAAM,SAAU,SAAS,CAAC,EAC5G,IAAK,IAAM,KAAW,EAAgB,OAAO,EAAG,EAAM,KAAK,EAAY,EAAS,EAAM,SAAU,OAAO,CAAC,EAExG,IAAK,IAAM,KAAQ,EAAM,MACvB,EAAM,KAAK,CACT,IAAK,QAAQ,EAAK,KAClB,KAAM,OACN,MAAO,aACP,MAAO,eAAe,EAAK,QAC3B,SAAU,EAAK,GACf,SAAU,KACV,SAAU,EAAgB,EAAK,QAC/B,OAAQ,EAAK,OACb,SAAU,CAAC,EAAK,OAAQ,EAAK,MAAO,OAAQ,SAAS,EACrD,SAAU,KACV,KAAM,UACN,QAAS,CAAE,KAAM,OAAQ,OAAQ,EAAK,GAAI,MAAO,EAAK,KAAM,CAC9D,CAAC,EAGH,IAAK,IAAM,KAAW,EAAM,SAC1B,EAAM,KAAK,CACT,IAAK,WAAW,EAAQ,OACxB,KAAM,UACN,MAAO,WACP,MAAO,eAAe,EAAQ,MAAQ,EAAY,EAAQ,IAAI,IAC9D,SAAU,EAAQ,SAAW,wBAA0B,KACvD,SAAU,KACV,SAAU,KACV,OAAQ,KACR,SAAU,CAAC,EAAQ,KAAM,EAAY,EAAQ,IAAI,CAAC,EAClD,SAAU,KACV,KAAM,UACN,QAAS,CAAE,KAAM,UAAW,KAAM,EAAQ,KAAM,KAAM,EAAQ,MAAQ,EAAY,EAAQ,IAAI,CAAE,CAClG,CAAC,EAGH,OAAO,CACT,CAGA,SAAgB,EAAc,EAA2B,EAAoC,CAC3F,IAAM,GAAQ,EAAY,EAAe,EAAyB,EAAyB,KAAgD,CACzI,IAAK,OAAO,EAAK,GAAG,IACpB,KAAM,WACN,MAAO,UACP,MAAO,EACP,WACA,SAAU,KACV,WACA,SACA,SAAU,CAAC,CAAE,EACb,SAAU,KACV,KAAM,UACN,QAAS,CAAE,KAAM,WAAY,SAAU,CAAE,OAAM,KAAI,OAAM,CAAE,CAC7D,GACA,OAAQ,EAAR,CACE,IAAK,OACH,OAAO,EAAM,MAAM,IAAK,GAAM,EAAK,EAAE,GAAI,EAAE,MAAO,EAAE,GAAI,EAAgB,EAAE,QAAS,EAAE,MAAM,CAAC,EAC9F,IAAK,UACH,OAAO,EAAM,SAAS,IAAK,GAAM,EAAK,EAAE,KAAM,EAAE,MAAQ,EAAY,EAAE,IAAI,EAAG,KAAM,KAAM,IAAI,CAAC,EAChG,IAAK,UACH,OAAO,EAAM,SAAS,IAAK,GAAM,EAAK,EAAE,GAAI,EAAE,OAAS,gBAAiB,EAAY,EAAE,WAAW,EAAG,EAAgB,EAAE,QAAS,EAAE,MAAM,CAAC,EAC1I,IAAK,UACH,MAAO,CAAC,EACV,QACE,MAAO,CAAC,CACZ,CACF,CA0BA,SAAgB,EAAY,EAA+B,EAAkB,EAAkC,EAAoC,CACjJ,IAAI,EAAQ,EACR,EAA2B,KACzB,EAAQ,EAAM,UAAU,CAAC,CAAC,OAAO,CAAC,GACpC,IAAU,KAAO,IAAU,OAC7B,EAAS,EACT,EAAQ,EAAM,UAAU,CAAC,CAAC,MAAM,CAAC,GAEnC,IAAM,EAA8B,EAAS,EAAiB,GAAU,KAClE,EAAU,EAAM,KAAK,EAErB,EAAS,IAAI,IACb,GAAQ,EAAmB,EAAe,IAAkB,CAChE,IAAM,EAAO,EAAO,IAAI,EAAK,KAAK,GAAK,CAAC,EACxC,EAAK,KAAK,CAAE,OAAM,QAAO,OAAM,CAAC,EAChC,EAAO,IAAI,EAAK,MAAO,CAAI,CAC7B,EAEA,GAAI,IAAY,IAAM,CAAC,EAAQ,CAE7B,EAAM,OAAQ,GAAM,EAAE,QAAU,WAAW,CAAC,CAAC,MAAM,EAAG,CAAC,CAAC,CAAC,SAAS,EAAM,IAAU,EAAK,EAAM,EAAG,CAAK,CAAC,EACtG,IAAM,EAAS,EAAc,IAAK,GAAO,EAAY,CAAE,CAAC,CAAC,CAAC,OAAQ,GAA6B,IAAM,MAAQ,EAAE,QAAU,IAAI,GAC/G,EAAO,OAAS,EAAI,EAAU,CAAC,WAAY,iBAAkB,gBAAgB,CAAC,CAAW,IAAK,GAAO,EAAY,CAAE,CAAE,EAAA,CAC7H,MAAM,EAAA,CAAuB,CAAC,CAAC,SAAS,EAAS,IAAU,EAAK,EAAY,EAAS,EAAU,QAAQ,EAAG,EAAG,CAAK,CAAC,CAC3H,MACE,EAAM,SAAS,EAAM,IAAU,CAC7B,GAAI,GAAQ,EAAK,QAAU,EAAM,OACjC,IAAM,EAAQ,IAAY,GAAK,EAAI,EAAU,EAAM,CAAO,EACtD,IAAU,MACd,EAAK,EAAM,EAAO,CAAK,CACzB,CAAC,EAGH,IAAM,EAAsB,CAAC,EACvB,EAAuB,CAAC,EAC9B,IAAK,IAAM,KAAM,EAAa,CAC5B,IAAM,EAAO,EAAO,IAAI,CAAE,EAC1B,GAAI,CAAC,GAAQ,EAAK,SAAW,EAAG,SAGhC,IAAM,EAAW,GAA8B,IAAO,SAAW,EAAE,KAAK,OAAS,UAAY,EAAI,EACjG,EAAK,MAAM,EAAG,IAAM,EAAQ,CAAC,EAAI,EAAQ,CAAC,GAAK,EAAE,MAAQ,EAAE,OAAS,EAAE,MAAQ,EAAE,KAAK,EACrF,IAAM,EAAM,EAAS,GAAK,EAAU,GAC9B,EAAQ,EAAK,MAAM,EAAG,CAAG,EAC/B,IAAK,IAAM,KAAK,EAAO,EAAW,KAAK,EAAE,KAAK,EAC9C,EAAI,KAAK,CAAE,KAAI,MAAO,EAAY,GAAK,MAAO,EAAM,IAAK,GAAM,EAAE,IAAI,CAAE,CAAC,CAC1E,CAEA,IAAI,EAAO,EAMX,OALI,IAAY,IACd,EAAW,SAAS,EAAO,IAAM,CAC3B,EAAQ,EAAW,KAAQ,EAAO,EACxC,CAAC,EAEI,CAAE,OAAQ,EAAK,KAAM,EAAI,QAAS,GAAM,EAAE,KAAK,EAAG,SAAQ,MAAK,CACxE,0hBEhXA,SAAgB,EAAe,CAAE,UAAU,GAA0C,CACnF,IAAM,EAAK,EAAW,EAChB,EAAW,EAAY,EACvB,EAAW,EAAS,CAAkB,EACtC,EAAY,EAAS,CAAmB,EACxC,GAAA,EAAW,EAAA,QAAA,KAAc,EAAkB,EAAG,CAAC,CAAC,EAChD,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAS,EAAE,EAC/B,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAS,CAAC,EAChC,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAkC,IAAI,EAC5D,GAAA,EAAW,EAAA,OAAA,CAAuB,IAAI,EACtC,GAAA,EAAW,EAAA,OAAA,CAAyB,IAAI,EACxC,GAAA,EAAU,EAAA,OAAA,CAAuB,IAAI,EACrC,GAAA,EAAS,EAAA,MAAA,CAAM,EACf,GAAA,EAAU,EAAA,MAAA,CAAM,EAIhB,GAAA,EAAS,EAAA,OAAA,CAAgC,IAAI,EACnD,EAAO,QAAU,EACjB,IAAM,GAAA,EAAY,EAAA,YAAA,KAAkB,CAC9B,EAAO,QAAS,EAAU,IAAI,EAC7B,EAAQ,CACf,EAAG,CAAC,CAAO,CAAC,EACZ,EAAa,CAAE,KAAM,GAAM,aAAc,EAAU,QAAS,EAAW,gBAAiB,CAAS,CAAC,EAElG,IAAM,GAAA,EAAQ,EAAA,QAAA,MACL,CACL,SAAU,EAAS,MAAM,UAAY,CAAC,EACtC,QAAS,EAAS,MAAM,SAAW,CAAC,EACpC,SAAU,EAAS,MAAQ,EAAU,MAAM,UAAY,CAAC,EACxD,MAAO,EAAU,MAAM,OAAS,CAAC,EACjC,SAAU,EAAU,MAAM,UAAY,CAAC,EACvC,cAAe,EAAG,cAClB,UACF,GACA,CAAC,EAAS,KAAM,EAAS,KAAM,EAAU,KAAM,EAAG,cAAe,CAAQ,CAC3E,EAEM,GAAA,EAAO,EAAA,QAAA,KACP,GAAQ,SAGH,CAAE,GADK,EADK,EAAc,EAAO,SAAS,KAAM,CAC7B,EAAY,IAAI,IAAS,CAAC,EAAG,CAC3C,EAAO,OAAQ,IAAK,EAE3B,EAAY,EAAkB,CAAK,EAAG,EAAO,EAAG,cAAe,CAAQ,EAC7E,CAAC,EAAQ,EAAO,EAAO,EAAG,cAAe,CAAQ,CAAC,EAK/C,GAAA,EAAmB,EAAA,OAAA,CAAO,EAAK,GACrC,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,EAAiB,QAAS,CAC5B,EAAiB,QAAU,GAC3B,EAAU,EAAK,IAAI,EACnB,MACF,CACA,EAAW,GAAO,EAAK,KAAK,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,EAAK,KAAK,OAAS,CAAC,CAAE,CACnF,EAAG,CAAC,CAAI,CAAC,GAET,EAAA,EAAA,UAAA,KAAgB,EACF,EAAQ,SAAS,cAA2B,gBAAgB,EAAO,GAAG,EAAA,EAC7E,iBAAiB,CAAE,MAAO,SAAU,CAAC,CAC5C,EAAG,CAAC,CAAM,CAAC,EAEX,SAAS,EAAc,EAA2B,CAChD,EAAU,CAAO,EACjB,EAAS,EAAE,EACX,EAAU,CAAC,CACb,CAEA,SAAS,EAAI,EAA+B,CAC1C,GAAI,CAAC,EAAM,OACX,IAAM,EAAU,EAAK,QACrB,GAAI,EAAQ,OAAS,UAAW,CAC9B,IAAM,EAAU,EAAY,EAAQ,SAAS,EAE7C,GAAI,GAAS,SAAU,CACrB,EAAc,CAAO,EACrB,MACF,CACA,EAAQ,EACR,EAAsB,EAAQ,UAAW,CAAE,IAAK,SAAU,CAAC,EAC3D,MACF,CAEA,OADA,EAAQ,EACA,EAAQ,KAAhB,CACE,IAAK,YACH,EAAkB,CAAE,MAAO,MAAO,QAAS,EAAQ,MAAO,CAAC,EAC3D,MACF,IAAK,OACH,EAAiB,EAAQ,SAAS,EAClC,MACF,IAAK,OACH,EAAsB,cAAe,CAAE,IAAK,UAAW,SAAU,CAAE,KAAM,OAAQ,GAAI,EAAQ,OAAQ,MAAO,EAAQ,KAAM,CAAE,CAAC,EAC7H,MACF,IAAK,UACH,EAAoB,WAAY,CAAE,YAAa,EAAQ,IAAK,CAAC,EAC7D,MACF,IAAK,WACC,GAAQ,EAAsB,EAAO,GAAI,CAAE,IAAK,UAAW,SAAU,EAAQ,QAAS,CAAC,CAI/F,CACF,CAEA,SAAS,EAAU,EAA6C,CAC9D,IAAM,EAAQ,EAAK,KAAK,OAClB,EAAM,EAAM,IAClB,IAAK,EAAM,SAAW,EAAM,UAAY,EAAI,YAAY,IAAM,IAAK,CACjE,EAAM,eAAe,EACrB,EAAQ,EACR,MACF,CACA,OAAQ,EAAR,CACE,IAAK,YACH,EAAM,eAAe,EACjB,EAAQ,GAAG,EAAW,IAAO,EAAI,GAAK,CAAK,EAC/C,OACF,IAAK,UACH,EAAM,eAAe,EACjB,EAAQ,GAAG,EAAW,IAAO,EAAI,EAAI,GAAS,CAAK,EACvD,OACF,IAAK,OACC,EAAQ,IAAK,EAAM,eAAe,EAAG,EAAU,CAAC,GACpD,OACF,IAAK,MACC,EAAQ,IAAK,EAAM,eAAe,EAAG,EAAU,EAAQ,CAAC,GAC5D,OACF,IAAK,QACH,EAAM,eAAe,EACrB,EAAI,EAAK,KAAK,EAAO,EACrB,OACF,IAAK,MAAO,CAEV,EAAM,eAAe,EACrB,IAAM,EAAO,EAAK,KAAK,GACjB,EAAU,GAAM,QAAQ,OAAS,UAAY,EAAY,EAAK,QAAQ,SAAS,EAAI,KACrF,GAAS,UAAU,EAAc,CAAO,EAC5C,MACF,CACA,IAAK,YACC,GAAU,IAAU,KACtB,EAAM,eAAe,EACrB,EAAU,IAAI,GAEhB,OACF,IAAK,SACH,EAAM,eAAe,EACrB,EAAM,gBAAgB,EAClB,EAAQ,EAAU,IAAI,EACrB,EAAQ,EACb,OACF,QACE,MACJ,CACF,CAEA,IAAM,EAAa,EAAK,KAAK,GACvB,EAAc,GAAQ,SACxB,GAAG,EAAO,SAAS,OAAO,GAC1B,mCACA,EAAQ,GAEZ,OAAA,EAAO,EAAA,aAAA,EACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAU,YAAc,GAAM,EAAE,SAAW,EAAE,eAAiB,EAAQ,EAC3F,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,IAAK,EAAU,UAAW,EAAO,MAAO,KAAK,SAAS,aAAW,OAAO,kBAAiB,EAAS,qBAAmB,UAA1H,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAU,kBAAkB,SAAA,iBAAmB,CAAA,GAChE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MAAvB,SAAA,CACG,GACC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAxB,SAAA,CACG,EAAO,MAAM,QAAQ,KAAM,EAAE,GAC9B,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,cAAY,OAAO,SAAA,IAAQ,CAAA,CAC7B,CACJ,CAAA,EAAA,MACJ,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,IAAK,EACL,UAAW,EAAO,MAClB,MAAO,EACM,cACb,aAAY,GAAQ,SAAW,EAAO,SAAS,OAAS,kBACxD,KAAK,WACL,gBAAc,OACd,gBAAe,EACf,oBAAkB,OAClB,wBAAuB,EAAa,GAAG,EAAO,GAAG,IAAW,IAAA,GAC5D,aAAa,MACb,YAAY,MACZ,WAAY,GACZ,SAAW,GAAM,CACf,EAAS,EAAE,OAAO,KAAK,EACvB,EAAiB,QAAU,EAC7B,EACW,WACZ,CAAA,CACE,KACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,IAAK,EAAS,GAAI,EAAQ,UAAW,EAAO,KAAM,KAAK,UAAU,aAAW,UAC9E,SAAA,EAAK,KAAK,SAAW,GACpB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAClB,SAAA,EAAS,MAAM,EAAO,UAAU,OAAO,YAAY,GAAK,QAAQ,YAAY,EAAM,IAAM,oBAAoB,EAAM,KAAK,EAAE,GACzH,CAAA,EAEH,EAAK,OAAO,IAAK,IACf,EAAA,EAAA,KAAA,CAAC,MAAD,CAAoB,KAAK,QAAQ,aAAY,EAAU,EAAO,UAAU,QAAU,EAAM,MAAS,EAAM,MAAO,UAAW,EAAO,MAAhI,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAY,cAAY,OAC5C,SAAA,EAAS,EAAO,UAAU,OAAS,EAAM,KACvC,CAAA,EACJ,EAAM,MAAM,IAAK,GAAS,CACzB,GAAS,EACT,IAAM,EAAI,EACV,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAEE,GAAI,GAAG,EAAO,GAAG,IACjB,aAAY,EACZ,KAAK,SACL,gBAAe,IAAM,EACrB,UAAW,EAAO,KAClB,YAAW,EAAK,KAChB,gBAAmB,IAAM,GAAU,EAAU,CAAC,EAC9C,YAAc,GAAM,EAAE,eAAe,EACrC,YAAe,EAAI,CAAI,EAVzB,SAAA,EAYE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,cAAY,OACvC,SAAA,EAAK,UACJ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,cAAa,EAAK,QAAU,IAAA,GAAY,SAAA,EAAK,QAAS,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,OAAQ,EAAK,OAAQ,KAAM,EAAK,CAAA,EAAI,EAAK,QAAe,CAAA,GAE9J,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,OAAQ,YAAW,EAAK,IAAO,CAAA,CAErD,CAAA,GACN,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,EAAK,KAAY,CAAA,EAChD,EAAK,UAAW,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAW,SAAA,EAAK,QAAe,CAAA,EAAI,IACxE,KACN,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAxB,SAAA,CACG,EAAK,UAAW,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAM,CAAA,EAAI,KACtD,EAAK,UAAW,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAM,SAAA,EAAK,QAAc,CAAA,EAAI,IACjE,GACH,CA1BE,EAAA,EAAK,GA0BP,CAET,CAAC,CACE,CAtCK,EAAA,EAAM,EAsCX,CACN,CAEA,CAAA,GACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,cAAY,OAAzC,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,IAAO,CAAA,EAAC,OAAW,CAAA,CAAA,GACrD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAgB,CAAA,CAAM,CAAA,EAAC,MAAU,CAAA,CAAA,EAClE,GAAY,UAAW,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAM,CAAA,EAAC,IAAE,EAAW,SAAS,OAAO,YAAY,CAAQ,CAAA,CAAA,EAAI,MACtH,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,KAAQ,CAAA,EAAC,IAAE,EAAS,OAAS,OAAc,CAAA,CAAA,EAC5E,EAAS,MAAO,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAS,CAAA,EAAC,oBAAgB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAM,CAAA,EAAC,aAAiB,CAAA,CAAA,CAC9H,KACL,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,kBAAkB,KAAK,SAAS,YAAU,SACpD,SAAA,EAAK,KAAK,SAAW,EAAI,WAAa,GAAG,EAAK,KAAK,OAAO,SAC1D,CAAA,CACA,GACF,CAAA,EACL,SAAS,IACX,CACF"}
|