@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
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The host-verified required check `ashlr/verify` — 3.13.
|
|
3
|
+
*
|
|
4
|
+
* WHY: G7 needs GitHub to prove a fleet PR green. A repo without CI (GitHub
|
|
5
|
+
* Actions off, e.g. ashlrai/ashlr-hub) reports zero check runs, so every PR
|
|
6
|
+
* went to the owner lane (`no-required-checks` / `no-checks`); and on a
|
|
7
|
+
* local-enforcement repo "every check green" accepted ANY green check — a
|
|
8
|
+
* Vercel preview deploy alone passed G7. The fleet already runs the real
|
|
9
|
+
* suite on the exact tree in its mirror (G3, verifyAndPersistProposal); this
|
|
10
|
+
* module turns that result into a GitHub check run the ashlr-fleet App posts
|
|
11
|
+
* on the PR head, so rulesets can REQUIRE it (pinned to the App's id) and G7
|
|
12
|
+
* can demand it on local-enforcement repos.
|
|
13
|
+
*
|
|
14
|
+
* The one rule: `success` is posted ONLY when G3 passed AND the PR head
|
|
15
|
+
* commit GitHub holds has exactly the verified tree on exactly the verified
|
|
16
|
+
* base (its only parent). Anything else — G3 not passed, no command ran, a
|
|
17
|
+
* head whose tree or parent differs — is `failure`. Nothing here ever posts
|
|
18
|
+
* `neutral` or `skipped` (G7 counts those as green).
|
|
19
|
+
*
|
|
20
|
+
* Idempotent per head SHA: a commit id fixes its tree and parents forever, so
|
|
21
|
+
* the decision is a pure function of (head SHA, verified binding). The memo
|
|
22
|
+
* (`FleetPrMemo.verifyCheck`, in the agent-unreadable fleet merge state)
|
|
23
|
+
* remembers the run posted for a head; an unchanged decision makes no GitHub
|
|
24
|
+
* call, a changed one PATCHes that run, a new head gets a new run.
|
|
25
|
+
*
|
|
26
|
+
* The App id G7 trusts comes from GitHub's own answer to the App's
|
|
27
|
+
* authenticated create call (`app.id` on the returned run) — an installation
|
|
28
|
+
* token can only create runs as its own App, so no other App (a Vercel
|
|
29
|
+
* integration, an agent's token) can ever be mistaken for the fleet's.
|
|
30
|
+
*
|
|
31
|
+
* Needs the App permission `checks: write`. A 403 is reported as `permission`
|
|
32
|
+
* (not retryable); `ashlr authority setup` detects the missing permission and
|
|
33
|
+
* prints where to grant it.
|
|
34
|
+
*/
|
|
35
|
+
import { createHash } from 'node:crypto';
|
|
36
|
+
import { scrubSecrets } from '../util/scrub.js';
|
|
37
|
+
/** The check-run name rulesets require and G7 demands on local-enforcement repos. */
|
|
38
|
+
export const ASHLR_VERIFY_CHECK_NAME = 'ashlr/verify';
|
|
39
|
+
/** Where to grant the missing permission (the exact per-App URL is printed by `ashlr authority setup`). */
|
|
40
|
+
export const VERIFY_CHECK_PERMISSION_HINT = "the ashlr-fleet GitHub App needs the permission 'Checks: Read and write' to post ashlr/verify — " +
|
|
41
|
+
'grant it in the App settings (Permissions & events), accept the new permission on each installation, ' +
|
|
42
|
+
'then run `ashlr authority setup` (it prints the exact links)';
|
|
43
|
+
const SHA_RE = /^[0-9a-f]{40}$/;
|
|
44
|
+
const NAME_WITH_OWNER_RE = /^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})\/[A-Za-z0-9._-]{1,100}$/;
|
|
45
|
+
const MAX_COMMANDS = 20;
|
|
46
|
+
const MAX_CMD_CHARS = 200;
|
|
47
|
+
function sha256(text) {
|
|
48
|
+
return createHash('sha256').update(text, 'utf8').digest('hex');
|
|
49
|
+
}
|
|
50
|
+
function obj(value) {
|
|
51
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value) ? value : null;
|
|
52
|
+
}
|
|
53
|
+
function short(value) {
|
|
54
|
+
return value ? value.slice(0, 12) : 'none';
|
|
55
|
+
}
|
|
56
|
+
/** Bounded, secret-scrubbed commands (they come from the base tree's config, never from the diff). */
|
|
57
|
+
export function normalizeVerifyCommands(commands) {
|
|
58
|
+
if (!Array.isArray(commands))
|
|
59
|
+
return [];
|
|
60
|
+
const out = [];
|
|
61
|
+
for (const command of commands.slice(0, MAX_COMMANDS)) {
|
|
62
|
+
const kind = typeof command?.kind === 'string' ? command.kind.replace(/[^a-z0-9_-]/gi, '').slice(0, 32) : '';
|
|
63
|
+
if (!kind)
|
|
64
|
+
continue;
|
|
65
|
+
const cmd = Array.isArray(command.cmd)
|
|
66
|
+
? command.cmd.filter((part) => typeof part === 'string').slice(0, 32)
|
|
67
|
+
.map((part) => scrubSecrets(part).replace(/[\r\n`]/g, ' ').slice(0, MAX_CMD_CHARS))
|
|
68
|
+
: [];
|
|
69
|
+
out.push({ kind, cmd });
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
/** Digest of everything the decision depends on besides the (immutable) head commit itself. */
|
|
74
|
+
export function verifyCheckInputsDigest(headSha, verified) {
|
|
75
|
+
return sha256(`ashlr:verify-check:v1\0${JSON.stringify({
|
|
76
|
+
headSha,
|
|
77
|
+
g3: verified.g3 ? { verdict: verified.g3.verdict, code: verified.g3.code } : null,
|
|
78
|
+
verifyDigest: verified.verifyDigest,
|
|
79
|
+
baseSha: verified.baseSha,
|
|
80
|
+
treeSha: verified.treeSha,
|
|
81
|
+
commands: verified.commands.map((c) => ({ kind: c.kind, cmd: [...c.cmd] })),
|
|
82
|
+
})}`);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* PURE: success only for G3 pass + at least one command + the head being the
|
|
86
|
+
* verified tree on the verified base as its only parent. `head` is GitHub's
|
|
87
|
+
* view of the PR head commit.
|
|
88
|
+
*/
|
|
89
|
+
export function decideVerifyCheck(input) {
|
|
90
|
+
const { verified, head } = input;
|
|
91
|
+
const facts = [
|
|
92
|
+
`- Head: \`${input.headSha}\` (tree \`${head.tree}\`, parent ${head.parents.map((p) => `\`${p}\``).join(', ') || 'none'})`,
|
|
93
|
+
`- Verified tree: \`${verified.treeSha ?? 'none'}\``,
|
|
94
|
+
`- Verified base: \`${verified.baseSha ?? 'none'}\``,
|
|
95
|
+
`- Verify digest: \`${verified.verifyDigest ?? 'none'}\``,
|
|
96
|
+
`- G3: ${verified.g3 ? `${verified.g3.verdict} (${verified.g3.code})` : 'not run'}`,
|
|
97
|
+
];
|
|
98
|
+
let failure = null;
|
|
99
|
+
if (!verified.g3 || verified.g3.verdict !== 'pass') {
|
|
100
|
+
failure = verified.g3
|
|
101
|
+
? `G3 did not pass (${verified.g3.verdict}: ${verified.g3.code})`
|
|
102
|
+
: 'G3 never ran for this change (owner-lane PRs are not host-verified)';
|
|
103
|
+
}
|
|
104
|
+
else if (!verified.verifyDigest)
|
|
105
|
+
failure = 'no verification digest is bound to this change';
|
|
106
|
+
else if (!verified.treeSha || !SHA_RE.test(verified.treeSha) || !verified.baseSha || !SHA_RE.test(verified.baseSha)) {
|
|
107
|
+
failure = 'the verified tree / base is not recorded';
|
|
108
|
+
}
|
|
109
|
+
else if (verified.commands.length === 0)
|
|
110
|
+
failure = 'no verify command is recorded as having run';
|
|
111
|
+
else if (head.tree !== verified.treeSha)
|
|
112
|
+
failure = `the head's tree ${short(head.tree)} is not the verified tree ${short(verified.treeSha)}`;
|
|
113
|
+
else if (head.parents.length !== 1 || head.parents[0] !== verified.baseSha) {
|
|
114
|
+
failure = `the head's parent is not the verified base ${short(verified.baseSha)}`;
|
|
115
|
+
}
|
|
116
|
+
const commandLines = verified.commands.length === 0
|
|
117
|
+
? ['_No verify command recorded._']
|
|
118
|
+
: verified.commands.map((c) => `- ${failure === null ? 'passed' : 'recorded'} · **${c.kind}**${c.cmd.length > 0 ? ` · \`${c.cmd.join(' ')}\`` : ''}`);
|
|
119
|
+
const text = [
|
|
120
|
+
'### Binding',
|
|
121
|
+
...facts,
|
|
122
|
+
'',
|
|
123
|
+
'### Commands (ran on the exact tree in the fleet mirror, confined)',
|
|
124
|
+
...commandLines,
|
|
125
|
+
].join('\n');
|
|
126
|
+
if (failure !== null) {
|
|
127
|
+
return {
|
|
128
|
+
conclusion: 'failure',
|
|
129
|
+
title: 'Not host-verified',
|
|
130
|
+
summary: scrubSecrets(`ashlr did not verify this head: ${failure}.`).slice(0, 1_000),
|
|
131
|
+
text,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
conclusion: 'success',
|
|
136
|
+
title: `Host-verified: tree ${short(verified.treeSha)} on ${short(verified.baseSha)}`,
|
|
137
|
+
summary: `The fleet ran ${verified.commands.length} verify command(s) on exactly this tree (G3 ${verified.g3.code}); ` +
|
|
138
|
+
`this head is that tree on that base, so GitHub can require this check.`,
|
|
139
|
+
text,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
async function call(deps, repo, method, suffix, body) {
|
|
143
|
+
let token;
|
|
144
|
+
try {
|
|
145
|
+
token = (await deps.token(repo)).token;
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
return { status: 0, body: { message: `no installation token for ${repo}: ${scrubSecrets(error instanceof Error ? error.message : String(error)).slice(0, 200)}` } };
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
return await deps.transport({ method, path: `/repos/${repo}${suffix}`, token, ...(body !== undefined ? { body } : {}) });
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return { status: 0, body: null };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function replyMessage(reply) {
|
|
158
|
+
const message = obj(reply.body)?.['message'];
|
|
159
|
+
return reply.status === 0
|
|
160
|
+
? 'GitHub did not answer (network error or timeout)'
|
|
161
|
+
: `GitHub answered HTTP ${reply.status}${typeof message === 'string' ? `: ${scrubSecrets(message).slice(0, 200)}` : ''}`;
|
|
162
|
+
}
|
|
163
|
+
function failed(reply, what) {
|
|
164
|
+
if (reply.status === 403) {
|
|
165
|
+
return { ok: false, code: 'permission', reason: `${what}: ${replyMessage(reply)}; ${VERIFY_CHECK_PERMISSION_HINT}`, retryable: false };
|
|
166
|
+
}
|
|
167
|
+
const retryable = reply.status === 0 || reply.status === 429 || reply.status >= 500;
|
|
168
|
+
return { ok: false, code: 'github', reason: `${what}: ${replyMessage(reply)}`, retryable };
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Create or update the `ashlr/verify` check run on `headSha` from the
|
|
172
|
+
* ashlr-fleet App (through the host-merge transport and its installation
|
|
173
|
+
* token). Never throws.
|
|
174
|
+
*/
|
|
175
|
+
export async function postVerifyCheckRun(input, deps) {
|
|
176
|
+
if (!NAME_WITH_OWNER_RE.test(input.repo) || !SHA_RE.test(input.headSha)) {
|
|
177
|
+
return { ok: false, code: 'invalid', reason: 'repo or head SHA is malformed', retryable: false };
|
|
178
|
+
}
|
|
179
|
+
const inputsDigest = verifyCheckInputsDigest(input.headSha, input.verified);
|
|
180
|
+
const prior = input.prior ?? null;
|
|
181
|
+
if (prior && prior.headSha === input.headSha && prior.inputsDigest === inputsDigest) {
|
|
182
|
+
return { ok: true, memo: prior, action: 'unchanged' };
|
|
183
|
+
}
|
|
184
|
+
// GitHub's view of the head — the tree the check vouches for is the one GitHub holds.
|
|
185
|
+
const headReply = await call(deps, input.repo, 'GET', `/git/commits/${input.headSha}`);
|
|
186
|
+
if (headReply.status !== 200)
|
|
187
|
+
return failed(headReply, 'head commit read');
|
|
188
|
+
const headBody = obj(headReply.body);
|
|
189
|
+
const tree = obj(headBody?.['tree'])?.['sha'];
|
|
190
|
+
const parentsRaw = headBody?.['parents'];
|
|
191
|
+
if (headBody?.['sha'] !== input.headSha || typeof tree !== 'string' || !SHA_RE.test(tree) || !Array.isArray(parentsRaw)) {
|
|
192
|
+
return { ok: false, code: 'github', reason: 'GitHub returned a malformed head commit', retryable: true };
|
|
193
|
+
}
|
|
194
|
+
const parents = parentsRaw.map((p) => obj(p)?.['sha']).filter((p) => typeof p === 'string' && SHA_RE.test(p));
|
|
195
|
+
if (parents.length !== parentsRaw.length)
|
|
196
|
+
return { ok: false, code: 'github', reason: 'GitHub returned malformed head parents', retryable: true };
|
|
197
|
+
const decision = decideVerifyCheck({ headSha: input.headSha, head: { tree, parents }, verified: input.verified });
|
|
198
|
+
const common = {
|
|
199
|
+
external_id: inputsDigest,
|
|
200
|
+
status: 'completed',
|
|
201
|
+
conclusion: decision.conclusion,
|
|
202
|
+
completed_at: new Date(deps.nowMs()).toISOString(),
|
|
203
|
+
output: { title: decision.title, summary: decision.summary, text: decision.text.slice(0, 60_000) },
|
|
204
|
+
};
|
|
205
|
+
let reply = null;
|
|
206
|
+
let action = 'created';
|
|
207
|
+
if (prior && prior.headSha === input.headSha) {
|
|
208
|
+
reply = await call(deps, input.repo, 'PATCH', `/check-runs/${prior.runId}`, common);
|
|
209
|
+
action = 'updated';
|
|
210
|
+
// The run is gone (or not ours any more): post a fresh one instead.
|
|
211
|
+
if (reply.status === 404 || reply.status === 422)
|
|
212
|
+
reply = null;
|
|
213
|
+
}
|
|
214
|
+
if (reply === null) {
|
|
215
|
+
reply = await call(deps, input.repo, 'POST', '/check-runs', { name: ASHLR_VERIFY_CHECK_NAME, head_sha: input.headSha, ...common });
|
|
216
|
+
action = 'created';
|
|
217
|
+
}
|
|
218
|
+
if (reply.status !== 200 && reply.status !== 201)
|
|
219
|
+
return failed(reply, `check run ${action === 'created' ? 'create' : 'update'}`);
|
|
220
|
+
const run = obj(reply.body);
|
|
221
|
+
const runId = run?.['id'];
|
|
222
|
+
const appIdRaw = obj(run?.['app'])?.['id'];
|
|
223
|
+
const appId = typeof appIdRaw === 'number' && Number.isSafeInteger(appIdRaw) && appIdRaw > 0 ? String(appIdRaw) : null;
|
|
224
|
+
if (!Number.isSafeInteger(runId) || runId < 1 || appId === null ||
|
|
225
|
+
run?.['head_sha'] !== input.headSha || run?.['name'] !== ASHLR_VERIFY_CHECK_NAME || run?.['conclusion'] !== decision.conclusion) {
|
|
226
|
+
return { ok: false, code: 'github', reason: 'GitHub returned a check run that is not the one posted', retryable: true };
|
|
227
|
+
}
|
|
228
|
+
// A PATCH answered by a different App than the one that created the run is not ours.
|
|
229
|
+
if (action === 'updated' && prior && prior.appId !== appId) {
|
|
230
|
+
return { ok: false, code: 'github', reason: `the check run is attributed to App ${appId}, not ${prior.appId}`, retryable: false };
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
ok: true,
|
|
234
|
+
action,
|
|
235
|
+
memo: {
|
|
236
|
+
headSha: input.headSha,
|
|
237
|
+
runId: runId,
|
|
238
|
+
appId,
|
|
239
|
+
conclusion: decision.conclusion,
|
|
240
|
+
inputsDigest,
|
|
241
|
+
at: new Date(deps.nowMs()).toISOString(),
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/** The verified binding a fleet merge state carries (G3 row, verify digest, verified base / tree, commands). */
|
|
246
|
+
export function verifiedBindingOf(state) {
|
|
247
|
+
const g3 = state.gates['G3'];
|
|
248
|
+
return {
|
|
249
|
+
g3: g3 ? { verdict: g3.verdict, code: g3.code } : null,
|
|
250
|
+
verifyDigest: state.verifyDigest,
|
|
251
|
+
baseSha: state.baseSha,
|
|
252
|
+
treeSha: state.treeSha,
|
|
253
|
+
commands: normalizeVerifyCommands(state.verifyCommands ?? []),
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Post (or confirm) `ashlr/verify` on the open fleet PR's current head and
|
|
258
|
+
* remember it on `state.pr.verifyCheck`. The caller persists the state.
|
|
259
|
+
*/
|
|
260
|
+
export async function ensureFleetVerifyCheck(state, deps) {
|
|
261
|
+
const pr = state.pr;
|
|
262
|
+
if (!pr || pr.state !== 'open')
|
|
263
|
+
return { ok: false, code: 'invalid', reason: 'no open fleet PR', retryable: false };
|
|
264
|
+
const result = await postVerifyCheckRun({
|
|
265
|
+
repo: state.repo,
|
|
266
|
+
headSha: pr.headSha,
|
|
267
|
+
verified: verifiedBindingOf(state),
|
|
268
|
+
prior: pr.verifyCheck ?? null,
|
|
269
|
+
}, deps);
|
|
270
|
+
if (result.ok)
|
|
271
|
+
pr.verifyCheck = result.memo;
|
|
272
|
+
return result;
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=verify-check-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-check-run.js","sourceRoot":"","sources":["../../../src/core/fleet/verify-check-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIhD,qFAAqF;AACrF,MAAM,CAAC,MAAM,uBAAuB,GAAG,cAAc,CAAC;AAEtD,2GAA2G;AAC3G,MAAM,CAAC,MAAM,4BAA4B,GACvC,kGAAkG;IAClG,uGAAuG;IACvG,8DAA8D,CAAC;AAEjE,MAAM,MAAM,GAAG,gBAAgB,CAAC;AAChC,MAAM,kBAAkB,GAAG,4DAA4D,CAAC;AACxF,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,aAAa,GAAG,GAAG,CAAC;AA2C1B,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,GAAG,CAAC,KAAc;IACzB,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxH,CAAC;AAED,SAAS,KAAK,CAAC,KAAoB;IACjC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC7C,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,uBAAuB,CAAC,QAAyE;IAC/G,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,GAAG,GAAyB,EAAE,CAAC;IACrC,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,OAAO,OAAO,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7G,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;YACpC,CAAC,CAAE,OAAO,CAAC,GAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;iBAC/F,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YACvF,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,QAAyB;IAChF,OAAO,MAAM,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC;QACrD,OAAO;QACP,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;QACjF,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;KAC5E,CAAC,EAAE,CAAC,CAAC;AACR,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAIjC;IACC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACjC,MAAM,KAAK,GAAG;QACZ,aAAa,KAAK,CAAC,OAAO,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG;QAC1H,sBAAsB,QAAQ,CAAC,OAAO,IAAI,MAAM,IAAI;QACpD,sBAAsB,QAAQ,CAAC,OAAO,IAAI,MAAM,IAAI;QACpD,sBAAsB,QAAQ,CAAC,YAAY,IAAI,MAAM,IAAI;QACzD,SAAS,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,OAAO,KAAK,QAAQ,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE;KACpF,CAAC;IACF,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,EAAE,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QACnD,OAAO,GAAG,QAAQ,CAAC,EAAE;YACnB,CAAC,CAAC,oBAAoB,QAAQ,CAAC,EAAE,CAAC,OAAO,KAAK,QAAQ,CAAC,EAAE,CAAC,IAAI,GAAG;YACjE,CAAC,CAAC,qEAAqE,CAAC;IAC5E,CAAC;SAAM,IAAI,CAAC,QAAQ,CAAC,YAAY;QAAE,OAAO,GAAG,gDAAgD,CAAC;SACzF,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACpH,OAAO,GAAG,0CAA0C,CAAC;IACvD,CAAC;SAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,6CAA6C,CAAC;SAC9F,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO;QAAE,OAAO,GAAG,mBAAmB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;SACxI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC3E,OAAO,GAAG,8CAA8C,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;IACpF,CAAC;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QACjD,CAAC,CAAC,CAAC,+BAA+B,CAAC;QACnC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxJ,MAAM,IAAI,GAAG;QACX,aAAa;QACb,GAAG,KAAK;QACR,EAAE;QACF,oEAAoE;QACpE,GAAG,YAAY;KAChB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO;YACL,UAAU,EAAE,SAAS;YACrB,KAAK,EAAE,mBAAmB;YAC1B,OAAO,EAAE,YAAY,CAAC,mCAAmC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;YACpF,IAAI;SACL,CAAC;IACJ,CAAC;IACD,OAAO;QACL,UAAU,EAAE,SAAS;QACrB,KAAK,EAAE,uBAAuB,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;QACrF,OAAO,EAAE,iBAAiB,QAAQ,CAAC,QAAQ,CAAC,MAAM,+CAA+C,QAAQ,CAAC,EAAG,CAAC,IAAI,KAAK;YACrH,wEAAwE;QAC1E,IAAI;KACL,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAU,EAAE,IAAY,EAAE,MAA4B,EAAE,MAAc,EAAE,IAAc;IACxG,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,6BAA6B,IAAI,KAAK,YAAY,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;IACtK,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,IAAI,GAAG,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3H,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAkB;IACtC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAC7C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;QACvB,CAAC,CAAC,kDAAkD;QACpD,CAAC,CAAC,wBAAwB,KAAK,CAAC,MAAM,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC7H,CAAC;AAED,SAAS,MAAM,CAAC,KAAkB,EAAE,IAAY;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACzB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,KAAK,YAAY,CAAC,KAAK,CAAC,KAAK,4BAA4B,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACzI,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC;IACpF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,KAAK,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC;AAC7F,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAKxC,EAAE,IAAU;IACX,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACxE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,+BAA+B,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACnG,CAAC;IACD,MAAM,YAAY,GAAG,uBAAuB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC;IAClC,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;QACpF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACxD,CAAC;IACD,sFAAsF;IACtF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,gBAAgB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACvF,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,MAAM,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,OAAO,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,yCAAyC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC3G,CAAC;IACD,MAAM,OAAO,GAAI,UAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1I,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,wCAAwC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAClJ,MAAM,QAAQ,GAAG,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClH,MAAM,MAAM,GAAG;QACb,WAAW,EAAE,YAAY;QACzB,MAAM,EAAE,WAAW;QACnB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,YAAY,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE;QAClD,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE;KACnG,CAAC;IACF,IAAI,KAAK,GAAuB,IAAI,CAAC;IACrC,IAAI,MAAM,GAA0B,SAAS,CAAC;IAC9C,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QAC7C,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;QACpF,MAAM,GAAG,SAAS,CAAC;QACnB,oEAAoE;QACpE,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG;YAAE,KAAK,GAAG,IAAI,CAAC;IACjE,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QACnI,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,MAAM,CAAC,KAAK,EAAE,aAAa,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClI,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAK,KAAgB,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI;QACzE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,KAAK,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,uBAAuB,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QAClI,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,wDAAwD,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC1H,CAAC;IACD,qFAAqF;IACrF,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QAC3D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,sCAAsC,KAAK,SAAS,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACpI,CAAC;IACD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM;QACN,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAe;YACtB,KAAK;YACL,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,YAAY;YACZ,EAAE,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE;SACzC;KACF,CAAC;AACJ,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,iBAAiB,CAAC,KAAwB;IACxD,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO;QACL,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;QACtD,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,uBAAuB,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAwB,EAAE,IAAU;IAC/E,MAAM,EAAE,GAAuB,KAAK,CAAC,EAAE,CAAC;IACxC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACpH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;QACtC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,EAAE,CAAC,OAAO;QACnB,QAAQ,EAAE,iBAAiB,CAAC,KAAK,CAAC;QAClC,KAAK,EAAE,EAAE,CAAC,WAAW,IAAI,IAAI;KAC9B,EAAE,IAAI,CAAC,CAAC;IACT,IAAI,MAAM,CAAC,EAAE;QAAE,EAAE,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;IAC5C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -24,6 +24,17 @@ export type CapacitySource = (cfg: AshlrConfig, opts?: {
|
|
|
24
24
|
}) => Promise<CapacityReading>;
|
|
25
25
|
/** Test hook: replace (or with no argument, restore) the capacity source; also resets caches. */
|
|
26
26
|
export declare function setBudgetCapacitySourceForTest(source?: CapacitySource): void;
|
|
27
|
+
/**
|
|
28
|
+
* A source the route needed could not be read. `message` is the operator-
|
|
29
|
+
* facing sentence and is sent as-is, so it must never carry a path or the
|
|
30
|
+
* underlying error's text (which can). 503: the request was fine, the store
|
|
31
|
+
* or collector behind it is what is unusable right now.
|
|
32
|
+
*/
|
|
33
|
+
export declare class BudgetReadError extends Error {
|
|
34
|
+
readonly code: string;
|
|
35
|
+
readonly status: 503;
|
|
36
|
+
constructor(code: string, message: string);
|
|
37
|
+
}
|
|
27
38
|
export declare function buildBudgetView(policy: BudgetPolicy, reading: CapacityReading, nowMs: number): BudgetView;
|
|
28
39
|
/**
|
|
29
40
|
* The budget route family. Returns false for any path outside it so the next
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { passesMutationGate, readBody, sendJson } from '../web/api.js';
|
|
2
|
-
import {
|
|
2
|
+
import { BudgetPolicyUnreadableError, loadBudgetPolicy, readBudgetPolicyFileState, readShadowDecisionsChecked, recordShadowDecision, updateBudgetPolicy, writeCapacitySnapshotAsync, } from './budget-store.js';
|
|
3
3
|
import { assessSeat, capacityFromSeat, HEADROOM_READING_MAX_AGE_MS } from './headroom.js';
|
|
4
|
-
import { BudgetPolicyError, effectiveSeatPolicy, parseBudgetUpdate, } from './policy.js';
|
|
4
|
+
import { BudgetPolicyError, defaultBudgetPolicy, effectiveSeatPolicy, parseBudgetUpdate, } from './policy.js';
|
|
5
5
|
import { routeSeat } from './router.js';
|
|
6
6
|
import { VERSE_BUDGET_PATH, } from './types.js';
|
|
7
7
|
export const VERSE_BUDGET_PREVIEW_PATH = `${VERSE_BUDGET_PATH}/preview`;
|
|
@@ -61,9 +61,50 @@ export function setBudgetCapacitySourceForTest(source) {
|
|
|
61
61
|
identityInFlight = null;
|
|
62
62
|
lastSnapshotAt = 0;
|
|
63
63
|
}
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
// Read failures the panel is told about
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
/**
|
|
68
|
+
* A source the route needed could not be read. `message` is the operator-
|
|
69
|
+
* facing sentence and is sent as-is, so it must never carry a path or the
|
|
70
|
+
* underlying error's text (which can). 503: the request was fine, the store
|
|
71
|
+
* or collector behind it is what is unusable right now.
|
|
72
|
+
*/
|
|
73
|
+
export class BudgetReadError extends Error {
|
|
74
|
+
code;
|
|
75
|
+
status = 503;
|
|
76
|
+
constructor(code, message) {
|
|
77
|
+
super(message);
|
|
78
|
+
this.code = code;
|
|
79
|
+
this.name = 'BudgetReadError';
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The policy as the PANEL must see it. `loadBudgetPolicy` is total (defaults
|
|
84
|
+
* for any bad file), which is right for the daemon but made the panel show
|
|
85
|
+
* "Balanced, every seat default" while the operator's real policy sat in a
|
|
86
|
+
* file nobody could read — and the next click was then refused (review d7)
|
|
87
|
+
* with no visible reason. Only a MISSING file is the defaults here.
|
|
88
|
+
*/
|
|
89
|
+
function loadPolicyForPanel() {
|
|
90
|
+
const found = readBudgetPolicyFileState();
|
|
91
|
+
if (found.state === 'ok')
|
|
92
|
+
return found.policy;
|
|
93
|
+
if (found.state === 'missing')
|
|
94
|
+
return defaultBudgetPolicy();
|
|
95
|
+
throw new BudgetReadError('VERSE_STORE_UNREADABLE', `The budget policy file ${found.reason}. Fix or remove it to use the defaults.`);
|
|
96
|
+
}
|
|
64
97
|
/** Read capacity and (throttled) persist it for collector-less readers. Never throws on the write. */
|
|
65
98
|
async function readCapacity(cfg, force = false) {
|
|
66
|
-
|
|
99
|
+
let reading;
|
|
100
|
+
try {
|
|
101
|
+
reading = await capacitySource(cfg);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// The cause (a collector or Ollama error) can name paths and hosts; the
|
|
105
|
+
// panel only needs to know WHICH read failed.
|
|
106
|
+
throw new BudgetReadError('VERSE_BUDGET_CAPACITY_UNREADABLE', 'Seat capacity could not be read.');
|
|
107
|
+
}
|
|
67
108
|
const now = Date.now();
|
|
68
109
|
if (force || now - lastSnapshotAt >= SNAPSHOT_MIN_INTERVAL_MS) {
|
|
69
110
|
lastSnapshotAt = now;
|
|
@@ -200,8 +241,9 @@ export const handleBudgetApi = async (ctx, req, res, path, method) => {
|
|
|
200
241
|
if (method === 'GET') {
|
|
201
242
|
if (!readQuery(req, res, []))
|
|
202
243
|
return true;
|
|
244
|
+
const policy = loadPolicyForPanel();
|
|
203
245
|
const reading = await readCapacity(ctx.cfg);
|
|
204
|
-
sendJson(res, 200, buildBudgetView(
|
|
246
|
+
sendJson(res, 200, buildBudgetView(policy, reading, Date.now()));
|
|
205
247
|
return true;
|
|
206
248
|
}
|
|
207
249
|
if (method === 'POST') {
|
|
@@ -240,8 +282,9 @@ export const handleBudgetApi = async (ctx, req, res, path, method) => {
|
|
|
240
282
|
sendInvalid(res, request);
|
|
241
283
|
return true;
|
|
242
284
|
}
|
|
285
|
+
const policy = loadPolicyForPanel();
|
|
243
286
|
const reading = await readCapacity(ctx.cfg);
|
|
244
|
-
sendJson(res, 200, routeSeat(request, reading.seats,
|
|
287
|
+
sendJson(res, 200, routeSeat(request, reading.seats, policy, { nowMs: Date.now() }));
|
|
245
288
|
return true;
|
|
246
289
|
}
|
|
247
290
|
// VERSE_BUDGET_DECISIONS_PATH
|
|
@@ -254,15 +297,28 @@ export const handleBudgetApi = async (ctx, req, res, path, method) => {
|
|
|
254
297
|
return true;
|
|
255
298
|
}
|
|
256
299
|
const limit = limitRaw === null ? 50 : Math.max(1, Math.min(500, Number(limitRaw)));
|
|
257
|
-
|
|
300
|
+
const log = readShadowDecisionsChecked(limit);
|
|
301
|
+
if (log.state === 'unreadable') {
|
|
302
|
+
throw new BudgetReadError('VERSE_BUDGET_DECISIONS_UNREADABLE', `The routing decision log ${log.reason}.`);
|
|
303
|
+
}
|
|
304
|
+
sendJson(res, 200, { decisions: log.decisions });
|
|
258
305
|
return true;
|
|
259
306
|
}
|
|
260
307
|
catch (err) {
|
|
261
|
-
if (err instanceof BudgetPolicyError) {
|
|
308
|
+
if (err instanceof BudgetPolicyError || err instanceof BudgetReadError) {
|
|
262
309
|
sendJson(res, err.status, { code: err.code, error: err.message });
|
|
263
310
|
return true;
|
|
264
311
|
}
|
|
265
|
-
|
|
312
|
+
if (err instanceof BudgetPolicyUnreadableError) {
|
|
313
|
+
// Its own message names the absolute file and the archive copy; the
|
|
314
|
+
// panel gets the same fact without either.
|
|
315
|
+
sendJson(res, err.status, {
|
|
316
|
+
code: err.code,
|
|
317
|
+
error: `The budget policy file ${err.reason}. Nothing was saved. Fix or remove it to use the defaults.`,
|
|
318
|
+
});
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
sendJson(res, 500, { code: 'VERSE_BUDGET_FAILED', error: 'Budget request failed.' });
|
|
266
322
|
return true;
|
|
267
323
|
}
|
|
268
324
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"budget-api.js","sourceRoot":"","sources":["../../../src/core/routing/budget-api.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"budget-api.js","sourceRoot":"","sources":["../../../src/core/routing/budget-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,6 +49,8 @@ export declare class BudgetPolicyUnreadableError extends Error {
|
|
|
49
49
|
readonly status: 503;
|
|
50
50
|
readonly file: string;
|
|
51
51
|
readonly archivedTo: string | null;
|
|
52
|
+
/** What is wrong with the file, without its path ("is a symlink") — what a route may show. */
|
|
53
|
+
readonly reason: string;
|
|
52
54
|
constructor(file: string, reason: string, archivedTo: string | null);
|
|
53
55
|
}
|
|
54
56
|
/**
|
|
@@ -123,5 +125,24 @@ export declare function recordShadowDecision(input: {
|
|
|
123
125
|
} | null;
|
|
124
126
|
now?: Date;
|
|
125
127
|
}, file?: string): boolean;
|
|
126
|
-
/**
|
|
128
|
+
/**
|
|
129
|
+
* The decision log as a reader of the panel needs it: `ok` with the newest
|
|
130
|
+
* `limit` records (newest first; a MISSING log is simply no decisions yet),
|
|
131
|
+
* or `unreadable` with a short plain reason (an errno code or what the path
|
|
132
|
+
* is — never the path itself). Never throws.
|
|
133
|
+
*
|
|
134
|
+
* WHY THIS EXISTS: `readShadowDecisions` answers [] for every failure, which
|
|
135
|
+
* is right for the reserve-breach attributor (no evidence → no attribution)
|
|
136
|
+
* but made the decisions route say "no decisions" when the log was there and
|
|
137
|
+
* could not be read.
|
|
138
|
+
*/
|
|
139
|
+
export type ShadowDecisionsRead = {
|
|
140
|
+
state: 'ok';
|
|
141
|
+
decisions: ShadowDecisionRecord[];
|
|
142
|
+
} | {
|
|
143
|
+
state: 'unreadable';
|
|
144
|
+
reason: string;
|
|
145
|
+
};
|
|
146
|
+
export declare function readShadowDecisionsChecked(limit?: number, file?: string): ShadowDecisionsRead;
|
|
147
|
+
/** Tail-read the newest `limit` shadow decisions, newest first. Never throws; an unreadable log reads as none. */
|
|
127
148
|
export declare function readShadowDecisions(limit?: number, file?: string): ShadowDecisionRecord[];
|
|
@@ -132,6 +132,8 @@ export class BudgetPolicyUnreadableError extends Error {
|
|
|
132
132
|
status = 503;
|
|
133
133
|
file;
|
|
134
134
|
archivedTo;
|
|
135
|
+
/** What is wrong with the file, without its path ("is a symlink") — what a route may show. */
|
|
136
|
+
reason;
|
|
135
137
|
constructor(file, reason, archivedTo) {
|
|
136
138
|
super(`${file} ${reason}; the budget change was not saved so the policy in it is kept. `
|
|
137
139
|
+ (archivedTo ? `A copy is at ${archivedTo}. ` : '')
|
|
@@ -139,6 +141,7 @@ export class BudgetPolicyUnreadableError extends Error {
|
|
|
139
141
|
this.name = 'BudgetPolicyUnreadableError';
|
|
140
142
|
this.file = file;
|
|
141
143
|
this.archivedTo = archivedTo;
|
|
144
|
+
this.reason = reason;
|
|
142
145
|
}
|
|
143
146
|
}
|
|
144
147
|
/** Largest unreadable policy file still copied aside (the cap is 64 KiB; a runaway file is left in place). */
|
|
@@ -492,21 +495,26 @@ function isDecisionRecord(value) {
|
|
|
492
495
|
return isObject(decision) && typeof decision['why'] === 'string' && Array.isArray(decision['candidates'])
|
|
493
496
|
&& Array.isArray(decision['exclusions']) && isObject(value['request']);
|
|
494
497
|
}
|
|
495
|
-
|
|
496
|
-
export function readShadowDecisions(limit = 50, file = decisionsLogPath()) {
|
|
498
|
+
export function readShadowDecisionsChecked(limit = 50, file = decisionsLogPath()) {
|
|
497
499
|
const want = Math.max(1, Math.min(500, Math.floor(limit)));
|
|
498
500
|
const noFollow = typeof fsConstants.O_NOFOLLOW === 'number' ? fsConstants.O_NOFOLLOW : 0;
|
|
499
501
|
let fd;
|
|
500
502
|
try {
|
|
501
503
|
fd = openSync(file, fsConstants.O_RDONLY | noFollow);
|
|
502
504
|
}
|
|
503
|
-
catch {
|
|
504
|
-
|
|
505
|
+
catch (err) {
|
|
506
|
+
const code = err?.code;
|
|
507
|
+
if (code === 'ENOENT')
|
|
508
|
+
return { state: 'ok', decisions: [] };
|
|
509
|
+
// ELOOP under O_NOFOLLOW is a planted symlink; say so rather than the errno.
|
|
510
|
+
if (code === 'ELOOP')
|
|
511
|
+
return { state: 'unreadable', reason: 'is a symlink' };
|
|
512
|
+
return { state: 'unreadable', reason: `could not be opened (${typeof code === 'string' ? code : 'error'})` };
|
|
505
513
|
}
|
|
506
514
|
try {
|
|
507
515
|
const stat = fstatSync(fd);
|
|
508
516
|
if (!stat.isFile())
|
|
509
|
-
return
|
|
517
|
+
return { state: 'unreadable', reason: 'is not a regular file' };
|
|
510
518
|
const length = Math.min(stat.size, want * MAX_DECISION_LINE_BYTES, 4 * 1024 * 1024);
|
|
511
519
|
const buffer = Buffer.alloc(length);
|
|
512
520
|
let offset = 0;
|
|
@@ -531,13 +539,19 @@ export function readShadowDecisions(limit = 50, file = decisionsLogPath()) {
|
|
|
531
539
|
// The first line of a tail window is usually partial.
|
|
532
540
|
}
|
|
533
541
|
}
|
|
534
|
-
return out;
|
|
542
|
+
return { state: 'ok', decisions: out };
|
|
535
543
|
}
|
|
536
|
-
catch {
|
|
537
|
-
|
|
544
|
+
catch (err) {
|
|
545
|
+
const code = err?.code;
|
|
546
|
+
return { state: 'unreadable', reason: `could not be read (${typeof code === 'string' ? code : 'error'})` };
|
|
538
547
|
}
|
|
539
548
|
finally {
|
|
540
549
|
closeSync(fd);
|
|
541
550
|
}
|
|
542
551
|
}
|
|
552
|
+
/** Tail-read the newest `limit` shadow decisions, newest first. Never throws; an unreadable log reads as none. */
|
|
553
|
+
export function readShadowDecisions(limit = 50, file = decisionsLogPath()) {
|
|
554
|
+
const read = readShadowDecisionsChecked(limit, file);
|
|
555
|
+
return read.state === 'ok' ? read.decisions : [];
|
|
556
|
+
}
|
|
543
557
|
//# sourceMappingURL=budget-store.js.map
|