@ashlr/hub 3.13.0 → 3.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +74 -0
- package/dist/authority-surface.json +204 -124
- package/dist/build-identity.json +2 -2
- package/dist/cli/authority.js +112 -18
- package/dist/cli/authority.js.map +1 -1
- package/dist/cli/comms.d.ts +33 -19
- package/dist/cli/comms.js +128 -151
- package/dist/cli/comms.js.map +1 -1
- package/dist/cli/completions.js +1 -1
- package/dist/cli/completions.js.map +1 -1
- package/dist/cli/daemon.js +29 -0
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/director.d.ts +8 -12
- package/dist/cli/director.js +17 -52
- package/dist/cli/director.js.map +1 -1
- package/dist/cli/fleet.js +4 -1
- package/dist/cli/fleet.js.map +1 -1
- package/dist/cli/help.js +1 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/leader.d.ts +27 -3
- package/dist/cli/leader.js +253 -4
- package/dist/cli/leader.js.map +1 -1
- package/dist/core/authority/server-enforcement.d.ts +110 -0
- package/dist/core/authority/server-enforcement.js +260 -0
- package/dist/core/authority/server-enforcement.js.map +1 -0
- package/dist/core/authority/standing-grant.d.ts +24 -4
- package/dist/core/authority/standing-grant.js +19 -3
- package/dist/core/authority/standing-grant.js.map +1 -1
- package/dist/core/cloud/timeline.js +13 -7
- package/dist/core/cloud/timeline.js.map +1 -1
- package/dist/core/comms/change-digest.d.ts +130 -0
- package/dist/core/comms/change-digest.js +451 -0
- package/dist/core/comms/change-digest.js.map +1 -0
- package/dist/core/comms/director-prompt.d.ts +4 -5
- package/dist/core/comms/director-prompt.js +4 -71
- package/dist/core/comms/director-prompt.js.map +1 -1
- package/dist/core/comms/director.d.ts +24 -61
- package/dist/core/comms/director.js +29 -382
- package/dist/core/comms/director.js.map +1 -1
- package/dist/core/comms/dispatch.d.ts +37 -12
- package/dist/core/comms/dispatch.js +244 -177
- package/dist/core/comms/dispatch.js.map +1 -1
- package/dist/core/comms/elon-dialogue.d.ts +23 -15
- package/dist/core/comms/elon-dialogue.js +36 -307
- package/dist/core/comms/elon-dialogue.js.map +1 -1
- package/dist/core/comms/fleet-pulse.js +4 -7
- package/dist/core/comms/fleet-pulse.js.map +1 -1
- package/dist/core/comms/handlers.d.ts +10 -6
- package/dist/core/comms/handlers.js +14 -48
- package/dist/core/comms/handlers.js.map +1 -1
- package/dist/core/comms/migrations.d.ts +47 -0
- package/dist/core/comms/migrations.js +125 -0
- package/dist/core/comms/migrations.js.map +1 -0
- package/dist/core/comms/requests.d.ts +32 -5
- package/dist/core/comms/requests.js +101 -5
- package/dist/core/comms/requests.js.map +1 -1
- package/dist/core/comms/telegram-channel.d.ts +104 -0
- package/dist/core/comms/telegram-channel.js +622 -0
- package/dist/core/comms/telegram-channel.js.map +1 -0
- package/dist/core/comms/telegram-thread-map.d.ts +56 -0
- package/dist/core/comms/telegram-thread-map.js +144 -0
- package/dist/core/comms/telegram-thread-map.js.map +1 -0
- package/dist/core/daemon/capacity-publisher.d.ts +8 -1
- package/dist/core/daemon/capacity-publisher.js +40 -2
- package/dist/core/daemon/capacity-publisher.js.map +1 -1
- package/dist/core/daemon/loop.js +18 -4
- package/dist/core/daemon/loop.js.map +1 -1
- package/dist/core/daemon/tick-deadline.d.ts +44 -0
- package/dist/core/daemon/tick-deadline.js +83 -0
- package/dist/core/daemon/tick-deadline.js.map +1 -0
- package/dist/core/daemon/tick-hooks.d.ts +7 -0
- package/dist/core/daemon/tick-hooks.js.map +1 -1
- package/dist/core/daemon/tick-progress.d.ts +39 -0
- package/dist/core/daemon/tick-progress.js +194 -0
- package/dist/core/daemon/tick-progress.js.map +1 -0
- package/dist/core/dashboard.js +3 -1
- package/dist/core/dashboard.js.map +1 -1
- package/dist/core/fleet/fleet-merge-state.d.ts +6 -0
- package/dist/core/fleet/fleet-merge-state.js.map +1 -1
- package/dist/core/fleet/host-merge.d.ts +9 -0
- package/dist/core/fleet/host-merge.js +13 -2
- package/dist/core/fleet/host-merge.js.map +1 -1
- package/dist/core/fleet/merge-gates.d.ts +13 -0
- package/dist/core/fleet/merge-gates.js +14 -0
- package/dist/core/fleet/merge-gates.js.map +1 -1
- package/dist/core/fleet/mirrors.d.ts +162 -6
- package/dist/core/fleet/mirrors.js +1051 -49
- package/dist/core/fleet/mirrors.js.map +1 -1
- package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
- package/dist/core/fleet/standing-merge-pass.js +72 -1
- package/dist/core/fleet/standing-merge-pass.js.map +1 -1
- package/dist/core/fleet/status.d.ts +17 -0
- package/dist/core/fleet/status.js +22 -0
- package/dist/core/fleet/status.js.map +1 -1
- package/dist/core/fleet/tick-hooks-live.d.ts +1 -1
- package/dist/core/fleet/tick-hooks-live.js +13 -3
- package/dist/core/fleet/tick-hooks-live.js.map +1 -1
- package/dist/core/git.d.ts +17 -0
- package/dist/core/git.js +124 -25
- package/dist/core/git.js.map +1 -1
- package/dist/core/goals/open-goals.d.ts +47 -0
- package/dist/core/goals/open-goals.js +33 -0
- package/dist/core/goals/open-goals.js.map +1 -0
- package/dist/core/inbox/merge.d.ts +5 -0
- package/dist/core/inbox/merge.js +58 -2
- package/dist/core/inbox/merge.js.map +1 -1
- package/dist/core/integrations/locus.d.ts +28 -0
- package/dist/core/integrations/locus.js +155 -30
- package/dist/core/integrations/locus.js.map +1 -1
- package/dist/core/integrations/telegram-format.d.ts +40 -0
- package/dist/core/integrations/telegram-format.js +123 -0
- package/dist/core/integrations/telegram-format.js.map +1 -0
- package/dist/core/integrations/telegram.d.ts +60 -4
- package/dist/core/integrations/telegram.js +161 -28
- package/dist/core/integrations/telegram.js.map +1 -1
- package/dist/core/mcp-registry.d.ts +12 -0
- package/dist/core/mcp-registry.js +70 -0
- package/dist/core/mcp-registry.js.map +1 -1
- package/dist/core/observability/rollup.d.ts +12 -10
- package/dist/core/observability/rollup.js +44 -17
- package/dist/core/observability/rollup.js.map +1 -1
- package/dist/core/resources/connection-monitor.d.ts +9 -0
- package/dist/core/resources/connection-monitor.js +19 -9
- package/dist/core/resources/connection-monitor.js.map +1 -1
- package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
- package/dist/core/resources/quota-refresh-lease.js +34 -1
- package/dist/core/resources/quota-refresh-lease.js.map +1 -1
- package/dist/core/routing/budget-api.d.ts +7 -1
- package/dist/core/routing/budget-api.js +56 -2
- package/dist/core/routing/budget-api.js.map +1 -1
- package/dist/core/routing/readiness-types.d.ts +82 -0
- package/dist/core/routing/readiness-types.js +23 -0
- package/dist/core/routing/readiness-types.js.map +1 -0
- package/dist/core/routing/readiness.d.ts +103 -0
- package/dist/core/routing/readiness.js +480 -0
- package/dist/core/routing/readiness.js.map +1 -0
- package/dist/core/sandbox/confine.js +22 -1
- package/dist/core/sandbox/confine.js.map +1 -1
- package/dist/core/sandbox/policy.d.ts +23 -0
- package/dist/core/sandbox/policy.js +100 -0
- package/dist/core/sandbox/policy.js.map +1 -1
- package/dist/core/types.d.ts +13 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
- package/dist/core/usage/frontier-usage.d.ts +20 -2
- package/dist/core/usage/frontier-usage.js +75 -17
- package/dist/core/usage/frontier-usage.js.map +1 -1
- package/dist/core/verse/accounts.d.ts +45 -0
- package/dist/core/verse/accounts.js +246 -17
- package/dist/core/verse/accounts.js.map +1 -1
- package/dist/core/verse/apps-api.js +23 -11
- package/dist/core/verse/apps-api.js.map +1 -1
- package/dist/core/verse/apps.d.ts +11 -9
- package/dist/core/verse/apps.js +2 -2
- package/dist/core/verse/apps.js.map +1 -1
- package/dist/core/verse/authority-api.d.ts +8 -2
- package/dist/core/verse/authority-api.js +40 -5
- package/dist/core/verse/authority-api.js.map +1 -1
- package/dist/core/verse/autonomy-ladder.d.ts +172 -0
- package/dist/core/verse/autonomy-ladder.js +251 -0
- package/dist/core/verse/autonomy-ladder.js.map +1 -0
- package/dist/core/verse/context-fit.js +7 -5
- package/dist/core/verse/context-fit.js.map +1 -1
- package/dist/core/verse/control-api.d.ts +23 -1
- package/dist/core/verse/control-api.js +117 -10
- package/dist/core/verse/control-api.js.map +1 -1
- package/dist/core/verse/fleet-live-api.js +13 -5
- package/dist/core/verse/fleet-live-api.js.map +1 -1
- package/dist/core/verse/folder-io.d.ts +50 -0
- package/dist/core/verse/folder-io.js +142 -0
- package/dist/core/verse/folder-io.js.map +1 -0
- package/dist/core/verse/git-api.js +5 -4
- package/dist/core/verse/git-api.js.map +1 -1
- package/dist/core/verse/git-ops.d.ts +10 -1
- package/dist/core/verse/git-ops.js +18 -2
- package/dist/core/verse/git-ops.js.map +1 -1
- package/dist/core/verse/github-api.d.ts +1 -1
- package/dist/core/verse/github-api.js +5 -4
- package/dist/core/verse/github-api.js.map +1 -1
- package/dist/core/verse/github-repo.js +118 -14
- package/dist/core/verse/github-repo.js.map +1 -1
- package/dist/core/verse/leader-api.d.ts +5 -4
- package/dist/core/verse/leader-api.js +237 -10
- package/dist/core/verse/leader-api.js.map +1 -1
- package/dist/core/verse/local-models.d.ts +10 -0
- package/dist/core/verse/local-models.js +10 -1
- package/dist/core/verse/local-models.js.map +1 -1
- package/dist/core/verse/login-path.d.ts +73 -0
- package/dist/core/verse/login-path.js +123 -14
- package/dist/core/verse/login-path.js.map +1 -1
- package/dist/core/verse/mcp-control-api.js +4 -4
- package/dist/core/verse/mcp-control-api.js.map +1 -1
- package/dist/core/verse/mcp-scope.d.ts +22 -0
- package/dist/core/verse/mcp-scope.js +41 -1
- package/dist/core/verse/mcp-scope.js.map +1 -1
- package/dist/core/verse/mcp-seat-view.d.ts +10 -0
- package/dist/core/verse/mcp-seat-view.js +30 -4
- package/dist/core/verse/mcp-seat-view.js.map +1 -1
- package/dist/core/verse/overnight-api.js +20 -2
- package/dist/core/verse/overnight-api.js.map +1 -1
- package/dist/core/verse/path-guard.d.ts +24 -0
- package/dist/core/verse/path-guard.js +91 -22
- package/dist/core/verse/path-guard.js.map +1 -1
- package/dist/core/verse/preview-api.js +22 -0
- package/dist/core/verse/preview-api.js.map +1 -1
- package/dist/core/verse/projects.d.ts +21 -0
- package/dist/core/verse/projects.js +82 -0
- package/dist/core/verse/projects.js.map +1 -1
- package/dist/core/verse/session-controls-api.js +5 -3
- package/dist/core/verse/session-controls-api.js.map +1 -1
- package/dist/core/verse/session-handoff.d.ts +26 -0
- package/dist/core/verse/session-handoff.js +90 -12
- package/dist/core/verse/session-handoff.js.map +1 -1
- package/dist/core/verse/terminal-api.js +7 -4
- package/dist/core/verse/terminal-api.js.map +1 -1
- package/dist/core/verse/terminal.js +9 -5
- package/dist/core/verse/terminal.js.map +1 -1
- package/dist/core/verse/verse-api.js +81 -27
- package/dist/core/verse/verse-api.js.map +1 -1
- package/dist/core/verse/workspaces.d.ts +51 -0
- package/dist/core/verse/workspaces.js +177 -47
- package/dist/core/verse/workspaces.js.map +1 -1
- package/dist/core/vision/leader-apply.d.ts +40 -0
- package/dist/core/vision/leader-apply.js +101 -30
- package/dist/core/vision/leader-apply.js.map +1 -1
- package/dist/core/vision/leader-cadence.d.ts +114 -0
- package/dist/core/vision/leader-cadence.js +127 -0
- package/dist/core/vision/leader-cadence.js.map +1 -0
- package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
- package/dist/core/vision/leader-goal-evidence.js +36 -0
- package/dist/core/vision/leader-goal-evidence.js.map +1 -0
- package/dist/core/vision/leader-health.d.ts +53 -0
- package/dist/core/vision/leader-health.js +92 -0
- package/dist/core/vision/leader-health.js.map +1 -0
- package/dist/core/vision/leader-operator.d.ts +176 -0
- package/dist/core/vision/leader-operator.js +355 -0
- package/dist/core/vision/leader-operator.js.map +1 -0
- package/dist/core/vision/leader-run-chain.d.ts +41 -0
- package/dist/core/vision/leader-run-chain.js +54 -0
- package/dist/core/vision/leader-run-chain.js.map +1 -0
- package/dist/core/vision/leader-seat-plan.d.ts +68 -0
- package/dist/core/vision/leader-seat-plan.js +93 -0
- package/dist/core/vision/leader-seat-plan.js.map +1 -0
- package/dist/core/vision/leader-seat.d.ts +71 -5
- package/dist/core/vision/leader-seat.js +235 -33
- package/dist/core/vision/leader-seat.js.map +1 -1
- package/dist/core/vision/leader-thread-types.d.ts +104 -0
- package/dist/core/vision/leader-thread-types.js +9 -0
- package/dist/core/vision/leader-thread-types.js.map +1 -0
- package/dist/core/vision/leader-thread.d.ts +138 -0
- package/dist/core/vision/leader-thread.js +926 -0
- package/dist/core/vision/leader-thread.js.map +1 -0
- package/dist/core/vision/leader-types.d.ts +75 -1
- package/dist/core/vision/leader.d.ts +88 -18
- package/dist/core/vision/leader.js +269 -69
- package/dist/core/vision/leader.js.map +1 -1
- package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js → ActionMenu-CIiX2X8w.js} +2 -2
- package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
- package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
- package/dist/core/web/public/next/assets/{Advanced-cVYTAsfB.js.map → Advanced-DHsysoIL.js.map} +1 -1
- package/dist/core/web/public/next/assets/{App-IsaWDsdF.js → App-CMeAocmW.js} +5 -5
- package/dist/core/web/public/next/assets/{App-IsaWDsdF.js.map → App-CMeAocmW.js.map} +1 -1
- package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
- package/dist/core/web/public/next/assets/{AppsSection-DDqeSrty.js.map → AppsSection-DISYnMnc.js.map} +1 -1
- package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
- package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js → AutonomyOffState-CEPSZToP.js} +3 -3
- package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js.map → AutonomyOffState-CEPSZToP.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
- package/dist/core/web/public/next/assets/{AutonomySection-Dwn8UtOy.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
- package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js → BranchBar-BxhdiIpx.js} +2 -2
- package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
- package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js → BudgetControl-C-0KhjRS.js} +2 -2
- package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js.map → BudgetControl-C-0KhjRS.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js → Button-D90dzI_o.js} +2 -2
- package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js.map → Button-D90dzI_o.js.map} +1 -1
- package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js → CapacityStrip-qKDBC65C.js} +2 -2
- package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
- package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
- package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
- package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
- package/dist/core/web/public/next/assets/{ChatSection-C9myY4ei.js.map → ChatSection-DlT4QU6a.js.map} +1 -1
- package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
- package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
- package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
- package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
- package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
- package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
- package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js → DeleteChatDialog-BCfP12GH.js} +2 -2
- package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js → Dialog-D3msQlCj.js} +2 -2
- package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js.map → Dialog-D3msQlCj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js → DiffPane-Ix6hvXlY.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js → DiffViewer-C4WKsCIe.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
- package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
- package/dist/core/web/public/next/assets/{DockHost-BcEq2qaS.js.map → DockHost-aWP7liri.js.map} +1 -1
- package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js → EmptyState-D2IRy3Cg.js} +2 -2
- package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js → Epistemic-DMr18muX.js} +2 -2
- package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js.map → Epistemic-DMr18muX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js → EvidenceTimeline-DXmmz6Fi.js} +2 -2
- package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js.map → EvidenceTimeline-DXmmz6Fi.js.map} +1 -1
- package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
- package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
- package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js → GearTray-Dt-ee32-.js} +2 -2
- package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js.map → GearTray-Dt-ee32-.js.map} +1 -1
- package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
- package/dist/core/web/public/next/assets/{GrowthSection-BvZezOsX.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
- package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js → HandoffDialog-CLJQLe7M.js} +2 -2
- package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js → Input-D_KRJA9V.js} +2 -2
- package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js.map → Input-D_KRJA9V.js.map} +1 -1
- package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
- package/dist/core/web/public/next/assets/{McpSection-nuXer4K-.js.map → McpSection-DGbRcyv8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js → MessageMarkdown-DFvk06qG.js} +3 -3
- package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js → Meter-CMj-VafN.js} +2 -2
- package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js.map → Meter-CMj-VafN.js.map} +1 -1
- package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
- package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
- package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
- package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
- package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js → NeedsYouList-CCsijdWt.js} +2 -2
- package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
- package/dist/core/web/public/next/assets/{NewChatDialog-BqFTWgHU.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
- package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js → OnboardingFlow-Cy9BA9eR.js} +3 -3
- package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js.map → OnboardingFlow-Cy9BA9eR.js.map} +1 -1
- package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
- package/dist/core/web/public/next/assets/{OnboardingGate-BZafM1Vf.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
- package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
- package/dist/core/web/public/next/assets/{PreviewPane-zT3gK9TD.js.map → PreviewPane-COid5A0f.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js → ProviderLogo-Cq-CYIwT.js} +2 -2
- package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js → RailStatus-Co5UB6We.js} +2 -2
- package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js.map → RailStatus-Co5UB6We.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js → RefreshIndicator-DO9ibnSq.js} +2 -2
- package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CAxPQ4sZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
- package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js → SeatSelector-J5R3zDkB.js} +3 -3
- package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js → Segmented-CGh_-tBb.js} +2 -2
- package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js.map → Segmented-CGh_-tBb.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Select-By-V9lMc.js → Select-CWnmUzs3.js} +2 -2
- package/dist/core/web/public/next/assets/{Select-By-V9lMc.js.map → Select-CWnmUzs3.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js → SessionGate-sp4KsnUo.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js → SessionInsightChip-DLFAzdbi.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js → SessionSearch-DbFjwR1h.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SettingsSection-Bf74l0Gj.js → SettingsSection-Ch23msJ5.js} +2 -2
- package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
- package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js → SetupChecklist-Bd76MBAR.js} +2 -2
- package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js.map → SetupChecklist-Bd76MBAR.js.map} +1 -1
- package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
- package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js → Sheet-BZ2AG4Eo.js} +2 -2
- package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
- package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
- package/dist/core/web/public/next/assets/{Sidebar-C9YtBYVZ.js.map → Sidebar-DN--cPYN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js → Slider-KVoJLDD6.js} +2 -2
- package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js.map → Slider-KVoJLDD6.js.map} +1 -1
- package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
- package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
- package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js → StatusBadge-CXsYqmdU.js} +2 -2
- package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
- package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
- package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js → Surface-BfDmQcKe.js} +2 -2
- package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js.map → Surface-BfDmQcKe.js.map} +1 -1
- package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
- package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
- package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js → Switch-9NtO_6Lj.js} +2 -2
- package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js.map → Switch-9NtO_6Lj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js → Tag-DscCRFcN.js} +2 -2
- package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js.map → Tag-DscCRFcN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js → TerminalPane-B668-DJW.js} +5 -5
- package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js.map → TerminalPane-B668-DJW.js.map} +1 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-BpphLqoz.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js → UniverseView-DG70zH0W.js} +4 -4
- package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js.map → UniverseView-DG70zH0W.js.map} +1 -1
- package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
- package/dist/core/web/public/next/assets/{Workspace-RXy0pqp6.js.map → Workspace-D1nP9BhD.js.map} +1 -1
- package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
- package/dist/core/web/public/next/assets/{actions-BZTidCXZ.js.map → actions-CY-PjpGc.js.map} +1 -1
- package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
- package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js → apps-model-Du02KhAf.js} +2 -2
- package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js.map → apps-model-Du02KhAf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js → authority-model-79SeuKlJ.js} +2 -2
- package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js.map → authority-model-79SeuKlJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
- package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
- package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
- package/dist/core/web/public/next/assets/{budget-queries-DFF-3ICg.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
- package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
- package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
- package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
- package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js → cloud-model-BDivRMqv.js} +2 -2
- package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js.map → cloud-model-BDivRMqv.js.map} +1 -1
- package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js → cloud-queries-BPQQ5_pJ.js} +2 -2
- package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
- package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{command-catalog-ffCAijVY.js → command-catalog-BIntSa9l.js} +2 -2
- package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
- package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js → context-model-Br8t9jgG.js} +2 -2
- package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js.map → context-model-Br8t9jgG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js → context-model-CokrgEUq.js} +3 -3
- package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js.map → context-model-CokrgEUq.js.map} +1 -1
- package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
- package/dist/core/web/public/next/assets/{context-queries-_9bFWb9v.js.map → context-queries-eL3caKVG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js → control-queries-B9K-wmcB.js} +2 -2
- package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js.map → control-queries-B9K-wmcB.js.map} +1 -1
- package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js → copy-setup-XMgCC5f8.js} +2 -2
- package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js.map → copy-setup-XMgCC5f8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js → dock-icons-BJ6ZqB2t.js} +2 -2
- package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js → fleet-model-BvDR3gjp.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js → fleet-queries-W2UFVMZJ.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js → focus-trap-CtI1SlMX.js} +2 -2
- package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{format-BmH2yWL6.js → format-CH4g_sl1.js} +2 -2
- package/dist/core/web/public/next/assets/{format-BmH2yWL6.js.map → format-CH4g_sl1.js.map} +1 -1
- package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
- package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js → git-model-Dnkd1TnK.js} +2 -2
- package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js.map → git-model-Dnkd1TnK.js.map} +1 -1
- package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
- package/dist/core/web/public/next/assets/{global-y_exIyAP.js.map → global-CMNW_dqn.js.map} +1 -1
- package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
- package/dist/core/web/public/next/assets/{guarded-runners-Cd4POBtI.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{icons-CygCEFWs.js → icons-D1sYbCTQ.js} +2 -2
- package/dist/core/web/public/next/assets/{icons-CygCEFWs.js.map → icons-D1sYbCTQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{index-CyK31YRm.js → index-DZ-UQ7v8.js} +3 -3
- package/dist/core/web/public/next/assets/{index-CyK31YRm.js.map → index-DZ-UQ7v8.js.map} +1 -1
- package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
- package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
- package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
- package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
- package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js → live-model-D_32RAOR.js} +2 -2
- package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js.map → live-model-D_32RAOR.js.map} +1 -1
- package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js → mind.module-7hA92hRg.js} +2 -2
- package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js.map → mind.module-7hA92hRg.js.map} +1 -1
- package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
- package/dist/core/web/public/next/assets/{mutations-CWlxEMEm.js.map → mutations-DQPbFdRJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{nav-mimleI0R.js → nav-0dOYe2rJ.js} +2 -2
- package/dist/core/web/public/next/assets/{nav-mimleI0R.js.map → nav-0dOYe2rJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js → overnight-queries-C4wOnFtE.js} +2 -2
- package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
- package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
- package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js → queries-BTXWdZzU.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js.map → queries-BTXWdZzU.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js → reasoning-pref-Ca6lN6x_.js} +2 -2
- package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js → reveal-anchor-DfNLgK_I.js} +2 -2
- package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
- package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
- package/dist/core/web/public/next/assets/{seat-subscription-BhUUz7VL.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js → sidebar-model-CLCdqwkR.js} +2 -2
- package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
- package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js → slots-C-qBeu-8.js} +3 -3
- package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js.map → slots-C-qBeu-8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js → surface-data-Dj71tdD-.js} +2 -2
- package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js.map → surface-data-Dj71tdD-.js.map} +1 -1
- package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
- package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js → tasks-model-O8yR5YXp.js} +2 -2
- package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js → terminal-icons-CoRZq9iO.js} +2 -2
- package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
- package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
- package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
- package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js → usage-queries-AdjEyEtn.js} +2 -2
- package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js → use-guarded-action-CuuMHeDX.js} +2 -2
- package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js → use-ticker-BBcp02SZ.js} +2 -2
- package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js → use-token-gate-CbXVYQYI.js} +2 -2
- package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js → useOnboarding-C_Fpe_sH.js} +2 -2
- package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
- package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js → useVerseTranscript-DgbigUlV.js} +2 -2
- package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
- package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js → verse-icons-S56hIiXS.js} +2 -2
- package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js.map → verse-icons-S56hIiXS.js.map} +1 -1
- package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
- package/dist/core/web/public/next/assets/{verse-model-JTuvRBVK.js.map → verse-model-DAVevkNe.js.map} +1 -1
- package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js → warmup-B_RAtNZ_.js} +3 -3
- package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js.map → warmup-B_RAtNZ_.js.map} +1 -1
- package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js → why-seat-model-M_r0wX3b.js} +2 -2
- package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js.map → why-seat-model-M_r0wX3b.js.map} +1 -1
- package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js → workspace-model-dji5-Al3.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js.map → workspace-model-dji5-Al3.js.map} +1 -1
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/core/web/read-projection-worker.js +2 -1
- package/dist/core/web/read-projection-worker.js.map +1 -1
- package/dist/core/web/read-projections.d.ts +3 -0
- package/dist/core/web/read-projections.js +2 -2
- package/dist/core/web/read-projections.js.map +1 -1
- package/dist/core/web/visibility.js +3 -4
- package/dist/core/web/visibility.js.map +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/package.json +3 -2
- package/dist/core/web/public/next/assets/Advanced-cVYTAsfB.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-DDqeSrty.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-Dwn8UtOy.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js +0 -3
- package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js +0 -2
- package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
- package/dist/core/web/public/next/assets/DockHost-BcEq2qaS.js +0 -2
- package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js +0 -3
- package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-BvZezOsX.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-nuXer4K-.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js +0 -3
- package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js.map +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BqFTWgHU.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingGate-BZafM1Vf.js +0 -3
- package/dist/core/web/public/next/assets/PreviewPane-zT3gK9TD.js +0 -2
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CAxPQ4sZ.js +0 -7
- package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js +0 -2
- package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-Bf74l0Gj.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js +0 -3
- package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
- package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-BpphLqoz.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-RXy0pqp6.js +0 -10
- package/dist/core/web/public/next/assets/actions-BZTidCXZ.js +0 -2
- package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
- package/dist/core/web/public/next/assets/budget-queries-DFF-3ICg.js +0 -2
- package/dist/core/web/public/next/assets/charts-CzxWrZn7.js +0 -2
- package/dist/core/web/public/next/assets/charts-CzxWrZn7.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
- package/dist/core/web/public/next/assets/command-catalog-ffCAijVY.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-_9bFWb9v.js +0 -2
- package/dist/core/web/public/next/assets/global-y_exIyAP.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-Cd4POBtI.js +0 -2
- package/dist/core/web/public/next/assets/mutations-CWlxEMEm.js +0 -2
- package/dist/core/web/public/next/assets/primitives-DMijqcu0.js +0 -1
- package/dist/core/web/public/next/assets/seat-subscription-BhUUz7VL.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-model-JTuvRBVK.js +0 -2
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import type { RepoEnforcement } from '../fleet/fleet-types.js';
|
|
2
|
+
/** What a failed GitHub read means (drives the wording and whether a draft may treat it as definitive). */
|
|
3
|
+
export type GithubReadFailure =
|
|
4
|
+
/** The feature is not on this plan for this repo (private repo on Free): definitive. */
|
|
5
|
+
'plan-unavailable'
|
|
6
|
+
/** Auth is missing or lacks access (401/403 other than the plan message, "Resource not accessible"). */
|
|
7
|
+
| 'no-permission'
|
|
8
|
+
/** 404: no such repo, or not visible to this auth. */
|
|
9
|
+
| 'not-found'
|
|
10
|
+
/** 5xx, 429 / rate limits, timeouts, network errors: try again later. */
|
|
11
|
+
| 'transient' | 'unknown';
|
|
12
|
+
/**
|
|
13
|
+
* PURE: classify a failed GitHub read from its HTTP status (when known) and
|
|
14
|
+
* message (gh's stderr, or the API's `message`). The plan message wins over
|
|
15
|
+
* everything: GitHub sends it with a 403, which would otherwise read as a
|
|
16
|
+
* permission problem. A rate-limit 403 is transient, not a permission problem.
|
|
17
|
+
*/
|
|
18
|
+
export declare function classifyGithubReadFailure(input: {
|
|
19
|
+
status?: number | null;
|
|
20
|
+
message: string;
|
|
21
|
+
}): GithubReadFailure;
|
|
22
|
+
/** PURE: true only for GitHub's "not on this plan" answer — never for a permission or transient failure. */
|
|
23
|
+
export declare function isPlanUnavailable(input: {
|
|
24
|
+
status?: number | null;
|
|
25
|
+
message: string;
|
|
26
|
+
}): boolean;
|
|
27
|
+
/** PURE: a short human phrase for a failure kind. */
|
|
28
|
+
export declare function describeGithubReadFailure(kind: GithubReadFailure): string;
|
|
29
|
+
export type ServerEnforcementState =
|
|
30
|
+
/** GitHub requires at least one status check on the default branch (rulesets or classic protection). */
|
|
31
|
+
'enforced'
|
|
32
|
+
/** Protection is readable (the plan has it) but requires no status check: G7 under `server` would owner-lane every PR. */
|
|
33
|
+
| 'no-required-checks'
|
|
34
|
+
/** Rulesets / protection are not on this plan for this (private) repo: only `local` enforcement can work. */
|
|
35
|
+
| 'unavailable'
|
|
36
|
+
/** Could not tell (permission, network, …): never treated as enforced. */
|
|
37
|
+
| 'unreadable';
|
|
38
|
+
export interface ServerEnforcementProbe {
|
|
39
|
+
nameWithOwner: string;
|
|
40
|
+
state: ServerEnforcementState;
|
|
41
|
+
/** null = the repo itself could not be read. */
|
|
42
|
+
private: boolean | null;
|
|
43
|
+
/** Why the probe could not tell (state 'unavailable' | 'unreadable'); null otherwise. */
|
|
44
|
+
failure: GithubReadFailure | null;
|
|
45
|
+
/** One human sentence. */
|
|
46
|
+
detail: string;
|
|
47
|
+
}
|
|
48
|
+
/** One `gh api <path>` GET. `status` is gh's exit code (0 = the API answered 2xx). */
|
|
49
|
+
export type GithubGet = (path: string) => Promise<{
|
|
50
|
+
status: number;
|
|
51
|
+
stdout: string;
|
|
52
|
+
stderr: string;
|
|
53
|
+
}> | {
|
|
54
|
+
status: number;
|
|
55
|
+
stdout: string;
|
|
56
|
+
stderr: string;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* PURE: how many required status checks GitHub enforces on a branch, from the
|
|
60
|
+
* two reads merge gate G7 uses (fleet/host-merge.ts readRequiredChecks): the
|
|
61
|
+
* effective branch rules and the classic protection summary on GET /branches.
|
|
62
|
+
* Classic contexts with `enforcement_level: "off"` enforce nothing.
|
|
63
|
+
*/
|
|
64
|
+
export declare function countRequiredChecks(rules: unknown, branch: unknown): number;
|
|
65
|
+
/**
|
|
66
|
+
* Ask GitHub whether it enforces required checks on `nameWithOwner`'s default
|
|
67
|
+
* branch. At most three GETs: the repo, its effective branch rules, the
|
|
68
|
+
* branch (classic protection summary). Never throws.
|
|
69
|
+
*/
|
|
70
|
+
export declare function probeServerEnforcement(nameWithOwner: string, get: GithubGet): Promise<ServerEnforcementProbe>;
|
|
71
|
+
/**
|
|
72
|
+
* PURE: the enforcement a NEW grant draft names for a repo. `server` only
|
|
73
|
+
* when GitHub already enforces required checks there — anything else
|
|
74
|
+
* (unavailable, nothing required, unreadable, not probed) is `local`, which
|
|
75
|
+
* is the stricter mode: lower ceilings, and G7 then demands the App's
|
|
76
|
+
* host-verified `ashlr/verify` instead of trusting whatever ran.
|
|
77
|
+
*/
|
|
78
|
+
export declare function draftEnforcementFor(probe: Pick<ServerEnforcementProbe, 'state'> | null | undefined): RepoEnforcement;
|
|
79
|
+
/**
|
|
80
|
+
* PURE: should a RE-APPROVAL switch a `server` repo to `local`? Only on
|
|
81
|
+
* definitive evidence that GitHub cannot or does not enforce checks there —
|
|
82
|
+
* an unreadable probe (offline, rate-limited) leaves the signed choice alone,
|
|
83
|
+
* so a flaky network during a re-approval cannot quietly rewrite the grant.
|
|
84
|
+
* A re-approval never switches `local` → `server` (that would widen the
|
|
85
|
+
* ceilings; a new grant does it).
|
|
86
|
+
*/
|
|
87
|
+
export declare function reapprovalDowngrades(probe: Pick<ServerEnforcementProbe, 'state'> | null | undefined): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* PURE: the mismatch between a signed grant's enforcement and what GitHub
|
|
90
|
+
* does today, as one sentence for status / setup / Verse; null when they
|
|
91
|
+
* agree or the probe could not tell. The grant itself is never changed here —
|
|
92
|
+
* only a re-approval (Touch ID) switches the repo.
|
|
93
|
+
*/
|
|
94
|
+
export declare function enforcementMismatch(grantRepo: {
|
|
95
|
+
nameWithOwner: string;
|
|
96
|
+
enforcement: RepoEnforcement;
|
|
97
|
+
}, probe: ServerEnforcementProbe | null | undefined, grantSeq?: number | null): string | null;
|
|
98
|
+
/**
|
|
99
|
+
* `gh api <path>` (GET only, never a shell, killed after 10 s). Under Vitest
|
|
100
|
+
* it refuses without spawning anything: a draft built by a test that did not
|
|
101
|
+
* inject a reader must never read Mason's real GitHub account — and a refusal
|
|
102
|
+
* makes every repo `local`, the stricter answer.
|
|
103
|
+
*/
|
|
104
|
+
export declare function defaultGithubGet(path: string): Promise<{
|
|
105
|
+
status: number;
|
|
106
|
+
stdout: string;
|
|
107
|
+
stderr: string;
|
|
108
|
+
}>;
|
|
109
|
+
/** Probe several repos concurrently (each probe is ≤ 3 sequential GETs). Keyed by lower-cased owner/name. */
|
|
110
|
+
export declare function probeServerEnforcementAll(repos: readonly string[], get?: GithubGet): Promise<Map<string, ServerEnforcementProbe>>;
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server enforcement — can GitHub itself protect a grant repo's default branch?
|
|
3
|
+
*
|
|
4
|
+
* A standing grant names each repo `server` or `local` enforcement (types.ts
|
|
5
|
+
* StandingGrantRepo). `server` means GitHub's rulesets / branch protection
|
|
6
|
+
* require checks on the default branch, and merge gate G7 trusts exactly those
|
|
7
|
+
* required checks; `local` means GitHub protects nothing, so G7 requires every
|
|
8
|
+
* check on the head green AND the ashlr-fleet App's host-verified
|
|
9
|
+
* `ashlr/verify` (fleet/verify-check-run.ts), under the lower local ceilings.
|
|
10
|
+
*
|
|
11
|
+
* WHY THIS MODULE EXISTS: on GitHub Free, rulesets AND classic branch
|
|
12
|
+
* protection are unavailable for PRIVATE repos. Verified against the live API
|
|
13
|
+
* (2026-09-26, org plan "free", private ashlrai/measurably):
|
|
14
|
+
*
|
|
15
|
+
* GET repos/X/rulesets → 403 "Upgrade to GitHub Pro or make this repository public to enable this feature."
|
|
16
|
+
* GET repos/X/rules/branches/main → 403 (same message)
|
|
17
|
+
* GET repos/X/branches/main/protection → 403 (same message)
|
|
18
|
+
* GET repos/X/branches/main → 200, protected: false
|
|
19
|
+
*
|
|
20
|
+
* So classic branch protection is NOT a fallback where rulesets are missing
|
|
21
|
+
* (it is plan-gated identically) and the fleet does not try to apply it.
|
|
22
|
+
* Drafts used to mark every repo whose visibility was unknown `server`, which
|
|
23
|
+
* made G7 send every PR in such a repo to the owner lane forever. A draft now
|
|
24
|
+
* asks GitHub and names `server` only where GitHub already enforces at least
|
|
25
|
+
* one required check on the default branch; everything else is `local`.
|
|
26
|
+
*
|
|
27
|
+
* Nothing here gates a merge: G7 re-reads the live protection on every PR.
|
|
28
|
+
* These reads only decide what a DRAFT proposes (Mason still signs it) and
|
|
29
|
+
* what status / setup report. Every call is a `gh api <path>` GET.
|
|
30
|
+
*/
|
|
31
|
+
import { execFile } from 'node:child_process';
|
|
32
|
+
/** GitHub's wording for a plan-gated feature on a private repo (rulesets, branch protection). */
|
|
33
|
+
const PLAN_UNAVAILABLE_RE = /upgrade to github pro|make this repository public to enable this feature/iu;
|
|
34
|
+
const TRANSIENT_RE = /rate limit|HTTP 5\d\d|HTTP 429|timed? ?out|ETIMEDOUT|ECONNRESET|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|could not resolve|network|did not answer|ran out of time|bad gateway|service unavailable/iu;
|
|
35
|
+
const PERMISSION_RE = /HTTP 40[13]\b|resource not accessible|must have admin|bad credentials|requires authentication|gh auth login|not logged in/iu;
|
|
36
|
+
const NOT_FOUND_RE = /HTTP 404\b|\bnot found\b/iu;
|
|
37
|
+
/**
|
|
38
|
+
* PURE: classify a failed GitHub read from its HTTP status (when known) and
|
|
39
|
+
* message (gh's stderr, or the API's `message`). The plan message wins over
|
|
40
|
+
* everything: GitHub sends it with a 403, which would otherwise read as a
|
|
41
|
+
* permission problem. A rate-limit 403 is transient, not a permission problem.
|
|
42
|
+
*/
|
|
43
|
+
export function classifyGithubReadFailure(input) {
|
|
44
|
+
const message = input.message ?? '';
|
|
45
|
+
const status = input.status ?? null;
|
|
46
|
+
if (PLAN_UNAVAILABLE_RE.test(message))
|
|
47
|
+
return 'plan-unavailable';
|
|
48
|
+
if ((status !== null && (status >= 500 || status === 429 || status === 0)) || TRANSIENT_RE.test(message))
|
|
49
|
+
return 'transient';
|
|
50
|
+
if (status === 404 || (status === null && NOT_FOUND_RE.test(message)))
|
|
51
|
+
return 'not-found';
|
|
52
|
+
if (status === 401 || status === 403 || (status === null && PERMISSION_RE.test(message)))
|
|
53
|
+
return 'no-permission';
|
|
54
|
+
return 'unknown';
|
|
55
|
+
}
|
|
56
|
+
/** PURE: true only for GitHub's "not on this plan" answer — never for a permission or transient failure. */
|
|
57
|
+
export function isPlanUnavailable(input) {
|
|
58
|
+
return classifyGithubReadFailure(input) === 'plan-unavailable';
|
|
59
|
+
}
|
|
60
|
+
/** PURE: a short human phrase for a failure kind. */
|
|
61
|
+
export function describeGithubReadFailure(kind) {
|
|
62
|
+
switch (kind) {
|
|
63
|
+
case 'plan-unavailable': return 'not available on this GitHub plan for a private repo';
|
|
64
|
+
case 'no-permission': return 'your gh auth has no access (check `gh auth status`)';
|
|
65
|
+
case 'not-found': return 'not found, or not visible to your gh auth';
|
|
66
|
+
case 'transient': return 'GitHub did not answer (network, rate limit or outage) — try again';
|
|
67
|
+
default: return 'GitHub refused the read';
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const REPO_RE = /^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})\/[A-Za-z0-9._-]{1,100}$/u;
|
|
71
|
+
const BRANCH_RE = /^[A-Za-z0-9._/-]{1,255}$/u;
|
|
72
|
+
function parseJson(text) {
|
|
73
|
+
try {
|
|
74
|
+
return JSON.parse(text || 'null');
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function record(value) {
|
|
81
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value) ? value : null;
|
|
82
|
+
}
|
|
83
|
+
function failureMessage(result) {
|
|
84
|
+
const body = record(parseJson(result.stdout));
|
|
85
|
+
const apiMessage = typeof body?.['message'] === 'string' ? body['message'] : '';
|
|
86
|
+
return `${result.stderr} ${apiMessage}`.replace(/\s+/gu, ' ').trim().slice(0, 300);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* PURE: how many required status checks GitHub enforces on a branch, from the
|
|
90
|
+
* two reads merge gate G7 uses (fleet/host-merge.ts readRequiredChecks): the
|
|
91
|
+
* effective branch rules and the classic protection summary on GET /branches.
|
|
92
|
+
* Classic contexts with `enforcement_level: "off"` enforce nothing.
|
|
93
|
+
*/
|
|
94
|
+
export function countRequiredChecks(rules, branch) {
|
|
95
|
+
const contexts = new Set();
|
|
96
|
+
if (Array.isArray(rules)) {
|
|
97
|
+
for (const rule of rules) {
|
|
98
|
+
const r = record(rule);
|
|
99
|
+
if (r?.['type'] !== 'required_status_checks')
|
|
100
|
+
continue;
|
|
101
|
+
const checks = record(r['parameters'])?.['required_status_checks'];
|
|
102
|
+
if (!Array.isArray(checks))
|
|
103
|
+
continue;
|
|
104
|
+
for (const check of checks) {
|
|
105
|
+
const context = record(check)?.['context'];
|
|
106
|
+
if (typeof context === 'string' && context.length > 0)
|
|
107
|
+
contexts.add(context);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const classic = record(record(record(branch)?.['protection'])?.['required_status_checks']);
|
|
112
|
+
if (classic && classic['enforcement_level'] !== 'off') {
|
|
113
|
+
for (const list of [classic['contexts'], Array.isArray(classic['checks']) ? classic['checks'].map((c) => record(c)?.['context']) : []]) {
|
|
114
|
+
if (!Array.isArray(list))
|
|
115
|
+
continue;
|
|
116
|
+
for (const context of list)
|
|
117
|
+
if (typeof context === 'string' && context.length > 0)
|
|
118
|
+
contexts.add(context);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return contexts.size;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Ask GitHub whether it enforces required checks on `nameWithOwner`'s default
|
|
125
|
+
* branch. At most three GETs: the repo, its effective branch rules, the
|
|
126
|
+
* branch (classic protection summary). Never throws.
|
|
127
|
+
*/
|
|
128
|
+
export async function probeServerEnforcement(nameWithOwner, get) {
|
|
129
|
+
const out = (state, isPrivate, failure, detail) => ({ nameWithOwner, state, private: isPrivate, failure, detail });
|
|
130
|
+
if (!REPO_RE.test(nameWithOwner))
|
|
131
|
+
return out('unreadable', null, 'unknown', 'not an owner/name repo');
|
|
132
|
+
let repo;
|
|
133
|
+
try {
|
|
134
|
+
repo = await get(`repos/${nameWithOwner}`);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
repo = { status: 1, stdout: '', stderr: error.message };
|
|
138
|
+
}
|
|
139
|
+
if (repo.status !== 0) {
|
|
140
|
+
const failure = classifyGithubReadFailure({ message: failureMessage(repo) });
|
|
141
|
+
return out('unreadable', null, failure, `could not read ${nameWithOwner}: ${describeGithubReadFailure(failure)}`);
|
|
142
|
+
}
|
|
143
|
+
const info = record(parseJson(repo.stdout));
|
|
144
|
+
const isPrivate = info?.['private'] === true ? true : info?.['private'] === false ? false : null;
|
|
145
|
+
const branchName = typeof info?.['default_branch'] === 'string' && BRANCH_RE.test(info['default_branch']) ? info['default_branch'] : null;
|
|
146
|
+
if (!branchName)
|
|
147
|
+
return out('unreadable', isPrivate, 'unknown', `${nameWithOwner} has no readable default branch`);
|
|
148
|
+
const encoded = branchName.split('/').map(encodeURIComponent).join('/');
|
|
149
|
+
let rules;
|
|
150
|
+
try {
|
|
151
|
+
rules = await get(`repos/${nameWithOwner}/rules/branches/${encoded}?per_page=100`);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
rules = { status: 1, stdout: '', stderr: error.message };
|
|
155
|
+
}
|
|
156
|
+
let rulesBody = [];
|
|
157
|
+
if (rules.status !== 0) {
|
|
158
|
+
const failure = classifyGithubReadFailure({ message: failureMessage(rules) });
|
|
159
|
+
if (failure === 'plan-unavailable') {
|
|
160
|
+
return out('unavailable', isPrivate, failure, `GitHub rulesets are unavailable on this plan for ${isPrivate === false ? 'repo' : 'private repo'} ${nameWithOwner}`);
|
|
161
|
+
}
|
|
162
|
+
// G7 reads a 404 here as "no rulesets" (older GHES); anything else is unknown.
|
|
163
|
+
if (failure !== 'not-found')
|
|
164
|
+
return out('unreadable', isPrivate, failure, `could not read ${nameWithOwner}'s branch rules: ${describeGithubReadFailure(failure)}`);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
rulesBody = parseJson(rules.stdout);
|
|
168
|
+
}
|
|
169
|
+
let branch;
|
|
170
|
+
try {
|
|
171
|
+
branch = await get(`repos/${nameWithOwner}/branches/${encoded}`);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
branch = { status: 1, stdout: '', stderr: error.message };
|
|
175
|
+
}
|
|
176
|
+
if (branch.status !== 0) {
|
|
177
|
+
const failure = classifyGithubReadFailure({ message: failureMessage(branch) });
|
|
178
|
+
return out('unreadable', isPrivate, failure, `could not read ${nameWithOwner}'s ${branchName} branch: ${describeGithubReadFailure(failure)}`);
|
|
179
|
+
}
|
|
180
|
+
const required = countRequiredChecks(rulesBody, parseJson(branch.stdout));
|
|
181
|
+
return required > 0
|
|
182
|
+
? out('enforced', isPrivate, null, `GitHub requires ${required} check${required === 1 ? '' : 's'} on ${nameWithOwner}:${branchName}`)
|
|
183
|
+
: out('no-required-checks', isPrivate, null, `GitHub requires no status check on ${nameWithOwner}:${branchName}`);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* PURE: the enforcement a NEW grant draft names for a repo. `server` only
|
|
187
|
+
* when GitHub already enforces required checks there — anything else
|
|
188
|
+
* (unavailable, nothing required, unreadable, not probed) is `local`, which
|
|
189
|
+
* is the stricter mode: lower ceilings, and G7 then demands the App's
|
|
190
|
+
* host-verified `ashlr/verify` instead of trusting whatever ran.
|
|
191
|
+
*/
|
|
192
|
+
export function draftEnforcementFor(probe) {
|
|
193
|
+
return probe?.state === 'enforced' ? 'server' : 'local';
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* PURE: should a RE-APPROVAL switch a `server` repo to `local`? Only on
|
|
197
|
+
* definitive evidence that GitHub cannot or does not enforce checks there —
|
|
198
|
+
* an unreadable probe (offline, rate-limited) leaves the signed choice alone,
|
|
199
|
+
* so a flaky network during a re-approval cannot quietly rewrite the grant.
|
|
200
|
+
* A re-approval never switches `local` → `server` (that would widen the
|
|
201
|
+
* ceilings; a new grant does it).
|
|
202
|
+
*/
|
|
203
|
+
export function reapprovalDowngrades(probe) {
|
|
204
|
+
return probe?.state === 'unavailable' || probe?.state === 'no-required-checks';
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* PURE: the mismatch between a signed grant's enforcement and what GitHub
|
|
208
|
+
* does today, as one sentence for status / setup / Verse; null when they
|
|
209
|
+
* agree or the probe could not tell. The grant itself is never changed here —
|
|
210
|
+
* only a re-approval (Touch ID) switches the repo.
|
|
211
|
+
*/
|
|
212
|
+
export function enforcementMismatch(grantRepo, probe, grantSeq = null) {
|
|
213
|
+
if (grantRepo.enforcement !== 'server' || !probe)
|
|
214
|
+
return null;
|
|
215
|
+
const grant = grantSeq === null ? 'the grant' : `grant #${grantSeq}`;
|
|
216
|
+
if (probe.state === 'unavailable') {
|
|
217
|
+
return `${grant} says server enforcement for ${grantRepo.nameWithOwner}, but GitHub rulesets are unavailable on this plan for ${probe.private === false ? 'this repo' : 'this private repo'} ` +
|
|
218
|
+
'— G7 sends its PRs to the owner lane; re-approve (`ashlr authority re-approve`) to switch it to local enforcement with ashlr/verify';
|
|
219
|
+
}
|
|
220
|
+
if (probe.state === 'no-required-checks') {
|
|
221
|
+
return `${grant} says server enforcement for ${grantRepo.nameWithOwner}, but GitHub requires no check on its default branch ` +
|
|
222
|
+
'— G7 sends its PRs to the owner lane; run `ashlr authority protect --apply`, or re-approve to switch it to local enforcement with ashlr/verify';
|
|
223
|
+
}
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
// The default reader: a bounded, read-only `gh api <path>`
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
const GH_PATH_RE = /^[A-Za-z0-9][A-Za-z0-9._~/?=&%-]{0,400}$/u;
|
|
230
|
+
const GH_TIMEOUT_MS = 10_000;
|
|
231
|
+
/**
|
|
232
|
+
* `gh api <path>` (GET only, never a shell, killed after 10 s). Under Vitest
|
|
233
|
+
* it refuses without spawning anything: a draft built by a test that did not
|
|
234
|
+
* inject a reader must never read Mason's real GitHub account — and a refusal
|
|
235
|
+
* makes every repo `local`, the stricter answer.
|
|
236
|
+
*/
|
|
237
|
+
export function defaultGithubGet(path) {
|
|
238
|
+
if (process.env['VITEST'] === 'true')
|
|
239
|
+
return Promise.resolve({ status: 1, stdout: '', stderr: 'not read: GitHub reads are disabled under tests' });
|
|
240
|
+
if (!GH_PATH_RE.test(path))
|
|
241
|
+
return Promise.resolve({ status: 1, stdout: '', stderr: 'refused: not a gh api path' });
|
|
242
|
+
return new Promise((done) => {
|
|
243
|
+
execFile('gh', ['api', path], {
|
|
244
|
+
encoding: 'utf8',
|
|
245
|
+
timeout: GH_TIMEOUT_MS,
|
|
246
|
+
maxBuffer: 8 * 1024 * 1024,
|
|
247
|
+
env: { ...process.env, GH_PROMPT_DISABLED: '1', GH_NO_UPDATE_NOTIFIER: '1' },
|
|
248
|
+
}, (error, stdout, stderr) => {
|
|
249
|
+
const code = error?.code;
|
|
250
|
+
done({ status: error ? (typeof code === 'number' ? code : 1) : 0, stdout: stdout ?? '', stderr: stderr || (error ? error.message : '') });
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
/** Probe several repos concurrently (each probe is ≤ 3 sequential GETs). Keyed by lower-cased owner/name. */
|
|
255
|
+
export async function probeServerEnforcementAll(repos, get = defaultGithubGet) {
|
|
256
|
+
const unique = [...new Map(repos.map((repo) => [repo.toLowerCase(), repo])).values()];
|
|
257
|
+
const probes = await Promise.all(unique.map((repo) => probeServerEnforcement(repo, get)));
|
|
258
|
+
return new Map(probes.map((probe) => [probe.nameWithOwner.toLowerCase(), probe]));
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=server-enforcement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-enforcement.js","sourceRoot":"","sources":["../../../src/core/authority/server-enforcement.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
import { type KeyObject } from 'node:crypto';
|
|
25
25
|
import type { BudgetEngine } from '../routing/policy.js';
|
|
26
26
|
import { type FleetEngine, type MergeRisk } from '../fleet/fleet-types.js';
|
|
27
|
+
import { type ServerEnforcementState } from './server-enforcement.js';
|
|
27
28
|
import { type SurfaceTarget } from './surface.js';
|
|
28
29
|
import { type LeaderGrantClass, type RolloutCriteria, type SignedStandingGrantV1, type StandingGrantTrustRoot, type StandingGrantV1 } from './types.js';
|
|
29
30
|
export type GrantParseResult<T> = {
|
|
@@ -95,10 +96,19 @@ export declare function standingTrustRootKeys(roots: readonly StandingGrantTrust
|
|
|
95
96
|
export declare function verifyStandingGrant(value: unknown, ctx: StandingGrantVerifyContext, roots: readonly StandingGrantTrustRoot[]): StandingGrantVerification;
|
|
96
97
|
export interface DraftRepoInput {
|
|
97
98
|
nameWithOwner: string;
|
|
98
|
-
/** Private repos on the free plan cannot get server-side protection → local enforcement. null = unknown
|
|
99
|
+
/** Private repos on the free plan cannot get server-side protection → local enforcement. null = unknown. */
|
|
99
100
|
visibility: 'public' | 'private' | null;
|
|
100
101
|
/** The checkout has a verify command (tests); null = unknown. */
|
|
101
102
|
hasVerify: boolean | null;
|
|
103
|
+
/**
|
|
104
|
+
* What GitHub enforces on the default branch today (server-enforcement.ts
|
|
105
|
+
* probeServerEnforcement). The draft names `server` ONLY for 'enforced';
|
|
106
|
+
* absent / null (not probed) is `local` — the stricter mode. WHY: a repo
|
|
107
|
+
* named `server` that GitHub cannot protect (a private repo on Free has
|
|
108
|
+
* neither rulesets nor branch protection) sends every PR to the owner lane
|
|
109
|
+
* at G7 forever, while `local` gets the App's host-verified ashlr/verify.
|
|
110
|
+
*/
|
|
111
|
+
serverEnforcement?: ServerEnforcementState | null;
|
|
102
112
|
}
|
|
103
113
|
export interface DraftSeatInput {
|
|
104
114
|
seatId: string;
|
|
@@ -151,12 +161,22 @@ export declare const LOCAL_SEAT_WILDCARD = "local";
|
|
|
151
161
|
export declare function buildDefaultGrantPayload(input: GrantDraftInput): StandingGrantV1;
|
|
152
162
|
/**
|
|
153
163
|
* PURE: the grant that continues `current` after a pause, an expiry or a new
|
|
154
|
-
* 30-day period. Same scope
|
|
155
|
-
*
|
|
164
|
+
* 30-day period. Same scope (except a `server` repo GitHub cannot protect,
|
|
165
|
+
* which becomes `local` — see `serverEnforcement`), fresh ids / dates /
|
|
166
|
+
* bindings, and its ladder STARTS at the stage `current` had reached — a deploy does not restart the
|
|
156
167
|
* ramp from shadow. The start rung is inside the signed payload (the first
|
|
157
168
|
* stage), so the Touch ID prompt shows exactly where autonomy resumes.
|
|
158
169
|
*/
|
|
159
|
-
export declare function buildReapprovalGrantPayload(current: StandingGrantV1, currentStageIndex: number, input: Omit<GrantDraftInput, 'repos' | 'seats'>
|
|
170
|
+
export declare function buildReapprovalGrantPayload(current: StandingGrantV1, currentStageIndex: number, input: Omit<GrantDraftInput, 'repos' | 'seats'> & {
|
|
171
|
+
/**
|
|
172
|
+
* What GitHub enforces per repo today (lower-cased owner/name → state).
|
|
173
|
+
* A `server` repo GitHub definitively cannot / does not protect
|
|
174
|
+
* ('unavailable' | 'no-required-checks') is switched to `local` at the
|
|
175
|
+
* local ceilings — the only scope change a re-approval makes, and always
|
|
176
|
+
* a narrowing. Unreadable or absent entries leave the signed choice alone.
|
|
177
|
+
*/
|
|
178
|
+
serverEnforcement?: ReadonlyMap<string, ServerEnforcementState>;
|
|
179
|
+
}): StandingGrantV1;
|
|
160
180
|
/** Plain-language lines describing a grant's scope (CLI confirmation, the Touch ID sheet, logs). */
|
|
161
181
|
export declare function describeGrantScope(grant: StandingGrantV1): string[];
|
|
162
182
|
export declare function installedGrantPath(): string;
|
|
@@ -27,6 +27,7 @@ import { join } from 'node:path';
|
|
|
27
27
|
import { BUDGET_MODES } from '../routing/types.js';
|
|
28
28
|
import { FLEET_ENGINES, MERGE_RISK_RANK, REPO_STAGE_RANK } from '../fleet/fleet-types.js';
|
|
29
29
|
import { canonicalJson } from './canonical-json.js';
|
|
30
|
+
import { draftEnforcementFor, reapprovalDowngrades } from './server-enforcement.js';
|
|
30
31
|
import { keyIdForPublicKeyPem } from './custody-client.js';
|
|
31
32
|
import { authorityDir, ensureAuthorityDir, readPrivateText, withLedgerTransaction, writePrivateAtomically, } from './ledger.js';
|
|
32
33
|
import { currentHostBinding, verifyAuthoritySurface } from './surface.js';
|
|
@@ -518,7 +519,8 @@ export function buildDefaultGrantPayload(input) {
|
|
|
518
519
|
continue;
|
|
519
520
|
seen.add(key);
|
|
520
521
|
const plan = DEFAULT_REPO_PLAN[repoName(candidate.nameWithOwner)];
|
|
521
|
-
const local = candidate.visibility === 'private'
|
|
522
|
+
const local = candidate.visibility === 'private'
|
|
523
|
+
|| draftEnforcementFor(candidate.serverEnforcement ? { state: candidate.serverEnforcement } : null) === 'local';
|
|
522
524
|
const canMerge = plan !== undefined && !(plan.needsVerify && candidate.hasVerify !== true);
|
|
523
525
|
const risk = local ? 'low' : plan?.risk ?? 'low';
|
|
524
526
|
planned.push({
|
|
@@ -592,15 +594,29 @@ export function buildDefaultGrantPayload(input) {
|
|
|
592
594
|
}
|
|
593
595
|
/**
|
|
594
596
|
* PURE: the grant that continues `current` after a pause, an expiry or a new
|
|
595
|
-
* 30-day period. Same scope
|
|
596
|
-
*
|
|
597
|
+
* 30-day period. Same scope (except a `server` repo GitHub cannot protect,
|
|
598
|
+
* which becomes `local` — see `serverEnforcement`), fresh ids / dates /
|
|
599
|
+
* bindings, and its ladder STARTS at the stage `current` had reached — a deploy does not restart the
|
|
597
600
|
* ramp from shadow. The start rung is inside the signed payload (the first
|
|
598
601
|
* stage), so the Touch ID prompt shows exactly where autonomy resumes.
|
|
599
602
|
*/
|
|
600
603
|
export function buildReapprovalGrantPayload(current, currentStageIndex, input) {
|
|
601
604
|
const from = Math.max(0, Math.min(currentStageIndex, current.rollout.stages.length - 1));
|
|
605
|
+
const ceiling = STANDING_GRANT_CEILINGS.localEnforcement;
|
|
606
|
+
const repos = current.repos.map((repo) => {
|
|
607
|
+
const state = input.serverEnforcement?.get(repo.nameWithOwner.toLowerCase());
|
|
608
|
+
if (repo.enforcement !== 'server' || !reapprovalDowngrades(state === undefined ? null : { state }))
|
|
609
|
+
return structuredClone(repo);
|
|
610
|
+
return {
|
|
611
|
+
...repo,
|
|
612
|
+
enforcement: 'local',
|
|
613
|
+
maxRisk: MERGE_RISK_RANK[repo.maxRisk] > MERGE_RISK_RANK[ceiling.maxRisk] ? ceiling.maxRisk : repo.maxRisk,
|
|
614
|
+
maxMergesPerDay: Math.min(repo.maxMergesPerDay, ceiling.maxMergesPerDay),
|
|
615
|
+
};
|
|
616
|
+
});
|
|
602
617
|
const payload = {
|
|
603
618
|
...structuredClone(current),
|
|
619
|
+
repos,
|
|
604
620
|
grantId: input.grantId,
|
|
605
621
|
grantSeq: input.grantSeq,
|
|
606
622
|
keyId: input.keyId,
|