@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
package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js.map → Surface-BfDmQcKe.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Surface-D--LXgQm.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/surface.module.css","../../../../../../src/web-ui/routes/verse/command/Surface.tsx"],"sourcesContent":["/*\n * routes/verse/command/surface.module.css — the shared chrome of the four\n * 3.10 surfaces: strip, scroll region, 12-column grid, card frame. Tokens\n * only (style-scan-310: no raw hex, no px font sizes).\n */\n.surface {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--bg-canvas);\n}\n\n.strip {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n height: var(--strip-height);\n padding: 0 var(--space-5);\n /* Desktop shell: only the traffic-light overlap past the rail is owed. */\n padding-left: max(var(--space-5), calc(var(--app-traffic-light-inset, 0px) - var(--rail-width, 56px)));\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n/* Surface title: Grotesk 20/28, −0.02em (SPEC-310C §6). */\n.title {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-xl-size);\n line-height: var(--text-xl-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display);\n color: var(--text-primary);\n}\n\n.stripActions {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n}\n\n.scroll {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-gutter: stable;\n}\n\n.body {\n display: flex;\n flex-direction: column;\n gap: var(--surface-gap);\n max-width: 1440px;\n margin: 0 auto;\n padding: var(--space-5) var(--space-5) var(--space-16);\n}\n\n.grid {\n display: grid;\n grid-template-columns: repeat(var(--surface-columns), minmax(0, 1fr));\n gap: var(--surface-gap);\n /* Cells share their row's height (audit 16)… */\n align-items: stretch;\n}\n\n.cell {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n/* …and a plain Card fills it, so a pair (Needs you | Leader) is one height.\n A chart frame keeps its natural height: stretching a chart to a taller\n neighbour draws a half-empty card (the 3.9 harness finding). */\n.cell > .card {\n flex: 1 1 auto;\n}\n\n/* A card that renders nothing (e.g. Cloud on a server without the lane)\n leaves no empty row and no extra grid gap. */\n.cell:empty {\n display: none;\n}\n\n.surface[data-viewport='compact'] .body {\n padding: var(--space-4) var(--space-4) var(--space-12);\n}\n\n.surface[data-viewport='compact'] .strip {\n padding: 0 var(--space-4);\n}\n\n/* Card frame — identical to ChartFrame so chart and non-chart cards read as one set. */\n.card {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n min-width: 0;\n padding: var(--card-pad);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n}\n\n.card[data-tone='attention'] {\n border-color: var(--border-default);\n box-shadow: inset 0 1px 0 var(--hairline-lift, transparent);\n}\n\n.cardHead {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--space-3);\n}\n\n.cardHeading {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n gap: 2px;\n min-width: 0;\n}\n\n/* Card title 13/18, 600. */\n.cardTitle {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.cardCaption {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.cardActions {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n flex: none;\n}\n\n.note {\n margin: 0;\n padding: var(--space-3);\n border-radius: var(--radius-md);\n background: var(--bg-hover);\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line-relaxed);\n}\n\n.note[data-tone='unknown'] {\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n}\n\n.note[data-tone='danger'] {\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n\n/* Micro-label 11/14 uppercase (SPEC-310C §6). */\n.micro {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n","/**\n * routes/verse/command/Surface.tsx — the layout every 3.10 surface shares\n * (Command, Fleet, Growth, Mind; SPEC-310C §5 + DESIGN.md §13.4).\n *\n * - a 48px strip with the surface title (Grotesk 20/28) and its actions;\n * - one scroll region;\n * - a 12-column grid (`--surface-columns`) with 16px gaps. Cards that\n * share a row are one height (a plain Card fills its cell); a chart frame\n * keeps its natural height, never stretched to a taller neighbour (the\n * 3.9 harness showed half-empty chart cards);\n * - spans come from the viewport class, never a hard-coded breakpoint:\n * wide uses the span as written; medium keeps each wide ROW whole —\n * a pair that fills 12 columns (5 | 7, 8 | 4) becomes 6 | 6 instead of\n * half + full with a blank half-row between (audit 15), and any other\n * cell folds ≤ 6 to half width and wider to full; compact (375) is one\n * column in DOM order — which is why every surface writes its cards in\n * the order the phone should show them.\n */\nimport { Children, cloneElement, isValidElement, useId, type CSSProperties, type ReactElement, type ReactNode } from 'react';\nimport { useViewport, type ViewportClass } from '../shell/viewport.js';\nimport styles from './surface.module.css';\n\nconst clampSpan = (span: number): number => Math.max(1, Math.min(12, Math.round(Number.isFinite(span) ? span : 12)));\n\n/** The grid span ONE card gets at a viewport class, on its own (no row context). Pure (tested). */\nexport function spanFor(viewport: ViewportClass, span: number): number {\n const s = clampSpan(span);\n if (viewport === 'compact') return 12;\n if (viewport === 'medium') return s <= 6 ? 6 : 12;\n return s;\n}\n\n/**\n * The spans a run of cells gets at a viewport class, in DOM order. Pure (tested).\n *\n * At medium the cells are grouped into the rows the wide grid would draw\n * (auto-placement: a cell that does not fit starts the next row). A row that\n * exactly fills 12 columns with two or more cells is treated as a unit: every\n * cell goes to half width, and an odd one out (a 4 | 4 | 4 trio's third)\n * takes the full row — so no row is left with a blank half. A row that does\n * not fill 12 (the surface's own layout left room) folds cell by cell.\n */\nexport function layoutSpans(viewport: ViewportClass, spans: readonly number[]): number[] {\n const wide = spans.map(clampSpan);\n const out = wide.map((s) => spanFor(viewport, s));\n if (viewport !== 'medium') return out;\n let start = 0;\n let sum = 0;\n for (let i = 0; i < wide.length; i += 1) {\n if (sum + wide[i]! > 12) {\n start = i;\n sum = 0;\n }\n sum += wide[i]!;\n if (sum === 12) {\n const count = i - start + 1;\n if (count >= 2) {\n for (let j = start; j <= i; j += 1) out[j] = 6;\n if (count % 2 === 1) out[i] = 12;\n }\n start = i + 1;\n sum = 0;\n }\n }\n return out;\n}\n\ninterface CellProps {\n span: number;\n children: ReactNode;\n className?: string;\n id?: string;\n /** Set by Surface from the whole grid's rows (layoutSpans); a Cell outside a Surface falls back to spanFor. */\n layoutSpan?: number;\n}\n\nfunction isCell(node: ReactNode): node is ReactElement<CellProps> {\n return isValidElement(node) && node.type === Cell;\n}\n\n/**\n * Hands each direct Cell child its span for this viewport, computed across the\n * whole run so rows stay whole. Only direct children (and arrays) are seen —\n * a Cell nested in a fragment keeps its own `spanFor` fallback.\n */\nfunction laidOut(children: ReactNode, viewport: ViewportClass): ReactNode[] {\n const items = Children.toArray(children);\n const spans = layoutSpans(viewport, items.filter(isCell).map((c) => c.props.span));\n let k = 0;\n return items.map((child) => (isCell(child) ? cloneElement(child, { layoutSpan: spans[k++] }) : child));\n}\n\nexport interface SurfaceProps {\n /** Accessible name and visible title (\"Command\"). */\n title: string;\n /** Right side of the strip (refresh indicator, etc.). */\n actions?: ReactNode;\n /** Rendered above the grid, full width (the Command top bar, the verdict). */\n lead?: ReactNode;\n children: ReactNode;\n}\n\nexport function Surface({ title, actions, lead, children }: SurfaceProps) {\n const titleId = useId();\n const { viewport } = useViewport();\n return (\n <section className={styles.surface} aria-labelledby={titleId} data-viewport={viewport}>\n <header className={styles.strip} data-app-region=\"drag\">\n <h2 id={titleId} className={styles.title}>{title}</h2>\n {actions ? <div className={styles.stripActions}>{actions}</div> : null}\n </header>\n <div className={styles.scroll}>\n <div className={styles.body}>\n {lead}\n <div className={styles.grid}>{laidOut(children, viewport)}</div>\n </div>\n </div>\n </section>\n );\n}\n\n/** One grid cell. `span` is the 1440 layout's column count (SPEC-310C §5 table). */\nexport function Cell({ span, children, className, id, layoutSpan }: CellProps) {\n const { viewport } = useViewport();\n const style: CSSProperties = { gridColumn: `span ${layoutSpan ?? spanFor(viewport, span)}` };\n return (\n <div id={id} className={`${styles.cell} ${className ?? ''}`} style={style} data-span={span}>\n {children}\n </div>\n );\n}\n\n/**\n * A non-chart card with the same frame as ChartFrame: title (13/18 600),\n * one caption line, then the body. Charts bring their own frame.\n */\nexport function Card({\n title,\n caption,\n actions,\n children,\n tone,\n labelledBy,\n}: {\n title: ReactNode;\n caption?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n /** A quiet emphasis for the one card that needs the operator (Needs you). */\n tone?: 'attention';\n labelledBy?: string;\n}) {\n const ownId = useId();\n const titleId = labelledBy ?? ownId;\n return (\n <section className={styles.card} aria-labelledby={titleId} data-tone={tone}>\n <header className={styles.cardHead}>\n <span className={styles.cardHeading}>\n <h3 id={titleId} className={styles.cardTitle}>{title}</h3>\n {caption ? <span className={styles.cardCaption}>{caption}</span> : null}\n </span>\n {actions ? <span className={styles.cardActions}>{actions}</span> : null}\n </header>\n {children}\n </section>\n );\n}\n\n/** A designed not-available / unknown line inside a card. */\nexport function CardNote({ children, tone = 'muted' }: { children: ReactNode; tone?: 'muted' | 'unknown' | 'danger' }) {\n return (\n <p className={styles.note} data-tone={tone} role={tone === 'danger' ? 'alert' : 'note'}>\n {children}\n </p>\n );\n}\n\n/** The micro-label (11/14 uppercase) used for group headings inside cards. */\nexport function MicroLabel({ children }: { children: ReactNode }) {\n return <span className={styles.micro}>{children}</span>;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Surface-BfDmQcKe.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/surface.module.css","../../../../../../src/web-ui/routes/verse/command/Surface.tsx"],"sourcesContent":["/*\n * routes/verse/command/surface.module.css — the shared chrome of the four\n * 3.10 surfaces: strip, scroll region, 12-column grid, card frame. Tokens\n * only (style-scan-310: no raw hex, no px font sizes).\n */\n.surface {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--bg-canvas);\n}\n\n.strip {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n height: var(--strip-height);\n padding: 0 var(--space-5);\n /* Desktop shell: only the traffic-light overlap past the rail is owed. */\n padding-left: max(var(--space-5), calc(var(--app-traffic-light-inset, 0px) - var(--rail-width, 56px)));\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n/* Surface title: Grotesk 20/28, −0.02em (SPEC-310C §6). */\n.title {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-xl-size);\n line-height: var(--text-xl-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display);\n color: var(--text-primary);\n}\n\n.stripActions {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n}\n\n.scroll {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-gutter: stable;\n}\n\n.body {\n display: flex;\n flex-direction: column;\n gap: var(--surface-gap);\n max-width: 1440px;\n margin: 0 auto;\n padding: var(--space-5) var(--space-5) var(--space-16);\n}\n\n.grid {\n display: grid;\n grid-template-columns: repeat(var(--surface-columns), minmax(0, 1fr));\n gap: var(--surface-gap);\n /* Cells share their row's height (audit 16)… */\n align-items: stretch;\n}\n\n.cell {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n/* …and a plain Card fills it, so a pair (Needs you | Leader) is one height.\n A chart frame keeps its natural height: stretching a chart to a taller\n neighbour draws a half-empty card (the 3.9 harness finding). */\n.cell > .card {\n flex: 1 1 auto;\n}\n\n/* A card that renders nothing (e.g. Cloud on a server without the lane)\n leaves no empty row and no extra grid gap. */\n.cell:empty {\n display: none;\n}\n\n.surface[data-viewport='compact'] .body {\n padding: var(--space-4) var(--space-4) var(--space-12);\n}\n\n.surface[data-viewport='compact'] .strip {\n padding: 0 var(--space-4);\n}\n\n/* Card frame — identical to ChartFrame so chart and non-chart cards read as one set. */\n.card {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n min-width: 0;\n padding: var(--card-pad);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n}\n\n.card[data-tone='attention'] {\n border-color: var(--border-default);\n box-shadow: inset 0 1px 0 var(--hairline-lift, transparent);\n}\n\n.cardHead {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--space-3);\n}\n\n.cardHeading {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n gap: 2px;\n min-width: 0;\n}\n\n/* Card title 13/18, 600. */\n.cardTitle {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.cardCaption {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.cardActions {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n flex: none;\n}\n\n.note {\n margin: 0;\n padding: var(--space-3);\n border-radius: var(--radius-md);\n background: var(--bg-hover);\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line-relaxed);\n}\n\n.note[data-tone='unknown'] {\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n}\n\n.note[data-tone='danger'] {\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n\n/* Micro-label 11/14 uppercase (SPEC-310C §6). */\n.micro {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n","/**\n * routes/verse/command/Surface.tsx — the layout every 3.10 surface shares\n * (Command, Fleet, Growth, Mind; SPEC-310C §5 + DESIGN.md §13.4).\n *\n * - a 48px strip with the surface title (Grotesk 20/28) and its actions;\n * - one scroll region;\n * - a 12-column grid (`--surface-columns`) with 16px gaps. Cards that\n * share a row are one height (a plain Card fills its cell); a chart frame\n * keeps its natural height, never stretched to a taller neighbour (the\n * 3.9 harness showed half-empty chart cards);\n * - spans come from the viewport class, never a hard-coded breakpoint:\n * wide uses the span as written; medium keeps each wide ROW whole —\n * a pair that fills 12 columns (5 | 7, 8 | 4) becomes 6 | 6 instead of\n * half + full with a blank half-row between (audit 15), and any other\n * cell folds ≤ 6 to half width and wider to full; compact (375) is one\n * column in DOM order — which is why every surface writes its cards in\n * the order the phone should show them.\n */\nimport { Children, cloneElement, isValidElement, useId, type CSSProperties, type ReactElement, type ReactNode } from 'react';\nimport { useViewport, type ViewportClass } from '../shell/viewport.js';\nimport styles from './surface.module.css';\n\nconst clampSpan = (span: number): number => Math.max(1, Math.min(12, Math.round(Number.isFinite(span) ? span : 12)));\n\n/** The grid span ONE card gets at a viewport class, on its own (no row context). Pure (tested). */\nexport function spanFor(viewport: ViewportClass, span: number): number {\n const s = clampSpan(span);\n if (viewport === 'compact') return 12;\n if (viewport === 'medium') return s <= 6 ? 6 : 12;\n return s;\n}\n\n/**\n * The spans a run of cells gets at a viewport class, in DOM order. Pure (tested).\n *\n * At medium the cells are grouped into the rows the wide grid would draw\n * (auto-placement: a cell that does not fit starts the next row). A row that\n * exactly fills 12 columns with two or more cells is treated as a unit: every\n * cell goes to half width, and an odd one out (a 4 | 4 | 4 trio's third)\n * takes the full row — so no row is left with a blank half. A row that does\n * not fill 12 (the surface's own layout left room) folds cell by cell.\n */\nexport function layoutSpans(viewport: ViewportClass, spans: readonly number[]): number[] {\n const wide = spans.map(clampSpan);\n const out = wide.map((s) => spanFor(viewport, s));\n if (viewport !== 'medium') return out;\n let start = 0;\n let sum = 0;\n for (let i = 0; i < wide.length; i += 1) {\n if (sum + wide[i]! > 12) {\n start = i;\n sum = 0;\n }\n sum += wide[i]!;\n if (sum === 12) {\n const count = i - start + 1;\n if (count >= 2) {\n for (let j = start; j <= i; j += 1) out[j] = 6;\n if (count % 2 === 1) out[i] = 12;\n }\n start = i + 1;\n sum = 0;\n }\n }\n return out;\n}\n\ninterface CellProps {\n span: number;\n children: ReactNode;\n className?: string;\n id?: string;\n /** Set by Surface from the whole grid's rows (layoutSpans); a Cell outside a Surface falls back to spanFor. */\n layoutSpan?: number;\n}\n\nfunction isCell(node: ReactNode): node is ReactElement<CellProps> {\n return isValidElement(node) && node.type === Cell;\n}\n\n/**\n * Hands each direct Cell child its span for this viewport, computed across the\n * whole run so rows stay whole. Only direct children (and arrays) are seen —\n * a Cell nested in a fragment keeps its own `spanFor` fallback.\n */\nfunction laidOut(children: ReactNode, viewport: ViewportClass): ReactNode[] {\n const items = Children.toArray(children);\n const spans = layoutSpans(viewport, items.filter(isCell).map((c) => c.props.span));\n let k = 0;\n return items.map((child) => (isCell(child) ? cloneElement(child, { layoutSpan: spans[k++] }) : child));\n}\n\nexport interface SurfaceProps {\n /** Accessible name and visible title (\"Command\"). */\n title: string;\n /** Right side of the strip (refresh indicator, etc.). */\n actions?: ReactNode;\n /** Rendered above the grid, full width (the Command top bar, the verdict). */\n lead?: ReactNode;\n children: ReactNode;\n}\n\nexport function Surface({ title, actions, lead, children }: SurfaceProps) {\n const titleId = useId();\n const { viewport } = useViewport();\n return (\n <section className={styles.surface} aria-labelledby={titleId} data-viewport={viewport}>\n <header className={styles.strip} data-app-region=\"drag\">\n <h2 id={titleId} className={styles.title}>{title}</h2>\n {actions ? <div className={styles.stripActions}>{actions}</div> : null}\n </header>\n <div className={styles.scroll}>\n <div className={styles.body}>\n {lead}\n <div className={styles.grid}>{laidOut(children, viewport)}</div>\n </div>\n </div>\n </section>\n );\n}\n\n/** One grid cell. `span` is the 1440 layout's column count (SPEC-310C §5 table). */\nexport function Cell({ span, children, className, id, layoutSpan }: CellProps) {\n const { viewport } = useViewport();\n const style: CSSProperties = { gridColumn: `span ${layoutSpan ?? spanFor(viewport, span)}` };\n return (\n <div id={id} className={`${styles.cell} ${className ?? ''}`} style={style} data-span={span}>\n {children}\n </div>\n );\n}\n\n/**\n * A non-chart card with the same frame as ChartFrame: title (13/18 600),\n * one caption line, then the body. Charts bring their own frame.\n */\nexport function Card({\n title,\n caption,\n actions,\n children,\n tone,\n labelledBy,\n}: {\n title: ReactNode;\n caption?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n /** A quiet emphasis for the one card that needs the operator (Needs you). */\n tone?: 'attention';\n labelledBy?: string;\n}) {\n const ownId = useId();\n const titleId = labelledBy ?? ownId;\n return (\n <section className={styles.card} aria-labelledby={titleId} data-tone={tone}>\n <header className={styles.cardHead}>\n <span className={styles.cardHeading}>\n <h3 id={titleId} className={styles.cardTitle}>{title}</h3>\n {caption ? <span className={styles.cardCaption}>{caption}</span> : null}\n </span>\n {actions ? <span className={styles.cardActions}>{actions}</span> : null}\n </header>\n {children}\n </section>\n );\n}\n\n/** A designed not-available / unknown line inside a card. */\nexport function CardNote({ children, tone = 'muted' }: { children: ReactNode; tone?: 'muted' | 'unknown' | 'danger' }) {\n return (\n <p className={styles.note} data-tone={tone} role={tone === 'danger' ? 'alert' : 'note'}>\n {children}\n </p>\n );\n}\n\n/** The micro-label (11/14 uppercase) used for group headings inside cards. */\nexport function MicroLabel({ children }: { children: ReactNode }) {\n return <span className={styles.micro}>{children}</span>;\n}\n"],"mappings":"+jBCsBM,EAAa,GAAyB,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,KAAK,MAAM,OAAO,SAAS,CAAI,EAAI,EAAO,EAAE,CAAC,CAAC,EAGnH,SAAgB,EAAQ,EAAyB,EAAsB,CACrE,IAAM,EAAI,EAAU,CAAI,EAGxB,OAFI,IAAa,UAAkB,GAC/B,IAAa,SAAiB,GAAK,EAAI,EAAI,GACxC,CACT,CAYA,SAAgB,EAAY,EAAyB,EAAoC,CACvF,IAAM,EAAO,EAAM,IAAI,CAAS,EAC1B,EAAM,EAAK,IAAK,GAAM,EAAQ,EAAU,CAAC,CAAC,EAChD,GAAI,IAAa,SAAU,OAAO,EAClC,IAAI,EAAQ,EACR,EAAM,EACV,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,OAAQ,GAAK,EAMpC,GALI,EAAM,EAAK,GAAM,KACnB,EAAQ,EACR,EAAM,GAER,GAAO,EAAK,GACR,IAAQ,GAAI,CACd,IAAM,EAAQ,EAAI,EAAQ,EAC1B,GAAI,GAAS,EAAG,CACd,IAAK,IAAI,EAAI,EAAO,GAAK,EAAG,GAAK,EAAG,EAAI,GAAK,EACzC,EAAQ,GAAM,IAAG,EAAI,GAAK,GAChC,CACA,EAAQ,EAAI,EACZ,EAAM,CACR,CAEF,OAAO,CACT,CAWA,SAAS,EAAO,EAAkD,CAChE,OAAA,EAAO,EAAA,eAAA,CAAe,CAAI,GAAK,EAAK,OAAS,CAC/C,CAOA,SAAS,EAAQ,EAAqB,EAAsC,CAC1E,IAAM,EAAQ,EAAA,SAAS,QAAQ,CAAQ,EACjC,EAAQ,EAAY,EAAU,EAAM,OAAO,CAAM,CAAC,CAAC,IAAK,GAAM,EAAE,MAAM,IAAI,CAAC,EAC7E,EAAI,EACR,OAAO,EAAM,IAAK,GAAW,EAAO,CAAK,GAAA,EAAI,EAAA,aAAA,CAAa,EAAO,CAAE,WAAY,EAAM,IAAK,CAAC,EAAI,CAAM,CACvG,CAYA,SAAgB,EAAQ,CAAE,QAAO,UAAS,OAAM,YAA0B,CACxE,IAAM,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,CAAE,YAAa,EAAY,EACjC,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,QAAS,kBAAiB,EAAS,gBAAe,EAA7E,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,MAAO,kBAAgB,OAAjD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAW,EAAO,MAAQ,SAAA,CAAU,CAAA,EACpD,GAAU,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,aAAe,SAAA,CAAa,CAAA,EAAI,IAC5D,CACR,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OACrB,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,CACG,GACD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAO,SAAA,EAAQ,EAAU,CAAQ,CAAO,CAAA,CAC5D,GACF,CAAA,CACE,GAEb,CAGA,SAAgB,EAAK,CAAE,OAAM,WAAU,YAAW,KAAI,cAAyB,CAC7E,GAAM,CAAE,YAAa,EAAY,EAC3B,EAAuB,CAAE,WAAY,QAAQ,GAAc,EAAQ,EAAU,CAAI,GAAI,EAC3F,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAS,KAAI,UAAW,GAAG,EAAO,KAAK,GAAG,GAAa,KAAa,QAAO,YAAW,EACnF,UACE,CAAA,CAET,CAMA,SAAgB,EAAK,CACnB,QACA,UACA,UACA,WACA,OACA,cASC,CACD,IAAM,GAAA,EAAQ,EAAA,MAAA,CAAM,EACd,EAAU,GAAc,EAC9B,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,KAAM,kBAAiB,EAAS,YAAW,EAAtE,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,SAA1B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAW,EAAO,UAAY,SAAA,CAAU,CAAA,EACxD,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAc,SAAA,CAAc,CAAA,EAAI,IAC/D,CACL,CAAA,EAAA,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAc,SAAA,CAAc,CAAA,EAAI,IAC7D,CACP,CAAA,EAAA,CACM,GAEb,CAGA,SAAgB,EAAS,CAAE,WAAU,OAAO,SAA2E,CACrH,OACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAM,YAAW,EAAM,KAAM,IAAS,SAAW,QAAU,OAC7E,UACA,CAAA,CAEP,CAGA,SAAgB,EAAW,CAAE,YAAqC,CAChE,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,UAAe,CAAA,CACxD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";import{A as r,B as i,H as a,I as o,L as s,S as c,V as l,W as u,_ as d,a as f,b as p,f as m,i as h,k as g,n as ee,o as _,r as v,t as y,u as b,y as x,z as te}from"./ChartFrame-DY-GVUb3.js";import{c as S,m as ne,p as C,s as re,y as w}from"./colors-DvK0wMHH.js";var T=t(e(),1),E={box:`_box_i6k7k_1`,fillBox:`_fillBox_i6k7k_8`,sparkline:`_sparkline_i6k7k_15`,line:`_line_i6k7k_20`,dot:`_dot_i6k7k_28`,area:`_area_i6k7k_34`,flat:`_flat_i6k7k_39`},D=n();function O(e,t){let n=e.filter(e=>e!==null&&Number.isFinite(e));if(n.length===0)return`no data`;let r=n[0],i=n[n.length-1],a=e.length-n.length;return`from ${t(r)} to ${t(i)}, range ${t(Math.min(...n))} to ${t(Math.max(...n))}`+(a>0?`, ${a} point${a===1?``:`s`} without data`:``)}var k=112;function ie(e){let t=(0,T.useRef)(null),[n,r]=(0,T.useState)(k);return(0,T.useLayoutEffect)(()=>{if(!e)return;let n=t.current;if(!n)return;let i=()=>{let e=Math.floor(n.getBoundingClientRect().width);e>0&&r(t=>t===e?t:e)};if(i(),typeof ResizeObserver>`u`)return;let a=0,o=new ResizeObserver(()=>{cancelAnimationFrame(a),a=requestAnimationFrame(i)});return o.observe(n),()=>{cancelAnimationFrame(a),o.disconnect()}},[e]),[t,n]}function A({points:e,width:t=72,height:n=24,ariaLabel:i,area:a=!1,describe:s,color:c=S}){let l=t===`fill`,[d,p]=ie(l),m=l?p:t,h=f(),ee=(0,T.useId)(),_=s?`${i}: ${O(e,s)}`:i,v=e.filter(e=>e!==null),y=3.5,b;if(v.length<2)b=(0,D.jsx)(`line`,{className:E.flat,x1:1,x2:m-1,y1:n-1.5,y2:n-1.5});else{let t=Math.min(...v,0),i=Math.max(...v,0)-t||1,s=(m-y*2)/Math.max(1,e.length-1),l=e=>y+(1-(e-t)/i)*(n-y*2),d=[],f=[];e.forEach((e,t)=>{if(e===null){f.length&&d.push(f),f=[];return}f.push({x:y+t*s,y:l(e)})}),f.length&&d.push(f);let p=e.map(e=>e!==null).lastIndexOf(!0),h=p>=0?{x:y+p*s,y:l(e[p])}:null,_=l(Math.max(t,0)),x=C(ee,`spark`);b=(0,D.jsxs)(D.Fragment,{children:[a?(0,D.jsx)(`defs`,{children:(0,D.jsx)(o,{id:x,color:c,top:y,bottom:_,from:.28})}):null,a?d.map((e,t)=>e.length>1?(0,D.jsx)(`path`,{className:`${E.area} ${u.fadeIn}`,fill:`url(#${x})`,d:g(e,e.map(e=>({x:e.x,y:_})))},`a${t}`):null):null,d.map((e,t)=>(0,D.jsx)(`path`,{className:`${E.line} ${u.draw}`,pathLength:1,stroke:c,d:r(e)},t)),h?(0,D.jsx)(`circle`,{className:`${E.dot} ${u.fadeIn}`,cx:h.x,cy:h.y,r:2.5,fill:c}):null]})}let x=(0,D.jsx)(`svg`,{className:E.sparkline,width:m,height:n,viewBox:`0 0 ${m} ${n}`,role:`img`,"aria-label":_,children:b});return(0,D.jsx)(`span`,{ref:d,className:l?E.fillBox:E.box,"data-motion":h,children:x})}var j={scroller:`_scroller_13ks6_1`,band:`_band_13ks6_7`,bar:`_bar_13ks6_12`,dimmed:`_dimmed_13ks6_18`,stale:`_stale_13ks6_24`,open:`_open_13ks6_28`,now:`_now_13ks6_33`,laneStops:`_laneStops_13ks6_40`,laneStop:`_laneStop_13ks6_40`,outline:`_outline_13ks6_58`},M=new Set([`queued`,`parked`,`waiting`]);function N(e){return e.outline??M.has(e.status.toLowerCase())}var ae=14,oe=6,P=22,se=3,F={done:`success`,success:`success`,merged:`success`,failed:`danger`,error:`danger`,aborted:`neutral`,cancelled:`neutral`,running:`running`,queued:`neutral`,parked:`neutral`};function ce(e){return F[e.toLowerCase()]??`unknown`}function le(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleString(`en-US`,{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`})}function ue(e,t){let n=t-e>1296e5;return e=>{let t=new Date(e);return Number.isNaN(t.getTime())?``:n?t.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`}):t.toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`})}}function de(e,t){return e.length>t?`${e.slice(0,Math.max(1,t-1))}…`:e}function I(e){if(!Number.isFinite(e)||e<0)return`—`;let t=Math.round(e/6e4);if(t<1)return`<1m`;if(t<60)return`${t}m`;let n=Math.floor(t/60);return n<48?`${n}h ${t%60}m`:`${Math.round(n/24)}d`}function fe({title:e,description:t,caveat:n,status:r,lanes:o,from:g,to:S,now:C,width:E,toneOf:O=ce,formatTime:k=le,formatTick:ie,ariaLabel:A}){let M=o.flatMap(e=>e.items.flatMap(e=>[e.start,e.end??NaN])).filter(d),F=d(S)?S:C!==void 0&&d(C)?C:M.length?Math.max(...M):Date.now(),fe=d(g)?g:M.length?Math.min(...M):F-864e5,[L,R]=m(fe,F,_,`end`),pe=ie??ue(L,R),z=(0,T.useRef)(null),B=h(z,E),me=v(),[V,he]=(0,T.useState)(0),[H,U]=(0,T.useState)(null),ge=f(),_e=(0,T.useId)(),W=ne((0,T.useId)()),G=C??R,ve=o.reduce((e,t)=>e+t.items.length,0),ye=r??(ve===0?{kind:`empty`,message:`No runs in this window.`}:{kind:`ready`}),be=o.some(e=>e.engine!==void 0)?18:0,K=Math.max(72,Math.min(160,Math.round(B*.24)))+be,xe=Math.floor((K-be)/(7*me)),q=Math.max(40,B-K-8),J=c(L,Math.max(R,L+1),K,K+q),Y=o.length>50,X=Y?Math.max(0,Math.floor(V/24)-oe):0,Se=Y?Math.min(o.length,Math.ceil(V/24)+ae+oe):o.length,Z=o.length*24,Ce=(0,T.useMemo)(()=>{let e=new Map;for(let t of o)for(let n of t.items){let t=O(n.status),r=N(n)?`outline`:t===`unknown`?`hatch`:t,i=r===`outline`?{kind:`empty`}:r===`hatch`?{kind:`hatch`}:{color:w(t)};e.has(r)||e.set(r,{item:i,names:new Set}),e.get(r).names.add(n.status.toLowerCase())}return[...e.values()].map(({item:e,names:t})=>({...e,label:[...t].sort().join(` / `)}))},[o,O]),we=o.some(e=>e.engine!==void 0),Q=(0,T.useMemo)(()=>{let e=Math.max(2,Math.floor(q/90)),t=(R-L)/Math.max(1,e);return Array.from({length:e+1},(e,n)=>L+t*n)},[L,R,q]),Te=(0,T.useMemo)(()=>o.flatMap(e=>e.items.map(t=>({...t,lane:e.label,engine:e.engine}))),[o]);function Ee(e){let t=new Map;for(let n of e.items)t.set(n.status,(t.get(n.status)??0)+1);let n=[...t.entries()].sort((e,t)=>t[1]-e[1]).map(([e,t])=>`${t} ${e}`),r=e.engine?` (${e.engine})`:``;return`${e.label}${r}: ${e.items.length} run${e.items.length===1?``:`s`}${n.length?` (${n.join(`, `)})`:``}`}let De=A??`${e}: ${ve} runs across ${o.length} lanes from ${k(L)} to ${k(R)}.`,Oe=[{key:`lane`,label:`Lane`,render:e=>e.lane},...we?[{key:`engine`,label:`Engine`,render:e=>e.engine??`—`}]:[],{key:`status`,label:`Status`,render:e=>`${e.status}${e.stale?` (stale)`:``}`},{key:`start`,label:`Started`,render:e=>k(e.start)},{key:`dur`,label:`Duration`,numeric:!0,render:e=>e.end===null?`${I(G-e.start)}+`:I(e.end-e.start)},{key:`detail`,label:`Detail`,render:e=>e.detail??``}],$=H?o[H.lane]?.items[H.item]:void 0;function ke(e,t){let n=t*24;return(0,D.jsxs)(`g`,{"data-lane":e.id,children:[t%2==1?(0,D.jsx)(`rect`,{className:j.band,x:0,y:n,width:B,height:24}):null,e.engine?(0,D.jsx)(i,{engine:e.engine,x:2,y:n+5,height:14}):null,(0,D.jsx)(`text`,{className:u.label,x:K-8,y:n+12,dy:`0.32em`,textAnchor:`end`,children:de(e.label,xe)}),e.items.map((e,r)=>{let i=Math.max(L,e.start),a=Math.min(R,e.end??G);if(a<L||i>R)return null;let o=J(i),s=Math.max(se,J(Math.max(a,i))-o),c=O(e.status),l=N(e),d=!l&&c===`unknown`,f=H!==null&&(H.lane!==t||H.item!==r);return(0,D.jsx)(`rect`,{"data-item":e.id,"data-status":e.status,"data-open":e.end===null?`true`:void 0,"data-style":l?`outline`:d?`hatch`:`fill`,className:`${j.bar} ${u.grow} ${f?j.dimmed:``} ${e.stale?j.stale:``} ${e.end===null?j.open:``} ${l?j.outline:``} ${d?u.unknownMark:``}`,style:{"--chart-i":Math.min(t,10)},x:l?o+.5:o,y:l?n+5.5:n+5,width:l?Math.max(se,s-1):s,height:l?13:14,rx:3,fill:l?`none`:d?`url(#${W})`:w(c),stroke:l?re:void 0,onPointerEnter:()=>U({lane:t,item:r}),onPointerLeave:()=>U(e=>e&&e.lane===t&&e.item===r?null:e)},e.id)})]},e.id)}let Ae=p(Q.map((e,t)=>({key:String(t),x:J(e),anchor:t===0?`start`:t===Q.length-1?`end`:`middle`,priority:t===Q.length-1?3:t===0?2:1,required:t===0||t===Q.length-1,variants:[pe(e)]})),{min:K,max:K+q,charPx:x(me)}),je=(0,D.jsxs)(`svg`,{className:u.svg,width:B,height:P,viewBox:`0 0 ${B} ${P}`,"aria-hidden":`true`,children:[(0,D.jsx)(`line`,{className:u.axis,x1:K,x2:K+q,y1:21,y2:21}),Ae.map(e=>(0,D.jsx)(`text`,{"data-axis-label":e.key,className:u.tick,x:e.x,y:15,textAnchor:e.anchor,children:e.text},e.key))]});return(0,D.jsx)(y,{title:e,description:t,caveat:n,status:ye,skeleton:`lanes`,table:(0,D.jsx)(ee,{caption:e,columns:Oe,rows:Te,rowKey:e=>e.id}),footer:(0,D.jsx)(s,{min:1,items:Ce}),children:(0,D.jsxs)(`div`,{ref:z,className:u.plotWrap,"data-motion":Y?`static`:ge,children:[je,(0,D.jsxs)(`div`,{className:Y?j.scroller:void 0,style:Y?{height:336}:void 0,onScroll:Y?e=>he(e.currentTarget.scrollTop):void 0,"data-virtualized":Y?`true`:void 0,children:[(0,D.jsxs)(`svg`,{className:u.svg,width:B,height:Z,viewBox:`0 0 ${B} ${Z}`,role:`img`,"aria-label":De,children:[(0,D.jsx)(`defs`,{children:(0,D.jsx)(l,{id:W})}),Q.map(e=>(0,D.jsx)(`line`,{className:u.grid,x1:b(J(e)),x2:b(J(e)),y1:0,y2:Z},e)),G>=L&&G<=R?(0,D.jsx)(`line`,{className:j.now,x1:b(J(G)),x2:b(J(G)),y1:0,y2:Z}):null,o.slice(X,Se).map((e,t)=>ke(e,X+t))]}),(0,D.jsx)(`ul`,{className:j.laneStops,style:{height:Z},"aria-label":`${e} lanes`,"aria-describedby":_e,children:o.slice(X,Se).map((e,t)=>(0,D.jsx)(`li`,{tabIndex:0,className:`${j.laneStop} ${u.focusable}`,style:{top:(X+t)*24,height:24},"aria-label":Ee(e),onFocus:()=>U(e.items.length?{lane:X+t,item:e.items.length-1}:null),onBlur:()=>U(null)},e.id))})]}),(0,D.jsx)(`span`,{id:_e,className:u.srOnly,children:`Each lane lists its runs by status; open the Table view for every run.`}),H&&$?(0,D.jsx)(te,{left:a(J(Math.max(L,$.start)),B),top:P+H.lane*24-(Y?V:0),title:o[H.lane].label,rows:[{key:`s`,label:`Status`,value:`${$.status}${$.stale?` (stale)`:``}`,...N($)||O($.status)===`unknown`?{}:{color:w(O($.status))}},{key:`t`,label:`Started`,value:k($.start)},{key:`d`,label:`Duration`,value:$.end===null?`${I(G-$.start)} so far`:I($.end-$.start)},...$.detail?[{key:`x`,label:`Detail`,value:$.detail}]:[]]}):null]})})}export{A as n,fe as t};
|
|
2
|
+
//# sourceMappingURL=Swimlane-B9Exxekk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Swimlane-B9Exxekk.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/Sparkline.module.css","../../../../../../src/web-ui/components/charts/Sparkline.tsx","../../../../../../src/web-ui/components/charts/Swimlane.module.css","../../../../../../src/web-ui/components/charts/Swimlane.tsx"],"sourcesContent":[".box {\n display: inline-block;\n line-height: 0;\n vertical-align: middle;\n}\n\n/* `width=\"fill\"`: the sparkline spans its box (a stat tile's full width). */\n.fillBox {\n display: block;\n width: 100%;\n min-width: 0;\n line-height: 0;\n}\n\n.sparkline {\n display: block;\n overflow: visible;\n}\n\n.line {\n fill: none;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n/* The latest point: the line's ink, ringed with the surface. */\n.dot {\n stroke: var(--chart-surface);\n stroke-width: 1.5;\n}\n\n/* The wash is a gradient (ChartParts AreaGradient); opacity lives in its stops. */\n.area {\n stroke: none;\n}\n\n/* Fewer than two known points: a quiet dashed baseline, not an empty box. */\n.flat {\n stroke: var(--chart-grid);\n stroke-width: 1;\n stroke-dasharray: 2 2;\n}\n","/**\n * components/charts/Sparkline.tsx — the 12-ish-point inline trend for a\n * stat tile (marks-and-anatomy.md \"Figures\" stat-tile contract). No axes,\n * no legend, no tooltip — it is a glance, not a chart; the real numbers\n * live in the stat tile's value and in the full chart elsewhere on the\n * view. Gaps (`null`) break the line rather than reading as a dip to zero.\n *\n * V3.10: optional `area` wash, an optional `describe` formatter that appends a\n * spoken summary (first → latest, min–max) to the aria-label so the glance is\n * not image-only for a screen reader, and a designed flat/unknown state (a\n * dashed baseline) instead of an empty box when fewer than two points are known.\n *\n * Polish (verse-visual-quality): the line is the quantity ink (azure, not a\n * gray that read as \"disabled\"), drawn as a monotone curve through every\n * point (chart-math — it never overshoots, so no invented peak), the wash is\n * a gradient of that ink, the latest point is a ringed dot, `width=\"fill\"`\n * spans the tile instead of a fixed 112 px stub, and the line draws itself in\n * once on mount unless reduced motion is asked for (motion.ts).\n */\nimport { useId, useLayoutEffect, useRef, useState, type ReactNode, type RefObject } from 'react';\nimport { AreaGradient } from './ChartParts.js';\nimport { CHART_SEQUENTIAL, gradientId } from './colors.js';\nimport { smoothAreaPath, smoothPath, type XY } from './chart-math.js';\nimport { useChartMotion } from './motion.js';\nimport './chart-tokens.css';\nimport plot from './plot.module.css';\nimport styles from './Sparkline.module.css';\n\nexport function sparklineSummary(points: (number | null)[], format: (v: number) => string): string {\n const known = points.filter((p): p is number => p !== null && Number.isFinite(p));\n if (known.length === 0) return 'no data';\n const first = known[0]!;\n const latest = known[known.length - 1]!;\n const gaps = points.length - known.length;\n return `from ${format(first)} to ${format(latest)}, range ${format(Math.min(...known))} to ${format(Math.max(...known))}` +\n (gaps > 0 ? `, ${gaps} point${gaps === 1 ? '' : 's'} without data` : '');\n}\n\n/** Width a `fill` sparkline draws at before its box is measured (jsdom, first paint). */\nconst FILL_FALLBACK_W = 112;\n\n/** The measured width of a `fill` sparkline's box (no chart minimum: a tile can be narrow). */\nfunction useFillWidth(enabled: boolean): [RefObject<HTMLSpanElement | null>, number] {\n const ref = useRef<HTMLSpanElement>(null);\n const [w, setW] = useState<number>(FILL_FALLBACK_W);\n useLayoutEffect(() => {\n if (!enabled) return undefined;\n const el = ref.current;\n if (!el) return undefined;\n const read = (): void => {\n const next = Math.floor(el.getBoundingClientRect().width);\n if (next > 0) setW((prev) => (prev === next ? prev : next));\n };\n read();\n if (typeof ResizeObserver === 'undefined') return undefined;\n let frame = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(read);\n });\n observer.observe(el);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [enabled]);\n return [ref, w];\n}\n\nexport function Sparkline({\n points,\n width = 72,\n height = 24,\n ariaLabel,\n area = false,\n describe,\n color = CHART_SEQUENTIAL,\n}: {\n points: (number | null)[];\n /** Pixels, or `fill` to span the containing box (StatTile). */\n width?: number | 'fill';\n height?: number;\n ariaLabel: string;\n /** Soft gradient wash under the line. */\n area?: boolean;\n /** When given, a spoken summary is appended to `ariaLabel`. */\n describe?: (v: number) => string;\n /** The line's ink (default: the quantity azure). */\n color?: string;\n}) {\n const fill = width === 'fill';\n const [boxRef, measured] = useFillWidth(fill);\n const w = fill ? measured : width;\n const motion = useChartMotion();\n const gradKey = useId();\n const label = describe ? `${ariaLabel}: ${sparklineSummary(points, describe)}` : ariaLabel;\n const known = points.filter((p): p is number => p !== null);\n\n // Pad by the end dot's radius + ring so it is never cropped at the edge.\n const PAD = 3.5;\n let body: ReactNode;\n if (known.length < 2) {\n body = <line className={styles.flat} x1={1} x2={w - 1} y1={height - 1.5} y2={height - 1.5} />;\n } else {\n const min = Math.min(...known, 0);\n const max = Math.max(...known, 0);\n const range = max - min || 1;\n const stepX = (w - PAD * 2) / Math.max(1, points.length - 1);\n const yOf = (v: number) => PAD + (1 - (v - min) / range) * (height - PAD * 2);\n\n // Split into contiguous runs so a null renders as a real gap, not a dip.\n const runs: XY[][] = [];\n let current: XY[] = [];\n points.forEach((v, i) => {\n if (v === null) {\n if (current.length) runs.push(current);\n current = [];\n return;\n }\n current.push({ x: PAD + i * stepX, y: yOf(v) });\n });\n if (current.length) runs.push(current);\n\n const lastKnownIndex = points.map((v) => v !== null).lastIndexOf(true);\n const lastPoint = lastKnownIndex >= 0 ? { x: PAD + lastKnownIndex * stepX, y: yOf(points[lastKnownIndex] as number) } : null;\n const baseY = yOf(Math.max(min, 0));\n const gid = gradientId(gradKey, 'spark');\n\n body = (\n <>\n {area ? (\n <defs>\n <AreaGradient id={gid} color={color} top={PAD} bottom={baseY} from={0.28} />\n </defs>\n ) : null}\n {area\n ? runs.map((run, i) =>\n run.length > 1 ? (\n <path\n key={`a${i}`}\n className={`${styles.area} ${plot.fadeIn}`}\n fill={`url(#${gid})`}\n d={smoothAreaPath(run, run.map((p) => ({ x: p.x, y: baseY })))}\n />\n ) : null,\n )\n : null}\n {runs.map((run, i) => (\n <path key={i} className={`${styles.line} ${plot.draw}`} pathLength={1} stroke={color} d={smoothPath(run)} />\n ))}\n {lastPoint ? <circle className={`${styles.dot} ${plot.fadeIn}`} cx={lastPoint.x} cy={lastPoint.y} r={2.5} fill={color} /> : null}\n </>\n );\n }\n\n const svg = (\n <svg className={styles.sparkline} width={w} height={height} viewBox={`0 0 ${w} ${height}`} role=\"img\" aria-label={label}>\n {body}\n </svg>\n );\n return (\n <span ref={boxRef} className={fill ? styles.fillBox : styles.box} data-motion={motion}>\n {svg}\n </span>\n );\n}\n",".scroller {\n position: relative;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n\n.band {\n fill: var(--chart-grid);\n opacity: 0.35;\n}\n\n.bar {\n cursor: default;\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n\n/* Another run is hovered: step back so the one being read stands out. */\n.dimmed {\n opacity: 0.45;\n}\n\n/* Running on disk but silent for a long time: faded, and said in words in\n the tooltip and table — the fade is never the only signal. */\n.stale {\n opacity: 0.4;\n}\n\n.open {\n /* Square corners on open-ended work: a rounded end reads as \"finished\". */\n rx: 0;\n}\n\n.now {\n stroke: var(--text-tertiary);\n stroke-width: 1;\n stroke-dasharray: 2 3;\n shape-rendering: crispEdges;\n}\n\n.laneStops {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n margin: 0;\n padding: 0;\n list-style: none;\n pointer-events: none;\n}\n\n.laneStop {\n position: absolute;\n left: 0;\n right: 0;\n}\n\n/* Queued / parked: a neutral outline, no fill — holding a place, not running. */\n.outline {\n stroke-width: 1.5;\n}\n","/**\n * components/charts/Swimlane.tsx — who ran what, when: one row (lane) per repo\n * or agent, one bar per run from its start to its end, coloured by STATUS\n * (the StatusBadge tones — state, not identity — always with a text legend).\n *\n * Open-ended work: a bar with `end: null` extends to `now` and gets an open\n * right edge; a `stale` one (running on disk, silent for a long time) is drawn\n * faded and says so in its tooltip and the table.\n *\n * V3.10: a lane may carry its ENGINE — drawn as the 2px identity tick and\n * the C/X/G/L monogram beside the label (never a vendor logo, and never the\n * bar fill: bars keep STATUS colour). Queued and parked work draws as a\n * neutral OUTLINE with no fill (\"not running yet\" must not look like a\n * status), and an unknown status draws as the 45° unknown hatch.\n *\n * Scale: past VIRTUALIZE_AFTER lanes the body becomes a fixed-height scroller\n * that renders only the rows in view (plus overscan), so a 500-lane history\n * costs the same DOM as a 20-lane one. Each lane is a keyboard stop with a\n * spoken summary; every run is in the Table view.\n *\n * Polish (verse-visual-quality): runs grow from their start once on mount,\n * lane by lane (not when virtualized — rows mounting on scroll must not\n * replay it; static under reduced motion), hovering a run dims the others\n * so the one being read stands out, and gridlines snap to the pixel grid.\n */\nimport { useId, useMemo, useRef, useState, type CSSProperties, type UIEvent } from 'react';\nimport { CHART_QUEUED_OUTLINE, hatchPatternId, toneColor, type ChartEngine, type ChartTone } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend, ChartTooltip, EngineTick, HatchPattern, clampTooltipLeft, type ChartLegendItem } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { MIN_TIME_SPAN_MS, crisp, ensureSpan, isPlausibleTime, labelCharPx, layoutAxisLabels, linearScale } from './chart-math.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport { useChartMotion } from './motion.js';\nimport { useTextScale } from './useTextScale.js';\nimport plot from './plot.module.css';\nimport styles from './Swimlane.module.css';\n\nexport interface SwimlaneItem {\n id: string;\n /** Epoch ms. */\n start: number;\n /** Epoch ms; null while still running. */\n end: number | null;\n /** Free-form status string (done / failed / aborted / running …). */\n status: string;\n /** Optional short text for tooltip and table (e.g. the engine). */\n detail?: string;\n stale?: boolean;\n /**\n * Draw as an outline with no fill — queued / parked work that holds a place\n * in line but is not running. Defaults to true for the statuses in\n * OUTLINE_STATUSES.\n */\n outline?: boolean;\n}\n\nexport interface SwimlaneLane {\n id: string;\n label: string;\n items: SwimlaneItem[];\n /** The lane's engine: a 2px identity tick + monogram beside the label. */\n engine?: ChartEngine;\n}\n\n/** Statuses that draw as an outline by default (they hold a place; nothing runs). */\nexport const OUTLINE_STATUSES: ReadonlySet<string> = new Set(['queued', 'parked', 'waiting']);\n\nfunction isOutline(item: SwimlaneItem): boolean {\n return item.outline ?? OUTLINE_STATUSES.has(item.status.toLowerCase());\n}\n\nexport interface SwimlaneProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n lanes: SwimlaneLane[];\n /** Visible time window, epoch ms. */\n from: number;\n to: number;\n /** \"Now\" for open-ended bars (defaults to `to`). */\n now?: number;\n width?: number;\n /** Map a status string to a tone. Defaults to the StatusBadge vocabulary subset below. */\n toneOf?: (status: string) => ChartTone;\n /** Full timestamp for tooltip and table. */\n formatTime?: (ms: number) => string;\n /** Axis tick label. Defaults to a span-aware short form (dates past 36 h, clock times below). */\n formatTick?: (ms: number) => string;\n ariaLabel?: string;\n}\n\nexport const ROW_H = 24;\nexport const VIRTUALIZE_AFTER = 50;\nconst VIEWPORT_ROWS = 14;\nconst OVERSCAN = 6;\nconst AXIS_H = 22;\nconst MIN_BAR_W = 3;\n\nconst DEFAULT_TONES: Record<string, ChartTone> = {\n done: 'success',\n success: 'success',\n merged: 'success',\n failed: 'danger',\n error: 'danger',\n aborted: 'neutral',\n cancelled: 'neutral',\n running: 'running',\n queued: 'neutral',\n parked: 'neutral',\n};\n\nfunction defaultToneOf(status: string): ChartTone {\n return DEFAULT_TONES[status.toLowerCase()] ?? 'unknown';\n}\n\nfunction defaultFormatTime(ms: number): string {\n const d = new Date(ms);\n return Number.isNaN(d.getTime())\n ? ''\n : d.toLocaleString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });\n}\n\n/** Short axis labels: long windows get dates, short ones get clock times — full timestamps collide. */\nexport function spanTickFormatter(from: number, to: number): (ms: number) => string {\n const long = to - from > 36 * 3_600_000;\n return (ms) => {\n const d = new Date(ms);\n if (Number.isNaN(d.getTime())) return '';\n return long\n ? d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })\n : d.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' });\n };\n}\n\nfunction truncateLabel(label: string, chars: number): string {\n return label.length > chars ? `${label.slice(0, Math.max(1, chars - 1))}…` : label;\n}\n\nfunction formatDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) return '—';\n const m = Math.round(ms / 60_000);\n if (m < 1) return '<1m';\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n return h < 48 ? `${h}h ${m % 60}m` : `${Math.round(h / 24)}d`;\n}\n\ninterface FlatItem extends SwimlaneItem {\n lane: string;\n engine: ChartEngine | undefined;\n}\n\nexport function Swimlane({\n title,\n description,\n caveat,\n status,\n lanes,\n from: fromProp,\n to: toProp,\n now,\n width: fixedWidth,\n toneOf = defaultToneOf,\n formatTime = defaultFormatTime,\n formatTick,\n ariaLabel,\n}: SwimlaneProps) {\n // A window bound of 0 / NaN / pre-2000 is a null timestamp that leaked\n // through; fall back to the runs themselves (then to a day ending now), and\n // widen a degenerate window so its ticks are distinct times.\n const itemTimes = lanes.flatMap((l) => l.items.flatMap((i) => [i.start, i.end ?? Number.NaN])).filter(isPlausibleTime);\n const toBound = isPlausibleTime(toProp)\n ? toProp\n : now !== undefined && isPlausibleTime(now) ? now : itemTimes.length ? Math.max(...itemTimes) : Date.now();\n const fromBound = isPlausibleTime(fromProp) ? fromProp : itemTimes.length ? Math.min(...itemTimes) : toBound - 86_400_000;\n const [from, to] = ensureSpan(fromBound, toBound, MIN_TIME_SPAN_MS, 'end');\n const tickLabel = formatTick ?? spanTickFormatter(from, to);\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const textScale = useTextScale();\n const [scrollTop, setScrollTop] = useState(0);\n const [hover, setHover] = useState<{ lane: number; item: number } | null>(null);\n const motion = useChartMotion();\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const nowMs = now ?? to;\n\n const itemCount = lanes.reduce((n, l) => n + l.items.length, 0);\n const resolvedStatus: ChartStatus = status ?? (itemCount === 0 ? { kind: 'empty', message: 'No runs in this window.' } : { kind: 'ready' });\n\n // Narrow screens give the labels less room, never less than a readable 72 px\n // (plus room for the engine tick and monogram when lanes carry one).\n const tickW = lanes.some((l) => l.engine !== undefined) ? 18 : 0;\n const labelW = Math.max(72, Math.min(160, Math.round(width * 0.24))) + tickW;\n // 7 px a character at 12 px text, scaled to the Display size.\n const labelChars = Math.floor((labelW - tickW) / (7 * textScale));\n const plotW = Math.max(40, width - labelW - 8);\n const xs = linearScale(from, Math.max(to, from + 1), labelW, labelW + plotW);\n const virtual = lanes.length > VIRTUALIZE_AFTER;\n const first = virtual ? Math.max(0, Math.floor(scrollTop / ROW_H) - OVERSCAN) : 0;\n const last = virtual ? Math.min(lanes.length, Math.ceil(scrollTop / ROW_H) + VIEWPORT_ROWS + OVERSCAN) : lanes.length;\n const bodyH = lanes.length * ROW_H;\n\n // Legend: one entry per drawn style — a status tone, the outline (queued /\n // parked) or the unknown hatch — each named by the statuses it stands for.\n const legendItems = useMemo((): ChartLegendItem[] => {\n const seen = new Map<string, { item: Omit<ChartLegendItem, 'label'>; names: Set<string> }>();\n for (const lane of lanes) for (const item of lane.items) {\n const tone = toneOf(item.status);\n const key = isOutline(item) ? 'outline' : tone === 'unknown' ? 'hatch' : tone;\n const style: Omit<ChartLegendItem, 'label'> = key === 'outline' ? { kind: 'empty' } : key === 'hatch' ? { kind: 'hatch' } : { color: toneColor(tone) };\n if (!seen.has(key)) seen.set(key, { item: style, names: new Set() });\n seen.get(key)!.names.add(item.status.toLowerCase());\n }\n return [...seen.values()].map(({ item, names }) => ({ ...item, label: [...names].sort().join(' / ') }));\n }, [lanes, toneOf]);\n const anyEngine = lanes.some((l) => l.engine !== undefined);\n\n const ticks = useMemo(() => {\n const count = Math.max(2, Math.floor(plotW / 90));\n const step = (to - from) / Math.max(1, count);\n return Array.from({ length: count + 1 }, (_, i) => from + step * i);\n }, [from, to, plotW]);\n\n const flat: FlatItem[] = useMemo(\n () => lanes.flatMap((lane) => lane.items.map((item) => ({ ...item, lane: lane.label, engine: lane.engine }))),\n [lanes],\n );\n\n function laneSummary(lane: SwimlaneLane): string {\n const counts = new Map<string, number>();\n for (const item of lane.items) counts.set(item.status, (counts.get(item.status) ?? 0) + 1);\n const parts = [...counts.entries()].sort((a, b) => b[1] - a[1]).map(([s, n]) => `${n} ${s}`);\n const engine = lane.engine ? ` (${lane.engine})` : '';\n return `${lane.label}${engine}: ${lane.items.length} run${lane.items.length === 1 ? '' : 's'}${parts.length ? ` (${parts.join(', ')})` : ''}`;\n }\n\n const summary = ariaLabel ?? `${title}: ${itemCount} runs across ${lanes.length} lanes from ${formatTime(from)} to ${formatTime(to)}.`;\n\n const columns: TableColumn<FlatItem>[] = [\n { key: 'lane', label: 'Lane', render: (r) => r.lane },\n ...(anyEngine ? [{ key: 'engine', label: 'Engine', render: (r: FlatItem) => r.engine ?? '—' }] : []),\n { key: 'status', label: 'Status', render: (r) => `${r.status}${r.stale ? ' (stale)' : ''}` },\n { key: 'start', label: 'Started', render: (r) => formatTime(r.start) },\n { key: 'dur', label: 'Duration', numeric: true, render: (r) => (r.end === null ? `${formatDuration(nowMs - r.start)}+` : formatDuration(r.end - r.start)) },\n { key: 'detail', label: 'Detail', render: (r) => r.detail ?? '' },\n ];\n\n const hovered = hover ? lanes[hover.lane]?.items[hover.item] : undefined;\n\n function renderLane(lane: SwimlaneLane, index: number) {\n const y = index * ROW_H;\n return (\n <g key={lane.id} data-lane={lane.id}>\n {index % 2 === 1 ? <rect className={styles.band} x={0} y={y} width={width} height={ROW_H} /> : null}\n {lane.engine ? <EngineTick engine={lane.engine} x={2} y={y + 5} height={ROW_H - 10} /> : null}\n <text className={plot.label} x={labelW - 8} y={y + ROW_H / 2} dy=\"0.32em\" textAnchor=\"end\">\n {truncateLabel(lane.label, labelChars)}\n </text>\n {lane.items.map((item, itemIndex) => {\n const start = Math.max(from, item.start);\n const endMs = Math.min(to, item.end ?? nowMs);\n if (endMs < from || start > to) return null;\n const x0 = xs(start);\n const w = Math.max(MIN_BAR_W, xs(Math.max(endMs, start)) - x0);\n const tone = toneOf(item.status);\n const outline = isOutline(item);\n const unknown = !outline && tone === 'unknown';\n const dimmed = hover !== null && !(hover.lane === index && hover.item === itemIndex);\n return (\n <rect\n key={item.id}\n data-item={item.id}\n data-status={item.status}\n data-open={item.end === null ? 'true' : undefined}\n data-style={outline ? 'outline' : unknown ? 'hatch' : 'fill'}\n className={`${styles.bar} ${plot.grow} ${dimmed ? styles.dimmed : ''} ${item.stale ? styles.stale : ''} ${item.end === null ? styles.open : ''} ${outline ? styles.outline : ''} ${unknown ? plot.unknownMark : ''}`}\n style={{ '--chart-i': Math.min(index, 10) } as CSSProperties}\n x={outline ? x0 + 0.5 : x0}\n y={outline ? y + 5.5 : y + 5}\n width={outline ? Math.max(MIN_BAR_W, w - 1) : w}\n height={outline ? ROW_H - 11 : ROW_H - 10}\n rx={3}\n fill={outline ? 'none' : unknown ? `url(#${hatchId})` : toneColor(tone)}\n stroke={outline ? CHART_QUEUED_OUTLINE : undefined}\n onPointerEnter={() => setHover({ lane: index, item: itemIndex })}\n onPointerLeave={() => setHover((h) => (h && h.lane === index && h.item === itemIndex ? null : h))}\n />\n );\n })}\n </g>\n );\n }\n\n // Tick labels never overprint: the window's end outranks its start, and an\n // interior tick whose label would touch a neighbour is dropped (its\n // gridline stays).\n const tickLabels = layoutAxisLabels(\n ticks.map((t, i) => ({\n key: String(i),\n x: xs(t),\n anchor: i === 0 ? 'start' as const : i === ticks.length - 1 ? 'end' as const : 'middle' as const,\n priority: i === ticks.length - 1 ? 3 : i === 0 ? 2 : 1,\n required: i === 0 || i === ticks.length - 1,\n variants: [tickLabel(t)],\n })),\n { min: labelW, max: labelW + plotW, charPx: labelCharPx(textScale) },\n );\n\n const axis = (\n <svg className={plot.svg} width={width} height={AXIS_H} viewBox={`0 0 ${width} ${AXIS_H}`} aria-hidden=\"true\">\n <line className={plot.axis} x1={labelW} x2={labelW + plotW} y1={AXIS_H - 1} y2={AXIS_H - 1} />\n {tickLabels.map((l) => (\n <text key={l.key} data-axis-label={l.key} className={plot.tick} x={l.x} y={AXIS_H - 7} textAnchor={l.anchor}>\n {l.text}\n </text>\n ))}\n </svg>\n );\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={flat} rowKey={(r) => r.id} />}\n footer={<ChartLegend min={1} items={legendItems} />}\n >\n <div ref={wrapRef} className={plot.plotWrap} data-motion={virtual ? 'static' : motion}>\n {axis}\n <div\n className={virtual ? styles.scroller : undefined}\n style={virtual ? { height: VIEWPORT_ROWS * ROW_H } : undefined}\n onScroll={virtual ? (e: UIEvent<HTMLDivElement>) => setScrollTop(e.currentTarget.scrollTop) : undefined}\n data-virtualized={virtual ? 'true' : undefined}\n >\n <svg className={plot.svg} width={width} height={bodyH} viewBox={`0 0 ${width} ${bodyH}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {ticks.map((t) => (\n <line key={t} className={plot.grid} x1={crisp(xs(t))} x2={crisp(xs(t))} y1={0} y2={bodyH} />\n ))}\n {nowMs >= from && nowMs <= to ? (\n <line className={styles.now} x1={crisp(xs(nowMs))} x2={crisp(xs(nowMs))} y1={0} y2={bodyH} />\n ) : null}\n {lanes.slice(first, last).map((lane, i) => renderLane(lane, first + i))}\n </svg>\n {/* Keyboard + screen-reader lane list, overlaid on the rows it describes. */}\n <ul className={styles.laneStops} style={{ height: bodyH }} aria-label={`${title} lanes`} aria-describedby={liveId}>\n {lanes.slice(first, last).map((lane, i) => (\n <li\n key={lane.id}\n tabIndex={0}\n className={`${styles.laneStop} ${plot.focusable}`}\n style={{ top: (first + i) * ROW_H, height: ROW_H }}\n aria-label={laneSummary(lane)}\n onFocus={() => setHover(lane.items.length ? { lane: first + i, item: lane.items.length - 1 } : null)}\n onBlur={() => setHover(null)}\n />\n ))}\n </ul>\n </div>\n <span id={liveId} className={plot.srOnly}>Each lane lists its runs by status; open the Table view for every run.</span>\n {hover && hovered ? (\n <ChartTooltip\n left={clampTooltipLeft(xs(Math.max(from, hovered.start)), width)}\n top={AXIS_H + hover.lane * ROW_H - (virtual ? scrollTop : 0)}\n title={lanes[hover.lane]!.label}\n rows={[\n {\n key: 's',\n label: 'Status',\n value: `${hovered.status}${hovered.stale ? ' (stale)' : ''}`,\n ...(isOutline(hovered) || toneOf(hovered.status) === 'unknown' ? {} : { color: toneColor(toneOf(hovered.status)) }),\n },\n { key: 't', label: 'Started', value: formatTime(hovered.start) },\n {\n key: 'd',\n label: 'Duration',\n value: hovered.end === null ? `${formatDuration(nowMs - hovered.start)} so far` : formatDuration(hovered.end - hovered.start),\n },\n ...(hovered.detail ? [{ key: 'x', label: 'Detail', value: hovered.detail }] : []),\n ]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._box_i6k7k_1{vertical-align:middle;line-height:0;display:inline-block}._fillBox_i6k7k_8{width:100%;min-width:0;line-height:0;display:block}._sparkline_i6k7k_15{display:block;overflow:visible}._line_i6k7k_20{fill:none;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}._dot_i6k7k_28{stroke:var(--chart-surface);stroke-width:1.5px}._area_i6k7k_34{stroke:none}._flat_i6k7k_39{stroke:var(--chart-grid);stroke-width:1px;stroke-dasharray:2 2}._scroller_13ks6_1{overscroll-behavior:contain;position:relative;overflow-y:auto}._band_13ks6_7{fill:var(--chart-grid);opacity:.35}._bar_13ks6_12{cursor:default;transition:opacity var(--duration-fast) var(--ease-standard)}._dimmed_13ks6_18{opacity:.45}._stale_13ks6_24{opacity:.4}._open_13ks6_28{rx:0}._now_13ks6_33{stroke:var(--text-tertiary);stroke-width:1px;stroke-dasharray:2 3;shape-rendering:crispedges}._laneStops_13ks6_40{pointer-events:none;margin:0;padding:0;list-style:none;position:absolute;top:0;left:0;right:0}._laneStop_13ks6_40{position:absolute;left:0;right:0}._outline_13ks6_58{stroke-width:1.5px}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as e}from"./index-
|
|
2
|
-
//# sourceMappingURL=Switch-
|
|
1
|
+
import{n as e}from"./index-DZ-UQ7v8.js";var t={wrapper:`_wrapper_1xq82_1`,label:`_label_1xq82_8`,track:`_track_1xq82_13`,knob:`_knob_1xq82_44`},n=e();function r({checked:e,onChange:r,label:i,disabled:a=!1,id:o,className:s,...c}){let l=(0,n.jsx)(`button`,{type:`button`,id:o,role:`switch`,"aria-checked":e,disabled:a,className:t.track,onClick:()=>r(!e),...c,children:(0,n.jsx)(`span`,{className:t.knob,"aria-hidden":`true`})});return i?(0,n.jsxs)(`label`,{className:`${t.wrapper} ${s??``}`,children:[l,(0,n.jsx)(`span`,{className:t.label,children:i})]}):(0,n.jsx)(`span`,{className:s,children:l})}export{r as t};
|
|
2
|
+
//# sourceMappingURL=Switch-9NtO_6Lj.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Switch-
|
|
1
|
+
{"version":3,"file":"Switch-9NtO_6Lj.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Switch.module.css","../../../../../../src/web-ui/components/primitives/Switch.tsx"],"sourcesContent":[".wrapper {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n cursor: pointer;\n}\n\n.label {\n font-size: var(--text-sm-size);\n color: var(--text-primary);\n}\n\n.track {\n position: relative;\n flex: none;\n width: 34px;\n height: 18px;\n padding: 0;\n border: 1px solid var(--border-strong);\n border-radius: var(--radius-full);\n background: var(--bg-active);\n cursor: pointer;\n transition:\n background-color var(--duration-fast) var(--ease-standard),\n border-color var(--duration-fast) var(--ease-standard);\n}\n\n.track:hover:not(:disabled) {\n border-color: var(--text-tertiary);\n}\n\n.track[aria-checked='true'] {\n background: var(--accent-600);\n border-color: var(--accent-600);\n}\n\n.track[aria-checked='true']:hover:not(:disabled) {\n background: var(--accent-700);\n border-color: var(--accent-700);\n}\n\n/* Press: the knob narrows slightly toward the direction of travel. No bounce,\n no translate on the track itself. */\n.track:active:not(:disabled) .knob {\n width: 14px;\n}\n\n.track[aria-checked='true']:active:not(:disabled) .knob {\n transform: translateX(14px);\n}\n\n.track:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.knob {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 12px;\n height: 12px;\n border-radius: var(--radius-full);\n background: var(--bg-surface);\n transition:\n transform var(--duration-fast) var(--ease-standard),\n width var(--duration-fast) var(--ease-standard);\n}\n\n.track[aria-checked='true'] .knob {\n transform: translateX(16px);\n background: var(--accent-contrast);\n}\n","/**\n * components/primitives/Switch.tsx — a binary setting that takes effect\n * immediately (no form submit). role=\"switch\" + aria-checked, so a screen\n * reader announces \"on\"/\"off\" rather than \"checkbox, checked\".\n *\n * State is never carried by color alone: the knob's POSITION is the primary\n * signal (design doc §6), the accent fill is reinforcement.\n */\nimport type { ReactNode } from 'react';\nimport styles from './Switch.module.css';\n\nexport interface SwitchProps {\n checked: boolean;\n onChange: (next: boolean) => void;\n /** Visible label; when omitted, pass `aria-label`. */\n label?: ReactNode;\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n disabled?: boolean;\n id?: string;\n className?: string;\n}\n\nexport function Switch({\n checked,\n onChange,\n label,\n disabled = false,\n id,\n className,\n ...aria\n}: SwitchProps) {\n const control = (\n <button\n type=\"button\"\n id={id}\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled}\n className={styles.track}\n onClick={() => onChange(!checked)}\n {...aria}\n >\n <span className={styles.knob} aria-hidden=\"true\" />\n </button>\n );\n\n if (!label) return <span className={className}>{control}</span>;\n\n return (\n <label className={`${styles.wrapper} ${className ?? ''}`}>\n {control}\n <span className={styles.label}>{label}</span>\n </label>\n );\n}\n"],"mappings":"sJCuBA,SAAgB,EAAO,CACrB,UACA,WACA,QACA,WAAW,GACX,KACA,YACA,GAAG,GACW,CACd,IAAM,GACJ,EAAA,EAAA,IAAA,CAAC,SAAD,CACE,KAAK,SACD,KACJ,KAAK,SACL,eAAc,EACJ,WACV,UAAW,EAAO,MAClB,YAAe,EAAS,CAAC,CAAO,EAChC,GAAI,EAEJ,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,cAAY,MAAQ,CAAA,CAC5C,CAAA,EAKV,OAFK,GAGH,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,GAAG,EAAO,QAAQ,GAAG,GAAa,KAApD,SAAA,CACG,GACD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,CAAY,CAAA,CACvC,KANU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAiB,YAAY,SAAA,CAAc,CAAA,CAQhE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as e}from"./index-
|
|
2
|
-
//# sourceMappingURL=Tag-
|
|
1
|
+
import{n as e}from"./index-DZ-UQ7v8.js";var t={tag:`_tag_2eqdv_1`,sm:`_sm_2eqdv_19`,mono:`_mono_2eqdv_25`,dot:`_dot_2eqdv_30`,marker:`_marker_2eqdv_38`},n=e(),r={claude:`var(--engine-claude)`,codex:`var(--engine-codex)`,grok:`var(--engine-grok)`,local:`var(--engine-local)`};function i({children:e,engine:i,mono:a=!1,size:o=`md`,dot:s=!1,title:c,className:l}){let u=s||i!==void 0;return(0,n.jsxs)(`span`,{className:`${t.tag} ${t[o]} ${a?t.mono:``} ${l??``}`,title:c,"data-engine":i,children:[u?(0,n.jsx)(`span`,{className:t.dot,style:i?{background:r[i]}:void 0,"aria-hidden":`true`}):null,e]})}function a({engine:e,className:i}){return(0,n.jsx)(`span`,{className:`${t.marker} ${i??``}`,style:{background:r[e]},"aria-hidden":`true`})}function o(e){return r[e]}export{i as n,o as r,a as t};
|
|
2
|
+
//# sourceMappingURL=Tag-DscCRFcN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tag-
|
|
1
|
+
{"version":3,"file":"Tag-DscCRFcN.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Tag.module.css","../../../../../../src/web-ui/components/primitives/Tag.tsx"],"sourcesContent":[".tag {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n max-width: 100%;\n height: var(--density-row-sm);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs);\n background: var(--bg-hover);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.sm {\n height: calc(var(--density-row-sm) - var(--space-2));\n padding: 0 var(--space-1);\n font-size: var(--text-2xs-size);\n}\n\n.mono {\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n}\n\n.dot {\n flex: none;\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--status-neutral-solid);\n}\n\n.marker {\n display: inline-block;\n flex: none;\n width: 2px;\n height: 100%;\n min-height: var(--engine-marker-h);\n border-radius: var(--radius-full);\n}\n","/**\n * components/primitives/Tag.tsx — a small, quiet label: a seat pill, a model\n * name, a repo, a risk class. NOT a status badge (that is StatusBadge, which\n * owns the status-color mapping) and not a button.\n *\n * `engine` tints the leading dot with that provider's identity hue. Identity\n * hues are never used for the text itself (design doc §2) — the tag's label\n * stays in the normal text color so it keeps its contrast in both themes.\n */\nimport type { ReactNode } from 'react';\nimport type { VerseEngine } from '../../data/api-types.js';\nimport styles from './Tag.module.css';\n\nconst ENGINE_COLOR: Record<VerseEngine, string> = {\n claude: 'var(--engine-claude)',\n codex: 'var(--engine-codex)',\n grok: 'var(--engine-grok)',\n local: 'var(--engine-local)',\n};\n\nexport interface TagProps {\n children: ReactNode;\n /** Provider identity: tints the leading dot and the pill's edge. */\n engine?: VerseEngine;\n /** Monospace for ids, paths and model names. */\n mono?: boolean;\n size?: 'sm' | 'md';\n /** Show a leading dot even without an engine. */\n dot?: boolean;\n title?: string;\n className?: string;\n}\n\nexport function Tag({ children, engine, mono = false, size = 'md', dot = false, title, className }: TagProps) {\n const showDot = dot || engine !== undefined;\n return (\n <span\n className={`${styles.tag} ${styles[size]} ${mono ? styles.mono : ''} ${className ?? ''}`}\n title={title}\n data-engine={engine}\n >\n {showDot ? (\n <span\n className={styles.dot}\n style={engine ? { background: ENGINE_COLOR[engine] } : undefined}\n aria-hidden=\"true\"\n />\n ) : null}\n {children}\n </span>\n );\n}\n\n/** The 2px identity marker used on session rows and seat pills. */\nexport function EngineMarker({ engine, className }: { engine: VerseEngine; className?: string }) {\n return <span className={`${styles.marker} ${className ?? ''}`} style={{ background: ENGINE_COLOR[engine] }} aria-hidden=\"true\" />;\n}\n\nexport function engineColor(engine: VerseEngine): string {\n return ENGINE_COLOR[engine];\n}\n"],"mappings":"+JCaM,EAA4C,CAChD,OAAQ,uBACR,MAAO,sBACP,KAAM,qBACN,MAAO,qBACT,EAeA,SAAgB,EAAI,CAAE,WAAU,SAAQ,OAAO,GAAO,OAAO,KAAM,MAAM,GAAO,QAAO,aAAuB,CAC5G,IAAM,EAAU,GAAO,IAAW,IAAA,GAClC,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CACE,UAAW,GAAG,EAAO,IAAI,GAAG,EAAO,GAAM,GAAG,EAAO,EAAO,KAAO,GAAG,GAAG,GAAa,KAC7E,QACP,cAAa,EAHf,SAAA,CAKG,GACC,EAAA,EAAA,IAAA,CAAC,OAAD,CACE,UAAW,EAAO,IAClB,MAAO,EAAS,CAAE,WAAY,EAAa,EAAQ,EAAI,IAAA,GACvD,cAAY,MACb,CAAA,EACC,KACH,CACG,GAEV,CAGA,SAAgB,EAAa,CAAE,SAAQ,aAA0D,CAC/F,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,GAAG,EAAO,OAAO,GAAG,GAAa,KAAM,MAAO,CAAE,WAAY,EAAa,EAAQ,EAAG,cAAY,MAAQ,CAAA,CAClI,CAEA,SAAgB,EAAY,EAA6B,CACvD,OAAO,EAAa,EACtB"}
|
package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js → TerminalPane-B668-DJW.js}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/xterm-B1njb2Cr.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{a as e,c as t,n,t as r}from"./index-
|
|
3
|
-
`))n.startsWith(`data:`)&&(t+=n.slice(n.startsWith(`data: `)?6:5));if(!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(typeof n!=`object`||!n)return null;let r=n;return r.type===`output`&&typeof r.seq==`number`&&typeof r.dataBase64==`string`?{type:`output`,seq:r.seq,dataBase64:r.dataBase64}:r.type===`title`&&typeof r.title==`string`?{type:`title`,title:r.title}:r.type===`exit`?{type:`exit`,code:typeof r.code==`number`?r.code:null,signal:typeof r.signal==`string`?r.signal:null}:null}function xe(e,t,n,r={}){let
|
|
2
|
+
import{a as e,c as t,n,t as r}from"./index-DZ-UQ7v8.js";import{I as i,M as a,O as o,i as s,k as c,l,o as u,u as d}from"./global-CMNW_dqn.js";import{L as f,R as ee,_n as p,gn as m,hn as h,kt as g,tn as _}from"./VerseConsoleApp-CWU6R3By.js";import{v as te}from"./verse-model-DAVevkNe.js";import{n as ne}from"./format-CH4g_sl1.js";import{n as v,t as y}from"./Button-D90dzI_o.js";import{n as re,t as ie}from"./ActionMenu-CIiX2X8w.js";import{C as ae,c as oe,g as se,y as ce}from"./icons-D1sYbCTQ.js";import{a as le,o as b}from"./command-catalog-BIntSa9l.js";import{t as x}from"./EmptyState-D2IRy3Cg.js";import{f as ue,r as de,u as fe}from"./terminal-icons-CoRZq9iO.js";import{t as pe}from"./pane-chrome.module-D7o-fVd0.js";var S=t(e(),1),C=class extends Error{constructor(){super(`Unlock actions with the mutation token to use the terminal.`),this.name=`TerminalLockedError`}};async function w(e,t){let n=o();if(!n)throw new C;let r=await d(e,t,n);return i(),r}function T(e,t){return`${_}/${encodeURIComponent(e)}/${t}`}var E={list:e=>l(_,e),create:async e=>(await w(_,e)).tab,input:(e,t)=>w(T(e,`input`),{dataBase64:t}),resize:(e,t,n)=>w(T(e,`resize`),{cols:t,rows:n}),kill:async e=>{await w(T(e,`kill`),{})},openExternal:async(e,t)=>{await w(`${_}/open-external`,t===void 0?{sessionId:e}:{sessionId:e,root:t})}};function me(e,t){let n=Number.isSafeInteger(t)&&t>0?`?after=${t}`:``;return`${T(e,`stream`)}${n}`}function he(e){let t=``;for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));return btoa(t)}function ge(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function _e(e){let t=e.replace(/\s+$/,``),n=Math.max(0,...Array.from(t.matchAll(/`+/g),e=>e[0].length)),r="`".repeat(Math.max(3,n+1));return`${r}\n${t}\n${r}`}function ve(e,t={}){let n=t.maxBytes??16384,r=new TextEncoder,i=[],a=0,o=null,s=!1,c=()=>{let e=new Uint8Array(a),t=0;for(let n of i)e.set(n,t),t+=n.length;let r=e.subarray(0,Math.min(n,e.length)),o=e.subarray(r.length);return i=o.length>0?[o]:[],a=o.length,r},l=async()=>{for(;!s&&a>0;){let n=c();try{await e(he(n))}catch(e){i=[],a=0,t.onError?.(e)}}o=null},u=e=>{s||e.length===0||(i.push(e),a+=e.length,o||=l())};return{pushText(e){u(r.encode(e))},pushBinary(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;u(t)},idle(){return o??Promise.resolve()},dispose(){s=!0,i=[],a=0}}}function ye(e){return Math.min(250*2**e,8e3)}function be(e){let t=``;for(let n of e.split(`
|
|
3
|
+
`))n.startsWith(`data:`)&&(t+=n.slice(n.startsWith(`data: `)?6:5));if(!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(typeof n!=`object`||!n)return null;let r=n;return r.type===`output`&&typeof r.seq==`number`&&typeof r.dataBase64==`string`?{type:`output`,seq:r.seq,dataBase64:r.dataBase64}:r.type===`title`&&typeof r.title==`string`?{type:`title`,title:r.title}:r.type===`exit`?{type:`exit`,code:typeof r.code==`number`?r.code:null,signal:typeof r.signal==`string`?r.signal:null}:null}function xe(e,t,n,r={}){let i=r.fetch??((e,t)=>fetch(e,t)),o=r.renew??a,s=r.proof??c,l=r.backoffMs??ye,u=!1,d=null,f=null,ee=0,p=!1,m=e=>{(!u||e===`closed`)&&n.onState?.(e)},h=()=>{u||(m(`reconnecting`),f=setTimeout(()=>{f=null,g()},l(ee++)))};async function g(){if(u)return;d=new AbortController;let r;try{r=await i(me(e,t()),{method:`GET`,credentials:`same-origin`,headers:{"x-ashlr-read-client":s(),Accept:`text/event-stream`},signal:d.signal,cache:`no-store`})}catch{h();return}if(u)return;if(r.status===404){m(`gone`),u=!0;return}if(r.status===401){if(!p&&await o().catch(()=>!1)){p=!0,g();return}m(`expired`),u=!0;return}if(!r.ok||!r.body){h();return}p=!1,m(`open`);let a=r.body.getReader(),c=new TextDecoder,l=``;try{for(;;){let{value:e,done:t}=await a.read();if(t)break;ee=0,l+=c.decode(e,{stream:!0});let r;for(;(r=l.indexOf(`
|
|
4
4
|
|
|
5
|
-
`))!==-1;){let e=l.slice(0,r);l=l.slice(r+2);let t=be(e);t&&!u&&n.onFrame(t)}}}catch{}h()}return m(`connecting`),g(),{close(){u||(u=!0,f&&clearTimeout(f),d?.abort(),n.onState?.(`closed`))}}}var Se=5e3,D=null;function O(){return D||(D=Promise.all([r(()=>import(`./xterm-ScmBfeDI.js`),[]),r(()=>import(`./addon-fit-DIOBYJe3.js`),[]),r(()=>Promise.resolve({}),__vite__mapDeps([0]))]).then(([e,t])=>[e,t]),D.catch(()=>{D=null})),D}var Ce=async e=>{let[{Terminal:t},{FitAddon:n}]=await O(),r=new t({fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:1.2,cursorBlink:!0,cursorStyle:`bar`,scrollback:Se,theme:e.theme,screenReaderMode:e.screenReaderMode,macOptionIsMeta:!0,minimumContrastRatio:3,allowProposedApi:!1}),i=new n;r.loadAddon(i);let a=!1;return{get cols(){return r.cols},get rows(){return r.rows},open(e){a||(a=!0,r.open(e))},write(e){r.write(e)},reset(){r.reset()},focus(){r.focus()},fit(){let e=i.proposeDimensions();return!e||!Number.isFinite(e.cols)||!Number.isFinite(e.rows)||e.cols<2||e.rows<2?null:(i.fit(),{cols:r.cols,rows:r.rows})},onData:e=>r.onData(e),onBinary:e=>r.onBinary(e),onSelectionChange:e=>r.onSelectionChange(e),hasSelection:()=>r.hasSelection(),getSelection:()=>r.getSelection(),paste(e){r.paste(e)},bracketedPaste:()=>r.modes.bracketedPasteMode,setTheme(e){r.options.theme=e},setScreenReaderMode(e){r.options.screenReaderMode=e},setKeyFilter(e){r.attachCustomKeyEventHandler(e)},dispose(){r.dispose()}}},k={foreground:`--term-fg`,background:`--term-bg`,cursor:`--term-cursor`,cursorAccent:`--term-bg`,selectionBackground:`--term-selection`,selectionForeground:`--term-fg`,selectionInactiveBackground:`--term-selection-inactive`,scrollbarSliderBackground:`--term-scrollbar`,scrollbarSliderHoverBackground:`--term-scrollbar-hover`,scrollbarSliderActiveBackground:`--term-scrollbar-hover`,overviewRulerBorder:`--term-bg`,black:`--term-black`,red:`--term-red`,green:`--term-green`,yellow:`--term-yellow`,blue:`--term-blue`,magenta:`--term-magenta`,cyan:`--term-cyan`,white:`--term-white`,brightBlack:`--term-bright-black`,brightRed:`--term-bright-red`,brightGreen:`--term-bright-green`,brightYellow:`--term-bright-yellow`,brightBlue:`--term-bright-blue`,brightMagenta:`--term-bright-magenta`,brightCyan:`--term-bright-cyan`,brightWhite:`--term-bright-white`},A;function j(e){if(typeof document>`u`)return e;if(A===void 0)try{let e=document.createElement(`canvas`);e.width=1,e.height=1,A=e.getContext(`2d`,{willReadFrequently:!0})}catch{A=null}let t=A;if(!t)return e;try{t.clearRect(0,0,1,1),t.fillStyle=e,t.fillRect(0,0,1,1);let[n,r,i,a]=t.getImageData(0,0,1,1).data;return a===void 0?e:a===255?`rgb(${n}, ${r}, ${i})`:`rgba(${n}, ${r}, ${i}, ${(a/255).toFixed(3)})`}catch{return e}}function we(e){let t=document.createElement(`span`);t.style.display=`none`,e.appendChild(t);let n={};try{for(let[r,i]of Object.entries(k)){if(!getComputedStyle(e).getPropertyValue(i).trim())continue;t.style.color=``,t.style.color=`var(${i})`;let a=getComputedStyle(t).color;a&&(n[r]=j(a))}}finally{t.remove()}return n}function Te(e){let t=getComputedStyle(e),n=Number.parseFloat(t.fontSize);return{fontFamily:t.fontFamily||`ui-monospace, Menlo, monospace`,fontSize:Number.isFinite(n)&&n>=11?n:13}}function Ee(e){if(typeof window>`u`)return()=>{};let t=document.documentElement,n=typeof MutationObserver==`function`?new MutationObserver(()=>e()):null;n?.observe(t,{attributes:!0,attributeFilter:[`data-theme`,`data-accent`,`class`,`style`]});let r=typeof window.matchMedia==`function`?window.matchMedia(`(prefers-color-scheme: dark)`):null,i=()=>e();return r?.addEventListener?.(`change`,i),()=>{n?.disconnect(),r?.removeEventListener?.(`change`,i)}}var M={pane:`_pane_7fww7_15`,loading:`_loading_7fww7_91`,strip:`_strip_7fww7_100`,tabs:`_tabs_7fww7_109`,tab:`_tab_7fww7_109`,tabButton:`_tabButton_7fww7_142`,tabClose:`_tabClose_7fww7_159`,noticeClose:`_noticeClose_7fww7_160`,tabTitle:`_tabTitle_7fww7_165`,tabExited:`_tabExited_7fww7_171`,unseen:`_unseen_7fww7_180`,stripActions:`_stripActions_7fww7_215`,cwd:`_cwd_7fww7_227`,headerStatus:`_headerStatus_7fww7_229`,notice:`_notice_7fww7_160`,inlineNotice:`_inlineNotice_7fww7_267`,body:`_body_7fww7_275`,panel:`_panel_7fww7_285`,viewport:`_viewport_7fww7_294`,host:`_host_7fww7_301`,viewLoading:`_viewLoading_7fww7_318`,exitBar:`_exitBar_7fww7_323`,header:`_header_7fww7_229`},N=n(),De={api:E,createView:Ce,openStream:xe,platform:h(),writeClipboard:async e=>{await navigator.clipboard.writeText(e)}},Oe=3e3,P=`ashlr.verse.terminal.screenReader`,F=0;function I(){F=0}function ke(){try{return localStorage.getItem(P)===`1`}catch{return!1}}function Ae(e){try{localStorage.setItem(P,e?`1`:`0`)}catch{}}function je(e,t){if(e.type!==`keydown`||!b(e,[`chat`,`global`],t))return!1;let n=m(e),r=e.ctrlKey&&(n==="`"||n===`tab`);return t===`mac`?e.metaKey||r:r||e.ctrlKey&&e.shiftKey}function L(e,t){if(e instanceof C)return e.message;if(e instanceof d){if(e.status===401)return`Unlock actions with the mutation token to use the terminal.`;if(e.detail)return ne(e.detail)}return t}function Me({sessionId:e,roots:t,request:n,onSendToChat:r,visible:i,deps:a}){let o=(0,S.useMemo)(()=>({...De,...a}),[a]),s=ee(),c=i&&s,u=g().compact,[m,h]=(0,S.useState)(null),[_,ne]=(0,S.useState)(null),[b,C]=(0,S.useState)(null),[w,T]=(0,S.useState)(null),[E,me]=(0,S.useState)(!1),[he,ye]=(0,S.useState)(null),[be,xe]=(0,S.useState)(!1),[Se,D]=(0,S.useState)(!1),[O,Ce]=(0,S.useState)(ke),[k,A]=(0,S.useState)(!1),[j,P]=(0,S.useState)(()=>new Set),[I,Me]=(0,S.useState)(null),[Ne,Pe]=(0,S.useState)(()=>new Map),R=(0,S.useRef)(new Map),z=(0,S.useRef)(new Map),Fe=(0,S.useRef)(new Set),B=(0,S.useRef)(!1),V=(0,S.useRef)(null),Ie=(0,S.useRef)(null),Le=(0,S.useRef)(new Map),H=(0,S.useRef)(null),U=(0,S.useRef)(null),W=(0,S.useRef)(null),G=(0,S.useRef)(!0),Re=(0,S.useRef)(!1),K=(0,S.useMemo)(()=>m?.tabs??[],[m]),ze=(0,S.useRef)(new Set);ze.current=new Set(K.filter(e=>e.exited).map(e=>e.id));let q=(0,S.useMemo)(()=>K.filter(t=>t.sessionId===e),[K,e]),J=q.find(e=>e.id===b)??null,Be=K.length-q.length,Y=(0,S.useCallback)(async()=>{try{let e=await o.api.list();if(!G.current)return;h(e),ne(null)}catch(e){if(!G.current)return;ne(L(e,`The terminal list could not be loaded.`))}},[o.api]);(0,S.useEffect)(()=>(G.current=!0,Y(),()=>{G.current=!1}),[Y]),f(()=>{Y()},Oe,{enabled:i}),(0,S.useEffect)(()=>{m&&(b&&q.some(e=>e.id===b)||C(q.at(-1)?.id??null))},[m,q,b]),(0,S.useEffect)(()=>{if(!m)return;let e=new Set(m.tabs.map(e=>e.id));for(let[t,n]of R.current)e.has(t)||(Ve(n),R.current.delete(t),P(e=>{let n=new Set(e);return n.delete(t),n}))},[m]),(0,S.useEffect)(()=>{J&&c&&Pe(e=>e.get(J.id)===J.lastActivityAt?e:new Map(e).set(J.id,J.lastActivityAt))},[J,c]),(0,S.useEffect)(()=>()=>{for(let e of R.current.values())Ve(e);R.current.clear();for(let e of[H,U,W])e.current&&clearTimeout(e.current)},[]);function Ve(e){e.queue.dispose();for(let t of e.disposers)try{t.dispose()}catch{}try{e.view.dispose()}catch{}}let He=(0,S.useCallback)(()=>{for(let e of R.current.values())if(e.view.cols>1&&e.view.rows>1)return{cols:e.view.cols,rows:e.view.rows};return{cols:80,rows:24}},[]),X=(0,S.useCallback)(async(t={})=>{me(!0),T(null);try{let n=await o.api.create({sessionId:e,...t.root?{root:t.root}:{},...t.appId?{appId:t.appId}:{},...t.appId&&t.via?{via:t.via}:{},...t.appId&&t.model?{model:t.model}:{},...t.devServerId?{devServerId:t.devServerId}:{},...He()});return G.current?(h(e=>e&&{...e,tabs:[...e.tabs.filter(e=>e.id!==n.id),n]}),C(n.id),n):n}catch(e){return G.current&&T({tone:`error`,text:L(e,`The terminal could not be opened.`)}),null}finally{G.current&&me(!1)}},[o.api,e,He]),Z=(0,S.useCallback)(async e=>{try{await o.api.kill(e.id)}catch(e){if(!(e instanceof d&&e.status===404)){T({tone:`error`,text:L(e,`The terminal could not be closed.`)});return}}let t=R.current.get(e.id);if(t&&(Ve(t),R.current.delete(e.id)),h(t=>t&&{...t,tabs:t.tabs.filter(t=>t.id!==e.id)}),b===e.id){let t=q.findIndex(t=>t.id===e.id),n=q[t+1]??q[t-1]??null;C(n?.id??null)}},[b,o.api,q]),Ue=(0,S.useCallback)(async e=>{await X({root:e.root})&&await Z(e)},[Z,X]),We=(0,S.useRef)(e);We.current!==e&&(We.current=e,B.current=!1),(0,S.useEffect)(()=>{m&&m.available&&c&&!B.current&&!E&&(n&&n.nonce>F||(B.current=!0,q.length===0&&X({})))},[m,c,q.length,E,X,n]);let Ge=(0,S.useCallback)(async(e,t)=>{if(!(R.current.has(e)||Fe.current.has(e))){Fe.current.add(e);try{let n=await o.createView({...Te(t),theme:we(t),screenReaderMode:ke()});if(!G.current||!z.current.has(e)){n.dispose();return}n.open(t);let r=ve(t=>o.api.input(e,t),{onError:e=>{G.current&&T({tone:`error`,text:L(e,`That input did not reach the shell.`)})}}),i={view:n,host:t,lastSeq:0,queue:r,disposers:[]};i.disposers.push(n.onData(t=>{ze.current.has(e)||r.pushText(t)})),i.disposers.push(n.onBinary(t=>{ze.current.has(e)||r.pushBinary(t)})),i.disposers.push(n.onSelectionChange(()=>{let e=n.hasSelection();xe(e),e&&(W.current&&clearTimeout(W.current),W.current=setTimeout(()=>{let e=n.getSelection();e&&o.writeClipboard(e).then(()=>{G.current&&(D(!0),U.current&&clearTimeout(U.current),U.current=setTimeout(()=>D(!1),1200))},()=>{})},150))})),n.setKeyFilter(e=>!je(e,o.platform)),R.current.set(e,i),A(!1),P(t=>new Set(t).add(e))}catch(e){console.error(`[verse] terminal view failed to load`,e),G.current&&A(!0)}finally{Fe.current.delete(e)}}},[o]),Ke=(0,S.useRef)(Ge);Ke.current=Ge;let qe=(0,S.useRef)(new Map),Je=e=>{let t=qe.current.get(e);return t||(t=t=>{t?(z.current.set(e,t),Ke.current(e,t)):(z.current.delete(e),qe.current.delete(e))},qe.current.set(e,t)),t},Ye=(0,S.useCallback)(()=>{if(!b)return;let e=R.current.get(b);if(!e)return;let t={cols:e.view.cols,rows:e.view.rows},n=e.view.fit();if(!n||n.cols===t.cols&&n.rows===t.rows&&J&&J.cols===n.cols&&J.rows===n.rows)return;H.current&&clearTimeout(H.current);let r=b;H.current=setTimeout(()=>{o.api.resize(r,n.cols,n.rows).catch(()=>{})},100)},[J,b,o.api]);(0,S.useEffect)(()=>{if(!c||!b||!j.has(b))return;Ye();let e=Ie.current;if(!e||typeof ResizeObserver>`u`)return;let t=0,n=new ResizeObserver(()=>{cancelAnimationFrame(t),t=requestAnimationFrame(Ye)});return n.observe(e),()=>{cancelAnimationFrame(t),n.disconnect()}},[c,b,j,Ye]),(0,S.useEffect)(()=>Ee(()=>{for(let e of R.current.values())e.view.setTheme(we(e.host))}),[]);let Q=(0,S.useCallback)(e=>{let t=V.current;if(!t||t.tabId!==e)return;let n=R.current.get(e);if(!n)return;V.current=null;let r=t.text.replace(/[\r\n]+$/,``);r.includes(`
|
|
6
|
-
`)&&!n.view.bracketedPaste()?o.writeClipboard(r).then(()=>T({tone:`info`,text:`That command has several lines, so it was copied instead: paste it with ⌘V.`}),()=>T({tone:`error`,text:`That command has several lines and could not be pasted safely.`})):n.view.paste(r),n.view.focus()},[o]);(0,S.useEffect)(()=>{if(!
|
|
7
|
-
//# sourceMappingURL=TerminalPane-
|
|
5
|
+
`))!==-1;){let e=l.slice(0,r);l=l.slice(r+2);let t=be(e);t&&!u&&n.onFrame(t)}}}catch{}h()}return m(`connecting`),g(),{close(){u||(u=!0,f&&clearTimeout(f),d?.abort(),n.onState?.(`closed`))}}}var Se=5e3,D=null;function O(){return D||(D=Promise.all([r(()=>import(`./xterm-ScmBfeDI.js`),[]),r(()=>import(`./addon-fit-DIOBYJe3.js`),[]),r(()=>Promise.resolve({}),__vite__mapDeps([0]))]).then(([e,t])=>[e,t]),D.catch(()=>{D=null})),D}var Ce=async e=>{let[{Terminal:t},{FitAddon:n}]=await O(),r=new t({fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:1.2,cursorBlink:!0,cursorStyle:`bar`,scrollback:Se,theme:e.theme,screenReaderMode:e.screenReaderMode,macOptionIsMeta:!0,minimumContrastRatio:3,allowProposedApi:!1}),i=new n;r.loadAddon(i);let a=!1;return{get cols(){return r.cols},get rows(){return r.rows},open(e){a||(a=!0,r.open(e))},write(e){r.write(e)},reset(){r.reset()},focus(){r.focus()},fit(){let e=i.proposeDimensions();return!e||!Number.isFinite(e.cols)||!Number.isFinite(e.rows)||e.cols<2||e.rows<2?null:(i.fit(),{cols:r.cols,rows:r.rows})},onData:e=>r.onData(e),onBinary:e=>r.onBinary(e),onSelectionChange:e=>r.onSelectionChange(e),hasSelection:()=>r.hasSelection(),getSelection:()=>r.getSelection(),paste(e){r.paste(e)},bracketedPaste:()=>r.modes.bracketedPasteMode,setTheme(e){r.options.theme=e},setScreenReaderMode(e){r.options.screenReaderMode=e},setKeyFilter(e){r.attachCustomKeyEventHandler(e)},dispose(){r.dispose()}}},k={foreground:`--term-fg`,background:`--term-bg`,cursor:`--term-cursor`,cursorAccent:`--term-bg`,selectionBackground:`--term-selection`,selectionForeground:`--term-fg`,selectionInactiveBackground:`--term-selection-inactive`,scrollbarSliderBackground:`--term-scrollbar`,scrollbarSliderHoverBackground:`--term-scrollbar-hover`,scrollbarSliderActiveBackground:`--term-scrollbar-hover`,overviewRulerBorder:`--term-bg`,black:`--term-black`,red:`--term-red`,green:`--term-green`,yellow:`--term-yellow`,blue:`--term-blue`,magenta:`--term-magenta`,cyan:`--term-cyan`,white:`--term-white`,brightBlack:`--term-bright-black`,brightRed:`--term-bright-red`,brightGreen:`--term-bright-green`,brightYellow:`--term-bright-yellow`,brightBlue:`--term-bright-blue`,brightMagenta:`--term-bright-magenta`,brightCyan:`--term-bright-cyan`,brightWhite:`--term-bright-white`},A;function j(e){if(typeof document>`u`)return e;if(A===void 0)try{let e=document.createElement(`canvas`);e.width=1,e.height=1,A=e.getContext(`2d`,{willReadFrequently:!0})}catch{A=null}let t=A;if(!t)return e;try{t.clearRect(0,0,1,1),t.fillStyle=e,t.fillRect(0,0,1,1);let[n,r,i,a]=t.getImageData(0,0,1,1).data;return a===void 0?e:a===255?`rgb(${n}, ${r}, ${i})`:`rgba(${n}, ${r}, ${i}, ${(a/255).toFixed(3)})`}catch{return e}}function we(e){let t=document.createElement(`span`);t.style.display=`none`,e.appendChild(t);let n={};try{for(let[r,i]of Object.entries(k)){if(!getComputedStyle(e).getPropertyValue(i).trim())continue;t.style.color=``,t.style.color=`var(${i})`;let a=getComputedStyle(t).color;a&&(n[r]=j(a))}}finally{t.remove()}return n}function Te(e){let t=getComputedStyle(e),n=Number.parseFloat(t.fontSize);return{fontFamily:t.fontFamily||`ui-monospace, Menlo, monospace`,fontSize:Number.isFinite(n)&&n>=11?n:13}}function Ee(e){if(typeof window>`u`)return()=>{};let t=document.documentElement,n=typeof MutationObserver==`function`?new MutationObserver(()=>e()):null;n?.observe(t,{attributes:!0,attributeFilter:[`data-theme`,`data-accent`,`class`,`style`]});let r=typeof window.matchMedia==`function`?window.matchMedia(`(prefers-color-scheme: dark)`):null,i=()=>e();return r?.addEventListener?.(`change`,i),()=>{n?.disconnect(),r?.removeEventListener?.(`change`,i)}}var M={pane:`_pane_7fww7_15`,loading:`_loading_7fww7_91`,strip:`_strip_7fww7_100`,tabs:`_tabs_7fww7_109`,tab:`_tab_7fww7_109`,tabButton:`_tabButton_7fww7_142`,tabClose:`_tabClose_7fww7_159`,noticeClose:`_noticeClose_7fww7_160`,tabTitle:`_tabTitle_7fww7_165`,tabExited:`_tabExited_7fww7_171`,unseen:`_unseen_7fww7_180`,stripActions:`_stripActions_7fww7_215`,cwd:`_cwd_7fww7_227`,headerStatus:`_headerStatus_7fww7_229`,notice:`_notice_7fww7_160`,inlineNotice:`_inlineNotice_7fww7_267`,body:`_body_7fww7_275`,panel:`_panel_7fww7_285`,viewport:`_viewport_7fww7_294`,host:`_host_7fww7_301`,viewLoading:`_viewLoading_7fww7_318`,exitBar:`_exitBar_7fww7_323`,header:`_header_7fww7_229`},N=n(),De={api:E,createView:Ce,openStream:xe,platform:h(),writeClipboard:async e=>{await navigator.clipboard.writeText(e)}},Oe=3e3,P=`ashlr.verse.terminal.screenReader`,F=0;function I(){F=0}function ke(){try{return localStorage.getItem(P)===`1`}catch{return!1}}function Ae(e){try{localStorage.setItem(P,e?`1`:`0`)}catch{}}function je(e,t){if(e.type!==`keydown`||!b(e,[`chat`,`global`],t))return!1;let n=m(e),r=e.ctrlKey&&(n==="`"||n===`tab`);return t===`mac`?e.metaKey||r:r||e.ctrlKey&&e.shiftKey}function L(e,t){if(e instanceof C)return e.message;if(e instanceof u){if(e.status===401)return`Unlock actions with the mutation token to use the terminal.`;if(e.detail)return ne(e.detail)}return t}function Me({sessionId:e,roots:t,request:n,onSendToChat:r,visible:i,deps:a}){let o=(0,S.useMemo)(()=>({...De,...a}),[a]),c=ee(),l=i&&c,d=g().compact,[m,h]=(0,S.useState)(null),[_,ne]=(0,S.useState)(null),[b,C]=(0,S.useState)(null),[w,T]=(0,S.useState)(null),[E,me]=(0,S.useState)(!1),[he,ye]=(0,S.useState)(null),[be,xe]=(0,S.useState)(!1),[Se,D]=(0,S.useState)(!1),[O,Ce]=(0,S.useState)(ke),[k,A]=(0,S.useState)(!1),[j,P]=(0,S.useState)(()=>new Set),[I,Me]=(0,S.useState)(null),[Ne,Pe]=(0,S.useState)(()=>new Map),R=(0,S.useRef)(new Map),z=(0,S.useRef)(new Map),Fe=(0,S.useRef)(new Set),B=(0,S.useRef)(!1),V=(0,S.useRef)(null),Ie=(0,S.useRef)(null),Le=(0,S.useRef)(new Map),H=(0,S.useRef)(null),U=(0,S.useRef)(null),W=(0,S.useRef)(null),G=(0,S.useRef)(!0),Re=(0,S.useRef)(!1),K=(0,S.useMemo)(()=>m?.tabs??[],[m]),ze=(0,S.useRef)(new Set);ze.current=new Set(K.filter(e=>e.exited).map(e=>e.id));let q=(0,S.useMemo)(()=>K.filter(t=>t.sessionId===e),[K,e]),J=q.find(e=>e.id===b)??null,Be=K.length-q.length,Y=(0,S.useCallback)(async()=>{try{let e=await o.api.list();if(!G.current)return;h(e),ne(null)}catch(e){if(!G.current)return;ne(L(e,`The terminal list could not be loaded.`))}},[o.api]);(0,S.useEffect)(()=>(G.current=!0,Y(),()=>{G.current=!1}),[Y]),f(()=>{Y()},Oe,{enabled:i}),(0,S.useEffect)(()=>{m&&(b&&q.some(e=>e.id===b)||C(q.at(-1)?.id??null))},[m,q,b]),(0,S.useEffect)(()=>{if(!m)return;let e=new Set(m.tabs.map(e=>e.id));for(let[t,n]of R.current)e.has(t)||(Ve(n),R.current.delete(t),P(e=>{let n=new Set(e);return n.delete(t),n}))},[m]),(0,S.useEffect)(()=>{J&&l&&Pe(e=>e.get(J.id)===J.lastActivityAt?e:new Map(e).set(J.id,J.lastActivityAt))},[J,l]),(0,S.useEffect)(()=>()=>{for(let e of R.current.values())Ve(e);R.current.clear();for(let e of[H,U,W])e.current&&clearTimeout(e.current)},[]);function Ve(e){e.queue.dispose();for(let t of e.disposers)try{t.dispose()}catch{}try{e.view.dispose()}catch{}}let He=(0,S.useCallback)(()=>{for(let e of R.current.values())if(e.view.cols>1&&e.view.rows>1)return{cols:e.view.cols,rows:e.view.rows};return{cols:80,rows:24}},[]),X=(0,S.useCallback)(async(t={})=>{me(!0),T(null);try{let n=await o.api.create({sessionId:e,...t.root?{root:t.root}:{},...t.appId?{appId:t.appId}:{},...t.appId&&t.via?{via:t.via}:{},...t.appId&&t.model?{model:t.model}:{},...t.devServerId?{devServerId:t.devServerId}:{},...He()});return G.current?(h(e=>e&&{...e,tabs:[...e.tabs.filter(e=>e.id!==n.id),n]}),C(n.id),n):n}catch(e){return G.current&&T({tone:`error`,text:L(e,`The terminal could not be opened.`)}),null}finally{G.current&&me(!1)}},[o.api,e,He]),Z=(0,S.useCallback)(async e=>{try{await o.api.kill(e.id)}catch(e){if(!(e instanceof u&&e.status===404)){T({tone:`error`,text:L(e,`The terminal could not be closed.`)});return}}let t=R.current.get(e.id);if(t&&(Ve(t),R.current.delete(e.id)),h(t=>t&&{...t,tabs:t.tabs.filter(t=>t.id!==e.id)}),b===e.id){let t=q.findIndex(t=>t.id===e.id),n=q[t+1]??q[t-1]??null;C(n?.id??null)}},[b,o.api,q]),Ue=(0,S.useCallback)(async e=>{await X({root:e.root})&&await Z(e)},[Z,X]),We=(0,S.useRef)(e);We.current!==e&&(We.current=e,B.current=!1),(0,S.useEffect)(()=>{m&&m.available&&l&&!B.current&&!E&&(n&&n.nonce>F||(B.current=!0,q.length===0&&X({})))},[m,l,q.length,E,X,n]);let Ge=(0,S.useCallback)(async(e,t)=>{if(!(R.current.has(e)||Fe.current.has(e))){Fe.current.add(e);try{let n=await o.createView({...Te(t),theme:we(t),screenReaderMode:ke()});if(!G.current||!z.current.has(e)){n.dispose();return}n.open(t);let r=ve(t=>o.api.input(e,t),{onError:e=>{G.current&&T({tone:`error`,text:L(e,`That input did not reach the shell.`)})}}),i={view:n,host:t,lastSeq:0,queue:r,disposers:[]};i.disposers.push(n.onData(t=>{ze.current.has(e)||r.pushText(t)})),i.disposers.push(n.onBinary(t=>{ze.current.has(e)||r.pushBinary(t)})),i.disposers.push(n.onSelectionChange(()=>{let e=n.hasSelection();xe(e),e&&(W.current&&clearTimeout(W.current),W.current=setTimeout(()=>{let e=n.getSelection();e&&o.writeClipboard(e).then(()=>{G.current&&(D(!0),U.current&&clearTimeout(U.current),U.current=setTimeout(()=>D(!1),1200))},()=>{})},150))})),n.setKeyFilter(e=>!je(e,o.platform)),R.current.set(e,i),A(!1),P(t=>new Set(t).add(e))}catch(e){console.error(`[verse] terminal view failed to load`,e),G.current&&A(!0)}finally{Fe.current.delete(e)}}},[o]),Ke=(0,S.useRef)(Ge);Ke.current=Ge;let qe=(0,S.useRef)(new Map),Je=e=>{let t=qe.current.get(e);return t||(t=t=>{t?(z.current.set(e,t),Ke.current(e,t)):(z.current.delete(e),qe.current.delete(e))},qe.current.set(e,t)),t},Ye=(0,S.useCallback)(()=>{if(!b)return;let e=R.current.get(b);if(!e)return;let t={cols:e.view.cols,rows:e.view.rows},n=e.view.fit();if(!n||n.cols===t.cols&&n.rows===t.rows&&J&&J.cols===n.cols&&J.rows===n.rows)return;H.current&&clearTimeout(H.current);let r=b;H.current=setTimeout(()=>{o.api.resize(r,n.cols,n.rows).catch(()=>{})},100)},[J,b,o.api]);(0,S.useEffect)(()=>{if(!l||!b||!j.has(b))return;Ye();let e=Ie.current;if(!e||typeof ResizeObserver>`u`)return;let t=0,n=new ResizeObserver(()=>{cancelAnimationFrame(t),t=requestAnimationFrame(Ye)});return n.observe(e),()=>{cancelAnimationFrame(t),n.disconnect()}},[l,b,j,Ye]),(0,S.useEffect)(()=>Ee(()=>{for(let e of R.current.values())e.view.setTheme(we(e.host))}),[]);let Q=(0,S.useCallback)(e=>{let t=V.current;if(!t||t.tabId!==e)return;let n=R.current.get(e);if(!n)return;V.current=null;let r=t.text.replace(/[\r\n]+$/,``);r.includes(`
|
|
6
|
+
`)&&!n.view.bracketedPaste()?o.writeClipboard(r).then(()=>T({tone:`info`,text:`That command has several lines, so it was copied instead: paste it with ⌘V.`}),()=>T({tone:`error`,text:`That command has several lines and could not be pasted safely.`})):n.view.paste(r),n.view.focus()},[o]);(0,S.useEffect)(()=>{if(!l||!b||!j.has(b)){ye(null);return}let e=R.current.get(b);if(!e)return;let t=b,n=!0,r=o.openStream(t,()=>e.lastSeq,{onFrame:r=>{if(r.type===`output`){if(r.seq<=e.lastSeq)return;e.lastSeq>0&&r.seq>e.lastSeq+1&&e.view.reset(),e.view.write(ge(r.dataBase64)),e.lastSeq=r.seq,n&&(n=!1,V.current?.tabId===t&&setTimeout(()=>Q(t),120));return}h(e=>e&&{...e,tabs:e.tabs.map(e=>e.id===t?r.type===`title`?e.title===r.title?e:{...e,title:r.title}:{...e,exited:{code:r.code,signal:r.signal,at:new Date().toISOString()}}:e)})},onState:e=>{G.current&&(ye(e),e===`gone`&&Y())}});return V.current?.tabId===t&&e.lastSeq>0&&setTimeout(()=>Q(t),0),()=>r.close()},[l,b,j,o,Y,Q]);let Xe=(0,S.useCallback)(async e=>{let n=e.root??J?.root??t[0],r=e.newTab===!0||!!e.appId||!!e.devServerId,i=null;if(r||(i=(J&&!J.exited&&(!e.root||J.root===e.root)?J:null)??q.find(t=>!t.exited&&(!e.root||t.root===e.root))??null),i?C(i.id):i=await X({...n?{root:n}:{},...e.appId?{appId:e.appId}:{},...e.via?{via:e.via}:{},...e.model?{model:e.model}:{},...e.devServerId?{devServerId:e.devServerId}:{}}),i){if(e.paste){V.current={tabId:i.id,text:e.paste};let t=R.current.get(i.id);t&&t.lastSeq>0&&Q(i.id)}else R.current.get(i.id)?.view.focus()}},[J,Q,X,t,q]);(0,S.useEffect)(()=>{!n||!m||n.nonce<=F||(F=n.nonce,B.current=!0,m.available&&Xe(n))},[n,m,Xe]),(0,S.useEffect)(()=>{l&&b&&j.has(b)&&R.current.get(b)?.view.focus()},[l,b,j]);let Ze=()=>{if(!b)return;let e=R.current.get(b)?.view.getSelection()??``;e.trim()&&r(_e(e))},Qe=()=>{let e=!O;Ce(e),Ae(e);for(let t of R.current.values())t.view.setScreenReaderMode(e)},$e=async()=>{try{await o.api.openExternal(e,J?.root??t[0]),T({tone:`info`,text:`Opened in Terminal.`})}catch(e){T({tone:`error`,text:L(e,`Terminal could not be opened.`)})}},et=e=>{Re.current=!0,X(e).finally(()=>{Re.current=!1})},tt=()=>{et(J?.root?{root:J.root}:{})},nt=(e,t)=>{let n=-1;if(e.key===`ArrowRight`?n=(t+1)%q.length:e.key===`ArrowLeft`?n=(t-1+q.length)%q.length:e.key===`Home`?n=0:e.key===`End`&&(n=q.length-1),n<0)return;e.preventDefault();let r=q[n];C(r.id),Le.current.get(r.id)?.focus()};if(!m)return _?(0,N.jsx)(`div`,{className:M.pane,children:(0,N.jsx)(x,{compact:!0,tone:`error`,title:`Terminal is not reachable`,body:_,action:(0,N.jsx)(y,{size:`sm`,variant:`subtle`,onClick:()=>void Y(),children:`Try again`})})}):(0,N.jsxs)(`div`,{className:M.pane,"aria-busy":`true`,children:[(0,N.jsx)(`div`,{className:M.strip,"aria-hidden":`true`}),(0,N.jsxs)(`div`,{className:M.loading,children:[(0,N.jsx)(s,{width:`40%`}),(0,N.jsx)(s,{width:`70%`})]})]});if(!m.available)return(0,N.jsxs)(`div`,{className:M.pane,children:[(0,N.jsx)(x,{compact:!0,icon:(0,N.jsx)(ue,{size:20}),title:`Terminal needs the desktop app`,body:`This Verse server has no built-in terminal. Open the project in Terminal instead, or use the Ashlr desktop app.`,action:o.platform===`mac`?(0,N.jsx)(y,{size:`sm`,variant:`subtle`,icon:(0,N.jsx)(oe,{}),onClick:()=>void $e(),children:`Open in Terminal`}):void 0}),w?(0,N.jsx)(`p`,{className:M.inlineNotice,role:w.tone===`error`?`alert`:`status`,children:w.text}):null]});let rt=t.length>1,it=le(`dock.terminal-new`)?.keys[0],$=it?p(it,o.platform):null,at=q.length===0&&!k&&(!B.current||E&&!Re.current),ot=J?.root??q.at(-1)?.root??(at?t[0]??null:null);return(0,N.jsxs)(`div`,{className:M.pane,"data-compact":d||void 0,children:[(0,N.jsxs)(`div`,{className:M.strip,children:[(0,N.jsx)(`div`,{className:M.tabs,role:`tablist`,"aria-label":`Terminals`,children:q.map((e,t)=>{let n=e.id===b,r=!n&&(Ne.get(e.id)??e.createdAt)<e.lastActivityAt;return(0,N.jsxs)(`div`,{className:M.tab,"data-selected":n||void 0,role:`presentation`,children:[(0,N.jsxs)(`button`,{ref:t=>{t?Le.current.set(e.id,t):Le.current.delete(e.id)},type:`button`,role:`tab`,id:`terminal-tab-${e.id}`,"aria-selected":n,"aria-controls":`terminal-panel-${e.id}`,tabIndex:n?0:-1,className:M.tabButton,title:`${e.title} — ${e.root}`,onClick:()=>C(e.id),onKeyDown:e=>nt(e,t),children:[(0,N.jsx)(`span`,{className:M.tabTitle,children:e.title}),e.exited?(0,N.jsx)(`span`,{className:M.tabExited,children:`exited`}):null,r&&!e.exited?(0,N.jsx)(`span`,{className:M.unseen,"aria-label":`new output`,role:`img`}):null]}),(0,N.jsx)(`button`,{type:`button`,className:M.tabClose,"aria-label":`Close terminal ${e.title}`,title:`Close terminal`,onClick:()=>void Z(e),children:(0,N.jsx)(ae,{size:12})})]},e.id)})}),(0,N.jsxs)(`div`,{className:M.stripActions,children:[(0,N.jsx)(v,{variant:`ghost`,size:`sm`,icon:(0,N.jsx)(se,{}),"aria-label":`New terminal tab`,title:$?`New terminal tab (${$})`:`New terminal tab`,busy:E,onClick:tt}),rt?(0,N.jsx)(v,{variant:`ghost`,size:`sm`,icon:(0,N.jsx)(de,{}),"aria-label":`New terminal in…`,"aria-haspopup":`menu`,"aria-expanded":I!==null,title:`Choose the folder`,onClick:e=>Me({anchor:re(e.currentTarget),from:e.currentTarget})}):null]})]}),ot===null?null:(0,N.jsxs)(`div`,{className:`${pe.header} ${M.header}`,children:[(0,N.jsx)(`span`,{className:`${pe.title} ${M.cwd}`,title:ot,children:te(ot)}),(0,N.jsx)(`span`,{className:M.headerStatus,role:`status`,"aria-live":`polite`,children:he===`reconnecting`?`Reconnecting…`:he===`expired`?`Session expired — reload to reconnect`:Se?`Copied`:``}),(0,N.jsxs)(`div`,{className:pe.actions,children:[(0,N.jsx)(y,{variant:`ghost`,size:`sm`,icon:(0,N.jsx)(ce,{}),disabled:!be,"aria-label":`Send selection to chat`,title:be?`Send the selected text to the chat as a code block`:`Select text in the terminal first`,onClick:Ze,children:d?null:`Send to chat`}),(0,N.jsx)(v,{variant:`ghost`,size:`sm`,icon:(0,N.jsx)(fe,{}),"aria-label":`Screen reader mode`,"aria-pressed":O,title:O?`Screen reader mode is on`:`Screen reader mode`,onClick:Qe}),o.platform===`mac`?(0,N.jsx)(v,{variant:`ghost`,size:`sm`,icon:(0,N.jsx)(oe,{}),"aria-label":`Open in Terminal.app`,title:`Open this folder in Terminal.app`,onClick:()=>void $e()}):null]})]}),w?(0,N.jsxs)(`div`,{className:M.notice,"data-tone":w.tone,role:w.tone===`error`?`alert`:`status`,children:[(0,N.jsx)(`span`,{children:w.text}),(0,N.jsx)(`button`,{type:`button`,className:M.noticeClose,"aria-label":`Dismiss`,title:`Dismiss`,onClick:()=>T(null),children:(0,N.jsx)(ae,{size:12})})]}):null,(0,N.jsxs)(`div`,{className:M.body,ref:Ie,children:[k?(0,N.jsx)(x,{compact:!0,tone:`error`,title:`The terminal could not load`,body:`The rest of the chat still works.`,action:(0,N.jsx)(y,{size:`sm`,variant:`subtle`,onClick:()=>{A(!1);for(let[e,t]of z.current)Ge(e,t)},children:`Try again`})}):null,at?(0,N.jsx)(`div`,{className:M.loading,role:`status`,"aria-label":`Opening a shell`,children:(0,N.jsx)(s,{width:`30%`})}):null,q.length===0&&!k&&!at?(0,N.jsx)(x,{compact:!0,icon:(0,N.jsx)(ue,{size:20}),title:`No terminal open`,body:`Click New terminal${$?` or press ${$}`:``} to open a login shell in this chat's folder.${Be>0?` ${Be} ${Be===1?`terminal is`:`terminals are`} open in other chats.`:``}`,action:(0,N.jsx)(y,{size:`sm`,variant:`subtle`,icon:(0,N.jsx)(se,{}),busy:E,onClick:tt,children:`New terminal`})}):null,q.map(e=>{let t=e.id===b;return(0,N.jsxs)(`div`,{id:`terminal-panel-${e.id}`,role:`tabpanel`,"aria-labelledby":`terminal-tab-${e.id}`,className:M.panel,hidden:!t,children:[(0,N.jsxs)(`div`,{className:M.viewport,children:[(0,N.jsx)(`div`,{className:M.host,ref:Je(e.id),"data-testid":`terminal-host-${e.id}`}),!j.has(e.id)&&!k?(0,N.jsx)(`div`,{className:M.viewLoading,"aria-hidden":`true`,children:(0,N.jsx)(s,{width:`30%`})}):null]}),e.exited?(0,N.jsxs)(`div`,{className:M.exitBar,role:`status`,children:[(0,N.jsx)(`span`,{children:e.exited.signal&&e.exited.code===null?`Shell ended (${e.exited.signal}).`:`Shell exited${e.exited.code===null?``:` with code ${e.exited.code}`}.`}),(0,N.jsx)(y,{size:`sm`,variant:`subtle`,onClick:()=>void Ue(e),children:`Restart`}),(0,N.jsx)(y,{size:`sm`,variant:`ghost`,onClick:()=>void Z(e),children:`Close`})]}):null]},e.id)})]}),I?(0,N.jsx)(ie,{label:`New terminal in`,anchor:I.anchor,returnFocus:I.from,onClose:()=>Me(null),items:t.map(e=>({id:e,label:te(e),description:e,onSelect:()=>{et({root:e})}}))}):null]})}export{Oe as TERMINAL_LIST_POLL_MS,Me as TerminalPane,je as keyPassesToPage,I as resetTerminalPaneForTest};
|
|
7
|
+
//# sourceMappingURL=TerminalPane-B668-DJW.js.map
|