@ashlr/hub 3.11.5 → 3.13.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 +153 -0
- package/README.md +29 -16
- package/dist/authority-surface.json +91 -45
- package/dist/build-identity.json +2 -2
- package/dist/cli/authority.d.ts +145 -33
- package/dist/cli/authority.js +1196 -313
- 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/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/trust-roots.js +7 -1
- package/dist/core/authority/trust-roots.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 +919 -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/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/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 +10 -0
- package/dist/core/fleet/fleet-merge-state.js.map +1 -1
- package/dist/core/fleet/host-merge.d.ts +5 -0
- package/dist/core/fleet/host-merge.js +11 -0
- package/dist/core/fleet/host-merge.js.map +1 -1
- package/dist/core/fleet/merge-gates.d.ts +8 -0
- package/dist/core/fleet/merge-gates.js +25 -5
- package/dist/core/fleet/merge-gates.js.map +1 -1
- package/dist/core/fleet/standing-merge-pass.js +30 -0
- package/dist/core/fleet/standing-merge-pass.js.map +1 -1
- package/dist/core/fleet/tick-hooks-live.d.ts +9 -0
- package/dist/core/fleet/tick-hooks-live.js +44 -5
- 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/routing/budget-api.d.ts +11 -0
- package/dist/core/routing/budget-api.js +64 -8
- 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/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +8 -2
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +7 -1
- package/dist/core/verse/account-health.js +9 -3
- package/dist/core/verse/account-health.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/authority-api.d.ts +9 -1
- package/dist/core/verse/authority-api.js +82 -2
- package/dist/core/verse/authority-api.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/verse-api.d.ts +3 -1
- package/dist/core/verse/verse-api.js +6 -0
- package/dist/core/verse/verse-api.js.map +1 -1
- package/dist/core/web/public/next/assets/{ActionMenu-DffwPklw.js → ActionMenu-Dwjk6rUQ.js} +2 -2
- package/dist/core/web/public/next/assets/{ActionMenu-DffwPklw.js.map → ActionMenu-Dwjk6rUQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/Advanced-cVYTAsfB.js +2 -0
- package/dist/core/web/public/next/assets/{Advanced-CxzE6ekM.js.map → Advanced-cVYTAsfB.js.map} +1 -1
- package/dist/core/web/public/next/assets/App-IsaWDsdF.js +7 -0
- package/dist/core/web/public/next/assets/{App-DFlp-vdv.js.map → App-IsaWDsdF.js.map} +1 -1
- package/dist/core/web/public/next/assets/AppsSection-DDqeSrty.js +2 -0
- package/dist/core/web/public/next/assets/{AppsSection-Ct2O605-.js.map → AppsSection-DDqeSrty.js.map} +1 -1
- package/dist/core/web/public/next/assets/{AreaTrend-o-GLl2Is.js → AreaTrend-C32rUaxm.js} +2 -2
- package/dist/core/web/public/next/assets/{AreaTrend-o-GLl2Is.js.map → AreaTrend-C32rUaxm.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-CmSSTHVe.css +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-CpFYS3tQ.js +3 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-CpFYS3tQ.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-Dwn8UtOy.js +2 -0
- package/dist/core/web/public/next/assets/{AutonomySection-BTg7yVa1.js.map → AutonomySection-Dwn8UtOy.js.map} +1 -1
- package/dist/core/web/public/next/assets/{BranchBar-BjPFtGsj.js → BranchBar-ISZ7xUCj.js} +2 -2
- package/dist/core/web/public/next/assets/{BranchBar-BjPFtGsj.js.map → BranchBar-ISZ7xUCj.js.map} +1 -1
- package/dist/core/web/public/next/assets/BudgetControl-BARVp-En.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-BARVp-En.js.map +1 -0
- package/dist/core/web/public/next/assets/{Button-OjVJSrFq.js → Button-DtE0rlWD.js} +2 -2
- package/dist/core/web/public/next/assets/{Button-OjVJSrFq.js.map → Button-DtE0rlWD.js.map} +1 -1
- package/dist/core/web/public/next/assets/{CapacityStrip-Bx4c3dxD.js → CapacityStrip-DKbKA_Aa.js} +2 -2
- package/dist/core/web/public/next/assets/{CapacityStrip-Bx4c3dxD.js.map → CapacityStrip-DKbKA_Aa.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ChartFrame-B_w2Siqg.js → ChartFrame-DK_BDXCt.js} +2 -2
- package/dist/core/web/public/next/assets/{ChartFrame-B_w2Siqg.js.map → ChartFrame-DK_BDXCt.js.map} +1 -1
- package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js.map +1 -0
- package/dist/core/web/public/next/assets/{CloudBudgetForm-5Gf4iAok.js → CloudBudgetForm-CvjK4Oh6.js} +2 -2
- package/dist/core/web/public/next/assets/{CloudBudgetForm-5Gf4iAok.js.map → CloudBudgetForm-CvjK4Oh6.js.map} +1 -1
- package/dist/core/web/public/next/assets/{CommandPalette-iTpk6I8r.js → CommandPalette-DzPsth0u.js} +2 -2
- package/dist/core/web/public/next/assets/{CommandPalette-iTpk6I8r.js.map → CommandPalette-DzPsth0u.js.map} +1 -1
- package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js.map +1 -0
- package/dist/core/web/public/next/assets/{ConfirmDialog-_S9iE-cJ.js → ConfirmDialog-CLUhzaBj.js} +2 -2
- package/dist/core/web/public/next/assets/{ConfirmDialog-_S9iE-cJ.js.map → ConfirmDialog-CLUhzaBj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DeleteChatDialog-KUYUygiA.js → DeleteChatDialog-C_eDhV8b.js} +2 -2
- package/dist/core/web/public/next/assets/{DeleteChatDialog-KUYUygiA.js.map → DeleteChatDialog-C_eDhV8b.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Dialog-BuIaG6HF.js → Dialog-BRd_B9OE.js} +2 -2
- package/dist/core/web/public/next/assets/{Dialog-BuIaG6HF.js.map → Dialog-BRd_B9OE.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffPane-De4IQt82.js → DiffPane-Cpr9soB2.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffPane-De4IQt82.js.map → DiffPane-Cpr9soB2.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffViewer-B75t6Ile.js → DiffViewer-CNwd0W3Q.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-B75t6Ile.js.map → DiffViewer-CNwd0W3Q.js.map} +1 -1
- package/dist/core/web/public/next/assets/DockHost-BcEq2qaS.js +2 -0
- package/dist/core/web/public/next/assets/{DockHost-BPqyhtCP.js.map → DockHost-BcEq2qaS.js.map} +1 -1
- package/dist/core/web/public/next/assets/{EmptyState-DXkT4vhW.js → EmptyState-DsN1H6MC.js} +2 -2
- package/dist/core/web/public/next/assets/{EmptyState-DXkT4vhW.js.map → EmptyState-DsN1H6MC.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Epistemic-CfqFe_aP.js → Epistemic-fycQTBRO.js} +2 -2
- package/dist/core/web/public/next/assets/{Epistemic-CfqFe_aP.js.map → Epistemic-fycQTBRO.js.map} +1 -1
- package/dist/core/web/public/next/assets/EvidenceTimeline-PBDAiSuG.css +1 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-sCCAdnBK.js +2 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-sCCAdnBK.js.map +1 -0
- package/dist/core/web/public/next/assets/{FleetSection-B7f-XBiX.js → FleetSection-BG8iGraG.js} +3 -3
- package/dist/core/web/public/next/assets/{FleetSection-B7f-XBiX.js.map → FleetSection-BG8iGraG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Funnel-pXYySwXQ.js → Funnel-B88_wpA4.js} +2 -2
- package/dist/core/web/public/next/assets/{Funnel-pXYySwXQ.js.map → Funnel-B88_wpA4.js.map} +1 -1
- package/dist/core/web/public/next/assets/{GearTray-gj6lT7ba.js → GearTray-CpDt0xwj.js} +2 -2
- package/dist/core/web/public/next/assets/{GearTray-gj6lT7ba.js.map → GearTray-CpDt0xwj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{GrowthSection-D8e9m9Wy.js → GrowthSection-BvZezOsX.js} +2 -2
- package/dist/core/web/public/next/assets/{GrowthSection-D8e9m9Wy.js.map → GrowthSection-BvZezOsX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{HandoffDialog-VfKxKhxF.js → HandoffDialog-B1G6gQyk.js} +2 -2
- package/dist/core/web/public/next/assets/{HandoffDialog-VfKxKhxF.js.map → HandoffDialog-B1G6gQyk.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Input-u1YR_Ogl.js → Input-CI0yBHmn.js} +2 -2
- package/dist/core/web/public/next/assets/{Input-u1YR_Ogl.js.map → Input-CI0yBHmn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{LeaderCard-BDELBrnx.js → LeaderCard-BxxiEg4e.js} +2 -2
- package/dist/core/web/public/next/assets/{LeaderCard-BDELBrnx.js.map → LeaderCard-BxxiEg4e.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MatrixHeatmap-NKLF2srR.js → MatrixHeatmap-iPFEU2Tv.js} +2 -2
- package/dist/core/web/public/next/assets/{MatrixHeatmap-NKLF2srR.js.map → MatrixHeatmap-iPFEU2Tv.js.map} +1 -1
- package/dist/core/web/public/next/assets/McpSection-nuXer4K-.js +2 -0
- package/dist/core/web/public/next/assets/{McpSection-D1tDvlRa.js.map → McpSection-nuXer4K-.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdown-DlfLEJxu.js → MessageMarkdown-BCe4TsXk.js} +3 -3
- package/dist/core/web/public/next/assets/{MessageMarkdown-DlfLEJxu.js.map → MessageMarkdown-BCe4TsXk.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-BYZzI115.js → MessageMarkdownRenderer-DL3LU5kL.js} +2 -2
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-BYZzI115.js.map → MessageMarkdownRenderer-DL3LU5kL.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Meter-BSVhU43Q.js → Meter-b69LM0mU.js} +2 -2
- package/dist/core/web/public/next/assets/{Meter-BSVhU43Q.js.map → Meter-b69LM0mU.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MindSection-lqV2e_Sq.js → MindSection-Dc5v5rH3.js} +2 -2
- package/dist/core/web/public/next/assets/{MindSection-lqV2e_Sq.js.map → MindSection-Dc5v5rH3.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MutationTokenDialog-CLGP72g6.js → MutationTokenDialog-Bm34BNVV.js} +2 -2
- package/dist/core/web/public/next/assets/{MutationTokenDialog-CLGP72g6.js.map → MutationTokenDialog-Bm34BNVV.js.map} +1 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CH6Mq-E_.css +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-D5Kk549g.js +2 -0
- package/dist/core/web/public/next/assets/{NeedsYouList-eBOlJr0b.js.map → NeedsYouList-D5Kk549g.js.map} +1 -1
- package/dist/core/web/public/next/assets/{NewChatDialog-DoYTH26M.js → NewChatDialog-BqFTWgHU.js} +2 -2
- package/dist/core/web/public/next/assets/{NewChatDialog-DoYTH26M.js.map → NewChatDialog-BqFTWgHU.js.map} +1 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-DcDsguAM.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-DcDsguAM.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingGate-BZafM1Vf.js +3 -0
- package/dist/core/web/public/next/assets/{OnboardingGate-DrDEVBqw.js.map → OnboardingGate-BZafM1Vf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{PreviewPane-ULN673zm.js → PreviewPane-zT3gK9TD.js} +2 -2
- package/dist/core/web/public/next/assets/{PreviewPane-ULN673zm.js.map → PreviewPane-zT3gK9TD.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ProviderLogo-8WaUjTlN.js → ProviderLogo-AwHn2sKm.js} +2 -2
- package/dist/core/web/public/next/assets/{ProviderLogo-8WaUjTlN.js.map → ProviderLogo-AwHn2sKm.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RailStatus-Ckw9nvYU.js → RailStatus-xHrovWvI.js} +2 -2
- package/dist/core/web/public/next/assets/{RailStatus-Ckw9nvYU.js.map → RailStatus-xHrovWvI.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RefreshIndicator-DGubF4vR.js → RefreshIndicator-SEFZlMB2.js} +2 -2
- package/dist/core/web/public/next/assets/{RefreshIndicator-DGubF4vR.js.map → RefreshIndicator-SEFZlMB2.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BahEaY4d.js → ResourcePoolConsoleApp-CAxPQ4sZ.js} +3 -3
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BahEaY4d.js.map → ResourcePoolConsoleApp-CAxPQ4sZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js +3 -0
- package/dist/core/web/public/next/assets/{ResourcesChrome-C2ZrA7la.js.map → ResourcesChrome-BnhnEdJe.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ResourcesDrawer-BC93fzwQ.js → ResourcesDrawer-BAFGodny.js} +2 -2
- package/dist/core/web/public/next/assets/{ResourcesDrawer-BC93fzwQ.js.map → ResourcesDrawer-BAFGodny.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-BvhHNpE_.js → RouteErrorBoundary-C8WGiixc.js} +2 -2
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-BvhHNpE_.js.map → RouteErrorBoundary-C8WGiixc.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RunInCloudAction-Dywfnw0C.js → RunInCloudAction-1-IPLYhf.js} +2 -2
- package/dist/core/web/public/next/assets/{RunInCloudAction-Dywfnw0C.js.map → RunInCloudAction-1-IPLYhf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SeatSelector-CH7hTgwy.js → SeatSelector-DpwNiX8F.js} +2 -2
- package/dist/core/web/public/next/assets/{SeatSelector-CH7hTgwy.js.map → SeatSelector-DpwNiX8F.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Segmented-Wynbg0F5.js → Segmented-Wt1ATod9.js} +2 -2
- package/dist/core/web/public/next/assets/{Segmented-Wynbg0F5.js.map → Segmented-Wt1ATod9.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Select-DMyLCkId.js → Select-By-V9lMc.js} +2 -2
- package/dist/core/web/public/next/assets/{Select-DMyLCkId.js.map → Select-By-V9lMc.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionGate-8RtQFWeZ.js → SessionGate-WROS02tK.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionGate-8RtQFWeZ.js.map → SessionGate-WROS02tK.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionInsightChip-zBJbKv2L.js → SessionInsightChip-DNUcruwp.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionInsightChip-zBJbKv2L.js.map → SessionInsightChip-DNUcruwp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionSearch-DfJIcxxM.js → SessionSearch-UHtt7a8f.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionSearch-DfJIcxxM.js.map → SessionSearch-UHtt7a8f.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SettingsSection-Da9RYyH5.js → SettingsSection-Bf74l0Gj.js} +2 -2
- package/dist/core/web/public/next/assets/{SettingsSection-Da9RYyH5.js.map → SettingsSection-Bf74l0Gj.js.map} +1 -1
- package/dist/core/web/public/next/assets/SetupChecklist-BhZpFLsj.css +1 -0
- package/dist/core/web/public/next/assets/SetupChecklist-CzpEcfOl.js +2 -0
- package/dist/core/web/public/next/assets/SetupChecklist-CzpEcfOl.js.map +1 -0
- package/dist/core/web/public/next/assets/{Sheet-DhXyIDmq.js → Sheet-HkBOBMTT.js} +2 -2
- package/dist/core/web/public/next/assets/{Sheet-DhXyIDmq.js.map → Sheet-HkBOBMTT.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-Bi5f-wUw.js → ShortcutsOverlay-DiigiT8H.js} +2 -2
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-Bi5f-wUw.js.map → ShortcutsOverlay-DiigiT8H.js.map} +1 -1
- package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js.map +1 -0
- package/dist/core/web/public/next/assets/{Slider-Bd9YFWEV.js → Slider-DaEDws-b.js} +2 -2
- package/dist/core/web/public/next/assets/{Slider-Bd9YFWEV.js.map → Slider-DaEDws-b.js.map} +1 -1
- package/dist/core/web/public/next/assets/{StatTile-DScTd3c-.js → StatTile-CTX41O6y.js} +2 -2
- package/dist/core/web/public/next/assets/{StatTile-DScTd3c-.js.map → StatTile-CTX41O6y.js.map} +1 -1
- package/dist/core/web/public/next/assets/{StatusBadge-DQ1UtQAJ.js → StatusBadge-CXG3iNL4.js} +2 -2
- package/dist/core/web/public/next/assets/{StatusBadge-DQ1UtQAJ.js.map → StatusBadge-CXG3iNL4.js.map} +1 -1
- package/dist/core/web/public/next/assets/{StepBand-BB3IJxhr.js → StepBand-jJTqYIdX.js} +2 -2
- package/dist/core/web/public/next/assets/{StepBand-BB3IJxhr.js.map → StepBand-jJTqYIdX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Surface-DWMtQe3Q.js → Surface-5bNA08tK.js} +2 -2
- package/dist/core/web/public/next/assets/{Surface-DWMtQe3Q.js.map → Surface-5bNA08tK.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Swimlane-DcENqtdp.js → Swimlane-LrslsGxw.js} +2 -2
- package/dist/core/web/public/next/assets/{Swimlane-DcENqtdp.js.map → Swimlane-LrslsGxw.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Switch-CenChEYf.js → Switch-BmCzfFnu.js} +2 -2
- package/dist/core/web/public/next/assets/{Switch-CenChEYf.js.map → Switch-BmCzfFnu.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Tag-D4k5E3u0.js → Tag-WSUIaMVy.js} +2 -2
- package/dist/core/web/public/next/assets/{Tag-D4k5E3u0.js.map → Tag-WSUIaMVy.js.map} +1 -1
- package/dist/core/web/public/next/assets/{TerminalPane-DCQTukcE.js → TerminalPane-BVFgYX6K.js} +5 -5
- package/dist/core/web/public/next/assets/{TerminalPane-DCQTukcE.js.map → TerminalPane-BVFgYX6K.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-DsuWT0pi.js → UniverseConsoleApp-BpphLqoz.js} +2 -2
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-DsuWT0pi.js.map → UniverseConsoleApp-BpphLqoz.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-DyI5ApsA.js → UniverseView-DbpbSMwO.js} +4 -4
- package/dist/core/web/public/next/assets/{UniverseView-DyI5ApsA.js.map → UniverseView-DbpbSMwO.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UsageSection-Imr28nwK.js → UsageSection-CUlaKtws.js} +3 -3
- package/dist/core/web/public/next/assets/{UsageSection-Imr28nwK.js.map → UsageSection-CUlaKtws.js.map} +1 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js.map +1 -0
- package/dist/core/web/public/next/assets/{Workspace-CpxBO98E.js → Workspace-RXy0pqp6.js} +5 -5
- package/dist/core/web/public/next/assets/{Workspace-CpxBO98E.js.map → Workspace-RXy0pqp6.js.map} +1 -1
- package/dist/core/web/public/next/assets/{actions-DE8NoWV_.js → actions-BZTidCXZ.js} +2 -2
- package/dist/core/web/public/next/assets/{actions-DE8NoWV_.js.map → actions-BZTidCXZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{apps-model-CFGCUu9p.js → apps-model-CHO133qt.js} +2 -2
- package/dist/core/web/public/next/assets/{apps-model-CFGCUu9p.js.map → apps-model-CHO133qt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{authority-model-CmnfJzmM.js → authority-model-8NeAEwAF.js} +2 -2
- package/dist/core/web/public/next/assets/{authority-model-CmnfJzmM.js.map → authority-model-8NeAEwAF.js.map} +1 -1
- package/dist/core/web/public/next/assets/{budget-queries-DjrPRFwl.js → budget-queries-DFF-3ICg.js} +2 -2
- package/dist/core/web/public/next/assets/{budget-queries-DjrPRFwl.js.map → budget-queries-DFF-3ICg.js.map} +1 -1
- package/dist/core/web/public/next/assets/{capacity-strip-model-C7cdQnuK.js → capacity-strip-model-5ViUgUlP.js} +2 -2
- package/dist/core/web/public/next/assets/{capacity-strip-model-C7cdQnuK.js.map → capacity-strip-model-5ViUgUlP.js.map} +1 -1
- package/dist/core/web/public/next/assets/{charts-DUD_jprE.js → charts-CzxWrZn7.js} +2 -2
- package/dist/core/web/public/next/assets/{charts-DUD_jprE.js.map → charts-CzxWrZn7.js.map} +1 -1
- package/dist/core/web/public/next/assets/cloud-model-CfRydq8N.js +2 -0
- package/dist/core/web/public/next/assets/{cloud-model-DoxBMDvx.js.map → cloud-model-CfRydq8N.js.map} +1 -1
- package/dist/core/web/public/next/assets/{cloud-queries-CTGvO-k-.js → cloud-queries-DmptbjS8.js} +2 -2
- package/dist/core/web/public/next/assets/{cloud-queries-CTGvO-k-.js.map → cloud-queries-DmptbjS8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{command-catalog-CmrHNFzh.js → command-catalog-ffCAijVY.js} +2 -2
- package/dist/core/web/public/next/assets/{command-catalog-CmrHNFzh.js.map → command-catalog-ffCAijVY.js.map} +1 -1
- package/dist/core/web/public/next/assets/{context-model-2Owp2jYF.js → context-model-Bb15chFt.js} +2 -2
- package/dist/core/web/public/next/assets/{context-model-2Owp2jYF.js.map → context-model-Bb15chFt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{context-model-9xywbXxX.js → context-model-CDeyP0cA.js} +2 -2
- package/dist/core/web/public/next/assets/{context-model-9xywbXxX.js.map → context-model-CDeyP0cA.js.map} +1 -1
- package/dist/core/web/public/next/assets/{context-queries-wvcRnV-I.js → context-queries-_9bFWb9v.js} +2 -2
- package/dist/core/web/public/next/assets/{context-queries-wvcRnV-I.js.map → context-queries-_9bFWb9v.js.map} +1 -1
- package/dist/core/web/public/next/assets/{control-queries-DB6Kh7UN.js → control-queries-CXtmZZH6.js} +2 -2
- package/dist/core/web/public/next/assets/{control-queries-DB6Kh7UN.js.map → control-queries-CXtmZZH6.js.map} +1 -1
- package/dist/core/web/public/next/assets/copy-setup-BIp0iaiZ.js +2 -0
- package/dist/core/web/public/next/assets/copy-setup-BIp0iaiZ.js.map +1 -0
- package/dist/core/web/public/next/assets/{dock-icons-BBUGl4tE.js → dock-icons-Cc43W7r4.js} +2 -2
- package/dist/core/web/public/next/assets/{dock-icons-BBUGl4tE.js.map → dock-icons-Cc43W7r4.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-model-BRfRWkZl.js → fleet-model-DOK8ZtEt.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-model-BRfRWkZl.js.map → fleet-model-DOK8ZtEt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-queries-tU6UEXN2.js → fleet-queries-BeEAqD6y.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-queries-tU6UEXN2.js.map → fleet-queries-BeEAqD6y.js.map} +1 -1
- package/dist/core/web/public/next/assets/{focus-trap-BGOceFvj.js → focus-trap-ChZ5EFfM.js} +2 -2
- package/dist/core/web/public/next/assets/{focus-trap-BGOceFvj.js.map → focus-trap-ChZ5EFfM.js.map} +1 -1
- package/dist/core/web/public/next/assets/format-BmH2yWL6.js +2 -0
- package/dist/core/web/public/next/assets/format-BmH2yWL6.js.map +1 -0
- package/dist/core/web/public/next/assets/{git-model-53iRLInY.js → git-model-BFwAVbxF.js} +2 -2
- package/dist/core/web/public/next/assets/{git-model-53iRLInY.js.map → git-model-BFwAVbxF.js.map} +1 -1
- package/dist/core/web/public/next/assets/global-y_exIyAP.js +2 -0
- package/dist/core/web/public/next/assets/{global-CXHHMz9o.js.map → global-y_exIyAP.js.map} +1 -1
- package/dist/core/web/public/next/assets/{guarded-runners-B8zFVBVZ.js → guarded-runners-Cd4POBtI.js} +2 -2
- package/dist/core/web/public/next/assets/{guarded-runners-B8zFVBVZ.js.map → guarded-runners-Cd4POBtI.js.map} +1 -1
- package/dist/core/web/public/next/assets/{icons-D4s-jlxX.js → icons-CygCEFWs.js} +2 -2
- package/dist/core/web/public/next/assets/{icons-D4s-jlxX.js.map → icons-CygCEFWs.js.map} +1 -1
- package/dist/core/web/public/next/assets/{index-BG177cPN.js → index-CyK31YRm.js} +3 -3
- package/dist/core/web/public/next/assets/{index-BG177cPN.js.map → index-CyK31YRm.js.map} +1 -1
- package/dist/core/web/public/next/assets/{live-model-CEf01wrW.js → live-model-D7hilYFk.js} +2 -2
- package/dist/core/web/public/next/assets/live-model-D7hilYFk.js.map +1 -0
- package/dist/core/web/public/next/assets/{mind.module-D_xk6HIQ.js → mind.module-B15k0Y9q.js} +2 -2
- package/dist/core/web/public/next/assets/{mind.module-D_xk6HIQ.js.map → mind.module-B15k0Y9q.js.map} +1 -1
- package/dist/core/web/public/next/assets/mutations-CWlxEMEm.js +2 -0
- package/dist/core/web/public/next/assets/{mutations-CbTSofVH.js.map → mutations-CWlxEMEm.js.map} +1 -1
- package/dist/core/web/public/next/assets/{nav-CmZcbPFJ.js → nav-mimleI0R.js} +2 -2
- package/dist/core/web/public/next/assets/{nav-CmZcbPFJ.js.map → nav-mimleI0R.js.map} +1 -1
- package/dist/core/web/public/next/assets/{overnight-queries-CR0b_j-V.js → overnight-queries-DJ4mZKSj.js} +2 -2
- package/dist/core/web/public/next/assets/{overnight-queries-CR0b_j-V.js.map → overnight-queries-DJ4mZKSj.js.map} +1 -1
- package/dist/core/web/public/next/assets/primitives-DMijqcu0.js +1 -0
- package/dist/core/web/public/next/assets/{queries-rvRsAGW2.js → queries-Bw1McHTj.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-rvRsAGW2.js.map → queries-Bw1McHTj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reasoning-pref-DMPQkujg.js → reasoning-pref-KkhI_5-j.js} +2 -2
- package/dist/core/web/public/next/assets/{reasoning-pref-DMPQkujg.js.map → reasoning-pref-KkhI_5-j.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reveal-anchor-BKk2wZZZ.js → reveal-anchor-CCCx_kfT.js} +2 -2
- package/dist/core/web/public/next/assets/{reveal-anchor-BKk2wZZZ.js.map → reveal-anchor-CCCx_kfT.js.map} +1 -1
- package/dist/core/web/public/next/assets/{seat-subscription-CLn2ReSZ.js → seat-subscription-BhUUz7VL.js} +2 -2
- package/dist/core/web/public/next/assets/{seat-subscription-CLn2ReSZ.js.map → seat-subscription-BhUUz7VL.js.map} +1 -1
- package/dist/core/web/public/next/assets/{sidebar-model-CjQLvdag.js → sidebar-model-Dcd437cf.js} +2 -2
- package/dist/core/web/public/next/assets/{sidebar-model-CjQLvdag.js.map → sidebar-model-Dcd437cf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{slots-DRxNosZg.js → slots-BL_J5mmV.js} +3 -3
- package/dist/core/web/public/next/assets/{slots-DRxNosZg.js.map → slots-BL_J5mmV.js.map} +1 -1
- package/dist/core/web/public/next/assets/{surface-data-DshUC_TU.js → surface-data-C3UAQ4QX.js} +2 -2
- package/dist/core/web/public/next/assets/{surface-data-DshUC_TU.js.map → surface-data-C3UAQ4QX.js.map} +1 -1
- package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js +2 -0
- package/dist/core/web/public/next/assets/{surface-prefetch-DO8r4ttQ.js.map → surface-prefetch-BXKjPsV5.js.map} +1 -1
- package/dist/core/web/public/next/assets/{tasks-model-BKPFZAmZ.js → tasks-model-CzHvclVm.js} +2 -2
- package/dist/core/web/public/next/assets/{tasks-model-BKPFZAmZ.js.map → tasks-model-CzHvclVm.js.map} +1 -1
- package/dist/core/web/public/next/assets/{terminal-icons-DoeQkP3y.js → terminal-icons-BwgQTQP0.js} +2 -2
- package/dist/core/web/public/next/assets/{terminal-icons-DoeQkP3y.js.map → terminal-icons-BwgQTQP0.js.map} +1 -1
- 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-MnUeYzwp.js → usage-queries-pXxvy54x.js} +2 -2
- package/dist/core/web/public/next/assets/{usage-queries-MnUeYzwp.js.map → usage-queries-pXxvy54x.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-guarded-action-P12MfNwU.js → use-guarded-action-EgVWjM5c.js} +2 -2
- package/dist/core/web/public/next/assets/{use-guarded-action-P12MfNwU.js.map → use-guarded-action-EgVWjM5c.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-ticker-DIvAZ4Ey.js → use-ticker-BoqFxRFG.js} +2 -2
- package/dist/core/web/public/next/assets/{use-ticker-DIvAZ4Ey.js.map → use-ticker-BoqFxRFG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-token-gate-DfEja7Wr.js → use-token-gate-DSNIIpI6.js} +2 -2
- package/dist/core/web/public/next/assets/{use-token-gate-DfEja7Wr.js.map → use-token-gate-DSNIIpI6.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useOnboarding-CkOHadqC.js → useOnboarding-Bk0VnkxQ.js} +2 -2
- package/dist/core/web/public/next/assets/{useOnboarding-CkOHadqC.js.map → useOnboarding-Bk0VnkxQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useSeatsRefresh-BDlbDlIU.js → useSeatsRefresh-q7Id9RcW.js} +2 -2
- package/dist/core/web/public/next/assets/{useSeatsRefresh-BDlbDlIU.js.map → useSeatsRefresh-q7Id9RcW.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useVerseTranscript-BGtA55k2.js → useVerseTranscript-CqH51rt9.js} +2 -2
- package/dist/core/web/public/next/assets/{useVerseTranscript-BGtA55k2.js.map → useVerseTranscript-CqH51rt9.js.map} +1 -1
- package/dist/core/web/public/next/assets/{verse-icons-wOet9JZy.js → verse-icons-DsG1dOQx.js} +2 -2
- package/dist/core/web/public/next/assets/{verse-icons-wOet9JZy.js.map → verse-icons-DsG1dOQx.js.map} +1 -1
- package/dist/core/web/public/next/assets/{verse-model-CSzzdyu2.js → verse-model-JTuvRBVK.js} +2 -2
- package/dist/core/web/public/next/assets/{verse-model-CSzzdyu2.js.map → verse-model-JTuvRBVK.js.map} +1 -1
- package/dist/core/web/public/next/assets/{warmup-CecO_Nk0.js → warmup-Bv1RumVq.js} +3 -3
- package/dist/core/web/public/next/assets/{warmup-CecO_Nk0.js.map → warmup-Bv1RumVq.js.map} +1 -1
- package/dist/core/web/public/next/assets/why-seat-model-Cau8qG6O.js +2 -0
- package/dist/core/web/public/next/assets/why-seat-model-Cau8qG6O.js.map +1 -0
- package/dist/core/web/public/next/assets/{workspace-model-BdIVybKr.js → workspace-model-D-SLfads.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-BdIVybKr.js.map → workspace-model-D-SLfads.js.map} +1 -1
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/docs/AUTONOMY-GAP.md +1 -1
- package/package.json +1 -1
- package/dist/core/web/public/next/assets/Advanced-CxzE6ekM.js +0 -2
- package/dist/core/web/public/next/assets/App-DFlp-vdv.js +0 -7
- package/dist/core/web/public/next/assets/AppsSection-Ct2O605-.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyOffState-CXhXpsim.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyOffState-CXhXpsim.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-BTg7yVa1.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-ng6swoZp.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-ng6swoZp.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-Bisj9R6E.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-Bisj9R6E.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-D8ZihzvE.js +0 -2
- package/dist/core/web/public/next/assets/CommandSection-D8ZihzvE.js.map +0 -1
- package/dist/core/web/public/next/assets/DockHost-BPqyhtCP.js +0 -2
- package/dist/core/web/public/next/assets/McpSection-D1tDvlRa.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouDrawer-D992XTOn.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouDrawer-D992XTOn.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +0 -1
- package/dist/core/web/public/next/assets/NeedsYouList-eBOlJr0b.js +0 -2
- package/dist/core/web/public/next/assets/OnboardingFlow-D3yfITK1.js +0 -2
- package/dist/core/web/public/next/assets/OnboardingFlow-D3yfITK1.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingGate-DrDEVBqw.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-C2ZrA7la.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-BuO3sViG.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-BuO3sViG.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-DeuBEvAO.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-DeuBEvAO.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud-model-DoxBMDvx.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-CJQhFl-4.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-CJQhFl-4.js.map +0 -1
- package/dist/core/web/public/next/assets/format-DEAaVF6X.js +0 -2
- package/dist/core/web/public/next/assets/format-DEAaVF6X.js.map +0 -1
- package/dist/core/web/public/next/assets/global-CXHHMz9o.js +0 -2
- package/dist/core/web/public/next/assets/live-model-CEf01wrW.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-CbTSofVH.js +0 -2
- package/dist/core/web/public/next/assets/primitives-DNI-uJBd.js +0 -1
- package/dist/core/web/public/next/assets/surface-prefetch-DO8r4ttQ.js +0 -2
- 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/why-seat-model-D68ZA7G8.js +0 -2
- package/dist/core/web/public/next/assets/why-seat-model-D68ZA7G8.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NeedsYouDrawer-D992XTOn.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/approvals/approvals.module.css","../../../../../../src/web-ui/routes/verse/approvals/ApprovalDetail.tsx","../../../../../../src/web-ui/routes/verse/shell/needs-you-actions.ts","../../../../../../src/web-ui/routes/verse/shell/NeedsYouDrawer.tsx"],"sourcesContent":["/**\n * routes/verse/approvals/approvals.module.css — list + detail styling for the\n * Approvals surface. Same language as the cockpit: hairlines, no cards, tight\n * radii, Space Grotesk on identifiers and numerals, colour reserved for risk\n * and for the two irreversible buttons.\n */\n\n.layout { display: grid; grid-template-columns: minmax(320px, 420px) minmax(0, 1fr); min-height: 0; height: 100%; }\n.listPane { display: flex; flex-direction: column; min-height: 0; border-right: 1px solid var(--border-subtle); background: var(--bg-surface); }\n.detailPane { display: flex; flex-direction: column; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; background: var(--bg-canvas); }\n\n.filters { flex-shrink: 0; display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--border-subtle); }\n.filterField { display: flex; flex-direction: column; gap: var(--space-1); flex: 1; min-width: 120px; }\n.filterLabel { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); }\n.filters input {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n}\n\n/* The Select primitive renders its own <label>; restyle it to the uppercase\n micro-label the sibling text filters use so the row still reads as one\n group. Descendant element selector, so it stays module-scoped. */\n/* Layout comes from the primitive's own .field; this only matches the\n sibling text filters' flex behaviour. */\n.filterSelect { flex: 1; min-width: 120px; }\n.filterSelect > label {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-regular, 400);\n color: var(--text-tertiary);\n}\n\n/* WebKit paints its own clear affordance inside type=search, which is a\n default browser control (§7). Sidebar.module.css already resets it. */\n.filters input[type='search']::-webkit-search-cancel-button { appearance: none; }\n\n\n.count { flex-shrink: 0; display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); font-size: var(--text-xs-size); color: var(--text-tertiary); border-bottom: 1px solid var(--border-subtle); }\n\n.rows { flex: 1; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; }\n.row {\n display: grid;\n grid-template-columns: 2px minmax(0, 1fr);\n column-gap: var(--space-3);\n width: 100%;\n padding: var(--space-3) var(--space-4);\n border: 0;\n border-bottom: 1px solid var(--border-subtle);\n background: transparent;\n text-align: left;\n color: var(--text-primary);\n cursor: pointer;\n}\n.row:hover { background: var(--bg-hover); }\n.rowActive { background: var(--bg-selected); }\n/* Inset, because .rows scrolls (`overflow-y: auto`) and a full-width row's\n outward ring is clipped at the left and right edges. The global ring is\n silenced so only one paints. */\n.row:focus-visible { outline: 2px solid var(--border-focus); outline-offset: -2px; box-shadow: none; }\n.riskRule { grid-row: 1 / span 2; border-radius: var(--radius-full); background: var(--border-strong); }\n.riskRule[data-risk=\"high\"] { background: var(--status-danger-solid); }\n.riskRule[data-risk=\"medium\"] { background: var(--status-warning-solid); }\n.riskRule[data-risk=\"low\"] { background: var(--status-success-solid); }\n.rowTitle { font-size: var(--text-sm-size); line-height: var(--text-sm-line); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.rowMeta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-1) var(--space-3); margin-top: 2px; font-size: var(--text-xs-size); color: var(--text-tertiary); }\n/* --text-tertiary is a direct declaration on a CHILD, so the parent's\n :hover/[aria-current] colour change does not reach it — only the ground\n under it moves. Measured on --bg-selected it is 3.95:1 in light and 4.40:1\n in dark, both under the 4.5:1 floor in DESIGN-V2 §6; --text-secondary is\n 6.32:1 on the worst of them. design/tokens-contrast.test.ts now pins the\n token pair so the gap cannot reopen. */\n.row:hover .rowMeta,\n.rowActive .rowMeta { color: var(--text-secondary); }\n.rowMetaMono { font-family: var(--font-mono); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 14ch; }\n.rowAge { font-family: var(--font-display); }\n.riskWord { font-family: var(--font-display); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; font-size: var(--text-2xs-size, 11px); }\n.riskWord[data-risk=\"high\"] { color: var(--status-danger-fg); }\n.riskWord[data-risk=\"medium\"] { color: var(--status-warning-fg); }\n.riskWord[data-risk=\"low\"] { color: var(--status-success-fg); }\n\n/* --- detail ------------------------------------------------------------- */\n.detail { padding: var(--space-5) var(--space-6) var(--space-16); max-width: 1040px; }\n.detailHead { padding-bottom: var(--space-4); border-bottom: 1px solid var(--border-subtle); }\n.eyebrow { margin: 0 0 var(--space-1); font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); }\n/* Two lines at most, wrapped at word boundaries — a run title is a goal\n sentence and used to be cut mid-word. The full text rides in `title`. */\n.detailTitle {\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, -0.02em);\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n overflow: hidden;\n overflow-wrap: break-word;\n}\n.project { font-weight: var(--font-weight-medium); color: var(--text-secondary); }\n.runFacts { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-1) var(--space-2); margin-top: var(--space-2); font-size: var(--text-sm-size); line-height: var(--text-sm-line); color: var(--text-secondary); }\n.runFacts code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.diffStats { font-family: var(--font-display); font-variant-numeric: tabular-nums; color: var(--text-primary); }\n.runSource[title] { text-decoration: underline dotted; text-underline-offset: 3px; cursor: help; }\n.hint { margin: var(--space-1) 0 0; font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-tertiary); max-width: 64ch; }\n.detailMeta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-3); margin-top: var(--space-2); font-size: var(--text-xs-size); color: var(--text-tertiary); }\n.detailMeta code { font-family: var(--font-mono); }\n.summary { margin-top: var(--space-3); font-size: var(--text-base-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 72ch; }\n\n.block { padding-block: var(--space-5); border-bottom: 1px solid var(--border-subtle); }\n.blockTitle {\n font-family: var(--font-display);\n font-size: var(--text-xs-size);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-semibold);\n color: var(--text-tertiary);\n margin-bottom: var(--space-3);\n}\n.defs { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: var(--space-2) var(--space-4); margin: 0; font-size: var(--text-sm-size); line-height: var(--text-sm-line); }\n.defs dt { color: var(--text-tertiary); }\n.defs dd { margin: 0; color: var(--text-primary); min-width: 0; overflow-wrap: anywhere; }\n.defs dd code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.muted { color: var(--text-tertiary); }\n.failedChecks { margin: var(--space-1) 0 0; font-family: var(--font-mono); font-size: var(--text-xs-size); color: var(--status-danger-fg); }\n\n.actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: var(--space-2); padding-top: var(--space-5); }\n.actionNote { flex: 1; min-width: 240px; font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); }\n.reject,\n.approve {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-4);\n border-radius: var(--radius-sm);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n}\n.reject { border: 1px solid var(--border-default); background: var(--bg-surface); color: var(--text-primary); }\n.reject:hover:not(:disabled) { border-color: var(--status-danger-solid); color: var(--status-danger-fg); }\n.approve { border: 1px solid var(--accent-500); background: var(--accent-500); color: var(--accent-contrast); }\n.approve:hover:not(:disabled) { background: var(--accent-600); border-color: var(--accent-600); }\n.reject:disabled,\n.approve:disabled { border-color: var(--border-default); background: var(--bg-surface); color: var(--text-disabled); cursor: not-allowed; }\n\n.decided { padding-top: var(--space-5); font-size: var(--text-sm-size); color: var(--text-secondary); }\n\n.empty { padding: var(--space-8) var(--space-6); font-size: var(--text-sm-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 62ch; }\n.emptyStrong { color: var(--text-primary); font-weight: var(--font-weight-medium); }\n.error { margin: var(--space-4); padding: var(--space-3); border: 1px solid var(--status-danger-solid); border-radius: var(--radius-sm); background: var(--status-danger-bg); color: var(--status-danger-fg); font-size: var(--text-sm-size); line-height: var(--text-sm-line); }\n.skeletons { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-4); }\n\n@media (max-width: 900px) {\n .layout { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(160px, 38%) minmax(0, 1fr); }\n .listPane { border-right: 0; border-bottom: 1px solid var(--border-subtle); }\n .detail { padding: var(--space-4) var(--space-4) var(--space-12); }\n}\n","/**\n * routes/verse/approvals/ApprovalDetail.tsx — everything a human needs before\n * deciding, and an approve path that cannot fire on one click.\n *\n * Reuses the inbox review machinery verbatim (`DiffViewer` + `diff-parser.ts`\n * + `highlight.ts`, and `ConfirmDialog`) rather than growing a second diff\n * renderer, per docs/VERSE-CONTRACT-V2.md.\n *\n * Two rules enforced here:\n * - **Judge evidence is epistemic.** A `judge-parse-failure` /\n * `judge-network-failure` is an infra failure, never a considered verdict,\n * and a degraded decisions-ledger read renders \"unknown\" via <Epistemic/>\n * instead of letting an empty array read as \"never judged\".\n * - **Nothing signed is ever printed.** Provenance shows WHETHER a proposal\n * carries a producer attestation, never the HMAC itself — the same rule\n * that keeps launcher commands and tokens off every Verse payload.\n */\nimport { useState } from 'react';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Epistemic } from '../../../components/primitives/Epistemic.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport type { DecisionEntry, JudgeDecisionReasonCode } from '../../../data/api-types.js';\nimport { hasMutationHold } from '../../../data/auth-store.js';\nimport { DispatchDisabledError } from '../../../data/client.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { approveProposal, rejectProposal } from '../../../data/mutations.js';\nimport { proposalDetailQuery } from '../../../data/queries.js';\nimport { ConfirmDialog } from '../../inbox/ConfirmDialog.js';\nimport { DiffViewer } from '../../inbox/DiffViewer.js';\n// Shell helpers, not autonomy/'s: 3.10 moves the Autonomy panels under Fleet\n// (C7), and the drawer that hosts this view must not break when they move.\nimport { describeActionError as describeControlError } from '../shell/guarded-action.js';\n// A pure text helper (no panel code): ISO instants → local time, \".;\" → \";\".\nimport { tidyProse } from '../autonomy/format.js';\nimport {\n describeApproveConsequence,\n describeDiffStats,\n engineOf,\n formatDiffStats,\n kindLabel,\n localStamp,\n longAgo,\n parseRunSummary,\n reachesRemote,\n readableTitle,\n repoName,\n} from './approvals-model.js';\nimport styles from './approvals.module.css';\n\nconst JUDGE_REASON_DISPLAY: Record<JudgeDecisionReasonCode, { label: string; tone: Tone }> = {\n 'judge-ship-would-merge': { label: 'Ship (would merge)', tone: 'success' },\n 'judge-ship-review-required': { label: 'Ship (review required)', tone: 'success' },\n 'judge-review': { label: 'Review', tone: 'warning' },\n 'judge-noise': { label: 'Noise', tone: 'neutral' },\n 'judge-harmful': { label: 'Harmful', tone: 'danger' },\n 'judge-verdict-unrecognized': { label: 'Unrecognized verdict', tone: 'unknown' },\n 'judge-parse-failure': { label: 'Judge parse failure — not a review', tone: 'unknown' },\n 'judge-network-failure': { label: 'Judge network failure — not a review', tone: 'unknown' },\n};\n\nfunction latestJudged(decisions: DecisionEntry[]): DecisionEntry | null {\n const judged = decisions.filter((d) => d.action === 'judged' && d.judgeReasonCode);\n if (judged.length === 0) return null;\n return judged.reduce((a, b) => (Date.parse(b.ts) > Date.parse(a.ts) ? b : a));\n}\n\ntype PendingAction = 'approve' | 'reject' | null;\n\nexport interface ApprovalDetailProps {\n id: string;\n dispatchEnabled: boolean;\n onDispatchDisabled: () => void;\n onDecided: () => void;\n}\n\nexport function ApprovalDetail({ id, dispatchEnabled, onDispatchDisabled, onDecided }: ApprovalDetailProps) {\n const query = useQuery(proposalDetailQuery(id));\n const [pendingAction, setPendingAction] = useState<PendingAction>(null);\n const [tokenPrompt, setTokenPrompt] = useState(false);\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [busy, setBusy] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n\n // Confirmation FIRST, then the token (SPEC-310C §1; the same order as the\n // Needs-you drawer's A / R keys — shell/guarded-action.tsx). An operator who\n // pressed Approve by mistake backs out at a prompt that says what is about\n // to happen, not at one asking for a secret.\n function requestAction(action: 'approve' | 'reject') {\n setActionError(null);\n setPendingAction(action);\n setConfirmOpen(true);\n }\n\n function closeTokenPrompt() {\n setTokenPrompt(false);\n // Live read — MutationTokenDialog closes synchronously after setToken().\n if (hasMutationHold()) {\n setConfirmOpen(true);\n void execute();\n } else {\n setPendingAction(null);\n }\n }\n\n function confirmAction() {\n if (!pendingAction) return;\n if (!hasMutationHold()) {\n setConfirmOpen(false);\n setTokenPrompt(true);\n return;\n }\n void execute();\n }\n\n async function execute() {\n if (!pendingAction) return;\n setBusy(true);\n setActionError(null);\n try {\n if (pendingAction === 'approve') await approveProposal(id);\n else await rejectProposal(id);\n setConfirmOpen(false);\n setPendingAction(null);\n onDecided();\n } catch (err) {\n if (err instanceof DispatchDisabledError) {\n setConfirmOpen(false);\n setPendingAction(null);\n onDispatchDisabled();\n } else {\n setActionError(describeControlError(err));\n }\n } finally {\n setBusy(false);\n }\n }\n\n if (query.status === 'loading') {\n return (\n <div className={styles.detail}>\n <SkeletonLine width=\"55%\" />\n <SkeletonLine width=\"30%\" />\n <SkeletonLine width=\"88%\" />\n </div>\n );\n }\n\n if (query.status === 'error' || !query.data) {\n return (\n <p className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Could not load this proposal.'}\n </p>\n );\n }\n\n const p = query.data;\n const evidence = p.decisionEvidence;\n const judged = latestJudged(evidence?.decisions ?? []);\n const judgeDisplay = judged?.judgeReasonCode ? JUDGE_REASON_DISPLAY[judged.judgeReasonCode] : null;\n const canDecide = p.status === 'pending' && dispatchEnabled;\n const engine = engineOf(p);\n const consequence = describeApproveConsequence(p.kind, p.repo);\n const title = readableTitle(p.title);\n const project = repoName(p.repo);\n const facts = parseRunSummary(p.summary);\n // The run facts are shown as stats; only what the summary says beyond them stays a sentence.\n const summaryText = facts ? facts.rest : p.summary ? tidyProse(p.summary) : null;\n\n return (\n <div className={styles.detail}>\n <header className={styles.detailHead}>\n <p className={styles.eyebrow}>\n {kindLabel(p.kind)}\n {title.eyebrow ? ` \\u00b7 ${title.eyebrow}` : ''}\n </p>\n {/* Two lines at most; the whole title (as the server sent it) is the tooltip. */}\n <h3 className={styles.detailTitle} title={p.title}>{title.text}</h3>\n <div className={styles.detailMeta}>\n <StatusBadge status={p.status} />\n {project ? (\n <span className={styles.project} title={p.repo ?? undefined}>{project}</span>\n ) : (\n <span>no repository</span>\n )}\n <span>{p.riskClass ? `${p.riskClass} risk` : 'risk unstated'}</span>\n {engine ? <code title=\"The model that produced this change\">{engine}</code> : null}\n <span title={localStamp(p.createdAt)}>created {longAgo(p.createdAt)}</span>\n {p.decidedAt ? <span title={localStamp(p.decidedAt)}>decided {longAgo(p.decidedAt)}</span> : null}\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n </div>\n {facts ? (\n <p className={styles.runFacts}>\n {/* aria-label on a plain span is ignored (a generic role cannot be\n named), so the glyphs are hidden and the sentence is real,\n visually-hidden text — NeedsYouRunFacts' pattern. */}\n <span className={styles.diffStats} aria-hidden=\"true\">\n {formatDiffStats(facts)}\n </span>\n <span className=\"visually-hidden\">{describeDiffStats(facts)}</span>\n <span aria-hidden=\"true\">·</span>\n <span className={styles.runSource} title={facts.sourceHint ?? undefined}>\n {facts.partial ? 'Partial \\u00b7 ' : ''}{facts.sourceLabel}\n </span>\n {engine === null ? (\n <>\n <span aria-hidden=\"true\">·</span>\n <code title=\"The model that produced this change\">{facts.model}</code>\n </>\n ) : null}\n </p>\n ) : null}\n {summaryText ? <p className={styles.summary}>{summaryText}</p> : null}\n </header>\n\n <section className={styles.block} aria-label=\"Evidence\">\n <h4 className={styles.blockTitle}>Evidence</h4>\n <dl className={styles.defs}>\n <dt>Judge verdict</dt>\n <dd>\n <Epistemic quality={evidence?.sourceQuality} label=\"judge verdict\">\n {judgeDisplay && judged?.judgeReasonCode ? (\n <StatusBadge status={judged.judgeReasonCode} tone={judgeDisplay.tone}>\n {judgeDisplay.label}\n </StatusBadge>\n ) : (\n <span className={styles.muted}>not yet judged</span>\n )}\n </Epistemic>\n </dd>\n\n <dt>Verification</dt>\n <dd>\n {p.verifyResult ? (\n <>\n <StatusBadge status={p.verifyResult.passed ? 'success' : 'failed'}>\n {p.verifyResult.passed ? 'passed' : 'failed'}\n </StatusBadge>\n {p.verifyResult.ran && p.verifyResult.ran.length > 0 ? (\n <span className={styles.muted}> · ran {p.verifyResult.ran.map((r) => r.kind).join(', ')}</span>\n ) : null}\n {!p.verifyResult.passed && p.verifyResult.failureCategory && p.verifyResult.failureCategory !== 'code' ? (\n <span className={styles.muted}> · {p.verifyResult.failureCategory} failure — the verifier itself, not the diff</span>\n ) : null}\n {p.verifyResult.failed && p.verifyResult.failed.length > 0 ? (\n <p className={styles.failedChecks}>failed: {p.verifyResult.failed.join(', ')}</p>\n ) : null}\n </>\n ) : (\n <span className={styles.muted}>not verified</span>\n )}\n </dd>\n\n {p.decisionReason ? (\n <>\n <dt>Decision reason</dt>\n <dd>{tidyProse(p.decisionReason)}</dd>\n </>\n ) : null}\n\n {p.evidenceOutcome ? (\n <>\n <dt>Gates</dt>\n <dd className={styles.muted}>\n {p.evidenceOutcome.gateCount ?? 0} gate{p.evidenceOutcome.gateCount === 1 ? '' : 's'}\n {p.evidenceOutcome.policyAction ? ` · policy ${p.evidenceOutcome.policyAction}` : ''}\n {p.evidenceOutcome.trustBasis ? ` · trust ${p.evidenceOutcome.trustBasis}` : ''}\n </dd>\n </>\n ) : null}\n\n {p.result ? (\n <>\n <dt>Result</dt>\n <dd>{tidyProse(p.result)}</dd>\n </>\n ) : null}\n </dl>\n </section>\n\n <section className={styles.block} aria-label=\"Provenance\">\n <h4 className={styles.blockTitle}>Provenance</h4>\n <dl className={styles.defs}>\n <dt>Produced by</dt>\n <dd>{engine ? <code>{engine}</code> : <span className={styles.muted}>unknown engine</span>}</dd>\n <dt>Origin</dt>\n <dd>{p.origin}</dd>\n {facts ? (\n <>\n <dt>How it was made</dt>\n <dd>\n <span title={facts.sourceHint ?? undefined}>{facts.sourceLabel}</span>\n {facts.sourceHint ? <p className={styles.hint}>{facts.sourceHint}</p> : null}\n </dd>\n </>\n ) : null}\n {p.repo ? (\n <>\n <dt>Repository</dt>\n <dd><code>{p.repo}</code></dd>\n </>\n ) : null}\n {p.workItemId ? (\n <>\n <dt>Work item</dt>\n <dd>\n <code>{p.workItemId}</code>\n </dd>\n </>\n ) : null}\n {p.runId ? (\n <>\n <dt>Run</dt>\n <dd>\n <code>{p.runId}</code>\n </dd>\n </>\n ) : null}\n <dt>Attestation</dt>\n <dd className={styles.muted}>\n {/* The signature itself is never rendered — only whether one exists. */}\n {p.producerProvenanceSig\n ? `signed by the sandboxed producer (v${p.producerProvenanceVersion ?? 2})`\n : p.provenanceSig\n ? 'legacy signature present'\n : 'unsigned — earns no positive routing credit'}\n {p.diffHash ? ' · diff hashed at signing time' : ''}\n </dd>\n </dl>\n </section>\n\n <section className={styles.block} aria-label=\"Diff\">\n <h4 className={styles.blockTitle}>Diff</h4>\n <DiffViewer diff={p.diff} proposalKind={p.kind} />\n </section>\n\n {p.status === 'pending' ? (\n <footer className={styles.actions}>\n <p className={styles.actionNote}>\n {dispatchEnabled ? consequence : 'Read-only session — approve and reject are unavailable without dispatch.'}\n </p>\n {actionError && !confirmOpen ? (\n <p className={styles.error} role=\"alert\">\n {actionError}\n </p>\n ) : null}\n <button type=\"button\" className={styles.reject} disabled={!canDecide || busy} onClick={() => requestAction('reject')}>\n Reject\n </button>\n <button type=\"button\" className={styles.approve} disabled={!canDecide || busy} onClick={() => requestAction('approve')}>\n Approve…\n </button>\n </footer>\n ) : (\n <footer className={styles.decided}>\n This proposal is already <strong>{p.status}</strong> — no further action is available.\n </footer>\n )}\n\n <MutationTokenDialog\n open={tokenPrompt}\n onClose={closeTokenPrompt}\n reason={\n pendingAction === 'approve'\n ? 'Approving a proposal writes to a real repository and requires the dispatch token.'\n : 'Rejecting a proposal requires the dispatch token.'\n }\n tokenHelp=\"the mutation token ashlr verse printed\"\n />\n\n <ConfirmDialog\n open={confirmOpen}\n onClose={() => {\n setConfirmOpen(false);\n setPendingAction(null);\n setActionError(null);\n }}\n title={\n pendingAction === 'approve'\n ? `Approve this ${p.kind} against ${project ?? 'the repository'}?`\n : 'Reject this proposal?'\n }\n body={\n pendingAction === 'approve' ? (\n <>\n <strong>{title.text}</strong>\n <br />\n {kindLabel(p.kind)} · <strong>{project ?? 'unknown repository'}</strong>\n {p.repo ? (\n <>\n <br />\n {/* The exact checkout the write lands in — the one place the full path belongs. */}\n <code>{p.repo}</code>\n </>\n ) : null}\n <br />\n <br />\n {consequence}\n {reachesRemote(p.kind) ? (\n <>\n <br />\n <br />\n This one leaves your machine.\n </>\n ) : null}\n </>\n ) : (\n <>\n This rejects <strong>{title.text}</strong> and discards it. It stays in history as rejected and is never\n applied.\n </>\n )\n }\n confirmLabel={pendingAction === 'approve' ? `Approve and ${reachesRemote(p.kind) ? 'open the pull request' : 'apply'}` : 'Reject'}\n // Approve is the irreversible one — a `pr` pushes a branch and opens a\n // real PR other people can see, a `patch` writes to disk now. Reject\n // only discards a proposal that stays in history. Putting the danger\n // styling on Reject trained the reflex that the red button is the safe\n // one; VERSE-CONTRACT-V2 calls Approve destructive explicitly.\n destructive={pendingAction === 'approve'}\n busy={busy}\n error={actionError}\n onConfirm={confirmAction}\n />\n </div>\n );\n}\n","/**\n * routes/verse/shell/needs-you-actions.ts — doing what a Needs-you item asks\n * (unit C1). One path for a drawer key (A / R / V / E), a drawer button and\n * the palette:\n *\n * 1. the action's route must be a same-origin `/api/` route\n * (isSafeApiRoute — checked again here, not only at the server's\n * producer boundary, because this is where the mutation token is sent);\n * 2. approve / reject / veto always confirm (the item's own copy, else a\n * generic one); other kinds only when the item carries copy;\n * 3. then the token, then the POST (guarded-action.tsx owns 2–3's order);\n * 4. on success the item is hidden at once (optimistic) and activity is\n * re-polled; it stays hidden until a poll no longer lists it, or 60 s.\n *\n * An action with no route (it needs Touch ID or a terminal) opens the item's\n * target instead — that is where the flow lives.\n */\nimport { useSyncExternalStore } from 'react';\nimport { isSafeApiRoute, type NeedsYouAction, type NeedsYouItem } from '../../../../core/verse/workbench-types.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate, invalidatePrefix } from '../../../data/cache.js';\nimport { ApiError, apiPost } from '../../../data/client.js';\nimport { requestGuarded } from './guarded-action.js';\nimport { ALWAYS_CONFIRM, confirmCopy, readableItemTitle } from './needs-you-model.js';\nimport { refreshActivity } from './useActivity.js';\n\n/** How long an acted-on item stays hidden while the server catches up. */\nexport const RESOLVED_HIDE_MS = 60_000;\n\nlet resolved = new Map<string, number>();\nconst listeners = new Set<() => void>();\n\nfunction emit(): void {\n for (const l of [...listeners]) l();\n}\n\nexport function markResolved(id: string, at: number = Date.now()): void {\n resolved = new Map(resolved).set(id, at);\n emit();\n}\n\n/** Drop marks the server has caught up with (the id is gone) or that are too old. */\nexport function pruneResolved(liveIds: ReadonlySet<string>, now: number = Date.now()): void {\n let changed = false;\n const next = new Map(resolved);\n for (const [id, at] of next) {\n if (!liveIds.has(id) || now - at > RESOLVED_HIDE_MS) {\n next.delete(id);\n changed = true;\n }\n }\n if (changed) {\n resolved = next;\n emit();\n }\n}\n\nexport function useResolvedIds(): ReadonlyMap<string, number> {\n return useSyncExternalStore(\n (l) => {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n () => resolved,\n () => resolved,\n );\n}\n\nexport function resetResolvedForTest(): void {\n resolved = new Map();\n emit();\n}\n\nexport interface ActionContext {\n /** Open the item's target (for an action with no route). */\n openTarget: (item: NeedsYouItem) => void;\n toast: (message: string, tone?: 'neutral' | 'success' | 'danger') => void;\n}\n\nfunction afterSuccess(item: NeedsYouItem): void {\n markResolved(item.id);\n if (item.source === 'approvals') {\n // The approvals list, the inbox badge and the proposal detail all read\n // these keys (data/mutations.ts approveProposal does the same).\n invalidate('inbox');\n invalidate('dashboard-snapshot');\n invalidatePrefix('inbox-list:');\n if (item.target.kind === 'approval') invalidate(`proposal-detail-${item.target.proposalId}`);\n }\n void refreshActivity();\n}\n\n/** Run `action` on `item` through confirm → token → POST. */\nexport function runNeedsYouAction(item: NeedsYouItem, action: NeedsYouAction, ctx: ActionContext): void {\n const request = action.request;\n if (!request) {\n ctx.openTarget(item);\n return;\n }\n if (!isSafeApiRoute(request.path)) {\n ctx.toast('That action points outside this app and was not sent.', 'danger');\n return;\n }\n const copy = confirmCopy(item, action);\n // The operator-facing title (\"fix the flaky snapshot test\"), not the raw\n // producer string (\"PR: fix the flaky snapshot test\") — same text the row shows.\n const title = readableItemTitle(item).text;\n const run = async () => {\n const token = getMutationToken();\n if (!token) throw new ApiError('Mutation token was rejected.', 401, request.path);\n await apiPost<unknown>(request.path, request.body, token);\n touchMutationHold();\n };\n const mustConfirm = ALWAYS_CONFIRM.has(action.kind) || copy !== null;\n requestGuarded({\n title: copy?.title ?? action.label,\n body: copy?.body ?? title,\n confirmLabel: copy?.confirmLabel ?? action.label,\n destructive: action.destructive,\n token: true,\n tokenReason: `${action.label} changes state on this machine and requires the dispatch token.`,\n skipConfirm: !mustConfirm,\n run,\n onDone: () => {\n afterSuccess(item);\n ctx.toast(`${action.label}: ${title}`, 'success');\n },\n onError: mustConfirm ? undefined : (message) => ctx.toast(message, 'danger'),\n });\n}\n","/**\n * routes/verse/shell/NeedsYouDrawer.tsx — ⌘J, the one inbox for everything\n * waiting on the operator (unit C1; SPEC-310C §1 \"Needs-you drawer\").\n *\n * splits All · Approvals · Fleet · Chats · Accounts (H / L)\n * list J / K move · ↩ open · A approve · R reject · V veto · E done\n * detail an approval reuses ApprovalDetail (diff, evidence, provenance);\n * anything else shows its argument, its deadline and its actions\n *\n * Every A / R / V goes through confirmation and then the mutation token\n * (needs-you-actions.ts → guarded-action.tsx) — keyboard triage is fast, but\n * never one keystroke from a real pull request.\n *\n * \"All clear\" is a claim, so it is only made for a split whose every producer\n * answered (needs-you-model splitCoverage). Otherwise the empty state names\n * who is not reporting — an empty list from a silent source is not good news.\n *\n * A right-hand sheet on a desktop window; a full-screen sheet below 480px.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button, IconButton } from '../../../components/primitives/Button.js';\nimport { useFocusTrap } from '../../../components/primitives/focus-trap.js';\nimport { IconExternalLink, IconX } from '../../../components/primitives/icons.js';\nimport { SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport { useToast } from '../../../components/primitives/Toast.js';\nimport type { VerseSeat } from '../../../data/api-types.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport {\n NEEDS_YOU_ACTION_KEYS,\n type NeedsYouActionKind,\n type NeedsYouItem,\n} from '../../../../core/verse/workbench-types.js';\nimport { ApprovalDetail } from '../approvals/ApprovalDetail.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { ReturnKeyIcon } from '../verse-icons.js';\nimport { verseBootstrapQuery } from '../verse-queries.js';\nimport {\n closeVerseOverlay,\n NEEDS_YOU_SPLITS,\n openVerseSession,\n sectionEntry,\n setVerseNeedsYouSplit,\n setVerseSection,\n type NeedsYouSplit,\n} from '../verse-ui-store.js';\nimport { matchCommand } from './command-catalog.js';\nimport { isGuardOpen } from './guarded-action.js';\nimport { markResolved, pruneResolved, runNeedsYouAction, useResolvedIds } from './needs-you-actions.js';\nimport {\n actionOf,\n describeSilence,\n itemsForSplit,\n needsYouRowView,\n runModelDisplayName,\n seatDisplayName,\n SPLIT_LABEL,\n splitCounts,\n splitCoverage,\n until,\n} from './needs-you-model.js';\nimport { NeedsYouList, NeedsYouRunFacts } from './NeedsYouList.js';\nimport { refreshActivity, useActivity } from './useActivity.js';\nimport { useViewport } from './viewport.js';\nimport styles from './NeedsYouDrawer.module.css';\n\n/** A section anchor for the surface an item points into (the shell reveals it: shell/reveal-anchor.ts). */\nexport { VERSE_ANCHOR_EVENT } from '../verse-ui-store.js';\n\nconst DRAWER_ACTION: Readonly<Record<string, NeedsYouActionKind>> = {\n 'drawer.approve': 'approve',\n 'drawer.reject': 'reject',\n 'drawer.veto': 'veto',\n 'drawer.done': 'done',\n};\n\nfunction isTextTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n return target.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(target.tagName);\n}\n\nexport function NeedsYouDrawer() {\n const ui = useVerseUi();\n const activity = useActivity();\n const toast = useToast();\n const bootstrap = useQuery(verseBootstrapQuery);\n const { compact } = useViewport();\n const resolved = useResolvedIds();\n const titleId = useId();\n const panelRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const detailRef = useRef<HTMLDivElement>(null);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [detailId, setDetailId] = useState<string | null>(null);\n const [dispatchDenied, setDispatchDenied] = useState(false);\n const [now, setNow] = useState(() => Date.now());\n\n // Countdowns (\"closes in 24m\") tick while the drawer is open; nothing else re-renders.\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), 15_000);\n return () => clearInterval(id);\n }, []);\n\n const data = activity.data;\n const liveItems = data?.needsYou;\n useEffect(() => {\n if (liveItems) pruneResolved(new Set(liveItems.map((i) => i.id)));\n }, [liveItems]);\n\n const all = useMemo(() => (liveItems ?? []).filter((i) => !resolved.has(i.id)), [liveItems, resolved]);\n const split = ui.needsYouSplit;\n const items = useMemo(() => itemsForSplit(all, split), [all, split]);\n const counts = useMemo(() => splitCounts(all), [all]);\n const coverage = splitCoverage(data?.sources ?? null, split);\n const dispatchEnabled = (bootstrap.data?.dispatchEnabled ?? true) && !dispatchDenied;\n\n // Open on the item the palette / a notification asked for.\n const focusId = ui.needsYouFocus;\n useEffect(() => {\n if (!focusId) return;\n const item = all.find((i) => i.id === focusId);\n if (!item) return;\n setSelectedId(item.id);\n setDetailId(item.id);\n }, [focusId, all]);\n\n // Keep the selection on a real row as items come and go.\n useEffect(() => {\n if (items.length === 0) {\n if (selectedId !== null) setSelectedId(null);\n return;\n }\n if (!selectedId || !items.some((i) => i.id === selectedId)) setSelectedId(items[0]!.id);\n }, [items, selectedId]);\n\n const detailItem = detailId ? all.find((i) => i.id === detailId) ?? null : null;\n useEffect(() => {\n // The item was resolved (here or elsewhere) while open: back to the list.\n if (detailId && !detailItem) setDetailId(null);\n }, [detailId, detailItem]);\n\n const closeDetail = useCallback(() => setDetailId(null), []);\n\n const trapClose = useCallback(() => {\n // Esc in a dialog opened FROM the drawer (a confirmation, the token\n // prompt) belongs to that dialog: every trap hears Escape, and this one\n // registered first.\n if (isGuardOpen() || document.querySelector('[aria-modal=\"true\"]:not([data-verse-overlay])')) return;\n if (detailId) closeDetail();\n else closeVerseOverlay();\n }, [detailId, closeDetail]);\n useFocusTrap({ open: true, containerRef: panelRef, onClose: trapClose, initialFocusRef: listRef });\n\n // Focus follows the view: into the detail when it opens, back to the list\n // when it closes (not on first mount — the focus trap places that).\n const detailWasOpen = useRef(false);\n useEffect(() => {\n if (detailId) {\n detailWasOpen.current = true;\n detailRef.current?.focus({ preventScroll: true });\n } else if (detailWasOpen.current) {\n detailWasOpen.current = false;\n listRef.current?.focus({ preventScroll: true });\n }\n }, [detailId]);\n\n // The list usually arrives AFTER the drawer opened (the first poll): the\n // trap focused the placeholder, which is then removed and focus falls to\n // <body>. Hand it to the list — unless the operator has moved it anywhere\n // real (a dialog opened from the drawer lives outside this panel).\n const hasItems = items.length > 0;\n useEffect(() => {\n if (!hasItems || detailId) return;\n const active = document.activeElement;\n if (active === null || active === document.body || active === panelRef.current) listRef.current?.focus({ preventScroll: true });\n }, [hasItems, detailId]);\n\n const openTarget = useCallback((item: NeedsYouItem) => {\n const target = item.target;\n switch (target.kind) {\n case 'approval':\n setSelectedId(item.id);\n setDetailId(item.id);\n return;\n case 'session':\n closeVerseOverlay();\n openVerseSession(target.sessionId);\n return;\n case 'section':\n closeVerseOverlay();\n setVerseSection(target.section, target.anchor);\n return;\n case 'seat':\n closeVerseOverlay();\n setVerseSection('apps', `seat:${target.seatId}`);\n return;\n case 'url':\n // https only (isNeedsYouItem), a new browsing context with no opener.\n window.open(target.url, '_blank', 'noopener,noreferrer');\n return;\n default:\n return;\n }\n }, []);\n\n const act = useCallback((item: NeedsYouItem, kind: NeedsYouActionKind) => {\n const action = actionOf(item, kind);\n if (!action) {\n toast.show(`Nothing to ${kind} on this item.`, 'neutral');\n return;\n }\n if (!dispatchEnabled && action.request) {\n toast.show('This server was started without dispatch — run `ashlr verse` to act.', 'neutral');\n return;\n }\n runNeedsYouAction(item, action, { openTarget, toast: toast.show });\n }, [dispatchEnabled, openTarget, toast]);\n\n function move(delta: 1 | -1) {\n if (items.length === 0) return;\n const at = Math.max(0, items.findIndex((i) => i.id === selectedId));\n const next = items[(at + delta + items.length) % items.length]!;\n setSelectedId(next.id);\n if (detailId) setDetailId(next.id);\n }\n\n function stepSplit(delta: 1 | -1) {\n const at = NEEDS_YOU_SPLITS.indexOf(split);\n const next = NEEDS_YOU_SPLITS[(at + delta + NEEDS_YOU_SPLITS.length) % NEEDS_YOU_SPLITS.length]!;\n setVerseNeedsYouSplit(next);\n setDetailId(null);\n }\n\n function onKeyDown(event: ReactKeyboardEvent<HTMLDivElement>) {\n if (event.defaultPrevented || isTextTarget(event.target)) return;\n // React bubbles through portals: a key typed in a dialog ApprovalDetail\n // opened (rendered outside this panel's DOM) is not a triage key.\n if (!(event.target instanceof Node) || !panelRef.current?.contains(event.target)) return;\n const command = matchCommand(event.nativeEvent, ['drawer']);\n if (!command) return;\n // A button inside the detail answers Enter itself; the drawer's Enter is\n // for the list.\n if (command.id === 'drawer.open' && event.target instanceof HTMLButtonElement) return;\n event.preventDefault();\n event.stopPropagation();\n const current = items.find((i) => i.id === (detailId ?? selectedId)) ?? null;\n switch (command.id) {\n case 'drawer.next':\n move(1);\n return;\n case 'drawer.prev':\n move(-1);\n return;\n case 'drawer.split-next':\n stepSplit(1);\n return;\n case 'drawer.split-prev':\n stepSplit(-1);\n return;\n case 'drawer.open':\n if (current) setDetailId(current.id);\n return;\n default: {\n const kind = DRAWER_ACTION[command.id];\n if (kind && current) act(current, kind);\n }\n }\n }\n\n const loading = !data && (activity.status === 'loading' || activity.status === 'idle');\n const unavailable = !data && activity.status === 'unavailable';\n\n return createPortal(\n <div className={styles.backdrop} onMouseDown={(e) => e.target === e.currentTarget && closeVerseOverlay()}>\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n className={styles.panel}\n data-presentation={compact ? 'full' : 'side'}\n data-verse-overlay=\"needs-you\"\n data-scope=\"drawer\"\n tabIndex={-1}\n onKeyDown={onKeyDown}\n >\n <header className={styles.head}>\n <h2 id={titleId} className={styles.title}>\n Needs you\n {data ? <span className={styles.titleCount}>{counts.all}</span> : null}\n </h2>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconX />} aria-label=\"Close Needs you\" onClick={closeVerseOverlay} />\n </header>\n\n <div\n role=\"tablist\"\n aria-label=\"Splits\"\n className={styles.splits}\n onKeyDown={(e) => {\n if (e.key !== 'ArrowRight' && e.key !== 'ArrowLeft') return;\n e.preventDefault();\n stepSplit(e.key === 'ArrowRight' ? 1 : -1);\n }}\n >\n {NEEDS_YOU_SPLITS.map((s: NeedsYouSplit) => (\n <button\n key={s}\n type=\"button\"\n role=\"tab\"\n aria-selected={s === split}\n tabIndex={s === split ? 0 : -1}\n className={styles.split}\n onClick={() => {\n setVerseNeedsYouSplit(s);\n setDetailId(null);\n }}\n >\n {SPLIT_LABEL[s]}\n <span className={styles.splitCount} aria-label={`${counts[s]} items`}>{counts[s]}</span>\n </button>\n ))}\n </div>\n\n <div className={styles.body}>\n {detailItem ? (\n <div ref={detailRef} className={styles.detail} tabIndex={-1} aria-label=\"Item detail\">\n <button type=\"button\" className={styles.back} onClick={closeDetail}>\n ‹ All {SPLIT_LABEL[split].toLowerCase()}\n </button>\n {detailItem.target.kind === 'approval' ? (\n <div className={styles.approval}>\n <ApprovalDetail\n key={detailItem.target.proposalId}\n id={detailItem.target.proposalId}\n dispatchEnabled={dispatchEnabled}\n onDispatchDisabled={() => setDispatchDenied(true)}\n onDecided={() => {\n markResolved(detailItem.id);\n void refreshActivity();\n closeDetail();\n }}\n />\n </div>\n ) : (\n <ItemDetail item={detailItem} now={now} seats={bootstrap.data?.seats ?? NO_SEATS} onAct={act} onOpenTarget={openTarget} dispatchEnabled={dispatchEnabled} />\n )}\n </div>\n ) : loading ? (\n <div className={styles.loading} role=\"status\" aria-label=\"Loading\">\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : unavailable ? (\n <div className={styles.empty}>\n <p className={styles.emptyTitle}>Needs you isn't available on this server</p>\n <p className={styles.emptyBody}>This build does not report activity yet, so nothing here can be vouched for. Approvals still work from the inbox.</p>\n </div>\n ) : items.length === 0 ? (\n <EmptySplit coverageText={describeSilence(coverage)} vouched={coverage.vouched} autonomyLabel={data?.autonomy?.label ?? null} split={split} />\n ) : (\n <NeedsYouList\n ref={listRef}\n items={items}\n selectedId={selectedId}\n onSelect={setSelectedId}\n // A click (or a tap — a phone has no J / K) opens the item;\n // the keyboard moves the selection without opening.\n onOpen={(id) => {\n setSelectedId(id);\n setDetailId(id);\n }}\n now={now}\n label={`${SPLIT_LABEL[split]} needing you`}\n />\n )}\n {/* The list holds the initial focus; with no list, the panel does. */}\n {items.length === 0 && !detailItem ? <div ref={listRef} tabIndex={-1} className={styles.focusSink} aria-hidden=\"true\" /> : null}\n </div>\n\n {!compact ? (\n <footer className={styles.foot} aria-hidden=\"true\">\n <span><kbd className={styles.key}>J</kbd><kbd className={styles.key}>K</kbd> move</span>\n <span><kbd className={styles.key}><ReturnKeyIcon /></kbd> open</span>\n <span><kbd className={styles.key}>A</kbd> approve</span>\n <span><kbd className={styles.key}>R</kbd> reject</span>\n <span><kbd className={styles.key}>V</kbd> veto</span>\n <span><kbd className={styles.key}>E</kbd> done</span>\n <span><kbd className={styles.key}>H</kbd><kbd className={styles.key}>L</kbd> splits</span>\n </footer>\n ) : null}\n {!coverage.vouched && items.length > 0 ? (\n <p className={styles.caveat} role=\"note\">{describeSilence(coverage)} — this list may be incomplete.</p>\n ) : null}\n </div>\n </div>,\n document.body,\n );\n}\n\nfunction EmptySplit({ vouched, coverageText, autonomyLabel, split }: { vouched: boolean; coverageText: string; autonomyLabel: string | null; split: NeedsYouSplit }) {\n if (vouched) {\n return (\n <div className={styles.empty} data-state=\"clear\">\n <span className={styles.clearMark} aria-hidden=\"true\" />\n <p className={styles.emptyTitle}>All clear</p>\n <p className={styles.emptyBody}>{autonomyLabel ? `Fleet: ${autonomyLabel}.` : 'Nothing is waiting on you.'}</p>\n </div>\n );\n }\n return (\n <div className={styles.empty} data-state=\"unknown\">\n <p className={styles.emptyTitle}>Nothing to show{split === 'all' ? '' : ` in ${SPLIT_LABEL[split]}`} — but it isn't an all-clear</p>\n <p className={styles.emptyBody}>{coverageText}.</p>\n </div>\n );\n}\n\nconst TARGET_LABEL = (item: NeedsYouItem): string | null => {\n switch (item.target.kind) {\n case 'session':\n return 'Open chat';\n case 'section':\n return `Open ${sectionEntry(item.target.section).label}`;\n case 'seat':\n return 'Open Apps & Accounts';\n case 'url':\n return 'Open on GitHub';\n default:\n return null;\n }\n};\n\nconst NO_SEATS: readonly VerseSeat[] = [];\n\nfunction ItemDetail({\n item,\n now,\n seats,\n onAct,\n onOpenTarget,\n dispatchEnabled,\n}: {\n item: NeedsYouItem;\n now: number;\n /** The roster (bootstrap), for naming the item's seat and its run's model. */\n seats: readonly VerseSeat[];\n onAct: (item: NeedsYouItem, kind: NeedsYouActionKind) => void;\n onOpenTarget: (item: NeedsYouItem) => void;\n dispatchEnabled: boolean;\n}) {\n const targetLabel = TARGET_LABEL(item);\n // The same readable text as the row (needs-you-model needsYouRowView), with room for the whole title.\n const view = needsYouRowView(item, now);\n // \"Claude Max\" and \"Fable 5.1\", never `claude-a` / `claude:claude-fable-5-1`\n // — the ids ride in tooltips (monospace only when the id is all we have).\n const seat = item.subject.seatId ? seatDisplayName(seats, item.subject.seatId) : null;\n const model = view.run ? runModelDisplayName(seats, view.run.model, item.subject.seatId) : null;\n return (\n <article className={styles.item}>\n <header className={styles.itemHead}>\n {view.kindLabel ? <p className={styles.rowKind}>{view.kindLabel}</p> : null}\n <h3 className={styles.itemTitle} title={view.fullTitle}>{view.title}</h3>\n {view.run ? <NeedsYouRunFacts run={view.run} /> : null}\n </header>\n {view.detail ? <p className={styles.itemDetail}>{view.detail}</p> : null}\n <dl className={styles.defs}>\n {view.repo ? (<><dt>Repo</dt><dd className={styles.repo} title={view.repoFull}>{view.repo}</dd></>) : null}\n {item.subject.pr ? (<><dt>Pull request</dt><dd>#{item.subject.pr}</dd></>) : null}\n {seat ? (<><dt>Seat</dt><dd className={seat.raw ? undefined : styles.mono} title={seat.raw}>{seat.text}</dd></>) : null}\n {model ? (<><dt>Model</dt><dd className={model.raw ? undefined : styles.mono} title={model.raw}>{model.text}</dd></>) : null}\n <dt>Raised</dt>\n <dd title={view.ageStamp}>{view.age}</dd>\n {item.expiresAt ? (<><dt>Closes</dt><dd className={styles.deadline}>{until(item.expiresAt, now)}</dd></>) : null}\n </dl>\n <div className={styles.itemActions}>\n {targetLabel ? (\n <Button variant=\"subtle\" size=\"sm\" onClick={() => onOpenTarget(item)} trailingIcon={item.target.kind === 'url' ? <IconExternalLink /> : undefined}>\n {targetLabel}\n </Button>\n ) : null}\n {item.actions.map((action) => {\n const key = NEEDS_YOU_ACTION_KEYS[action.kind];\n const needsDispatch = action.request !== null;\n return (\n <Button\n key={action.kind}\n size=\"sm\"\n variant={action.destructive ? 'danger' : action.kind === 'approve' ? 'primary' : 'subtle'}\n disabled={needsDispatch && !dispatchEnabled}\n onClick={() => onAct(item, action.kind)}\n aria-keyshortcuts={key}\n >\n {action.label}\n {key ? <kbd className={styles.inlineKey} aria-hidden=\"true\">{key}</kbd> : null}\n </Button>\n );\n })}\n </div>\n {!dispatchEnabled ? <p className={styles.caveat}>Read-only session — actions need `ashlr verse`.</p> : null}\n </article>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._backdrop_r8c4w_4{z-index:var(--z-dialog);background:var(--bg-overlay);animation:_fade_r8c4w_1 var(--duration-fast) var(--ease-standard);justify-content:flex-end;display:flex;position:fixed;inset:0}._panel_r8c4w_14{width:min(480px, calc(100vw - var(--space-8)));background:var(--bg-surface);border-left:1px solid var(--border-default);height:100%;box-shadow:var(--shadow-dialog);animation:_slide_r8c4w_1 var(--duration-base) var(--ease-decelerate);outline:none;flex-direction:column;display:flex}._panel_r8c4w_14[data-presentation=full]{border-left:0;width:100%;animation-name:_rise_r8c4w_1}._head_r8c4w_33{justify-content:space-between;align-items:center;gap:var(--space-3);min-height:var(--strip-height);padding:var(--space-2) var(--space-3) var(--space-2) var(--space-4);border-bottom:1px solid var(--border-subtle);display:flex}._title_r8c4w_43{align-items:baseline;gap:var(--space-2);font-family:var(--font-display);font-size:var(--text-md-size);line-height:var(--text-md-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-display);display:flex}._titleCount_r8c4w_54{font-family:var(--font-ui);font-size:var(--text-sm-size);font-weight:var(--font-weight-regular);font-variant-numeric:tabular-nums;color:var(--text-tertiary)}._splits_r8c4w_62{gap:var(--space-1);padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--border-subtle);scrollbar-width:none;display:flex;overflow-x:auto}._split_r8c4w_62{align-items:center;gap:var(--space-1);min-height:var(--control-h-sm);padding:0 var(--space-2);border-radius:var(--radius-sm);color:var(--text-secondary);font-size:var(--text-sm-size);line-height:var(--text-sm-line);flex:none;display:inline-flex}._split_r8c4w_62:hover{background:var(--bg-hover);color:var(--text-primary)}._split_r8c4w_62[aria-selected=true]{background:var(--bg-selected);color:var(--text-primary);font-weight:var(--font-weight-medium)}._splitCount_r8c4w_86{border-radius:var(--radius-full);background:var(--bg-hover);min-width:18px;font-size:var(--text-2xs-size);text-align:center;font-variant-numeric:tabular-nums;color:var(--text-secondary);padding:0 4px;line-height:18px}._body_r8c4w_98{overscroll-behavior:contain;flex:1;min-height:0;position:relative;overflow-y:auto}._rows_r8c4w_106{outline:none}._rows_r8c4w_106:focus-visible{box-shadow:none}._rows_r8c4w_106:focus-visible ._row_r8c4w_106[aria-selected=true]{box-shadow:inset 0 0 0 2px var(--border-focus)}._row_r8c4w_106{column-gap:var(--space-3);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--border-subtle);cursor:pointer;grid-template-columns:2px minmax(0,1fr) auto;align-items:center;display:grid}._row_r8c4w_106:hover{background:var(--bg-hover)}._row_r8c4w_106[aria-selected=true]{background:var(--bg-selected)}._rule_r8c4w_125{border-radius:var(--radius-full);background:var(--border-strong);align-self:stretch}._row_r8c4w_106[data-severity=high] ._rule_r8c4w_125{background:var(--status-danger-solid)}._row_r8c4w_106[data-severity=warn] ._rule_r8c4w_125{background:var(--status-warning-solid)}._rowMain_r8c4w_133{flex-direction:column;gap:2px;min-width:0;display:flex}._rowKind_r8c4w_138{font-family:var(--font-display);font-size:var(--text-2xs-size);line-height:var(--text-2xs-line);letter-spacing:var(--tracking-label);text-transform:uppercase;color:var(--text-secondary);margin:0}._rowTitle_r8c4w_151{-webkit-line-clamp:2;line-clamp:2;overflow-wrap:break-word;font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-primary);-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}._runFacts_r8c4w_164{align-items:baseline;gap:0 var(--space-2);font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);flex-wrap:wrap;display:flex}._diffStats_r8c4w_173{font-family:var(--font-display);font-variant-numeric:tabular-nums;color:var(--text-primary)}._runSource_r8c4w_174[title]{text-underline-offset:3px;cursor:help;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}._repo_r8c4w_176{font-weight:var(--font-weight-medium)}._rowMeta_r8c4w_178{gap:0 var(--space-2);font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);flex-wrap:wrap;display:flex}._severity_r8c4w_187{font-family:var(--font-display);font-size:var(--text-2xs-size);letter-spacing:var(--tracking-label);text-transform:uppercase}._severity_r8c4w_187[data-severity=high]{color:var(--status-danger-fg)}._severity_r8c4w_187[data-severity=warn]{color:var(--status-warning-fg)}._mono_r8c4w_196{font-family:var(--font-mono);font-size:var(--text-xs-size)}._deadline_r8c4w_197{color:var(--status-warning-fg);font-variant-numeric:tabular-nums}._rowKeys_r8c4w_199{gap:2px;display:flex}._key_r8c4w_201,._inlineKey_r8c4w_202{border:1px solid var(--border-subtle);border-radius:var(--radius-xs);background:var(--bg-surface);min-width:18px;height:18px;font-family:var(--font-mono);font-size:var(--text-2xs-size);color:var(--text-secondary);justify-content:center;align-items:center;padding:0 4px;display:inline-flex}._inlineKey_r8c4w_202{margin-left:var(--space-2);background:0 0}._loading_r8c4w_218{gap:var(--space-2);padding:var(--space-4);flex-direction:column;display:flex}._empty_r8c4w_220{align-items:center;gap:var(--space-2);padding:var(--space-16) var(--space-6);text-align:center;flex-direction:column;display:flex}._emptyTitle_r8c4w_228{font-family:var(--font-display);font-size:var(--text-md-size);line-height:var(--text-md-line);font-weight:var(--font-weight-semibold);color:var(--text-primary)}._emptyBody_r8c4w_235{max-width:44ch;font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-secondary)}._clearMark_r8c4w_243{width:40px;height:40px;margin-bottom:var(--space-2);border-radius:var(--radius-full);background:var(--status-success-bg);position:relative}._clearMark_r8c4w_243:after{content:"";border:solid var(--status-success-solid);border-width:0 2px 2px 0;width:10px;height:16px;position:absolute;top:10px;left:14px;transform:rotate(45deg)}._focusSink_r8c4w_263{outline:none;width:1px;height:1px;position:absolute;overflow:hidden}._detail_r8c4w_265{outline:none}._back_r8c4w_4{margin:var(--space-2) var(--space-3) 0;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);font-size:var(--text-xs-size);color:var(--text-secondary);align-items:center;display:inline-flex}._back_r8c4w_4:hover{background:var(--bg-hover);color:var(--text-primary)}._approval_r8c4w_279>div{padding:var(--space-3) var(--space-4) var(--space-12)}._item_r8c4w_281{gap:var(--space-4);padding:var(--space-3) var(--space-4) var(--space-8);flex-direction:column;display:flex}._itemHead_r8c4w_282{gap:var(--space-1);flex-direction:column;display:flex}._itemTitle_r8c4w_284{font-family:var(--font-display);font-size:var(--text-lg-size);line-height:var(--text-lg-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-display)}._itemDetail_r8c4w_292{font-size:var(--text-sm-size);line-height:var(--text-sm-line-relaxed);color:var(--text-secondary);overflow-wrap:anywhere}._defs_r8c4w_299{gap:var(--space-2) var(--space-4);font-size:var(--text-sm-size);line-height:var(--text-sm-line);grid-template-columns:max-content minmax(0,1fr);margin:0;display:grid}._defs_r8c4w_299 dt{color:var(--text-tertiary)}._defs_r8c4w_299 dd{overflow-wrap:anywhere;min-width:0;margin:0}._itemActions_r8c4w_310{gap:var(--space-2);flex-wrap:wrap;display:flex}._foot_r8c4w_312{gap:var(--space-1) var(--space-4);padding:var(--space-2) var(--space-4);border-top:1px solid var(--border-subtle);font-size:var(--text-2xs-size);line-height:var(--text-2xs-line);color:var(--text-tertiary);flex-wrap:wrap;display:flex}._foot_r8c4w_312 span{align-items:center;gap:2px;display:inline-flex}._caveat_r8c4w_324{padding:var(--space-2) var(--space-4);border-top:1px solid var(--border-subtle);font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--status-warning-fg);background:var(--status-warning-bg);margin:0}@keyframes _fade_r8c4w_1{0%{opacity:0}}@keyframes _slide_r8c4w_1{0%{opacity:0;transform:translate(4px)}}@keyframes _rise_r8c4w_1{0%{opacity:0;transform:translateY(4px)}}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._backdrop_r8c4w_4,:root:not([data-motion=full]) ._panel_r8c4w_14{animation:none}}:root[data-motion=reduce] ._backdrop_r8c4w_4,:root[data-motion=reduce] ._panel_r8c4w_14{animation:none}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,c as t,n}from"./index-BG177cPN.js";import{Ut as r,Wt as i}from"./VerseConsoleApp-DeuBEvAO.js";import{h as a,n as o,p as s,v as c}from"./verse-model-CSzzdyu2.js";var l=t(e(),1);function u(e,t){let n=p(t)??`the target repository`;switch(e){case`pr`:return`Pushes a branch to ${n}'s remote and opens a real pull request. Other people can see it immediately, and this dialog cannot undo it.`;case`patch`:return`Writes the diff to ${n} on disk now. Nothing is pushed, but the working tree changes.`;default:return`Applies this ${String(e)} proposal to ${n} now.`}}function d(e){return e===`pr`}function f(e){return e.engineModel?e.engineModel:e.engineTier?e.engineTier:null}function p(e){if(typeof e!=`string`)return null;let t=e.trim().replace(/\/+$/,``);if(t.length===0)return null;let n=t.slice(t.lastIndexOf(`/`)+1);return n.length>0?n:t}var m={patch:`Patch`,pr:`Pull request`,deploy:`Deploy`,note:`Note`,"desktop-action":`Desktop action`,"browser-action":`Browser action`};function h(e){return m[e]??String(e)}function g(e){return e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1)}function _(e){let t=e.toLowerCase();return Object.prototype.hasOwnProperty.call(o,t)?o[t]:g(t)}function v(e){let t=e;return(t.match(/"/g)??[]).length%2==1&&(t+=`"`),(t.match(/\u201c/g)??[]).length>(t.match(/\u201d/g)??[]).length&&(t+=`”`),t}function y(e){let t=e.replace(/(?:\u2026|\.\.\.)$/,``),n=t.lastIndexOf(` `);return`${(n>0?t.slice(0,n):t).replace(/[\s,;:\-\u2013\u2014]+$/,``)}\u2026`}function b(e){let t=typeof e==`string`?e.trim():``,n=/^(\[partial\]\s*)?(claude|codex|grok|local|ollama|gemini|api[\w-]*) run:\s*(.*)$/is.exec(t),r=n?`${n[1]?`Partial `:``}${_(n[2])} run`:null,i=n?n[3]:t,a=/[\p{L}\p{N}](?:\u2026|\.\.\.)$/u.test(i),o=n!==null&&i.length>=80&&!/[.!?)"'\u201d\u2026]$/.test(i),s=a||o;return s&&(i=y(i)),i=v(i),{eyebrow:r,text:i.length>0?i:t,truncated:s}}var x=/^(Partial )?(.+?) (\S+) run produced (\d+) file\(s\) \(\+(\d+)\/-(\d+)\)\.?\s*([\s\S]*)$/,S=`TITRR — Test, Iterate, Test, Refine, Repeat: after its change the run re-ran the repository’s tests and repaired the change until they passed or it ran out of attempts.`;function C(e){if(/\bTITRR\b/.test(e)){let t=e.replace(/\bTITRR\b\s*/,``).trim();return{label:`Test-and-repair loop${t===`api-model`?` (API model)`:t===`api-model required-diff`?` (API model, retried for a missing diff)`:t===`api-model failed producer`?` (API model, producer failed)`:t.length>0?` (${t})`:``}`,hint:S}}return/^best-of-n/i.test(e)?{label:e,hint:`Several models attempted this change in parallel; a judge compared them.`}:e===`api-model`?{label:`API model run`,hint:null}:e===`Sandboxed`?{label:`Sandboxed run`,hint:`Produced in an isolated sandbox checkout; nothing touched your working tree.`}:{label:e,hint:null}}function w(e){if(typeof e!=`string`)return null;let t=x.exec(e.trim());if(!t)return null;let{label:n,hint:r}=C(t[2]),i=t[7].trim();return{partial:t[1]!==void 0,source:t[2],sourceLabel:n,sourceHint:r,model:t[3],files:Number(t[4]),insertions:Number(t[5]),deletions:Number(t[6]),rest:i.length>0?i:null}}function T(e){let t=e=>e.toLocaleString(`en-US`);return`${t(e.files)} ${e.files===1?`file`:`files`} \u00b7 +${t(e.insertions)} \u2212${t(e.deletions)}`}function E(e){let t=e=>e.toLocaleString(`en-US`);return`${t(e.files)} ${e.files===1?`file`:`files`} changed, ${t(e.insertions)} ${e.insertions===1?`line`:`lines`} added, ${t(e.deletions)} removed`}function D(e,t=Date.now()){if(typeof e!=`string`)return`at an unknown time`;let n=Date.parse(e);if(!Number.isFinite(n))return`at an unknown time`;let r=Math.max(0,Math.round((t-n)/1e3));if(r<45)return`just now`;let i=new Intl.RelativeTimeFormat(`en`,{numeric:`auto`}),a=Math.round(r/60);if(a<60)return i.format(-a,`minute`);let o=Math.round(a/60);if(o<24)return i.format(-o,`hour`);let s=Math.round(o/24);return s<=60?i.format(-s,`day`):`on ${new Date(n).toLocaleDateString(`en-US`,{month:`short`,day:`numeric`,year:`numeric`})}`}function O(e){if(typeof e!=`string`)return;let t=Date.parse(e);if(Number.isFinite(t))return new Date(t).toLocaleString([],{weekday:`short`,month:`short`,day:`numeric`,year:`numeric`,hour:`numeric`,minute:`2-digit`})}var k={all:`All`,approvals:`Approvals`,fleet:`Fleet`,chats:`Chats`,accounts:`Accounts`},A={all:[`approvals`,`authority`,`fleet`,`leader`,`chats`,`accounts`],approvals:[`approvals`,`fleet`,`leader`],fleet:[`authority`,`fleet`,`leader`],chats:[`chats`],accounts:[`accounts`]},j={approvals:`the approvals inbox`,authority:`the autonomy grant`,fleet:`the fleet`,leader:`the Leader`,chats:`chats`,accounts:`account health`};function M(e,t){return t===`all`?[...e]:e.filter(e=>i[e.kind]===t)}function N(e){let t={all:e.length,approvals:0,fleet:0,chats:0,accounts:0};for(let n of e)t[i[n.kind]]+=1;return t}function P(e,t){let n=[];for(let r of A[t]){let t=e?.[r]??`unavailable`;t!==`ok`&&n.push({source:r,name:j[r],state:t})}return{vouched:n.length===0,silent:n}}function F(e){let t=e.silent.map(e=>e.state===`error`?`${e.name} failed to answer`:`${e.name} isn't reporting in this build`);return t.length===0?``:t.length===1?I(t[0]):I(`${t.slice(0,-1).join(`, `)} and ${t[t.length-1]}`)}function I(e){return e.charAt(0).toUpperCase()+e.slice(1)}var L=new Set([`approve`,`reject`,`veto`]);function R(e,t){return e.actions.find(e=>e.kind===t)??null}var z={approve:{title:`Approve this?`,confirmLabel:`Approve`},reject:{title:`Reject this?`,confirmLabel:`Reject`},veto:{title:`Veto this action?`,confirmLabel:`Veto`}};function B(e,t){if(t.confirm)return t.confirm;if(t.kind===`approve`||t.kind===`reject`||t.kind===`veto`){let n=z[t.kind];return{title:n.title,body:H(e).text,confirmLabel:n.confirmLabel}}return null}var V=/^(PR|[a-z][a-z-]*):\s+([\s\S]+)$/;function H(e){let t=null,n=e.title;if(e.kind===`approval`){let r=V.exec(e.title.trim());r&&(t=r[1]===`PR`?`pr`:r[1],n=r[2])}let r=b(n),i=[t===null?null:h(t),r.eyebrow].filter(e=>e!==null);return{kindLabel:i.length>0?i.join(` · `):null,text:r.text}}function U(e,t=Date.now()){let n=H(e),r=w(e.detail),i=p(e.subject.repo);return{kindLabel:n.kindLabel,title:n.text,fullTitle:e.title,run:r?{stats:T(r),statsSpoken:E(r),source:r.sourceLabel,sourceHint:r.sourceHint,partial:r.partial,model:r.model}:null,detail:r?r.rest:e.detail,repo:i,repoFull:i!==null&&e.subject.repo!==null&&e.subject.repo!==i?e.subject.repo:void 0,age:D(e.since,t),ageStamp:O(e.since)}}function W(e,t=Date.now()){let n=Date.parse(e);if(!Number.isFinite(n))return`—`;let r=Math.round((n-t)/1e3);if(r<=0)return`expired`;if(r<90)return`in ${r}s`;let i=Math.round(r/60);if(i<90)return`in ${i}m`;let a=Math.round(i/60);return a<48?`in ${a}h`:`in ${Math.round(a/24)}d`}function G(e,t){let n=c(e,t)?.label;return n&&n!==t?{text:n,raw:t}:{text:t,raw:void 0}}function K(e,t,n){let r=t.indexOf(`:`),i=r>0?t.slice(0,r):``,o=s(i)?i:null,c=o?t.slice(r+1):t,l=[...n?[n]:[],...e.filter(e=>e.id!==n&&(o===null||e.engine===o)).map(e=>e.id)];for(let n of l){let r=a(e,{seatId:n,model:c})?.label;if(r&&r!==t)return{text:r,raw:t}}return{text:t,raw:void 0}}var q={backdrop:`_backdrop_r8c4w_4`,fade:`_fade_r8c4w_1`,panel:`_panel_r8c4w_14`,slide:`_slide_r8c4w_1`,rise:`_rise_r8c4w_1`,head:`_head_r8c4w_33`,title:`_title_r8c4w_43`,titleCount:`_titleCount_r8c4w_54`,splits:`_splits_r8c4w_62`,split:`_split_r8c4w_62`,splitCount:`_splitCount_r8c4w_86`,body:`_body_r8c4w_98`,rows:`_rows_r8c4w_106`,row:`_row_r8c4w_106`,rule:`_rule_r8c4w_125`,rowMain:`_rowMain_r8c4w_133`,rowKind:`_rowKind_r8c4w_138`,rowTitle:`_rowTitle_r8c4w_151`,runFacts:`_runFacts_r8c4w_164`,diffStats:`_diffStats_r8c4w_173`,runSource:`_runSource_r8c4w_174`,repo:`_repo_r8c4w_176`,rowMeta:`_rowMeta_r8c4w_178`,severity:`_severity_r8c4w_187`,mono:`_mono_r8c4w_196`,deadline:`_deadline_r8c4w_197`,rowKeys:`_rowKeys_r8c4w_199`,key:`_key_r8c4w_201`,inlineKey:`_inlineKey_r8c4w_202`,loading:`_loading_r8c4w_218`,empty:`_empty_r8c4w_220`,emptyTitle:`_emptyTitle_r8c4w_228`,emptyBody:`_emptyBody_r8c4w_235`,clearMark:`_clearMark_r8c4w_243`,focusSink:`_focusSink_r8c4w_263`,detail:`_detail_r8c4w_265`,back:`_back_r8c4w_4`,approval:`_approval_r8c4w_279`,item:`_item_r8c4w_281`,itemHead:`_itemHead_r8c4w_282`,itemTitle:`_itemTitle_r8c4w_284`,itemDetail:`_itemDetail_r8c4w_292`,defs:`_defs_r8c4w_299`,itemActions:`_itemActions_r8c4w_310`,foot:`_foot_r8c4w_312`,caveat:`_caveat_r8c4w_324`},J=n();function Y({run:e}){return(0,J.jsxs)(`span`,{className:q.runFacts,children:[(0,J.jsx)(`span`,{className:q.diffStats,"aria-hidden":`true`,children:e.stats}),(0,J.jsx)(`span`,{className:`visually-hidden`,children:e.statsSpoken}),(0,J.jsx)(`span`,{"aria-hidden":`true`,children:`·`}),(0,J.jsxs)(`span`,{className:q.runSource,title:e.sourceHint??void 0,children:[e.partial?`Partial · `:``,e.source]})]})}var X={high:`Urgent`,warn:`Soon`,info:`When you can`},Z={approvals:`Approval`,authority:`Autonomy`,fleet:`Fleet`,leader:`Leader`,chats:`Chat`,accounts:`Account`},Q=(0,l.forwardRef)(function({items:e,selectedId:t,onSelect:n,onOpen:i,now:a,label:o},s){let c=`verse-needs-you-list`,u=(0,l.useRef)(null);return(0,l.useEffect)(()=>{t&&[...u.current?.querySelectorAll(`[data-item-id]`)??[]].find(e=>e.dataset.itemId===t)?.scrollIntoView?.({block:`nearest`})},[t]),(0,J.jsx)(`div`,{ref:e=>{u.current=e,typeof s==`function`?s(e):s&&(s.current=e)},id:c,role:`listbox`,"aria-label":o,tabIndex:0,"aria-activedescendant":t?`${c}-${e.findIndex(e=>e.id===t)}`:void 0,className:q.rows,children:e.map((e,o)=>{let s=e.actions.map(e=>r[e.kind]).filter(e=>e!==void 0),l=U(e,a);return(0,J.jsxs)(`div`,{id:`${c}-${o}`,"data-item-id":e.id,role:`option`,"aria-selected":e.id===t,className:q.row,"data-severity":e.severity,onClick:()=>i(e.id),onMouseMove:()=>e.id!==t&&n(e.id),children:[(0,J.jsx)(`span`,{className:q.rule,"aria-hidden":`true`}),(0,J.jsxs)(`span`,{className:q.rowMain,children:[l.kindLabel?(0,J.jsx)(`span`,{className:q.rowKind,children:l.kindLabel}):null,(0,J.jsx)(`span`,{className:q.rowTitle,title:l.fullTitle,children:l.title}),l.run?(0,J.jsx)(Y,{run:l.run}):null,(0,J.jsxs)(`span`,{className:q.rowMeta,children:[(0,J.jsx)(`span`,{className:q.severity,"data-severity":e.severity,children:X[e.severity]}),(0,J.jsx)(`span`,{children:Z[e.source]}),l.repo?(0,J.jsx)(`span`,{className:q.repo,title:l.repoFull,children:l.repo}):null,e.subject.pr?(0,J.jsxs)(`span`,{children:[`#`,e.subject.pr]}):null,(0,J.jsx)(`span`,{title:l.ageStamp,children:l.age}),e.expiresAt?(0,J.jsxs)(`span`,{className:q.deadline,children:[`closes `,W(e.expiresAt,a)]}):null]})]}),e.id===t&&s.length>0?(0,J.jsx)(`span`,{className:q.rowKeys,"aria-hidden":`true`,children:s.map(e=>(0,J.jsx)(`kbd`,{className:q.key,children:e},e))}):null]},e.id)})})});export{D as C,p as D,b as E,O as S,d as T,u as _,k as a,T as b,F as c,H as d,K as f,W as g,P as h,L as i,M as l,N as m,Y as n,R as o,G as p,q as r,B as s,Q as t,U as u,E as v,w,h as x,f as y};
|
|
2
|
-
//# sourceMappingURL=NeedsYouList-eBOlJr0b.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,c as t,n}from"./index-BG177cPN.js";import{p as r}from"./global-CXHHMz9o.js";import{M as i,at as a,lt as o,q as s,z as c}from"./VerseConsoleApp-DeuBEvAO.js";import{y as l}from"./format-DEAaVF6X.js";import{r as u}from"./CapacityStrip-Bx4c3dxD.js";import{t as d}from"./Button-OjVJSrFq.js";import{C as f,a as p,b as m,f as h,i as g,o as _,r as v,s as y,t as b,u as x}from"./icons-D4s-jlxX.js";import{s as S}from"./verse-icons-wOet9JZy.js";import{t as C}from"./command-catalog-CmrHNFzh.js";import{n as w}from"./surface-data-DshUC_TU.js";import"./primitives-DNI-uJBd.js";import{a as T,s as E}from"./usage-queries-MnUeYzwp.js";import{r as D}from"./AutonomyOffState-CXhXpsim.js";import{a as O,o as k}from"./authority-model-CmnfJzmM.js";import{copyAutonomySetupCommand as A}from"./copy-setup-CJQhFl-4.js";import{a as j,i as M,n as N,r as P,s as F,t as I}from"./useOnboarding-CkOHadqC.js";var L=t(e(),1),R=[{id:`welcome`,title:`Welcome to Verse`,subtitle:`Five sections, one rail.`},{id:`accounts`,title:`Your seats`,subtitle:`Which provider accounts this machine can actually dispatch to right now.`},{id:`local`,title:`Local runtime`,subtitle:`Whether there is a model on this machine, and what that changes.`},{id:`autonomy`,title:`Turn on autonomy`,subtitle:`It stays off until you set it up. Turning it down is always one click.`},{id:`stops`,title:`Three ways to stop`,subtitle:`They do not have the same blast radius. This is the one screen that says so.`},{id:`finish`,title:`Make it yours`,subtitle:`Theme, accent, density and font live in Settings. Then start a chat.`}];function z(e){return Number.isFinite(e)?Math.min(R.length-1,Math.max(0,Math.trunc(e))):0}var B=`Local seats cost nothing and consume no provider quota, so the autonomous loop can keep working after a cloud window is used up.`,V=`Without one, every turn and every autonomous tick spends a provider account, and a used-up window stops the work.`;function H(e){if(e.loading)return{tone:`unknown`,state:`checking`,summary:`Probing the local runtimes on this machine…`,meaning:B,fix:null,modelCount:0,toolCapableCount:0,stale:!1};if(!e.snapshot)return{tone:`unknown`,state:`not reported`,summary:`This server does not report local runtimes, so Verse cannot say whether one is available here.`,meaning:V,fix:e.unavailableReason,modelCount:0,toolCapableCount:0,stale:!1};let t=e.snapshot.models,n=t.filter(e=>e.supportsTools===!0).length,r=e.snapshot.runtimes.some(e=>e.stale);return e.snapshot.reachable?t.length===0?{tone:`attention`,state:`no models`,summary:`A local runtime answered, but it has no models installed.`,meaning:V,fix:`Pull a model into the runtime, then press Refresh in Usage.`,modelCount:0,toolCapableCount:0,stale:r}:{tone:`ok`,state:r?`available (retained reading)`:`available`,summary:`${t.length} local ${t.length===1?`model`:`models`} available`+(n>0?`, ${n} of them tool-capable.`:`, none of them tool-capable.`)+(r?` Last known reading.`:``),meaning:n>0?B:`${B} A model that cannot call tools can answer, but cannot run an agentic turn.`,fix:null,modelCount:t.length,toolCapableCount:n,stale:r}:{tone:`attention`,state:`unreachable`,summary:`No local runtime answered. Verse cannot tell whether one is not running or not installed — the probe only knows it got no answer.`,meaning:V,fix:`Start Ollama (or LM Studio) and press Refresh in Usage. If neither is installed, everything still works — it all runs on the cloud seats.`,modelCount:0,toolCapableCount:0,stale:r}}var U=[{name:`Pause`,scope:`Halts autonomous dispatch only. A running loop parks instead of exiting.`,limit:`Your own chats and the agent’s write tools keep working.`,reversible:`Reversible in one click, with no restart and no confirmation.`,tone:`ok`},{name:`Stop loop`,scope:`Stops the daemon — and engages the GLOBAL kill switch while doing it.`,limit:`That means it also refuses the agent’s own write tools, exactly like the emergency control.`,reversible:`Reversible, but confirm-guarded. For an ordinary halt, use Pause.`,tone:`attention`},{name:`Emergency stop`,scope:`Engages the global kill switch (~/.ashlr/KILL) directly.`,limit:`Every mutating path refuses: the loop, dispatch, and the agent’s own write tools.`,reversible:`Reversible, confirm-guarded, and deliberately separated from the other two.`,tone:`attention`}],W={card:`_card_10xpw_14`,"onboarding-in":`_onboarding-in_10xpw_1`,head:`_head_10xpw_56`,headText:`_headText_10xpw_64`,eyebrow:`_eyebrow_10xpw_72`,title:`_title_10xpw_80`,subtitle:`_subtitle_10xpw_88`,body:`_body_10xpw_96`,lead:`_lead_10xpw_107`,aside:`_aside_10xpw_113`,caveat:`_caveat_10xpw_114`,kbd:`_kbd_10xpw_125`,sections:`_sections_10xpw_138`,findings:`_findings_10xpw_139`,sectionRow:`_sectionRow_10xpw_148`,sectionIcon:`_sectionIcon_10xpw_160`,localIcon:`_localIcon_10xpw_161`,sectionText:`_sectionText_10xpw_173`,sectionName:`_sectionName_10xpw_180`,sectionBlurb:`_sectionBlurb_10xpw_190`,finding:`_finding_10xpw_139`,findingHead:`_findingHead_10xpw_210`,stopName:`_stopName_10xpw_218`,findingDetail:`_findingDetail_10xpw_225`,findingNote:`_findingNote_10xpw_231`,findingFix:`_findingFix_10xpw_237`,fixLabel:`_fixLabel_10xpw_245`,fixText:`_fixText_10xpw_254`,code:`_code_10xpw_260`,tone:`_tone_10xpw_276`,toneLabel:`_toneLabel_10xpw_283`,foot:`_foot_10xpw_305`,pips:`_pips_10xpw_315`,pip:`_pip_10xpw_315`,actions:`_actions_10xpw_338`,chip:`_chip_10xpw_362`,chipOpen:`_chipOpen_10xpw_378`,chipDismiss:`_chipDismiss_10xpw_379`,chipLabel:`_chipLabel_10xpw_399`,chipCount:`_chipCount_10xpw_407`},G=n();function K({tone:e,label:t}){let n=e===`ok`?v:e===`attention`?b:x;return(0,G.jsxs)(`span`,{className:W.tone,"data-tone":e,children:[(0,G.jsx)(n,{size:13,"aria-hidden":`true`,focusable:`false`}),(0,G.jsx)(`span`,{className:W.toneLabel,children:t})]})}function q({children:e}){return(0,G.jsx)(`div`,{className:W.body,children:e})}function J(){return(0,G.jsxs)(q,{children:[(0,G.jsx)(`p`,{className:W.lead,children:`Verse runs your chats and this machine’s agent fleet from one local server.`}),(0,G.jsx)(`ul`,{className:W.sections,children:s.map((e,t)=>{let n=S[e.id];return(0,G.jsxs)(`li`,{className:W.sectionRow,children:[(0,G.jsx)(`span`,{className:W.sectionIcon,"aria-hidden":`true`,children:(0,G.jsx)(n,{})}),(0,G.jsxs)(`span`,{className:W.sectionText,children:[(0,G.jsxs)(`span`,{className:W.sectionName,children:[e.label,` `,(0,G.jsxs)(`kbd`,{className:W.kbd,children:[`⌘`,t+1]})]}),(0,G.jsx)(`span`,{className:W.sectionBlurb,children:e.blurb})]})]},e.id)})}),(0,G.jsxs)(`p`,{className:W.sectionBlurb,children:[(0,G.jsx)(`kbd`,{className:W.kbd,children:`⌘K`}),` runs anything by name · `,(0,G.jsx)(`kbd`,{className:W.kbd,children:`⌘J`}),` is everything waiting on you · Settings, Apps & Accounts and Usage are under the gear.`]})]})}function Y(){return(0,G.jsxs)(q,{children:[(0,G.jsx)(u,{density:`compact`,headline:!0,local:`collapse`,labelledBy:`verse-onboarding-title`,emptyText:`No seats reported yet. Connect an account in Apps & Accounts, or start Ollama for local models.`,renderActions:e=>e.connection?.fixCommand?(0,G.jsxs)(`p`,{className:W.findingFix,children:[(0,G.jsx)(`span`,{className:W.fixLabel,children:`Fix`}),(0,G.jsx)(`code`,{className:W.code,children:e.connection.fixCommand.join(` `)})]}):null}),(0,G.jsx)(`p`,{className:W.aside,children:`Every window, reset and reserve lives in Apps & Accounts, under the gear.`})]})}function X(){let e=r(T),t=(0,L.useMemo)(()=>{let t=e.data?.reason??e.error?.message??null;return H({snapshot:e.data?.available?E(e.data.raw):null,loading:e.data===void 0&&e.status!==`error`,unavailableReason:t===null?null:l(t)})},[e.data,e.status,e.error]);return(0,G.jsxs)(q,{children:[(0,G.jsxs)(`div`,{className:W.findingHead,children:[(0,G.jsx)(`span`,{className:W.localIcon,"aria-hidden":`true`,children:(0,G.jsx)(y,{size:15})}),(0,G.jsx)(K,{tone:t.tone,label:t.state})]}),(0,G.jsx)(`p`,{className:W.lead,children:t.summary}),(0,G.jsx)(`p`,{className:W.findingDetail,children:t.meaning}),t.fix?(0,G.jsxs)(`p`,{className:W.findingFix,children:[(0,G.jsx)(`span`,{className:W.fixLabel,children:`Fix`}),(0,G.jsx)(`span`,{className:W.fixText,children:t.fix})]}):null]})}function Z(e){return e===`success`?`ok`:e===`warning`||e===`danger`?`attention`:`unknown`}function Q(){let e=r(w),[t,n]=(0,L.useState)(null),i=e.data?.value??null,a=e.data===void 0&&e.status!==`error`,s=k(i),l=O(i,Date.now()),u=D(i?.grant.state===`none`),f=!i||i.grant.state===`none`&&u!==`ready`,p=a?`Reading the autonomy state…`:i?l.detail:e.data?.reason??e.error?.message??`The autonomy state could not be read.`;return(0,G.jsxs)(q,{children:[(0,G.jsxs)(`div`,{className:W.findingHead,children:[(0,G.jsx)(`span`,{className:W.stopName,children:`Right now`}),(0,G.jsx)(K,{tone:a?`unknown`:Z(s.tone),label:a?`checking`:i?s.text:`not reported`})]}),(0,G.jsx)(`p`,{className:W.findingDetail,children:p}),(0,G.jsxs)(`p`,{className:W.lead,children:[`The switch on Command `,(0,G.jsx)(`kbd`,{className:W.kbd,children:`⌘1`}),` — Off, Propose, Autonomous — decides what the fleet may do on its own. Raising it past your grant asks for Touch ID; lowering it never does.`]}),f?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`div`,{className:W.findingFix,children:[(0,G.jsx)(`span`,{className:W.fixLabel,children:`Set up`}),(0,G.jsx)(`code`,{className:W.code,children:C}),(0,G.jsx)(d,{variant:`subtle`,size:`sm`,icon:(0,G.jsx)(_,{size:13}),onClick:()=>{A().then(n)},children:t?`Copied`:`Copy`})]}),(0,G.jsx)(`p`,{className:W.aside,role:t===!1?`alert`:void 0,children:t===!1?`The clipboard is not available here — select the command and copy it by hand.`:`Run it in a terminal. It stops for what only you can do — sudo, Touch ID, GitHub — and --dry-run prints every step first.`})]}):l.action?(0,G.jsx)(d,{variant:`subtle`,icon:(0,G.jsx)(h,{size:14}),onClick:()=>c(`autonomy.grant`,{via:`button`}),children:l.action===`re-approve`?`Re-approve grant…`:`Approve grant…`}):(0,G.jsx)(d,{variant:`subtle`,icon:(0,G.jsx)(h,{size:14}),onClick:()=>o(`command`),children:`Open Command`}),(0,G.jsxs)(`p`,{className:W.aside,children:[(0,G.jsx)(`kbd`,{className:W.kbd,children:`⌘K`}),` “Autonomy: …” and “Approve grant…” work from any surface.`]})]})}function $(){return(0,G.jsxs)(q,{children:[(0,G.jsxs)(`p`,{className:W.lead,children:[`Fleet `,(0,G.jsx)(`kbd`,{className:W.kbd,children:`⌘2`}),` has three stop controls. They are not interchangeable, and the difference is the most important thing on this screen.`]}),(0,G.jsx)(`ul`,{className:W.findings,children:U.map(e=>(0,G.jsxs)(`li`,{className:W.finding,children:[(0,G.jsxs)(`div`,{className:W.findingHead,children:[(0,G.jsx)(`span`,{className:W.stopName,children:e.name}),(0,G.jsx)(K,{tone:e.tone,label:e.tone===`ok`?`narrow`:`global`})]}),(0,G.jsx)(`p`,{className:W.findingDetail,children:e.scope}),(0,G.jsx)(`p`,{className:W.findingDetail,children:e.limit}),(0,G.jsx)(`p`,{className:W.findingNote,children:e.reversible})]},e.name))})]})}function ee(){return(0,G.jsxs)(q,{children:[(0,G.jsxs)(`p`,{className:W.lead,children:[`Settings `,(0,G.jsx)(`kbd`,{className:W.kbd,children:`⌘,`}),` carries theme, accent hue, density, display font, corner radius and reduced motion. Every change applies as you make it — there is no save button.`]}),(0,G.jsx)(d,{variant:`subtle`,icon:(0,G.jsx)(m,{size:14}),onClick:()=>o(`settings`),children:`Open Settings`}),(0,G.jsx)(`p`,{className:W.aside,children:`You can replay this tour any time from Settings → Onboarding.`})]})}var te=[J,Y,X,Q,$,ee];function ne(){let{open:e,expanded:t,step:n}=I(),r=z(n),o=R[r],s=te[r],c=r===R.length-1,l=R.length,u=(0,L.useCallback)(()=>M(),[]),m=(0,L.useRef)(null),h=(0,L.useRef)(null),_=(0,L.useRef)(!1),v=(0,L.useCallback)(()=>{_.current=!0,j()},[]),y=(0,L.useCallback)(()=>{_.current=!0,N()},[]);return(0,L.useEffect)(()=>{_.current&&(_.current=!1,t?m.current?.focus():h.current?.focus())},[t]),(0,L.useEffect)(()=>{if(!e||!t)return;function n(e){if(e.key!==`Escape`)return;let t=m.current;t&&e.target instanceof Node&&t.contains(e.target)&&(e.preventDefault(),y())}return document.addEventListener(`keydown`,n),()=>document.removeEventListener(`keydown`,n)},[e,t,y]),e?t?(0,G.jsxs)(`aside`,{ref:m,tabIndex:-1,className:W.card,"aria-labelledby":`verse-onboarding-title`,role:`region`,children:[(0,G.jsxs)(`header`,{className:W.head,children:[(0,G.jsxs)(`div`,{className:W.headText,children:[(0,G.jsxs)(`p`,{className:W.eyebrow,children:[`Getting started · `,r+1,` of `,l]}),(0,G.jsx)(`h2`,{id:`verse-onboarding-title`,className:W.title,children:o.title}),(0,G.jsx)(`p`,{className:W.subtitle,children:o.subtitle})]}),(0,G.jsx)(d,{iconOnly:!0,variant:`ghost`,size:`sm`,"aria-label":`Minimize getting started`,title:`Minimize getting started`,"aria-expanded":`true`,icon:(0,G.jsx)(g,{size:14}),onClick:y})]}),(0,G.jsx)(s,{}),(0,G.jsxs)(`footer`,{className:W.foot,children:[(0,G.jsx)(`ol`,{className:W.pips,"aria-hidden":`true`,children:R.map((e,t)=>(0,G.jsx)(`li`,{className:W.pip,"data-state":t===r?`current`:t<r?`done`:`todo`},e.id))}),(0,G.jsxs)(`div`,{className:W.actions,children:[(0,G.jsx)(d,{variant:`ghost`,size:`sm`,onClick:u,children:`Skip setup`}),r>0?(0,G.jsx)(d,{variant:`subtle`,size:`sm`,onClick:()=>F(r-1),children:`Back`}):null,c?(0,G.jsx)(d,{variant:`primary`,size:`sm`,icon:(0,G.jsx)(i,{size:14}),onClick:()=>{P(),a(`new-chat`)},children:`Start a first chat`}):(0,G.jsx)(d,{variant:`primary`,size:`sm`,onClick:()=>F(r+1),children:`Next`})]})]})]}):(0,G.jsxs)(`div`,{className:W.chip,role:`region`,"aria-label":`Getting started`,children:[(0,G.jsxs)(`button`,{ref:h,type:`button`,className:W.chipOpen,"aria-expanded":`false`,title:`Getting started: ${o.title}`,onClick:v,children:[(0,G.jsx)(`span`,{className:W.chipLabel,children:`Getting started`}),(0,G.jsxs)(`span`,{className:W.chipCount,children:[r+1,`/`,l]}),(0,G.jsx)(p,{size:13,"aria-hidden":`true`,focusable:`false`})]}),(0,G.jsx)(`button`,{type:`button`,className:W.chipDismiss,"aria-label":`Dismiss getting started`,title:`Dismiss getting started — replay it any time from Settings`,onClick:u,children:(0,G.jsx)(f,{size:12,"aria-hidden":`true`,focusable:`false`})})]}):null}export{ne as OnboardingFlow};
|
|
2
|
-
//# sourceMappingURL=OnboardingFlow-D3yfITK1.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OnboardingFlow-D3yfITK1.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/onboarding/onboarding-model.ts","../../../../../../src/web-ui/routes/verse/onboarding/onboarding.module.css","../../../../../../src/web-ui/routes/verse/onboarding/OnboardingFlow.tsx"],"sourcesContent":["/**\n * routes/verse/onboarding/onboarding-model.ts — the first-run tour's facts,\n * derived from the same reads the Usage section uses, with the same honesty\n * rules (docs/VERSE-TELEMETRY-V2.md).\n *\n * Pure: no React, no I/O. Everything the tour asserts about the machine is\n * computed here so it can be tested without a DOM, and so the one rule that\n * matters is enforced in one place:\n *\n * AN ABSENT READ IS \"UNKNOWN\", NEVER \"FINE\" AND NEVER \"BROKEN\".\n *\n * A first-run screen is exactly where a confident lie does the most damage —\n * it is the operator's first and only calibration of how much this app's\n * claims can be trusted. So a route that 404s, a payload that does not\n * narrow, and a probe that could not reach a runtime each produce their own\n * sentence, and none of them produces a green check.\n *\n * The tour NEVER renders a command it invented: the seats step shows only\n * A2's own fix argv (through C6's capacity rows).\n */\nimport type { LocalModelsSnapshot } from '../usage/usage-contract.js';\n\n// ---------------------------------------------------------------------------\n// Steps\n// ---------------------------------------------------------------------------\n\nexport type OnboardingStepId = 'welcome' | 'accounts' | 'local' | 'autonomy' | 'stops' | 'finish';\n\nexport interface OnboardingStepMeta {\n id: OnboardingStepId;\n /** Shown as the card's heading. */\n title: string;\n /** One line under the heading. */\n subtitle: string;\n}\n\nexport const ONBOARDING_STEPS: readonly OnboardingStepMeta[] = [\n {\n id: 'welcome',\n title: 'Welcome to Verse',\n subtitle: 'Five sections, one rail.',\n },\n {\n id: 'accounts',\n title: 'Your seats',\n subtitle: 'Which provider accounts this machine can actually dispatch to right now.',\n },\n {\n id: 'local',\n title: 'Local runtime',\n subtitle: 'Whether there is a model on this machine, and what that changes.',\n },\n {\n id: 'autonomy',\n title: 'Turn on autonomy',\n subtitle: 'It stays off until you set it up. Turning it down is always one click.',\n },\n {\n id: 'stops',\n title: 'Three ways to stop',\n subtitle: 'They do not have the same blast radius. This is the one screen that says so.',\n },\n {\n id: 'finish',\n title: 'Make it yours',\n subtitle: 'Theme, accent, density and font live in Settings. Then start a chat.',\n },\n];\n\nexport function clampStep(step: number): number {\n if (!Number.isFinite(step)) return 0;\n return Math.min(ONBOARDING_STEPS.length - 1, Math.max(0, Math.trunc(step)));\n}\n\n// ---------------------------------------------------------------------------\n// Tone\n// ---------------------------------------------------------------------------\n\n/**\n * Step 2 (seats) is C6's shared LiveCapacityStrip since 3.10 — the tour no\n * longer narrows the accounts route itself, so the seats can never read\n * differently here than in Apps & Accounts. The tone below serves the local\n * runtime and the stops.\n */\nexport type FindingTone = 'ok' | 'attention' | 'unknown';\n\n// ---------------------------------------------------------------------------\n// Local runtime\n// ---------------------------------------------------------------------------\n\nexport interface LocalFinding {\n tone: FindingTone;\n state: string;\n summary: string;\n /** What having (or not having) a local runtime means for the operator. */\n meaning: string;\n /** Present only when there is something to do about it. */\n fix: string | null;\n modelCount: number;\n toolCapableCount: number;\n /** True when this reading was retained from an earlier probe. */\n stale: boolean;\n}\n\nexport interface LocalInput {\n snapshot: LocalModelsSnapshot | null;\n loading: boolean;\n unavailableReason: string | null;\n}\n\nconst LOCAL_MEANING_AVAILABLE =\n 'Local seats cost nothing and consume no provider quota, so the autonomous loop can keep working after a cloud window is used up.';\nconst LOCAL_MEANING_ABSENT =\n 'Without one, every turn and every autonomous tick spends a provider account, and a used-up window stops the work.';\n\nexport function buildLocalFinding(input: LocalInput): LocalFinding {\n if (input.loading) {\n return {\n tone: 'unknown',\n state: 'checking',\n summary: 'Probing the local runtimes on this machine…',\n meaning: LOCAL_MEANING_AVAILABLE,\n fix: null,\n modelCount: 0,\n toolCapableCount: 0,\n stale: false,\n };\n }\n\n if (!input.snapshot) {\n return {\n tone: 'unknown',\n state: 'not reported',\n summary: 'This server does not report local runtimes, so Verse cannot say whether one is available here.',\n meaning: LOCAL_MEANING_ABSENT,\n fix: input.unavailableReason,\n modelCount: 0,\n toolCapableCount: 0,\n stale: false,\n };\n }\n\n const models = input.snapshot.models;\n const toolCapable = models.filter((m) => m.supportsTools === true).length;\n const stale = input.snapshot.runtimes.some((r) => r.stale);\n\n if (!input.snapshot.reachable) {\n return {\n tone: 'attention',\n state: 'unreachable',\n // \"Not reachable\" and \"not installed\" are different facts and the probe\n // cannot tell them apart — so this does not claim either one.\n summary:\n 'No local runtime answered. Verse cannot tell whether one is not running or not installed — the probe only knows it got no answer.',\n meaning: LOCAL_MEANING_ABSENT,\n fix: 'Start Ollama (or LM Studio) and press Refresh in Usage. If neither is installed, everything still works — it all runs on the cloud seats.',\n modelCount: 0,\n toolCapableCount: 0,\n stale,\n };\n }\n\n if (models.length === 0) {\n return {\n tone: 'attention',\n state: 'no models',\n summary: 'A local runtime answered, but it has no models installed.',\n meaning: LOCAL_MEANING_ABSENT,\n fix: 'Pull a model into the runtime, then press Refresh in Usage.',\n modelCount: 0,\n toolCapableCount: 0,\n stale,\n };\n }\n\n return {\n tone: 'ok',\n state: stale ? 'available (retained reading)' : 'available',\n summary:\n `${models.length} local ${models.length === 1 ? 'model' : 'models'} available` +\n (toolCapable > 0 ? `, ${toolCapable} of them tool-capable.` : ', none of them tool-capable.') +\n (stale ? ' Last known reading.' : ''),\n meaning: toolCapable > 0\n ? LOCAL_MEANING_AVAILABLE\n : `${LOCAL_MEANING_AVAILABLE} A model that cannot call tools can answer, but cannot run an agentic turn.`,\n fix: null,\n modelCount: models.length,\n toolCapableCount: toolCapable,\n stale,\n };\n}\n\n// ---------------------------------------------------------------------------\n// The three stops\n// ---------------------------------------------------------------------------\n\nexport interface StopControl {\n name: string;\n /** What it halts. */\n scope: string;\n /** What it does NOT halt — the half people get wrong. */\n limit: string;\n reversible: string;\n tone: FindingTone;\n}\n\n/**\n * Verbatim against docs/VERSE-CONTRACT-V2.md's two footguns and the V2.1\n * amendment. The kill switch is never called a pause, and \"Stop loop\" is\n * stated as engaging the same global sentinel as the emergency control,\n * because it does (`stopDaemon()` is `setKill(true)`).\n */\nexport const STOP_CONTROLS: readonly StopControl[] = [\n {\n name: 'Pause',\n scope: 'Halts autonomous dispatch only. A running loop parks instead of exiting.',\n limit: 'Your own chats and the agent’s write tools keep working.',\n reversible: 'Reversible in one click, with no restart and no confirmation.',\n tone: 'ok',\n },\n {\n name: 'Stop loop',\n scope: 'Stops the daemon — and engages the GLOBAL kill switch while doing it.',\n limit: 'That means it also refuses the agent’s own write tools, exactly like the emergency control.',\n reversible: 'Reversible, but confirm-guarded. For an ordinary halt, use Pause.',\n tone: 'attention',\n },\n {\n name: 'Emergency stop',\n scope: 'Engages the global kill switch (~/.ashlr/KILL) directly.',\n limit: 'Every mutating path refuses: the loop, dispatch, and the agent’s own write tools.',\n reversible: 'Reversible, confirm-guarded, and deliberately separated from the other two.',\n tone: 'attention',\n },\n];\n","/* First-run tour — a docked card, not a dialog. No backdrop: the app behind\n it stays visible and clickable, which is the whole design constraint.\n Hairlines and one elevation (DESIGN-V2 §1/§2); the only colour is the\n status tone on a glyph, never on body text. */\n\n/* Docked bottom-LEFT of the content area, not bottom-right of the viewport.\n The composer is centred on --measure-read inside the workspace and its\n control row — seat pill, mic, Send/Stop — sits at the bottom of that column,\n right-aligned. A 420px card pinned to the viewport's bottom-right lands on\n top of exactly those controls at ordinary window widths, which breaks this\n file's own rule 1: everything behind the card stays clickable. Clearing the\n rail and hugging the left edge keeps it out of the composer's way in both\n the wide and the 900px layouts. */\n.card {\n position: fixed;\n z-index: var(--z-dialog);\n left: calc(var(--rail-width) + var(--space-5));\n right: auto;\n bottom: calc(var(--space-5) + env(safe-area-inset-bottom, 0px));\n width: min(420px, calc(100vw - var(--rail-width) - var(--space-5) * 2));\n max-height: min(640px, calc(100vh - var(--space-8)));\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--bg-surface-raised);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-dialog);\n}\n\n/* One declaration, correct in all four motion states. `--duration-base`\n already collapses to 1ms under BOTH triggers the app honours — the OS\n preference (unless Settings asked for full motion) and Settings' own\n `data-motion=\"reduce\"` — so a bare `prefers-reduced-motion` media query was\n wrong in two of them: it ignored an operator who chose Reduce in Settings,\n and it removed the animation from one who chose Full against an OS reduce\n preference. This is a one-shot animation, so unlike the persistent\n `.dictationPulse`/`.caret` cases it needs no by-name rules. */\n.card {\n animation: onboarding-in var(--duration-base) var(--ease-decelerate);\n}\n\n@keyframes onboarding-in {\n from {\n opacity: 0;\n transform: translateY(4px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n}\n\n/* ------------------------------------------------------------------ head */\n\n.head {\n display: flex;\n align-items: flex-start;\n gap: var(--space-2);\n padding: var(--space-4) var(--space-4) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.headText {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.eyebrow {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.title {\n font-family: var(--font-display);\n font-size: var(--text-md-size);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display);\n color: var(--text-primary);\n}\n\n.subtitle {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n color: var(--text-secondary);\n}\n\n/* ------------------------------------------------------------------ body */\n\n.body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: var(--space-4);\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n align-items: flex-start;\n}\n\n.lead {\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line-relaxed);\n color: var(--text-primary);\n}\n\n.aside,\n.caveat {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n color: var(--text-tertiary);\n}\n\n.caveat {\n border-left: 2px solid var(--border-strong);\n padding-left: var(--space-3);\n}\n\n.kbd {\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n padding: 1px 5px;\n border: 1px solid var(--border-default);\n border-radius: var(--radius-xs);\n background: var(--bg-surface);\n color: var(--text-secondary);\n white-space: nowrap;\n}\n\n/* --------------------------------------------------------- rail overview */\n\n.sections,\n.findings {\n list-style: none;\n margin: 0;\n padding: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n}\n\n.sectionRow {\n display: flex;\n align-items: flex-start;\n gap: var(--space-3);\n padding: var(--space-2) 0;\n border-top: 1px solid var(--border-subtle);\n}\n\n.sectionRow:first-child {\n border-top: none;\n}\n\n.sectionIcon,\n.localIcon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n /* Derived from the density scale rather than a literal, so compact density\n actually reaches it (design/control-density.test.ts). */\n width: var(--control-h-xs);\n height: var(--control-h-xs);\n color: var(--text-tertiary);\n}\n\n.sectionText {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.sectionName {\n font-family: var(--font-display);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n}\n\n.sectionBlurb {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n color: var(--text-secondary);\n}\n\n/* ----------------------------------------------------------- findings */\n\n.finding {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n padding: var(--space-3) 0;\n border-top: 1px solid var(--border-subtle);\n}\n\n.finding:first-child {\n border-top: none;\n}\n\n.findingHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n flex-wrap: wrap;\n}\n\n.stopName {\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.findingDetail {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n color: var(--text-secondary);\n}\n\n.findingNote {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n color: var(--text-tertiary);\n}\n\n.findingFix {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n flex-wrap: wrap;\n margin-top: 2px;\n}\n\n.fixLabel {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n flex: none;\n}\n\n.fixText {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n color: var(--text-secondary);\n}\n\n.code {\n font-family: var(--font-mono);\n /* A command an operator is meant to READ and retype, not a micro-label:\n tokens.css reserves --text-2xs for uppercase labels and keyboard hints\n and sets the body floor at 12px. */\n font-size: var(--text-xs-size);\n padding: 2px 6px;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs);\n background: var(--bg-code, var(--bg-surface));\n color: var(--text-primary);\n overflow-wrap: anywhere;\n}\n\n/* --------------------------------------------------------------- tone */\n\n.tone {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n flex: none;\n}\n\n.toneLabel {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-secondary);\n}\n\n.tone[data-tone='ok'] {\n color: var(--status-success-fg, var(--text-secondary));\n}\n\n.tone[data-tone='attention'] {\n color: var(--status-warning-fg, var(--text-secondary));\n}\n\n.tone[data-tone='unknown'] {\n color: var(--text-tertiary);\n}\n\n/* ------------------------------------------------------------------ foot */\n\n.foot {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n padding: var(--space-3) var(--space-4);\n border-top: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n.pips {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n gap: 5px;\n}\n\n.pip {\n width: 14px;\n height: 2px;\n border-radius: 1px;\n background: var(--border-default);\n}\n\n.pip[data-state='current'] {\n background: var(--accent-500);\n}\n\n.pip[data-state='done'] {\n background: var(--border-strong);\n}\n\n.actions {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n}\n\n/* Narrow layouts keep the SAME left anchor and the same cap. Stretching the\n card to `right: var(--space-3)` put it back over the composer's right end —\n which is exactly where Send and Stop sit — so the wide layout's fix stopped\n holding at the width where the window is tightest and the overlap matters\n most. Only the gutter tightens; the card still ends well left of Send. */\n@media (max-width: 900px) {\n .card {\n left: calc(var(--rail-width) + var(--space-3));\n right: auto;\n width: min(420px, calc(100vw - var(--rail-width) - var(--space-3) * 2));\n }\n}\n\n/* ------------------------------------------------------------------ chip */\n\n/* The tour's resting state: one line in the same corner the card opens from.\n The card is ~420×640 — half a 900px window — so it only appears when the\n operator asks for it; until then this is all Verse puts over a surface. */\n.chip {\n position: fixed;\n z-index: var(--z-dialog);\n left: calc(var(--rail-width) + var(--space-5));\n bottom: calc(var(--space-5) + env(safe-area-inset-bottom, 0px));\n display: inline-flex;\n align-items: center;\n max-width: calc(100vw - var(--rail-width) - var(--space-5) * 2);\n height: var(--control-h-sm);\n background: var(--bg-surface-raised);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-full);\n box-shadow: var(--shadow-sm);\n animation: onboarding-in var(--duration-base) var(--ease-decelerate);\n}\n\n.chipOpen,\n.chipDismiss {\n display: inline-flex;\n align-items: center;\n height: 100%;\n border: none;\n background: transparent;\n color: var(--text-secondary);\n cursor: pointer;\n font: inherit;\n}\n\n.chipOpen {\n gap: var(--space-2);\n min-width: 0;\n padding: 0 var(--space-2) 0 var(--space-3);\n border-radius: var(--radius-full) 0 0 var(--radius-full);\n font-size: var(--text-xs-size);\n white-space: nowrap;\n}\n\n.chipLabel {\n font-family: var(--font-display);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.chipCount {\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n color: var(--text-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n.chipDismiss {\n justify-content: center;\n flex: none;\n width: var(--control-h-sm);\n border-left: 1px solid var(--border-subtle);\n border-radius: 0 var(--radius-full) var(--radius-full) 0;\n color: var(--text-tertiary);\n}\n\n.chipOpen:hover,\n.chipDismiss:hover {\n background: var(--bg-hover);\n color: var(--text-primary);\n}\n\n/* Focus lands on the card when the chip opens it; the ring would only be\n noise after a pointer click (keyboard focus still shows it). */\n.card:focus:not(:focus-visible) {\n outline: none;\n}\n\n@media (max-width: 900px) {\n .chip {\n left: calc(var(--rail-width) + var(--space-3));\n max-width: calc(100vw - var(--rail-width) - var(--space-3) * 2);\n }\n}\n","/**\n * routes/verse/onboarding/OnboardingFlow.tsx — the first-run tour.\n *\n * A first-time operator opens Verse to five unlabelled rail icons and no\n * guidance. This is six short steps that answer the questions that actually\n * block someone on day one: which of my accounts can this thing use, is\n * there anything local, how do I turn autonomy on, what do the three stop\n * buttons really do, where do I change how it looks, and how do I start.\n *\n * THREE RULES IT IS BUILT AROUND:\n *\n * 1. It never blocks the app. This is NOT a modal — no backdrop, no focus\n * trap, no `aria-modal`. It first appears as a one-line chip\n * (\"Getting started 1/6 →\") in the corner; only a click opens the card,\n * and every rail button, shortcut and section behind either stays\n * clickable. The card's minimise button and Escape fold it back to the\n * chip without answering it; Skip, or the chip's ×, silences it for good.\n *\n * 2. It never asserts more than it read. Step 2 is C6's shared capacity\n * strip (no reading is \"no reading\", never zero); step 3 reads the same\n * local-models route Usage reads, through the same narrower — an\n * unanswered probe is \"no answer\", never a green check (logic in\n * ./onboarding-model.ts, tested without a DOM); step 4 reads the same\n * authority entry Command's switch reads.\n *\n * 3. It costs no extra requests on the common path. The chip reads nothing.\n * Each data step mounts its own query only when the operator reaches it,\n * and those queries are the Usage / Command sections' own cache entries —\n * so a first-run user who walks the tour and then opens either finds the\n * reads already in cache and within the freshness window\n * (data/hooks.ts DEFAULT_QUERY_FRESH_MS).\n */\nimport { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { Button } from '../../../components/primitives/index.js';\nimport {\n IconAlert,\n IconCheckCircle,\n IconChat,\n IconChevronDown,\n IconChevronRight,\n IconCopy,\n IconCpu,\n IconInfo,\n IconLock,\n IconSliders,\n IconX,\n} from '../../../components/primitives/icons.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { SECTION_ICON } from '../verse-icons.js';\nimport { RAIL_SECTIONS, requestVerseCommand, setVerseSection } from '../verse-ui-store.js';\nimport { LiveCapacityStrip } from '../usage/CapacityStrip.js';\nimport { tidyProse } from '../autonomy/format.js';\nimport { verseLocalModelsQuery } from '../usage/usage-queries.js';\nimport { projectLocalModels } from '../usage/usage-contract.js';\nimport { authorityQuery } from '../command/surface-data.js';\nimport { grantChip, modeWord, type ChipTone } from '../command/authority-model.js';\nimport { useDraftReadiness } from '../autonomy/AutonomyOffState.js';\nimport { AUTONOMY_SETUP_COMMAND } from '../shell/command-catalog.js';\nimport { copyAutonomySetupCommand } from '../shell/copy-setup.js';\nimport { executeCatalogCommand } from '../shell/run-command.js';\nimport {\n ONBOARDING_STEPS,\n STOP_CONTROLS,\n buildLocalFinding,\n clampStep,\n type FindingTone,\n} from './onboarding-model.js';\nimport {\n collapseOnboarding,\n completeOnboarding,\n dismissOnboarding,\n expandOnboarding,\n setOnboardingStep,\n} from './onboarding-store.js';\nimport { useOnboarding } from './useOnboarding.js';\nimport styles from './onboarding.module.css';\n\n/**\n * Tone is paired with a glyph everywhere it appears, never carried by colour\n * alone (DESIGN-V2 §6).\n */\nfunction ToneMark({ tone, label }: { tone: FindingTone; label: string }) {\n const Glyph = tone === 'ok' ? IconCheckCircle : tone === 'attention' ? IconAlert : IconInfo;\n return (\n <span className={styles.tone} data-tone={tone}>\n <Glyph size={13} aria-hidden=\"true\" focusable=\"false\" />\n <span className={styles.toneLabel}>{label}</span>\n </span>\n );\n}\n\nfunction StepBody({ children }: { children: ReactNode }) {\n return <div className={styles.body}>{children}</div>;\n}\n\n// ---------------------------------------------------------------------------\n// Step 1 — what the rail is\n// ---------------------------------------------------------------------------\n\nfunction WelcomeStep() {\n return (\n <StepBody>\n <p className={styles.lead}>Verse runs your chats and this machine’s agent fleet from one local server.</p>\n {/*\n The five rail surfaces, in ⌘1–⌘5 order, with the same one-line blurbs\n the palette uses (VERSE_SECTIONS) — one description per surface, not\n a second copy that drifts. Settings, Apps and Usage live in the gear.\n */}\n <ul className={styles.sections}>\n {RAIL_SECTIONS.map((entry, index) => {\n const Icon = SECTION_ICON[entry.id];\n return (\n <li key={entry.id} className={styles.sectionRow}>\n <span className={styles.sectionIcon} aria-hidden=\"true\">\n <Icon />\n </span>\n <span className={styles.sectionText}>\n <span className={styles.sectionName}>\n {entry.label} <kbd className={styles.kbd}>⌘{index + 1}</kbd>\n </span>\n <span className={styles.sectionBlurb}>{entry.blurb}</span>\n </span>\n </li>\n );\n })}\n </ul>\n <p className={styles.sectionBlurb}>\n <kbd className={styles.kbd}>⌘K</kbd> runs anything by name · <kbd className={styles.kbd}>⌘J</kbd> is everything\n waiting on you · Settings, Apps & Accounts and Usage are under the gear.\n </p>\n </StepBody>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Step 2 — seats\n// ---------------------------------------------------------------------------\n\n/**\n * Step 2 mounts C6's shared LiveCapacityStrip — the SAME projection Apps &\n * Accounts, Usage, the new-chat dialog and the rail's capacity ring read — so\n * the tour can never describe a seat differently from the rest of the app\n * (3.9 had its own accounts narrower here, which drifted from Usage). A seat\n * that is signed out or out of usage shows the exact command that fixes it,\n * straight from A2's health report; nothing is run from the tour.\n */\nfunction AccountsStep() {\n return (\n <StepBody>\n <LiveCapacityStrip\n density=\"compact\"\n headline\n local=\"collapse\"\n // The step's own heading (\"Your seats\") names the strip: a second,\n // hidden heading with the same words is noise to a screen reader.\n labelledBy=\"verse-onboarding-title\"\n emptyText=\"No seats reported yet. Connect an account in Apps & Accounts, or start Ollama for local models.\"\n renderActions={(row) =>\n row.connection?.fixCommand ? (\n <p className={styles.findingFix}>\n <span className={styles.fixLabel}>Fix</span>\n <code className={styles.code}>{row.connection.fixCommand.join(' ')}</code>\n </p>\n ) : null\n }\n />\n <p className={styles.aside}>\n Every window, reset and reserve lives in Apps & Accounts, under the gear.\n </p>\n </StepBody>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Step 3 — local runtime\n// ---------------------------------------------------------------------------\n\nfunction LocalStep() {\n const read = useQuery(verseLocalModelsQuery);\n const finding = useMemo(() => {\n // The server's sentence, with any ISO instant in it read as local time.\n const reason = read.data?.reason ?? read.error?.message ?? null;\n return buildLocalFinding({\n snapshot: read.data?.available ? projectLocalModels(read.data.raw) : null,\n loading: read.data === undefined && read.status !== 'error',\n unavailableReason: reason === null ? null : tidyProse(reason),\n });\n }, [read.data, read.status, read.error]);\n\n return (\n <StepBody>\n <div className={styles.findingHead}>\n <span className={styles.localIcon} aria-hidden=\"true\">\n <IconCpu size={15} />\n </span>\n <ToneMark tone={finding.tone} label={finding.state} />\n </div>\n <p className={styles.lead}>{finding.summary}</p>\n <p className={styles.findingDetail}>{finding.meaning}</p>\n {finding.fix ? (\n <p className={styles.findingFix}>\n <span className={styles.fixLabel}>Fix</span>\n <span className={styles.fixText}>{finding.fix}</span>\n </p>\n ) : null}\n </StepBody>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Step 4 — autonomy\n// ---------------------------------------------------------------------------\n\n/** The Command bar's chip tones, in the tour's three (glyph + word, never colour alone). */\nfunction findingTone(tone: ChipTone | undefined): FindingTone {\n if (tone === 'success') return 'ok';\n if (tone === 'warning' || tone === 'danger') return 'attention';\n return 'unknown';\n}\n\n/**\n * Reads the SAME authority entry Command's bar reads (surface-data\n * authorityQuery), so \"Right now\" can never disagree with the switch — and\n * never claims a state it did not read: no answer is \"not reported\", with\n * the server's own reason.\n *\n * The next step is the one Command's \"Autonomy is off\" state names, decided\n * the same way (autonomy-off-model): with no grant, the one-time setup\n * command while the server cannot draft a grant yet (or we cannot tell);\n * once it can, \"Approve grant…\" — the same ⌘K command, which opens the\n * Touch ID sheet on Command. With a grant, the chip decides (re-approve /\n * renew), else Command itself.\n */\nfunction AutonomyStep() {\n const read = useQuery(authorityQuery);\n const [copied, setCopied] = useState<boolean | null>(null);\n const status = read.data?.value ?? null;\n const loading = read.data === undefined && read.status !== 'error';\n const mode = modeWord(status);\n const chip = grantChip(status, Date.now());\n const readiness = useDraftReadiness(status?.grant.state === 'none');\n const needsSetup = !status || (status.grant.state === 'none' && readiness !== 'ready');\n const detail = loading\n ? 'Reading the autonomy state…'\n : status\n ? chip.detail\n : (read.data?.reason ?? read.error?.message ?? 'The autonomy state could not be read.');\n\n return (\n <StepBody>\n <div className={styles.findingHead}>\n <span className={styles.stopName}>Right now</span>\n <ToneMark tone={loading ? 'unknown' : findingTone(mode.tone)} label={loading ? 'checking' : status ? mode.text : 'not reported'} />\n </div>\n <p className={styles.findingDetail}>{detail}</p>\n <p className={styles.lead}>\n The switch on Command <kbd className={styles.kbd}>⌘1</kbd> — Off, Propose, Autonomous — decides what the fleet\n may do on its own. Raising it past your grant asks for Touch ID; lowering it never does.\n </p>\n {needsSetup ? (\n <>\n <div className={styles.findingFix}>\n <span className={styles.fixLabel}>Set up</span>\n <code className={styles.code}>{AUTONOMY_SETUP_COMMAND}</code>\n <Button\n variant=\"subtle\"\n size=\"sm\"\n icon={<IconCopy size={13} />}\n onClick={() => {\n void copyAutonomySetupCommand().then(setCopied);\n }}\n >\n {copied ? 'Copied' : 'Copy'}\n </Button>\n </div>\n <p className={styles.aside} role={copied === false ? 'alert' : undefined}>\n {copied === false\n ? 'The clipboard is not available here — select the command and copy it by hand.'\n : 'Run it in a terminal. It stops for what only you can do — sudo, Touch ID, GitHub — and --dry-run prints every step first.'}\n </p>\n </>\n ) : chip.action ? (\n <Button variant=\"subtle\" icon={<IconLock size={14} />} onClick={() => executeCatalogCommand('autonomy.grant', { via: 'button' })}>\n {chip.action === 're-approve' ? 'Re-approve grant…' : 'Approve grant…'}\n </Button>\n ) : (\n <Button variant=\"subtle\" icon={<IconLock size={14} />} onClick={() => setVerseSection('command')}>\n Open Command\n </Button>\n )}\n <p className={styles.aside}>\n <kbd className={styles.kbd}>⌘K</kbd> “Autonomy: …” and “Approve grant…” work from any surface.\n </p>\n </StepBody>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Step 5 — the three stops\n// ---------------------------------------------------------------------------\n\nfunction StopsStep() {\n return (\n <StepBody>\n <p className={styles.lead}>\n Fleet <kbd className={styles.kbd}>⌘2</kbd> has three stop controls. They are not interchangeable, and the\n difference is the most important thing on this screen.\n </p>\n <ul className={styles.findings}>\n {STOP_CONTROLS.map((control) => (\n <li key={control.name} className={styles.finding}>\n <div className={styles.findingHead}>\n <span className={styles.stopName}>{control.name}</span>\n <ToneMark tone={control.tone} label={control.tone === 'ok' ? 'narrow' : 'global'} />\n </div>\n <p className={styles.findingDetail}>{control.scope}</p>\n <p className={styles.findingDetail}>{control.limit}</p>\n <p className={styles.findingNote}>{control.reversible}</p>\n </li>\n ))}\n </ul>\n </StepBody>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Step 6 — appearance, then go\n// ---------------------------------------------------------------------------\n\nfunction FinishStep() {\n return (\n <StepBody>\n <p className={styles.lead}>\n Settings <kbd className={styles.kbd}>⌘,</kbd> carries theme, accent hue, density, display font, corner radius\n and reduced motion. Every change applies as you make it — there is no save button.\n </p>\n <Button\n variant=\"subtle\"\n icon={<IconSliders size={14} />}\n onClick={() => setVerseSection('settings')}\n >\n Open Settings\n </Button>\n <p className={styles.aside}>\n You can replay this tour any time from Settings → Onboarding.\n </p>\n </StepBody>\n );\n}\n\n/** In ONBOARDING_STEPS order (the model test pins the ids; the flow test walks them). */\nconst STEP_COMPONENTS = [WelcomeStep, AccountsStep, LocalStep, AutonomyStep, StopsStep, FinishStep] as const;\n\n// ---------------------------------------------------------------------------\n// The chip and the card\n// ---------------------------------------------------------------------------\n\nexport function OnboardingFlow() {\n const { open, expanded, step } = useOnboarding();\n const index = clampStep(step);\n const meta = ONBOARDING_STEPS[index]!;\n const Step = STEP_COMPONENTS[index]!;\n const last = index === ONBOARDING_STEPS.length - 1;\n const total = ONBOARDING_STEPS.length;\n\n const dismiss = useCallback(() => dismissOnboarding(), []);\n const cardRef = useRef<HTMLElement>(null);\n const chipRef = useRef<HTMLButtonElement>(null);\n // Focus follows a fold / unfold the operator asked for — never a mount:\n // the chip appearing on first launch must not steal focus from the composer.\n const moveFocus = useRef(false);\n\n const expand = useCallback(() => {\n moveFocus.current = true;\n expandOnboarding();\n }, []);\n const collapse = useCallback(() => {\n moveFocus.current = true;\n collapseOnboarding();\n }, []);\n\n useEffect(() => {\n if (!moveFocus.current) return;\n moveFocus.current = false;\n if (expanded) cardRef.current?.focus();\n else chipRef.current?.focus();\n }, [expanded]);\n\n // Escape folds the card back to the chip — but ONLY when the focus is\n // inside the card.\n //\n // This card is deliberately not a modal (rule 1 above): the operator works\n // behind it, and every Escape they press for something else — closing the\n // command palette, backing out of a seat menu, stopping dictation — used to\n // land here too and permanently dismiss the tour. Scoped to the card, and\n // folding rather than answering, an Escape can never cost the operator the\n // tour; Skip and the chip's × are the only ways to silence it.\n useEffect(() => {\n if (!open || !expanded) return undefined;\n function onKey(event: globalThis.KeyboardEvent) {\n if (event.key !== 'Escape') return;\n const card = cardRef.current;\n if (!card || !(event.target instanceof Node) || !card.contains(event.target)) return;\n event.preventDefault();\n collapse();\n }\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [open, expanded, collapse]);\n\n if (!open) return null;\n\n if (!expanded) {\n return (\n <div className={styles.chip} role=\"region\" aria-label=\"Getting started\">\n <button\n ref={chipRef}\n type=\"button\"\n className={styles.chipOpen}\n aria-expanded=\"false\"\n title={`Getting started: ${meta.title}`}\n onClick={expand}\n >\n <span className={styles.chipLabel}>Getting started</span>\n <span className={styles.chipCount}>\n {index + 1}/{total}\n </span>\n <IconChevronRight size={13} aria-hidden=\"true\" focusable=\"false\" />\n </button>\n <button\n type=\"button\"\n className={styles.chipDismiss}\n aria-label=\"Dismiss getting started\"\n title=\"Dismiss getting started — replay it any time from Settings\"\n onClick={dismiss}\n >\n <IconX size={12} aria-hidden=\"true\" focusable=\"false\" />\n </button>\n </div>\n );\n }\n\n return (\n <aside ref={cardRef} tabIndex={-1} className={styles.card} aria-labelledby=\"verse-onboarding-title\" role=\"region\">\n <header className={styles.head}>\n <div className={styles.headText}>\n <p className={styles.eyebrow}>\n Getting started · {index + 1} of {total}\n </p>\n <h2 id=\"verse-onboarding-title\" className={styles.title}>\n {meta.title}\n </h2>\n <p className={styles.subtitle}>{meta.subtitle}</p>\n </div>\n <Button\n iconOnly\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Minimize getting started\"\n title=\"Minimize getting started\"\n aria-expanded=\"true\"\n icon={<IconChevronDown size={14} />}\n onClick={collapse}\n />\n </header>\n\n <Step />\n\n <footer className={styles.foot}>\n <ol className={styles.pips} aria-hidden=\"true\">\n {ONBOARDING_STEPS.map((s, i) => (\n <li key={s.id} className={styles.pip} data-state={i === index ? 'current' : i < index ? 'done' : 'todo'} />\n ))}\n </ol>\n <div className={styles.actions}>\n <Button variant=\"ghost\" size=\"sm\" onClick={dismiss}>\n Skip setup\n </Button>\n {index > 0 ? (\n <Button variant=\"subtle\" size=\"sm\" onClick={() => setOnboardingStep(index - 1)}>\n Back\n </Button>\n ) : null}\n {last ? (\n <Button\n variant=\"primary\"\n size=\"sm\"\n icon={<IconChat size={14} />}\n onClick={() => {\n completeOnboarding();\n // Switches to Chat and raises the one-shot ⌘N command the\n // chat section consumes by nonce (verse-ui-store.ts).\n requestVerseCommand('new-chat');\n }}\n >\n Start a first chat\n </Button>\n ) : (\n <Button variant=\"primary\" size=\"sm\" onClick={() => setOnboardingStep(index + 1)}>\n Next\n </Button>\n )}\n </div>\n </footer>\n </aside>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OnboardingFlow-D3yfITK1.js","assets/global-CXHHMz9o.js","assets/VerseConsoleApp-DeuBEvAO.js","assets/RouteErrorBoundary-BvhHNpE_.js","assets/format-DEAaVF6X.js","assets/format-DKrNjdwD.js","assets/verse-model-CSzzdyu2.js","assets/compaction-point-VL9oegWS.js","assets/CapacityStrip-Bx4c3dxD.js","assets/ProviderLogo-8WaUjTlN.js","assets/Tag-D4k5E3u0.js","assets/budget-queries-DjrPRFwl.js","assets/capacity-strip-model-C7cdQnuK.js","assets/seat-subscription-CLn2ReSZ.js","assets/context-model-2Owp2jYF.js","assets/transient-events-nTLhMBND.js","assets/useSeatsRefresh-BDlbDlIU.js","assets/Button-OjVJSrFq.js","assets/icons-D4s-jlxX.js","assets/verse-icons-wOet9JZy.js","assets/command-catalog-CmrHNFzh.js","assets/surface-data-DshUC_TU.js","assets/control-queries-DB6Kh7UN.js","assets/mutations-CbTSofVH.js","assets/primitives-DNI-uJBd.js","assets/focus-trap-BGOceFvj.js","assets/Dialog-BuIaG6HF.js","assets/Epistemic-CfqFe_aP.js","assets/StatusBadge-DQ1UtQAJ.js","assets/RefreshIndicator-DGubF4vR.js","assets/Segmented-Wynbg0F5.js","assets/EmptyState-DXkT4vhW.js","assets/Meter-BSVhU43Q.js","assets/Slider-Bd9YFWEV.js","assets/Switch-CenChEYf.js","assets/Select-DMyLCkId.js","assets/Input-u1YR_Ogl.js","assets/Sheet-DhXyIDmq.js","assets/usage-queries-MnUeYzwp.js","assets/AutonomyOffState-CXhXpsim.js","assets/nav-CmZcbPFJ.js","assets/clipboard-DkZdqlxf.js","assets/authority-model-CmnfJzmM.js","assets/copy-setup-CJQhFl-4.js","assets/global-BlI2BYa1.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.css","assets/Tag-D0rAEciH.css","assets/CapacityStrip-Cc28CyWk.css","assets/Button-DrnKsvnQ.css","assets/Dialog-tQ8kFulD.css","assets/Epistemic-OaGnEJkn.css","assets/StatusBadge-BVi0IBb9.css","assets/RefreshIndicator-CVv22U_j.css","assets/Segmented-BnjHbKzH.css","assets/EmptyState-B3YUPGaa.css","assets/Meter-CYt9KpM0.css","assets/Slider-AgAdMFpo.css","assets/Switch-CU044EaE.css","assets/Select-DSu5ghId.css","assets/Input-BQ3PR065.css","assets/Sheet-ChxlNivX.css","assets/AutonomyOffState-DmbE71vI.css","assets/OnboardingFlow-HUNQGQuU.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{a as e,c as t,n,t as r}from"./index-BG177cPN.js";import{t as i}from"./useOnboarding-CkOHadqC.js";var a=t(e(),1),o=n(),s=(0,a.lazy)(()=>r(()=>import(`./OnboardingFlow-D3yfITK1.js`).then(e=>({default:e.OnboardingFlow})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63])));function c(){return i().open?(0,o.jsx)(s,{}):null}export{c as OnboardingGate};
|
|
3
|
-
//# sourceMappingURL=OnboardingGate-DrDEVBqw.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ResourcesDrawer-BC93fzwQ.js","assets/focus-trap-BGOceFvj.js","assets/Button-OjVJSrFq.js","assets/icons-D4s-jlxX.js","assets/cloud-model-DoxBMDvx.js","assets/fleet-queries-tU6UEXN2.js","assets/control-queries-DB6Kh7UN.js","assets/mutations-CbTSofVH.js","assets/fleet-model-BRfRWkZl.js","assets/usage-queries-MnUeYzwp.js","assets/apps-model-CFGCUu9p.js","assets/global-BlI2BYa1.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.css","assets/Tag-D0rAEciH.css","assets/CapacityStrip-Cc28CyWk.css","assets/Button-DrnKsvnQ.css","assets/ResourcesDrawer-BCFJ2Uq8.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{a as e,c as t,n,s as r,t as i}from"./index-BG177cPN.js";import{c as a,o,p as s}from"./global-CXHHMz9o.js";import{t as c}from"./ProviderLogo-8WaUjTlN.js";import{Bt as l,D as u,Ft as d,It as f,Lt as p,N as ee,Rt as te,V as m,Vt as h,X as ne,_n as re,in as g,z as _}from"./VerseConsoleApp-DeuBEvAO.js";import{o as v}from"./verse-model-CSzzdyu2.js";import{i as y}from"./CapacityStrip-Bx4c3dxD.js";import{n as b,t as x}from"./capacity-strip-model-C7cdQnuK.js";import{a as ie}from"./command-catalog-CmrHNFzh.js";import{l as S,t as ae}from"./types-D5XOdyw8.js";import{t as oe}from"./binding-left-DZpq5sLf.js";import{o as C}from"./local-model-C9xNi9fN.js";var w=t(e(),1),T={handle:`_handle_1pzoz_6`,dot:`_dot_1pzoz_47`,railDot:`_railDot_1pzoz_67`,dock:`_dock_1pzoz_84`},E=n();function D(){return(0,E.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,"aria-hidden":`true`,focusable:`false`,children:[(0,E.jsx)(`path`,{d:`M2.75 4h10.5M2.75 8h10.5M2.75 12h10.5`,opacity:`.35`}),(0,E.jsx)(`path`,{d:`M2.75 4h7M2.75 8h4M2.75 12h8.5`})]})}function O({summary:e,rail:t=!1}){if(!e||e.tone===`unknown`)return null;let n=(0,E.jsx)(`span`,{className:T.dot,"data-tone":e.tone,"data-resources-dot":e.tone,"aria-hidden":`true`});return t?(0,E.jsx)(`span`,{className:T.railDot,children:n}):n}function k(e){return e?`Resources — ${e.spoken}`:`Resources`}function A({summary:e,shortcut:t,onOpen:n,onWarm:r}){return(0,E.jsx)(g,{label:k(e),shortcut:t,placement:`left`,children:(0,E.jsxs)(`button`,{type:`button`,className:T.handle,"data-resources-handle":!0,"aria-label":k(e),"aria-haspopup":`dialog`,onClick:n,onPointerEnter:r,onFocus:r,children:[(0,E.jsx)(D,{}),(0,E.jsx)(O,{summary:e})]})})}var j=new Set([`spent`,`signed-out`,`unavailable`]),se=[[`usable`,`usable`],[`low`,`running low`],[`spent`,`spent`],[`signed-out`,`signed out`],[`unavailable`,`unavailable`]];function ce(e,t){let n=e.filter(e=>e.kind===`subscription`).map(e=>x(e,{healthRead:t.healthRead,...t.now===void 0?{}:{now:t.now}}).kind),r=new Map;for(let e of n)r.set(e,(r.get(e)??0)+1);let i=se.filter(([e])=>r.has(e)).map(([e,t])=>`${r.get(e)} ${t}`).join(` · `),a=`unknown`;return n.some(e=>j.has(e))?a=`alert`:n.includes(`low`)?a=`tight`:n.includes(`usable`)&&(a=`ok`),{tone:a,spoken:i||(n.length===0?`no accounts connected`:`not read yet`)}}function M(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function N(e){return typeof e==`number`&&Number.isFinite(e)?e:null}function P(e){return typeof e==`string`&&e.trim().length>0?e.trim():null}var le=`An estimate from the sessions Verse launched — the real balance is on claude.ai.`;function ue(e){let t=M(e),n=M(t?.budget);if(!t||!n)return null;let r=N(n.creditsTotalUsd),i=N(n.estimatedSpentUsd),a=N(n.estimatedRemainingUsd);if(r===null||i===null&&a===null)return null;let o=Math.max(0,a??r-(i??0)),s=M(t.seat),c=M(n.canLaunch),l=P(n.balanceUrl),u=M(n.budget);return{totalUsd:r,spentUsd:i??Math.max(0,r-o),remainingUsd:o,remainingPercent:r>0?Math.max(0,Math.min(100,o/r*100)):0,running:Math.max(0,N(n.running)??0),sessionsToday:Math.max(0,N(n.sessionsToday)??0),maxSessionsPerDay:N(u?.maxSessionsPerDay),seatReady:s?.ready!==!1,seatReason:P(s?.reason),canLaunch:c?.ok!==!1,canLaunchReason:P(c?.reason),estimateNote:P(n.estimateNote)??le,balanceUrl:l!==null&&l.startsWith(`https://claude.ai/`)?l:ae}}function F(e){let t=Math.max(0,e);return t>=100||Number.isInteger(t)?`$${Math.round(t)}`:`$${t.toFixed(2)}`}var I={"llama-server":`llama-server`,ollama:`Ollama`,vllm:`vLLM`,unknown:`Serving runtime`},L={running:`Running`,starting:`Starting…`,stopping:`Stopping…`,stopped:`Stopped`,unknown:`State not reported`};function R(e){if(!e)return null;let t=[];e.model&&t.push(C(e.model)),e.contextTokens!==null&&t.push(`${v(e.contextTokens)} context per agent`),e.slotsTotal!==null&&e.slotsTotal>0&&t.push(e.slotsBusy===null?`${e.slotsTotal} slots`:`${e.slotsBusy} of ${e.slotsTotal} slots busy`);let n=e.state;return{name:I[e.kind]??I.unknown,state:n,word:L[n]??L.unknown,tone:n===`running`?`success`:n===`starting`||n===`stopping`?`warning`:`neutral`,detail:t.length>0?t.join(` · `):null,canStart:e.supervised&&n===`stopped`,canStop:e.supervised&&n===`running`,managedElsewhere:!e.supervised}}function z(e){let t=e.configuredContext,n=e.nativeContext;return t!==null&&e.contextTruncated&&n!==null?`${v(t)} of ${v(n)} context`:t===null?n===null?null:`${v(n)} context`:`${v(t)} context`}var B={key:`verse-resources-cloud`,fetch:async e=>{try{return{available:!0,credits:ue(await a(S,e))}}catch(e){if(e instanceof o&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{available:!1,credits:null}}}},V={cloud:6e4,local:3e4,runtime:15e3},H={bar:`_bar_uylkk_5`,row:`_row_uylkk_15`,line:`_line_uylkk_40`,battery:`_battery_uylkk_41`,cell:`_cell_uylkk_42`,logo:`_logo_uylkk_44`,cloudLogo:`_cloudLogo_uylkk_45`,name:`_name_uylkk_58`,value:`_value_uylkk_67`,nub:`_nub_uylkk_109`,tip:`_tip_uylkk_133`,tipHead:`_tipHead_uylkk_134`,tipSummary:`_tipSummary_uylkk_135`,tipLine:`_tipLine_uylkk_136`,tipHint:`_tipHint_uylkk_137`},de={usable:`ok`,low:`low`,spent:`out`,"signed-out":`out`,unavailable:`out`,checking:`unknown`,"not-checked":`unknown`};function fe(e,t){let n=[];for(let r of e){if(r.kind===`local`){n.push({key:`local`,engine:`local`,name:r.localCount>1?`Local models (${r.localCount})`:`Local model`,leftPercent:null,level:r.cls===`blocked`?`out`:r.cls===`unread`?`unknown`:`idle`,value:r.cls===`blocked`?`offline`:r.cls===`unread`?`not reported`:`ready`,summary:`${r.label}: ${r.summary}`,detail:[`No usage limits — runs on this Mac.`,...r.notes]});continue}let e=x(r,{healthRead:t.healthRead,now:t.now}),i=de[e.kind]??`unknown`,a=oe(r),o=i===`out`?e.kind===`spent`?`spent`:e.label.toLowerCase():a===null?`—`:`${u(a)} left`,s=r.windows.map(e=>{let t=e.limitReached?`limit reached`:e.usedPercent===null?`no reading`:`${u(e.usedPercent)} used`,n=e.resetText?e.resetText.replace(/^resets\s+/i,``):``;return`${e.label.charAt(0).toUpperCase()}${e.label.slice(1)}: ${t}${n?` · resets ${n}`:``}`});r.reserve&&s.push(r.reserve.label),e.usableAgain&&s.push(`Usable again ${e.usableAgain}`),e.checked&&s.push(`Checked ${e.checked}`),n.push({key:r.seatId,engine:r.engine,name:r.label,leftPercent:i===`out`?0:a,level:i,value:o,summary:`${r.label}: ${e.label}${e.detail?` · ${e.detail}`:``}`,detail:s})}let r={ok:0,low:1,idle:2,unknown:3,out:4};return n.sort((e,t)=>r[e.level]-r[t.level])}function U({left:e,level:t,vertical:n}){let r=e===null?t===`idle`?100:0:Math.max(e>0?6:0,e);return(0,E.jsxs)(`span`,{className:H.battery,"data-level":t,"data-vertical":n||void 0,"aria-hidden":`true`,children:[(0,E.jsx)(`span`,{className:H.cell,style:{"--fill":`${r}%`}}),(0,E.jsx)(`span`,{className:H.nub})]})}function pe({row:e}){return(0,E.jsxs)(`div`,{className:H.tip,children:[(0,E.jsxs)(`div`,{className:H.tipHead,children:[(0,E.jsx)(c,{engine:e.engine,size:14}),(0,E.jsx)(`strong`,{children:e.name})]}),(0,E.jsx)(`div`,{className:H.tipSummary,children:e.summary.slice(e.name.length+2)}),e.detail.map(e=>(0,E.jsx)(`div`,{className:H.tipLine,children:e},e)),(0,E.jsx)(`div`,{className:H.tipHint,children:`Click for Resources · ⌘.`})]})}function W({expanded:e}){let t=y(),n=s(B),r=Date.now(),i=(0,w.useMemo)(()=>t.loading?[]:fe(b(t.seats,{health:t.health,budget:t.budget,local:`collapse`,now:r}),{healthRead:t.health!==null,now:r}),[t.loading,t.seats,t.health,t.budget]),a=n.data?.credits??null,o=a&&a.totalUsd>0?a.remainingUsd/a.totalUsd*100:null,l=a?a.remainingUsd<=0?`out`:(o??0)<20?`low`:`ok`:`unknown`;return i.length===0&&!a?null:(0,E.jsxs)(`div`,{className:H.bar,"data-expanded":e||void 0,role:`group`,"aria-label":`Resources at a glance`,children:[i.map(t=>(0,E.jsx)(g,{content:(0,E.jsx)(pe,{row:t}),placement:`right`,children:(0,E.jsx)(`button`,{type:`button`,className:H.row,"data-level":t.level,"aria-label":`${t.summary}. Open Resources`,onClick:()=>p(),children:e?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsxs)(`span`,{className:H.line,children:[(0,E.jsx)(c,{engine:t.engine,size:14,className:H.logo}),(0,E.jsx)(`span`,{className:H.name,children:t.name})]}),(0,E.jsxs)(`span`,{className:H.line,children:[(0,E.jsx)(U,{left:t.leftPercent,level:t.level,vertical:!1}),(0,E.jsx)(`span`,{className:H.value,children:t.value})]})]}):(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(c,{engine:t.engine,size:14,className:H.logo}),(0,E.jsx)(U,{left:t.leftPercent,level:t.level,vertical:!0})]})})},t.key)),a?(0,E.jsx)(g,{content:(0,E.jsxs)(`div`,{className:H.tip,children:[(0,E.jsxs)(`div`,{className:H.tipHead,children:[(0,E.jsx)(c,{engine:`claude`,size:14}),(0,E.jsx)(`strong`,{children:`Cloud credits`})]}),(0,E.jsxs)(`div`,{className:H.tipSummary,children:[F(a.remainingUsd),` of `,F(a.totalUsd),` left · estimate`]}),(0,E.jsxs)(`div`,{className:H.tipLine,children:[a.running,` running · `,a.sessionsToday,` today`]}),(0,E.jsx)(`div`,{className:H.tipHint,children:`Click for Resources · ⌘.`})]}),placement:`right`,children:(0,E.jsx)(`button`,{type:`button`,className:H.row,"data-level":l,"aria-label":`Cloud credits: about ${F(a.remainingUsd)} of ${F(a.totalUsd)} left. Open Resources`,onClick:()=>p(),children:e?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsxs)(`span`,{className:H.line,children:[(0,E.jsx)(`span`,{className:H.cloudLogo,children:(0,E.jsx)(c,{engine:`claude`,size:14,className:H.logo})}),(0,E.jsx)(`span`,{className:H.name,children:`Cloud credits`})]}),(0,E.jsxs)(`span`,{className:H.line,children:[(0,E.jsx)(U,{left:o,level:l,vertical:!1}),(0,E.jsxs)(`span`,{className:H.value,children:[F(a.remainingUsd),` left`]})]})]}):(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(`span`,{className:H.cloudLogo,children:(0,E.jsx)(c,{engine:`claude`,size:14,className:H.logo})}),(0,E.jsx)(U,{left:o,level:l,vertical:!0})]})})}):null]})}function me(){let e=y({withBudget:!1}),t=e.health!==null,n=(0,w.useMemo)(()=>e.loading?null:ce(b(e.seats,{health:e.health,local:`hide`}),{healthRead:t}),[e.loading,e.seats,e.health,t]);return(0,w.useEffect)(()=>{l(n)},[n]),null}var he=r({ResourcesBar:()=>W,ResourcesChrome:()=>Q,ResourcesRailButton:()=>$,preloadResourcesDrawer:()=>q,resourcesDocked:()=>Z,runResourcesCommand:()=>Y}),G=()=>i(()=>import(`./ResourcesDrawer-BC93fzwQ.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17])),K=(0,w.lazy)(()=>G().then(e=>({default:e.ResourcesDrawer})));function q(){return G()}var J=()=>{G().catch(()=>void 0)};function Y(e){if(f().open&&(e===`key`||e===`button`)){d();return}ne(),p()}function X(){let e=ie(`resources.toggle`)?.keys[0];return e?re(e):void 0}function Z(e,t){return e.open&&e.pinned&&!t}function Q({compact:e}){let t=h(),{overlay:n}=ee(),r=Z(t,e);return(0,w.useEffect)(()=>m(`resources.toggle`,e=>Y(e.via)),[]),(0,w.useEffect)(()=>m(`resources.bar.toggle`,()=>te(!f().bar)),[]),(0,w.useEffect)(()=>{n!==null&&!Z(f(),e)&&d()},[n,e]),(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(me,{}),r?(0,E.jsx)(`div`,{className:T.dock,"data-resources-dock":!0,children:(0,E.jsx)(w.Suspense,{fallback:null,children:(0,E.jsx)(K,{mode:`docked`})})}):null,t.open&&!r?(0,E.jsx)(w.Suspense,{fallback:null,children:(0,E.jsx)(K,{mode:`overlay`,compact:e})}):null,t.open?null:(0,E.jsx)(A,{summary:t.summary,shortcut:X(),onWarm:J,onOpen:()=>_(`resources.toggle`,{via:`button`})})]})}function $({expanded:e,buttonClass:t,iconClass:n,labelClass:r}){let i=h(),a=k(i.summary);return(0,E.jsx)(g,{label:a,shortcut:X(),placement:`right`,disabled:e,children:(0,E.jsxs)(`button`,{type:`button`,className:t,"aria-label":a,"aria-expanded":i.open,"data-resources-rail":!0,onPointerEnter:J,onClick:()=>_(`resources.toggle`,{via:`button`}),children:[(0,E.jsxs)(`span`,{className:n,children:[(0,E.jsx)(D,{}),(0,E.jsx)(O,{summary:i.summary,rail:!0})]}),e?(0,E.jsx)(`span`,{className:r,children:`Resources`}):null]})})}export{W as ResourcesBar,Q as ResourcesChrome,$ as ResourcesRailButton,z as a,F as i,V as n,R as o,q as preloadResourcesDrawer,B as r,Z as resourcesDocked,Y as runResourcesCommand,he as t};
|
|
3
|
-
//# sourceMappingURL=ResourcesChrome-C2ZrA7la.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SessionSearch-DfJIcxxM.js","assets/context-queries-wvcRnV-I.js","assets/verse-store-DNVRuiJL.js","assets/transient-events-nTLhMBND.js","assets/context-model-2Owp2jYF.js","assets/use-token-gate-DfEja7Wr.js","assets/context.module-BijAfoJw.js","assets/global-BlI2BYa1.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.css","assets/context-DiToyj6s.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{a as e,c as t,n,t as r}from"./index-BG177cPN.js";import{i,p as a}from"./global-CXHHMz9o.js";import{t as o}from"./Dialog-BuIaG6HF.js";import{t as s}from"./RefreshIndicator-DGubF4vR.js";import{E as c,_ as l,_n as u,g as d,in as f,l as p,s as m,y as h}from"./VerseConsoleApp-DeuBEvAO.js";import{_ as ee,b as g,l as _,v}from"./verse-model-CSzzdyu2.js";import{n as y}from"./seat-subscription-CLn2ReSZ.js";import{_ as b,c as x,f as S,g as C,h as w,i as T,l as E,n as D,r as O,t as te,v as k}from"./workspace-model-BdIVybKr.js";import{n as A,t as j}from"./folder-picker-C8zo3A56.js";import{t as M}from"./Button-OjVJSrFq.js";import{t as N}from"./ActionMenu-DffwPklw.js";import{a as P,c as F,d as I,o as L,s as R,t as z,u as B}from"./dock-icons-BBUGl4tE.js";import{n as V,r as H,t as U}from"./sidebar-model-CjQLvdag.js";import{a as W,c as G,u as ne}from"./verse-icons-wOet9JZy.js";import{a as K}from"./command-catalog-CmrHNFzh.js";var q=t(e(),1),J={width:`_width_ifku5_4`,form:`_form_ifku5_6`,field:`_field_ifku5_7`,label:`_label_ifku5_8`,select:`_select_ifku5_17`,input:`_input_ifku5_18`,hint:`_hint_ifku5_38`,error:`_error_ifku5_39`,rootRow:`_rootRow_ifku5_49`,rowButton:`_rowButton_ifku5_58`,addRoot:`_addRoot_ifku5_59`,checkbox:`_checkbox_ifku5_76`,priorityRow:`_priorityRow_ifku5_84`,priorityPath:`_priorityPath_ifku5_90`,actions:`_actions_ifku5_101`,spacer:`_spacer_ifku5_102`,confirm:`_confirm_ifku5_103`,cancel:`_cancel_ifku5_105`,save:`_save_ifku5_106`,remove:`_remove_ifku5_107`,danger:`_danger_ifku5_108`},Y=n();function X(e){let{open:t,workspace:n,initialRoots:r,priorities:i,focusSectionId:a=null,onClose:s,onSaved:c,onDeleted:u}=e,f=(0,q.useId)(),g=(0,q.useId)(),[_,v]=(0,q.useState)(``),[y,C]=(0,q.useState)([``]),[k,M]=(0,q.useState)(!1),[N,P]=(0,q.useState)(!1),[F,I]=(0,q.useState)({}),[L,R]=(0,q.useState)(!1),[z,B]=(0,q.useState)(!1),[V,H]=(0,q.useState)(null);(0,q.useEffect)(()=>{if(!t)return;let e=n;v(e?.name??``),C(e?b(e):[...r??[]].filter(e=>e.length>0)),M(e?.section??!1),P(e!==null&&a===e.id),I({}),R(!1),B(!1),H(null)},[t]);let U=y.length===0?[``]:y,W=j();function G(e,t){C(U.map((n,r)=>r===e?t:n))}async function ne(e){let t=await A();t!==null&&t.length>0&&G(e,t)}function K(e){return F[e]??E(e,i)}async function X(e){e.preventDefault();let t=w(_,U);if(!t.ok){H(t.error);return}B(!0),H(null);try{let e=n===null?await m({name:t.name,roots:t.roots,section:k}):await h(n.id,{name:t.name,roots:t.roots,section:k});for(let e of t.roots){let t=F[e];t!==void 0&&t!==E(e,i)&&await l(e,t)}let r=n!==null&&a===n.id;k&&N!==r&&await d(N?e.id:null),c?.(e),s()}catch(e){H(e instanceof Error?e.message:String(e))}finally{B(!1)}}async function Z(){if(n!==null){B(!0),H(null);try{await p(n.id),u?.(n.id),s()}catch(e){H(e instanceof Error?e.message:String(e)),B(!1)}}}return(0,Y.jsx)(o,{open:t,onClose:s,titleId:f,title:n===null?`Save a project`:`Edit project`,description:`Saved projects stay in the picker — they do not need a chat on them first.`,widthClassName:J.width,children:(0,Y.jsxs)(`form`,{className:J.form,onSubmit:e=>void X(e),noValidate:!0,children:[(0,Y.jsxs)(`label`,{className:J.field,htmlFor:g,children:[(0,Y.jsx)(`span`,{className:J.label,children:`Name`}),(0,Y.jsx)(`input`,{id:g,className:J.input,value:_,onChange:e=>v(e.target.value),placeholder:`Defaults to the folder’s own name`,maxLength:120,autoComplete:`off`})]}),(0,Y.jsxs)(`div`,{className:J.field,children:[(0,Y.jsx)(`span`,{className:J.label,children:`Folders`}),(0,Y.jsx)(`p`,{className:J.hint,children:`The first folder is the primary: it is the chat’s working directory. Move a folder to the top to make it the primary.`}),U.map((e,t)=>(0,Y.jsxs)(`div`,{className:J.rootRow,children:[(0,Y.jsx)(`input`,{className:J.input,value:e,title:e||void 0,onChange:e=>G(t,e.target.value),placeholder:`/absolute/path/to/folder`,"aria-label":S(t),autoComplete:`off`,spellCheck:!1}),W?(0,Y.jsx)(`button`,{type:`button`,className:J.rowButton,onClick:()=>void ne(t),"aria-label":`Choose ${S(t).toLowerCase()}`,children:`Choose folder…`}):null,(0,Y.jsx)(`button`,{type:`button`,className:J.rowButton,disabled:t===0,onClick:()=>C(x(U,t,`up`)),"aria-label":`Move ${S(t).toLowerCase()} up`,title:`Move ${S(t).toLowerCase()} up`,children:(0,Y.jsx)(`span`,{"aria-hidden":`true`,children:`↑`})}),(0,Y.jsx)(`button`,{type:`button`,className:J.rowButton,disabled:t===U.length-1,onClick:()=>C(x(U,t,`down`)),"aria-label":`Move ${S(t).toLowerCase()} down`,title:`Move ${S(t).toLowerCase()} down`,children:(0,Y.jsx)(`span`,{"aria-hidden":`true`,children:`↓`})}),(0,Y.jsx)(`button`,{type:`button`,className:J.rowButton,disabled:U.length===1,onClick:()=>C(U.filter((e,n)=>n!==t)),"aria-label":`Remove ${S(t).toLowerCase()}`,children:`Remove`})]},t)),U.length<8?(0,Y.jsx)(`button`,{type:`button`,className:J.addRoot,onClick:()=>C([...U,``]),children:`Add a folder`}):null,U.length>1?(0,Y.jsx)(`p`,{className:J.hint,children:te}):null]}),(0,Y.jsxs)(`div`,{className:J.field,children:[(0,Y.jsxs)(`label`,{className:J.checkbox,children:[(0,Y.jsx)(`input`,{type:`checkbox`,checked:k,onChange:e=>M(e.target.checked)}),(0,Y.jsx)(`span`,{children:`Offer this project to the autonomous lane as a section`})]}),k?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`label`,{className:J.checkbox,children:[(0,Y.jsx)(`input`,{type:`checkbox`,checked:N,onChange:e=>P(e.target.checked)}),(0,Y.jsx)(`span`,{children:`Focus the fleet on this section`})]}),(0,Y.jsx)(`p`,{className:J.hint,children:O}),U.filter(e=>e.trim().length>0).map((e,t)=>(0,Y.jsxs)(`div`,{className:J.priorityRow,children:[(0,Y.jsx)(`span`,{className:J.priorityPath,title:e,children:ee(e.trim())}),(0,Y.jsx)(`select`,{className:J.select,"aria-label":`Priority for ${e}`,value:K(e.trim()),onChange:t=>I({...F,[e.trim()]:t.target.value}),children:T.map(e=>(0,Y.jsx)(`option`,{value:e,children:D[e]},e))})]},`${e}-${t}`))]}):null]}),V?(0,Y.jsx)(`p`,{role:`alert`,className:J.error,children:V}):null,(0,Y.jsxs)(`div`,{className:J.actions,children:[n===null?null:L?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`span`,{className:J.confirm,children:`Forget this project? Chats already on it are untouched.`}),(0,Y.jsx)(`button`,{type:`button`,className:J.danger,onClick:()=>void Z(),disabled:z,children:`Forget`}),(0,Y.jsx)(`button`,{type:`button`,className:J.cancel,onClick:()=>R(!1),children:`Keep`})]}):(0,Y.jsx)(`button`,{type:`button`,className:J.remove,onClick:()=>R(!0),disabled:z,children:`Forget project`}),(0,Y.jsx)(`span`,{className:J.spacer}),(0,Y.jsx)(`button`,{type:`button`,className:J.cancel,onClick:s,children:`Cancel`}),(0,Y.jsx)(`button`,{type:`submit`,className:J.save,disabled:z,children:z?`Saving…`:`Save project`})]})]})})}var Z={projects:`_projects_izay2_4`,head:`_head_izay2_10`,headText:`_headText_izay2_23`,add:`_add_izay2_25`,list:`_list_izay2_39`,project:`_project_izay2_4`,name:`_name_izay2_55`,summary:`_summary_izay2_64`,empty:`_empty_izay2_72`};function re(){let e=a(c),t=e.data?.workspaces??[],[n,r]=(0,q.useState)({open:!1,workspace:null});return(0,Y.jsxs)(`section`,{className:Z.projects,"aria-label":`Saved projects`,children:[(0,Y.jsxs)(`h2`,{className:Z.head,children:[(0,Y.jsx)(`span`,{className:Z.headText,children:`Projects`}),(0,Y.jsx)(`button`,{type:`button`,className:Z.add,title:`Save a project`,"aria-label":`Save a project`,onClick:()=>r({open:!0,workspace:null}),children:(0,Y.jsx)(W,{})})]}),t.length>0?(0,Y.jsx)(`ul`,{className:Z.list,children:t.map(e=>{let t=C(e)??``;return(0,Y.jsx)(`li`,{children:(0,Y.jsxs)(`button`,{type:`button`,className:Z.project,title:t?`${e.name}\n${t}`:e.name,"aria-label":`Edit project ${e.name}`,onClick:()=>r({open:!0,workspace:e}),children:[(0,Y.jsx)(`span`,{className:Z.name,children:e.name}),(0,Y.jsx)(`span`,{className:Z.summary,children:k(e)})]})},e.id)})}):e.status===`error`?null:(0,Y.jsx)(`p`,{className:Z.empty,children:`No saved projects yet. Press + to keep a folder you work in.`}),(0,Y.jsx)(X,{open:n.open,workspace:n.workspace,priorities:e.data?.priorities,focusSectionId:e.data?.focusSectionId??null,onClose:()=>r({open:!1,workspace:null})})]})}var Q={sidebar:`_sidebar_3wi59_1`,head:`_head_3wi59_9`,headDragStrip:`_headDragStrip_3wi59_40`,search:`_search_3wi59_51`,searchIcon:`_searchIcon_3wi59_58`,iconButton:`_iconButton_3wi59_80`,scroll:`_scroll_3wi59_98`,skeleton:`_skeleton_3wi59_105`,error:`_error_3wi59_106`,empty:`_empty_3wi59_125`,emptyTitle:`_emptyTitle_3wi59_131`,emptyCompact:`_emptyCompact_3wi59_135`,emptyAction:`_emptyAction_3wi59_138`,emptyKey:`_emptyKey_3wi59_153`,group:`_group_3wi59_163`,groupTitle:`_groupTitle_3wi59_167`,groupName:`_groupName_3wi59_177`,enrolled:`_enrolled_3wi59_178`,groupCount:`_groupCount_3wi59_182`,list:`_list_3wi59_192`,session:`_session_3wi59_195`,marker:`_marker_3wi59_247`,"engine-claude":`_engine-claude_3wi59_253`,"engine-codex":`_engine-codex_3wi59_254`,"engine-grok":`_engine-grok_3wi59_255`,"engine-local":`_engine-local_3wi59_256`,sessionText:`_sessionText_3wi59_195`,running:`_running_3wi59_267`,"verse-pulse":`_verse-pulse_3wi59_1`,errored:`_errored_3wi59_274`,seatSpent:`_seatSpent_3wi59_291`,time:`_time_3wi59_304`,footer:`_footer_3wi59_325`,footerButton:`_footerButton_3wi59_332`,confirmActions:`_confirmActions_3wi59_345`,filters:`_filters_3wi59_362`,filter:`_filter_3wi59_362`,filterCount:`_filterCount_3wi59_391`,groupToggle:`_groupToggle_3wi59_400`,twist:`_twist_3wi59_416`,row:`_row_3wi59_428`,sessionBody:`_sessionBody_3wi59_431`,liveLine:`_liveLine_3wi59_437`,statusRunning:`_statusRunning_3wi59_449`,elapsed:`_elapsed_3wi59_454`,unread:`_unread_3wi59_460`,rowMore:`_rowMore_3wi59_469`,renameRow:`_renameRow_3wi59_495`,renameInput:`_renameInput_3wi59_496`},ie=new Map,ae=(0,q.lazy)(()=>r(()=>import(`./SessionSearch-DfJIcxxM.js`).then(e=>({default:e.SessionSearch})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])));function oe(e){let{sessions:t,sessionsStatus:n,sessionsError:r,projects:a,seats:c,selectedId:l,query:d,onQuery:p,onSelect:m,onNew:h,onRetry:ee,onCollapse:g,onDisconnect:_,activity:v=null,meta:y=null,localSeen:b=ie,actions:x}=e,S=(0,q.useId)(),C=K(`chat.new`)?.keys[0],w=K(`chat.sidebar`)?.keys[0],T=C?u(C):null,E=w?u(w):null,[D,O]=(0,q.useState)(`all`),[te,k]=(0,q.useState)(!1),[A,j]=(0,q.useState)(null),[P,F]=(0,q.useState)(null),[I,L]=(0,q.useState)(!1),R=(0,q.useId)(),z=(0,q.useRef)(null),B=(0,q.useMemo)(()=>H({sessions:t,projects:a,query:d,filter:D,activity:v,meta:y,localSeen:b,selectedId:l}),[t,a,d,D,v,y,b,l]),V=n===`loading`||n===`idle`&&t.length===0,U=d.trim().length>0,J=(0,q.useRef)(null);function X(e){if(e.key!==`ArrowDown`)return;let t=J.current?.querySelector($);t&&(e.preventDefault(),t.focus())}function Z(e,t,n){x&&F({row:e,anchor:t,from:n})}return(0,Y.jsxs)(`nav`,{className:Q.sidebar,"aria-label":`Chats`,children:[(0,Y.jsxs)(`div`,{className:Q.head,children:[(0,Y.jsx)(`div`,{className:Q.headDragStrip,"aria-hidden":`true`}),(0,Y.jsxs)(`label`,{className:Q.search,htmlFor:S,children:[(0,Y.jsx)(`span`,{className:Q.searchIcon,"aria-hidden":`true`,children:(0,Y.jsx)(G,{})}),(0,Y.jsx)(`span`,{className:`visually-hidden`,children:`Search chats and messages`}),(0,Y.jsx)(`input`,{id:S,type:`search`,value:d,placeholder:`Search chats`,autoComplete:`off`,onChange:e=>p(e.target.value),onKeyDown:X})]}),(0,Y.jsx)(f,{label:`New chat`,shortcut:T??void 0,placement:`bottom`,children:(0,Y.jsx)(`button`,{type:`button`,className:Q.iconButton,onClick:h,"aria-label":`New chat`,children:(0,Y.jsx)(W,{})})}),(0,Y.jsx)(f,{label:`Hide chat list`,shortcut:E??void 0,placement:`bottom`,children:(0,Y.jsx)(`button`,{type:`button`,className:Q.iconButton,onClick:g,"aria-label":`Hide chat list`,children:(0,Y.jsx)(ne,{})})}),n===`refreshing`?(0,Y.jsx)(s,{label:`Refreshing chats`}):null]}),(0,Y.jsx)(ue,{value:D,counts:B.counts,onChange:O}),(0,Y.jsxs)(`div`,{ref:J,className:Q.scroll,onKeyDown:se,children:[(0,Y.jsx)(re,{}),V?(0,Y.jsxs)(`div`,{className:Q.skeleton,"aria-busy":`true`,children:[(0,Y.jsx)(i,{width:`48%`}),(0,Y.jsx)(i,{width:`86%`}),(0,Y.jsx)(i,{width:`74%`}),(0,Y.jsx)(i,{width:`40%`}),(0,Y.jsx)(i,{width:`80%`})]}):n===`error`&&t.length===0?(0,Y.jsxs)(`div`,{role:`alert`,className:Q.error,children:[(0,Y.jsx)(`p`,{children:r??`Could not load chats.`}),(0,Y.jsx)(`button`,{type:`button`,onClick:ee,children:`Retry`})]}):B.groups.length===0?(0,Y.jsx)(de,{query:d,filter:D,hasSessions:t.length>0,newChatHint:T,onClearQuery:()=>p(``),onClearFilter:()=>O(`all`),onNew:h}):B.groups.map(e=>(0,Y.jsx)(fe,{group:e,seats:c,selectedId:l,renaming:A,open:e.kind!==`archived`||te||U||D!==`all`,onToggle:e.kind===`archived`?()=>k(e=>!e):void 0,onSelect:m,onMenu:x?Z:void 0,onRenameDone:async(e,t)=>{j(null),x&&t&&t!==e.session.title&&await x.rename(e.session.id,t)}},e.id)),U?(0,Y.jsx)(q.Suspense,{fallback:null,children:(0,Y.jsx)(ae,{query:d,onOpenSession:m,selectedId:l})}):null]}),(0,Y.jsx)(`footer`,{className:Q.footer,children:(0,Y.jsx)(f,{label:`Signs this window out: clears cached chats and unsent drafts here. Chats stay on the hub.`,placement:`top`,children:(0,Y.jsx)(`button`,{type:`button`,onClick:()=>L(!0),className:Q.footerButton,"aria-haspopup":`dialog`,children:`Disconnect from hub`})})}),(0,Y.jsx)(o,{open:I,onClose:()=>L(!1),titleId:R,title:`Disconnect from this hub?`,initialFocusRef:z,description:`Unsent drafts in open chats will be cleared. Your chats stay on the hub; you will need the read token to reconnect.`,children:(0,Y.jsxs)(`div`,{className:Q.confirmActions,children:[(0,Y.jsx)(M,{ref:z,variant:`subtle`,onClick:()=>L(!1),children:`Cancel`}),(0,Y.jsx)(M,{variant:`danger`,onClick:()=>{L(!1),_()},children:`Disconnect`})]})}),P&&x?(0,Y.jsx)(N,{label:`Actions for ${P.row.session.title||`Untitled chat`}`,anchor:P.anchor,returnFocus:P.from,onClose:()=>F(null),items:le(P.row,x,B.metaAvailable,()=>j(P.row.session.id))}):null]})}var $=`[data-focus-key^="verse-session:"]`;function se(e){if(e.altKey||e.metaKey||e.ctrlKey||e.shiftKey)return;let t=e.target;if(!t.matches($))return;let n=[...e.currentTarget.querySelectorAll($)],r=n.indexOf(t),i;if(e.key===`ArrowDown`)i=n[r+1];else if(e.key===`ArrowUp`)i=n[r-1];else if(e.key===`Home`)i=n[0];else if(e.key===`End`)i=n[n.length-1];else return;e.preventDefault(),i?.focus()}function ce(e){switch(e.kind){case`running`:return`Running`;case`failed`:return`Last turn failed`;case`unread`:return`${e.newTurns} new turn${e.newTurns===1?``:`s`}`;default:return null}}function le(e,t,n,r){let i=e.session.id,a=e.status.kind===`running`,o=t.dispatchEnabled?null:`This server was started without dispatch.`,s=o??(n?null:`Not available on this server yet.`);return[{id:`pin`,label:e.pinned?`Unpin`:`Pin`,icon:(0,Y.jsx)(R,{size:14}),disabled:s!==null,reason:s,onSelect:()=>t.setPinned(i,!e.pinned)},{id:`archive`,label:e.archived?`Unarchive`:`Archive`,icon:(0,Y.jsx)(z,{size:14}),disabled:s!==null,reason:s,onSelect:()=>t.setArchived(i,!e.archived)},{id:`rename`,label:`Rename`,icon:(0,Y.jsx)(F,{size:14}),disabled:o!==null,reason:o,onSelect:r},{id:`handoff`,label:`Continue in a fresh chat…`,icon:(0,Y.jsx)(P,{size:14}),disabled:o!==null||a,reason:o??(a?`Available when its turn finishes.`:null),onSelect:()=>t.handoff(i)},{id:`delete`,label:`Delete…`,icon:(0,Y.jsx)(B,{size:14}),danger:!0,separated:!0,disabled:o!==null||a,reason:o??(a?`Stop its turn before deleting.`:null),onSelect:()=>t.requestDelete(i)}]}function ue({value:e,counts:t,onChange:n}){let r=(0,q.useRef)(new Map);function i(t){let i=U.indexOf(e),a;t.key===`ArrowRight`||t.key===`ArrowDown`?a=U[(i+1)%U.length]:t.key===`ArrowLeft`||t.key===`ArrowUp`?a=U[(i-1+U.length)%U.length]:t.key===`Home`?a=U[0]:t.key===`End`&&(a=U[U.length-1]),a&&(t.preventDefault(),n(a),r.current.get(a)?.focus())}return(0,Y.jsx)(`div`,{className:Q.filters,role:`radiogroup`,"aria-label":`Show chats`,onKeyDown:i,children:U.map(i=>{let a=t[i],o=i===e;return(0,Y.jsxs)(`button`,{ref:e=>{e?r.current.set(i,e):r.current.delete(i)},type:`button`,role:`radio`,"aria-checked":o,tabIndex:o?0:-1,className:Q.filter,"data-filter":i,onClick:()=>n(i),children:[V[i],i!==`all`&&a>0?(0,Y.jsx)(`span`,{className:Q.filterCount,children:a}):null]},i)})})}function de({query:e,filter:t,hasSessions:n,newChatHint:r,onClearQuery:i,onClearFilter:a,onNew:o}){if(e.trim())return(0,Y.jsxs)(`div`,{className:`${Q.empty} ${Q.emptyCompact}`,children:[(0,Y.jsxs)(`p`,{className:Q.emptyTitle,children:[`No chat titles match “`,e,`”`]}),(0,Y.jsx)(`p`,{children:`Titles and projects match as you type. Chats whose messages match, if any, are listed below.`}),(0,Y.jsx)(`button`,{type:`button`,className:Q.emptyAction,onClick:i,children:`Clear search`})]});if(t!==`all`&&n){let e=t===`running`?`No chat is running`:t===`needs-you`?`Nothing needs you`:`No pinned chats`;return(0,Y.jsxs)(`div`,{className:`${Q.empty} ${Q.emptyCompact}`,children:[(0,Y.jsx)(`p`,{className:Q.emptyTitle,children:e}),t===`pinned`?(0,Y.jsx)(`p`,{children:`Pin a chat from its row menu — hover it, or right-click.`}):null,(0,Y.jsx)(`button`,{type:`button`,className:Q.emptyAction,onClick:a,children:`Show all chats`})]})}return(0,Y.jsxs)(`div`,{className:Q.empty,children:[(0,Y.jsx)(`p`,{className:Q.emptyTitle,children:`No chats yet`}),(0,Y.jsx)(`p`,{children:`Start one on any project with any seat.`}),(0,Y.jsxs)(`button`,{type:`button`,className:Q.emptyAction,onClick:o,children:[`Start your first chat `,r?(0,Y.jsx)(`kbd`,{className:Q.emptyKey,children:r}):null]})]})}function fe({group:e,seats:t,selectedId:n,renaming:r,open:i,onToggle:a,onSelect:o,onMenu:s,onRenameDone:c}){let l=(0,q.useId)();return(0,Y.jsxs)(`section`,{className:Q.group,"aria-label":e.label,"data-group":e.kind,children:[(0,Y.jsxs)(`h2`,{className:Q.groupTitle,title:e.projectPath??void 0,children:[a?(0,Y.jsxs)(`button`,{type:`button`,className:Q.groupToggle,"aria-expanded":i,"aria-controls":l,onClick:a,children:[(0,Y.jsx)(`span`,{className:Q.twist,"data-open":i||void 0,"aria-hidden":`true`}),(0,Y.jsx)(`span`,{className:Q.groupName,children:e.label})]}):(0,Y.jsx)(`span`,{className:Q.groupName,children:e.label}),e.enrolled?(0,Y.jsx)(`span`,{className:Q.enrolled,children:`enrolled`}):null,(0,Y.jsx)(`span`,{className:Q.groupCount,"aria-hidden":`true`,children:e.rows.length})]}),(0,Y.jsx)(`ul`,{id:l,className:Q.list,hidden:!i,children:i?e.rows.map(e=>(0,Y.jsx)(`li`,{children:r===e.session.id?(0,Y.jsx)(he,{row:e,onDone:t=>{c(e,t)}}):(0,Y.jsx)(pe,{row:e,seats:t,selected:e.session.id===n,onSelect:o,onMenu:s})},e.session.id)):null})]})}function pe({row:e,seats:t,selected:n,onSelect:r,onMenu:i}){let{session:a,status:o}=e,s=v(t,a.seatId),c=s===void 0?null:y(s),l=o.kind===`running`&&c?.cls===`blocked`,u=[a.title||`Untitled chat`,g(t,a),c===null||c.cls===`ready`||c.cls===`unread`?null:c.summary,ce(o)].filter(e=>e!==null).join(` · `),d=(0,q.useRef)(null);function p(t){i&&(t.preventDefault(),i(e,{x:t.clientX,y:t.clientY},t.currentTarget))}function m(t){if(i&&(t.key===`ContextMenu`||t.key===`F10`&&t.shiftKey)){t.preventDefault();let n=t.currentTarget.getBoundingClientRect();i(e,{x:n.left+24,y:n.bottom},t.currentTarget)}}return(0,Y.jsxs)(`div`,{className:Q.row,"data-selected":n||void 0,children:[(0,Y.jsx)(f,{label:u,placement:`right`,children:(0,Y.jsxs)(`button`,{ref:d,type:`button`,className:`${Q.session} ${Q[`engine-${a.engine}`]??``}`,"aria-current":n?`true`:void 0,"data-focus-key":`verse-session:${a.id}`,"data-engine":a.engine,"data-status":o.kind,"aria-haspopup":i?`menu`:void 0,"aria-keyshortcuts":i?`Shift+F10`:void 0,onClick:()=>r(a.id),onContextMenu:p,onKeyDown:m,children:[(0,Y.jsx)(`span`,{className:Q.marker,"aria-hidden":`true`}),(0,Y.jsxs)(`span`,{className:Q.sessionBody,children:[(0,Y.jsx)(`span`,{className:Q.sessionText,children:a.title||`Untitled chat`}),e.live?(0,Y.jsx)(`span`,{className:Q.liveLine,title:e.live.text,children:e.live.text}):null]}),l&&c!==null?(0,Y.jsx)(`span`,{className:Q.seatSpent,role:`img`,"aria-label":`Seat limit reached: ${c.summary}`,children:`▮`}):null,(0,Y.jsx)(me,{row:e})]})}),i?(0,Y.jsx)(`button`,{type:`button`,className:Q.rowMore,tabIndex:-1,"aria-hidden":`true`,title:`Chat actions`,onClick:t=>{let n=t.currentTarget.getBoundingClientRect();i(e,{x:n.right-220,y:n.bottom+4},d.current??t.currentTarget)},children:(0,Y.jsx)(L,{size:14})}):null]})}function me({row:e}){let{status:t,session:n}=e,r=ce(t)??void 0;switch(t.kind){case`running`:return(0,Y.jsxs)(`span`,{className:Q.statusRunning,children:[(0,Y.jsx)(`span`,{className:Q.running,role:`img`,"aria-label":r}),t.startedAt?(0,Y.jsx)(I,{className:Q.elapsed,since:t.startedAt}):null]});case`failed`:return(0,Y.jsx)(`span`,{className:Q.errored,role:`img`,"aria-label":r,children:`!`});case`unread`:return(0,Y.jsx)(`span`,{className:Q.unread,role:`img`,"aria-label":r});default:return(0,Y.jsx)(`time`,{className:Q.time,dateTime:n.updatedAt,children:_(n.updatedAt)})}}function he({row:e,onDone:t}){let[n,r]=(0,q.useState)(e.session.title),i=(0,q.useRef)(null),a=(0,q.useRef)(!1);(0,q.useEffect)(()=>{i.current?.focus(),i.current?.select()},[]);let o=e=>{a.current||(a.current=!0,t(e.trim()))};return(0,Y.jsx)(`div`,{className:`${Q.row} ${Q.renameRow}`,children:(0,Y.jsx)(`input`,{ref:i,className:Q.renameInput,value:n,maxLength:120,"aria-label":`Chat title`,onChange:e=>r(e.target.value),onBlur:()=>o(n),onKeyDown:t=>{t.key===`Enter`?(t.preventDefault(),o(n)):t.key===`Escape`&&(t.preventDefault(),o(e.session.title))}})})}export{oe as Sidebar};
|
|
3
|
-
//# sourceMappingURL=Sidebar-BuO3sViG.js.map
|