@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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsSection-Bf74l0Gj.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/sections/SettingsSection.module.css","../../../../../../src/web-ui/routes/verse/sections/SettingRow.tsx","../../../../../../src/web-ui/routes/verse/onboarding/OnboardingPanel.tsx","../../../../../../package.json","../../../../../../src/web-ui/routes/verse/sections/app-version.ts","../../../../../../src/web-ui/routes/verse/sections/AboutPanel.tsx","../../../../../../src/web-ui/design/contrast.ts","../../../../../../src/web-ui/data/appearance-presets.ts","../../../../../../src/web-ui/routes/verse/sections/AppearancePanel.tsx","../../../../../../src/web-ui/routes/verse/sections/ChatSettingsPanel.tsx","../../../../../../src/web-ui/routes/verse/sections/ConnectionPanel.tsx","../../../../../../src/web-ui/routes/verse/sections/DesktopSettingsPanel.tsx","../../../../../../src/web-ui/routes/verse/sections/ShortcutsPanel.tsx","../../../../../../src/web-ui/routes/verse/sections/SettingsSection.tsx"],"sourcesContent":["/* Settings — one reading column of quiet two-column rows. Shared by every\n panel in this folder so the label/control rhythm can never drift between\n Appearance and Connection. */\n\n.section {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--bg-canvas);\n}\n\n.strip {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n flex: none;\n height: var(--strip-height);\n padding: 0 var(--space-5);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n.stripTitle {\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display);\n}\n\n.scroll {\n flex: 1;\n min-height: 0;\n overflow: auto;\n}\n\n.column {\n width: 100%;\n max-width: var(--measure-read);\n margin: 0 auto;\n padding: var(--space-6) var(--space-5) var(--space-16);\n display: flex;\n flex-direction: column;\n gap: var(--space-8);\n}\n\n/* ---------------------------------------------------------------------------\n * Panel = a titled group of rows, separated by hairlines rather than cards.\n * ------------------------------------------------------------------------- */\n.panel {\n display: flex;\n flex-direction: column;\n}\n\n.panelHead {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-3);\n padding-bottom: var(--space-2);\n}\n\n.panelTitle {\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 font-weight: var(--font-weight-medium);\n color: var(--text-tertiary);\n}\n\n.panelBody {\n border-top: 1px solid var(--border-subtle);\n}\n\n/* ---------------------------------------------------------------------------\n * Row: label + description on the left, control on the right.\n * ------------------------------------------------------------------------- */\n.row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--space-4);\n padding: var(--density-pad) 0;\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.rowStacked {\n grid-template-columns: minmax(0, 1fr);\n align-items: stretch;\n}\n\n.rowText {\n min-width: 0;\n}\n\n.rowLabel {\n display: block;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n font-weight: var(--font-weight-medium);\n}\n\n.rowDescription {\n margin-top: 2px;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n\n.rowControl {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--space-2);\n min-width: 0;\n}\n\n.rowStacked .rowControl {\n justify-content: flex-start;\n}\n\n/* Below the shell's 900px breakpoint the two columns stack rather than\n squeezing a slider into 80px. */\n@media (max-width: 720px) {\n .row {\n grid-template-columns: minmax(0, 1fr);\n }\n .rowControl {\n justify-content: flex-start;\n }\n}\n\n/* ---------------------------------------------------------------------------\n * Accent controls\n * ------------------------------------------------------------------------- */\n.swatches {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-2);\n}\n\n.swatch {\n width: 22px;\n height: 22px;\n padding: 0;\n border: 1px solid var(--border-default);\n border-radius: var(--radius-xs);\n cursor: pointer;\n transition: transform var(--duration-fast) var(--ease-standard);\n}\n\n.swatch:hover {\n transform: translateY(-1px);\n}\n\n/* Selection is carried by a ring AND the check glyph, never by color. */\n.swatch[aria-checked='true'] {\n box-shadow: 0 0 0 2px var(--bg-surface), 0 0 0 3px var(--text-primary);\n}\n\n.swatchCheck {\n display: flex;\n align-items: center;\n justify-content: center;\n color: #ffffff;\n mix-blend-mode: difference;\n}\n\n.sliderStack {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n width: min(320px, 100%);\n}\n\n.contrastWarning {\n display: flex;\n align-items: flex-start;\n gap: var(--space-2);\n margin-top: var(--space-2);\n padding: var(--space-2) var(--space-3);\n border: 1px solid var(--status-warning-solid);\n border-radius: var(--radius-xs);\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n/* ---------------------------------------------------------------------------\n * Live preview\n * ------------------------------------------------------------------------- */\n.preview {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n padding: var(--space-4);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-md);\n background: var(--bg-surface);\n}\n\n.previewRow {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--space-2);\n}\n\n.previewHeading {\n font-family: var(--font-display);\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n letter-spacing: var(--tracking-display);\n font-weight: var(--font-weight-semibold);\n}\n\n.previewBody {\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n\n.previewNumerals {\n font-family: var(--font-display);\n font-variant-numeric: tabular-nums;\n letter-spacing: var(--tracking-display);\n color: var(--text-primary);\n}\n\n/* ---------------------------------------------------------------------------\n * Connection / About\n * ------------------------------------------------------------------------- */\n.origin {\n width: min(320px, 100%);\n}\n\n.note {\n display: flex;\n gap: var(--space-2);\n padding: var(--space-3);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs);\n /* --bg-canvas, not --bg-hover: in light both --bg-hover and --bg-code\n resolve to --gray-100, so the .code chip nested inside this note had no\n ground of its own and was distinguished only by its hairline — a rounded\n bordered box inside a rounded bordered box, which §1.2 forbids. */\n background: var(--bg-canvas);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.noteIcon {\n flex: none;\n margin-top: 1px;\n color: var(--text-tertiary);\n}\n\n.code {\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n padding: 1px 4px;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs);\n background: var(--bg-code);\n color: var(--text-primary);\n white-space: nowrap;\n}\n\n/* ---------------------------------------------------------------------------\n * Keyboard reference (the table itself is shell/ShortcutsOverlay's)\n * ------------------------------------------------------------------------- */\n.panelNote {\n margin-bottom: var(--space-3);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.about {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n}\n\n.aboutLine {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n}\n\n.aboutName {\n font-family: var(--font-display);\n font-size: var(--text-lg-size);\n line-height: var(--text-lg-line);\n letter-spacing: var(--tracking-display);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.link {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n color: var(--text-link);\n text-decoration: none;\n}\n\n.link:hover {\n text-decoration: underline;\n}\n\n/* ---- desktop shell (see desktop/README.md \"Desktop shell contract\") -----\n * In the Tauri window the OS title bar overlays the top 48px and the macOS\n * traffic lights float over the top-LEFT 92px of the WINDOW. This strip does\n * not start at the window's left edge — the 56px rail does — so the inset it\n * owes is the overlap, never the full 92px. Both vars are absent in a\n * browser, where the expression floors to 0px and the layout is unchanged. */\n.strip {\n padding-left: max(\n var(--space-5),\n calc(var(--app-traffic-light-inset, 0px) - var(--rail-width, 56px))\n );\n}\n","/**\n * routes/verse/sections/SettingRow.tsx — the Settings layout primitive:\n * label + description on the left, control on the right, hairline between.\n *\n * The label is a real <label> bound to the control's id when one is given;\n * for composite controls (a radiogroup, a swatch grid) pass `labelId` and\n * point the group's `aria-labelledby` at it instead — a <label> cannot name\n * a group, and an unnamed radiogroup is announced as \"group\".\n */\nimport type { ReactNode } from 'react';\nimport styles from './SettingsSection.module.css';\n\nexport interface PanelProps {\n title: ReactNode;\n /** Right-aligned affordance in the panel header (e.g. \"Reset\"). */\n action?: ReactNode;\n children: ReactNode;\n}\n\nexport function Panel({ title, action, children }: PanelProps) {\n return (\n <section className={styles.panel}>\n <div className={styles.panelHead}>\n <h3 className={styles.panelTitle}>{title}</h3>\n {action}\n </div>\n <div className={styles.panelBody}>{children}</div>\n </section>\n );\n}\n\nexport interface SettingRowProps {\n label: ReactNode;\n description?: ReactNode;\n /** id of the control this row labels (renders a real <label for>). */\n htmlFor?: string;\n /** id to put on the label text, for a control using aria-labelledby. */\n labelId?: string;\n /** Put the control under the text instead of beside it (sliders, previews). */\n stacked?: boolean;\n children: ReactNode;\n}\n\nexport function SettingRow({\n label,\n description,\n htmlFor,\n labelId,\n stacked = false,\n children,\n}: SettingRowProps) {\n const text = (\n <>\n <span className={styles.rowLabel} id={labelId}>\n {label}\n </span>\n {description ? <span className={styles.rowDescription}>{description}</span> : null}\n </>\n );\n\n return (\n <div className={`${styles.row} ${stacked ? styles.rowStacked : ''}`}>\n <div className={styles.rowText}>\n {htmlFor ? (\n <label htmlFor={htmlFor} className={styles.rowText}>\n {text}\n </label>\n ) : (\n text\n )}\n </div>\n <div className={styles.rowControl}>{children}</div>\n </div>\n );\n}\n","/**\n * routes/verse/onboarding/OnboardingPanel.tsx — the Settings row that brings\n * the first-run tour back.\n *\n * It lives here rather than in sections/ so the whole onboarding feature is\n * one folder; SettingsSection.tsx imports it the same way it imports its own\n * panels, and reuses the same Panel/SettingRow primitives so the row keeps\n * the label-left / control-right rhythm of every other setting.\n *\n * The description states what the tour actually covers, and — because this\n * is the only place the stored answer is visible — whether it has been seen.\n */\nimport { Button } from '../../../components/primitives/index.js';\nimport { Panel, SettingRow } from '../sections/SettingRow.js';\nimport { relativePhrase } from '../context/context-model.js';\nimport { replayOnboarding } from './onboarding-store.js';\nimport { useOnboarding } from './useOnboarding.js';\n\n/**\n * What the stored answer says, in the app's one relative wording (\"5m ago\",\n * \"on Sep 19\") rather than a locale-numeric \"9/19/2026\". `now` is injectable\n * so the phrase is testable against a fixed clock.\n */\nexport function describeOnboardingState(completedAt: string | null, dismissedAt: string | null, now: number = Date.now()): string {\n if (completedAt) {\n const when = relativePhrase(completedAt, now);\n return when ? `Last completed ${when}.` : 'Completed.';\n }\n if (dismissedAt) return 'Skipped. Nothing was missed — it is all reachable from the sections themselves.';\n return 'Not seen yet. Replay it to take the two-minute tour.';\n}\n\nexport function OnboardingPanel() {\n const { completedAt, dismissedAt, open } = useOnboarding();\n\n return (\n <Panel title=\"Onboarding\">\n <SettingRow\n label=\"Replay the first-run tour\"\n description={`Your connected seats, whether a local runtime is available, how autonomy is turned on, and what each of the three stop controls really halts. ${describeOnboardingState(completedAt, dismissedAt)}`}\n >\n <Button variant=\"subtle\" size=\"sm\" onClick={replayOnboarding} disabled={open}>\n {open ? 'Showing' : 'Replay'}\n </Button>\n </SettingRow>\n </Panel>\n );\n}\n","{\n \"name\": \"@ashlr/hub\",\n \"version\": \"3.13.0\",\n \"description\": \"Local-first command center for agentic engineers.\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"license\": \"MIT\",\n \"author\": \"Mason Wyatt <mason@evero-consulting.com>\",\n \"homepage\": \"https://github.com/ashlrai/ashlr-hub#readme\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/ashlrai/ashlr-hub.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/ashlrai/ashlr-hub/issues\"\n },\n \"keywords\": [\n \"cli\",\n \"agentic\",\n \"mcp\",\n \"local-first\",\n \"raycast\",\n \"developer-tools\",\n \"ai\"\n ],\n \"type\": \"module\",\n \"bin\": {\n \"ashlr\": \"bin/ashlr\"\n },\n \"files\": [\n \"dist\",\n \"bin\",\n \"scripts/run-verify-command.mjs\",\n \"scripts/scorecard-history-worker.mjs\",\n \"scripts/evaluators/preparation-verification-activity.mjs\",\n \"scripts/evaluators/preparation-verification-activity.d.mts\",\n \"scripts/evaluators/preparation-verification-protocol.mjs\",\n \"scripts/evaluators/preparation-verification-native.mjs\",\n \"scripts/evaluators/preparation-verification-native.d.mts\",\n \"schema\",\n \"CHANGELOG.md\",\n \"docs/README.md\",\n \"docs/QUICKSTART.md\",\n \"docs/DEMO.md\",\n \"docs/ARCHITECTURE.md\",\n \"docs/MISSION-OS.md\",\n \"docs/ASHLR-UNIVERSE.md\",\n \"docs/AUTONOMY-GAP.md\",\n \"docs/FIRM-DEMO.md\",\n \"docs/UNIVERSE-RESEARCH.md\",\n \"docs/UNIVERSE-AUTONOMY-RESEARCH.md\",\n \"docs/RESOURCE-POOLS.md\",\n \"docs/NORTH-STAR.md\",\n \"docs/ELITE-AGENT-EFFICIENCY.md\",\n \"docs/RUNTIME_ACTIVATION_AUTHORITY.md\",\n \"docs/contracts/CONTRACT-M515.md\",\n \"docs/contracts/CONTRACT-M521.md\",\n \"docs/contracts/CONTRACT-M568.md\",\n \"docs/contracts/CONTRACT-MISSION-RECEIPT-V1.md\"\n ],\n \"bundledDependencies\": [\n \"@modelcontextprotocol/sdk\",\n \"marked\",\n \"tar\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/api/index.d.ts\",\n \"import\": \"./dist/api/index.js\"\n },\n \"./core\": {\n \"types\": \"./dist/api/core.d.ts\",\n \"import\": \"./dist/api/core.js\"\n },\n \"./types\": {\n \"types\": \"./dist/api/types.d.ts\",\n \"import\": \"./dist/api/types.js\"\n },\n \"./plugin\": {\n \"types\": \"./dist/api/plugin.d.ts\",\n \"import\": \"./dist/api/plugin.js\"\n },\n \"./universe\": {\n \"types\": \"./dist/core/universe/index.d.ts\",\n \"import\": \"./dist/core/universe/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"engines\": {\n \"node\": \">=22.15.0\"\n },\n \"scripts\": {\n \"prepublishOnly\": \"npm run typecheck && npm run lint && npm run test:ci && npm run test:web\",\n \"prepack\": \"npm run build\",\n \"build\": \"tsc -p tsconfig.json && node scripts/authority-surface.mjs && node scripts/copy-assets.mjs && node scripts/build-preparation-builtin.mjs && vite build --config vite.config.web.ts && node scripts/build-release-dependency-inventory.mjs && node scripts/build-identity.mjs\",\n \"build:preparation-builtin\": \"node scripts/build-preparation-builtin.mjs\",\n \"build:binary\": \"node scripts/build-sea.mjs\",\n \"release:canary\": \"node scripts/run-signed-release-canary.mjs\",\n \"verify:local-production\": \"node scripts/run-local-production-gate.mjs\",\n \"build:web\": \"vite build --config vite.config.web.ts\",\n \"dev\": \"tsx src/cli/index.ts\",\n \"dev:web\": \"vite --config vite.config.web.ts\",\n \"test\": \"vitest run\",\n \"test:serial\": \"vitest run --no-file-parallelism\",\n \"test:web\": \"vitest run --config vitest.config.web.ts\",\n \"test:ci\": \"node scripts/test-ci.mjs\",\n \"test:invariants\": \"vitest run test/h*.test.ts --no-file-parallelism\",\n \"test:engineering-responsiveness\": \"vitest run --config vitest.config.engineering-performance.ts\",\n \"conformance:ecosystem\": \"tsx scripts/run-ecosystem-conformance.ts\",\n \"check:first-paint\": \"node scripts/check-first-paint-budget.mjs --budget-kb 352\",\n \"check:docs\": \"node scripts/check-documentation.mjs\",\n \"gate\": \"node scripts/gate.mjs\",\n \"gate:full\": \"node scripts/gate.mjs --full\",\n \"ship:local\": \"node scripts/ship-local.mjs\",\n \"lint\": \"eslint . && npm run lint:realio-lane\",\n \"lint:realio-lane\": \"node scripts/check-realio-lane-membership.mjs\",\n \"typecheck\": \"tsc --noEmit && npm run typecheck:web\",\n \"typecheck:web\": \"tsc --noEmit -p src/web-ui/tsconfig.json\"\n },\n \"devDependencies\": {\n \"@testing-library/jest-dom\": \"^7.0.1\",\n \"@testing-library/react\": \"^16.1.0\",\n \"@testing-library/user-event\": \"^14.5.2\",\n \"@types/node\": \"^26.2.0\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n \"@vitejs/plugin-react\": \"^6.1.0\",\n \"@xterm/addon-fit\": \"^0.11.0\",\n \"@xterm/xterm\": \"^6.0.0\",\n \"dompurify\": \"^3.4.15\",\n \"eslint\": \"^9.0.0\",\n \"eslint-plugin-react-hooks\": \"^5.1.0\",\n \"jsdom\": \"^25.0.1\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"react-router-dom\": \"^7.1.1\",\n \"tsx\": \"^4.0.0\",\n \"typescript\": \"^5.5.0\",\n \"typescript-eslint\": \"^8.61.0\",\n \"vite\": \"8.2.2\",\n \"vitest\": \"4.1.11\",\n \"yaml\": \"^2.8.1\"\n },\n \"overrides\": {\n \"fast-uri\": \"3.1.6\",\n \"hono\": \"4.13.5\",\n \"ip-address\": \"10.4.0\",\n \"vite\": \"8.2.2\",\n \"js-yaml\": \"4.3.2\",\n \"nanoid\": \"3.3.18\",\n \"qs\": \"6.16.0\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.30.0\",\n \"marked\": \"18.0.10\",\n \"tar\": \"7.5.22\"\n },\n \"bundleDependencies\": [\n \"@modelcontextprotocol/sdk\",\n \"marked\",\n \"tar\"\n ]\n}\n","/**\n * routes/verse/sections/app-version.ts — the hub's version, for About.\n *\n * Read straight from package.json (Vite inlines the named export at build\n * time and `resolveJsonModule` types it), because no API route reports it:\n * /api/health answers liveness, /api/snapshot answers fleet state, and\n * neither carries the running hub's version. A hardcoded string here would\n * silently drift from the published package on every release.\n */\nimport { version } from '../../../../../package.json';\n\nexport const APP_VERSION: string = version;\nexport const APP_NAME = 'Ashlr Verse';\n","/**\n * routes/verse/sections/AboutPanel.tsx — what this is and which build it is.\n * The version comes from package.json at build time (./app-version.ts).\n */\nimport { IconExternalLink } from '../../../components/primitives/icons.js';\nimport { Tag } from '../../../components/primitives/index.js';\nimport { APP_NAME, APP_VERSION } from './app-version.js';\nimport { Panel } from './SettingRow.js';\nimport styles from './SettingsSection.module.css';\n\nexport function AboutPanel() {\n return (\n <Panel title=\"About\">\n <div className={`${styles.row} ${styles.rowStacked}`}>\n <div className={styles.about}>\n <p className={styles.aboutName}>{APP_NAME}</p>\n <p className={styles.aboutLine}>\n <Tag mono>v{APP_VERSION}</Tag>\n <span>ashlr-hub — local-first command center for agentic engineers.</span>\n </p>\n <p className={styles.aboutLine}>\n Every session, token and artifact stays on this machine. The console talks to one local server and no\n third-party service.\n </p>\n <p className={styles.aboutLine}>\n <a\n className={styles.link}\n href=\"https://github.com/ashlrai/ashlr-hub\"\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n Source and changelog\n <IconExternalLink size={12} />\n </a>\n </p>\n </div>\n </div>\n </Panel>\n );\n}\n","/**\n * design/contrast.ts — WCAG 2.1 contrast math over CSS color strings.\n *\n * Two callers, one implementation:\n * - routes/verse/sections/AppearancePanel.tsx warns, live, when a\n * hand-dragged accent stops being readable as link/button text in the\n * active theme. The design language allows any hue; it does not allow an\n * unreadable one to ship silently.\n * - design/tokens-contrast.test.ts asserts the whole palette in BOTH\n * themes (design doc §6: >= 4.5:1 body text, >= 3:1 meaningful borders).\n *\n * Deliberately dependency-free and DOM-free: parse -> linearize -> ratio.\n * Supports the subset of CSS color syntax the stylesheets actually use —\n * #rgb / #rrggbb / #rrggbbaa, rgb()/rgba(), hsl()/hsla(), both the legacy\n * comma form and the modern space form, plus `color-mix(in srgb, ...)`.\n * Anything else returns null rather than guessing a color.\n *\n * `color-mix` is in that list because the meaning-carrying marks that the\n * contrast suite has to guard are not all plain tokens: the chart gridline,\n * the empty half of a window meter and the diff row tints are all declared as\n * a mix in a CSS module. Without this the suite could only assert the token a\n * mix is DERIVED from, which is precisely the gap that let a 45%-alpha\n * gridline ship under a comment claiming it cleared 3:1.\n */\n\nexport interface Rgba {\n /** 0-255 */\n r: number;\n /** 0-255 */\n g: number;\n /** 0-255 */\n b: number;\n /** 0-1 */\n a: number;\n}\n\nconst HEX_RE = /^#([0-9a-f]{3,8})$/i;\nconst FN_RE = /^(rgba?|hsla?)\\(([^)]*)\\)$/i;\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, n));\n}\n\n/** \"50%\" -> 0.5, \"0.5\" -> 0.5, \"128\" (of 255) handled by the caller. */\nfunction unitValue(raw: string, scale: number): number {\n const text = raw.trim();\n if (text.endsWith('%')) return (Number.parseFloat(text) / 100) * scale;\n return Number.parseFloat(text);\n}\n\nfunction hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n const hue = ((h % 360) + 360) % 360;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(((hue / 60) % 2) - 1));\n const m = l - c / 2;\n let rgb: [number, number, number];\n if (hue < 60) rgb = [c, x, 0];\n else if (hue < 120) rgb = [x, c, 0];\n else if (hue < 180) rgb = [0, c, x];\n else if (hue < 240) rgb = [0, x, c];\n else if (hue < 300) rgb = [x, 0, c];\n else rgb = [c, 0, x];\n return {\n r: Math.round((rgb[0] + m) * 255),\n g: Math.round((rgb[1] + m) * 255),\n b: Math.round((rgb[2] + m) * 255),\n };\n}\n\n/**\n * Split a function's argument list on top-level commas, so a nested\n * `rgb(...)`/`color-mix(...)` argument survives intact.\n */\nfunction splitTopLevel(text: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let current = '';\n for (const ch of text) {\n if (ch === '(') depth += 1;\n else if (ch === ')') depth -= 1;\n if (ch === ',' && depth === 0) {\n parts.push(current);\n current = '';\n continue;\n }\n current += ch;\n }\n parts.push(current);\n return parts.map((p) => p.trim()).filter((p) => p.length > 0);\n}\n\n/** `#abc 40%` -> ['#abc', 40]; a missing percentage comes back as null. */\nfunction colorWithPercent(raw: string): { color: string; pct: number | null } | null {\n const text = raw.trim();\n const m = /\\s(\\d*\\.?\\d+)%$/.exec(text);\n if (m) return { color: text.slice(0, m.index).trim(), pct: Number.parseFloat(m[1]!) };\n const lead = /^(\\d*\\.?\\d+)%\\s/.exec(text);\n if (lead) return { color: text.slice(lead[0].length).trim(), pct: Number.parseFloat(lead[1]!) };\n return { color: text, pct: null };\n}\n\n/**\n * `color-mix(in srgb, <color> [p%], <color> [p%])`, per CSS Color 5: the two\n * percentages are normalized to sum to 100, the result's alpha is their\n * alpha-weighted sum, and the channels are mixed PREMULTIPLIED — which is why\n * mixing against `transparent` yields the first color at that alpha rather\n * than a color darkened toward black.\n *\n * Only the `srgb` color space is accepted. Every other space would need its\n * own transfer function, and silently treating `oklab` as srgb would report a\n * contrast ratio the browser does not agree with.\n */\nfunction parseColorMix(text: string): Rgba | null {\n const body = /^color-mix\\((.*)\\)$/is.exec(text.trim());\n if (!body) return null;\n const args = splitTopLevel(body[1]!);\n if (args.length !== 3) return null;\n if (args[0]!.replace(/\\s+/g, ' ').trim() !== 'in srgb') return null;\n\n const first = colorWithPercent(args[1]!);\n const second = colorWithPercent(args[2]!);\n if (!first || !second) return null;\n const c1 = parseColor(first.color);\n const c2 = parseColor(second.color);\n if (!c1 || !c2) return null;\n\n let p1 = first.pct;\n let p2 = second.pct;\n if (p1 === null && p2 === null) {\n p1 = 50;\n p2 = 50;\n } else if (p1 === null) p1 = 100 - p2!;\n else if (p2 === null) p2 = 100 - p1;\n const total = p1 + p2!;\n if (total <= 0) return null;\n const w1 = p1 / total;\n const w2 = p2! / total;\n\n const alpha = c1.a * w1 + c2.a * w2;\n if (alpha <= 0) return { r: 0, g: 0, b: 0, a: 0 };\n const channel = (k: 'r' | 'g' | 'b'): number =>\n clamp(Math.round((c1[k] * c1.a * w1 + c2[k] * c2.a * w2) / alpha), 0, 255);\n return { r: channel('r'), g: channel('g'), b: channel('b'), a: clamp(alpha, 0, 1) };\n}\n\n/** Parse a CSS color string. Returns null for anything unrecognized. */\nexport function parseColor(input: string): Rgba | null {\n const text = input.trim().toLowerCase();\n if (text === 'transparent') return { r: 0, g: 0, b: 0, a: 0 };\n if (text.startsWith('color-mix(')) return parseColorMix(text);\n\n const hex = HEX_RE.exec(text);\n if (hex) {\n const body = hex[1]!;\n const expand = (s: string) => Number.parseInt(s.length === 1 ? s + s : s, 16);\n if (body.length === 3 || body.length === 4) {\n return {\n r: expand(body[0]!),\n g: expand(body[1]!),\n b: expand(body[2]!),\n a: body.length === 4 ? expand(body[3]!) / 255 : 1,\n };\n }\n if (body.length === 6 || body.length === 8) {\n return {\n r: expand(body.slice(0, 2)),\n g: expand(body.slice(2, 4)),\n b: expand(body.slice(4, 6)),\n a: body.length === 8 ? expand(body.slice(6, 8)) / 255 : 1,\n };\n }\n return null;\n }\n\n const fn = FN_RE.exec(text);\n if (!fn) return null;\n const name = fn[1]!;\n // Both syntaxes: `a, b, c, d` and `a b c / d`.\n const parts = fn[2]!\n .replace(/\\//g, ' ')\n .split(/[\\s,]+/)\n .filter(Boolean);\n if (parts.length < 3) return null;\n const alpha = parts.length >= 4 ? clamp(unitValue(parts[3]!, 1), 0, 1) : 1;\n\n if (name.startsWith('rgb')) {\n return {\n r: clamp(Math.round(unitValue(parts[0]!, 255)), 0, 255),\n g: clamp(Math.round(unitValue(parts[1]!, 255)), 0, 255),\n b: clamp(Math.round(unitValue(parts[2]!, 255)), 0, 255),\n a: alpha,\n };\n }\n\n const hue = Number.parseFloat(parts[0]!);\n const sat = clamp(unitValue(parts[1]!, 1), 0, 1);\n const light = clamp(unitValue(parts[2]!, 1), 0, 1);\n if (!Number.isFinite(hue)) return null;\n return { ...hslToRgb(hue, sat, light), a: alpha };\n}\n\n/** Composite a (possibly translucent) color over an opaque backdrop. */\nexport function flatten(color: Rgba, backdrop: Rgba): Rgba {\n if (color.a >= 1) return color;\n const a = color.a;\n return {\n r: Math.round(color.r * a + backdrop.r * (1 - a)),\n g: Math.round(color.g * a + backdrop.g * (1 - a)),\n b: Math.round(color.b * a + backdrop.b * (1 - a)),\n a: 1,\n };\n}\n\n/** WCAG relative luminance of an opaque color. */\nexport function relativeLuminance(color: Rgba): number {\n const channel = (v: number): number => {\n const s = v / 255;\n return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n };\n return 0.2126 * channel(color.r) + 0.7152 * channel(color.g) + 0.0722 * channel(color.b);\n}\n\n/**\n * WCAG contrast ratio (1-21) between two CSS colors. A translucent color is\n * composited over `backdrop` first (default white) — asking for the contrast\n * of a 14%-alpha status background is otherwise meaningless.\n * Returns null when either color cannot be parsed, so a caller can say\n * \"unknown\" instead of asserting on a guess.\n */\nexport function contrastRatio(foreground: string, background: string, backdrop = '#ffffff'): number | null {\n const bgRaw = parseColor(background);\n const fgRaw = parseColor(foreground);\n const base = parseColor(backdrop);\n if (!bgRaw || !fgRaw || !base) return null;\n const bg = flatten(bgRaw, base);\n const fg = flatten(fgRaw, bg);\n const l1 = relativeLuminance(fg);\n const l2 = relativeLuminance(bg);\n const [hi, lo] = l1 >= l2 ? [l1, l2] : [l2, l1];\n return (hi + 0.05) / (lo + 0.05);\n}\n\n/** Convenience for the appearance panel: does this pair clear body-text contrast? */\nexport function meetsTextContrast(foreground: string, background: string, backdrop?: string): boolean {\n const ratio = contrastRatio(foreground, background, backdrop);\n return ratio !== null && ratio >= 4.5;\n}\n\n/**\n * The accent, resolved to a hex the same way tokens.css derives its ramp\n * (hsl channels + a per-step lightness offset). Used by the appearance panel\n * to preview and contrast-check a hue the operator is dragging, without\n * reading computed styles mid-drag.\n */\nexport function accentHex(h: number, s: number, l: number, lightnessOffset = 0): string {\n const rgb = hslToRgb(h, clamp(s, 0, 100) / 100, clamp(l + lightnessOffset, 0, 100) / 100);\n const hex = (n: number) => n.toString(16).padStart(2, '0');\n return `#${hex(rgb.r)}${hex(rgb.g)}${hex(rgb.b)}`;\n}\n","/**\n * data/appearance-presets.ts — what the Settings ▸ Appearance panel offers\n * and compares against: the accent presets, \"is anything customized\", \"which\n * preset is this\".\n *\n * Split from appearance-store.ts, which every view imports (it applies the\n * stored appearance before the first paint) — so every value exported there\n * is first-paint JS for every console, while these are read only by the\n * Settings panel.\n */\nimport { defaultAppearance, getAppearance, type Appearance } from './appearance-store.js';\n\nexport interface AccentPreset {\n id: string;\n label: string;\n h: number;\n s: number;\n l: number;\n}\n\n/**\n * Eight presets (design doc §3). Each was checked with design/contrast.ts so\n * its derived link color clears 4.5:1 in BOTH themes — the hue slider can\n * still be dragged anywhere, and the Settings panel warns when it lands\n * somewhere unreadable.\n */\nexport const ACCENT_PRESETS: readonly AccentPreset[] = [\n { id: 'indigo', label: 'Indigo', h: 245, s: 72, l: 58 },\n { id: 'blue', label: 'Blue', h: 212, s: 80, l: 50 },\n { id: 'cyan', label: 'Cyan', h: 190, s: 80, l: 40 },\n { id: 'teal', label: 'Teal', h: 168, s: 70, l: 38 },\n { id: 'green', label: 'Green', h: 145, s: 60, l: 38 },\n { id: 'amber', label: 'Amber', h: 38, s: 80, l: 42 },\n { id: 'rose', label: 'Rose', h: 348, s: 72, l: 50 },\n { id: 'violet', label: 'Violet', h: 278, s: 66, l: 55 },\n] as const;\n\n/** True when nothing has been customized — drives the \"Reset\" affordance. */\nexport function isDefaultAppearance(value: Appearance = getAppearance()): boolean {\n const base = defaultAppearance();\n return (\n value.theme === base.theme &&\n value.accentH === base.accentH &&\n value.accentS === base.accentS &&\n value.accentL === base.accentL &&\n value.density === base.density &&\n value.uiScale === base.uiScale &&\n value.displayFont === base.displayFont &&\n value.radius === base.radius &&\n value.motion === base.motion\n );\n}\n\n/** The preset whose channels match the current accent, if any. */\nexport function matchingAccentPreset(value: Appearance = getAppearance()): AccentPreset | null {\n return (\n ACCENT_PRESETS.find((p) => p.h === value.accentH && p.s === value.accentS && p.l === value.accentL) ?? null\n );\n}\n","/**\n * routes/verse/sections/AppearancePanel.tsx — the \"Linux\" part of the design\n * language: theme, accent, display size, density, display face, radius,\n * motion.\n *\n * Every control applies IMMEDIATELY (design doc §3: live preview, no save\n * button) because the whole app is the preview — the panel writes through\n * data/appearance-store.ts, which writes the tokens on <html>. The preview\n * block at the end exists to show type, numerals, a filled action and a\n * meter in one place, so the effect of a change is visible without leaving\n * Settings.\n *\n * The hue slider is free-range, so the panel checks the resulting link color\n * against BOTH themes with design/contrast.ts and warns when a choice drops\n * under 4.5:1 — the operator keeps the hue they asked for, but is never\n * allowed to make it unreadable without being told.\n */\nimport { useId } from 'react';\nimport { Button, Input, Meter, Segmented, Slider, StatusBadge, Switch, Tag } from '../../../components/primitives/index.js';\nimport { IconAlert, IconCheck, IconMonitor, IconMoon, IconSun } from '../../../components/primitives/icons.js';\nimport { accentHex, contrastRatio } from '../../../design/contrast.js';\nimport {\n ACCENT_LIGHTNESS_RANGE,\n type Appearance,\n type Density,\n type DisplayFont,\n type RadiusScale,\n type ThemePreference,\n type UiScale,\n} from '../../../data/appearance-store.js';\nimport { ACCENT_PRESETS, isDefaultAppearance, matchingAccentPreset } from '../../../data/appearance-presets.js';\nimport { Panel, SettingRow } from './SettingRow.js';\nimport styles from './SettingsSection.module.css';\n\n/**\n * The literal `--bg-surface` of each theme (design/tokens.css). Used only to\n * score a candidate accent; design/tokens-contrast.test.ts asserts these two\n * constants still match the stylesheet, so a future retune cannot leave the\n * warning scoring against a color the app no longer paints.\n */\nexport const LIGHT_SURFACE = '#ffffff';\nexport const DARK_SURFACE = '#121214';\n/** Dark raises accent lightness by --accent-l-shift; --accent-600 sits 8% below/above it. */\nconst DARK_L_SHIFT = 6;\nconst LINK_STEP = 8;\n\nconst THEME_OPTIONS = [\n { value: 'system' as ThemePreference, label: 'System', icon: <IconMonitor /> },\n { value: 'light' as ThemePreference, label: 'Light', icon: <IconSun /> },\n { value: 'dark' as ThemePreference, label: 'Dark', icon: <IconMoon /> },\n];\n\n/**\n * Display size. The labels say what the operator gets, not what the\n * multiplier is — \"1.25x\" is an implementation detail and a worse name than\n * \"Large\" for a control you pick by looking at the result.\n *\n * Only three, and none of them smaller than Default: the type ramp bottoms\n * out at a 12px body floor, and Density directly below is already the\n * \"tighter\" control. See the [data-ui-scale] block in design/tokens.css.\n */\nconst UI_SCALE_OPTIONS = [\n { value: 'default' as UiScale, label: 'Default' },\n { value: 'large' as UiScale, label: 'Large' },\n { value: 'xlarge' as UiScale, label: 'Extra large' },\n];\n\nconst DENSITY_OPTIONS = [\n { value: 'comfortable' as Density, label: 'Comfortable' },\n { value: 'compact' as Density, label: 'Compact' },\n];\n\nconst FONT_OPTIONS = [\n { value: 'grotesk' as DisplayFont, label: 'Space Grotesk' },\n { value: 'ui' as DisplayFont, label: 'UI sans' },\n { value: 'mono' as DisplayFont, label: 'Mono' },\n];\n\nconst RADIUS_OPTIONS = [\n { value: 'sharp' as RadiusScale, label: 'Sharp' },\n { value: 'default' as RadiusScale, label: 'Default' },\n { value: 'soft' as RadiusScale, label: 'Soft' },\n];\n\n/** A 360° sweep at the current saturation/lightness, so the track shows the choice. */\nfunction hueTrack(s: number, l: number): string {\n const stops = [0, 60, 120, 180, 240, 300, 360].map((h) => `${accentHex(h, s, l)} ${(h / 360) * 100}%`);\n return `linear-gradient(to right, ${stops.join(', ')})`;\n}\n\nexport interface AccentReadability {\n lightRatio: number | null;\n darkRatio: number | null;\n /** Themes in which the derived link color drops below 4.5:1. */\n failing: Array<'light' | 'dark'>;\n}\n\n/** Exported for the section's test: the same math the warning renders from. */\nexport function accentReadability(h: number, s: number, l: number): AccentReadability {\n const lightLink = accentHex(h, s, l, -LINK_STEP);\n const darkLink = accentHex(h, s, l, DARK_L_SHIFT + LINK_STEP);\n const lightRatio = contrastRatio(lightLink, LIGHT_SURFACE);\n const darkRatio = contrastRatio(darkLink, DARK_SURFACE);\n const failing: Array<'light' | 'dark'> = [];\n if (lightRatio !== null && lightRatio < 4.5) failing.push('light');\n if (darkRatio !== null && darkRatio < 4.5) failing.push('dark');\n return { lightRatio, darkRatio, failing };\n}\n\nexport interface AppearancePanelProps {\n appearance: Appearance;\n onChange: (patch: Partial<Appearance>) => void;\n onReset: () => void;\n}\n\nexport function AppearancePanel({ appearance, onChange, onReset }: AppearancePanelProps) {\n const accentLabelId = useId();\n const hueId = useId();\n const satId = useId();\n const lightId = useId();\n const motionId = useId();\n\n const preset = matchingAccentPreset(appearance);\n const readability = accentReadability(appearance.accentH, appearance.accentS, appearance.accentL);\n\n return (\n <Panel\n title=\"Appearance\"\n action={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onReset}\n disabled={isDefaultAppearance(appearance)}\n title=\"Restore the shipped theme, accent, display size, density, font, radius and motion\"\n >\n Reset to defaults\n </Button>\n }\n >\n <SettingRow label=\"Theme\" description=\"System follows your OS appearance setting.\">\n <Segmented\n aria-label=\"Theme\"\n options={THEME_OPTIONS}\n value={appearance.theme}\n onChange={(theme) => onChange({ theme })}\n />\n </SettingRow>\n\n <SettingRow\n label=\"Accent\"\n labelId={accentLabelId}\n description={\n preset\n ? `${preset.label} — used for links, focus rings and the one primary action per surface.`\n : 'Custom hue — used for links, focus rings and the one primary action per surface.'\n }\n >\n <div className={styles.swatches} role=\"radiogroup\" aria-labelledby={accentLabelId}>\n {ACCENT_PRESETS.map((p) => {\n const selected = preset?.id === p.id;\n return (\n <button\n key={p.id}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n aria-label={p.label}\n tabIndex={selected || (!preset && p.id === ACCENT_PRESETS[0]!.id) ? 0 : -1}\n className={styles.swatch}\n style={{ background: accentHex(p.h, p.s, p.l) }}\n onClick={() => onChange({ accentH: p.h, accentS: p.s, accentL: p.l })}\n >\n {selected ? (\n <span className={styles.swatchCheck}>\n <IconCheck size={12} />\n </span>\n ) : null}\n </button>\n );\n })}\n </div>\n </SettingRow>\n\n <SettingRow\n label=\"Accent channels\"\n description=\"Hue, saturation and lightness are written straight onto the root element — the whole app follows as you drag.\"\n stacked\n >\n <div className={styles.sliderStack}>\n <Slider\n id={hueId}\n label=\"Hue\"\n min={0}\n max={359}\n value={appearance.accentH}\n valueLabel={`${appearance.accentH}°`}\n valueText={`${appearance.accentH} degrees`}\n trackImage={hueTrack(appearance.accentS, appearance.accentL)}\n onChange={(e) => onChange({ accentH: Number(e.currentTarget.value) })}\n />\n <Slider\n id={satId}\n label=\"Saturation\"\n min={0}\n max={100}\n value={appearance.accentS}\n valueLabel={`${appearance.accentS}%`}\n valueText={`${appearance.accentS} percent`}\n onChange={(e) => onChange({ accentS: Number(e.currentTarget.value) })}\n />\n <Slider\n id={lightId}\n label=\"Lightness\"\n min={ACCENT_LIGHTNESS_RANGE.min}\n max={ACCENT_LIGHTNESS_RANGE.max}\n value={appearance.accentL}\n valueLabel={`${appearance.accentL}%`}\n valueText={`${appearance.accentL} percent`}\n onChange={(e) => onChange({ accentL: Number(e.currentTarget.value) })}\n />\n {readability.failing.length > 0 ? (\n <p className={styles.contrastWarning} role=\"status\">\n <IconAlert size={14} />\n <span>\n This accent falls below 4.5:1 as link text in{' '}\n {readability.failing.length === 2 ? 'both themes' : `${readability.failing[0]} mode`}. Raise or lower\n the lightness to keep it readable.\n </span>\n </p>\n ) : null}\n </div>\n </SettingRow>\n\n <SettingRow\n label=\"Display size\"\n description=\"Scales text AND spacing together across the whole app, for a large display or a long session. Applies as you pick it.\"\n >\n <Segmented\n aria-label=\"Display size\"\n options={UI_SCALE_OPTIONS}\n value={appearance.uiScale}\n onChange={(uiScale) => onChange({ uiScale })}\n />\n </SettingRow>\n\n <SettingRow\n label=\"Density\"\n description=\"Row height and control padding across every view. Independent of display size — a large, tightly packed interface is a valid choice.\"\n >\n <Segmented\n aria-label=\"Density\"\n options={DENSITY_OPTIONS}\n value={appearance.density}\n onChange={(density) => onChange({ density })}\n />\n </SettingRow>\n\n <SettingRow label=\"Display font\" description=\"Titles, seat names, metrics and numerals. Body copy stays in the UI sans.\">\n <Segmented\n aria-label=\"Display font\"\n options={FONT_OPTIONS}\n value={appearance.displayFont}\n onChange={(displayFont) => onChange({ displayFont })}\n />\n </SettingRow>\n\n <SettingRow label=\"Corner radius\" description=\"Sharp reads like a terminal; soft reads like a consumer app.\">\n <Segmented\n aria-label=\"Corner radius\"\n options={RADIUS_OPTIONS}\n value={appearance.radius}\n onChange={(radius) => onChange({ radius })}\n />\n </SettingRow>\n\n <SettingRow\n label=\"Reduce motion\"\n htmlFor={motionId}\n description=\"Collapses every transition to 1ms. Defaults to your system preference; turning it off here overrides that.\"\n >\n <Switch\n id={motionId}\n checked={appearance.reduceMotion}\n onChange={(reduceMotion) => onChange({ reduceMotion })}\n aria-label=\"Reduce motion\"\n />\n </SettingRow>\n\n <SettingRow label=\"Preview\" description=\"Live, using the real components.\" stacked>\n <div className={styles.preview}>\n <p className={styles.previewHeading}>Ashlr Verse</p>\n <p className={styles.previewBody}>\n Body copy stays in the UI sans at the reading measure; numerals like{' '}\n <span className={styles.previewNumerals}>18,420 / 66,000</span> use the display face.\n </p>\n <div className={styles.previewRow}>\n <Button variant=\"primary\" size=\"sm\">\n Primary\n </Button>\n <Button variant=\"subtle\" size=\"sm\">\n Subtle\n </Button>\n <Button variant=\"ghost\" size=\"sm\">\n Ghost\n </Button>\n <Button variant=\"danger\" size=\"sm\">\n Destructive\n </Button>\n </div>\n <div className={styles.previewRow}>\n <StatusBadge status=\"running\" />\n <Tag engine=\"claude\">Claude Max</Tag>\n <Tag engine=\"local\" mono>\n qwen3-coder\n </Tag>\n </div>\n <Meter value={18_420} max={66_000} label=\"Context\" />\n <Input aria-label=\"Preview field\" placeholder=\"A field at the current density\" size=\"sm\" />\n </div>\n </SettingRow>\n </Panel>\n );\n}\n","/**\n * routes/verse/sections/ChatSettingsPanel.tsx — Settings ▸ Chat (unit C1;\n * SPEC-310C §2 \"Settings offers Expanded, Collapsed or Hidden\", C2/C3\n * cross-unit requests).\n *\n * Reasoning how the transcript shows thinking — C2's preference\n * (chat/reasoning-pref.ts); this panel writes through\n * that store and never keeps a copy of the value.\n * New chats start in the GLOBAL permission-mode and effort defaults a new\n * chat is created with — C3's server-side defaults\n * (composer-queries fetchControlDefaults /\n * updateControlDefaults). The engine drops a default a\n * seat cannot honour (initialControlsFor), so a global\n * \"max\" never breaks a local chat; the row says so.\n *\n * Bypass is never offered: it is confirmed per chat and can never be a\n * default (the server refuses it, and the list here does not contain it).\n * Writes need the mutation token — asked for through the same token dialog\n * the composer uses, with a reason naming the change.\n */\nimport { useCallback, useEffect, useId, useState } from 'react';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Segmented, Select } from '../../../components/primitives/index.js';\nimport { ApiError } from '../../../data/client.js';\nimport { VERSE_EFFORTS, type VerseEffort, type VersePermissionMode, type VerseSessionControls } from '../../../../core/verse/types.js';\nimport type { VerseSessionControlDefaults, VerseSessionControlDefaultsUpdate } from '../../../../core/verse/workbench-types.js';\nimport {\n REASONING_DISPLAY_LABEL,\n REASONING_DISPLAYS,\n setReasoningDisplay,\n useReasoningDisplay,\n type ReasoningDisplay,\n} from '../chat/reasoning-pref.js';\nimport { fetchControlDefaults, updateControlDefaults } from '../composer/composer-queries.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { Panel, SettingRow } from './SettingRow.js';\nimport styles from './SettingsSection.module.css';\n\nconst DESCRIPTION: Readonly<Record<ReasoningDisplay, string>> = {\n collapsed: 'Streams three lines while the model thinks, then folds to “Thought 12s · ~1.8k tok”.',\n expanded: 'Streams, and stays open when the thinking is done.',\n hidden: 'No reasoning in the transcript. The live status still says it is thinking, so a long think never looks like a hang.',\n};\n\ntype DefaultMode = Exclude<VersePermissionMode, 'bypass'>;\n\n/** Picker order and words match the composer's permission menu (C3). */\nexport const DEFAULT_MODES: readonly DefaultMode[] = ['plan', 'accept-edits', 'auto'];\nconst MODE_LABEL: Readonly<Record<DefaultMode, string>> = { plan: 'Plan', 'accept-edits': 'Accept edits', auto: 'Auto' };\nconst MODE_DESCRIPTION: Readonly<Record<DefaultMode, string>> = {\n plan: 'New chats plan and edit nothing until you switch them.',\n 'accept-edits': 'New chats apply edits without asking — the default.',\n auto: 'New chats run in the CLI’s own auto mode.',\n};\nconst EFFORT_LABEL: Readonly<Record<VerseEffort, string>> = {\n minimal: 'Minimal',\n low: 'Low',\n medium: 'Medium',\n high: 'High',\n xhigh: 'Extra high',\n max: 'Max',\n};\n/** The <select> value for \"no default\" (null on the wire). */\nconst MODEL_DEFAULT = '';\n\ntype Load =\n | { state: 'loading' }\n | { state: 'ready'; defaults: VerseSessionControlDefaults }\n | { state: 'unavailable'; message: string };\n\nconst MODE_SET: ReadonlySet<string> = new Set(DEFAULT_MODES);\nconst EFFORT_SET: ReadonlySet<string> = new Set(VERSE_EFFORTS);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * The defaults as this panel may show them. The body crossed the network, so\n * it is narrowed field by field: an unknown mode or effort shows as the\n * engine default (never as a value the server did not send), and a body that\n * is not the contract at all is \"unavailable\", never a crash of Settings.\n */\nexport function narrowControlDefaults(raw: unknown): VerseSessionControlDefaults | null {\n if (!isRecord(raw) || !isRecord(raw['global'])) return null;\n const clean = (value: unknown): VerseSessionControls => {\n const out: VerseSessionControls = {};\n if (!isRecord(value)) return out;\n if (typeof value['permissionMode'] === 'string' && MODE_SET.has(value['permissionMode'])) out.permissionMode = value['permissionMode'] as DefaultMode;\n if (typeof value['effort'] === 'string' && EFFORT_SET.has(value['effort'])) out.effort = value['effort'] as VerseEffort;\n return out;\n };\n const seats: Record<string, VerseSessionControls> = {};\n if (isRecord(raw['seats'])) for (const [id, value] of Object.entries(raw['seats'])) seats[id] = clean(value);\n return { global: clean(raw['global']), seats };\n}\n\nfunction loadFailure(err: unknown): string {\n // 404: a server before C3's route; 501: an engine without the methods.\n if (err instanceof ApiError && (err.status === 404 || err.status === 501)) {\n return 'This server can’t set new-chat defaults yet — update Ashlr and restart `ashlr verse`.';\n }\n return 'Couldn’t read the new-chat defaults. Reopen Settings to try again.';\n}\n\nfunction NewChatDefaults() {\n const [load, setLoad] = useState<Load>({ state: 'loading' });\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const gate = useTokenGate();\n const modeLabelId = useId();\n const effortId = useId();\n\n useEffect(() => {\n const controller = new AbortController();\n fetchControlDefaults(controller.signal).then(\n (raw) => {\n const defaults = narrowControlDefaults(raw);\n setLoad(defaults ? { state: 'ready', defaults } : { state: 'unavailable', message: loadFailure(null) });\n },\n (err: unknown) => {\n if (controller.signal.aborted) return;\n setLoad({ state: 'unavailable', message: loadFailure(err) });\n },\n );\n return () => controller.abort();\n }, []);\n\n const save = useCallback(async (update: VerseSessionControlDefaultsUpdate, reason: string) => {\n setError(null);\n setSaving(true);\n try {\n const next = await gate.run(reason, () => updateControlDefaults(update));\n // null = the token prompt was dismissed: nothing changed, nothing to say.\n if (next) {\n const defaults = narrowControlDefaults(next);\n if (defaults) setLoad({ state: 'ready', defaults });\n }\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setSaving(false);\n }\n }, [gate]);\n\n if (load.state === 'loading') {\n return <p className={styles.panelNote} aria-busy=\"true\">Reading new-chat defaults…</p>;\n }\n if (load.state === 'unavailable') {\n return <p className={styles.panelNote}>{load.message}</p>;\n }\n\n const global = load.defaults.global;\n const mode: DefaultMode = global.permissionMode && global.permissionMode !== 'bypass' ? global.permissionMode : 'accept-edits';\n const effort = global.effort ?? null;\n const seatOverrides = Object.keys(load.defaults.seats).length;\n\n return (\n <>\n <SettingRow label=\"New chats start in\" description={MODE_DESCRIPTION[mode]} labelId={modeLabelId}>\n <Segmented<DefaultMode>\n aria-labelledby={modeLabelId}\n size=\"sm\"\n value={mode}\n onChange={(next) => {\n if (next !== mode) void save({ permissionMode: next }, `Start new chats in ${MODE_LABEL[next]}.`);\n }}\n options={DEFAULT_MODES.map((value) => ({ value, label: MODE_LABEL[value], disabled: saving }))}\n />\n </SettingRow>\n <SettingRow\n label=\"Reasoning effort for new chats\"\n description={\n seatOverrides > 0\n ? `A seat that can’t use this level starts at its model’s own default. ${seatOverrides === 1 ? 'One seat has its' : `${seatOverrides} seats have their`} own default, which wins.`\n : 'A seat that can’t use this level starts at its model’s own default.'\n }\n htmlFor={effortId}\n >\n <Select\n id={effortId}\n size=\"sm\"\n value={effort ?? MODEL_DEFAULT}\n disabled={saving}\n onChange={(event) => {\n const raw = event.target.value;\n const next = raw === MODEL_DEFAULT ? null : (raw as VerseEffort);\n if (next === effort) return;\n void save({ effort: next }, next ? `Start new chats at ${EFFORT_LABEL[next]} effort.` : 'Start new chats at the model’s default effort.');\n }}\n >\n <option value={MODEL_DEFAULT}>Model default</option>\n {VERSE_EFFORTS.map((value) => (\n <option key={value} value={value}>{EFFORT_LABEL[value]}</option>\n ))}\n </Select>\n </SettingRow>\n {error ? <p className={styles.panelNote} role=\"alert\">{error}</p> : null}\n <MutationTokenDialog {...gate.dialog} />\n </>\n );\n}\n\nexport function ChatSettingsPanel() {\n const display = useReasoningDisplay();\n const labelId = useId();\n return (\n <Panel title=\"Chat\">\n <SettingRow label=\"Reasoning\" description={DESCRIPTION[display]} labelId={labelId}>\n <Segmented<ReasoningDisplay>\n aria-labelledby={labelId}\n size=\"sm\"\n value={display}\n onChange={setReasoningDisplay}\n options={REASONING_DISPLAYS.map((value) => ({ value, label: REASONING_DISPLAY_LABEL[value] }))}\n />\n </SettingRow>\n <NewChatDefaults />\n </Panel>\n );\n}\n","/**\n * routes/verse/sections/ConnectionPanel.tsx — which server this window is\n * talking to, what authority it currently holds, and how to get the tokens\n * back if it loses them.\n *\n * SECURITY: this panel never renders, copies or logs a token. It shows the\n * STATE of the two authorities (read session, mutation hold) and tells the\n * operator where the real values are printed — the terminal that started the\n * server. The mutation token is memory-only by design (data/auth-store.ts);\n * showing it here would put it on screen, in a screenshot, and in any\n * screen-recording of a demo.\n */\nimport { useRef, useState } from 'react';\nimport { Button, Dialog, Input, StatusBadge } from '../../../components/primitives/index.js';\nimport { IconCopy, IconInfo, IconLock } from '../../../components/primitives/icons.js';\nimport { clearMutationToken, clearReadSession } from '../../../data/auth-store.js';\nimport { useAuthPhase, useMutationHold } from '../../../data/hooks.js';\nimport { useToast } from '../../../components/primitives/Toast.js';\nimport { Panel, SettingRow } from './SettingRow.js';\nimport styles from './SettingsSection.module.css';\n\nfunction formatHoldExpiry(heldUntil: number | null): string {\n if (heldUntil === null) return 'locked';\n const minutes = Math.max(0, Math.round((heldUntil - Date.now()) / 60_000));\n if (minutes <= 0) return 'expiring now';\n return `unlocked for ${minutes} more minute${minutes === 1 ? '' : 's'}`;\n}\n\nexport function ConnectionPanel() {\n const phase = useAuthPhase();\n const hold = useMutationHold();\n const toast = useToast();\n const [confirmOpen, setConfirmOpen] = useState(false);\n const cancelRef = useRef<HTMLButtonElement>(null);\n\n const origin = typeof window === 'undefined' ? '' : window.location.origin;\n\n async function copyOrigin(): Promise<void> {\n try {\n await navigator.clipboard.writeText(origin);\n toast.show('Server address copied.');\n } catch {\n toast.show('Could not reach the clipboard — select the field and copy manually.', 'danger');\n }\n }\n\n async function disconnect(): Promise<void> {\n setConfirmOpen(false);\n await clearReadSession();\n toast.show('Disconnected. Paste the read token to reconnect.');\n }\n\n return (\n <Panel title=\"Connection\">\n <SettingRow label=\"Server\" description=\"This window talks to one local hub. Nothing leaves your machine.\">\n <div className={styles.origin}>\n <Input value={origin} readOnly mono size=\"sm\" aria-label=\"Server address\" />\n </div>\n <Button variant=\"ghost\" size=\"sm\" icon={<IconCopy />} onClick={() => void copyOrigin()}>\n Copy\n </Button>\n </SettingRow>\n\n <SettingRow label=\"Read session\" description=\"A 15-minute signed cookie, renewed silently while this tab stays open.\">\n <StatusBadge\n status={phase === 'authenticated' ? 'connected' : phase === 'checking' ? 'checking' : 'disconnected'}\n tone={phase === 'authenticated' ? 'success' : phase === 'checking' ? 'running' : 'danger'}\n />\n </SettingRow>\n\n <SettingRow\n label=\"Mutation hold\"\n description=\"Every action that changes something needs the mutation token. It is held in memory only, never stored, and clears when this tab closes.\"\n >\n <StatusBadge\n status={hold.hasHold ? formatHoldExpiry(hold.heldUntil) : 'locked'}\n tone={hold.hasHold ? 'success' : 'neutral'}\n />\n <Button\n variant=\"subtle\"\n size=\"sm\"\n icon={<IconLock />}\n onClick={() => {\n clearMutationToken();\n toast.show('Mutation hold cleared.');\n }}\n disabled={!hold.hasHold}\n >\n Lock now\n </Button>\n </SettingRow>\n\n <SettingRow\n label=\"Disconnect\"\n description=\"Ends the read session in this browser and clears the mutation hold. Chats on the server are untouched.\"\n >\n <Button variant=\"danger\" size=\"sm\" onClick={() => setConfirmOpen(true)}>\n Disconnect\n </Button>\n </SettingRow>\n\n <div className={styles.row}>\n <p className={styles.note}>\n <span className={styles.noteIcon}>\n <IconInfo size={14} />\n </span>\n <span>\n <strong>Where the tokens come from.</strong> Start the console with{' '}\n <code className={styles.code}>ashlr verse</code> — it prints a read token and a mutation token in that\n terminal, and opens this page. The desktop app injects both for you. Tokens are never displayed here, and\n the hub never writes them into a page, a log line or an API response. Lost them? Stop the server and start\n it again; it mints a fresh pair.\n </span>\n </p>\n </div>\n\n <Dialog\n open={confirmOpen}\n onClose={() => setConfirmOpen(false)}\n titleId=\"verse-settings-disconnect\"\n title=\"Disconnect from this server?\"\n description=\"You will need the read token again to get back in. Running sessions keep running on the server.\"\n initialFocusRef={cancelRef}\n >\n <div className={styles.previewRow} style={{ justifyContent: 'flex-end' }}>\n <Button ref={cancelRef} variant=\"subtle\" onClick={() => setConfirmOpen(false)}>\n Cancel\n </Button>\n <Button variant=\"danger\" onClick={() => void disconnect()}>\n Disconnect\n </Button>\n </div>\n </Dialog>\n </Panel>\n );\n}\n","/**\n * routes/verse/sections/DesktopSettingsPanel.tsx — Settings ▸ Desktop (unit\n * C1; SPEC-310C §1 \"Native\", C8 cross-unit request 3).\n *\n * System-wide shortcut ⌃⌥Space shows Verse and focuses the composer from\n * any app. OFF until turned on: a global hotkey takes\n * a chord away from every other app on the Mac.\n * Notifications \"Finished\", \"Failed\", \"Needs you: N new\" — only\n * while the window is not focused (C8 enforces that).\n *\n * THE DESKTOP APP IS THE SOURCE OF TRUTH. It stores both preferences\n * (desktop_prefs.rs, ~/.ashlr/desktop/prefs.json) and answers every change\n * with the state that actually took effect. So every switch renders from\n * `useDesktopState()` — never from what was asked for: a chord another app\n * already holds comes back `{ enabled: true, registered: false, error }`, and\n * the row says so instead of showing a shortcut that does nothing. While a\n * request is in flight the switch is busy, not optimistically flipped.\n *\n * In a browser there is no desktop app: the panel says so and offers no\n * switch (a disabled control would suggest a setting that exists here).\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { Switch } from '../../../components/primitives/index.js';\nimport {\n isDesktopShell,\n setDesktopPreference,\n useDesktopState,\n type DesktopPreference,\n type DesktopState,\n} from '../../../app/desktop-shell.js';\nimport { Panel, SettingRow } from './SettingRow.js';\nimport styles from './SettingsSection.module.css';\n\n/** How long to wait for native's answer before saying it did not come. */\nexport const DESKTOP_ANSWER_TIMEOUT_MS = 4_000;\n\nfunction hotkeyNote(state: DesktopState): string {\n const { enabled, registered, accelerator, error } = state.hotkey;\n if (!enabled) return `Off. Turning it on takes ${accelerator} away from every other app on this Mac.`;\n if (!registered) {\n // Native's own copy when it has one (it names the conflict); ours otherwise.\n const why = error ?? 'another app already uses it';\n return `${accelerator} is not active: ${why}. Free the shortcut in that app, or turn this off.`;\n }\n return `Press ${accelerator} in any app to bring Verse forward with the composer focused.`;\n}\n\nfunction notificationsNote(state: DesktopState): string {\n const base = state.notifications.enabled\n ? 'Finished and failed chats, and new items that need you — only while Verse is in the background.'\n : 'Off. The tray and the Dock badge still show what needs you.';\n // Unsigned local builds deliver through osascript (notify.rs): say so, or\n // the operator goes looking for \"Ashlr\" in Notification settings.\n if (state.notifications.delivery === 'script') {\n return `${base} On this unsigned build banners appear as Script Editor, and clicking one opens Script Editor rather than Verse.`;\n }\n return base;\n}\n\nexport function DesktopSettingsPanel() {\n const state = useDesktopState();\n const [pending, setPending] = useState<DesktopPreference | null>(null);\n const [failure, setFailure] = useState<string | null>(null);\n const timer = useRef<number | null>(null);\n\n // Any new state from native is the answer: stop waiting, and drop a stale\n // \"did not answer\" (the switches are current again).\n useEffect(() => {\n setPending(null);\n setFailure(null);\n if (timer.current !== null) window.clearTimeout(timer.current);\n timer.current = null;\n }, [state]);\n useEffect(() => () => {\n if (timer.current !== null) window.clearTimeout(timer.current);\n }, []);\n\n if (state === null) {\n return (\n <Panel title=\"Desktop\">\n <p className={styles.panelNote} aria-busy={isDesktopShell() || undefined}>\n {isDesktopShell()\n ? 'Reading the desktop app’s settings…'\n : 'The system-wide shortcut and notifications are available in the Verse desktop app.'}\n </p>\n </Panel>\n );\n }\n\n function change(name: DesktopPreference, value: boolean) {\n setFailure(null);\n if (!setDesktopPreference(name, value)) {\n setFailure('The desktop app did not take the change. Nothing was changed.');\n return;\n }\n setPending(name);\n if (timer.current !== null) window.clearTimeout(timer.current);\n timer.current = window.setTimeout(() => {\n timer.current = null;\n setPending(null);\n setFailure('The desktop app did not answer. The switches show what it last reported.');\n }, DESKTOP_ANSWER_TIMEOUT_MS);\n }\n\n const hotkeyBroken = state.hotkey.enabled && !state.hotkey.registered;\n\n return (\n <Panel title=\"Desktop\">\n <SettingRow\n label={`System-wide shortcut (${state.hotkey.accelerator})`}\n description={<span data-tone={hotkeyBroken ? 'warning' : undefined} role={hotkeyBroken ? 'status' : undefined}>{hotkeyNote(state)}</span>}\n >\n <Switch\n aria-label=\"System-wide shortcut\"\n checked={state.hotkey.enabled}\n disabled={pending !== null}\n onChange={(next) => change('globalHotkey', next)}\n />\n </SettingRow>\n <SettingRow label=\"Notifications\" description={notificationsNote(state)}>\n <Switch\n aria-label=\"Notifications\"\n checked={state.notifications.enabled}\n disabled={pending !== null}\n onChange={(next) => change('notifications', next)}\n />\n </SettingRow>\n {pending ? <p className={styles.panelNote} role=\"status\">Waiting for the desktop app…</p> : null}\n {failure ? <p className={styles.panelNote} role=\"alert\">{failure}</p> : null}\n </Panel>\n );\n}\n","/**\n * routes/verse/sections/ShortcutsPanel.tsx — Settings ▸ Keyboard (unit C1).\n *\n * The same table ⌘/ shows, read from C0's command catalog: the reference\n * can no longer drift from the keys the handlers actually match (the 3.9\n * version was a hand-written list that still said ⌘1 = Chat).\n */\nimport { useMemo } from 'react';\nimport { detectKeyPlatform, findCommand, formatChord } from '../shell/command-catalog.js';\nimport { ShortcutsTable } from '../shell/ShortcutsOverlay.js';\nimport { Panel } from './SettingRow.js';\nimport styles from './SettingsSection.module.css';\n\n/** ⌘ on Apple platforms, Ctrl everywhere else. */\nexport function isApplePlatform(): boolean {\n return detectKeyPlatform() === 'mac';\n}\n\nexport function ShortcutsPanel() {\n const platform = useMemo(() => detectKeyPlatform(), []);\n const overlay = findCommand('shortcuts.open')?.keys[0];\n return (\n <Panel title=\"Keyboard\">\n <p className={styles.panelNote}>\n {overlay ? `${formatChord(overlay, platform)} shows this list from anywhere.` : null}\n </p>\n <ShortcutsTable platform={platform} />\n </Panel>\n );\n}\n","/**\n * routes/verse/sections/SettingsSection.tsx — the Settings rail item\n * (VERSE-CONTRACT-V2, owner A). Named export, NO props: the shell\n * lazy-mounts it and it reads everything it needs from the stores.\n *\n * One 720px reading column: Appearance (live, no save button), Chat (how\n * reasoning shows), Desktop (system-wide shortcut, notifications — 3.10),\n * Connection (server, authority state, how to get tokens back), Keyboard (the\n * catalog's own table), the tour, and About. Each row is label + description\n * on the left, control on the right — the same rhythm all the way down, so\n * the page reads as one object rather than seven inventions.\n *\n * 3.10: reached from the gear tray (⌘,), not the rail.\n */\nimport { useAppearance } from '../../../data/hooks.js';\nimport { OnboardingPanel } from '../onboarding/OnboardingPanel.js';\nimport { AboutPanel } from './AboutPanel.js';\nimport { AppearancePanel } from './AppearancePanel.js';\nimport { ChatSettingsPanel } from './ChatSettingsPanel.js';\nimport { ConnectionPanel } from './ConnectionPanel.js';\nimport { DesktopSettingsPanel } from './DesktopSettingsPanel.js';\nimport { ShortcutsPanel } from './ShortcutsPanel.js';\nimport styles from './SettingsSection.module.css';\n\nexport function SettingsSection() {\n const { appearance, set, reset } = useAppearance();\n\n return (\n <div className={styles.section}>\n <header className={styles.strip} data-app-region=\"drag\">\n <h2 className={styles.stripTitle}>Settings</h2>\n </header>\n <div className={styles.scroll}>\n <div className={styles.column}>\n <AppearancePanel appearance={appearance} onChange={set} onReset={reset} />\n <ChatSettingsPanel />\n <DesktopSettingsPanel />\n <ConnectionPanel />\n <ShortcutsPanel />\n <OnboardingPanel />\n <AboutPanel />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"0xECmBA,SAAgB,EAAM,CAAE,QAAO,SAAQ,YAAwB,CAC7D,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,MAA3B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,UAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,WAAa,SAAA,CAAU,CAAA,EAC5C,CACE,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,UAAY,UAAc,CAAA,CAC1C,GAEb,CAcA,SAAgB,EAAW,CACzB,QACA,cACA,UACA,UACA,UAAU,GACV,YACkB,CAClB,IAAM,GACJ,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,GAAI,EACnC,SAAA,CACG,CAAA,EACL,GAAc,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,eAAiB,SAAA,CAAkB,CAAA,EAAI,IAC9E,CAAA,CAAA,EAGJ,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,IAAI,GAAG,EAAU,EAAO,WAAa,KAA/D,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QACpB,SAAA,GACC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAgB,UAAS,UAAW,EAAO,QACxC,SAAA,CACI,CAAA,EAEP,CAEC,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAa,UAAc,CAAA,CAC/C,GAET,CCnDA,SAAgB,GAAwB,EAA4B,EAA4B,EAAc,KAAK,IAAI,EAAW,CAChI,GAAI,EAAa,CACf,IAAM,EAAO,EAAe,EAAa,CAAG,EAC5C,OAAO,EAAO,kBAAkB,EAAK,GAAK,YAC5C,CAEA,OADI,EAAoB,kFACjB,sDACT,CAEA,SAAgB,IAAkB,CAChC,GAAM,CAAE,cAAa,cAAa,QAAS,EAAc,EAEzD,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,MAAM,aACX,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAM,4BACN,YAAa,iJAAiJ,GAAwB,EAAa,CAAW,IAE9M,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,SAAS,KAAK,KAAK,QAAS,EAAkB,SAAU,EACrE,SAAA,EAAO,UAAY,QACd,CAAA,CACE,CAAA,CACP,CAAA,CAEX,CEpCA,IAAa,GAAsB,SACtB,GAAW,cCFxB,SAAgB,IAAa,CAC3B,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,MAAM,QACX,UAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,IAAI,GAAG,EAAO,aACtC,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAY,SAAA,EAAY,CAAA,GAC7C,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAArB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAK,KAAA,GAAL,SAAA,CAAU,IAAE,EAAiB,CAC7B,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,+DAAmE,CAAA,CACxE,KACH,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAW,SAAA,4HAG7B,CAAA,GACH,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UACnB,UAAA,EAAA,EAAA,KAAA,CAAC,IAAD,CACE,UAAW,EAAO,KAClB,KAAK,uCACL,OAAO,SACP,IAAI,sBAJN,SAAA,CAKC,wBAEC,EAAA,EAAA,IAAA,CAAC,GAAD,CAAkB,KAAM,EAAK,CAAA,CAC5B,GACF,CAAA,CACA,GACF,CAAA,CACA,CAAA,CAEX,gBCHM,GAAS,sBACT,GAAQ,8BAEd,SAAS,EAAM,EAAW,EAAa,EAAqB,CAC1D,OAAO,KAAK,IAAI,EAAK,KAAK,IAAI,EAAK,CAAC,CAAC,CACvC,CAGA,SAAS,EAAU,EAAa,EAAuB,CACrD,IAAM,EAAO,EAAI,KAAK,EAEtB,OADI,EAAK,SAAS,GAAG,EAAW,OAAO,WAAW,CAAI,EAAI,IAAO,EAC1D,OAAO,WAAW,CAAI,CAC/B,CAEA,SAAS,EAAS,EAAW,EAAW,EAAgD,CACtF,IAAM,GAAQ,EAAI,IAAO,KAAO,IAC1B,GAAK,EAAI,KAAK,IAAI,EAAI,EAAI,CAAC,GAAK,EAChC,EAAI,GAAK,EAAI,KAAK,IAAM,EAAM,GAAM,EAAK,CAAC,GAC1C,EAAI,EAAI,EAAI,EACd,EAOJ,MANA,CAKK,EALD,EAAM,GAAU,CAAC,EAAG,EAAG,CAAC,EACnB,EAAM,IAAW,CAAC,EAAG,EAAG,CAAC,EACzB,EAAM,IAAW,CAAC,EAAG,EAAG,CAAC,EACzB,EAAM,IAAW,CAAC,EAAG,EAAG,CAAC,EACzB,EAAM,IAAW,CAAC,EAAG,EAAG,CAAC,EACvB,CAAC,EAAG,EAAG,CAAC,EACZ,CACL,EAAG,KAAK,OAAO,EAAI,GAAK,GAAK,GAAG,EAChC,EAAG,KAAK,OAAO,EAAI,GAAK,GAAK,GAAG,EAChC,EAAG,KAAK,OAAO,EAAI,GAAK,GAAK,GAAG,CAClC,CACF,CAMA,SAAS,GAAc,EAAwB,CAC7C,IAAM,EAAkB,CAAC,EACrB,EAAQ,EACR,EAAU,GACd,IAAK,IAAM,KAAM,EAAM,CAGrB,GAFI,IAAO,IAAK,GAAS,EAChB,IAAO,KAAK,IACjB,IAAO,KAAO,IAAU,EAAG,CAC7B,EAAM,KAAK,CAAO,EAClB,EAAU,GACV,QACF,CACA,GAAW,CACb,CAEA,OADA,EAAM,KAAK,CAAO,EACX,EAAM,IAAK,GAAM,EAAE,KAAK,CAAC,CAAC,CAAC,OAAQ,GAAM,EAAE,OAAS,CAAC,CAC9D,CAGA,SAAS,EAAiB,EAA2D,CACnF,IAAM,EAAO,EAAI,KAAK,EAChB,EAAI,kBAAkB,KAAK,CAAI,EACrC,GAAI,EAAG,MAAO,CAAE,MAAO,EAAK,MAAM,EAAG,EAAE,KAAK,CAAC,CAAC,KAAK,EAAG,IAAK,OAAO,WAAW,EAAE,EAAG,CAAE,EACpF,IAAM,EAAO,kBAAkB,KAAK,CAAI,EAExC,OADI,EAAa,CAAE,MAAO,EAAK,MAAM,EAAK,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAG,IAAK,OAAO,WAAW,EAAK,EAAG,CAAE,EACvF,CAAE,MAAO,EAAM,IAAK,IAAK,CAClC,CAaA,SAAS,GAAc,EAA2B,CAChD,IAAM,EAAO,wBAAwB,KAAK,EAAK,KAAK,CAAC,EACrD,GAAI,CAAC,EAAM,OAAO,KAClB,IAAM,EAAO,GAAc,EAAK,EAAG,EAEnC,GADI,EAAK,SAAW,GAChB,EAAK,EAAE,CAAE,QAAQ,OAAQ,GAAG,CAAC,CAAC,KAAK,IAAM,UAAW,OAAO,KAE/D,IAAM,EAAQ,EAAiB,EAAK,EAAG,EACjC,EAAS,EAAiB,EAAK,EAAG,EACxC,GAAI,CAAC,GAAS,CAAC,EAAQ,OAAO,KAC9B,IAAM,EAAK,EAAW,EAAM,KAAK,EAC3B,EAAK,EAAW,EAAO,KAAK,EAClC,GAAI,CAAC,GAAM,CAAC,EAAI,OAAO,KAEvB,IAAI,EAAK,EAAM,IACX,EAAK,EAAO,IACZ,IAAO,MAAQ,IAAO,MACxB,EAAK,GACL,EAAK,IACI,IAAO,KAAM,EAAK,IAAM,EAC1B,IAAO,OAAM,EAAK,IAAM,GACjC,IAAM,EAAQ,EAAK,EACnB,GAAI,GAAS,EAAG,OAAO,KACvB,IAAM,EAAK,EAAK,EACV,EAAK,EAAM,EAEX,EAAQ,EAAG,EAAI,EAAK,EAAG,EAAI,EACjC,GAAI,GAAS,EAAG,MAAO,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAChD,IAAM,EAAW,GACf,EAAM,KAAK,OAAO,EAAG,GAAK,EAAG,EAAI,EAAK,EAAG,GAAK,EAAG,EAAI,GAAM,CAAK,EAAG,EAAG,GAAG,EAC3E,MAAO,CAAE,EAAG,EAAQ,GAAG,EAAG,EAAG,EAAQ,GAAG,EAAG,EAAG,EAAQ,GAAG,EAAG,EAAG,EAAM,EAAO,EAAG,CAAC,CAAE,CACpF,CAGA,SAAgB,EAAW,EAA4B,CACrD,IAAM,EAAO,EAAM,KAAK,CAAC,CAAC,YAAY,EACtC,GAAI,IAAS,cAAe,MAAO,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAC5D,GAAI,EAAK,WAAW,YAAY,EAAG,OAAO,GAAc,CAAI,EAE5D,IAAM,EAAM,GAAO,KAAK,CAAI,EAC5B,GAAI,EAAK,CACP,IAAM,EAAO,EAAI,GACX,EAAU,GAAc,OAAO,SAAS,EAAE,SAAW,EAAI,EAAI,EAAI,EAAG,EAAE,EAiB5E,OAhBI,EAAK,SAAW,GAAK,EAAK,SAAW,EAChC,CACL,EAAG,EAAO,EAAK,EAAG,EAClB,EAAG,EAAO,EAAK,EAAG,EAClB,EAAG,EAAO,EAAK,EAAG,EAClB,EAAG,EAAK,SAAW,EAAI,EAAO,EAAK,EAAG,EAAI,IAAM,CAClD,EAEE,EAAK,SAAW,GAAK,EAAK,SAAW,EAChC,CACL,EAAG,EAAO,EAAK,MAAM,EAAG,CAAC,CAAC,EAC1B,EAAG,EAAO,EAAK,MAAM,EAAG,CAAC,CAAC,EAC1B,EAAG,EAAO,EAAK,MAAM,EAAG,CAAC,CAAC,EAC1B,EAAG,EAAK,SAAW,EAAI,EAAO,EAAK,MAAM,EAAG,CAAC,CAAC,EAAI,IAAM,CAC1D,EAEK,IACT,CAEA,IAAM,EAAK,GAAM,KAAK,CAAI,EAC1B,GAAI,CAAC,EAAI,OAAO,KAChB,IAAM,EAAO,EAAG,GAEV,EAAQ,EAAG,EAAE,CAChB,QAAQ,MAAO,GAAG,CAAC,CACnB,MAAM,QAAQ,CAAC,CACf,OAAO,OAAO,EACjB,GAAI,EAAM,OAAS,EAAG,OAAO,KAC7B,IAAM,EAAQ,EAAM,QAAU,EAAI,EAAM,EAAU,EAAM,GAAK,CAAC,EAAG,EAAG,CAAC,EAAI,EAEzE,GAAI,EAAK,WAAW,KAAK,EACvB,MAAO,CACL,EAAG,EAAM,KAAK,MAAM,EAAU,EAAM,GAAK,GAAG,CAAC,EAAG,EAAG,GAAG,EACtD,EAAG,EAAM,KAAK,MAAM,EAAU,EAAM,GAAK,GAAG,CAAC,EAAG,EAAG,GAAG,EACtD,EAAG,EAAM,KAAK,MAAM,EAAU,EAAM,GAAK,GAAG,CAAC,EAAG,EAAG,GAAG,EACtD,EAAG,CACL,EAGF,IAAM,EAAM,OAAO,WAAW,EAAM,EAAG,EACjC,EAAM,EAAM,EAAU,EAAM,GAAK,CAAC,EAAG,EAAG,CAAC,EACzC,EAAQ,EAAM,EAAU,EAAM,GAAK,CAAC,EAAG,EAAG,CAAC,EAEjD,OADK,OAAO,SAAS,CAAG,EACjB,CAAE,GAAG,EAAS,EAAK,EAAK,CAAK,EAAG,EAAG,CAAM,EADd,IAEpC,CAGA,SAAgB,EAAQ,EAAa,EAAsB,CACzD,GAAI,EAAM,GAAK,EAAG,OAAO,EACzB,IAAM,EAAI,EAAM,EAChB,MAAO,CACL,EAAG,KAAK,MAAM,EAAM,EAAI,EAAI,EAAS,GAAK,EAAI,EAAE,EAChD,EAAG,KAAK,MAAM,EAAM,EAAI,EAAI,EAAS,GAAK,EAAI,EAAE,EAChD,EAAG,KAAK,MAAM,EAAM,EAAI,EAAI,EAAS,GAAK,EAAI,EAAE,EAChD,EAAG,CACL,CACF,CAGA,SAAgB,EAAkB,EAAqB,CACrD,IAAM,EAAW,GAAsB,CACrC,IAAM,EAAI,EAAI,IACd,OAAO,GAAK,OAAU,EAAI,QAAU,EAAI,MAAS,QAAU,GAC7D,EACA,MAAO,OAAS,EAAQ,EAAM,CAAC,EAAI,MAAS,EAAQ,EAAM,CAAC,EAAI,MAAS,EAAQ,EAAM,CAAC,CACzF,CASA,SAAgB,EAAc,EAAoB,EAAoB,EAAW,UAA0B,CACzG,IAAM,EAAQ,EAAW,CAAU,EAC7B,EAAQ,EAAW,CAAU,EAC7B,EAAO,EAAW,CAAQ,EAChC,GAAI,CAAC,GAAS,CAAC,GAAS,CAAC,EAAM,OAAO,KACtC,IAAM,EAAK,EAAQ,EAAO,CAAI,EAExB,EAAK,EADA,EAAQ,EAAO,CACG,CAAE,EACzB,EAAK,EAAkB,CAAE,EACzB,CAAC,EAAI,GAAM,GAAM,EAAK,CAAC,EAAI,CAAE,EAAI,CAAC,EAAI,CAAE,EAC9C,OAAQ,EAAK,MAAS,EAAK,IAC7B,CAcA,SAAgB,EAAU,EAAW,EAAW,EAAW,EAAkB,EAAW,CACtF,IAAM,EAAM,EAAS,EAAG,EAAM,EAAG,EAAG,GAAG,EAAI,IAAK,EAAM,EAAI,EAAiB,EAAG,GAAG,EAAI,GAAG,EAClF,EAAO,GAAc,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAG,GAAG,EACzD,MAAO,IAAI,EAAI,EAAI,CAAC,IAAI,EAAI,EAAI,CAAC,IAAI,EAAI,EAAI,CAAC,GAChD,CCxOA,IAAa,EAA0C,CACrD,CAAE,GAAI,SAAU,MAAO,SAAU,EAAG,IAAK,EAAG,GAAI,EAAG,EAAG,EACtD,CAAE,GAAI,OAAQ,MAAO,OAAQ,EAAG,IAAK,EAAG,GAAI,EAAG,EAAG,EAClD,CAAE,GAAI,OAAQ,MAAO,OAAQ,EAAG,IAAK,EAAG,GAAI,EAAG,EAAG,EAClD,CAAE,GAAI,OAAQ,MAAO,OAAQ,EAAG,IAAK,EAAG,GAAI,EAAG,EAAG,EAClD,CAAE,GAAI,QAAS,MAAO,QAAS,EAAG,IAAK,EAAG,GAAI,EAAG,EAAG,EACpD,CAAE,GAAI,QAAS,MAAO,QAAS,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EACnD,CAAE,GAAI,OAAQ,MAAO,OAAQ,EAAG,IAAK,EAAG,GAAI,EAAG,EAAG,EAClD,CAAE,GAAI,SAAU,MAAO,SAAU,EAAG,IAAK,EAAG,GAAI,EAAG,EAAG,CACxD,EAGA,SAAgB,GAAoB,EAAoB,EAAc,EAAY,CAChF,IAAM,EAAO,EAAkB,EAC/B,OACE,EAAM,QAAU,EAAK,OACrB,EAAM,UAAY,EAAK,SACvB,EAAM,UAAY,EAAK,SACvB,EAAM,UAAY,EAAK,SACvB,EAAM,UAAY,EAAK,SACvB,EAAM,UAAY,EAAK,SACvB,EAAM,cAAgB,EAAK,aAC3B,EAAM,SAAW,EAAK,QACtB,EAAM,SAAW,EAAK,MAE1B,CAGA,SAAgB,GAAqB,EAAoB,EAAc,EAAwB,CAC7F,OACE,EAAe,KAAM,GAAM,EAAE,IAAM,EAAM,SAAW,EAAE,IAAM,EAAM,SAAW,EAAE,IAAM,EAAM,OAAO,GAAK,IAE3G,CClBA,IAAa,GAAgB,UAChB,GAAe,UAKtB,GAAgB,CACpB,CAAE,MAAO,SAA6B,MAAO,SAAU,MAAM,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,CAAA,CAAE,EAC7E,CAAE,MAAO,QAA4B,MAAO,QAAS,MAAM,EAAA,EAAA,IAAA,CAAC,GAAD,CAAU,CAAA,CAAE,EACvE,CAAE,MAAO,OAA2B,MAAO,OAAQ,MAAM,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,CAAA,CAAE,CACxE,EAWM,GAAmB,CACvB,CAAE,MAAO,UAAsB,MAAO,SAAU,EAChD,CAAE,MAAO,QAAoB,MAAO,OAAQ,EAC5C,CAAE,MAAO,SAAqB,MAAO,aAAc,CACrD,EAEM,GAAkB,CACtB,CAAE,MAAO,cAA0B,MAAO,aAAc,EACxD,CAAE,MAAO,UAAsB,MAAO,SAAU,CAClD,EAEM,GAAe,CACnB,CAAE,MAAO,UAA0B,MAAO,eAAgB,EAC1D,CAAE,MAAO,KAAqB,MAAO,SAAU,EAC/C,CAAE,MAAO,OAAuB,MAAO,MAAO,CAChD,EAEM,GAAiB,CACrB,CAAE,MAAO,QAAwB,MAAO,OAAQ,EAChD,CAAE,MAAO,UAA0B,MAAO,SAAU,EACpD,CAAE,MAAO,OAAuB,MAAO,MAAO,CAChD,EAGA,SAAS,GAAS,EAAW,EAAmB,CAE9C,MAAO,6BADO,CAAC,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,GAAG,CAAC,CAAC,IAAK,GAAM,GAAG,EAAU,EAAG,EAAG,CAAC,EAAE,GAAI,EAAI,IAAO,IAAI,EAC/D,CAAA,CAAM,KAAK,IAAI,EAAE,EACvD,CAUA,SAAgB,GAAkB,EAAW,EAAW,EAA8B,CACpF,IAAM,EAAY,EAAU,EAAG,EAAG,EAAG,EAAU,EACzC,EAAW,EAAU,EAAG,EAAG,EAAG,EAAwB,EACtD,EAAa,EAAc,EAAW,EAAa,EACnD,EAAY,EAAc,EAAU,EAAY,EAChD,EAAmC,CAAC,EAG1C,OAFI,IAAe,MAAQ,EAAa,KAAK,EAAQ,KAAK,OAAO,EAC7D,IAAc,MAAQ,EAAY,KAAK,EAAQ,KAAK,MAAM,EACvD,CAAE,aAAY,YAAW,SAAQ,CAC1C,CAQA,SAAgB,GAAgB,CAAE,aAAY,WAAU,WAAiC,CACvF,IAAM,GAAA,EAAgB,EAAA,MAAA,CAAM,EACtB,GAAA,EAAQ,EAAA,MAAA,CAAM,EACd,GAAA,EAAQ,EAAA,MAAA,CAAM,EACd,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,GAAA,EAAW,EAAA,MAAA,CAAM,EAEjB,EAAS,GAAqB,CAAU,EACxC,EAAc,GAAkB,EAAW,QAAS,EAAW,QAAS,EAAW,OAAO,EAEhG,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,MAAM,aACN,QACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,QACR,KAAK,KACL,QAAS,EACT,SAAU,GAAoB,CAAU,EACxC,MAAM,oFACP,SAAA,mBAEO,CAAA,EAXZ,SAAA,EAcE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,MAAM,QAAQ,YAAY,6CACpC,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,aAAW,QACX,QAAS,GACT,MAAO,EAAW,MAClB,SAAW,GAAU,EAAS,CAAE,OAAM,CAAC,CACxC,CAAA,CACS,CAAA,GAEZ,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAM,SACN,QAAS,EACT,YACE,EACI,GAAG,EAAO,MAAM,wEAChB,mFAGN,UAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAU,KAAK,aAAa,kBAAiB,EACjE,SAAA,EAAe,IAAK,GAAM,CACzB,IAAM,EAAW,GAAQ,KAAO,EAAE,GAClC,OACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAEE,KAAK,SACL,KAAK,QACL,eAAc,EACd,aAAY,EAAE,MACd,SAAU,GAAa,CAAC,GAAU,EAAE,KAAO,EAAe,EAAE,CAAE,GAAM,EAAI,GACxE,UAAW,EAAO,OAClB,MAAO,CAAE,WAAY,EAAU,EAAE,EAAG,EAAE,EAAG,EAAE,CAAC,CAAE,EAC9C,YAAe,EAAS,CAAE,QAAS,EAAE,EAAG,QAAS,EAAE,EAAG,QAAS,EAAE,CAAE,CAAC,EAEnE,SAAA,GACC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YACtB,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,KAAM,EAAK,CAAA,CAClB,CAAA,EACJ,IACE,EAfD,EAAE,EAeD,CAEZ,CAAC,CACE,CAAA,CACK,CAAA,GAEZ,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAM,kBACN,YAAY,gHACZ,QAAA,GAEA,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,YAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,GAAI,EACJ,MAAM,MACN,IAAK,EACL,IAAK,IACL,MAAO,EAAW,QAClB,WAAY,GAAG,EAAW,QAAQ,GAClC,UAAW,GAAG,EAAW,QAAQ,UACjC,WAAY,GAAS,EAAW,QAAS,EAAW,OAAO,EAC3D,SAAW,GAAM,EAAS,CAAE,QAAS,OAAO,EAAE,cAAc,KAAK,CAAE,CAAC,CACrE,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,GAAI,EACJ,MAAM,aACN,IAAK,EACL,IAAK,IACL,MAAO,EAAW,QAClB,WAAY,GAAG,EAAW,QAAQ,GAClC,UAAW,GAAG,EAAW,QAAQ,UACjC,SAAW,GAAM,EAAS,CAAE,QAAS,OAAO,EAAE,cAAc,KAAK,CAAE,CAAC,CACrE,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,GAAI,EACJ,MAAM,YACN,IAAK,EAAuB,IAC5B,IAAK,EAAuB,IAC5B,MAAO,EAAW,QAClB,WAAY,GAAG,EAAW,QAAQ,GAClC,UAAW,GAAG,EAAW,QAAQ,UACjC,SAAW,GAAM,EAAS,CAAE,QAAS,OAAO,EAAE,cAAc,KAAK,CAAE,CAAC,CACrE,CAAA,EACA,EAAY,QAAQ,OAAS,GAC5B,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,gBAAiB,KAAK,SAA3C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,KAAM,EAAK,CAAA,GACtB,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAM,gDAC0C,IAC7C,EAAY,QAAQ,SAAW,EAAI,cAAgB,GAAG,EAAY,QAAQ,GAAG,OAAO,qDAEjF,CAAA,CAAA,CACL,CACD,CAAA,EAAA,IACD,GACK,CAAA,GAEZ,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAM,eACN,YAAY,wHAEZ,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,aAAW,eACX,QAAS,GACT,MAAO,EAAW,QAClB,SAAW,GAAY,EAAS,CAAE,SAAQ,CAAC,CAC5C,CAAA,CACS,CAAA,GAEZ,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAM,UACN,YAAY,uIAEZ,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,aAAW,UACX,QAAS,GACT,MAAO,EAAW,QAClB,SAAW,GAAY,EAAS,CAAE,SAAQ,CAAC,CAC5C,CAAA,CACS,CAAA,GAEZ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,MAAM,eAAe,YAAY,4EAC3C,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,aAAW,eACX,QAAS,GACT,MAAO,EAAW,YAClB,SAAW,GAAgB,EAAS,CAAE,aAAY,CAAC,CACpD,CAAA,CACS,CAAA,GAEZ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,MAAM,gBAAgB,YAAY,+DAC5C,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,aAAW,gBACX,QAAS,GACT,MAAO,EAAW,OAClB,SAAW,GAAW,EAAS,CAAE,QAAO,CAAC,CAC1C,CAAA,CACS,CAAA,GAEZ,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAM,gBACN,QAAS,EACT,YAAY,6GAEZ,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,GAAI,EACJ,QAAS,EAAW,aACpB,SAAW,GAAiB,EAAS,CAAE,cAAa,CAAC,EACrD,aAAW,eACZ,CAAA,CACS,CAAA,GAEZ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,MAAM,UAAU,YAAY,mCAAmC,QAAA,GACzE,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,eAAgB,SAAA,aAAc,CAAA,GACnD,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAArB,SAAA,CAAkC,uEACqC,KACrE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,gBAAiB,SAAA,iBAAqB,CAAA,EAAC,wBAC9D,KACH,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,UAAU,KAAK,KAAK,SAAA,SAE5B,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,SAAS,KAAK,KAAK,SAAA,QAE3B,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,QAAQ,KAAK,KAAK,SAAA,OAE1B,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,SAAS,KAAK,KAAK,SAAA,aAE3B,CAAA,CACL,KACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,OAAO,SAAW,CAAA,GAC/B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAK,OAAO,SAAS,SAAA,YAAe,CAAA,GACpC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAK,OAAO,QAAQ,KAAA,GAAK,SAAA,aAEpB,CAAA,CACF,KACL,EAAA,EAAA,IAAA,CAAC,GAAD,CAAO,MAAO,MAAQ,IAAK,KAAQ,MAAM,SAAW,CAAA,GACpD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,aAAW,gBAAgB,YAAY,iCAAiC,KAAK,IAAM,CAAA,CACvF,GACK,CAAA,CACP,GAEX,CC7RA,IAAM,GAA0D,CAC9D,UAAW,uFACX,SAAU,qDACV,OAAQ,qHACV,EAKa,EAAwC,CAAC,OAAQ,eAAgB,MAAM,EAC9E,EAAoD,CAAE,KAAM,OAAQ,eAAgB,eAAgB,KAAM,MAAO,EACjH,GAA0D,CAC9D,KAAM,yDACN,eAAgB,sDAChB,KAAM,2CACR,EACM,EAAsD,CAC1D,QAAS,UACT,IAAK,MACL,OAAQ,SACR,KAAM,OACN,MAAO,aACP,IAAK,KACP,EAEM,EAAgB,GAOhB,GAAgC,IAAI,IAAI,CAAa,EACrD,EAAkC,IAAI,IAAI,CAAa,EAE7D,SAAS,EAAS,EAAkD,CAClE,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,CAC5E,CAQA,SAAgB,EAAsB,EAAkD,CACtF,GAAI,CAAC,EAAS,CAAG,GAAK,CAAC,EAAS,EAAI,MAAS,EAAG,OAAO,KACvD,IAAM,EAAS,GAAyC,CACtD,IAAM,EAA4B,CAAC,EAInC,OAHK,EAAS,CAAK,GACf,OAAO,EAAM,gBAAsB,UAAY,GAAS,IAAI,EAAM,cAAiB,IAAG,EAAI,eAAiB,EAAM,gBACjH,OAAO,EAAM,QAAc,UAAY,EAAW,IAAI,EAAM,MAAS,IAAG,EAAI,OAAS,EAAM,QACxF,GAHsB,CAI/B,EACM,EAA8C,CAAC,EACrD,GAAI,EAAS,EAAI,KAAQ,EAAG,IAAK,GAAM,CAAC,EAAI,KAAU,OAAO,QAAQ,EAAI,KAAQ,EAAG,EAAM,GAAM,EAAM,CAAK,EAC3G,MAAO,CAAE,OAAQ,EAAM,EAAI,MAAS,EAAG,OAAM,CAC/C,CAEA,SAAS,EAAY,EAAsB,CAKzC,OAHI,aAAe,IAAa,EAAI,SAAW,KAAO,EAAI,SAAW,KAC5D,wFAEF,oEACT,CAEA,SAAS,IAAkB,CACzB,GAAM,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAe,CAAE,MAAO,SAAU,CAAC,EACrD,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAS,EAAK,EACpC,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAwB,IAAI,EAChD,EAAO,GAAa,EACpB,GAAA,EAAc,EAAA,MAAA,CAAM,EACpB,GAAA,EAAW,EAAA,MAAA,CAAM,GAEvB,EAAA,EAAA,UAAA,KAAgB,CACd,IAAM,EAAa,IAAI,gBAWvB,OAVA,GAAqB,EAAW,MAAM,CAAC,CAAC,KACrC,GAAQ,CACP,IAAM,EAAW,EAAsB,CAAG,EAC1C,EAAQ,EAAW,CAAE,MAAO,QAAS,UAAS,EAAI,CAAE,MAAO,cAAe,QAAS,EAAY,IAAI,CAAE,CAAC,CACxG,EACC,GAAiB,CACZ,EAAW,OAAO,SACtB,EAAQ,CAAE,MAAO,cAAe,QAAS,EAAY,CAAG,CAAE,CAAC,CAC7D,CACF,MACa,EAAW,MAAM,CAChC,EAAG,CAAC,CAAC,EAEL,IAAM,GAAA,EAAO,EAAA,YAAA,CAAY,MAAO,EAA2C,IAAmB,CAC5F,EAAS,IAAI,EACb,EAAU,EAAI,EACd,GAAI,CACF,IAAM,EAAO,MAAM,EAAK,IAAI,MAAc,GAAsB,CAAM,CAAC,EAEvE,GAAI,EAAM,CACR,IAAM,EAAW,EAAsB,CAAI,EACvC,GAAU,EAAQ,CAAE,MAAO,QAAS,UAAS,CAAC,CACpD,CACF,OAAS,EAAK,CACZ,EAAS,GAAqB,CAAG,CAAC,CACpC,QAAU,CACR,EAAU,EAAK,CACjB,CACF,EAAG,CAAC,CAAI,CAAC,EAET,GAAI,EAAK,QAAU,UACjB,OAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAW,YAAU,OAAO,SAAA,4BAA6B,CAAA,EAEvF,GAAI,EAAK,QAAU,cACjB,OAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAY,SAAA,EAAK,OAAW,CAAA,EAG1D,IAAM,EAAS,EAAK,SAAS,OACvB,EAAoB,EAAO,gBAAkB,EAAO,iBAAmB,SAAW,EAAO,eAAiB,eAC1G,EAAS,EAAO,QAAU,KAC1B,EAAgB,OAAO,KAAK,EAAK,SAAS,KAAK,CAAC,CAAC,OAEvD,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,MAAM,qBAAqB,YAAa,GAAiB,GAAO,QAAS,EACnF,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,kBAAiB,EACjB,KAAK,KACL,MAAO,EACP,SAAW,GAAS,CACd,IAAS,GAAM,EAAU,CAAE,eAAgB,CAAK,EAAG,sBAAsB,EAAW,GAAM,EAAE,CAClG,EACA,QAAS,EAAc,IAAK,IAAW,CAAE,QAAO,MAAO,EAAW,GAAQ,SAAU,CAAO,EAAE,CAC9F,CAAA,CACS,CAAA,GACZ,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAM,iCACN,YACE,EAAgB,EACZ,uEAAuE,IAAkB,EAAI,mBAAqB,GAAG,EAAc,mBAAmB,2BACtJ,sEAEN,QAAS,EAET,UAAA,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,GAAI,EACJ,KAAK,KACL,MAAO,GAAU,EACjB,SAAU,EACV,SAAW,GAAU,CACnB,IAAM,EAAM,EAAM,OAAO,MACnB,EAAO,IAAQ,EAAgB,KAAQ,EACzC,IAAS,GACb,EAAU,CAAE,OAAQ,CAAK,EAAG,EAAO,sBAAsB,EAAa,GAAM,UAAY,gDAAgD,CAC1I,EAVF,SAAA,EAYE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAO,EAAe,SAAA,eAAqB,CAAA,EAClD,EAAc,IAAK,IAClB,EAAA,EAAA,IAAA,CAAC,SAAD,CAA2B,QAAQ,SAAA,EAAa,EAAe,EAAlD,CAAkD,CAChE,CACK,GACE,CAAA,EACX,GAAQ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAW,KAAK,QAAS,SAAA,CAAS,CAAA,EAAI,MACpE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAqB,GAAI,EAAK,MAAS,CAAA,CACvC,CAAA,CAAA,CAEN,CAEA,SAAgB,IAAoB,CAClC,IAAM,EAAU,GAAoB,EAC9B,GAAA,EAAU,EAAA,MAAA,CAAM,EACtB,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,MAAM,OAAb,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,MAAM,YAAY,YAAa,GAAY,GAAmB,UACxE,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,kBAAiB,EACjB,KAAK,KACL,MAAO,EACP,SAAU,GACV,QAAS,GAAmB,IAAK,IAAW,CAAE,QAAO,MAAO,GAAwB,EAAO,EAAE,CAC9F,CAAA,CACS,CAAA,GACZ,EAAA,EAAA,IAAA,CAAC,GAAD,CAAkB,CAAA,CACb,GAEX,CCvMA,SAAS,GAAiB,EAAkC,CAC1D,GAAI,IAAc,KAAM,MAAO,SAC/B,IAAM,EAAU,KAAK,IAAI,EAAG,KAAK,OAAO,EAAY,KAAK,IAAI,GAAK,GAAM,CAAC,EAEzE,OADI,GAAW,EAAU,eAClB,gBAAgB,EAAQ,cAAc,IAAY,EAAI,GAAK,KACpE,CAEA,SAAgB,IAAkB,CAChC,IAAM,EAAQ,EAAa,EACrB,EAAO,EAAgB,EACvB,EAAQ,EAAS,EACjB,CAAC,EAAa,IAAA,EAAkB,EAAA,SAAA,CAAS,EAAK,EAC9C,GAAA,EAAY,EAAA,OAAA,CAA0B,IAAI,EAE1C,EAAS,OAAO,OAAW,IAAc,GAAK,OAAO,SAAS,OAEpE,eAAe,GAA4B,CACzC,GAAI,CACF,MAAM,UAAU,UAAU,UAAU,CAAM,EAC1C,EAAM,KAAK,wBAAwB,CACrC,MAAQ,CACN,EAAM,KAAK,sEAAuE,QAAQ,CAC5F,CACF,CAEA,eAAe,GAA4B,CACzC,EAAe,EAAK,EACpB,MAAM,EAAiB,EACvB,EAAM,KAAK,kDAAkD,CAC/D,CAEA,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,MAAM,aAAb,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAY,MAAM,SAAS,YAAY,mEAAvC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OACrB,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,MAAO,EAAQ,SAAA,GAAS,KAAA,GAAK,KAAK,KAAK,aAAW,gBAAkB,CAAA,CACxE,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,QAAQ,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,CAAA,EAAG,YAAe,KAAK,EAAW,EAAG,SAAA,MAEhF,CAAA,CACE,KAEZ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,MAAM,eAAe,YAAY,yEAC3C,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OAAQ,IAAU,gBAAkB,YAAc,IAAU,WAAa,WAAa,eACtF,KAAM,IAAU,gBAAkB,UAAY,IAAU,WAAa,UAAY,QAClF,CAAA,CACS,CAAA,GAEZ,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,MAAM,gBACN,YAAY,0IAFd,SAAA,EAIE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OAAQ,EAAK,QAAU,GAAiB,EAAK,SAAS,EAAI,SAC1D,KAAM,EAAK,QAAU,UAAY,SAClC,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,SACR,KAAK,KACL,MAAM,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,CAAA,EACjB,YAAe,CACb,EAAmB,EACnB,EAAM,KAAK,wBAAwB,CACrC,EACA,SAAU,CAAC,EAAK,QACjB,SAAA,UAEO,CAAA,CACE,KAEZ,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAM,aACN,YAAY,yGAEZ,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,SAAS,KAAK,KAAK,YAAe,EAAe,EAAI,EAAG,SAAA,YAEhE,CAAA,CACE,CAAA,GAEZ,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IACrB,UAAA,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAArB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SACtB,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAU,KAAM,EAAK,CAAA,CACjB,CAAA,GACN,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,6BAAmC,CAAA,EAAC,0BAAwB,KACpE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,SAAA,aAAiB,CAAA,EAAC,8SAI5C,CAAA,CAAA,CACL,GACA,CAAA,GAEL,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EACN,YAAe,EAAe,EAAK,EACnC,QAAQ,4BACR,MAAM,+BACN,YAAY,kGACZ,gBAAiB,EAEjB,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAY,MAAO,CAAE,eAAgB,UAAW,EAAvE,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,IAAK,EAAW,QAAQ,SAAS,YAAe,EAAe,EAAK,EAAG,SAAA,QAEvE,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,SAAS,YAAe,KAAK,EAAW,EAAG,SAAA,YAEnD,CAAA,CACL,GACC,CAAA,CACH,GAEX,CCrGA,IAAa,GAA4B,IAEzC,SAAS,GAAW,EAA6B,CAC/C,GAAM,CAAE,UAAS,aAAY,cAAa,SAAU,EAAM,OAO1D,OANK,EACA,EAKE,SAAS,EAAY,+DAFnB,GAAG,EAAY,kBADV,GAAS,8BACuB,oDAJzB,4BAA4B,EAAY,wCAO/D,CAEA,SAAS,GAAkB,EAA6B,CACtD,IAAM,EAAO,EAAM,cAAc,QAC7B,kGACA,8DAMJ,OAHI,EAAM,cAAc,WAAa,SAC5B,GAAG,EAAK,kHAEV,CACT,CAEA,SAAgB,IAAuB,CACrC,IAAM,EAAQ,GAAgB,EACxB,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAAmC,IAAI,EAC/D,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAAwB,IAAI,EACpD,GAAA,EAAQ,EAAA,OAAA,CAAsB,IAAI,EAcxC,IAVA,EAAA,EAAA,UAAA,KAAgB,CACd,EAAW,IAAI,EACf,EAAW,IAAI,EACX,EAAM,UAAY,MAAM,OAAO,aAAa,EAAM,OAAO,EAC7D,EAAM,QAAU,IAClB,EAAG,CAAC,CAAK,CAAC,GACV,EAAA,EAAA,UAAA,SAAsB,CAChB,EAAM,UAAY,MAAM,OAAO,aAAa,EAAM,OAAO,CAC/D,EAAG,CAAC,CAAC,EAED,IAAU,KACZ,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,MAAM,UACX,UAAA,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAW,YAAW,EAAe,GAAK,IAAA,GAC5D,SAAA,EAAe,EACZ,sCACA,oFACH,CAAA,CACE,CAAA,EAIX,SAAS,EAAO,EAAyB,EAAgB,CAEvD,GADA,EAAW,IAAI,EACX,CAAC,EAAqB,EAAM,CAAK,EAAG,CACtC,EAAW,+DAA+D,EAC1E,MACF,CACA,EAAW,CAAI,EACX,EAAM,UAAY,MAAM,OAAO,aAAa,EAAM,OAAO,EAC7D,EAAM,QAAU,OAAO,eAAiB,CACtC,EAAM,QAAU,KAChB,EAAW,IAAI,EACf,EAAW,0EAA0E,CACvF,EAAG,EAAyB,CAC9B,CAEA,IAAM,EAAe,EAAM,OAAO,SAAW,CAAC,EAAM,OAAO,WAE3D,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,MAAM,UAAb,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,yBAAyB,EAAM,OAAO,YAAY,GACzD,aAAa,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,YAAW,EAAe,UAAY,IAAA,GAAW,KAAM,EAAe,SAAW,IAAA,GAAY,SAAA,GAAW,CAAK,CAAQ,CAAA,EAExI,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,aAAW,uBACX,QAAS,EAAM,OAAO,QACtB,SAAU,IAAY,KACtB,SAAW,GAAS,EAAO,eAAgB,CAAI,CAChD,CAAA,CACS,CAAA,GACZ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,MAAM,gBAAgB,YAAa,GAAkB,CAAK,EACpE,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,aAAW,gBACX,QAAS,EAAM,cAAc,QAC7B,SAAU,IAAY,KACtB,SAAW,GAAS,EAAO,gBAAiB,CAAI,CACjD,CAAA,CACS,CAAA,EACX,GAAU,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAW,KAAK,SAAS,SAAA,8BAA+B,CAAA,EAAI,KAC3F,GAAU,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAW,KAAK,QAAS,SAAA,CAAW,CAAA,EAAI,IACnE,GAEX,CCjHA,SAAgB,IAAiB,CAC/B,IAAM,GAAA,EAAW,EAAA,QAAA,KAAc,EAAkB,EAAG,CAAC,CAAC,EAChD,EAAU,GAAY,gBAAgB,CAAC,EAAE,KAAK,GACpD,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,MAAM,WAAb,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAClB,SAAA,EAAU,GAAG,GAAY,EAAS,CAAQ,EAAE,iCAAmC,IAC/E,CAAA,GACH,EAAA,EAAA,IAAA,CAAC,EAAD,CAA0B,UAAW,CAAA,CAChC,GAEX,CCLA,SAAgB,IAAkB,CAChC,GAAM,CAAE,aAAY,MAAK,SAAU,EAAc,EAEjD,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,MAAO,kBAAgB,OAC/C,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,WAAY,SAAA,UAAY,CAAA,CACxC,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OACrB,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAA6B,aAAY,SAAU,EAAK,QAAS,CAAQ,CAAA,GACzE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAoB,CAAA,GACpB,EAAA,EAAA,IAAA,CAAC,GAAD,CAAuB,CAAA,GACvB,EAAA,EAAA,IAAA,CAAC,GAAD,CAAkB,CAAA,GAClB,EAAA,EAAA,IAAA,CAAC,GAAD,CAAiB,CAAA,GACjB,EAAA,EAAA,IAAA,CAAC,GAAD,CAAkB,CAAA,GAClB,EAAA,EAAA,IAAA,CAAC,GAAD,CAAa,CAAA,CACV,GACF,CAAA,CACF,GAET"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SessionSearch-UHtt7a8f.js","assets/context-queries-_9bFWb9v.js","assets/verse-store-DNVRuiJL.js","assets/transient-events-nTLhMBND.js","assets/context-model-Bb15chFt.js","assets/use-token-gate-DSNIIpI6.js","assets/context.module-BijAfoJw.js","assets/global-BlI2BYa1.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.css","assets/context-DiToyj6s.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{a as e,c as t,n,t as r}from"./index-CyK31YRm.js";import{i,m as a}from"./global-y_exIyAP.js";import{t as o}from"./Dialog-BRd_B9OE.js";import{t as s}from"./RefreshIndicator-SEFZlMB2.js";import{E as c,_ as l,_n as u,g as d,in as f,l as p,s as m,y as h}from"./VerseConsoleApp-DXDv1aOi.js";import{_ as ee,b as g,l as _,v}from"./verse-model-JTuvRBVK.js";import{n as y}from"./seat-subscription-BhUUz7VL.js";import{_ as te,c as b,f as x,g as S,h as C,i as w,l as T,n as E,r as D,t as O,v as k}from"./workspace-model-D-SLfads.js";import{n as ne,t as A}from"./folder-picker-C8zo3A56.js";import{t as j}from"./Button-DtE0rlWD.js";import{t as M}from"./ActionMenu-Dwjk6rUQ.js";import{a as N,c as P,d as F,o as I,s as L,t as R,u as z}from"./dock-icons-Cc43W7r4.js";import{n as B,r as V,t as H}from"./sidebar-model-Dcd437cf.js";import{a as U,c as W,u as G}from"./verse-icons-DsG1dOQx.js";import{a as K}from"./command-catalog-ffCAijVY.js";var q=t(e(),1),J={width:`_width_ifku5_4`,form:`_form_ifku5_6`,field:`_field_ifku5_7`,label:`_label_ifku5_8`,select:`_select_ifku5_17`,input:`_input_ifku5_18`,hint:`_hint_ifku5_38`,error:`_error_ifku5_39`,rootRow:`_rootRow_ifku5_49`,rowButton:`_rowButton_ifku5_58`,addRoot:`_addRoot_ifku5_59`,checkbox:`_checkbox_ifku5_76`,priorityRow:`_priorityRow_ifku5_84`,priorityPath:`_priorityPath_ifku5_90`,actions:`_actions_ifku5_101`,spacer:`_spacer_ifku5_102`,confirm:`_confirm_ifku5_103`,cancel:`_cancel_ifku5_105`,save:`_save_ifku5_106`,remove:`_remove_ifku5_107`,danger:`_danger_ifku5_108`},Y=n();function X(e){let{open:t,workspace:n,initialRoots:r,priorities:i,focusSectionId:a=null,onClose:s,onSaved:c,onDeleted:u}=e,f=(0,q.useId)(),g=(0,q.useId)(),[_,v]=(0,q.useState)(``),[y,S]=(0,q.useState)([``]),[k,j]=(0,q.useState)(!1),[M,N]=(0,q.useState)(!1),[P,F]=(0,q.useState)({}),[I,L]=(0,q.useState)(!1),[R,z]=(0,q.useState)(!1),[B,V]=(0,q.useState)(null);(0,q.useEffect)(()=>{if(!t)return;let e=n;v(e?.name??``),S(e?te(e):[...r??[]].filter(e=>e.length>0)),j(e?.section??!1),N(e!==null&&a===e.id),F({}),L(!1),z(!1),V(null)},[t]);let H=y.length===0?[``]:y,U=A();function W(e,t){S(H.map((n,r)=>r===e?t:n))}async function G(e){let t=await ne();t!==null&&t.length>0&&W(e,t)}function K(e){return P[e]??T(e,i)}async function X(e){e.preventDefault();let t=C(_,H);if(!t.ok){V(t.error);return}z(!0),V(null);try{let e=n===null?await m({name:t.name,roots:t.roots,section:k}):await h(n.id,{name:t.name,roots:t.roots,section:k});for(let e of t.roots){let t=P[e];t!==void 0&&t!==T(e,i)&&await l(e,t)}let r=n!==null&&a===n.id;k&&M!==r&&await d(M?e.id:null),c?.(e),s()}catch(e){V(e instanceof Error?e.message:String(e))}finally{z(!1)}}async function Z(){if(n!==null){z(!0),V(null);try{await p(n.id),u?.(n.id),s()}catch(e){V(e instanceof Error?e.message:String(e)),z(!1)}}}return(0,Y.jsx)(o,{open:t,onClose:s,titleId:f,title:n===null?`Save a project`:`Edit project`,description:`Saved projects stay in the picker — they do not need a chat on them first.`,widthClassName:J.width,children:(0,Y.jsxs)(`form`,{className:J.form,onSubmit:e=>void X(e),noValidate:!0,children:[(0,Y.jsxs)(`label`,{className:J.field,htmlFor:g,children:[(0,Y.jsx)(`span`,{className:J.label,children:`Name`}),(0,Y.jsx)(`input`,{id:g,className:J.input,value:_,onChange:e=>v(e.target.value),placeholder:`Defaults to the folder’s own name`,maxLength:120,autoComplete:`off`})]}),(0,Y.jsxs)(`div`,{className:J.field,children:[(0,Y.jsx)(`span`,{className:J.label,children:`Folders`}),(0,Y.jsx)(`p`,{className:J.hint,children:`The first folder is the primary: it is the chat’s working directory. Move a folder to the top to make it the primary.`}),H.map((e,t)=>(0,Y.jsxs)(`div`,{className:J.rootRow,children:[(0,Y.jsx)(`input`,{className:J.input,value:e,title:e||void 0,onChange:e=>W(t,e.target.value),placeholder:`/absolute/path/to/folder`,"aria-label":x(t),autoComplete:`off`,spellCheck:!1}),U?(0,Y.jsx)(`button`,{type:`button`,className:J.rowButton,onClick:()=>void G(t),"aria-label":`Choose ${x(t).toLowerCase()}`,children:`Choose folder…`}):null,(0,Y.jsx)(`button`,{type:`button`,className:J.rowButton,disabled:t===0,onClick:()=>S(b(H,t,`up`)),"aria-label":`Move ${x(t).toLowerCase()} up`,title:`Move ${x(t).toLowerCase()} up`,children:(0,Y.jsx)(`span`,{"aria-hidden":`true`,children:`↑`})}),(0,Y.jsx)(`button`,{type:`button`,className:J.rowButton,disabled:t===H.length-1,onClick:()=>S(b(H,t,`down`)),"aria-label":`Move ${x(t).toLowerCase()} down`,title:`Move ${x(t).toLowerCase()} down`,children:(0,Y.jsx)(`span`,{"aria-hidden":`true`,children:`↓`})}),(0,Y.jsx)(`button`,{type:`button`,className:J.rowButton,disabled:H.length===1,onClick:()=>S(H.filter((e,n)=>n!==t)),"aria-label":`Remove ${x(t).toLowerCase()}`,children:`Remove`})]},t)),H.length<8?(0,Y.jsx)(`button`,{type:`button`,className:J.addRoot,onClick:()=>S([...H,``]),children:`Add a folder`}):null,H.length>1?(0,Y.jsx)(`p`,{className:J.hint,children:O}):null]}),(0,Y.jsxs)(`div`,{className:J.field,children:[(0,Y.jsxs)(`label`,{className:J.checkbox,children:[(0,Y.jsx)(`input`,{type:`checkbox`,checked:k,onChange:e=>j(e.target.checked)}),(0,Y.jsx)(`span`,{children:`Offer this project to the autonomous lane as a section`})]}),k?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`label`,{className:J.checkbox,children:[(0,Y.jsx)(`input`,{type:`checkbox`,checked:M,onChange:e=>N(e.target.checked)}),(0,Y.jsx)(`span`,{children:`Focus the fleet on this section`})]}),(0,Y.jsx)(`p`,{className:J.hint,children:D}),H.filter(e=>e.trim().length>0).map((e,t)=>(0,Y.jsxs)(`div`,{className:J.priorityRow,children:[(0,Y.jsx)(`span`,{className:J.priorityPath,title:e,children:ee(e.trim())}),(0,Y.jsx)(`select`,{className:J.select,"aria-label":`Priority for ${e}`,value:K(e.trim()),onChange:t=>F({...P,[e.trim()]:t.target.value}),children:w.map(e=>(0,Y.jsx)(`option`,{value:e,children:E[e]},e))})]},`${e}-${t}`))]}):null]}),B?(0,Y.jsx)(`p`,{role:`alert`,className:J.error,children:B}):null,(0,Y.jsxs)(`div`,{className:J.actions,children:[n===null?null:I?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`span`,{className:J.confirm,children:`Forget this project? Chats already on it are untouched.`}),(0,Y.jsx)(`button`,{type:`button`,className:J.danger,onClick:()=>void Z(),disabled:R,children:`Forget`}),(0,Y.jsx)(`button`,{type:`button`,className:J.cancel,onClick:()=>L(!1),children:`Keep`})]}):(0,Y.jsx)(`button`,{type:`button`,className:J.remove,onClick:()=>L(!0),disabled:R,children:`Forget project`}),(0,Y.jsx)(`span`,{className:J.spacer}),(0,Y.jsx)(`button`,{type:`button`,className:J.cancel,onClick:s,children:`Cancel`}),(0,Y.jsx)(`button`,{type:`submit`,className:J.save,disabled:R,children:R?`Saving…`:`Save project`})]})]})})}var Z={projects:`_projects_izay2_4`,head:`_head_izay2_10`,headText:`_headText_izay2_23`,add:`_add_izay2_25`,list:`_list_izay2_39`,project:`_project_izay2_4`,name:`_name_izay2_55`,summary:`_summary_izay2_64`,empty:`_empty_izay2_72`};function re(){let e=a(c),t=e.data?.workspaces??[],[n,r]=(0,q.useState)({open:!1,workspace:null});return(0,Y.jsxs)(`section`,{className:Z.projects,"aria-label":`Saved projects`,children:[(0,Y.jsxs)(`h2`,{className:Z.head,children:[(0,Y.jsx)(`span`,{className:Z.headText,children:`Projects`}),(0,Y.jsx)(`button`,{type:`button`,className:Z.add,title:`Save a project`,"aria-label":`Save a project`,onClick:()=>r({open:!0,workspace:null}),children:(0,Y.jsx)(U,{})})]}),t.length>0?(0,Y.jsx)(`ul`,{className:Z.list,children:t.map(e=>{let t=S(e)??``;return(0,Y.jsx)(`li`,{children:(0,Y.jsxs)(`button`,{type:`button`,className:Z.project,title:t?`${e.name}\n${t}`:e.name,"aria-label":`Edit project ${e.name}`,onClick:()=>r({open:!0,workspace:e}),children:[(0,Y.jsx)(`span`,{className:Z.name,children:e.name}),(0,Y.jsx)(`span`,{className:Z.summary,children:k(e)})]})},e.id)})}):e.status===`error`?null:(0,Y.jsx)(`p`,{className:Z.empty,children:`No saved projects yet. Press + to keep a folder you work in.`}),(0,Y.jsx)(X,{open:n.open,workspace:n.workspace,priorities:e.data?.priorities,focusSectionId:e.data?.focusSectionId??null,onClose:()=>r({open:!1,workspace:null})})]})}var Q={sidebar:`_sidebar_3wi59_1`,head:`_head_3wi59_9`,headDragStrip:`_headDragStrip_3wi59_40`,search:`_search_3wi59_51`,searchIcon:`_searchIcon_3wi59_58`,iconButton:`_iconButton_3wi59_80`,scroll:`_scroll_3wi59_98`,skeleton:`_skeleton_3wi59_105`,error:`_error_3wi59_106`,empty:`_empty_3wi59_125`,emptyTitle:`_emptyTitle_3wi59_131`,emptyCompact:`_emptyCompact_3wi59_135`,emptyAction:`_emptyAction_3wi59_138`,emptyKey:`_emptyKey_3wi59_153`,group:`_group_3wi59_163`,groupTitle:`_groupTitle_3wi59_167`,groupName:`_groupName_3wi59_177`,enrolled:`_enrolled_3wi59_178`,groupCount:`_groupCount_3wi59_182`,list:`_list_3wi59_192`,session:`_session_3wi59_195`,marker:`_marker_3wi59_247`,"engine-claude":`_engine-claude_3wi59_253`,"engine-codex":`_engine-codex_3wi59_254`,"engine-grok":`_engine-grok_3wi59_255`,"engine-local":`_engine-local_3wi59_256`,sessionText:`_sessionText_3wi59_195`,running:`_running_3wi59_267`,"verse-pulse":`_verse-pulse_3wi59_1`,errored:`_errored_3wi59_274`,seatSpent:`_seatSpent_3wi59_291`,time:`_time_3wi59_304`,footer:`_footer_3wi59_325`,footerButton:`_footerButton_3wi59_332`,confirmActions:`_confirmActions_3wi59_345`,filters:`_filters_3wi59_362`,filter:`_filter_3wi59_362`,filterCount:`_filterCount_3wi59_391`,groupToggle:`_groupToggle_3wi59_400`,twist:`_twist_3wi59_416`,row:`_row_3wi59_428`,sessionBody:`_sessionBody_3wi59_431`,liveLine:`_liveLine_3wi59_437`,statusRunning:`_statusRunning_3wi59_449`,elapsed:`_elapsed_3wi59_454`,unread:`_unread_3wi59_460`,rowMore:`_rowMore_3wi59_469`,renameRow:`_renameRow_3wi59_495`,renameInput:`_renameInput_3wi59_496`},ie=new Map,ae=(0,q.lazy)(()=>r(()=>import(`./SessionSearch-UHtt7a8f.js`).then(e=>({default:e.SessionSearch})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])));function oe(e){let{sessions:t,sessionsStatus:n,sessionsError:r,projects:a,seats:c,selectedId:l,query:d,onQuery:p,onSelect:m,onNew:h,onRetry:ee,onCollapse:g,onDisconnect:_,activity:v=null,meta:y=null,metaError:te=null,localSeen:b=ie,actions:x}=e,S=(0,q.useId)(),C=K(`chat.new`)?.keys[0],w=K(`chat.sidebar`)?.keys[0],T=C?u(C):null,E=w?u(w):null,[D,O]=(0,q.useState)(`all`),[k,ne]=(0,q.useState)(!1),[A,N]=(0,q.useState)(null),[P,F]=(0,q.useState)(null),[I,L]=(0,q.useState)(!1),R=(0,q.useId)(),z=(0,q.useRef)(null),B=(0,q.useMemo)(()=>V({sessions:t,projects:a,query:d,filter:D,activity:v,meta:y,localSeen:b,selectedId:l}),[t,a,d,D,v,y,b,l]),H=n===`loading`||n===`idle`&&t.length===0,J=d.trim().length>0,X=(0,q.useRef)(null);function Z(e){if(e.key!==`ArrowDown`)return;let t=X.current?.querySelector($);t&&(e.preventDefault(),t.focus())}function oe(e,t,n){x&&F({row:e,anchor:t,from:n})}return(0,Y.jsxs)(`nav`,{className:Q.sidebar,"aria-label":`Chats`,children:[(0,Y.jsxs)(`div`,{className:Q.head,children:[(0,Y.jsx)(`div`,{className:Q.headDragStrip,"aria-hidden":`true`}),(0,Y.jsxs)(`label`,{className:Q.search,htmlFor:S,children:[(0,Y.jsx)(`span`,{className:Q.searchIcon,"aria-hidden":`true`,children:(0,Y.jsx)(W,{})}),(0,Y.jsx)(`span`,{className:`visually-hidden`,children:`Search chats and messages`}),(0,Y.jsx)(`input`,{id:S,type:`search`,value:d,placeholder:`Search chats`,autoComplete:`off`,onChange:e=>p(e.target.value),onKeyDown:Z})]}),(0,Y.jsx)(f,{label:`New chat`,shortcut:T??void 0,placement:`bottom`,children:(0,Y.jsx)(`button`,{type:`button`,className:Q.iconButton,onClick:h,"aria-label":`New chat`,children:(0,Y.jsx)(U,{})})}),(0,Y.jsx)(f,{label:`Hide chat list`,shortcut:E??void 0,placement:`bottom`,children:(0,Y.jsx)(`button`,{type:`button`,className:Q.iconButton,onClick:g,"aria-label":`Hide chat list`,children:(0,Y.jsx)(G,{})})}),n===`refreshing`?(0,Y.jsx)(s,{label:`Refreshing chats`}):null]}),(0,Y.jsx)(ue,{value:D,counts:B.counts,onChange:O}),(0,Y.jsxs)(`div`,{ref:X,className:Q.scroll,onKeyDown:se,children:[(0,Y.jsx)(re,{}),H?(0,Y.jsxs)(`div`,{className:Q.skeleton,"aria-busy":`true`,children:[(0,Y.jsx)(i,{width:`48%`}),(0,Y.jsx)(i,{width:`86%`}),(0,Y.jsx)(i,{width:`74%`}),(0,Y.jsx)(i,{width:`40%`}),(0,Y.jsx)(i,{width:`80%`})]}):n===`error`&&t.length===0?(0,Y.jsxs)(`div`,{role:`alert`,className:Q.error,children:[(0,Y.jsx)(`p`,{children:r??`Could not load chats.`}),(0,Y.jsx)(`button`,{type:`button`,onClick:ee,children:`Retry`})]}):B.groups.length===0?(0,Y.jsx)(de,{query:d,filter:D,hasSessions:t.length>0,newChatHint:T,onClearQuery:()=>p(``),onClearFilter:()=>O(`all`),onNew:h}):B.groups.map(e=>(0,Y.jsx)(fe,{group:e,seats:c,selectedId:l,renaming:A,open:e.kind!==`archived`||k||J||D!==`all`,onToggle:e.kind===`archived`?()=>ne(e=>!e):void 0,onSelect:m,onMenu:x?oe:void 0,onRenameDone:async(e,t)=>{N(null),x&&t&&t!==e.session.title&&await x.rename(e.session.id,t)}},e.id)),J?(0,Y.jsx)(q.Suspense,{fallback:null,children:(0,Y.jsx)(ae,{query:d,onOpenSession:m,selectedId:l})}):null]}),(0,Y.jsx)(`footer`,{className:Q.footer,children:(0,Y.jsx)(f,{label:`Signs this window out: clears cached chats and unsent drafts here. Chats stay on the hub.`,placement:`top`,children:(0,Y.jsx)(`button`,{type:`button`,onClick:()=>L(!0),className:Q.footerButton,"aria-haspopup":`dialog`,children:`Disconnect from hub`})})}),(0,Y.jsx)(o,{open:I,onClose:()=>L(!1),titleId:R,title:`Disconnect from this hub?`,initialFocusRef:z,description:`Unsent drafts in open chats will be cleared. Your chats stay on the hub; you will need the read token to reconnect.`,children:(0,Y.jsxs)(`div`,{className:Q.confirmActions,children:[(0,Y.jsx)(j,{ref:z,variant:`subtle`,onClick:()=>L(!1),children:`Cancel`}),(0,Y.jsx)(j,{variant:`danger`,onClick:()=>{L(!1),_()},children:`Disconnect`})]})}),P&&x?(0,Y.jsx)(M,{label:`Actions for ${P.row.session.title||`Untitled chat`}`,anchor:P.anchor,returnFocus:P.from,onClose:()=>F(null),items:le(P.row,x,B.metaAvailable,te,()=>N(P.row.session.id))}):null]})}var $=`[data-focus-key^="verse-session:"]`;function se(e){if(e.altKey||e.metaKey||e.ctrlKey||e.shiftKey)return;let t=e.target;if(!t.matches($))return;let n=[...e.currentTarget.querySelectorAll($)],r=n.indexOf(t),i;if(e.key===`ArrowDown`)i=n[r+1];else if(e.key===`ArrowUp`)i=n[r-1];else if(e.key===`Home`)i=n[0];else if(e.key===`End`)i=n[n.length-1];else return;e.preventDefault(),i?.focus()}function ce(e){switch(e.kind){case`running`:return`Running`;case`failed`:return`Last turn failed`;case`unread`:return`${e.newTurns} new turn${e.newTurns===1?``:`s`}`;default:return null}}function le(e,t,n,r,i){let a=e.session.id,o=e.status.kind===`running`,s=t.dispatchEnabled?null:`This server was started without dispatch.`,c=s??(n?null:r?`Pins and archive unavailable. ${r}`:`Not available on this server yet.`);return[{id:`pin`,label:e.pinned?`Unpin`:`Pin`,icon:(0,Y.jsx)(L,{size:14}),disabled:c!==null,reason:c,onSelect:()=>t.setPinned(a,!e.pinned)},{id:`archive`,label:e.archived?`Unarchive`:`Archive`,icon:(0,Y.jsx)(R,{size:14}),disabled:c!==null,reason:c,onSelect:()=>t.setArchived(a,!e.archived)},{id:`rename`,label:`Rename`,icon:(0,Y.jsx)(P,{size:14}),disabled:s!==null,reason:s,onSelect:i},{id:`handoff`,label:`Continue in a fresh chat…`,icon:(0,Y.jsx)(N,{size:14}),disabled:s!==null||o,reason:s??(o?`Available when its turn finishes.`:null),onSelect:()=>t.handoff(a)},{id:`delete`,label:`Delete…`,icon:(0,Y.jsx)(z,{size:14}),danger:!0,separated:!0,disabled:s!==null||o,reason:s??(o?`Stop its turn before deleting.`:null),onSelect:()=>t.requestDelete(a)}]}function ue({value:e,counts:t,onChange:n}){let r=(0,q.useRef)(new Map);function i(t){let i=H.indexOf(e),a;t.key===`ArrowRight`||t.key===`ArrowDown`?a=H[(i+1)%H.length]:t.key===`ArrowLeft`||t.key===`ArrowUp`?a=H[(i-1+H.length)%H.length]:t.key===`Home`?a=H[0]:t.key===`End`&&(a=H[H.length-1]),a&&(t.preventDefault(),n(a),r.current.get(a)?.focus())}return(0,Y.jsx)(`div`,{className:Q.filters,role:`radiogroup`,"aria-label":`Show chats`,onKeyDown:i,children:H.map(i=>{let a=t[i],o=i===e;return(0,Y.jsxs)(`button`,{ref:e=>{e?r.current.set(i,e):r.current.delete(i)},type:`button`,role:`radio`,"aria-checked":o,tabIndex:o?0:-1,className:Q.filter,"data-filter":i,onClick:()=>n(i),children:[B[i],i!==`all`&&a>0?(0,Y.jsx)(`span`,{className:Q.filterCount,children:a}):null]},i)})})}function de({query:e,filter:t,hasSessions:n,newChatHint:r,onClearQuery:i,onClearFilter:a,onNew:o}){if(e.trim())return(0,Y.jsxs)(`div`,{className:`${Q.empty} ${Q.emptyCompact}`,children:[(0,Y.jsxs)(`p`,{className:Q.emptyTitle,children:[`No chat titles match “`,e,`”`]}),(0,Y.jsx)(`p`,{children:`Titles and projects match as you type. Chats whose messages match, if any, are listed below.`}),(0,Y.jsx)(`button`,{type:`button`,className:Q.emptyAction,onClick:i,children:`Clear search`})]});if(t!==`all`&&n){let e=t===`running`?`No chat is running`:t===`needs-you`?`Nothing needs you`:`No pinned chats`;return(0,Y.jsxs)(`div`,{className:`${Q.empty} ${Q.emptyCompact}`,children:[(0,Y.jsx)(`p`,{className:Q.emptyTitle,children:e}),t===`pinned`?(0,Y.jsx)(`p`,{children:`Pin a chat from its row menu — hover it, or right-click.`}):null,(0,Y.jsx)(`button`,{type:`button`,className:Q.emptyAction,onClick:a,children:`Show all chats`})]})}return(0,Y.jsxs)(`div`,{className:Q.empty,children:[(0,Y.jsx)(`p`,{className:Q.emptyTitle,children:`No chats yet`}),(0,Y.jsx)(`p`,{children:`Start one on any project with any seat.`}),(0,Y.jsxs)(`button`,{type:`button`,className:Q.emptyAction,onClick:o,children:[`Start your first chat `,r?(0,Y.jsx)(`kbd`,{className:Q.emptyKey,children:r}):null]})]})}function fe({group:e,seats:t,selectedId:n,renaming:r,open:i,onToggle:a,onSelect:o,onMenu:s,onRenameDone:c}){let l=(0,q.useId)();return(0,Y.jsxs)(`section`,{className:Q.group,"aria-label":e.label,"data-group":e.kind,children:[(0,Y.jsxs)(`h2`,{className:Q.groupTitle,title:e.projectPath??void 0,children:[a?(0,Y.jsxs)(`button`,{type:`button`,className:Q.groupToggle,"aria-expanded":i,"aria-controls":l,onClick:a,children:[(0,Y.jsx)(`span`,{className:Q.twist,"data-open":i||void 0,"aria-hidden":`true`}),(0,Y.jsx)(`span`,{className:Q.groupName,children:e.label})]}):(0,Y.jsx)(`span`,{className:Q.groupName,children:e.label}),e.enrolled?(0,Y.jsx)(`span`,{className:Q.enrolled,children:`enrolled`}):null,(0,Y.jsx)(`span`,{className:Q.groupCount,"aria-hidden":`true`,children:e.rows.length})]}),(0,Y.jsx)(`ul`,{id:l,className:Q.list,hidden:!i,children:i?e.rows.map(e=>(0,Y.jsx)(`li`,{children:r===e.session.id?(0,Y.jsx)(he,{row:e,onDone:t=>{c(e,t)}}):(0,Y.jsx)(pe,{row:e,seats:t,selected:e.session.id===n,onSelect:o,onMenu:s})},e.session.id)):null})]})}function pe({row:e,seats:t,selected:n,onSelect:r,onMenu:i}){let{session:a,status:o}=e,s=v(t,a.seatId),c=s===void 0?null:y(s),l=o.kind===`running`&&c?.cls===`blocked`,u=[a.title||`Untitled chat`,g(t,a),c===null||c.cls===`ready`||c.cls===`unread`?null:c.summary,ce(o)].filter(e=>e!==null).join(` · `),d=(0,q.useRef)(null);function p(t){i&&(t.preventDefault(),i(e,{x:t.clientX,y:t.clientY},t.currentTarget))}function m(t){if(i&&(t.key===`ContextMenu`||t.key===`F10`&&t.shiftKey)){t.preventDefault();let n=t.currentTarget.getBoundingClientRect();i(e,{x:n.left+24,y:n.bottom},t.currentTarget)}}return(0,Y.jsxs)(`div`,{className:Q.row,"data-selected":n||void 0,children:[(0,Y.jsx)(f,{label:u,placement:`right`,children:(0,Y.jsxs)(`button`,{ref:d,type:`button`,className:`${Q.session} ${Q[`engine-${a.engine}`]??``}`,"aria-current":n?`true`:void 0,"data-focus-key":`verse-session:${a.id}`,"data-engine":a.engine,"data-status":o.kind,"aria-haspopup":i?`menu`:void 0,"aria-keyshortcuts":i?`Shift+F10`:void 0,onClick:()=>r(a.id),onContextMenu:p,onKeyDown:m,children:[(0,Y.jsx)(`span`,{className:Q.marker,"aria-hidden":`true`}),(0,Y.jsxs)(`span`,{className:Q.sessionBody,children:[(0,Y.jsx)(`span`,{className:Q.sessionText,children:a.title||`Untitled chat`}),e.live?(0,Y.jsx)(`span`,{className:Q.liveLine,title:e.live.text,children:e.live.text}):null]}),l&&c!==null?(0,Y.jsx)(`span`,{className:Q.seatSpent,role:`img`,"aria-label":`Seat limit reached: ${c.summary}`,children:`▮`}):null,(0,Y.jsx)(me,{row:e})]})}),i?(0,Y.jsx)(`button`,{type:`button`,className:Q.rowMore,tabIndex:-1,"aria-hidden":`true`,title:`Chat actions`,onClick:t=>{let n=t.currentTarget.getBoundingClientRect();i(e,{x:n.right-220,y:n.bottom+4},d.current??t.currentTarget)},children:(0,Y.jsx)(I,{size:14})}):null]})}function me({row:e}){let{status:t,session:n}=e,r=ce(t)??void 0;switch(t.kind){case`running`:return(0,Y.jsxs)(`span`,{className:Q.statusRunning,children:[(0,Y.jsx)(`span`,{className:Q.running,role:`img`,"aria-label":r}),t.startedAt?(0,Y.jsx)(F,{className:Q.elapsed,since:t.startedAt}):null]});case`failed`:return(0,Y.jsx)(`span`,{className:Q.errored,role:`img`,"aria-label":r,children:`!`});case`unread`:return(0,Y.jsx)(`span`,{className:Q.unread,role:`img`,"aria-label":r});default:return(0,Y.jsx)(`time`,{className:Q.time,dateTime:n.updatedAt,children:_(n.updatedAt)})}}function he({row:e,onDone:t}){let[n,r]=(0,q.useState)(e.session.title),i=(0,q.useRef)(null),a=(0,q.useRef)(!1);(0,q.useEffect)(()=>{i.current?.focus(),i.current?.select()},[]);let o=e=>{a.current||(a.current=!0,t(e.trim()))};return(0,Y.jsx)(`div`,{className:`${Q.row} ${Q.renameRow}`,children:(0,Y.jsx)(`input`,{ref:i,className:Q.renameInput,value:n,maxLength:120,"aria-label":`Chat title`,onChange:e=>r(e.target.value),onBlur:()=>o(n),onKeyDown:t=>{t.key===`Enter`?(t.preventDefault(),o(n)):t.key===`Escape`&&(t.preventDefault(),o(e.session.title))}})})}export{oe as Sidebar};
|
|
3
|
-
//# sourceMappingURL=Sidebar-C9YtBYVZ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._tile_lsnkj_1{gap:var(--space-1);min-width:0;padding:var(--card-pad,var(--space-4));border-radius:var(--radius-lg);border:1px solid var(--border-subtle);background:var(--bg-surface);box-shadow:inset 0 1px 0 var(--hairline-lift,transparent);flex-direction:column;display:flex}._label_lsnkj_15{font-family:var(--font-display);font-size:var(--text-2xs-size);line-height:var(--text-2xs-line);color:var(--text-tertiary);text-transform:uppercase;letter-spacing:var(--tracking-label)}._value_lsnkj_25{font-family:var(--font-ui);font-size:var(--text-2xl-size);line-height:var(--text-2xl-line);font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums;color:var(--text-primary);overflow-wrap:anywhere}._trend_lsnkj_36{line-height:0;display:block}._meta_lsnkj_41{align-items:baseline;gap:var(--space-1) var(--space-2);flex-wrap:wrap;display:flex}._delta_lsnkj_48{font-size:var(--text-xs-size);line-height:var(--text-xs-line);font-variant-numeric:tabular-nums}._deltaGood_lsnkj_54{color:var(--status-success-fg)}._deltaBad_lsnkj_58{color:var(--status-danger-fg)}._deltaNeutral_lsnkj_62{color:var(--text-tertiary)}._caption_lsnkj_66{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary)}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./index-CyK31YRm.js";import{i as t}from"./format-DKrNjdwD.js";import{n}from"./Swimlane-LrslsGxw.js";var r={tile:`_tile_lsnkj_1`,label:`_label_lsnkj_15`,value:`_value_lsnkj_25`,trend:`_trend_lsnkj_36`,meta:`_meta_lsnkj_41`,delta:`_delta_lsnkj_48`,deltaGood:`_deltaGood_lsnkj_54`,deltaBad:`_deltaBad_lsnkj_58`,deltaNeutral:`_deltaNeutral_lsnkj_62`,caption:`_caption_lsnkj_66`},i=e();function a(e){return[e.format?e.format(e.value):t(e.value),e.unit,e.versus].filter(e=>e!==void 0&&e!==``).join(` `)}function o({label:e,value:t,caption:o,delta:s,trend:c,trendLabel:l,describeTrend:u}){let d=s==null||s.goodWhenPositive===void 0||s.value===0?r.deltaNeutral:s.value>0===s.goodWhenPositive?r.deltaGood:r.deltaBad;return(0,i.jsxs)(`div`,{className:r.tile,"data-stat-tile":``,children:[(0,i.jsx)(`span`,{className:r.label,children:e}),(0,i.jsx)(`span`,{className:r.value,children:t}),c?(0,i.jsx)(`span`,{className:r.trend,children:(0,i.jsx)(n,{points:c,width:112,height:24,area:!0,ariaLabel:l??`${e} trend`,describe:u})}):null,s||o?(0,i.jsxs)(`div`,{className:r.meta,children:[s?(0,i.jsx)(`span`,{className:`${r.delta} ${d}`,children:a(s)}):null,o?(0,i.jsx)(`span`,{className:r.caption,children:o}):null]}):null]})}export{o as t};
|
|
2
|
-
//# sourceMappingURL=StatTile-CTX41O6y.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StatTile-CTX41O6y.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/StatTile.module.css","../../../../../../src/web-ui/components/charts/StatTile.tsx"],"sourcesContent":[".tile {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n padding: var(--card-pad, var(--space-4));\n border-radius: var(--radius-lg);\n border: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n /* Dark: a 4% white top hairline lifts the KPI row off the canvas; light:\n the token is transparent and this draws nothing. */\n box-shadow: inset 0 1px 0 var(--hairline-lift, transparent);\n}\n\n.label {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n text-transform: uppercase;\n letter-spacing: var(--tracking-label);\n}\n\n/* KPI number: Plex 600, 24/32, tabular numerals (SPEC-310C §6). */\n.value {\n font-family: var(--font-ui);\n font-size: var(--text-2xl-size);\n line-height: var(--text-2xl-line);\n font-weight: var(--font-weight-semibold);\n font-variant-numeric: tabular-nums;\n color: var(--text-primary);\n overflow-wrap: anywhere;\n}\n\n/* The sparkline sits directly under the number it explains. */\n.trend {\n display: block;\n line-height: 0;\n}\n\n.meta {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: var(--space-1) var(--space-2);\n}\n\n.delta {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-variant-numeric: tabular-nums;\n}\n\n.deltaGood {\n color: var(--status-success-fg);\n}\n\n.deltaBad {\n color: var(--status-danger-fg);\n}\n\n.deltaNeutral {\n color: var(--text-tertiary);\n}\n\n.caption {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n","/**\n * components/charts/StatTile.tsx — value + delta + optional sparkline, the\n * figure contract from marks-and-anatomy.md. Use for a single current value\n * (a one-bar bar chart is never the answer — this is). `value` takes a\n * ReactNode (not just a string) so callers can wrap a sourceQuality-bearing\n * field in <Epistemic/> and pass that straight through.\n *\n * V3.10 (SPEC-310C §6 \"StatTile: sparkline goes under the number; deltas show\n * units\"): the 72×24 sparkline used to float top-right, disconnected from the\n * number it explains; it now sits directly under it. A delta reads as a\n * sentence fragment with its unit and its comparison — \"+5 merges vs prior\n * 7d\", never a bare \"-1\". In dark the tile gets the 4% top hairline\n * (`--hairline-lift`, transparent in light) so a KPI row lifts off the canvas.\n */\nimport type { ReactNode } from 'react';\nimport { formatSignedCompact } from './format.js';\nimport { Sparkline } from './Sparkline.js';\nimport styles from './StatTile.module.css';\n\nexport interface StatTileDelta {\n /** Signed raw value, e.g. +12 or -3. */\n value: number;\n /** Whether a positive delta reads as good (green) or bad (red). Omit for\n * a neutral, non-judgmental delta (e.g. \"goals in flight\" — more isn't\n * inherently good or bad). */\n goodWhenPositive?: boolean;\n /** vs which period, e.g. \"vs prior 7d\". */\n versus?: string;\n /** Unit after the number: \"merges\", \"pts\", \"min\". Plural is the caller's call. */\n unit?: string;\n /** Formats the SIGNED value (default: \"+12\" / \"-3\"). Use for percent points, durations, dollars. */\n format?: (signed: number) => string;\n}\n\n/** \"+5 merges vs prior 7d\" — the whole delta as one readable phrase. */\nexport function deltaText(delta: StatTileDelta): string {\n const n = delta.format ? delta.format(delta.value) : formatSignedCompact(delta.value);\n return [n, delta.unit, delta.versus].filter((part) => part !== undefined && part !== '').join(' ');\n}\n\nexport function StatTile({\n label,\n value,\n caption,\n delta,\n trend,\n trendLabel,\n describeTrend,\n}: {\n label: string;\n value: ReactNode;\n caption?: ReactNode;\n delta?: StatTileDelta | null;\n trend?: (number | null)[];\n trendLabel?: string;\n /** Spoken summary formatter for the sparkline (first → latest, range). */\n describeTrend?: (v: number) => string;\n}) {\n const deltaTone =\n delta == null || delta.goodWhenPositive === undefined\n ? styles.deltaNeutral\n : delta.value === 0\n ? styles.deltaNeutral\n : (delta.value > 0) === delta.goodWhenPositive\n ? styles.deltaGood\n : styles.deltaBad;\n\n return (\n <div className={styles.tile} data-stat-tile=\"\">\n <span className={styles.label}>{label}</span>\n <span className={styles.value}>{value}</span>\n {trend ? (\n <span className={styles.trend}>\n <Sparkline points={trend} width={112} height={24} area ariaLabel={trendLabel ?? `${label} trend`} describe={describeTrend} />\n </span>\n ) : null}\n {delta || caption ? (\n <div className={styles.meta}>\n {delta ? <span className={`${styles.delta} ${deltaTone}`}>{deltaText(delta)}</span> : null}\n {caption ? <span className={styles.caption}>{caption}</span> : null}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"gZCmCA,SAAgB,EAAU,EAA8B,CAEtD,MAAO,CADG,EAAM,OAAS,EAAM,OAAO,EAAM,KAAK,EAAI,EAAoB,EAAM,KAAK,EACzE,EAAM,KAAM,EAAM,MAAM,CAAC,CAAC,OAAQ,GAAS,IAAS,IAAA,IAAa,IAAS,EAAE,CAAC,CAAC,KAAK,GAAG,CACnG,CAEA,SAAgB,EAAS,CACvB,QACA,QACA,UACA,QACA,QACA,aACA,iBAUC,CACD,IAAM,EACJ,GAAS,MAAQ,EAAM,mBAAqB,IAAA,IAExC,EAAM,QAAU,EADhB,EAAO,aAGJ,EAAM,MAAQ,IAAO,EAAM,iBAC1B,EAAO,UACP,EAAO,SAEjB,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,iBAAe,GAA5C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,CAAY,CAAA,GAC5C,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,CAAY,CAAA,EAC3C,GACC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MACtB,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,OAAQ,EAAO,MAAO,IAAK,OAAQ,GAAI,KAAA,GAAK,UAAW,GAAc,GAAG,EAAM,QAAS,SAAU,CAAgB,CAAA,CACxH,CAAA,EACJ,KACH,GAAS,GACR,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,CACG,GAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,GAAG,EAAO,MAAM,GAAG,IAAc,SAAA,EAAU,CAAK,CAAQ,CAAA,EAAI,KACrF,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAU,SAAA,CAAc,CAAA,EAAI,IAC5D,CACH,CAAA,EAAA,IACD,GAET"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,c as t,n}from"./index-CyK31YRm.js";import{D as r,L as i,S as a,T as ee,_ as o,a as te,c as ne,d as s,f as re,h as c,l as ie,m as ae,n as oe,o as se,r as l,s as u,t as ce,u as le,w as d,x as f}from"./ChartFrame-DK_BDXCt.js";import{c as p,i as m,l as h,m as g,n as ue,p as de,r as fe}from"./colors-BZ3a9wFf.js";import{l as pe,n as _,o as v,t as me}from"./format-DKrNjdwD.js";var y=t(e(),1),b=n(),x=8,S=16,C=2,w=28,T=16,E=4,D=[`Mon`,``,`Wed`,``,`Fri`,``,``],O=[``,`Mon`,``,`Wed`,``,`Fri`,``];function k({title:e,description:t,caveat:n,status:r,days:i,weekStart:a=1,width:ee,formatValue:o=me,unit:s=``,ariaLabel:re}){let ie=(0,y.useRef)(null),ae=le(ie,ee),oe=(0,y.useId)(),d=de((0,y.useId)()),p=(0,y.useMemo)(()=>c(i,a),[i,a]),[m,h]=(0,y.useState)(null),ue=Math.max(0,...i.map(e=>e.value??0)),fe=i.some(e=>e.value!==null),pe=r??(i.length===0?{kind:`empty`}:fe?{kind:`ready`}:{kind:`unknown`}),v=ae-w,k=Math.max(1,Math.floor((v+C)/10)),A=Math.min(p.weeks,k),j=p.weeks-A,M=Math.max(x,Math.min(S,Math.floor((v+C)/Math.max(1,A))-C)),N=j,P=p.cells.filter(e=>e.week>=N),F=w+A*(M+C),I=T+7*(M+C),L=e=>w+(e.week-N)*(M+C),R=e=>T+e.weekday*(M+C),z=s?` ${s}`:``,B=e=>`${_(e.day)}: ${e.value===null?`no data`:`${o(e.value)}${z}`}`,V=[];for(let e of p.months){if(e.week<N)continue;let t=V[V.length-1];t&&e.week-t.week<3||V.push(e)}let H=P.filter(e=>!e.outside),U=m===null?void 0:H[m];function he(e){if(H.length===0)return;let t=m??H.length-1,n=e.key===`ArrowLeft`?-7:e.key===`ArrowRight`?7:e.key===`ArrowUp`?-1:e.key===`ArrowDown`?1:null,r=null;n===null?e.key===`Home`?r=0:e.key===`End`&&(r=H.length-1):r=t+n,r!==null&&(e.preventDefault(),h(Math.max(0,Math.min(H.length-1,r))))}let W=i.filter(e=>e.value!==null),ge=W.reduce((e,t)=>e+(t.value??0),0),G=W.reduce((e,t)=>!e||(t.value??0)>(e.value??0)?t:e,null),K=re??`${e}: ${i.length} days, ${o(ge)}${z} in total`+(G&&(G.value??0)>0?`, busiest ${_(G.day)} with ${o(G.value)}`:``)+(i.length-W.length>0?`, ${i.length-W.length} days without data`:``)+`.`,_e=[{key:`day`,label:`Day`,render:e=>_(e.day)},{key:`value`,label:s?s[0].toUpperCase()+s.slice(1):`Value`,numeric:!0,render:e=>e.value===null?`—`:o(e.value)}],ve=(0,b.jsxs)(`div`,{className:u.legend,"aria-hidden":`true`,children:[(0,b.jsx)(`span`,{className:u.legendItem,children:`Less`}),Array.from({length:5},(e,t)=>(0,b.jsx)(`span`,{className:u.swatch,style:{background:g(t)}},t)),(0,b.jsx)(`span`,{className:u.legendItem,children:`More`}),(0,b.jsxs)(`span`,{className:u.legendItem,children:[(0,b.jsx)(`span`,{className:u.swatchHatch}),`no data`]})]});return(0,b.jsx)(ce,{title:e,description:t,caveat:n,status:pe,table:(0,b.jsx)(ne,{caption:e,columns:_e,rows:[...i].sort((e,t)=>e.day.localeCompare(t.day)),rowKey:e=>e.day}),footer:(0,b.jsxs)(b.Fragment,{children:[ve,j>0?(0,b.jsxs)(`p`,{className:u.note,children:[`Showing the latest `,A,` weeks; `,j,` earlier weeks are in the table.`]}):null]}),children:(0,b.jsxs)(`div`,{ref:ie,className:`${u.plotWrap} ${u.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the arrow keys to move between days.`,"aria-describedby":oe,onFocus:()=>h(e=>e??(H.length?H.length-1:null)),onBlur:()=>h(null),onKeyDown:he,children:[(0,b.jsxs)(`svg`,{className:u.svg,width:F,height:I,viewBox:`0 0 ${F} ${I}`,role:`img`,"aria-label":K,children:[(0,b.jsx)(`defs`,{children:(0,b.jsx)(te,{id:d})}),V.map(e=>(0,b.jsx)(`text`,{className:u.tick,x:w+(e.week-N)*(M+C),y:11,children:e.label},`${e.week}${e.label}`)),(a===1?D:O).map((e,t)=>e&&M>=10?(0,b.jsx)(`text`,{className:u.tick,x:0,y:T+t*(M+C)+M/2,dy:`0.32em`,children:e},t):null),P.map(e=>{if(e.outside)return null;let t=f(e.value,ue,E),n=U?.day===e.day;return(0,b.jsx)(`rect`,{"data-day":e.day,"data-bucket":t===null?`unknown`:t,x:L(e),y:R(e),width:M,height:M,rx:2,className:t===null?u.unknownMark:void 0,fill:t===null?`url(#${d})`:g(t),style:n?{stroke:`var(--border-focus)`,strokeWidth:2,strokeDasharray:`none`}:void 0,onPointerEnter:()=>h(H.indexOf(e)),onPointerLeave:()=>h(null)},e.day)})]}),(0,b.jsx)(`span`,{id:oe,className:u.srOnly,"aria-live":`polite`,children:U?B(U):``}),U?(0,b.jsx)(l,{left:se(L(U)+M/2,F,60),top:R(U),title:_(U.day),rows:[{key:`v`,label:s||`Value`,value:U.value===null?null:o(U.value)}]}):null]})})}var A={band:`_band_1rlew_3`,focusRing:`_focusRing_1rlew_8`};function j(e){return e.estimate===null||e.low===null||e.high===null?`unknown`:e.low>0?`positive`:e.high<0?`negative`:`none`}var M={positive:`helped (interval above zero)`,negative:`hurt (interval below zero)`,none:`no clear effect (interval crosses zero)`,unknown:`unknown`};function N(e){return e===`positive`?m:e===`negative`?fe:`var(--text-secondary)`}function P(e,t){return e>0?`+${t(e)}`:t(e)}var F=e=>Math.abs(e)>=10?e.toFixed(0):e.toFixed(1),I=28,L=22,R=12,z=480;function B({title:e,description:t,caveat:n,status:i,rows:a,unit:ee=``,gate:o,formatValue:s,unknownText:c=`not enough pairs yet`,width:ie,ariaLabel:se}){let l=s??F,d=(0,y.useRef)(null),f=le(d,ie),[p,h]=(0,y.useState)(null),g=(0,y.useId)(),pe=de((0,y.useId)()),_=ee?` ${ee}`:``,v=a.filter(e=>j(e)!==`unknown`),me=i??(a.length===0?{kind:`empty`,message:`No experiments have run yet.`}:{kind:`ready`}),x=f<z,S=Math.max(84,Math.min(180,Math.round(f*(x?.3:.26)))),C=x?0:118,w=S+8,T=Math.max(w+40,f-C-R),E=v.flatMap(e=>[e.low,e.high]),D=Math.min(0,o?.value??0,...E),O=Math.max(0,o?.value??0,...E),k=ae(D,O===D?D+1:O,{count:x?3:5,integer:re([...E,o?.value??0]),format:s?e=>e===0?`0`:P(e,s):void 0}),B=k.ticks,V=s?k.labels:k.labels.map((e,t)=>B[t]>0?`+${e}`:e),H=r(B[0],B[B.length-1],w,T),U=a.length*I,he=U+L,W=e=>{let t=j(e);return t===`unknown`?`${e.label}: ${c}`:`${e.label}: ${P(e.estimate,l)}${_}, 95% interval ${P(e.low,l)} to ${P(e.high,l)}; ${M[t]}`},ge=v.filter(e=>j(e)===`positive`).length,G=se??`${e}: ${a.length} experiment${a.length===1?``:`s`}, ${ge} with an interval above zero.`;function K(e){if(a.length===0)return;let t=p??0,n=e.key===`ArrowDown`?t+1:e.key===`ArrowUp`?t-1:e.key===`Home`?0:e.key===`End`?a.length-1:null;n!==null&&(e.preventDefault(),h(Math.max(0,Math.min(a.length-1,n))))}let _e=[{key:`label`,label:`Experiment`,render:e=>e.label},{key:`est`,label:`Estimate${_}`,numeric:!0,render:e=>e.estimate===null?`—`:P(e.estimate,l)},{key:`ci`,label:`95% interval`,numeric:!0,render:e=>e.low===null||e.high===null?`—`:`${P(e.low,l)} to ${P(e.high,l)}`},{key:`n`,label:`Pairs`,numeric:!0,render:e=>e.n===null||e.n===void 0?`—`:String(e.n)},{key:`verdict`,label:`Reading`,render:e=>j(e)===`unknown`?c:M[j(e)]},...a.some(e=>e.detail)?[{key:`detail`,label:`Status`,render:e=>e.detail??``}]:[]],ve=p===null?void 0:a[p],q=Math.floor(S/7);return(0,b.jsx)(ce,{title:e,description:t,caveat:n,status:me,table:(0,b.jsx)(ne,{caption:e,columns:_e,rows:a,rowKey:e=>e.id}),footer:(0,b.jsx)(oe,{min:1,items:[{label:`Helped`,color:m},{label:`Hurt`,color:fe},{label:`No clear effect`,color:`var(--text-secondary)`},...a.length>v.length?[{label:c,kind:`hatch`}]:[]]}),children:(0,b.jsxs)(`div`,{ref:d,className:`${u.plotWrap} ${u.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the up and down arrow keys to read each experiment.`,"aria-describedby":g,onFocus:()=>h(e=>e??(a.length?0:null)),onBlur:()=>h(null),onKeyDown:K,children:[(0,b.jsxs)(`svg`,{className:u.svg,width:f,height:he,viewBox:`0 0 ${f} ${he}`,role:`img`,"aria-label":G,children:[(0,b.jsx)(`defs`,{children:(0,b.jsx)(te,{id:pe})}),B.map((e,t)=>(0,b.jsxs)(`g`,{children:[(0,b.jsx)(`line`,{className:u.grid,x1:H(e),x2:H(e),y1:0,y2:U}),(0,b.jsx)(`text`,{className:u.tick,x:H(e),y:he-6,textAnchor:`middle`,children:V[t]})]},e)),(0,b.jsx)(`line`,{"data-role":`zero`,x1:H(0),x2:H(0),y1:0,y2:U,stroke:ue,strokeWidth:1.5}),o&&o.value!==0?(0,b.jsx)(`g`,{"data-role":`gate`,children:(0,b.jsx)(`line`,{className:u.reference,x1:H(o.value),x2:H(o.value),y1:0,y2:U})}):null,a.map((e,t)=>{let n=t*I+I/2,r=j(e),i=N(r),a=p===t;return(0,b.jsxs)(`g`,{"data-row":e.id,"data-verdict":r,opacity:p!==null&&!a?.55:1,children:[t%2==1?(0,b.jsx)(`rect`,{className:A.band,x:0,y:t*I,width:f,height:I}):null,(0,b.jsx)(`text`,{className:u.label,x:S,y:n,dy:`0.32em`,textAnchor:`end`,children:e.label.length>q?`${e.label.slice(0,q-1)}…`:e.label}),r===`unknown`?(0,b.jsxs)(`g`,{"data-role":`unknown`,children:[(0,b.jsx)(`rect`,{className:u.unknownMark,fill:`url(#${pe})`,x:w+.5,y:n-5,width:Math.max(1,T-w-1),height:10,rx:2}),x?null:(0,b.jsx)(`text`,{className:u.tick,x:f-R,y:n,dy:`0.32em`,textAnchor:`end`,children:c})]}):(0,b.jsxs)(`g`,{children:[(0,b.jsx)(`line`,{"data-role":`ci`,x1:H(e.low),x2:H(e.high),y1:n,y2:n,stroke:i,strokeWidth:2,strokeLinecap:`round`}),(0,b.jsx)(`line`,{x1:H(e.low),x2:H(e.low),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,b.jsx)(`line`,{x1:H(e.high),x2:H(e.high),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,b.jsx)(`rect`,{"data-role":`estimate`,className:u.marker,x:H(e.estimate)-5,y:n-5,width:10,height:10,rx:2,fill:i}),x?null:(0,b.jsxs)(`text`,{className:u.tick,x:f-R,y:n,dy:`0.32em`,textAnchor:`end`,children:[P(e.estimate,l),` [`,P(e.low,l),`, `,P(e.high,l),`]`]})]}),a?(0,b.jsx)(`rect`,{className:A.focusRing,x:1,y:t*I+1,width:f-2,height:26,rx:3}):null]},e.id)})]}),(0,b.jsx)(`span`,{id:g,className:u.srOnly,"aria-live":`polite`,children:ve?W(ve):``})]})})}function V(e,t){let n=[...e].filter(e=>Number.isFinite(e.at)).sort((e,t)=>e.at-t.at);return n.map((e,r)=>({...e,until:Math.max(e.at,r+1<n.length?n[r+1].at:t)}))}var H=18,U=26,he=14,W=864e5,ge=e=>Math.abs(e)>=10?e.toFixed(0):e.toFixed(1);function G(e,t){return e>0?`+${t(e)}`:t(e)}function K({title:e,description:t,caveat:n,status:c,steps:f,markers:m=[],now:g,from:ue,baseline:_,unit:me=``,formatValue:x,formatTime:S,height:C=200,width:w,ariaLabel:T}){let E=x??ge,D=e=>a(e)?(S??v)(e):`—`,O=(0,y.useRef)(null),k=le(O,w),A=ie(),[j,M]=(0,y.useState)(null),N=(0,y.useId)(),P=de((0,y.useId)()),F=me?` ${me}`:``,I=g??Date.now(),L=V(f,I),R=m.filter(e=>a(e.at)),z=L.filter(e=>e.value!==null),B=c??(L.length===0?{kind:`empty`,message:`No versions yet — the compiled defaults are in force.`}:z.length===0?{kind:`unknown`,reason:`no version has a measured value yet.`}:{kind:`ready`}),K=[...L.map(e=>e.at),...R.map(e=>e.at)].filter(a),_e=Math.max(a(I)?I:0,...K,...L.map(e=>e.until).filter(a)),ve=ue!==void 0&&a(ue)?ue:K.length?Math.min(...K):_e-W,[q,ye]=o(ve,_e,s,`end`),be=z.flatMap(e=>[e.value,e.low??e.value,e.high??e.value]),xe=Math.min(_?.value??0,...be),Se=Math.max(_?.value??0,...be),Ce=ae(xe,Se===xe?xe+1:Se,{count:4,integer:re([...be,_?.value??0]),format:x?e=>e===0?`0`:G(e,x):void 0}),we=Ce.ticks,Te=x?Ce.labels:Ce.labels.map((e,t)=>we[t]>0?`+${e}`:e),J=i(Te,30,56,A),Y=Math.max(40,k-J-he),Ee=C-H-U,De=r(q,ye,J,J+Y),X=r(we[0],we[we.length-1],H+Ee,H),Z=e=>Math.min(J+Y,Math.max(J,De(e))),Oe=pe(q,ye,S,[q,ye]),ke=ee([{key:`start`,x:J,anchor:`start`,priority:2,variants:Oe.map(e=>e(q))},{key:`end`,x:J+Y,anchor:`end`,priority:3,variants:Oe.map(e=>e(ye))}],{min:J,max:J+Y,charPx:d(A)}),Ae=[],Q=[],je=null;for(let e of L){if(e.value===null){Q.length&&Ae.push(Q.join(` `)),Q=[],je=null;continue}let t=X(e.value),n=Z(e.at),r=Z(e.until);Q.push(je===null?`M${n.toFixed(1)},${t.toFixed(1)}`:`L${n.toFixed(1)},${t.toFixed(1)}`),Q.push(`L${r.toFixed(1)},${t.toFixed(1)}`),je=t}Q.length&&Ae.push(Q.join(` `));let Me=e=>`${e.label}${e.detail?` (${e.detail})`:``}, ${D(e.at)} to ${D(e.until)}: `+(e.value===null?`not measured`:`${G(e.value,E)}${F}`+(e.low!==null&&e.low!==void 0&&e.high!==null&&e.high!==void 0?`, 95% interval ${G(e.low,E)} to ${G(e.high,E)}`:``)),Ne=z[z.length-1],Pe=R.filter(e=>e.kind===`rollback`).length,Fe=T??`${e}: ${L.length} step${L.length===1?``:`s`}`+(Ne?`, now ${G(Ne.value,E)}${F}`:``)+(Pe?`, ${Pe} rollback${Pe===1?``:`s`}`:``)+`.`;function Ie(e){if(L.length===0)return;let t=j??L.length-1,n=e.key===`ArrowLeft`?t-1:e.key===`ArrowRight`?t+1:e.key===`Home`?0:e.key===`End`?L.length-1:null;n!==null&&(e.preventDefault(),M(Math.max(0,Math.min(L.length-1,n))))}let Le=[...L.map(e=>({id:`s:${e.id}`,when:e.at,what:`${e.label}${e.detail?` · ${e.detail}`:``}`,value:e.value===null?`—`:G(e.value,E),interval:e.low===null||e.low===void 0||e.high===null||e.high===void 0?`—`:`${G(e.low,E)} to ${G(e.high,E)}`})),...R.map(e=>({id:`m:${e.id}`,when:e.at,what:`${e.kind===`rollback`?`▼ Rolled back`:`▲ Adopted`}: ${e.label}`,value:``,interval:``}))].sort((e,t)=>e.when-t.when),Re=[{key:`when`,label:`When`,render:e=>D(e.when)},{key:`what`,label:`Step`,render:e=>e.what},{key:`value`,label:`Level${F}`,numeric:!0,render:e=>e.value},{key:`ci`,label:`95% interval`,numeric:!0,render:e=>e.interval}],$=j===null?void 0:L[j];return(0,b.jsx)(ce,{title:e,description:t,caveat:n,status:B,table:(0,b.jsx)(ne,{caption:e,columns:Re,rows:Le,rowKey:e=>e.id}),footer:(0,b.jsx)(oe,{items:[{label:`Level`,color:p,kind:`line`},{label:`95% interval`,color:h},...Pe?[{label:`▼ rollback`,color:fe}]:[],...L.some(e=>e.value===null)?[{label:`not measured`,kind:`hatch`}]:[]]}),children:(0,b.jsxs)(`div`,{ref:O,className:`${u.plotWrap} ${u.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the left and right arrow keys to read each step.`,"aria-describedby":N,onFocus:()=>M(e=>e??(L.length?L.length-1:null)),onBlur:()=>M(null),onKeyDown:Ie,children:[(0,b.jsxs)(`svg`,{className:u.svg,width:k,height:C,viewBox:`0 0 ${k} ${C}`,role:`img`,"aria-label":Fe,children:[(0,b.jsx)(`defs`,{children:(0,b.jsx)(te,{id:P})}),we.map((e,t)=>(0,b.jsxs)(`g`,{children:[(0,b.jsx)(`line`,{className:u.grid,x1:J,x2:J+Y,y1:X(e),y2:X(e)}),(0,b.jsx)(`text`,{className:u.tick,x:J-6,y:X(e),dy:`0.32em`,textAnchor:`end`,children:Te[t]})]},e)),ke.map(e=>(0,b.jsx)(`text`,{"data-axis-label":e.key,className:u.tick,x:e.x,y:C-8,textAnchor:e.anchor,children:e.text},e.key)),_?(0,b.jsxs)(`g`,{"data-role":`baseline`,children:[(0,b.jsx)(`line`,{className:u.reference,x1:J,x2:J+Y,y1:X(_.value),y2:X(_.value)}),(0,b.jsx)(`text`,{className:`${u.tick} ${u.halo}`,x:J+4,y:X(_.value)-5,children:_.label})]}):null,L.map((e,t)=>{let n=Z(e.at),r=Math.max(n+1,Z(e.until));if(e.value===null)return(0,b.jsx)(`rect`,{"data-step":e.id,"data-unknown":`true`,className:u.unknownMark,fill:`url(#${P})`,x:n,y:H,width:r-n,height:Ee,opacity:.6},e.id);let i=e.low!==null&&e.low!==void 0&&e.high!==null&&e.high!==void 0;return(0,b.jsx)(`g`,{"data-step":e.id,opacity:j!==null&&j!==t?.6:1,children:i?(0,b.jsx)(`rect`,{"data-role":`band`,x:n,y:X(e.high),width:r-n,height:Math.max(1,X(e.low)-X(e.high)),fill:h,opacity:.35}):null},e.id)}),Ae.map((e,t)=>(0,b.jsx)(`path`,{"data-role":`level`,className:u.line,stroke:p,d:e},t)),L.map(e=>e.value===null?null:(0,b.jsx)(`circle`,{className:u.marker,cx:Z(e.at),cy:X(e.value),r:3.5,fill:p},`p${e.id}`)),R.map(e=>{let t=Z(e.at),n=e.kind===`rollback`?`M${t-5},8 L${t+5},8 L${t},16 Z`:`M${t-5},16 L${t+5},16 L${t},8 Z`;return(0,b.jsx)(`path`,{"data-marker":e.kind,d:n,fill:e.kind===`rollback`?fe:p,children:(0,b.jsx)(`title`,{children:`${e.kind===`rollback`?`Rolled back`:`Adopted`}: ${e.label} · ${D(e.at)}`})},e.id)})]}),(0,b.jsx)(`span`,{id:N,className:u.srOnly,"aria-live":`polite`,children:$?Me($):``}),$?(0,b.jsx)(l,{left:se((Z($.at)+Z($.until))/2,k),top:$.value===null?H+Ee/2:X($.high??$.value),title:`${$.label}${$.detail?` · ${$.detail}`:``}`,rows:[{key:`v`,label:`Level`,value:$.value===null?null:`${G($.value,E)}${F}`},{key:`ci`,label:`95% interval`,value:$.low===null||$.low===void 0||$.high===null||$.high===void 0?null:`${G($.low,E)} to ${G($.high,E)}`},{key:`t`,label:`From`,value:D($.at)}]}):null]})})}export{B as n,k as r,K as t};
|
|
2
|
-
//# sourceMappingURL=StepBand-jJTqYIdX.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StepBand-jJTqYIdX.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/CalendarHeatmap.tsx","../../../../../../src/web-ui/components/charts/ForestPlot.module.css","../../../../../../src/web-ui/components/charts/ForestPlot.tsx","../../../../../../src/web-ui/components/charts/StepBand.tsx"],"sourcesContent":["/**\n * components/charts/CalendarHeatmap.tsx — one value per day on a weeks ×\n * weekdays grid (activity by day across months). Sequential: ONE hue, four\n * steps light → dark mixed from the theme's own tokens, with a Less → More\n * key. A TRUE ZERO is the faint step-0 cell; UNKNOWN (null, or a day missing\n * from the data) is the 45° unknown hatch with an outline (V3.10) and its own\n * \"no data\" key entry — the two are never the same colour, and texture keeps\n * them apart under colour-blindness too.\n *\n * Width: the cell size adapts (8–16 px). When even 8 px cells cannot fit the\n * whole span at 375 px, the grid shows the most recent weeks that fit and says\n * how many are hidden; the Table view always has every day.\n *\n * Keyboard: the grid is one tab stop; ← → move a week, ↑ ↓ move a day (rows\n * are weekdays), Home/End jump to the ends; the focused day is announced.\n */\nimport { useId, useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport { hatchPatternId, heatColor } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartTooltip, HatchPattern, clampTooltipLeft } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { calendarGrid, heatBucket, type CalendarCell } from './chart-math.js';\nimport { formatCompact, formatDayLabel } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport plot from './plot.module.css';\n\nexport interface CalendarDatum {\n day: string;\n value: number | null;\n}\n\nexport interface CalendarHeatmapProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n days: CalendarDatum[];\n /** 1 = Monday (ISO, default), 0 = Sunday. */\n weekStart?: 0 | 1;\n width?: number;\n formatValue?: (v: number) => string;\n /** Unit for the spoken/tooltip text, e.g. \"runs\". */\n unit?: string;\n ariaLabel?: string;\n}\n\nconst MIN_CELL = 8;\nconst MAX_CELL = 16;\nconst GAP = 2;\nconst DAY_LABEL_W = 28;\nconst MONTH_H = 16;\nconst STEPS = 4;\nconst WEEKDAYS_MON = ['Mon', '', 'Wed', '', 'Fri', '', ''];\nconst WEEKDAYS_SUN = ['', 'Mon', '', 'Wed', '', 'Fri', ''];\n\nexport function CalendarHeatmap({\n title,\n description,\n caveat,\n status,\n days,\n weekStart = 1,\n width: fixedWidth,\n formatValue = formatCompact,\n unit = '',\n ariaLabel,\n}: CalendarHeatmapProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const grid = useMemo(() => calendarGrid(days, weekStart), [days, weekStart]);\n const [focus, setFocus] = useState<number | null>(null);\n\n const max = Math.max(0, ...days.map((d) => d.value ?? 0));\n const anyKnown = days.some((d) => d.value !== null);\n const resolvedStatus: ChartStatus = status ?? (days.length === 0 ? { kind: 'empty' } : anyKnown ? { kind: 'ready' } : { kind: 'unknown' });\n\n const avail = width - DAY_LABEL_W;\n const fitWeeks = Math.max(1, Math.floor((avail + GAP) / (MIN_CELL + GAP)));\n const shownWeeks = Math.min(grid.weeks, fitWeeks);\n const hiddenWeeks = grid.weeks - shownWeeks;\n const cell = Math.max(MIN_CELL, Math.min(MAX_CELL, Math.floor((avail + GAP) / Math.max(1, shownWeeks)) - GAP));\n const firstWeek = hiddenWeeks;\n const visible = grid.cells.filter((c) => c.week >= firstWeek);\n const svgW = DAY_LABEL_W + shownWeeks * (cell + GAP);\n const svgH = MONTH_H + 7 * (cell + GAP);\n const xOf = (c: CalendarCell) => DAY_LABEL_W + (c.week - firstWeek) * (cell + GAP);\n const yOf = (c: CalendarCell) => MONTH_H + c.weekday * (cell + GAP);\n const unitText = unit ? ` ${unit}` : '';\n const describe = (c: CalendarCell) => `${formatDayLabel(c.day)}: ${c.value === null ? 'no data' : `${formatValue(c.value)}${unitText}`}`;\n\n const monthLabels: { week: number; label: string }[] = [];\n for (const m of grid.months) {\n if (m.week < firstWeek) continue;\n const prev = monthLabels[monthLabels.length - 1];\n if (prev && m.week - prev.week < 3) continue;\n monthLabels.push(m);\n }\n\n const inside = visible.filter((c) => !c.outside);\n const focusCell = focus !== null ? inside[focus] : undefined;\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (inside.length === 0) return;\n const cur = focus ?? inside.length - 1;\n const delta = e.key === 'ArrowLeft' ? -7 : e.key === 'ArrowRight' ? 7 : e.key === 'ArrowUp' ? -1 : e.key === 'ArrowDown' ? 1 : null;\n let next: number | null = null;\n if (delta !== null) next = cur + delta;\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = inside.length - 1;\n if (next === null) return;\n e.preventDefault();\n setFocus(Math.max(0, Math.min(inside.length - 1, next)));\n }\n\n const knownDays = days.filter((d) => d.value !== null);\n const total = knownDays.reduce((s, d) => s + (d.value ?? 0), 0);\n const busiest = knownDays.reduce<CalendarDatum | null>((b, d) => (!b || (d.value ?? 0) > (b.value ?? 0) ? d : b), null);\n const summary = ariaLabel ?? `${title}: ${days.length} days, ${formatValue(total)}${unitText} in total` +\n (busiest && (busiest.value ?? 0) > 0 ? `, busiest ${formatDayLabel(busiest.day)} with ${formatValue(busiest.value!)}` : '') +\n (days.length - knownDays.length > 0 ? `, ${days.length - knownDays.length} days without data` : '') + '.';\n\n const columns: TableColumn<CalendarDatum>[] = [\n { key: 'day', label: 'Day', render: (d) => formatDayLabel(d.day) },\n { key: 'value', label: unit ? unit[0]!.toUpperCase() + unit.slice(1) : 'Value', numeric: true, render: (d) => (d.value === null ? '—' : formatValue(d.value)) },\n ];\n\n const legend = (\n <div className={plot.legend} aria-hidden=\"true\">\n <span className={plot.legendItem}>Less</span>\n {Array.from({ length: STEPS + 1 }, (_, i) => (\n <span key={i} className={plot.swatch} style={{ background: heatColor(i) }} />\n ))}\n <span className={plot.legendItem}>More</span>\n <span className={plot.legendItem}>\n <span className={plot.swatchHatch} />\n no data\n </span>\n </div>\n );\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={[...days].sort((a, b) => a.day.localeCompare(b.day))} rowKey={(d) => d.day} />}\n footer={\n <>\n {legend}\n {hiddenWeeks > 0 ? (\n <p className={plot.note}>Showing the latest {shownWeeks} weeks; {hiddenWeeks} earlier weeks are in the table.</p>\n ) : null}\n </>\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the arrow keys to move between days.`}\n aria-describedby={liveId}\n onFocus={() => setFocus((f) => f ?? (inside.length ? inside.length - 1 : null))}\n onBlur={() => setFocus(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={svgW} height={svgH} viewBox={`0 0 ${svgW} ${svgH}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {monthLabels.map((m) => (\n <text key={`${m.week}${m.label}`} className={plot.tick} x={DAY_LABEL_W + (m.week - firstWeek) * (cell + GAP)} y={11}>\n {m.label}\n </text>\n ))}\n {(weekStart === 1 ? WEEKDAYS_MON : WEEKDAYS_SUN).map((label, i) =>\n label && cell >= 10 ? (\n <text key={i} className={plot.tick} x={0} y={MONTH_H + i * (cell + GAP) + cell / 2} dy=\"0.32em\">{label}</text>\n ) : null,\n )}\n {visible.map((c) => {\n if (c.outside) return null;\n const bucket = heatBucket(c.value, max, STEPS);\n const isFocus = focusCell?.day === c.day;\n return (\n <rect\n key={c.day}\n data-day={c.day}\n data-bucket={bucket === null ? 'unknown' : bucket}\n x={xOf(c)}\n y={yOf(c)}\n width={cell}\n height={cell}\n rx={2}\n className={bucket === null ? plot.unknownMark : undefined}\n fill={bucket === null ? `url(#${hatchId})` : heatColor(bucket)}\n style={isFocus ? { stroke: 'var(--border-focus)', strokeWidth: 2, strokeDasharray: 'none' } : undefined}\n onPointerEnter={() => setFocus(inside.indexOf(c))}\n onPointerLeave={() => setFocus(null)}\n />\n );\n })}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">{focusCell ? describe(focusCell) : ''}</span>\n {focusCell ? (\n <ChartTooltip\n left={clampTooltipLeft(xOf(focusCell) + cell / 2, svgW, 60)}\n top={yOf(focusCell)}\n title={formatDayLabel(focusCell.day)}\n rows={[{ key: 'v', label: unit || 'Value', value: focusCell.value === null ? null : formatValue(focusCell.value) }]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n","/* ForestPlot — row banding and the keyboard focus ring. Colours are chart\n tokens only (style-scan-310 bans raw hex and px font sizes here). */\n.band {\n fill: var(--chart-grid);\n opacity: 0.35;\n}\n\n.focusRing {\n fill: none;\n stroke: var(--border-focus);\n stroke-width: 1.5;\n pointer-events: none;\n}\n","/**\n * components/charts/ForestPlot.tsx — one row per experiment: the point\n * estimate with its 95% confidence interval as a whisker, against a zero line\n * (V3.10, SPEC-310C §5 Growth; r5/visual.md §2 \"ForestPlot\").\n *\n * The question it answers is \"which changes REALLY helped?\", so the encoding\n * is about the interval, not the dot:\n * - interval entirely above zero → the positive diverging pole (azure),\n * - entirely below zero → the negative pole (danger),\n * - straddling zero → neutral ink (\"no detectable effect\"),\n * and the verdict is also written in words in every row's spoken label and\n * in the table — colour is never the only carrier.\n *\n * Honesty: a row whose estimate is still null (fewer pairs than the gate\n * needs) draws the unknown hatch across the plot with \"not enough pairs yet\",\n * never a dot at zero. An optional `gate` draws the adoption threshold as a\n * labelled dashed reference (the gate is \"CI low > gate\", SPEC-310B §5).\n *\n * Keyboard: the plot is one tab stop; ↑/↓ (Home/End) walk the rows and the\n * focused row is announced. Works at 375 px: the numeric column folds away\n * (it is in the table) and labels truncate with the full text spoken.\n */\nimport { useId, useRef, useState, type KeyboardEvent } from 'react';\nimport { CHART_DIVERGING_MID, CHART_DIVERGING_NEG, CHART_DIVERGING_POS, hatchPatternId } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend, HatchPattern } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { allIntegers, axisTicks, linearScale } from './chart-math.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport plot from './plot.module.css';\nimport styles from './ForestPlot.module.css';\n\nexport interface ForestRow {\n id: string;\n label: string;\n /** Point estimate (e.g. lift in percentage points); null = not estimable yet. */\n estimate: number | null;\n /** 95% CI bounds; null when the estimate is null. */\n low: number | null;\n high: number | null;\n /** Sample size behind the row (pairs); null = unknown. */\n n?: number | null;\n /** One short qualifier for the table (\"adopted\", \"running\", \"rejected\"). */\n detail?: string;\n}\n\nexport interface ForestPlotProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n rows: ForestRow[];\n /** Unit word after numbers in words and the table (\"pts\"). */\n unit?: string;\n /** A labelled reference the CI low must clear, e.g. { value: 0, label: 'Adoption gate' }. Drawn only when ≠ 0. */\n gate?: { value: number; label: string };\n formatValue?: (v: number) => string;\n /** What an unknown row says (default \"not enough pairs yet\"). */\n unknownText?: string;\n width?: number;\n ariaLabel?: string;\n}\n\nexport type ForestVerdict = 'positive' | 'negative' | 'none' | 'unknown';\n\n/** Where a row's interval sits relative to zero. */\nexport function forestVerdict(row: Pick<ForestRow, 'estimate' | 'low' | 'high'>): ForestVerdict {\n if (row.estimate === null || row.low === null || row.high === null) return 'unknown';\n if (row.low > 0) return 'positive';\n if (row.high < 0) return 'negative';\n return 'none';\n}\n\nconst VERDICT_WORDS: Record<ForestVerdict, string> = {\n positive: 'helped (interval above zero)',\n negative: 'hurt (interval below zero)',\n none: 'no clear effect (interval crosses zero)',\n unknown: 'unknown',\n};\n\nfunction verdictColor(verdict: ForestVerdict): string {\n if (verdict === 'positive') return CHART_DIVERGING_POS;\n if (verdict === 'negative') return CHART_DIVERGING_NEG;\n return 'var(--text-secondary)';\n}\n\nfunction signed(v: number, fmt: (v: number) => string): string {\n return v > 0 ? `+${fmt(v)}` : fmt(v);\n}\n\nconst defaultFormatValue = (v: number): string => (Math.abs(v) >= 10 ? v.toFixed(0) : v.toFixed(1));\n\nconst ROW_H = 28;\nconst AXIS_H = 22;\nconst PAD_R = 12;\nconst NARROW = 480;\n\nexport function ForestPlot({\n title,\n description,\n caveat,\n status,\n rows,\n unit = '',\n gate,\n formatValue: formatValueProp,\n unknownText = 'not enough pairs yet',\n width: fixedWidth,\n ariaLabel,\n}: ForestPlotProps) {\n const formatValue = formatValueProp ?? defaultFormatValue;\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const [active, setActive] = useState<number | null>(null);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const unitText = unit ? ` ${unit}` : '';\n\n const known = rows.filter((r) => forestVerdict(r) !== 'unknown');\n const resolvedStatus: ChartStatus = status ?? (rows.length === 0 ? { kind: 'empty', message: 'No experiments have run yet.' } : { kind: 'ready' });\n\n const narrow = width < NARROW;\n const labelW = Math.max(84, Math.min(180, Math.round(width * (narrow ? 0.3 : 0.26))));\n const valueW = narrow ? 0 : 118;\n const plotX0 = labelW + 8;\n const plotX1 = Math.max(plotX0 + 40, width - valueW - PAD_R);\n const bounds = known.flatMap((r) => [r.low!, r.high!]);\n const lo = Math.min(0, gate?.value ?? 0, ...bounds);\n const hi = Math.max(0, gate?.value ?? 0, ...bounds);\n // Tick labels at the step's own precision (a lift axis of 0.25 steps\n // printed at one decimal read \"+0.3 / +0.8\"); a caller's formatter is\n // held to printing every tick faithfully.\n const xAxis = axisTicks(lo, hi === lo ? lo + 1 : hi, {\n count: narrow ? 3 : 5,\n integer: allIntegers([...bounds, gate?.value ?? 0]),\n format: formatValueProp ? (t) => (t === 0 ? '0' : signed(t, formatValueProp)) : undefined,\n });\n const ticks = xAxis.ticks;\n const tickLabels = formatValueProp ? xAxis.labels : xAxis.labels.map((l, i) => (ticks[i]! > 0 ? `+${l}` : l));\n const xs = linearScale(ticks[0]!, ticks[ticks.length - 1]!, plotX0, plotX1);\n const bodyH = rows.length * ROW_H;\n const svgH = bodyH + AXIS_H;\n\n const spoken = (r: ForestRow): string => {\n const v = forestVerdict(r);\n if (v === 'unknown') return `${r.label}: ${unknownText}`;\n return `${r.label}: ${signed(r.estimate!, formatValue)}${unitText}, 95% interval ${signed(r.low!, formatValue)} to ${signed(r.high!, formatValue)}; ${VERDICT_WORDS[v]}`;\n };\n\n const positive = known.filter((r) => forestVerdict(r) === 'positive').length;\n const summary = ariaLabel ?? `${title}: ${rows.length} experiment${rows.length === 1 ? '' : 's'}, ${positive} with an interval above zero.`;\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (rows.length === 0) return;\n const cur = active ?? 0;\n const next = e.key === 'ArrowDown' ? cur + 1 : e.key === 'ArrowUp' ? cur - 1 : e.key === 'Home' ? 0 : e.key === 'End' ? rows.length - 1 : null;\n if (next === null) return;\n e.preventDefault();\n setActive(Math.max(0, Math.min(rows.length - 1, next)));\n }\n\n const columns: TableColumn<ForestRow>[] = [\n { key: 'label', label: 'Experiment', render: (r) => r.label },\n { key: 'est', label: `Estimate${unitText}`, numeric: true, render: (r) => (r.estimate === null ? '—' : signed(r.estimate, formatValue)) },\n {\n key: 'ci',\n label: '95% interval',\n numeric: true,\n render: (r) => (r.low === null || r.high === null ? '—' : `${signed(r.low, formatValue)} to ${signed(r.high, formatValue)}`),\n },\n { key: 'n', label: 'Pairs', numeric: true, render: (r) => (r.n === null || r.n === undefined ? '—' : String(r.n)) },\n { key: 'verdict', label: 'Reading', render: (r) => (forestVerdict(r) === 'unknown' ? unknownText : VERDICT_WORDS[forestVerdict(r)]) },\n ...(rows.some((r) => r.detail) ? [{ key: 'detail', label: 'Status', render: (r: ForestRow) => r.detail ?? '' }] : []),\n ];\n\n const activeRow = active !== null ? rows[active] : undefined;\n const labelChars = Math.floor(labelW / 7);\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={rows} rowKey={(r) => r.id} />}\n footer={\n <ChartLegend\n min={1}\n items={[\n { label: 'Helped', color: CHART_DIVERGING_POS },\n { label: 'Hurt', color: CHART_DIVERGING_NEG },\n { label: 'No clear effect', color: 'var(--text-secondary)' },\n ...(rows.length > known.length ? [{ label: unknownText, kind: 'hatch' as const }] : []),\n ]}\n />\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the up and down arrow keys to read each experiment.`}\n aria-describedby={liveId}\n onFocus={() => setActive((a) => a ?? (rows.length ? 0 : null))}\n onBlur={() => setActive(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={width} height={svgH} viewBox={`0 0 ${width} ${svgH}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {ticks.map((t, i) => (\n <g key={t}>\n <line className={plot.grid} x1={xs(t)} x2={xs(t)} y1={0} y2={bodyH} />\n <text className={plot.tick} x={xs(t)} y={svgH - 6} textAnchor=\"middle\">\n {tickLabels[i]}\n </text>\n </g>\n ))}\n <line data-role=\"zero\" x1={xs(0)} x2={xs(0)} y1={0} y2={bodyH} stroke={CHART_DIVERGING_MID} strokeWidth={1.5} />\n {gate && gate.value !== 0 ? (\n <g data-role=\"gate\">\n <line className={plot.reference} x1={xs(gate.value)} x2={xs(gate.value)} y1={0} y2={bodyH} />\n </g>\n ) : null}\n {rows.map((r, i) => {\n const y = i * ROW_H + ROW_H / 2;\n const v = forestVerdict(r);\n const color = verdictColor(v);\n const isActive = active === i;\n return (\n <g key={r.id} data-row={r.id} data-verdict={v} opacity={active !== null && !isActive ? 0.55 : 1}>\n {i % 2 === 1 ? <rect className={styles.band} x={0} y={i * ROW_H} width={width} height={ROW_H} /> : null}\n <text className={plot.label} x={labelW} y={y} dy=\"0.32em\" textAnchor=\"end\">\n {r.label.length > labelChars ? `${r.label.slice(0, labelChars - 1)}…` : r.label}\n </text>\n {v === 'unknown' ? (\n <g data-role=\"unknown\">\n <rect\n className={plot.unknownMark}\n fill={`url(#${hatchId})`}\n x={plotX0 + 0.5}\n y={y - 5}\n width={Math.max(1, plotX1 - plotX0 - 1)}\n height={10}\n rx={2}\n />\n {!narrow ? (\n <text className={plot.tick} x={width - PAD_R} y={y} dy=\"0.32em\" textAnchor=\"end\">{unknownText}</text>\n ) : null}\n </g>\n ) : (\n <g>\n <line data-role=\"ci\" x1={xs(r.low!)} x2={xs(r.high!)} y1={y} y2={y} stroke={color} strokeWidth={2} strokeLinecap=\"round\" />\n <line x1={xs(r.low!)} x2={xs(r.low!)} y1={y - 5} y2={y + 5} stroke={color} strokeWidth={1.5} />\n <line x1={xs(r.high!)} x2={xs(r.high!)} y1={y - 5} y2={y + 5} stroke={color} strokeWidth={1.5} />\n <rect\n data-role=\"estimate\"\n className={plot.marker}\n x={xs(r.estimate!) - 5}\n y={y - 5}\n width={10}\n height={10}\n rx={2}\n fill={color}\n />\n {!narrow ? (\n <text className={plot.tick} x={width - PAD_R} y={y} dy=\"0.32em\" textAnchor=\"end\">\n {signed(r.estimate!, formatValue)} [{signed(r.low!, formatValue)}, {signed(r.high!, formatValue)}]\n </text>\n ) : null}\n </g>\n )}\n {isActive ? <rect className={styles.focusRing} x={1} y={i * ROW_H + 1} width={width - 2} height={ROW_H - 2} rx={3} /> : null}\n </g>\n );\n })}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">\n {activeRow ? spoken(activeRow) : ''}\n </span>\n </div>\n </ChartFrame>\n );\n}\n","/**\n * components/charts/StepBand.tsx — a value that changes in discrete steps,\n * with an uncertainty band around each step and markers for events (V3.10,\n * SPEC-310C §5 Growth: \"Harness StepBand with CI band and ▼ rollbacks\").\n *\n * The harness does not drift continuously — a version is adopted, holds,\n * and is replaced or rolled back — so a smoothed line would lie about WHEN\n * things changed. Each step holds its value flat from its own time until the\n * next step (the last one holds to `now`); the band is that step's 95%\n * interval, drawn as a soft wash of the quantity ramp; an event marker (▼ for\n * a rollback, ▲ for an adoption) sits on the top edge at its time, danger for\n * rollbacks, and every marker is also a row in the table.\n *\n * Honesty: a step whose value is null (a version with no measured lift yet)\n * is a GAP in the line with the unknown hatch across its span — never a\n * carried-over value. The baseline reference (usually 0 = \"the compiled\n * defaults\") is a labelled dashed line.\n *\n * Keyboard: one tab stop; ←/→ (Home/End) walk the steps, each announced\n * with its interval and span.\n */\nimport { useId, useRef, useState, type KeyboardEvent } from 'react';\nimport { CHART_DIVERGING_NEG, CHART_SEQUENTIAL, CHART_SEQUENTIAL_SOFT, hatchPatternId } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend, ChartTooltip, HatchPattern, clampTooltipLeft } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { MIN_TIME_SPAN_MS, allIntegers, axisTicks, ensureSpan, isPlausibleTime, labelCharPx, layoutAxisLabels, linearScale, tickGutter } from './chart-math.js';\nimport { formatTimeLabel, timeLabelLadder } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport { useTextScale } from './useTextScale.js';\nimport plot from './plot.module.css';\n\nexport interface StepPoint {\n id: string;\n /** Epoch ms the step took effect. */\n at: number;\n /** The level from `at` until the next step; null = not measured. */\n value: number | null;\n /** 95% interval for this step; null / absent = no band. */\n low?: number | null;\n high?: number | null;\n /** Short name (\"h-0007\"). */\n label: string;\n /** One qualifier for the table and tooltip (\"adopted\", \"canary\"). */\n detail?: string;\n}\n\nexport interface StepMarker {\n id: string;\n at: number;\n kind: 'rollback' | 'adopt';\n label: string;\n}\n\nexport interface StepBandProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n steps: StepPoint[];\n markers?: StepMarker[];\n /** Right edge of the last step (default: now). */\n now?: number;\n /** Left edge (default: the first step). */\n from?: number;\n baseline?: { value: number; label: string };\n /** Unit word (\"pts\"). */\n unit?: string;\n formatValue?: (v: number) => string;\n formatTime?: (ms: number) => string;\n height?: number;\n width?: number;\n ariaLabel?: string;\n}\n\nexport interface StepSpan extends StepPoint {\n /** Where this step's flat segment ends (the next step's `at`, or `now`). */\n until: number;\n}\n\n/** Sort steps by time and give each the span it holds for. Pure. */\nexport function stepSpans(steps: ReadonlyArray<StepPoint>, now: number): StepSpan[] {\n const sorted = [...steps].filter((s) => Number.isFinite(s.at)).sort((a, b) => a.at - b.at);\n return sorted.map((s, i) => ({ ...s, until: Math.max(s.at, i + 1 < sorted.length ? sorted[i + 1]!.at : now) }));\n}\n\nconst PAD_T = 18;\nconst PAD_B = 26;\nconst PAD_R = 14;\n/** With no plausible time at all, the window shown ends now and spans a day. */\nconst FALLBACK_SPAN_MS = 86_400_000;\nconst defaultFormatValue = (v: number): string => (Math.abs(v) >= 10 ? v.toFixed(0) : v.toFixed(1));\n\nfunction signed(v: number, fmt: (v: number) => string): string {\n return v > 0 ? `+${fmt(v)}` : fmt(v);\n}\n\nexport function StepBand({\n title,\n description,\n caveat,\n status,\n steps,\n markers: markersProp = [],\n now: nowProp,\n from: fromProp,\n baseline,\n unit = '',\n formatValue: formatValueProp,\n formatTime: formatTimeProp,\n height = 200,\n width: fixedWidth,\n ariaLabel,\n}: StepBandProps) {\n const formatValue = formatValueProp ?? defaultFormatValue;\n // A 0 / pre-2000 time is a null timestamp that leaked through (a baseline\n // \"created\" at epoch 0): it is spoken and tabled as \"—\", never \"Dec 31\".\n const formatTime = (ms: number): string => (isPlausibleTime(ms) ? (formatTimeProp ?? formatTimeLabel)(ms) : '—');\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const textScale = useTextScale();\n const [active, setActive] = useState<number | null>(null);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const unitText = unit ? ` ${unit}` : '';\n const now = nowProp ?? Date.now();\n const spans = stepSpans(steps, now);\n // A marker at an implausible time has nowhere honest to sit on the axis.\n const markers = markersProp.filter((m) => isPlausibleTime(m.at));\n const known = spans.filter((s) => s.value !== null);\n const resolvedStatus: ChartStatus = status ?? (spans.length === 0\n ? { kind: 'empty', message: 'No versions yet — the compiled defaults are in force.' }\n : known.length === 0 ? { kind: 'unknown', reason: 'no version has a measured value yet.' } : { kind: 'ready' });\n\n // The domain comes from plausible times only; a step stamped at epoch 0\n // still draws — held from the left edge — but no longer drags the axis to\n // 1970. A degenerate span widens to MIN_TIME_SPAN_MS, ending at `now`.\n const starts = [...spans.map((s) => s.at), ...markers.map((m) => m.at)].filter(isPlausibleTime);\n const right = Math.max(isPlausibleTime(now) ? now : 0, ...starts, ...spans.map((s) => s.until).filter(isPlausibleTime));\n const left = fromProp !== undefined && isPlausibleTime(fromProp) ? fromProp : starts.length ? Math.min(...starts) : right - FALLBACK_SPAN_MS;\n const [x0, x1] = ensureSpan(left, right, MIN_TIME_SPAN_MS, 'end');\n const ys0 = known.flatMap((s) => [s.value!, s.low ?? s.value!, s.high ?? s.value!]);\n const lo = Math.min(baseline?.value ?? 0, ...ys0);\n const hi = Math.max(baseline?.value ?? 0, ...ys0);\n const yAxis = axisTicks(lo, hi === lo ? lo + 1 : hi, {\n count: 4,\n integer: allIntegers([...ys0, baseline?.value ?? 0]),\n format: formatValueProp ? (t) => (t === 0 ? '0' : signed(t, formatValueProp)) : undefined,\n });\n const ticks = yAxis.ticks;\n // Kit labels take their precision from the step; a lift above zero wears \"+\".\n const tickLabels = formatValueProp ? yAxis.labels : yAxis.labels.map((l, i) => (ticks[i]! > 0 ? `+${l}` : l));\n const padL = tickGutter(tickLabels, 30, 56, textScale);\n const plotW = Math.max(40, width - padL - PAD_R);\n const plotH = height - PAD_T - PAD_B;\n const xs = linearScale(x0, x1, padL, padL + plotW);\n const ys = linearScale(ticks[0]!, ticks[ticks.length - 1]!, PAD_T + plotH, PAD_T);\n const cx = (t: number) => Math.min(padL + plotW, Math.max(padL, xs(t)));\n\n // Start / end labels, collision-free at the operator's Display size: the\n // end (now) outranks the start.\n const ladder = timeLabelLadder(x0, x1, formatTimeProp, [x0, x1]);\n const xLabels = layoutAxisLabels(\n [\n { key: 'start', x: padL, anchor: 'start', priority: 2, variants: ladder.map((f) => f(x0)) },\n { key: 'end', x: padL + plotW, anchor: 'end', priority: 3, variants: ladder.map((f) => f(x1)) },\n ],\n { min: padL, max: padL + plotW, charPx: labelCharPx(textScale) },\n );\n\n // One path per run of known steps; a null step breaks the line.\n const runs: string[] = [];\n let current: string[] = [];\n let prevY: number | null = null;\n for (const s of spans) {\n if (s.value === null) {\n if (current.length) runs.push(current.join(' '));\n current = [];\n prevY = null;\n continue;\n }\n const y = ys(s.value);\n const a = cx(s.at);\n const b = cx(s.until);\n current.push(prevY === null ? `M${a.toFixed(1)},${y.toFixed(1)}` : `L${a.toFixed(1)},${y.toFixed(1)}`);\n current.push(`L${b.toFixed(1)},${y.toFixed(1)}`);\n prevY = y;\n }\n if (current.length) runs.push(current.join(' '));\n\n const spoken = (s: StepSpan): string =>\n `${s.label}${s.detail ? ` (${s.detail})` : ''}, ${formatTime(s.at)} to ${formatTime(s.until)}: ` +\n (s.value === null\n ? 'not measured'\n : `${signed(s.value, formatValue)}${unitText}` +\n (s.low !== null && s.low !== undefined && s.high !== null && s.high !== undefined\n ? `, 95% interval ${signed(s.low, formatValue)} to ${signed(s.high, formatValue)}`\n : ''));\n\n const last = known[known.length - 1];\n const rollbacks = markers.filter((m) => m.kind === 'rollback').length;\n const summary = ariaLabel ?? `${title}: ${spans.length} step${spans.length === 1 ? '' : 's'}` +\n (last ? `, now ${signed(last.value!, formatValue)}${unitText}` : '') +\n (rollbacks ? `, ${rollbacks} rollback${rollbacks === 1 ? '' : 's'}` : '') + '.';\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (spans.length === 0) return;\n const cur = active ?? spans.length - 1;\n const next = e.key === 'ArrowLeft' ? cur - 1 : e.key === 'ArrowRight' ? cur + 1 : e.key === 'Home' ? 0 : e.key === 'End' ? spans.length - 1 : null;\n if (next === null) return;\n e.preventDefault();\n setActive(Math.max(0, Math.min(spans.length - 1, next)));\n }\n\n interface Row { id: string; when: number; what: string; value: string; interval: string }\n const tableRows: Row[] = [\n ...spans.map((s) => ({\n id: `s:${s.id}`,\n when: s.at,\n what: `${s.label}${s.detail ? ` · ${s.detail}` : ''}`,\n value: s.value === null ? '—' : signed(s.value, formatValue),\n interval: s.low === null || s.low === undefined || s.high === null || s.high === undefined ? '—' : `${signed(s.low, formatValue)} to ${signed(s.high, formatValue)}`,\n })),\n ...markers.map((m) => ({ id: `m:${m.id}`, when: m.at, what: `${m.kind === 'rollback' ? '▼ Rolled back' : '▲ Adopted'}: ${m.label}`, value: '', interval: '' })),\n ].sort((a, b) => a.when - b.when);\n const columns: TableColumn<Row>[] = [\n { key: 'when', label: 'When', render: (r) => formatTime(r.when) },\n { key: 'what', label: 'Step', render: (r) => r.what },\n { key: 'value', label: `Level${unitText}`, numeric: true, render: (r) => r.value },\n { key: 'ci', label: '95% interval', numeric: true, render: (r) => r.interval },\n ];\n\n const activeSpan = active !== null ? spans[active] : undefined;\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={tableRows} rowKey={(r) => r.id} />}\n footer={\n <ChartLegend\n items={[\n { label: 'Level', color: CHART_SEQUENTIAL, kind: 'line' },\n { label: '95% interval', color: CHART_SEQUENTIAL_SOFT },\n ...(rollbacks ? [{ label: '▼ rollback', color: CHART_DIVERGING_NEG }] : []),\n ...(spans.some((s) => s.value === null) ? [{ label: 'not measured', kind: 'hatch' as const }] : []),\n ]}\n />\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the left and right arrow keys to read each step.`}\n aria-describedby={liveId}\n onFocus={() => setActive((a) => a ?? (spans.length ? spans.length - 1 : null))}\n onBlur={() => setActive(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {ticks.map((t, i) => (\n <g key={t}>\n <line className={plot.grid} x1={padL} x2={padL + plotW} y1={ys(t)} y2={ys(t)} />\n <text className={plot.tick} x={padL - 6} y={ys(t)} dy=\"0.32em\" textAnchor=\"end\">{tickLabels[i]}</text>\n </g>\n ))}\n {xLabels.map((l) => (\n <text key={l.key} data-axis-label={l.key} className={plot.tick} x={l.x} y={height - 8} textAnchor={l.anchor}>{l.text}</text>\n ))}\n {baseline ? (\n <g data-role=\"baseline\">\n <line className={plot.reference} x1={padL} x2={padL + plotW} y1={ys(baseline.value)} y2={ys(baseline.value)} />\n <text className={`${plot.tick} ${plot.halo}`} x={padL + 4} y={ys(baseline.value) - 5}>{baseline.label}</text>\n </g>\n ) : null}\n {spans.map((s, i) => {\n const a = cx(s.at);\n const b = Math.max(a + 1, cx(s.until));\n if (s.value === null) {\n return (\n <rect key={s.id} data-step={s.id} data-unknown=\"true\" className={plot.unknownMark} fill={`url(#${hatchId})`} x={a} y={PAD_T} width={b - a} height={plotH} opacity={0.6} />\n );\n }\n const hasBand = s.low !== null && s.low !== undefined && s.high !== null && s.high !== undefined;\n return (\n <g key={s.id} data-step={s.id} opacity={active !== null && active !== i ? 0.6 : 1}>\n {hasBand ? (\n <rect data-role=\"band\" x={a} y={ys(s.high!)} width={b - a} height={Math.max(1, ys(s.low!) - ys(s.high!))} fill={CHART_SEQUENTIAL_SOFT} opacity={0.35} />\n ) : null}\n </g>\n );\n })}\n {runs.map((d, i) => (\n <path key={i} data-role=\"level\" className={plot.line} stroke={CHART_SEQUENTIAL} d={d} />\n ))}\n {spans.map((s) =>\n s.value === null ? null : <circle key={`p${s.id}`} className={plot.marker} cx={cx(s.at)} cy={ys(s.value)} r={3.5} fill={CHART_SEQUENTIAL} />,\n )}\n {markers.map((m) => {\n const x = cx(m.at);\n const y = PAD_T - 2;\n const d = m.kind === 'rollback' ? `M${x - 5},${y - 8} L${x + 5},${y - 8} L${x},${y} Z` : `M${x - 5},${y} L${x + 5},${y} L${x},${y - 8} Z`;\n return (\n <path key={m.id} data-marker={m.kind} d={d} fill={m.kind === 'rollback' ? CHART_DIVERGING_NEG : CHART_SEQUENTIAL}>\n <title>{`${m.kind === 'rollback' ? 'Rolled back' : 'Adopted'}: ${m.label} · ${formatTime(m.at)}`}</title>\n </path>\n );\n })}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">{activeSpan ? spoken(activeSpan) : ''}</span>\n {activeSpan ? (\n <ChartTooltip\n left={clampTooltipLeft((cx(activeSpan.at) + cx(activeSpan.until)) / 2, width)}\n top={activeSpan.value === null ? PAD_T + plotH / 2 : ys(activeSpan.high ?? activeSpan.value)}\n title={`${activeSpan.label}${activeSpan.detail ? ` · ${activeSpan.detail}` : ''}`}\n rows={[\n { key: 'v', label: 'Level', value: activeSpan.value === null ? null : `${signed(activeSpan.value, formatValue)}${unitText}` },\n {\n key: 'ci',\n label: '95% interval',\n value: activeSpan.low === null || activeSpan.low === undefined || activeSpan.high === null || activeSpan.high === undefined\n ? null\n : `${signed(activeSpan.low, formatValue)} to ${signed(activeSpan.high, formatValue)}`,\n },\n { key: 't', label: 'From', value: formatTime(activeSpan.at) },\n ]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,c as t,n}from"./index-CyK31YRm.js";import{D as r,S as i,T as a,_ as o,a as s,c,d as l,i as u,l as d,n as f,o as p,r as m,s as h,t as g,u as ee,w as te}from"./ChartFrame-DK_BDXCt.js";import{p as ne,s as re,v as _}from"./colors-BZ3a9wFf.js";var v={sparkline:`_sparkline_kr10w_1`,line:`_line_kr10w_6`,dot:`_dot_kr10w_14`,area:`_area_kr10w_18`,flat:`_flat_kr10w_25`},y=n();function b(e,t){let n=e.filter(e=>e!==null&&Number.isFinite(e));if(n.length===0)return`no data`;let r=n[0],i=n[n.length-1],a=e.length-n.length;return`from ${t(r)} to ${t(i)}, range ${t(Math.min(...n))} to ${t(Math.max(...n))}`+(a>0?`, ${a} point${a===1?``:`s`} without data`:``)}function x({points:e,width:t=72,height:n=24,ariaLabel:r,area:i=!1,describe:a}){let o=a?`${r}: ${b(e,a)}`:r,s=e.filter(e=>e!==null);if(s.length<2)return(0,y.jsx)(`svg`,{className:v.sparkline,width:t,height:n,viewBox:`0 0 ${t} ${n}`,role:`img`,"aria-label":o,children:(0,y.jsx)(`line`,{className:v.flat,x1:1,x2:t-1,y1:n-1.5,y2:n-1.5})});let c=Math.min(...s,0),l=Math.max(...s,0)-c||1,u=t/Math.max(1,e.length-1),d=e=>n-(e-c)/l*(n-2)-1,f=[],p=[];e.forEach((e,t)=>{if(e===null){p.length&&f.push(p),p=[];return}p.push({x:t*u,y:d(e)})}),p.length&&f.push(p);let m=e.map(e=>e!==null).lastIndexOf(!0),h=m>=0?{x:m*u,y:d(e[m])}:null,g=d(Math.max(c,0));return(0,y.jsxs)(`svg`,{className:v.sparkline,width:t,height:n,viewBox:`0 0 ${t} ${n}`,role:`img`,"aria-label":o,children:[i?f.map((e,t)=>e.length>1?(0,y.jsx)(`path`,{className:v.area,d:`${e.map((e,t)=>`${t===0?`M`:`L`}${e.x.toFixed(1)},${e.y.toFixed(1)}`).join(` `)} L${e[e.length-1].x.toFixed(1)},${g.toFixed(1)} L${e[0].x.toFixed(1)},${g.toFixed(1)} Z`},`a${t}`):null):null,f.map((e,t)=>(0,y.jsx)(`path`,{className:v.line,d:e.map((e,t)=>`${t===0?`M`:`L`}${e.x.toFixed(1)},${e.y.toFixed(1)}`).join(` `)},t)),h?(0,y.jsx)(`circle`,{className:v.dot,cx:h.x,cy:h.y,r:2}):null]})}var S=t(e(),1),C={scroller:`_scroller_1b51y_1`,band:`_band_1b51y_7`,bar:`_bar_1b51y_12`,stale:`_stale_1b51y_18`,open:`_open_1b51y_22`,now:`_now_1b51y_27`,laneStops:`_laneStops_1b51y_33`,laneStop:`_laneStop_1b51y_33`,outline:`_outline_1b51y_51`},w=new Set([`queued`,`parked`,`waiting`]);function T(e){return e.outline??w.has(e.status.toLowerCase())}var ie=14,ae=6,E=22,D=3,O={done:`success`,success:`success`,merged:`success`,failed:`danger`,error:`danger`,aborted:`neutral`,cancelled:`neutral`,running:`running`,queued:`neutral`,parked:`neutral`};function oe(e){return O[e.toLowerCase()]??`unknown`}function se(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleString(`en-US`,{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`})}function ce(e,t){let n=t-e>1296e5;return e=>{let t=new Date(e);return Number.isNaN(t.getTime())?``:n?t.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`}):t.toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`})}}function le(e,t){return e.length>t?`${e.slice(0,Math.max(1,t-1))}…`:e}function k(e){if(!Number.isFinite(e)||e<0)return`—`;let t=Math.round(e/6e4);if(t<1)return`<1m`;if(t<60)return`${t}m`;let n=Math.floor(t/60);return n<48?`${n}h ${t%60}m`:`${Math.round(n/24)}d`}function ue({title:e,description:t,caveat:n,status:v,lanes:b,from:x,to:w,now:O,width:ue,toneOf:A=oe,formatTime:j=se,formatTick:de,ariaLabel:fe}){let M=b.flatMap(e=>e.items.flatMap(e=>[e.start,e.end??NaN])).filter(i),pe=i(w)?w:O!==void 0&&i(O)?O:M.length?Math.max(...M):Date.now(),me=i(x)?x:M.length?Math.min(...M):pe-864e5,[N,P]=o(me,pe,l,`end`),he=de??ce(N,P),F=(0,S.useRef)(null),I=ee(F,ue),L=d(),[R,ge]=(0,S.useState)(0),[z,B]=(0,S.useState)(null),V=(0,S.useId)(),H=ne((0,S.useId)()),U=O??P,W=b.reduce((e,t)=>e+t.items.length,0),_e=v??(W===0?{kind:`empty`,message:`No runs in this window.`}:{kind:`ready`}),ve=b.some(e=>e.engine!==void 0)?18:0,G=Math.max(72,Math.min(160,Math.round(I*.24)))+ve,ye=Math.floor((G-ve)/(7*L)),K=Math.max(40,I-G-8),q=r(N,Math.max(P,N+1),G,G+K),J=b.length>50,Y=J?Math.max(0,Math.floor(R/24)-ae):0,X=J?Math.min(b.length,Math.ceil(R/24)+ie+ae):b.length,Z=b.length*24,be=(0,S.useMemo)(()=>{let e=new Map;for(let t of b)for(let n of t.items){let t=A(n.status),r=T(n)?`outline`:t===`unknown`?`hatch`:t,i=r===`outline`?{kind:`empty`}:r===`hatch`?{kind:`hatch`}:{color:_(t)};e.has(r)||e.set(r,{item:i,names:new Set}),e.get(r).names.add(n.status.toLowerCase())}return[...e.values()].map(({item:e,names:t})=>({...e,label:[...t].sort().join(` / `)}))},[b,A]),xe=b.some(e=>e.engine!==void 0),Q=(0,S.useMemo)(()=>{let e=Math.max(2,Math.floor(K/90)),t=(P-N)/Math.max(1,e);return Array.from({length:e+1},(e,n)=>N+t*n)},[N,P,K]),Se=(0,S.useMemo)(()=>b.flatMap(e=>e.items.map(t=>({...t,lane:e.label,engine:e.engine}))),[b]);function Ce(e){let t=new Map;for(let n of e.items)t.set(n.status,(t.get(n.status)??0)+1);let n=[...t.entries()].sort((e,t)=>t[1]-e[1]).map(([e,t])=>`${t} ${e}`),r=e.engine?` (${e.engine})`:``;return`${e.label}${r}: ${e.items.length} run${e.items.length===1?``:`s`}${n.length?` (${n.join(`, `)})`:``}`}let we=fe??`${e}: ${W} runs across ${b.length} lanes from ${j(N)} to ${j(P)}.`,Te=[{key:`lane`,label:`Lane`,render:e=>e.lane},...xe?[{key:`engine`,label:`Engine`,render:e=>e.engine??`—`}]:[],{key:`status`,label:`Status`,render:e=>`${e.status}${e.stale?` (stale)`:``}`},{key:`start`,label:`Started`,render:e=>j(e.start)},{key:`dur`,label:`Duration`,numeric:!0,render:e=>e.end===null?`${k(U-e.start)}+`:k(e.end-e.start)},{key:`detail`,label:`Detail`,render:e=>e.detail??``}],$=z?b[z.lane]?.items[z.item]:void 0;function Ee(e,t){let n=t*24;return(0,y.jsxs)(`g`,{"data-lane":e.id,children:[t%2==1?(0,y.jsx)(`rect`,{className:C.band,x:0,y:n,width:I,height:24}):null,e.engine?(0,y.jsx)(u,{engine:e.engine,x:2,y:n+5,height:14}):null,(0,y.jsx)(`text`,{className:h.label,x:G-8,y:n+12,dy:`0.32em`,textAnchor:`end`,children:le(e.label,ye)}),e.items.map((e,r)=>{let i=Math.max(N,e.start),a=Math.min(P,e.end??U);if(a<N||i>P)return null;let o=q(i),s=Math.max(D,q(Math.max(a,i))-o),c=A(e.status),l=T(e),u=!l&&c===`unknown`;return(0,y.jsx)(`rect`,{"data-item":e.id,"data-status":e.status,"data-open":e.end===null?`true`:void 0,"data-style":l?`outline`:u?`hatch`:`fill`,className:`${C.bar} ${e.stale?C.stale:``} ${e.end===null?C.open:``} ${l?C.outline:``} ${u?h.unknownMark:``}`,x:l?o+.5:o,y:l?n+5.5:n+5,width:l?Math.max(D,s-1):s,height:l?13:14,rx:3,fill:l?`none`:u?`url(#${H})`:_(c),stroke:l?re:void 0,onPointerEnter:()=>B({lane:t,item:r}),onPointerLeave:()=>B(e=>e&&e.lane===t&&e.item===r?null:e)},e.id)})]},e.id)}let De=a(Q.map((e,t)=>({key:String(t),x:q(e),anchor:t===0?`start`:t===Q.length-1?`end`:`middle`,priority:t===Q.length-1?3:t===0?2:1,required:t===0||t===Q.length-1,variants:[he(e)]})),{min:G,max:G+K,charPx:te(L)}),Oe=(0,y.jsxs)(`svg`,{className:h.svg,width:I,height:E,viewBox:`0 0 ${I} ${E}`,"aria-hidden":`true`,children:[(0,y.jsx)(`line`,{className:h.axis,x1:G,x2:G+K,y1:21,y2:21}),De.map(e=>(0,y.jsx)(`text`,{"data-axis-label":e.key,className:h.tick,x:e.x,y:15,textAnchor:e.anchor,children:e.text},e.key))]});return(0,y.jsx)(g,{title:e,description:t,caveat:n,status:_e,table:(0,y.jsx)(c,{caption:e,columns:Te,rows:Se,rowKey:e=>e.id}),footer:(0,y.jsx)(f,{min:1,items:be}),children:(0,y.jsxs)(`div`,{ref:F,className:h.plotWrap,children:[Oe,(0,y.jsxs)(`div`,{className:J?C.scroller:void 0,style:J?{height:336}:void 0,onScroll:J?e=>ge(e.currentTarget.scrollTop):void 0,"data-virtualized":J?`true`:void 0,children:[(0,y.jsxs)(`svg`,{className:h.svg,width:I,height:Z,viewBox:`0 0 ${I} ${Z}`,role:`img`,"aria-label":we,children:[(0,y.jsx)(`defs`,{children:(0,y.jsx)(s,{id:H})}),Q.map(e=>(0,y.jsx)(`line`,{className:h.grid,x1:q(e),x2:q(e),y1:0,y2:Z},e)),U>=N&&U<=P?(0,y.jsx)(`line`,{className:C.now,x1:q(U),x2:q(U),y1:0,y2:Z}):null,b.slice(Y,X).map((e,t)=>Ee(e,Y+t))]}),(0,y.jsx)(`ul`,{className:C.laneStops,style:{height:Z},"aria-label":`${e} lanes`,"aria-describedby":V,children:b.slice(Y,X).map((e,t)=>(0,y.jsx)(`li`,{tabIndex:0,className:`${C.laneStop} ${h.focusable}`,style:{top:(Y+t)*24,height:24},"aria-label":Ce(e),onFocus:()=>B(e.items.length?{lane:Y+t,item:e.items.length-1}:null),onBlur:()=>B(null)},e.id))})]}),(0,y.jsx)(`span`,{id:V,className:h.srOnly,children:`Each lane lists its runs by status; open the Table view for every run.`}),z&&$?(0,y.jsx)(m,{left:p(q(Math.max(N,$.start)),I),top:E+z.lane*24-(J?R:0),title:b[z.lane].label,rows:[{key:`s`,label:`Status`,value:`${$.status}${$.stale?` (stale)`:``}`,...T($)||A($.status)===`unknown`?{}:{color:_(A($.status))}},{key:`t`,label:`Started`,value:j($.start)},{key:`d`,label:`Duration`,value:$.end===null?`${k(U-$.start)} so far`:k($.end-$.start)},...$.detail?[{key:`x`,label:`Detail`,value:$.detail}]:[]]}):null]})})}export{x as n,ue as t};
|
|
2
|
-
//# sourceMappingURL=Swimlane-LrslsGxw.js.map
|