@ashlr/hub 3.12.0 → 3.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +157 -0
- package/README.md +29 -16
- package/dist/authority-surface.json +274 -148
- package/dist/build-identity.json +2 -2
- package/dist/cli/authority.d.ts +145 -33
- package/dist/cli/authority.js +1292 -315
- package/dist/cli/authority.js.map +1 -1
- package/dist/cli/cloud.js +12 -3
- package/dist/cli/cloud.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/protected-paths.js +11 -0
- package/dist/core/authority/protected-paths.js.map +1 -1
- package/dist/core/authority/resident.d.ts +101 -0
- package/dist/core/authority/resident.js +246 -0
- package/dist/core/authority/resident.js.map +1 -0
- 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/authority/types.d.ts +43 -0
- package/dist/core/authority/types.js +6 -0
- package/dist/core/authority/types.js.map +1 -1
- package/dist/core/cloud/budget.js +11 -1
- package/dist/core/cloud/budget.js.map +1 -1
- package/dist/core/cloud/cloud-api.d.ts +25 -2
- package/dist/core/cloud/cloud-api.js +139 -5
- package/dist/core/cloud/cloud-api.js.map +1 -1
- package/dist/core/cloud/pr-actions.d.ts +93 -0
- package/dist/core/cloud/pr-actions.js +436 -0
- package/dist/core/cloud/pr-actions.js.map +1 -0
- package/dist/core/cloud/pr-preview.d.ts +128 -0
- package/dist/core/cloud/pr-preview.js +228 -0
- package/dist/core/cloud/pr-preview.js.map +1 -0
- package/dist/core/cloud/store.d.ts +2 -0
- package/dist/core/cloud/store.js +28 -0
- package/dist/core/cloud/store.js.map +1 -1
- package/dist/core/cloud/timeline-api.d.ts +24 -0
- package/dist/core/cloud/timeline-api.js +46 -0
- package/dist/core/cloud/timeline-api.js.map +1 -0
- package/dist/core/cloud/timeline-types.d.ts +62 -0
- package/dist/core/cloud/timeline-types.js +36 -0
- package/dist/core/cloud/timeline-types.js.map +1 -0
- package/dist/core/cloud/timeline.d.ts +102 -0
- package/dist/core/cloud/timeline.js +925 -0
- package/dist/core/cloud/timeline.js.map +1 -0
- package/dist/core/cloud/tracker.js +67 -0
- package/dist/core/cloud/tracker.js.map +1 -1
- package/dist/core/cloud/types.d.ts +38 -0
- package/dist/core/cloud/types.js +1 -1
- package/dist/core/cloud/types.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/service-install-authority.d.ts +10 -2
- package/dist/core/daemon/service-install-authority.js +14 -5
- package/dist/core/daemon/service-install-authority.js.map +1 -1
- package/dist/core/daemon/service.d.ts +15 -0
- package/dist/core/daemon/service.js +26 -0
- package/dist/core/daemon/service.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/cloud-intake.d.ts +95 -0
- package/dist/core/fleet/cloud-intake.js +557 -0
- package/dist/core/fleet/cloud-intake.js.map +1 -0
- package/dist/core/fleet/dispatch-router.d.ts +13 -0
- package/dist/core/fleet/dispatch-router.js +32 -8
- package/dist/core/fleet/dispatch-router.js.map +1 -1
- package/dist/core/fleet/fleet-merge-state.d.ts +16 -0
- package/dist/core/fleet/fleet-merge-state.js.map +1 -1
- package/dist/core/fleet/host-merge.d.ts +14 -0
- package/dist/core/fleet/host-merge.js +24 -2
- package/dist/core/fleet/host-merge.js.map +1 -1
- package/dist/core/fleet/merge-gates.d.ts +21 -0
- package/dist/core/fleet/merge-gates.js +39 -5
- 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 +102 -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 +10 -1
- package/dist/core/fleet/tick-hooks-live.js +57 -8
- package/dist/core/fleet/tick-hooks-live.js.map +1 -1
- package/dist/core/fleet/verify-check-run.d.ts +90 -0
- package/dist/core/fleet/verify-check-run.js +274 -0
- package/dist/core/fleet/verify-check-run.js.map +1 -0
- 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 +18 -1
- package/dist/core/routing/budget-api.js +120 -10
- package/dist/core/routing/budget-api.js.map +1 -1
- package/dist/core/routing/budget-store.d.ts +22 -1
- package/dist/core/routing/budget-store.js +22 -8
- package/dist/core/routing/budget-store.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/account-health.js +9 -3
- package/dist/core/verse/account-health.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/activity-api.d.ts +5 -1
- package/dist/core/verse/activity-api.js +62 -14
- package/dist/core/verse/activity-api.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 +17 -3
- package/dist/core/verse/authority-api.js +122 -7
- 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/seat-readiness.d.ts +25 -0
- package/dist/core/verse/seat-readiness.js +43 -6
- package/dist/core/verse/seat-readiness.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.d.ts +3 -1
- package/dist/core/verse/verse-api.js +87 -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-B4-39f2S.js → ActionMenu-CIiX2X8w.js} +2 -2
- package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.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-B-LqYXvd.js.map → Advanced-DHsysoIL.js.map} +1 -1
- package/dist/core/web/public/next/assets/App-CMeAocmW.js +7 -0
- package/dist/core/web/public/next/assets/{App-E2zCDRxm.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-8wXPPhZb.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-CEPSZToP.js +3 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-CmSSTHVe.css +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
- package/dist/core/web/public/next/assets/{AutonomySection-B46igJKR.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-BRkrEQGs.js → BranchBar-BxhdiIpx.js} +2 -2
- package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
- package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js.map +1 -0
- package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js → Button-D90dzI_o.js} +2 -2
- package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js.map → Button-D90dzI_o.js.map} +1 -1
- package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js → CapacityStrip-qKDBC65C.js} +2 -2
- package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.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-DlT4QU6a.js.map +1 -0
- package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
- package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.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-Bv4hdK2T.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
- package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js → DeleteChatDialog-BCfP12GH.js} +2 -2
- package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js → Dialog-D3msQlCj.js} +2 -2
- package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js.map → Dialog-D3msQlCj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js → DiffPane-Ix6hvXlY.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js → DiffViewer-C4WKsCIe.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.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-DW9q0NdR.js.map → DockHost-aWP7liri.js.map} +1 -1
- package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js → EmptyState-D2IRy3Cg.js} +2 -2
- package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js → Epistemic-DMr18muX.js} +2 -2
- package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js.map → Epistemic-DMr18muX.js.map} +1 -1
- package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js +2 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js.map +1 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-PBDAiSuG.css +1 -0
- 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-CIPtzeIx.js → GearTray-Dt-ee32-.js} +2 -2
- package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.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-iiQg6wvK.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
- package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js → HandoffDialog-CLJQLe7M.js} +2 -2
- package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js → Input-D_KRJA9V.js} +2 -2
- package/dist/core/web/public/next/assets/{Input-C0MQxEM6.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-BRuCcTjT.js.map → McpSection-DGbRcyv8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js → MessageMarkdown-DFvk06qG.js} +3 -3
- package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js → Meter-CMj-VafN.js} +2 -2
- package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.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-T7gv3a9r.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
- package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.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-CCsijdWt.js +2 -0
- package/dist/core/web/public/next/assets/{NeedsYouList-BgH8ezqf.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
- package/dist/core/web/public/next/assets/NeedsYouList-CH6Mq-E_.css +1 -0
- package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
- package/dist/core/web/public/next/assets/{NewChatDialog-Db5Xjrk8.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
- package/dist/core/web/public/next/assets/{OnboardingGate-C4VXn7BJ.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-BPBbcROb.js.map → PreviewPane-COid5A0f.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js → ProviderLogo-Cq-CYIwT.js} +2 -2
- package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js → RailStatus-Co5UB6We.js} +2 -2
- package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js.map → RailStatus-Co5UB6We.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js → RefreshIndicator-DO9ibnSq.js} +2 -2
- package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.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-BX2nkdmZ.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-BaC7YVzR.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
- package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js → SeatSelector-J5R3zDkB.js} +3 -3
- package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Segmented-CametjLt.js → Segmented-CGh_-tBb.js} +2 -2
- package/dist/core/web/public/next/assets/{Segmented-CametjLt.js.map → Segmented-CGh_-tBb.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Select-De52fghU.js → Select-CWnmUzs3.js} +2 -2
- package/dist/core/web/public/next/assets/{Select-De52fghU.js.map → Select-CWnmUzs3.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js → SessionGate-sp4KsnUo.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js → SessionInsightChip-DLFAzdbi.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js → SessionSearch-DbFjwR1h.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SettingsSection-mI9wQYZg.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-Bd76MBAR.js +2 -0
- package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js.map +1 -0
- package/dist/core/web/public/next/assets/SetupChecklist-BhZpFLsj.css +1 -0
- 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-CJhK9Dqv.js → Sheet-BZ2AG4Eo.js} +2 -2
- package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.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-DN--cPYN.js.map +1 -0
- package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js → Slider-KVoJLDD6.js} +2 -2
- package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.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-DHKRtttH.js → StatusBadge-CXsYqmdU.js} +2 -2
- package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.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-D--LXgQm.js → Surface-BfDmQcKe.js} +2 -2
- package/dist/core/web/public/next/assets/{Surface-D--LXgQm.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-PMixU6b0.js → Switch-9NtO_6Lj.js} +2 -2
- package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js.map → Switch-9NtO_6Lj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js → Tag-DscCRFcN.js} +2 -2
- package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js.map → Tag-DscCRFcN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js → TerminalPane-B668-DJW.js} +5 -5
- package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.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-DtXFhAhw.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js → UniverseView-DG70zH0W.js} +4 -4
- package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.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-BQSZFSeO.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-Ci6I4C0l.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-DlwnfqwJ.js → apps-model-Du02KhAf.js} +2 -2
- package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js.map → apps-model-Du02KhAf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js → authority-model-79SeuKlJ.js} +2 -2
- package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.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-DsAjH8ac.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
- package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.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-BDivRMqv.js +2 -0
- package/dist/core/web/public/next/assets/{cloud-model-CX407gPY.js.map → cloud-model-BDivRMqv.js.map} +1 -1
- package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js → cloud-queries-BPQQ5_pJ.js} +2 -2
- package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.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-CF0cQQac.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-Co4wh3SM.js → context-model-Br8t9jgG.js} +2 -2
- package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js.map → context-model-Br8t9jgG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js → context-model-CokrgEUq.js} +3 -3
- package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.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-CktFQqSS.js.map → context-queries-eL3caKVG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js → control-queries-B9K-wmcB.js} +2 -2
- package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js.map → control-queries-B9K-wmcB.js.map} +1 -1
- package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js +2 -0
- package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js.map +1 -0
- package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js → dock-icons-BJ6ZqB2t.js} +2 -2
- package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js → fleet-model-BvDR3gjp.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js → fleet-queries-W2UFVMZJ.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js → focus-trap-CtI1SlMX.js} +2 -2
- package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
- package/dist/core/web/public/next/assets/format-CH4g_sl1.js +2 -0
- package/dist/core/web/public/next/assets/format-CH4g_sl1.js.map +1 -0
- 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-_BnI_Ogh.js → git-model-Dnkd1TnK.js} +2 -2
- package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.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-CNNGMril.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-DPh2d32e.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{icons-0haWy6nh.js → icons-D1sYbCTQ.js} +2 -2
- package/dist/core/web/public/next/assets/{icons-0haWy6nh.js.map → icons-D1sYbCTQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{index-QesfXBsb.js → index-DZ-UQ7v8.js} +3 -3
- package/dist/core/web/public/next/assets/{index-QesfXBsb.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-De-q0ZFK.js → live-model-D_32RAOR.js} +2 -2
- package/dist/core/web/public/next/assets/live-model-D_32RAOR.js.map +1 -0
- package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js → mind.module-7hA92hRg.js} +2 -2
- package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.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-DTCtKCn_.js.map → mutations-DQPbFdRJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js → nav-0dOYe2rJ.js} +2 -2
- package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js.map → nav-0dOYe2rJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js → overnight-queries-C4wOnFtE.js} +2 -2
- package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.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-CyBE8nsW.js → queries-BTXWdZzU.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js.map → queries-BTXWdZzU.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js → reasoning-pref-Ca6lN6x_.js} +2 -2
- package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js → reveal-anchor-DfNLgK_I.js} +2 -2
- package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.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-C5Tvr0WQ.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js → sidebar-model-CLCdqwkR.js} +2 -2
- package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
- package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js → slots-C-qBeu-8.js} +3 -3
- package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js.map → slots-C-qBeu-8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js → surface-data-Dj71tdD-.js} +2 -2
- package/dist/core/web/public/next/assets/{surface-data-CchClvHo.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-D6WFVULI.js → tasks-model-O8yR5YXp.js} +2 -2
- package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js → terminal-icons-CoRZq9iO.js} +2 -2
- package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.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/types-IYKrYLku.js +2 -0
- package/dist/core/web/public/next/assets/types-IYKrYLku.js.map +1 -0
- package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js → usage-queries-AdjEyEtn.js} +2 -2
- package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js → use-guarded-action-CuuMHeDX.js} +2 -2
- package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js → use-ticker-BBcp02SZ.js} +2 -2
- package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js → use-token-gate-CbXVYQYI.js} +2 -2
- package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js → useOnboarding-C_Fpe_sH.js} +2 -2
- package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
- package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js → useVerseTranscript-DgbigUlV.js} +2 -2
- package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
- package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js → verse-icons-S56hIiXS.js} +2 -2
- package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.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-MMySehjj.js.map → verse-model-DAVevkNe.js.map} +1 -1
- package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js → warmup-B_RAtNZ_.js} +3 -3
- package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js.map → warmup-B_RAtNZ_.js.map} +1 -1
- package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js +2 -0
- package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js.map +1 -0
- package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js → workspace-model-dji5-Al3.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.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/docs/AUTONOMY-GAP.md +1 -1
- package/package.json +3 -2
- package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js +0 -2
- package/dist/core/web/public/next/assets/App-E2zCDRxm.js +0 -7
- package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-B46igJKR.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js.map +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js +0 -2
- package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
- package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js +0 -2
- package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js.map +0 -1
- package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js +0 -2
- package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js +0 -3
- package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-iiQg6wvK.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-BRuCcTjT.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouList-BgH8ezqf.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js +0 -2
- package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js +0 -3
- package/dist/core/web/public/next/assets/PreviewPane-BPBbcROb.js +0 -2
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BX2nkdmZ.js +0 -7
- package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js +0 -2
- package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js.map +0 -1
- package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
- package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.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-DtXFhAhw.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js +0 -10
- package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
- package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js +0 -2
- package/dist/core/web/public/next/assets/budget-queries-DsAjH8ac.js +0 -2
- package/dist/core/web/public/next/assets/charts-C_xJbJiw.js +0 -2
- package/dist/core/web/public/next/assets/charts-C_xJbJiw.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
- package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-CktFQqSS.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js.map +0 -1
- package/dist/core/web/public/next/assets/format-Dk4Fmxax.js +0 -2
- package/dist/core/web/public/next/assets/format-Dk4Fmxax.js.map +0 -1
- package/dist/core/web/public/next/assets/global-CNNGMril.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-DPh2d32e.js +0 -2
- package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-DTCtKCn_.js +0 -2
- package/dist/core/web/public/next/assets/primitives-D0Fb3TtS.js +0 -1
- package/dist/core/web/public/next/assets/seat-subscription-C5Tvr0WQ.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js.map +0 -1
- package/dist/core/web/public/next/assets/types-D5XOdyw8.js +0 -2
- package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-model-MMySehjj.js +0 -2
- package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js +0 -2
- package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js.map +0 -1
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SessionSearch-DbFjwR1h.js","assets/context-queries-eL3caKVG.js","assets/verse-store-DNVRuiJL.js","assets/transient-events-nTLhMBND.js","assets/context-model-CokrgEUq.js","assets/use-token-gate-CbXVYQYI.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-DZ-UQ7v8.js";import{h as i,i as a}from"./global-CMNW_dqn.js";import{t as o}from"./Dialog-D3msQlCj.js";import{t as s}from"./RefreshIndicator-DO9ibnSq.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-CWU6R3By.js";import{u as g,v as _,x as v,y}from"./verse-model-DAVevkNe.js";import{n as b}from"./seat-subscription-C5uPHBsN.js";import{_ as ee,c as x,f as S,g as C,h as w,i as T,l as E,n as te,r as D,t as O,v as k}from"./workspace-model-dji5-Al3.js";import{n as ne,t as A}from"./folder-picker-C8zo3A56.js";import{t as j}from"./Button-D90dzI_o.js";import{t as M}from"./ActionMenu-CIiX2X8w.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-BJ6ZqB2t.js";import{n as B,r as V,t as H}from"./sidebar-model-CLCdqwkR.js";import{a as U,c as W,u as G}from"./verse-icons-S56hIiXS.js";import{a as K}from"./command-catalog-BIntSa9l.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,y]=(0,q.useState)(``),[b,C]=(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;y(e?.name??``),C(e?ee(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=b.length===0?[``]:b,U=A();function W(e,t){C(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]??E(e,i)}async function X(e){e.preventDefault();let t=w(v,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!==E(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:v,onChange:e=>y(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":S(t),autoComplete:`off`,spellCheck:!1}),U?(0,Y.jsx)(`button`,{type:`button`,className:J.rowButton,onClick:()=>void G(t),"aria-label":`Choose ${S(t).toLowerCase()}`,children:`Choose folder…`}):null,(0,Y.jsx)(`button`,{type:`button`,className:J.rowButton,disabled:t===0,onClick:()=>C(x(H,t,`up`)),"aria-label":`Move ${S(t).toLowerCase()} up`,title:`Move ${S(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:()=>C(x(H,t,`down`)),"aria-label":`Move ${S(t).toLowerCase()} down`,title:`Move ${S(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:()=>C(H.filter((e,n)=>n!==t)),"aria-label":`Remove ${S(t).toLowerCase()}`,children:`Remove`})]},t)),H.length<8?(0,Y.jsx)(`button`,{type:`button`,className:J.addRoot,onClick:()=>C([...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:_(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:T.map(e=>(0,Y.jsx)(`option`,{value:e,children:te[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=i(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=C(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-DbFjwR1h.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:i,seats:c,selectedId:l,query:d,onQuery:p,onSelect:m,onNew:h,onRetry:g,onCollapse:_,onDisconnect:v,activity:y=null,meta:b=null,metaError:ee=null,localSeen:x=ie,actions:S}=e,C=(0,q.useId)(),w=K(`chat.new`)?.keys[0],T=K(`chat.sidebar`)?.keys[0],E=w?u(w):null,te=T?u(T):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:i,query:d,filter:D,activity:y,meta:b,localSeen:x,selectedId:l}),[t,i,d,D,y,b,x,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){S&&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:C,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:C,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:E??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:te??void 0,placement:`bottom`,children:(0,Y.jsx)(`button`,{type:`button`,className:Q.iconButton,onClick:_,"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)(a,{width:`48%`}),(0,Y.jsx)(a,{width:`86%`}),(0,Y.jsx)(a,{width:`74%`}),(0,Y.jsx)(a,{width:`40%`}),(0,Y.jsx)(a,{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:g,children:`Retry`})]}):B.groups.length===0?(0,Y.jsx)(de,{query:d,filter:D,hasSessions:t.length>0,newChatHint:E,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:S?oe:void 0,onRenameDone:async(e,t)=>{N(null),S&&t&&t!==e.session.title&&await S.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),v()},children:`Disconnect`})]})}),P&&S?(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,S,B.metaAvailable,ee,()=>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=y(t,a.seatId),c=s===void 0?null:b(s),l=o.kind===`running`&&c?.cls===`blocked`,u=[a.title||`Untitled chat`,v(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:g(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-DN--cPYN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/workspaces/SavedProjectDialog.tsx","../../../../../../src/web-ui/routes/verse/workspaces/SavedProjects.tsx","../../../../../../src/web-ui/routes/verse/Sidebar.tsx"],"sourcesContent":["/**\n * routes/verse/workspaces/SavedProjectDialog.tsx — create, rename, reorder and\n * delete a SAVED PROJECT (a workspace in `~/.ashlr/verse/workspaces.json`).\n *\n * Why this dialog exists: the workspace routes were complete and nothing in\n * the console ever called them, so the only way to get a saved project was to\n * hand-edit a JSON file. A folder the operator typed into the new-chat dialog\n * came back only AFTER a chat had been created on it. Now a folder can be kept\n * before any chat exists, which is what \"open my project again tomorrow\"\n * actually requires.\n *\n * Three honesty rules are load-bearing here:\n *\n * - THE FIRST FOLDER IS THE PRIMARY. It is the session's cwd, and it is the\n * only folder a Grok seat can reach, so the reorder buttons are not\n * cosmetic and the first row says \"Primary folder\" rather than \"Folder 1\".\n * - PRIORITY ORDERS, IT NEVER GRANTS. `ROOT_PRIORITY_NOTE` is rendered at the\n * point of the choice; ranking a repo `critical` does not enrol it.\n * - NO SEAT IS CHOSEN HERE, so no per-seat caveat can be honest. The dialog\n * states the engine rule flatly instead (`MULTI_ROOT_ENGINE_NOTE`); the\n * seat-specific warning belongs in the new-chat dialog, where a seat exists.\n */\nimport { useEffect, useId, useState, type FormEvent } from 'react';\nimport type { VerseRootPriority, VerseWorkspace } from '../../../data/api-types.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { nativePickerAvailable, pickDirectory } from '../folder-picker.js';\nimport { projectName } from '../verse-model.js';\nimport {\n createVerseWorkspace,\n deleteVerseWorkspace,\n setVerseFocusSection,\n setVerseRootPriority,\n updateVerseWorkspace,\n} from '../verse-queries.js';\nimport {\n MAX_WORKSPACE_ROOTS,\n MULTI_ROOT_ENGINE_NOTE,\n moveRoot,\n priorityOf,\n ROOT_PRIORITY_LABEL,\n ROOT_PRIORITY_NOTE,\n ROOT_PRIORITY_ORDER,\n rootRowLabel,\n validateWorkspaceDraft,\n workspaceRootPaths,\n} from '../workspace-model.js';\nimport styles from './SavedProjectDialog.module.css';\n\nexport interface SavedProjectDialogProps {\n open: boolean;\n /** The project being edited, or null to create a new one. */\n workspace: VerseWorkspace | null;\n /** Folder set to pre-fill a NEW project with (primary first). */\n initialRoots?: readonly string[];\n /** Per-path priority as the server holds it. Absent key means `normal`. */\n priorities?: Readonly<Record<string, VerseRootPriority>>;\n /** The section the autonomous lane is focused on, if any. */\n focusSectionId?: string | null;\n onClose: () => void;\n onSaved?: (workspace: VerseWorkspace) => void;\n onDeleted?: (id: string) => void;\n}\n\nexport function SavedProjectDialog(props: SavedProjectDialogProps) {\n const { open, workspace, initialRoots, priorities, focusSectionId = null, onClose, onSaved, onDeleted } = props;\n const titleId = useId();\n const nameId = useId();\n const [name, setName] = useState('');\n const [roots, setRoots] = useState<string[]>(['']);\n const [section, setSection] = useState(false);\n const [focused, setFocused] = useState(false);\n const [priorityDraft, setPriorityDraft] = useState<Record<string, VerseRootPriority>>({});\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Reset on the OPEN transition only, for the same reason NewChatDialog does:\n // the workspace list is a fresh array on every invalidation, and re-running\n // this on it would wipe a half-typed path.\n useEffect(() => {\n if (!open) return;\n const existing = workspace;\n setName(existing?.name ?? '');\n setRoots(existing ? workspaceRootPaths(existing) : [...(initialRoots ?? [])].filter((r) => r.length > 0));\n setSection(existing?.section ?? false);\n setFocused(existing !== null && focusSectionId === existing.id);\n setPriorityDraft({});\n setConfirmingDelete(false);\n setBusy(false);\n setError(null);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- open transition only; the inputs are read once, on purpose.\n }, [open]);\n\n // Always at least one row, so there is somewhere to type the primary folder.\n const rows = roots.length === 0 ? [''] : roots;\n const showPicker = nativePickerAvailable();\n\n function setRow(index: number, value: string) {\n setRoots(rows.map((r, i) => (i === index ? value : r)));\n }\n\n async function choose(index: number) {\n const picked = await pickDirectory();\n if (picked !== null && picked.length > 0) setRow(index, picked);\n }\n\n function priorityFor(path: string): VerseRootPriority {\n return priorityDraft[path] ?? priorityOf(path, priorities);\n }\n\n async function submit(event: FormEvent) {\n event.preventDefault();\n const draft = validateWorkspaceDraft(name, rows);\n if (!draft.ok) {\n setError(draft.error);\n return;\n }\n setBusy(true);\n setError(null);\n try {\n const saved = workspace === null\n ? await createVerseWorkspace({ name: draft.name, roots: draft.roots, section })\n : await updateVerseWorkspace(workspace.id, { name: draft.name, roots: draft.roots, section });\n // Priority is an attribute OF THE REPO, held once per path, so it is a\n // separate call per changed path rather than part of the workspace body.\n for (const path of draft.roots) {\n const next = priorityDraft[path];\n if (next !== undefined && next !== priorityOf(path, priorities)) {\n await setVerseRootPriority(path, next);\n }\n }\n const wasFocused = workspace !== null && focusSectionId === workspace.id;\n if (section && focused !== wasFocused) {\n await setVerseFocusSection(focused ? saved.id : null);\n }\n onSaved?.(saved);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n }\n\n async function remove() {\n if (workspace === null) return;\n setBusy(true);\n setError(null);\n try {\n await deleteVerseWorkspace(workspace.id);\n onDeleted?.(workspace.id);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n setBusy(false);\n }\n }\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n titleId={titleId}\n title={workspace === null ? 'Save a project' : 'Edit project'}\n description=\"Saved projects stay in the picker — they do not need a chat on them first.\"\n widthClassName={styles.width}\n >\n <form className={styles.form} onSubmit={(event) => void submit(event)} noValidate>\n <label className={styles.field} htmlFor={nameId}>\n <span className={styles.label}>Name</span>\n <input id={nameId} className={styles.input} value={name} onChange={(event) => setName(event.target.value)}\n placeholder=\"Defaults to the folder’s own name\" maxLength={120} autoComplete=\"off\" />\n </label>\n\n <div className={styles.field}>\n <span className={styles.label}>Folders</span>\n <p className={styles.hint}>\n The first folder is the primary: it is the chat’s working directory. Move a folder to the top to make it\n the primary.\n </p>\n {rows.map((root, index) => (\n <div key={index} className={styles.rootRow}>\n <input\n className={styles.input}\n value={root}\n // A long path is cut with an ellipsis while the field is idle; the tooltip keeps it whole.\n title={root || undefined}\n onChange={(event) => setRow(index, event.target.value)}\n placeholder=\"/absolute/path/to/folder\"\n aria-label={rootRowLabel(index)}\n autoComplete=\"off\"\n spellCheck={false}\n />\n {showPicker ? (\n <button type=\"button\" className={styles.rowButton} onClick={() => void choose(index)}\n aria-label={`Choose ${rootRowLabel(index).toLowerCase()}`}>Choose folder…</button>\n ) : null}\n {/* Glyph-only: the accessible name AND the tooltip both say what the arrow does. */}\n <button type=\"button\" className={styles.rowButton} disabled={index === 0}\n onClick={() => setRoots(moveRoot(rows, index, 'up'))}\n aria-label={`Move ${rootRowLabel(index).toLowerCase()} up`}\n title={`Move ${rootRowLabel(index).toLowerCase()} up`}><span aria-hidden=\"true\">↑</span></button>\n <button type=\"button\" className={styles.rowButton} disabled={index === rows.length - 1}\n onClick={() => setRoots(moveRoot(rows, index, 'down'))}\n aria-label={`Move ${rootRowLabel(index).toLowerCase()} down`}\n title={`Move ${rootRowLabel(index).toLowerCase()} down`}><span aria-hidden=\"true\">↓</span></button>\n <button type=\"button\" className={styles.rowButton} disabled={rows.length === 1}\n onClick={() => setRoots(rows.filter((_, i) => i !== index))}\n aria-label={`Remove ${rootRowLabel(index).toLowerCase()}`}>Remove</button>\n </div>\n ))}\n {rows.length < MAX_WORKSPACE_ROOTS ? (\n <button type=\"button\" className={styles.addRoot} onClick={() => setRoots([...rows, ''])}>Add a folder</button>\n ) : null}\n {rows.length > 1 ? <p className={styles.hint}>{MULTI_ROOT_ENGINE_NOTE}</p> : null}\n </div>\n\n <div className={styles.field}>\n <label className={styles.checkbox}>\n <input type=\"checkbox\" checked={section} onChange={(event) => setSection(event.target.checked)} />\n <span>Offer this project to the autonomous lane as a section</span>\n </label>\n {section ? (\n <>\n <label className={styles.checkbox}>\n <input type=\"checkbox\" checked={focused} onChange={(event) => setFocused(event.target.checked)} />\n <span>Focus the fleet on this section</span>\n </label>\n <p className={styles.hint}>{ROOT_PRIORITY_NOTE}</p>\n {rows.filter((r) => r.trim().length > 0).map((root, index) => (\n <div key={`${root}-${index}`} className={styles.priorityRow}>\n {/* The folder's own name; the full path is the tooltip (and the select's accessible name). */}\n <span className={styles.priorityPath} title={root}>{projectName(root.trim())}</span>\n <select\n className={styles.select}\n aria-label={`Priority for ${root}`}\n value={priorityFor(root.trim())}\n onChange={(event) =>\n setPriorityDraft({ ...priorityDraft, [root.trim()]: event.target.value as VerseRootPriority })}\n >\n {ROOT_PRIORITY_ORDER.map((p) => (\n <option key={p} value={p}>{ROOT_PRIORITY_LABEL[p]}</option>\n ))}\n </select>\n </div>\n ))}\n </>\n ) : null}\n </div>\n\n {error ? <p role=\"alert\" className={styles.error}>{error}</p> : null}\n\n <div className={styles.actions}>\n {workspace === null ? null : confirmingDelete ? (\n <>\n <span className={styles.confirm}>Forget this project? Chats already on it are untouched.</span>\n <button type=\"button\" className={styles.danger} onClick={() => void remove()} disabled={busy}>Forget</button>\n <button type=\"button\" className={styles.cancel} onClick={() => setConfirmingDelete(false)}>Keep</button>\n </>\n ) : (\n <button type=\"button\" className={styles.remove} onClick={() => setConfirmingDelete(true)} disabled={busy}>\n Forget project\n </button>\n )}\n <span className={styles.spacer} />\n <button type=\"button\" className={styles.cancel} onClick={onClose}>Cancel</button>\n <button type=\"submit\" className={styles.save} disabled={busy}>{busy ? 'Saving…' : 'Save project'}</button>\n </div>\n </form>\n </Dialog>\n );\n}\n","/**\n * routes/verse/workspaces/SavedProjects.tsx — the sidebar's \"Projects\"\n * section: every saved project, and the one button that creates one.\n *\n * SELF-SUPPLIED ON PURPOSE. It reads `verseWorkspacesQuery` itself rather\n * than taking the list as a prop, because the sidebar's props are owned by the\n * chat section and this list has exactly one consumer. The key is the same one\n * the new-chat dialog's list is read from, so the cache serves both from one\n * request and the picker and this list can never disagree.\n *\n * Quiet when the read fails: an older server has no /api/verse/workspaces at\n * all, and a permanent red line in the sidebar for a feature that server does\n * not have would be noise, not honesty. The \"Save a project\" button stays —\n * pressing it surfaces the real refusal from the server, in the dialog.\n */\nimport { useState } from 'react';\nimport type { VerseWorkspace } from '../../../data/api-types.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { PlusIcon } from '../verse-icons.js';\nimport { verseWorkspacesQuery } from '../verse-queries.js';\nimport { workspacePrimary, workspaceSummary } from '../workspace-model.js';\nimport { SavedProjectDialog } from './SavedProjectDialog.js';\nimport styles from './SavedProjects.module.css';\n\nexport function SavedProjects() {\n const query = useQuery(verseWorkspacesQuery);\n const workspaces = query.data?.workspaces ?? [];\n const [editing, setEditing] = useState<{ open: boolean; workspace: VerseWorkspace | null }>(\n { open: false, workspace: null },\n );\n\n return (\n <section className={styles.projects} aria-label=\"Saved projects\">\n <h2 className={styles.head}>\n <span className={styles.headText}>Projects</span>\n <button\n type=\"button\"\n className={styles.add}\n title=\"Save a project\"\n aria-label=\"Save a project\"\n onClick={() => setEditing({ open: true, workspace: null })}\n >\n <PlusIcon />\n </button>\n </h2>\n\n {workspaces.length > 0 ? (\n <ul className={styles.list}>\n {workspaces.map((workspace) => {\n const primary = workspacePrimary(workspace) ?? '';\n return (\n <li key={workspace.id}>\n <button\n type=\"button\"\n className={styles.project}\n // The name truncates to one line, so the tooltip carries it in\n // full, then the primary folder — which costs no pixels here.\n title={primary ? `${workspace.name}\\n${primary}` : workspace.name}\n aria-label={`Edit project ${workspace.name}`}\n onClick={() => setEditing({ open: true, workspace })}\n >\n <span className={styles.name}>{workspace.name}</span>\n <span className={styles.summary}>{workspaceSummary(workspace)}</span>\n </button>\n </li>\n );\n })}\n </ul>\n ) : query.status === 'error' ? null : (\n <p className={styles.empty}>No saved projects yet. Press + to keep a folder you work in.</p>\n )}\n\n <SavedProjectDialog\n open={editing.open}\n workspace={editing.workspace}\n priorities={query.data?.priorities}\n focusSectionId={query.data?.focusSectionId ?? null}\n onClose={() => setEditing({ open: false, workspace: null })}\n />\n </section>\n );\n}\n","/**\n * routes/verse/Sidebar.tsx — the chat list (3.10, SPEC-310C §2; model:\n * chat/sidebar-model.ts).\n *\n * [search…………………………] [+] [⫿]\n * (All) (Running 2) (Needs you 1) (Pinned 3)\n * SAVED PROJECTS …\n * PINNED\n * │ Fix the login bug ● 1m 02s\n * │ npm test\n * HUB\n * │ Write the docs • ← unread\n * │ Migrate the store ! ← failed\n * ▸ ARCHIVED 12\n *\n * One row is a 2px engine tick, the title and ONE status — the most urgent\n * that applies: a pulse with the elapsed time (running), a failure mark, an\n * unread dot, or how long ago. A running row adds a muted second line from\n * activity: the command it is running, or the tail of what it is thinking.\n * Every status is a glyph with an accessible name, at least 11px, and never\n * colour alone (DESIGN §6). The row's tooltip spells the status out too\n * (\"… · Last turn failed\"), so the \"!\" is explained to a sighted pointer user\n * as well as to a screen reader.\n *\n * Group headings are the project's display name as it is on disk (never\n * upper-cased: a folder slug shouted in caps is a different-looking name),\n * with the full path as their tooltip. ↑/↓ move between chats, Home/End jump\n * to the ends, Enter opens; ↓ from the search field lands on the first chat.\n *\n * Hover a row (or right-click it, or press Shift+F10 / the menu key on it)\n * for pin, archive, rename, hand off and delete. Pin and archive need C1's\n * session-meta route; on a server without it they are shown disabled with\n * the reason, rather than hidden.\n *\n * ONE SEARCH FIELD, TWO ANSWERS (V3.9): titles and projects filter instantly\n * on the client; underneath, SessionSearch lists chats whose MESSAGES match\n * (a scan on this machine, nothing sent to a model).\n *\n * Saved projects sit above the chats: the registry the operator writes\n * deliberately (workspaces/SavedProjects.tsx).\n */\nimport { lazy, Suspense, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent, type MouseEvent as ReactMouseEvent } from 'react';\nimport type { VerseProject, VerseSeat, VerseSession } from '../../data/api-types.js';\nimport type { VerseActivityResponse, VerseSessionMetaResponse } from '../../../core/verse/workbench-types.js';\nimport type { QueryStatus } from '../../data/cache.js';\nimport { Button } from '../../components/primitives/Button.js';\nimport { Dialog } from '../../components/primitives/Dialog.js';\nimport { RefreshIndicator } from '../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../components/primitives/Skeleton.js';\nimport { Tooltip } from '../../components/primitives/Tooltip.js';\nimport { ActionMenu, type ActionMenuItem, type MenuAnchor } from './chat/ActionMenu.js';\nimport { LiveTimer } from './chat/LiveTimer.js';\nimport {\n buildSidebar,\n SIDEBAR_FILTERS,\n SIDEBAR_FILTER_LABEL,\n type SidebarFilter,\n type SidebarGroup,\n type SidebarRow,\n} from './chat/sidebar-model.js';\nimport { ArchiveGlyph, HandoffGlyph, MoreGlyph, PinGlyph, RenameGlyph, TrashGlyph } from './dock/dock-icons.js';\nimport { PlusIcon, SearchIcon, SidebarIcon } from './verse-icons.js';\nimport { seatSubscription } from './seat-subscription.js';\nimport { formatRelative, seatById, seatPillLabel } from './verse-model.js';\nimport { SavedProjects } from './workspaces/SavedProjects.js';\nimport { findCommand, formatChord } from './shell/command-catalog.js';\nimport styles from './Sidebar.module.css';\n\nexport interface SidebarProps {\n sessions: readonly VerseSession[];\n sessionsStatus: QueryStatus;\n sessionsError: string | null;\n projects: readonly VerseProject[];\n seats: readonly VerseSeat[];\n selectedId: string | null;\n query: string;\n onQuery: (value: string) => void;\n onSelect: (id: string) => void;\n onNew: () => void;\n onRetry: () => void;\n onCollapse: () => void;\n /** Called only once the operator confirms the footer's \"Disconnect from hub\" dialog. */\n onDisconnect: () => void;\n /** 3.10 — C1's activity (null: not on this server / not answered yet). */\n activity?: VerseActivityResponse | null;\n /** 3.10 — C1's per-chat meta (null: not on this server / not answered yet). */\n meta?: VerseSessionMetaResponse | null;\n /**\n * Why the per-chat meta could not be read (the server's sentence), when it\n * failed rather than being absent. Pin/Archive then name THIS as their\n * reason instead of \"not available on this server yet\".\n */\n metaError?: string | null;\n /** Turn counts this tab has seen, per chat. */\n localSeen?: ReadonlyMap<string, number>;\n /** Row actions (3.10). Absent → the row menu is not offered. */\n actions?: SidebarRowActions;\n}\n\nexport interface SidebarRowActions {\n setPinned: (sessionId: string, pinned: boolean) => void;\n setArchived: (sessionId: string, archived: boolean) => void;\n rename: (sessionId: string, title: string) => Promise<boolean>;\n handoff: (sessionId: string) => void;\n requestDelete: (sessionId: string) => void;\n /** False on a read-only server: every write is shown disabled with this reason. */\n dispatchEnabled: boolean;\n}\n\nconst NO_SEEN: ReadonlyMap<string, number> = new Map();\n\n// Message search loads with the first query, not with the chat list.\nconst SessionSearch = lazy(() => import('./context/SessionSearch.js').then((m) => ({ default: m.SessionSearch })));\n\nexport function Sidebar(props: SidebarProps) {\n const { sessions, sessionsStatus, sessionsError, projects, seats, selectedId, query, onQuery, onSelect, onNew,\n onRetry, onCollapse, onDisconnect, activity = null, meta = null, metaError = null, localSeen = NO_SEEN, actions } = props;\n const searchId = useId();\n const newChatShortcut = findCommand('chat.new')?.keys[0];\n const sidebarShortcut = findCommand('chat.sidebar')?.keys[0];\n const newChatHint = newChatShortcut ? formatChord(newChatShortcut) : null;\n const sidebarHint = sidebarShortcut ? formatChord(sidebarShortcut) : null;\n const [filter, setFilter] = useState<SidebarFilter>('all');\n const [archivedOpen, setArchivedOpen] = useState(false);\n const [renaming, setRenaming] = useState<string | null>(null);\n const [menu, setMenu] = useState<{ row: SidebarRow; anchor: MenuAnchor; from: HTMLElement } | null>(null);\n const [confirmDisconnect, setConfirmDisconnect] = useState(false);\n const disconnectTitleId = useId();\n const disconnectCancelRef = useRef<HTMLButtonElement>(null);\n const model = useMemo(\n () => buildSidebar({ sessions, projects, query, filter, activity, meta, localSeen, selectedId }),\n [sessions, projects, query, filter, activity, meta, localSeen, selectedId],\n );\n const loading = sessionsStatus === 'loading' || (sessionsStatus === 'idle' && sessions.length === 0);\n const searching = query.trim().length > 0;\n const scrollRef = useRef<HTMLDivElement>(null);\n\n /** ↓ from the search field: into the list, on its first chat. */\n function onSearchKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n if (event.key !== 'ArrowDown') return;\n const first = scrollRef.current?.querySelector<HTMLElement>(ROW_SELECTOR);\n if (!first) return;\n event.preventDefault();\n first.focus();\n }\n\n function openMenu(row: SidebarRow, anchor: MenuAnchor, from: HTMLElement) {\n if (!actions) return;\n setMenu({ row, anchor, from });\n }\n\n return (\n <nav className={styles.sidebar} aria-label=\"Chats\">\n <div className={styles.head}>\n {/* Draggable strip under the overlay title bar; zero-height in a browser. */}\n <div className={styles.headDragStrip} aria-hidden=\"true\" />\n <label className={styles.search} htmlFor={searchId}>\n <span className={styles.searchIcon} aria-hidden=\"true\"><SearchIcon /></span>\n <span className=\"visually-hidden\">Search chats and messages</span>\n <input id={searchId} type=\"search\" value={query} placeholder=\"Search chats\" autoComplete=\"off\"\n onChange={(event) => onQuery(event.target.value)} onKeyDown={onSearchKeyDown} />\n </label>\n <Tooltip label=\"New chat\" shortcut={newChatHint ?? undefined} placement=\"bottom\">\n <button type=\"button\" className={styles.iconButton} onClick={onNew} aria-label=\"New chat\">\n <PlusIcon />\n </button>\n </Tooltip>\n <Tooltip label=\"Hide chat list\" shortcut={sidebarHint ?? undefined} placement=\"bottom\">\n <button type=\"button\" className={styles.iconButton} onClick={onCollapse} aria-label=\"Hide chat list\">\n <SidebarIcon />\n </button>\n </Tooltip>\n {sessionsStatus === 'refreshing' ? <RefreshIndicator label=\"Refreshing chats\" /> : null}\n </div>\n\n <FilterChips value={filter} counts={model.counts} onChange={setFilter} />\n\n <div ref={scrollRef} className={styles.scroll} onKeyDown={onRowsKeyDown}>\n <SavedProjects />\n {loading ? (\n <div className={styles.skeleton} aria-busy=\"true\">\n <SkeletonLine width=\"48%\" /><SkeletonLine width=\"86%\" /><SkeletonLine width=\"74%\" />\n <SkeletonLine width=\"40%\" /><SkeletonLine width=\"80%\" />\n </div>\n ) : sessionsStatus === 'error' && sessions.length === 0 ? (\n <div role=\"alert\" className={styles.error}>\n <p>{sessionsError ?? 'Could not load chats.'}</p>\n <button type=\"button\" onClick={onRetry}>Retry</button>\n </div>\n ) : model.groups.length === 0 ? (\n <EmptyList query={query} filter={filter} hasSessions={sessions.length > 0} newChatHint={newChatHint} onClearQuery={() => onQuery('')}\n onClearFilter={() => setFilter('all')} onNew={onNew} />\n ) : model.groups.map((group) => (\n <GroupView key={group.id} group={group} seats={seats} selectedId={selectedId} renaming={renaming}\n open={group.kind !== 'archived' || archivedOpen || searching || filter !== 'all'}\n onToggle={group.kind === 'archived' ? () => setArchivedOpen((v) => !v) : undefined}\n onSelect={onSelect} onMenu={actions ? openMenu : undefined}\n onRenameDone={async (row, title) => {\n setRenaming(null);\n if (!actions || !title || title === row.session.title) return;\n await actions.rename(row.session.id, title);\n }} />\n ))}\n {searching ? (\n <Suspense fallback={null}>\n <SessionSearch query={query} onOpenSession={onSelect} selectedId={selectedId} />\n </Suspense>\n ) : null}\n </div>\n\n <footer className={styles.footer}>\n {/* clearReadSession (data/auth-store.ts): ends this window's read\n session — the cookie, the remembered token, the mutation hold,\n cached data and the composer's drafts — and shows the token screen\n again. The chats themselves stay on the hub. Said in the label and\n the tooltip, because \"Disconnect\" alone reads like a network blip.\n It throws away unsent drafts, so — like Settings ▸ Connection — it\n asks first; onDisconnect runs only from the dialog's red button. */}\n <Tooltip label=\"Signs this window out: clears cached chats and unsent drafts here. Chats stay on the hub.\" placement=\"top\">\n <button type=\"button\" onClick={() => setConfirmDisconnect(true)} className={styles.footerButton}\n aria-haspopup=\"dialog\">Disconnect from hub</button>\n </Tooltip>\n </footer>\n\n {/* The same confirm as Settings ▸ Connection (ConnectionPanel.tsx): the\n Dialog primitive, focus on CANCEL so Enter-Enter keeps the session,\n Escape and the backdrop cancel, and focus returns to the footer\n button. */}\n <Dialog open={confirmDisconnect} onClose={() => setConfirmDisconnect(false)} titleId={disconnectTitleId}\n title=\"Disconnect from this hub?\" initialFocusRef={disconnectCancelRef}\n description=\"Unsent drafts in open chats will be cleared. Your chats stay on the hub; you will need the read token to reconnect.\">\n <div className={styles.confirmActions}>\n <Button ref={disconnectCancelRef} variant=\"subtle\" onClick={() => setConfirmDisconnect(false)}>Cancel</Button>\n <Button variant=\"danger\" onClick={() => {\n setConfirmDisconnect(false);\n onDisconnect();\n }}>Disconnect</Button>\n </div>\n </Dialog>\n\n {menu && actions ? (\n <ActionMenu label={`Actions for ${menu.row.session.title || 'Untitled chat'}`} anchor={menu.anchor}\n returnFocus={menu.from} onClose={() => setMenu(null)}\n items={rowMenuItems(menu.row, actions, model.metaAvailable, metaError, () => setRenaming(menu.row.session.id))} />\n ) : null}\n </nav>\n );\n}\n\n/** Every chat row in the list (search results and saved projects are not rows). */\nconst ROW_SELECTOR = '[data-focus-key^=\"verse-session:\"]';\n\n/** ↑/↓ between chat rows, Home/End to the ends. Enter is the row button's own. */\nfunction onRowsKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (event.altKey || event.metaKey || event.ctrlKey || event.shiftKey) return;\n const target = event.target as HTMLElement;\n if (!target.matches(ROW_SELECTOR)) return;\n const rows = [...event.currentTarget.querySelectorAll<HTMLElement>(ROW_SELECTOR)];\n const at = rows.indexOf(target);\n let next: HTMLElement | undefined;\n if (event.key === 'ArrowDown') next = rows[at + 1];\n else if (event.key === 'ArrowUp') next = rows[at - 1];\n else if (event.key === 'Home') next = rows[0];\n else if (event.key === 'End') next = rows[rows.length - 1];\n else return;\n event.preventDefault();\n next?.focus();\n}\n\n/** The row's status in words, for its tooltip (the glyph's accessible name, said to everyone). */\nfunction rowStatusWords(status: SidebarRow['status']): string | null {\n switch (status.kind) {\n case 'running': return 'Running';\n case 'failed': return 'Last turn failed';\n case 'unread': return `${status.newTurns} new turn${status.newTurns === 1 ? '' : 's'}`;\n default: return null;\n }\n}\n\nfunction rowMenuItems(row: SidebarRow, actions: SidebarRowActions, metaAvailable: boolean, metaError: string | null,\n startRename: () => void): ActionMenuItem[] {\n const id = row.session.id;\n const running = row.status.kind === 'running';\n const writeReason = !actions.dispatchEnabled ? 'This server was started without dispatch.' : null;\n const metaReason = writeReason\n ?? (metaAvailable ? null : metaError ? `Pins and archive unavailable. ${metaError}` : 'Not available on this server yet.');\n return [\n {\n id: 'pin',\n label: row.pinned ? 'Unpin' : 'Pin',\n icon: <PinGlyph size={14} />,\n disabled: metaReason !== null,\n reason: metaReason,\n onSelect: () => actions.setPinned(id, !row.pinned),\n },\n {\n id: 'archive',\n label: row.archived ? 'Unarchive' : 'Archive',\n icon: <ArchiveGlyph size={14} />,\n disabled: metaReason !== null,\n reason: metaReason,\n onSelect: () => actions.setArchived(id, !row.archived),\n },\n { id: 'rename', label: 'Rename', icon: <RenameGlyph size={14} />, disabled: writeReason !== null, reason: writeReason, onSelect: startRename },\n {\n id: 'handoff',\n label: 'Continue in a fresh chat…',\n icon: <HandoffGlyph size={14} />,\n disabled: writeReason !== null || running,\n reason: writeReason ?? (running ? 'Available when its turn finishes.' : null),\n onSelect: () => actions.handoff(id),\n },\n {\n id: 'delete',\n label: 'Delete…',\n icon: <TrashGlyph size={14} />,\n danger: true,\n separated: true,\n disabled: writeReason !== null || running,\n reason: writeReason ?? (running ? 'Stop its turn before deleting.' : null),\n onSelect: () => actions.requestDelete(id),\n },\n ];\n}\n\n/**\n * All / Running / Needs you / Pinned — one radio group, ONE tab stop, ←/→\n * between the options (the list below is where Tab should go next).\n */\nfunction FilterChips({ value, counts, onChange }: { value: SidebarFilter; counts: Record<SidebarFilter, number>; onChange: (f: SidebarFilter) => void }) {\n const refs = useRef(new Map<SidebarFilter, HTMLButtonElement>());\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const i = SIDEBAR_FILTERS.indexOf(value);\n let next: SidebarFilter | undefined;\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') next = SIDEBAR_FILTERS[(i + 1) % SIDEBAR_FILTERS.length];\n else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') next = SIDEBAR_FILTERS[(i - 1 + SIDEBAR_FILTERS.length) % SIDEBAR_FILTERS.length];\n else if (event.key === 'Home') next = SIDEBAR_FILTERS[0];\n else if (event.key === 'End') next = SIDEBAR_FILTERS[SIDEBAR_FILTERS.length - 1];\n if (!next) return;\n event.preventDefault();\n onChange(next);\n refs.current.get(next)?.focus();\n }\n return (\n <div className={styles.filters} role=\"radiogroup\" aria-label=\"Show chats\" onKeyDown={onKeyDown}>\n {SIDEBAR_FILTERS.map((f) => {\n const n = counts[f];\n const checked = f === value;\n return (\n <button key={f} ref={(node) => { if (node) refs.current.set(f, node); else refs.current.delete(f); }}\n type=\"button\" role=\"radio\" aria-checked={checked} tabIndex={checked ? 0 : -1} className={styles.filter}\n data-filter={f} onClick={() => onChange(f)}>\n {SIDEBAR_FILTER_LABEL[f]}\n {f !== 'all' && n > 0 ? <span className={styles.filterCount}>{n}</span> : null}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction EmptyList({ query, filter, hasSessions, newChatHint, onClearQuery, onClearFilter, onNew }: {\n query: string;\n filter: SidebarFilter;\n hasSessions: boolean;\n newChatHint: string | null;\n onClearQuery: () => void;\n onClearFilter: () => void;\n onNew: () => void;\n}) {\n if (query.trim()) {\n return (\n <div className={`${styles.empty} ${styles.emptyCompact}`}>\n <p className={styles.emptyTitle}>No chat titles match “{query}”</p>\n <p>Titles and projects match as you type. Chats whose messages match, if any, are listed below.</p>\n <button type=\"button\" className={styles.emptyAction} onClick={onClearQuery}>Clear search</button>\n </div>\n );\n }\n if (filter !== 'all' && hasSessions) {\n const what = filter === 'running' ? 'No chat is running' : filter === 'needs-you' ? 'Nothing needs you' : 'No pinned chats';\n return (\n <div className={`${styles.empty} ${styles.emptyCompact}`}>\n <p className={styles.emptyTitle}>{what}</p>\n {filter === 'pinned' ? <p>Pin a chat from its row menu — hover it, or right-click.</p> : null}\n <button type=\"button\" className={styles.emptyAction} onClick={onClearFilter}>Show all chats</button>\n </div>\n );\n }\n return (\n <div className={styles.empty}>\n <p className={styles.emptyTitle}>No chats yet</p>\n <p>Start one on any project with any seat.</p>\n {/* Not named \"New chat\": the header already has a control by that name. */}\n <button type=\"button\" className={styles.emptyAction} onClick={onNew}>\n Start your first chat {newChatHint ? <kbd className={styles.emptyKey}>{newChatHint}</kbd> : null}\n </button>\n </div>\n );\n}\n\nfunction GroupView({ group, seats, selectedId, renaming, open, onToggle, onSelect, onMenu, onRenameDone }: {\n group: SidebarGroup;\n seats: readonly VerseSeat[];\n selectedId: string | null;\n renaming: string | null;\n open: boolean;\n onToggle?: () => void;\n onSelect: (id: string) => void;\n onMenu?: (row: SidebarRow, anchor: MenuAnchor, from: HTMLElement) => void;\n onRenameDone: (row: SidebarRow, title: string) => Promise<void>;\n}) {\n const listId = useId();\n return (\n <section className={styles.group} aria-label={group.label} data-group={group.kind}>\n <h2 className={styles.groupTitle} title={group.projectPath ?? undefined}>\n {onToggle ? (\n <button type=\"button\" className={styles.groupToggle} aria-expanded={open} aria-controls={listId} onClick={onToggle}>\n <span className={styles.twist} data-open={open || undefined} aria-hidden=\"true\" />\n <span className={styles.groupName}>{group.label}</span>\n </button>\n ) : <span className={styles.groupName}>{group.label}</span>}\n {group.enrolled ? <span className={styles.enrolled}>enrolled</span> : null}\n <span className={styles.groupCount} aria-hidden=\"true\">{group.rows.length}</span>\n </h2>\n <ul id={listId} className={styles.list} hidden={!open}>\n {open ? group.rows.map((row) => (\n <li key={row.session.id}>\n {renaming === row.session.id ? (\n <RenameRow row={row} onDone={(title) => { void onRenameDone(row, title); }} />\n ) : (\n <SessionRowView row={row} seats={seats} selected={row.session.id === selectedId} onSelect={onSelect} onMenu={onMenu} />\n )}\n </li>\n )) : null}\n </ul>\n </section>\n );\n}\n\nfunction SessionRowView({ row, seats, selected, onSelect, onMenu }: {\n row: SidebarRow;\n seats: readonly VerseSeat[];\n selected: boolean;\n onSelect: (id: string) => void;\n onMenu?: (row: SidebarRow, anchor: MenuAnchor, from: HTMLElement) => void;\n}) {\n const { session, status } = row;\n const seat = seatById(seats, session.seatId);\n const capacity = seat === undefined ? null : seatSubscription(seat);\n // Quiet by default: a marker only where it changes what the operator would\n // do — a turn in flight on a seat whose binding window is spent.\n const spentWhileRunning = status.kind === 'running' && capacity?.cls === 'blocked';\n const tip = [\n session.title || 'Untitled chat',\n seatPillLabel(seats, session),\n capacity === null || capacity.cls === 'ready' || capacity.cls === 'unread' ? null : capacity.summary,\n rowStatusWords(status),\n ].filter((part) => part !== null).join(' · ');\n const rowRef = useRef<HTMLButtonElement>(null);\n\n function onContextMenu(event: ReactMouseEvent<HTMLButtonElement>) {\n if (!onMenu) return;\n event.preventDefault();\n onMenu(row, { x: event.clientX, y: event.clientY }, event.currentTarget);\n }\n function onKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n if (!onMenu) return;\n if (event.key === 'ContextMenu' || (event.key === 'F10' && event.shiftKey)) {\n event.preventDefault();\n const rect = event.currentTarget.getBoundingClientRect();\n onMenu(row, { x: rect.left + 24, y: rect.bottom }, event.currentTarget);\n }\n }\n\n return (\n <div className={styles.row} data-selected={selected || undefined}>\n <Tooltip label={tip} placement=\"right\">\n <button ref={rowRef} type=\"button\" className={`${styles.session} ${styles[`engine-${session.engine}`] ?? ''}`}\n aria-current={selected ? 'true' : undefined}\n data-focus-key={`verse-session:${session.id}`} data-engine={session.engine} data-status={status.kind}\n aria-haspopup={onMenu ? 'menu' : undefined} aria-keyshortcuts={onMenu ? 'Shift+F10' : undefined}\n onClick={() => onSelect(session.id)} onContextMenu={onContextMenu} onKeyDown={onKeyDown}>\n <span className={styles.marker} aria-hidden=\"true\" />\n <span className={styles.sessionBody}>\n <span className={styles.sessionText}>{session.title || 'Untitled chat'}</span>\n {row.live ? <span className={styles.liveLine} title={row.live.text}>{row.live.text}</span> : null}\n </span>\n {spentWhileRunning && capacity !== null ? (\n <span className={styles.seatSpent} role=\"img\" aria-label={`Seat limit reached: ${capacity.summary}`}>▮</span>\n ) : null}\n <RowStatus row={row} />\n </button>\n </Tooltip>\n {onMenu ? (\n // A pointer affordance only, hidden from assistive tech: the row itself\n // announces its menu (aria-haspopup) and opens it with Shift+F10 or\n // the menu key, so a screen reader hears ONE control per chat.\n <button type=\"button\" className={styles.rowMore} tabIndex={-1} aria-hidden=\"true\" title=\"Chat actions\"\n onClick={(event) => {\n const rect = event.currentTarget.getBoundingClientRect();\n onMenu(row, { x: rect.right - 220, y: rect.bottom + 4 }, rowRef.current ?? event.currentTarget);\n }}>\n <MoreGlyph size={14} />\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction RowStatus({ row }: { row: SidebarRow }) {\n const { status, session } = row;\n // One wording for the glyph's name and the row's tooltip (rowStatusWords).\n const words = rowStatusWords(status) ?? undefined;\n switch (status.kind) {\n case 'running':\n return (\n <span className={styles.statusRunning}>\n <span className={styles.running} role=\"img\" aria-label={words} />\n {status.startedAt ? <LiveTimer className={styles.elapsed} since={status.startedAt} /> : null}\n </span>\n );\n case 'failed':\n return <span className={styles.errored} role=\"img\" aria-label={words}>!</span>;\n case 'unread':\n return <span className={styles.unread} role=\"img\" aria-label={words} />;\n default:\n return <time className={styles.time} dateTime={session.updatedAt}>{formatRelative(session.updatedAt)}</time>;\n }\n}\n\nfunction RenameRow({ row, onDone }: { row: SidebarRow; onDone: (title: string) => void }) {\n const [value, setValue] = useState(row.session.title);\n const input = useRef<HTMLInputElement>(null);\n const done = useRef(false);\n useEffect(() => { input.current?.focus(); input.current?.select(); }, []);\n const finish = (title: string) => {\n if (done.current) return;\n done.current = true;\n onDone(title.trim());\n };\n return (\n <div className={`${styles.row} ${styles.renameRow}`}>\n <input ref={input} className={styles.renameInput} value={value} maxLength={120} aria-label=\"Chat title\"\n onChange={(event) => setValue(event.target.value)}\n onBlur={() => finish(value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') { event.preventDefault(); finish(value); }\n else if (event.key === 'Escape') { event.preventDefault(); finish(row.session.title); }\n }} />\n </div>\n );\n}\n"],"file":"Sidebar-DN--cPYN.js"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,c as t,n}from"./index-
|
|
2
|
-
//# sourceMappingURL=Slider-
|
|
1
|
+
import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";var r=t(e(),1),i={field:`_field_228wn_1`,label:`_label_228wn_8`,row:`_row_228wn_15`,value:`_value_228wn_22`,input:`_input_228wn_32`},a=n();function o({label:e,value:t,min:n=0,max:o=100,valueLabel:s,valueText:c,trackImage:l,className:u,id:d,...f}){let p=(0,r.useId)(),m=d??p,h=Math.max(1,o-n),g=Math.round((t-n)/h*100);return(0,a.jsxs)(`div`,{className:`${i.field} ${u??``}`,children:[e?(0,a.jsx)(`label`,{className:i.label,htmlFor:m,children:e}):null,(0,a.jsxs)(`div`,{className:i.row,children:[(0,a.jsx)(`input`,{...f,id:m,type:`range`,className:i.input,value:t,min:n,max:o,"aria-valuetext":c,style:{"--slider-fill":`${g}%`,...l?{"--slider-track-image":l}:{}},"data-custom-track":l?`true`:void 0}),s===void 0?null:(0,a.jsx)(`span`,{className:i.value,children:s})]})]})}export{o as t};
|
|
2
|
+
//# sourceMappingURL=Slider-KVoJLDD6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Slider-
|
|
1
|
+
{"version":3,"file":"Slider-KVoJLDD6.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Slider.module.css","../../../../../../src/web-ui/components/primitives/Slider.tsx"],"sourcesContent":[".field {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.label {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n font-weight: var(--font-weight-medium);\n}\n\n.row {\n display: flex;\n align-items: center;\n gap: var(--space-3);\n height: var(--density-row);\n}\n\n.value {\n flex: none;\n min-width: 4ch;\n text-align: right;\n font-family: var(--font-display);\n font-variant-numeric: tabular-nums;\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n\n.input {\n appearance: none;\n -webkit-appearance: none;\n flex: 1;\n min-width: 0;\n height: 16px;\n background: none;\n cursor: pointer;\n}\n\n.input:focus {\n outline: none;\n}\n\n/* The ring goes on the thumb, not the whole row. */\n.input:focus-visible {\n box-shadow: none;\n}\n\n.input::-webkit-slider-runnable-track {\n height: 4px;\n border-radius: var(--radius-full);\n background: var(--slider-track-image, linear-gradient(to right, var(--accent-500) var(--slider-fill, 0%), var(--bg-active) var(--slider-fill, 0%)));\n}\n\n.input::-moz-range-track {\n height: 4px;\n border-radius: var(--radius-full);\n background: var(--slider-track-image, linear-gradient(to right, var(--accent-500) var(--slider-fill, 0%), var(--bg-active) var(--slider-fill, 0%)));\n}\n\n.input::-webkit-slider-thumb {\n appearance: none;\n -webkit-appearance: none;\n width: 12px;\n height: 12px;\n margin-top: -4px;\n border-radius: var(--radius-full);\n background: var(--bg-surface);\n border: 2px solid var(--accent-500);\n transition: border-color var(--duration-fast) var(--ease-standard);\n}\n\n.input::-moz-range-thumb {\n width: 12px;\n height: 12px;\n border-radius: var(--radius-full);\n background: var(--bg-surface);\n border: 2px solid var(--accent-500);\n}\n\n.input:focus-visible::-webkit-slider-thumb {\n box-shadow: var(--shadow-focus-ring);\n}\n\n.input:focus-visible::-moz-range-thumb {\n box-shadow: var(--shadow-focus-ring);\n}\n\n.input:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n","/**\n * components/primitives/Slider.tsx — a continuous value (accent hue,\n * saturation, a budget). Native <input type=\"range\"> so the platform's\n * keyboard model (arrows, Home/End, PageUp/PageDown) comes for free; the\n * track and thumb are restyled to the token system.\n *\n * `valueLabel` renders the number in the display face next to the control.\n * It is presentational: the control's own accessible value is carried by\n * aria-valuetext when a unit would otherwise be lost (\"245\" -> \"245 degrees\").\n */\nimport { useId, type InputHTMLAttributes, type ReactNode } from 'react';\nimport styles from './Slider.module.css';\n\nexport interface SliderProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'className' | 'value'> {\n label?: ReactNode;\n value: number;\n min?: number;\n max?: number;\n /** Rendered to the right of the track, in the display face. */\n valueLabel?: ReactNode;\n /** Spoken value, when the raw number needs a unit. */\n valueText?: string;\n /** Paint the filled portion of the track (hue sliders want a gradient instead). */\n trackImage?: string;\n className?: string;\n}\n\nexport function Slider({\n label,\n value,\n min = 0,\n max = 100,\n valueLabel,\n valueText,\n trackImage,\n className,\n id,\n ...rest\n}: SliderProps) {\n const generatedId = useId();\n const sliderId = id ?? generatedId;\n const span = Math.max(1, max - min);\n const percent = Math.round(((value - min) / span) * 100);\n\n return (\n <div className={`${styles.field} ${className ?? ''}`}>\n {label ? (\n <label className={styles.label} htmlFor={sliderId}>\n {label}\n </label>\n ) : null}\n <div className={styles.row}>\n <input\n {...rest}\n id={sliderId}\n type=\"range\"\n className={styles.input}\n value={value}\n min={min}\n max={max}\n aria-valuetext={valueText}\n style={\n {\n '--slider-fill': `${percent}%`,\n ...(trackImage ? { '--slider-track-image': trackImage } : {}),\n } as React.CSSProperties\n }\n data-custom-track={trackImage ? 'true' : undefined}\n />\n {valueLabel !== undefined ? <span className={styles.value}>{valueLabel}</span> : null}\n </div>\n </div>\n );\n}\n"],"mappings":"4LC2BA,SAAgB,EAAO,CACrB,QACA,QACA,MAAM,EACN,MAAM,IACN,aACA,YACA,aACA,YACA,KACA,GAAG,GACW,CACd,IAAM,GAAA,EAAc,EAAA,MAAA,CAAM,EACpB,EAAW,GAAM,EACjB,EAAO,KAAK,IAAI,EAAG,EAAM,CAAG,EAC5B,EAAU,KAAK,OAAQ,EAAQ,GAAO,EAAQ,GAAG,EAEvD,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,MAAM,GAAG,GAAa,KAAhD,SAAA,CACG,GACC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,EAAO,MAAO,QAAS,EACtC,SAAA,CACI,CAAA,EACL,MACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,GAAI,EACJ,GAAI,EACJ,KAAK,QACL,UAAW,EAAO,MACX,QACF,MACA,MACL,iBAAgB,EAChB,MACE,CACE,gBAAiB,GAAG,EAAQ,GAC5B,GAAI,EAAa,CAAE,uBAAwB,CAAW,EAAI,CAAC,CAC7D,EAEF,oBAAmB,EAAa,OAAS,IAAA,EAC1C,CAAA,EACA,IAAe,IAAA,GAAiE,MAArD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,CAAiB,CAAA,CAC1E,CACF,CAAA,CAAA,GAET"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n as e}from"./index-DZ-UQ7v8.js";import{a as t}from"./format-D7nBg2bn.js";import{n}from"./Swimlane-B9Exxekk.js";var r={tile:`_tile_7dhx4_1`,label:`_label_7dhx4_15`,value:`_value_7dhx4_25`,trend:`_trend_7dhx4_36`,meta:`_meta_7dhx4_42`,delta:`_delta_7dhx4_49`,arrow:`_arrow_7dhx4_58`,deltaGood:`_deltaGood_7dhx4_64`,deltaBad:`_deltaBad_7dhx4_71`,deltaNeutral:`_deltaNeutral_7dhx4_78`,caption:`_caption_7dhx4_82`,skLabel:`_skLabel_7dhx4_89`,skValue:`_skValue_7dhx4_95`,skTrend:`_skTrend_7dhx4_101`,skMeta:`_skMeta_7dhx4_108`},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,f=s==null||s.value===0||!Number.isFinite(s.value)?null:s.value>0?`↑`:`↓`;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:`fill`,height:28,area:!0,ariaLabel:l??`${e} trend`,describe:u})}):null,s||o?(0,i.jsxs)(`div`,{className:r.meta,children:[s?(0,i.jsxs)(`span`,{className:`${r.delta} ${d}`,"data-delta-tone":d===r.deltaGood?`good`:d===r.deltaBad?`bad`:`neutral`,children:[f?(0,i.jsx)(`span`,{className:r.arrow,"aria-hidden":`true`,children:f}):null,(0,i.jsx)(`span`,{children:a(s)})]}):null,o?(0,i.jsx)(`span`,{className:r.caption,children:o}):null]}):null]})}function s({trend:e=!0}){return(0,i.jsxs)(`div`,{className:r.tile,"data-stat-tile-skeleton":``,"aria-hidden":`true`,children:[(0,i.jsx)(`span`,{className:`skeleton ${r.skLabel}`}),(0,i.jsx)(`span`,{className:`skeleton ${r.skValue}`}),e?(0,i.jsx)(`span`,{className:`skeleton ${r.skTrend}`}):null,(0,i.jsx)(`span`,{className:`skeleton ${r.skMeta}`})]})}export{s as n,o as t};
|
|
2
|
+
//# sourceMappingURL=StatTile-C4KgjltA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatTile-C4KgjltA.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 margin: var(--space-1) 0 2px;\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 display: inline-flex;\n align-items: center;\n gap: 2px;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-variant-numeric: tabular-nums;\n}\n\n.arrow {\n font-weight: var(--font-weight-semibold);\n}\n\n/* A judged delta sits on its status tint, so good / bad reads at a glance;\n the words carry it too (never colour alone). */\n.deltaGood {\n padding: 0 var(--space-1);\n border-radius: var(--radius-sm);\n background: var(--status-success-bg);\n color: var(--status-success-fg);\n}\n\n.deltaBad {\n padding: 0 var(--space-1);\n border-radius: var(--radius-sm);\n background: var(--status-danger-bg);\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/* StatTileSkeleton — bars at the size of what they stand in for. */\n.skLabel {\n display: block;\n width: 40%;\n height: var(--text-2xs-line);\n}\n\n.skValue {\n display: block;\n width: 55%;\n height: var(--text-2xl-line);\n}\n\n.skTrend {\n display: block;\n width: 100%;\n height: 28px;\n margin: var(--space-1) 0 2px;\n}\n\n.skMeta {\n display: block;\n width: 70%;\n height: var(--text-xs-line);\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 *\n * Polish (verse-visual-quality): the sparkline spans the tile (`fill`), in\n * the quantity ink with a gradient wash; a judged delta sits on a tinted pill\n * with a direction arrow (the arrow is decoration — the signed number and\n * its words still say which way it went).\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 const arrow = delta == null || delta.value === 0 || !Number.isFinite(delta.value) ? null : delta.value > 0 ? '↑' : '↓';\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=\"fill\" height={28} area ariaLabel={trendLabel ?? `${label} trend`} describe={describeTrend} />\n </span>\n ) : null}\n {delta || caption ? (\n <div className={styles.meta}>\n {delta ? (\n <span className={`${styles.delta} ${deltaTone}`} data-delta-tone={deltaTone === styles.deltaGood ? 'good' : deltaTone === styles.deltaBad ? 'bad' : 'neutral'}>\n {arrow ? <span className={styles.arrow} aria-hidden=\"true\">{arrow}</span> : null}\n <span>{deltaText(delta)}</span>\n </span>\n ) : null}\n {caption ? <span className={styles.caption}>{caption}</span> : null}\n </div>\n ) : null}\n </div>\n );\n}\n\n/**\n * A stat tile's loading placeholder in the tile's own shape — label, number\n * and sparkline bars on the same box — so a KPI row does not jump when its\n * figures land. Uses the app's shared `.skeleton` shimmer (design/global.css),\n * which already stops under reduced motion. Presentation only: the caller\n * announces the loading state once for the whole row.\n */\nexport function StatTileSkeleton({ trend = true }: { trend?: boolean }) {\n return (\n <div className={styles.tile} data-stat-tile-skeleton=\"\" aria-hidden=\"true\">\n <span className={`skeleton ${styles.skLabel}`} />\n <span className={`skeleton ${styles.skValue}`} />\n {trend ? <span className={`skeleton ${styles.skTrend}`} /> : null}\n <span className={`skeleton ${styles.skMeta}`} />\n </div>\n );\n}\n"],"mappings":"whBCwCA,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,SAEX,EAAQ,GAAS,MAAQ,EAAM,QAAU,GAAK,CAAC,OAAO,SAAS,EAAM,KAAK,EAAI,KAAO,EAAM,MAAQ,EAAI,IAAM,IAEnH,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,MAAM,OAAO,OAAQ,GAAI,KAAA,GAAK,UAAW,GAAc,GAAG,EAAM,QAAS,SAAU,CAAgB,CAAA,CACzH,CAAA,EACJ,KACH,GAAS,GACR,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,CACG,GACC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,GAAG,EAAO,MAAM,GAAG,IAAa,kBAAiB,IAAc,EAAO,UAAY,OAAS,IAAc,EAAO,SAAW,MAAQ,UAApJ,SAAA,CACG,GAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAO,cAAY,OAAQ,SAAA,CAAY,CAAA,EAAI,MAC5E,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAU,CAAK,CAAQ,CAAA,CAC1B,CACJ,CAAA,EAAA,KACH,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAU,SAAA,CAAc,CAAA,EAAI,IAC5D,CACH,CAAA,EAAA,IACD,GAET,CASA,SAAgB,EAAiB,CAAE,QAAQ,IAA6B,CACtE,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,0BAAwB,GAAG,cAAY,OAApE,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,YAAY,EAAO,SAAY,CAAA,GAChD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,YAAY,EAAO,SAAY,CAAA,EAC/C,GAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,YAAY,EAAO,SAAY,CAAA,EAAI,MAC7D,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,YAAY,EAAO,QAAW,CAAA,CAC5C,GAET"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._tile_7dhx4_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_7dhx4_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_7dhx4_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_7dhx4_36{margin:var(--space-1) 0 2px;line-height:0;display:block}._meta_7dhx4_42{align-items:baseline;gap:var(--space-1) var(--space-2);flex-wrap:wrap;display:flex}._delta_7dhx4_49{font-size:var(--text-xs-size);line-height:var(--text-xs-line);font-variant-numeric:tabular-nums;align-items:center;gap:2px;display:inline-flex}._arrow_7dhx4_58{font-weight:var(--font-weight-semibold)}._deltaGood_7dhx4_64{padding:0 var(--space-1);border-radius:var(--radius-sm);background:var(--status-success-bg);color:var(--status-success-fg)}._deltaBad_7dhx4_71{padding:0 var(--space-1);border-radius:var(--radius-sm);background:var(--status-danger-bg);color:var(--status-danger-fg)}._deltaNeutral_7dhx4_78{color:var(--text-tertiary)}._caption_7dhx4_82{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary)}._skLabel_7dhx4_89{width:40%;height:var(--text-2xs-line);display:block}._skValue_7dhx4_95{width:55%;height:var(--text-2xl-line);display:block}._skTrend_7dhx4_101{width:100%;height:28px;margin:var(--space-1) 0 2px;display:block}._skMeta_7dhx4_108{width:70%;height:var(--text-xs-line);display:block}
|
package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js → StatusBadge-CXsYqmdU.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as e}from"./index-
|
|
2
|
-
//# sourceMappingURL=StatusBadge-
|
|
1
|
+
import{n as e}from"./index-DZ-UQ7v8.js";var t={badge:`_badge_ytqgz_4`,dot:`_dot_ytqgz_17`,neutral:`_neutral_ytqgz_24`,info:`_info_ytqgz_32`,running:`_running_ytqgz_40`,pulse:`_pulse_ytqgz_1`,success:`_success_ytqgz_49`,warning:`_warning_ytqgz_57`,danger:`_danger_ytqgz_65`,unknown:`_unknown_ytqgz_73`,phaseDot:`_phaseDot_ytqgz_82`},n=e(),r={pending:`neutral`,queued:`neutral`,waiting:`neutral`,running:`running`,active:`running`,in_progress:`running`,building:`running`,applying:`running`,done:`success`,success:`success`,succeeded:`success`,applied:`success`,merged:`success`,ready:`success`,approved:`success`,ship:`success`,review:`warning`,degraded:`warning`,paused:`warning`,noise:`neutral`,failed:`danger`,error:`danger`,errored:`danger`,rejected:`danger`,harmful:`danger`,cancelled:`neutral`,canceled:`neutral`,unknown:`unknown`};function i(e){return e?r[e.toLowerCase()]??`neutral`:`unknown`}function a({status:e,tone:r,children:a}){let o=r??i(e);return(0,n.jsxs)(`span`,{className:`${t.badge} ${t[o]}`,children:[(0,n.jsx)(`span`,{className:t.dot,"aria-hidden":`true`}),a??e]})}function o({index:e}){let r=(e%6+6)%6;return(0,n.jsx)(`span`,{className:t.phaseDot,style:{background:`var(--phase-${r+1})`},"aria-hidden":`true`})}export{a as n,i as r,o as t};
|
|
2
|
+
//# sourceMappingURL=StatusBadge-CXsYqmdU.js.map
|
package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js.map → StatusBadge-CXsYqmdU.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBadge-
|
|
1
|
+
{"version":3,"file":"StatusBadge-CXsYqmdU.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/StatusBadge.module.css","../../../../../../src/web-ui/components/primitives/StatusBadge.tsx"],"sourcesContent":["/* V2: a tag, not a pill — the design language reserves fully-round shapes\n for dots and avatars. Height derives from the density tokens so a badge in\n a table row lines up with the controls next to it. */\n.badge {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n height: var(--density-row-sm);\n padding: 0 var(--space-2);\n border-radius: var(--radius-xs);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-medium);\n line-height: 1;\n white-space: nowrap;\n}\n\n.dot {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n flex-shrink: 0;\n}\n\n.neutral {\n background: var(--status-neutral-bg);\n color: var(--status-neutral-fg);\n}\n.neutral .dot {\n background: var(--status-neutral-solid);\n}\n\n.info {\n background: var(--status-info-bg);\n color: var(--status-info-fg);\n}\n.info .dot {\n background: var(--status-info-solid);\n}\n\n.running {\n background: var(--status-running-bg);\n color: var(--status-running-fg);\n}\n.running .dot {\n background: var(--status-running-solid);\n animation: pulse 1.6s ease-in-out infinite;\n}\n\n.success {\n background: var(--status-success-bg);\n color: var(--status-success-fg);\n}\n.success .dot {\n background: var(--status-success-solid);\n}\n\n.warning {\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n}\n.warning .dot {\n background: var(--status-warning-solid);\n}\n\n.danger {\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n.danger .dot {\n background: var(--status-danger-solid);\n}\n\n.unknown {\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n font-style: italic;\n}\n.unknown .dot {\n background: var(--status-unknown-solid);\n}\n\n.phaseDot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n}\n\n@keyframes pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.4;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .running .dot {\n animation: none;\n }\n}\n\n:root[data-motion=\"reduce\"] .running .dot {\n animation: none;\n}\n","/**\n * components/primitives/StatusBadge.tsx — the ONE status-color mapping for\n * the whole app. See DESIGN.md \"Status-color semantics\" for the reasoning;\n * the short version: `running` is amber (motion, unresolved — matches\n * Vercel/GitHub Actions \"in progress\"), `done` is green (resolved,\n * successful). Neither reuses the accent color, so \"this is clickable\"\n * (accent) never visually collides with \"this succeeded\" (green).\n *\n * Every view should route run/swarm/proposal/daemon status strings through\n * `statusToTone()` rather than switching on raw strings itself, so adding a\n * new backend status value only ever needs one edit, here.\n */\nimport type { ReactNode } from 'react';\nimport styles from './StatusBadge.module.css';\n\nexport type Tone = 'neutral' | 'info' | 'running' | 'success' | 'warning' | 'danger' | 'unknown';\n\nconst STATUS_TONE: Record<string, Tone> = {\n // Run / swarm / proposal lifecycle.\n pending: 'neutral',\n queued: 'neutral',\n waiting: 'neutral',\n running: 'running',\n active: 'running',\n in_progress: 'running',\n building: 'running',\n applying: 'running',\n done: 'success',\n success: 'success',\n succeeded: 'success',\n applied: 'success',\n merged: 'success',\n ready: 'success',\n approved: 'success',\n ship: 'success',\n review: 'warning',\n degraded: 'warning',\n paused: 'warning',\n noise: 'neutral',\n failed: 'danger',\n error: 'danger',\n errored: 'danger',\n rejected: 'danger',\n harmful: 'danger',\n cancelled: 'neutral',\n canceled: 'neutral',\n unknown: 'unknown',\n};\n\nexport function statusToTone(status: string | undefined | null): Tone {\n if (!status) return 'unknown';\n return STATUS_TONE[status.toLowerCase()] ?? 'neutral';\n}\n\nexport interface StatusBadgeProps {\n status: string;\n /** Override the derived tone (rare — prefer letting statusToTone decide). */\n tone?: Tone;\n children?: ReactNode;\n}\n\nexport function StatusBadge({ status, tone, children }: StatusBadgeProps): ReactNode {\n const resolved = tone ?? statusToTone(status);\n return (\n <span className={`${styles.badge} ${styles[resolved]}`}>\n <span className={styles.dot} aria-hidden=\"true\" />\n {children ?? status}\n </span>\n );\n}\n\n/** A named DAG/milestone phase — categorical color, unrelated to health. */\nexport function PhaseDot({ index }: { index: number }): ReactNode {\n const n = ((index % 6) + 6) % 6; // wrap safely for any index, including negatives\n return <span className={styles.phaseDot} style={{ background: `var(--phase-${n + 1})` }} aria-hidden=\"true\" />;\n}\n"],"mappings":"kVCiBM,EAAoC,CAExC,QAAS,UACT,OAAQ,UACR,QAAS,UACT,QAAS,UACT,OAAQ,UACR,YAAa,UACb,SAAU,UACV,SAAU,UACV,KAAM,UACN,QAAS,UACT,UAAW,UACX,QAAS,UACT,OAAQ,UACR,MAAO,UACP,SAAU,UACV,KAAM,UACN,OAAQ,UACR,SAAU,UACV,OAAQ,UACR,MAAO,UACP,OAAQ,SACR,MAAO,SACP,QAAS,SACT,SAAU,SACV,QAAS,SACT,UAAW,UACX,SAAU,UACV,QAAS,SACX,EAEA,SAAgB,EAAa,EAAyC,CAEpE,OADK,EACE,EAAY,EAAO,YAAY,IAAM,UADxB,SAEtB,CASA,SAAgB,EAAY,CAAE,SAAQ,OAAM,YAAyC,CACnF,IAAM,EAAW,GAAQ,EAAa,CAAM,EAC5C,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,KAA3C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAK,cAAY,MAAQ,CAAA,EAChD,GAAY,CACT,GAEV,CAGA,SAAgB,EAAS,CAAE,SAAuC,CAChE,IAAM,GAAM,EAAQ,EAAK,GAAK,EAC9B,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,MAAO,CAAE,WAAY,eAAe,EAAI,EAAE,EAAG,EAAG,cAAY,MAAQ,CAAA,CAC/G"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";import{H as r,L as i,P as a,S as o,V as ee,W as s,_ as c,b as l,c as u,f as d,g as f,i as te,l as ne,n as re,o as ie,r as p,s as ae,t as oe,y as se,z as m}from"./ChartFrame-DY-GVUb3.js";import{c as h,h as g,i as _,l as v,m as ce,n as le,r as ue}from"./colors-DvK0wMHH.js";import{d as de,n as y,s as fe,t as pe}from"./format-D7nBg2bn.js";var b=t(e(),1),x=n(),S=8,C=16,w=2,T=28,E=16,D=4,O=[`Mon`,``,`Wed`,``,`Fri`,``,``],me=[``,`Mon`,``,`Wed`,``,`Fri`,``];function k({title:e,description:t,caveat:n,status:i,days:a,weekStart:o=1,width:c,formatValue:l=pe,unit:u=``,ariaLabel:d}){let ie=(0,b.useRef)(null),p=te(ie,c),ae=(0,b.useId)(),se=ce((0,b.useId)()),h=(0,b.useMemo)(()=>ne(a,o),[a,o]),[_,v]=(0,b.useState)(null),le=Math.max(0,...a.map(e=>e.value??0)),ue=a.some(e=>e.value!==null),de=i??(a.length===0?{kind:`empty`}:ue?{kind:`ready`}:{kind:`unknown`}),fe=p-T,k=Math.max(1,Math.floor((fe+w)/10)),A=Math.min(h.weeks,k),j=h.weeks-A,M=Math.max(S,Math.min(C,Math.floor((fe+w)/Math.max(1,A))-w)),N=j,P=h.cells.filter(e=>e.week>=N),F=T+A*(M+w),I=E+7*(M+w),L=e=>T+(e.week-N)*(M+w),R=e=>E+e.weekday*(M+w),z=u?` ${u}`:``,B=e=>`${y(e.day)}: ${e.value===null?`no data`:`${l(e.value)}${z}`}`,V=[];for(let e of h.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=_===null?void 0:H[_];function he(e){if(H.length===0)return;let t=_??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(),v(Math.max(0,Math.min(H.length-1,r))))}let W=a.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=d??`${e}: ${a.length} days, ${l(ge)}${z} in total`+(G&&(G.value??0)>0?`, busiest ${y(G.day)} with ${l(G.value)}`:``)+(a.length-W.length>0?`, ${a.length-W.length} days without data`:``)+`.`,_e=[{key:`day`,label:`Day`,render:e=>y(e.day)},{key:`value`,label:u?u[0].toUpperCase()+u.slice(1):`Value`,numeric:!0,render:e=>e.value===null?`—`:l(e.value)}],ve=(0,x.jsxs)(`div`,{className:s.legend,"aria-hidden":`true`,children:[(0,x.jsx)(`span`,{className:s.legendItem,children:`Less`}),Array.from({length:5},(e,t)=>(0,x.jsx)(`span`,{className:s.swatch,style:{background:g(t)}},t)),(0,x.jsx)(`span`,{className:s.legendItem,children:`More`}),(0,x.jsxs)(`span`,{className:s.legendItem,children:[(0,x.jsx)(`span`,{className:s.swatchHatch}),`no data`]})]});return(0,x.jsx)(oe,{title:e,description:t,caveat:n,status:de,skeleton:`heat`,table:(0,x.jsx)(re,{caption:e,columns:_e,rows:[...a].sort((e,t)=>e.day.localeCompare(t.day)),rowKey:e=>e.day}),footer:(0,x.jsxs)(x.Fragment,{children:[ve,j>0?(0,x.jsxs)(`p`,{className:s.note,children:[`Showing the latest `,A,` weeks; `,j,` earlier weeks are in the table.`]}):null]}),children:(0,x.jsxs)(`div`,{ref:ie,className:`${s.plotWrap} ${s.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the arrow keys to move between days.`,"aria-describedby":ae,onFocus:()=>v(e=>e??(H.length?H.length-1:null)),onBlur:()=>v(null),onKeyDown:he,children:[(0,x.jsxs)(`svg`,{className:s.svg,width:F,height:I,viewBox:`0 0 ${F} ${I}`,role:`img`,"aria-label":K,children:[(0,x.jsx)(`defs`,{children:(0,x.jsx)(ee,{id:se})}),V.map(e=>(0,x.jsx)(`text`,{className:s.tick,x:T+(e.week-N)*(M+w),y:11,children:e.label},`${e.week}${e.label}`)),(o===1?O:me).map((e,t)=>e&&M>=10?(0,x.jsx)(`text`,{className:s.tick,x:0,y:E+t*(M+w)+M/2,dy:`0.32em`,children:e},t):null),P.map(e=>{if(e.outside)return null;let t=f(e.value,le,D),n=U?.day===e.day;return(0,x.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?s.unknownMark:void 0,fill:t===null?`url(#${se})`:g(t),style:n?{stroke:`var(--border-focus)`,strokeWidth:2,strokeDasharray:`none`}:void 0,onPointerEnter:()=>v(H.indexOf(e)),onPointerLeave:()=>v(null)},e.day)})]}),(0,x.jsx)(`span`,{id:ae,className:s.srOnly,"aria-live":`polite`,children:U?B(U):``}),U?(0,x.jsx)(m,{left:r(L(U)+M/2,F,60),top:R(U),title:y(U.day),rows:[{key:`v`,label:u||`Value`,value:U.value===null?null:l(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`?_:e===`negative`?ue:`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:r,rows:a,unit:c=``,gate:l,formatValue:d,unknownText:f=`not enough pairs yet`,width:ne,ariaLabel:ie}){let p=d??F,se=(0,b.useRef)(null),m=te(se,ne),[h,g]=(0,b.useState)(null),v=(0,b.useId)(),de=ce((0,b.useId)()),y=c?` ${c}`:``,fe=a.filter(e=>j(e)!==`unknown`),pe=r??(a.length===0?{kind:`empty`,message:`No experiments have run yet.`}:{kind:`ready`}),S=m<z,C=Math.max(84,Math.min(180,Math.round(m*(S?.3:.26)))),w=S?0:118,T=C+8,E=Math.max(T+40,m-w-R),D=fe.flatMap(e=>[e.low,e.high]),O=Math.min(0,l?.value??0,...D),me=Math.max(0,l?.value??0,...D),k=u(O,me===O?O+1:me,{count:S?3:5,integer:ae([...D,l?.value??0]),format:d?e=>e===0?`0`:P(e,d):void 0}),B=k.ticks,V=d?k.labels:k.labels.map((e,t)=>B[t]>0?`+${e}`:e),H=o(B[0],B[B.length-1],T,E),U=a.length*I,he=U+L,W=e=>{let t=j(e);return t===`unknown`?`${e.label}: ${f}`:`${e.label}: ${P(e.estimate,p)}${y}, 95% interval ${P(e.low,p)} to ${P(e.high,p)}; ${M[t]}`},ge=fe.filter(e=>j(e)===`positive`).length,G=ie??`${e}: ${a.length} experiment${a.length===1?``:`s`}, ${ge} with an interval above zero.`;function K(e){if(a.length===0)return;let t=h??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(),g(Math.max(0,Math.min(a.length-1,n))))}let _e=[{key:`label`,label:`Experiment`,render:e=>e.label},{key:`est`,label:`Estimate${y}`,numeric:!0,render:e=>e.estimate===null?`—`:P(e.estimate,p)},{key:`ci`,label:`95% interval`,numeric:!0,render:e=>e.low===null||e.high===null?`—`:`${P(e.low,p)} to ${P(e.high,p)}`},{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`?f:M[j(e)]},...a.some(e=>e.detail)?[{key:`detail`,label:`Status`,render:e=>e.detail??``}]:[]],ve=h===null?void 0:a[h],q=Math.floor(C/7);return(0,x.jsx)(oe,{title:e,description:t,caveat:n,status:pe,skeleton:`lanes`,table:(0,x.jsx)(re,{caption:e,columns:_e,rows:a,rowKey:e=>e.id}),footer:(0,x.jsx)(i,{min:1,items:[{label:`Helped`,color:_},{label:`Hurt`,color:ue},{label:`No clear effect`,color:`var(--text-secondary)`},...a.length>fe.length?[{label:f,kind:`hatch`}]:[]]}),children:(0,x.jsxs)(`div`,{ref:se,className:`${s.plotWrap} ${s.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the up and down arrow keys to read each experiment.`,"aria-describedby":v,onFocus:()=>g(e=>e??(a.length?0:null)),onBlur:()=>g(null),onKeyDown:K,children:[(0,x.jsxs)(`svg`,{className:s.svg,width:m,height:he,viewBox:`0 0 ${m} ${he}`,role:`img`,"aria-label":G,children:[(0,x.jsx)(`defs`,{children:(0,x.jsx)(ee,{id:de})}),B.map((e,t)=>(0,x.jsxs)(`g`,{children:[(0,x.jsx)(`line`,{className:s.grid,x1:H(e),x2:H(e),y1:0,y2:U}),(0,x.jsx)(`text`,{className:s.tick,x:H(e),y:he-6,textAnchor:`middle`,children:V[t]})]},e)),(0,x.jsx)(`line`,{"data-role":`zero`,x1:H(0),x2:H(0),y1:0,y2:U,stroke:le,strokeWidth:1.5}),l&&l.value!==0?(0,x.jsx)(`g`,{"data-role":`gate`,children:(0,x.jsx)(`line`,{className:s.reference,x1:H(l.value),x2:H(l.value),y1:0,y2:U})}):null,a.map((e,t)=>{let n=t*I+I/2,r=j(e),i=N(r),a=h===t;return(0,x.jsxs)(`g`,{"data-row":e.id,"data-verdict":r,opacity:h!==null&&!a?.55:1,children:[t%2==1?(0,x.jsx)(`rect`,{className:A.band,x:0,y:t*I,width:m,height:I}):null,(0,x.jsx)(`text`,{className:s.label,x:C,y:n,dy:`0.32em`,textAnchor:`end`,children:e.label.length>q?`${e.label.slice(0,q-1)}…`:e.label}),r===`unknown`?(0,x.jsxs)(`g`,{"data-role":`unknown`,children:[(0,x.jsx)(`rect`,{className:s.unknownMark,fill:`url(#${de})`,x:T+.5,y:n-5,width:Math.max(1,E-T-1),height:10,rx:2}),S?null:(0,x.jsx)(`text`,{className:s.tick,x:m-R,y:n,dy:`0.32em`,textAnchor:`end`,children:f})]}):(0,x.jsxs)(`g`,{children:[(0,x.jsx)(`line`,{"data-role":`ci`,x1:H(e.low),x2:H(e.high),y1:n,y2:n,stroke:i,strokeWidth:2,strokeLinecap:`round`}),(0,x.jsx)(`line`,{x1:H(e.low),x2:H(e.low),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,x.jsx)(`line`,{x1:H(e.high),x2:H(e.high),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,x.jsx)(`rect`,{"data-role":`estimate`,className:s.marker,x:H(e.estimate)-5,y:n-5,width:10,height:10,rx:2,fill:i}),S?null:(0,x.jsxs)(`text`,{className:s.tick,x:m-R,y:n,dy:`0.32em`,textAnchor:`end`,children:[P(e.estimate,p),` [`,P(e.low,p),`, `,P(e.high,p),`]`]})]}),a?(0,x.jsx)(`rect`,{className:A.focusRing,x:1,y:t*I+1,width:m-2,height:26,rx:3}):null]},e.id)})]}),(0,x.jsx)(`span`,{id:v,className:s.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:f,steps:ne,markers:g=[],now:_,from:le,baseline:y,unit:pe=``,formatValue:S,formatTime:C,height:w=200,width:T,ariaLabel:E}){let D=S??ge,O=e=>c(e)?(C??fe)(e):`—`,me=(0,b.useRef)(null),k=te(me,T),A=p(),[j,M]=(0,b.useState)(null),N=(0,b.useId)(),P=ce((0,b.useId)()),F=pe?` ${pe}`:``,I=_??Date.now(),L=V(ne,I),R=g.filter(e=>c(e.at)),z=L.filter(e=>e.value!==null),B=f??(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(c),_e=Math.max(c(I)?I:0,...K,...L.map(e=>e.until).filter(c)),ve=le!==void 0&&c(le)?le:K.length?Math.min(...K):_e-W,[q,ye]=d(ve,_e,ie,`end`),be=z.flatMap(e=>[e.value,e.low??e.value,e.high??e.value]),xe=Math.min(y?.value??0,...be),Se=Math.max(y?.value??0,...be),Ce=u(xe,Se===xe?xe+1:Se,{count:4,integer:ae([...be,y?.value??0]),format:S?e=>e===0?`0`:G(e,S):void 0}),we=Ce.ticks,Te=S?Ce.labels:Ce.labels.map((e,t)=>we[t]>0?`+${e}`:e),J=a(Te,30,56,A),Y=Math.max(40,k-J-he),Ee=w-H-U,De=o(q,ye,J,J+Y),X=o(we[0],we[we.length-1],H+Ee,H),Z=e=>Math.min(J+Y,Math.max(J,De(e))),Oe=de(q,ye,C,[q,ye]),ke=l([{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:se(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})`:``}, ${O(e.at)} to ${O(e.until)}: `+(e.value===null?`not measured`:`${G(e.value,D)}${F}`+(e.low!==null&&e.low!==void 0&&e.high!==null&&e.high!==void 0?`, 95% interval ${G(e.low,D)} to ${G(e.high,D)}`:``)),Ne=z[z.length-1],Pe=R.filter(e=>e.kind===`rollback`).length,Fe=E??`${e}: ${L.length} step${L.length===1?``:`s`}`+(Ne?`, now ${G(Ne.value,D)}${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,D),interval:e.low===null||e.low===void 0||e.high===null||e.high===void 0?`—`:`${G(e.low,D)} to ${G(e.high,D)}`})),...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=>O(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,x.jsx)(oe,{title:e,description:t,caveat:n,status:B,skeleton:`line`,table:(0,x.jsx)(re,{caption:e,columns:Re,rows:Le,rowKey:e=>e.id}),footer:(0,x.jsx)(i,{items:[{label:`Level`,color:h,kind:`line`},{label:`95% interval`,color:v},...Pe?[{label:`▼ rollback`,color:ue}]:[],...L.some(e=>e.value===null)?[{label:`not measured`,kind:`hatch`}]:[]]}),children:(0,x.jsxs)(`div`,{ref:me,className:`${s.plotWrap} ${s.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,x.jsxs)(`svg`,{className:s.svg,width:k,height:w,viewBox:`0 0 ${k} ${w}`,role:`img`,"aria-label":Fe,children:[(0,x.jsx)(`defs`,{children:(0,x.jsx)(ee,{id:P})}),we.map((e,t)=>(0,x.jsxs)(`g`,{children:[(0,x.jsx)(`line`,{className:s.grid,x1:J,x2:J+Y,y1:X(e),y2:X(e)}),(0,x.jsx)(`text`,{className:s.tick,x:J-6,y:X(e),dy:`0.32em`,textAnchor:`end`,children:Te[t]})]},e)),ke.map(e=>(0,x.jsx)(`text`,{"data-axis-label":e.key,className:s.tick,x:e.x,y:w-8,textAnchor:e.anchor,children:e.text},e.key)),y?(0,x.jsxs)(`g`,{"data-role":`baseline`,children:[(0,x.jsx)(`line`,{className:s.reference,x1:J,x2:J+Y,y1:X(y.value),y2:X(y.value)}),(0,x.jsx)(`text`,{className:`${s.tick} ${s.halo}`,x:J+4,y:X(y.value)-5,children:y.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,x.jsx)(`rect`,{"data-step":e.id,"data-unknown":`true`,className:s.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,x.jsx)(`g`,{"data-step":e.id,opacity:j!==null&&j!==t?.6:1,children:i?(0,x.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:v,opacity:.35}):null},e.id)}),Ae.map((e,t)=>(0,x.jsx)(`path`,{"data-role":`level`,className:s.line,stroke:h,d:e},t)),L.map(e=>e.value===null?null:(0,x.jsx)(`circle`,{className:s.marker,cx:Z(e.at),cy:X(e.value),r:3.5,fill:h},`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,x.jsx)(`path`,{"data-marker":e.kind,d:n,fill:e.kind===`rollback`?ue:h,children:(0,x.jsx)(`title`,{children:`${e.kind===`rollback`?`Rolled back`:`Adopted`}: ${e.label} · ${O(e.at)}`})},e.id)})]}),(0,x.jsx)(`span`,{id:N,className:s.srOnly,"aria-live":`polite`,children:$?Me($):``}),$?(0,x.jsx)(m,{left:r((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,D)}${F}`},{key:`ci`,label:`95% interval`,value:$.low===null||$.low===void 0||$.high===null||$.high===void 0?null:`${G($.low,D)} to ${G($.high,D)}`},{key:`t`,label:`From`,value:O($.at)}]}):null]})})}export{B as n,k as r,K as t};
|
|
2
|
+
//# sourceMappingURL=StepBand-BMtVOFpK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StepBand-BMtVOFpK.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 skeleton=\"heat\"\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 skeleton=\"lanes\"\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 skeleton=\"line\"\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 +1,2 @@
|
|
|
1
|
-
import{a as e,c as t,n}from"./index-
|
|
2
|
-
//# sourceMappingURL=Surface-
|
|
1
|
+
import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";import{kt as r}from"./VerseConsoleApp-CWU6R3By.js";var i=t(e(),1),a={surface:`_surface_1ck24_6`,strip:`_strip_1ck24_14`,title:`_title_1ck24_29`,stripActions:`_stripActions_1ck24_39`,scroll:`_scroll_1ck24_45`,body:`_body_1ck24_53`,grid:`_grid_1ck24_62`,cell:`_cell_1ck24_70`,card:`_card_1ck24_79`,cardHead:`_cardHead_1ck24_114`,cardHeading:`_cardHeading_1ck24_121`,cardTitle:`_cardTitle_1ck24_130`,cardCaption:`_cardCaption_1ck24_138`,cardActions:`_cardActions_1ck24_144`,note:`_note_1ck24_151`,micro:`_micro_1ck24_172`},o=n(),s=e=>Math.max(1,Math.min(12,Math.round(Number.isFinite(e)?e:12)));function c(e,t){let n=s(t);return e===`compact`?12:e===`medium`?n<=6?6:12:n}function l(e,t){let n=t.map(s),r=n.map(t=>c(e,t));if(e!==`medium`)return r;let i=0,a=0;for(let e=0;e<n.length;e+=1)if(a+n[e]>12&&(i=e,a=0),a+=n[e],a===12){let t=e-i+1;if(t>=2){for(let t=i;t<=e;t+=1)r[t]=6;t%2==1&&(r[e]=12)}i=e+1,a=0}return r}function u(e){return(0,i.isValidElement)(e)&&e.type===p}function d(e,t){let n=i.Children.toArray(e),r=l(t,n.filter(u).map(e=>e.props.span)),a=0;return n.map(e=>u(e)?(0,i.cloneElement)(e,{layoutSpan:r[a++]}):e)}function f({title:e,actions:t,lead:n,children:s}){let c=(0,i.useId)(),{viewport:l}=r();return(0,o.jsxs)(`section`,{className:a.surface,"aria-labelledby":c,"data-viewport":l,children:[(0,o.jsxs)(`header`,{className:a.strip,"data-app-region":`drag`,children:[(0,o.jsx)(`h2`,{id:c,className:a.title,children:e}),t?(0,o.jsx)(`div`,{className:a.stripActions,children:t}):null]}),(0,o.jsx)(`div`,{className:a.scroll,children:(0,o.jsxs)(`div`,{className:a.body,children:[n,(0,o.jsx)(`div`,{className:a.grid,children:d(s,l)})]})})]})}function p({span:e,children:t,className:n,id:i,layoutSpan:s}){let{viewport:l}=r(),u={gridColumn:`span ${s??c(l,e)}`};return(0,o.jsx)(`div`,{id:i,className:`${a.cell} ${n??``}`,style:u,"data-span":e,children:t})}function m({title:e,caption:t,actions:n,children:r,tone:s,labelledBy:c}){let l=(0,i.useId)(),u=c??l;return(0,o.jsxs)(`section`,{className:a.card,"aria-labelledby":u,"data-tone":s,children:[(0,o.jsxs)(`header`,{className:a.cardHead,children:[(0,o.jsxs)(`span`,{className:a.cardHeading,children:[(0,o.jsx)(`h3`,{id:u,className:a.cardTitle,children:e}),t?(0,o.jsx)(`span`,{className:a.cardCaption,children:t}):null]}),n?(0,o.jsx)(`span`,{className:a.cardActions,children:n}):null]}),r]})}function h({children:e,tone:t=`muted`}){return(0,o.jsx)(`p`,{className:a.note,"data-tone":t,role:t===`danger`?`alert`:`note`,children:e})}function g({children:e}){return(0,o.jsx)(`span`,{className:a.micro,children:e})}export{f as a,g as i,h as n,p as r,m as t};
|
|
2
|
+
//# sourceMappingURL=Surface-BfDmQcKe.js.map
|