@ashlr/hub 3.12.0 → 3.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +157 -0
- package/README.md +29 -16
- package/dist/authority-surface.json +274 -148
- package/dist/build-identity.json +2 -2
- package/dist/cli/authority.d.ts +145 -33
- package/dist/cli/authority.js +1292 -315
- package/dist/cli/authority.js.map +1 -1
- package/dist/cli/cloud.js +12 -3
- package/dist/cli/cloud.js.map +1 -1
- package/dist/cli/comms.d.ts +33 -19
- package/dist/cli/comms.js +128 -151
- package/dist/cli/comms.js.map +1 -1
- package/dist/cli/completions.js +1 -1
- package/dist/cli/completions.js.map +1 -1
- package/dist/cli/daemon.js +29 -0
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/director.d.ts +8 -12
- package/dist/cli/director.js +17 -52
- package/dist/cli/director.js.map +1 -1
- package/dist/cli/fleet.js +4 -1
- package/dist/cli/fleet.js.map +1 -1
- package/dist/cli/help.js +1 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/leader.d.ts +27 -3
- package/dist/cli/leader.js +253 -4
- package/dist/cli/leader.js.map +1 -1
- package/dist/core/authority/protected-paths.js +11 -0
- package/dist/core/authority/protected-paths.js.map +1 -1
- package/dist/core/authority/resident.d.ts +101 -0
- package/dist/core/authority/resident.js +246 -0
- package/dist/core/authority/resident.js.map +1 -0
- package/dist/core/authority/server-enforcement.d.ts +110 -0
- package/dist/core/authority/server-enforcement.js +260 -0
- package/dist/core/authority/server-enforcement.js.map +1 -0
- package/dist/core/authority/standing-grant.d.ts +24 -4
- package/dist/core/authority/standing-grant.js +19 -3
- package/dist/core/authority/standing-grant.js.map +1 -1
- package/dist/core/authority/types.d.ts +43 -0
- package/dist/core/authority/types.js +6 -0
- package/dist/core/authority/types.js.map +1 -1
- package/dist/core/cloud/budget.js +11 -1
- package/dist/core/cloud/budget.js.map +1 -1
- package/dist/core/cloud/cloud-api.d.ts +25 -2
- package/dist/core/cloud/cloud-api.js +139 -5
- package/dist/core/cloud/cloud-api.js.map +1 -1
- package/dist/core/cloud/pr-actions.d.ts +93 -0
- package/dist/core/cloud/pr-actions.js +436 -0
- package/dist/core/cloud/pr-actions.js.map +1 -0
- package/dist/core/cloud/pr-preview.d.ts +128 -0
- package/dist/core/cloud/pr-preview.js +228 -0
- package/dist/core/cloud/pr-preview.js.map +1 -0
- package/dist/core/cloud/store.d.ts +2 -0
- package/dist/core/cloud/store.js +28 -0
- package/dist/core/cloud/store.js.map +1 -1
- package/dist/core/cloud/timeline-api.d.ts +24 -0
- package/dist/core/cloud/timeline-api.js +46 -0
- package/dist/core/cloud/timeline-api.js.map +1 -0
- package/dist/core/cloud/timeline-types.d.ts +62 -0
- package/dist/core/cloud/timeline-types.js +36 -0
- package/dist/core/cloud/timeline-types.js.map +1 -0
- package/dist/core/cloud/timeline.d.ts +102 -0
- package/dist/core/cloud/timeline.js +925 -0
- package/dist/core/cloud/timeline.js.map +1 -0
- package/dist/core/cloud/tracker.js +67 -0
- package/dist/core/cloud/tracker.js.map +1 -1
- package/dist/core/cloud/types.d.ts +38 -0
- package/dist/core/cloud/types.js +1 -1
- package/dist/core/cloud/types.js.map +1 -1
- package/dist/core/comms/change-digest.d.ts +130 -0
- package/dist/core/comms/change-digest.js +451 -0
- package/dist/core/comms/change-digest.js.map +1 -0
- package/dist/core/comms/director-prompt.d.ts +4 -5
- package/dist/core/comms/director-prompt.js +4 -71
- package/dist/core/comms/director-prompt.js.map +1 -1
- package/dist/core/comms/director.d.ts +24 -61
- package/dist/core/comms/director.js +29 -382
- package/dist/core/comms/director.js.map +1 -1
- package/dist/core/comms/dispatch.d.ts +37 -12
- package/dist/core/comms/dispatch.js +244 -177
- package/dist/core/comms/dispatch.js.map +1 -1
- package/dist/core/comms/elon-dialogue.d.ts +23 -15
- package/dist/core/comms/elon-dialogue.js +36 -307
- package/dist/core/comms/elon-dialogue.js.map +1 -1
- package/dist/core/comms/fleet-pulse.js +4 -7
- package/dist/core/comms/fleet-pulse.js.map +1 -1
- package/dist/core/comms/handlers.d.ts +10 -6
- package/dist/core/comms/handlers.js +14 -48
- package/dist/core/comms/handlers.js.map +1 -1
- package/dist/core/comms/migrations.d.ts +47 -0
- package/dist/core/comms/migrations.js +125 -0
- package/dist/core/comms/migrations.js.map +1 -0
- package/dist/core/comms/requests.d.ts +32 -5
- package/dist/core/comms/requests.js +101 -5
- package/dist/core/comms/requests.js.map +1 -1
- package/dist/core/comms/telegram-channel.d.ts +104 -0
- package/dist/core/comms/telegram-channel.js +622 -0
- package/dist/core/comms/telegram-channel.js.map +1 -0
- package/dist/core/comms/telegram-thread-map.d.ts +56 -0
- package/dist/core/comms/telegram-thread-map.js +144 -0
- package/dist/core/comms/telegram-thread-map.js.map +1 -0
- package/dist/core/daemon/capacity-publisher.d.ts +8 -1
- package/dist/core/daemon/capacity-publisher.js +40 -2
- package/dist/core/daemon/capacity-publisher.js.map +1 -1
- package/dist/core/daemon/loop.js +18 -4
- package/dist/core/daemon/loop.js.map +1 -1
- package/dist/core/daemon/service-install-authority.d.ts +10 -2
- package/dist/core/daemon/service-install-authority.js +14 -5
- package/dist/core/daemon/service-install-authority.js.map +1 -1
- package/dist/core/daemon/service.d.ts +15 -0
- package/dist/core/daemon/service.js +26 -0
- package/dist/core/daemon/service.js.map +1 -1
- package/dist/core/daemon/tick-deadline.d.ts +44 -0
- package/dist/core/daemon/tick-deadline.js +83 -0
- package/dist/core/daemon/tick-deadline.js.map +1 -0
- package/dist/core/daemon/tick-hooks.d.ts +7 -0
- package/dist/core/daemon/tick-hooks.js.map +1 -1
- package/dist/core/daemon/tick-progress.d.ts +39 -0
- package/dist/core/daemon/tick-progress.js +194 -0
- package/dist/core/daemon/tick-progress.js.map +1 -0
- package/dist/core/dashboard.js +3 -1
- package/dist/core/dashboard.js.map +1 -1
- package/dist/core/fleet/cloud-intake.d.ts +95 -0
- package/dist/core/fleet/cloud-intake.js +557 -0
- package/dist/core/fleet/cloud-intake.js.map +1 -0
- package/dist/core/fleet/dispatch-router.d.ts +13 -0
- package/dist/core/fleet/dispatch-router.js +32 -8
- package/dist/core/fleet/dispatch-router.js.map +1 -1
- package/dist/core/fleet/fleet-merge-state.d.ts +16 -0
- package/dist/core/fleet/fleet-merge-state.js.map +1 -1
- package/dist/core/fleet/host-merge.d.ts +14 -0
- package/dist/core/fleet/host-merge.js +24 -2
- package/dist/core/fleet/host-merge.js.map +1 -1
- package/dist/core/fleet/merge-gates.d.ts +21 -0
- package/dist/core/fleet/merge-gates.js +39 -5
- package/dist/core/fleet/merge-gates.js.map +1 -1
- package/dist/core/fleet/mirrors.d.ts +162 -6
- package/dist/core/fleet/mirrors.js +1051 -49
- package/dist/core/fleet/mirrors.js.map +1 -1
- package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
- package/dist/core/fleet/standing-merge-pass.js +102 -1
- package/dist/core/fleet/standing-merge-pass.js.map +1 -1
- package/dist/core/fleet/status.d.ts +17 -0
- package/dist/core/fleet/status.js +22 -0
- package/dist/core/fleet/status.js.map +1 -1
- package/dist/core/fleet/tick-hooks-live.d.ts +10 -1
- package/dist/core/fleet/tick-hooks-live.js +57 -8
- package/dist/core/fleet/tick-hooks-live.js.map +1 -1
- package/dist/core/fleet/verify-check-run.d.ts +90 -0
- package/dist/core/fleet/verify-check-run.js +274 -0
- package/dist/core/fleet/verify-check-run.js.map +1 -0
- package/dist/core/git.d.ts +17 -0
- package/dist/core/git.js +124 -25
- package/dist/core/git.js.map +1 -1
- package/dist/core/goals/open-goals.d.ts +47 -0
- package/dist/core/goals/open-goals.js +33 -0
- package/dist/core/goals/open-goals.js.map +1 -0
- package/dist/core/inbox/merge.d.ts +5 -0
- package/dist/core/inbox/merge.js +58 -2
- package/dist/core/inbox/merge.js.map +1 -1
- package/dist/core/integrations/locus.d.ts +28 -0
- package/dist/core/integrations/locus.js +155 -30
- package/dist/core/integrations/locus.js.map +1 -1
- package/dist/core/integrations/telegram-format.d.ts +40 -0
- package/dist/core/integrations/telegram-format.js +123 -0
- package/dist/core/integrations/telegram-format.js.map +1 -0
- package/dist/core/integrations/telegram.d.ts +60 -4
- package/dist/core/integrations/telegram.js +161 -28
- package/dist/core/integrations/telegram.js.map +1 -1
- package/dist/core/mcp-registry.d.ts +12 -0
- package/dist/core/mcp-registry.js +70 -0
- package/dist/core/mcp-registry.js.map +1 -1
- package/dist/core/observability/rollup.d.ts +12 -10
- package/dist/core/observability/rollup.js +44 -17
- package/dist/core/observability/rollup.js.map +1 -1
- package/dist/core/resources/connection-monitor.d.ts +9 -0
- package/dist/core/resources/connection-monitor.js +19 -9
- package/dist/core/resources/connection-monitor.js.map +1 -1
- package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
- package/dist/core/resources/quota-refresh-lease.js +34 -1
- package/dist/core/resources/quota-refresh-lease.js.map +1 -1
- package/dist/core/routing/budget-api.d.ts +18 -1
- package/dist/core/routing/budget-api.js +120 -10
- package/dist/core/routing/budget-api.js.map +1 -1
- package/dist/core/routing/budget-store.d.ts +22 -1
- package/dist/core/routing/budget-store.js +22 -8
- package/dist/core/routing/budget-store.js.map +1 -1
- package/dist/core/routing/readiness-types.d.ts +82 -0
- package/dist/core/routing/readiness-types.js +23 -0
- package/dist/core/routing/readiness-types.js.map +1 -0
- package/dist/core/routing/readiness.d.ts +103 -0
- package/dist/core/routing/readiness.js +480 -0
- package/dist/core/routing/readiness.js.map +1 -0
- package/dist/core/sandbox/confine.js +22 -1
- package/dist/core/sandbox/confine.js.map +1 -1
- package/dist/core/sandbox/policy.d.ts +23 -0
- package/dist/core/sandbox/policy.js +100 -0
- package/dist/core/sandbox/policy.js.map +1 -1
- package/dist/core/types.d.ts +13 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
- package/dist/core/usage/frontier-usage.d.ts +20 -2
- package/dist/core/usage/frontier-usage.js +75 -17
- package/dist/core/usage/frontier-usage.js.map +1 -1
- package/dist/core/verse/account-health.js +9 -3
- package/dist/core/verse/account-health.js.map +1 -1
- package/dist/core/verse/accounts.d.ts +45 -0
- package/dist/core/verse/accounts.js +246 -17
- package/dist/core/verse/accounts.js.map +1 -1
- package/dist/core/verse/activity-api.d.ts +5 -1
- package/dist/core/verse/activity-api.js +62 -14
- package/dist/core/verse/activity-api.js.map +1 -1
- package/dist/core/verse/apps-api.js +23 -11
- package/dist/core/verse/apps-api.js.map +1 -1
- package/dist/core/verse/apps.d.ts +11 -9
- package/dist/core/verse/apps.js +2 -2
- package/dist/core/verse/apps.js.map +1 -1
- package/dist/core/verse/authority-api.d.ts +17 -3
- package/dist/core/verse/authority-api.js +122 -7
- package/dist/core/verse/authority-api.js.map +1 -1
- package/dist/core/verse/autonomy-ladder.d.ts +172 -0
- package/dist/core/verse/autonomy-ladder.js +251 -0
- package/dist/core/verse/autonomy-ladder.js.map +1 -0
- package/dist/core/verse/context-fit.js +7 -5
- package/dist/core/verse/context-fit.js.map +1 -1
- package/dist/core/verse/control-api.d.ts +23 -1
- package/dist/core/verse/control-api.js +117 -10
- package/dist/core/verse/control-api.js.map +1 -1
- package/dist/core/verse/fleet-live-api.js +13 -5
- package/dist/core/verse/fleet-live-api.js.map +1 -1
- package/dist/core/verse/folder-io.d.ts +50 -0
- package/dist/core/verse/folder-io.js +142 -0
- package/dist/core/verse/folder-io.js.map +1 -0
- package/dist/core/verse/git-api.js +5 -4
- package/dist/core/verse/git-api.js.map +1 -1
- package/dist/core/verse/git-ops.d.ts +10 -1
- package/dist/core/verse/git-ops.js +18 -2
- package/dist/core/verse/git-ops.js.map +1 -1
- package/dist/core/verse/github-api.d.ts +1 -1
- package/dist/core/verse/github-api.js +5 -4
- package/dist/core/verse/github-api.js.map +1 -1
- package/dist/core/verse/github-repo.js +118 -14
- package/dist/core/verse/github-repo.js.map +1 -1
- package/dist/core/verse/leader-api.d.ts +5 -4
- package/dist/core/verse/leader-api.js +237 -10
- package/dist/core/verse/leader-api.js.map +1 -1
- package/dist/core/verse/local-models.d.ts +10 -0
- package/dist/core/verse/local-models.js +10 -1
- package/dist/core/verse/local-models.js.map +1 -1
- package/dist/core/verse/login-path.d.ts +73 -0
- package/dist/core/verse/login-path.js +123 -14
- package/dist/core/verse/login-path.js.map +1 -1
- package/dist/core/verse/mcp-control-api.js +4 -4
- package/dist/core/verse/mcp-control-api.js.map +1 -1
- package/dist/core/verse/mcp-scope.d.ts +22 -0
- package/dist/core/verse/mcp-scope.js +41 -1
- package/dist/core/verse/mcp-scope.js.map +1 -1
- package/dist/core/verse/mcp-seat-view.d.ts +10 -0
- package/dist/core/verse/mcp-seat-view.js +30 -4
- package/dist/core/verse/mcp-seat-view.js.map +1 -1
- package/dist/core/verse/overnight-api.js +20 -2
- package/dist/core/verse/overnight-api.js.map +1 -1
- package/dist/core/verse/path-guard.d.ts +24 -0
- package/dist/core/verse/path-guard.js +91 -22
- package/dist/core/verse/path-guard.js.map +1 -1
- package/dist/core/verse/preview-api.js +22 -0
- package/dist/core/verse/preview-api.js.map +1 -1
- package/dist/core/verse/projects.d.ts +21 -0
- package/dist/core/verse/projects.js +82 -0
- package/dist/core/verse/projects.js.map +1 -1
- package/dist/core/verse/seat-readiness.d.ts +25 -0
- package/dist/core/verse/seat-readiness.js +43 -6
- package/dist/core/verse/seat-readiness.js.map +1 -1
- package/dist/core/verse/session-controls-api.js +5 -3
- package/dist/core/verse/session-controls-api.js.map +1 -1
- package/dist/core/verse/session-handoff.d.ts +26 -0
- package/dist/core/verse/session-handoff.js +90 -12
- package/dist/core/verse/session-handoff.js.map +1 -1
- package/dist/core/verse/terminal-api.js +7 -4
- package/dist/core/verse/terminal-api.js.map +1 -1
- package/dist/core/verse/terminal.js +9 -5
- package/dist/core/verse/terminal.js.map +1 -1
- package/dist/core/verse/verse-api.d.ts +3 -1
- package/dist/core/verse/verse-api.js +87 -27
- package/dist/core/verse/verse-api.js.map +1 -1
- package/dist/core/verse/workspaces.d.ts +51 -0
- package/dist/core/verse/workspaces.js +177 -47
- package/dist/core/verse/workspaces.js.map +1 -1
- package/dist/core/vision/leader-apply.d.ts +40 -0
- package/dist/core/vision/leader-apply.js +101 -30
- package/dist/core/vision/leader-apply.js.map +1 -1
- package/dist/core/vision/leader-cadence.d.ts +114 -0
- package/dist/core/vision/leader-cadence.js +127 -0
- package/dist/core/vision/leader-cadence.js.map +1 -0
- package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
- package/dist/core/vision/leader-goal-evidence.js +36 -0
- package/dist/core/vision/leader-goal-evidence.js.map +1 -0
- package/dist/core/vision/leader-health.d.ts +53 -0
- package/dist/core/vision/leader-health.js +92 -0
- package/dist/core/vision/leader-health.js.map +1 -0
- package/dist/core/vision/leader-operator.d.ts +176 -0
- package/dist/core/vision/leader-operator.js +355 -0
- package/dist/core/vision/leader-operator.js.map +1 -0
- package/dist/core/vision/leader-run-chain.d.ts +41 -0
- package/dist/core/vision/leader-run-chain.js +54 -0
- package/dist/core/vision/leader-run-chain.js.map +1 -0
- package/dist/core/vision/leader-seat-plan.d.ts +68 -0
- package/dist/core/vision/leader-seat-plan.js +93 -0
- package/dist/core/vision/leader-seat-plan.js.map +1 -0
- package/dist/core/vision/leader-seat.d.ts +71 -5
- package/dist/core/vision/leader-seat.js +235 -33
- package/dist/core/vision/leader-seat.js.map +1 -1
- package/dist/core/vision/leader-thread-types.d.ts +104 -0
- package/dist/core/vision/leader-thread-types.js +9 -0
- package/dist/core/vision/leader-thread-types.js.map +1 -0
- package/dist/core/vision/leader-thread.d.ts +138 -0
- package/dist/core/vision/leader-thread.js +926 -0
- package/dist/core/vision/leader-thread.js.map +1 -0
- package/dist/core/vision/leader-types.d.ts +75 -1
- package/dist/core/vision/leader.d.ts +88 -18
- package/dist/core/vision/leader.js +269 -69
- package/dist/core/vision/leader.js.map +1 -1
- package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js → ActionMenu-CIiX2X8w.js} +2 -2
- package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
- package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
- package/dist/core/web/public/next/assets/{Advanced-B-LqYXvd.js.map → Advanced-DHsysoIL.js.map} +1 -1
- package/dist/core/web/public/next/assets/App-CMeAocmW.js +7 -0
- package/dist/core/web/public/next/assets/{App-E2zCDRxm.js.map → App-CMeAocmW.js.map} +1 -1
- package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
- package/dist/core/web/public/next/assets/{AppsSection-8wXPPhZb.js.map → AppsSection-DISYnMnc.js.map} +1 -1
- package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js +3 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-CmSSTHVe.css +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
- package/dist/core/web/public/next/assets/{AutonomySection-B46igJKR.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
- package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js → BranchBar-BxhdiIpx.js} +2 -2
- package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
- package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js.map +1 -0
- package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js → Button-D90dzI_o.js} +2 -2
- package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js.map → Button-D90dzI_o.js.map} +1 -1
- package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js → CapacityStrip-qKDBC65C.js} +2 -2
- package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
- package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
- package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
- package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js.map +1 -0
- package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
- package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
- package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
- package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
- package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
- package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
- package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js → DeleteChatDialog-BCfP12GH.js} +2 -2
- package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js → Dialog-D3msQlCj.js} +2 -2
- package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js.map → Dialog-D3msQlCj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js → DiffPane-Ix6hvXlY.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js → DiffViewer-C4WKsCIe.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
- package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
- package/dist/core/web/public/next/assets/{DockHost-DW9q0NdR.js.map → DockHost-aWP7liri.js.map} +1 -1
- package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js → EmptyState-D2IRy3Cg.js} +2 -2
- package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js → Epistemic-DMr18muX.js} +2 -2
- package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js.map → Epistemic-DMr18muX.js.map} +1 -1
- package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js +2 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js.map +1 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-PBDAiSuG.css +1 -0
- package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
- package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
- package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js → GearTray-Dt-ee32-.js} +2 -2
- package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js.map → GearTray-Dt-ee32-.js.map} +1 -1
- package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
- package/dist/core/web/public/next/assets/{GrowthSection-iiQg6wvK.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
- package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js → HandoffDialog-CLJQLe7M.js} +2 -2
- package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js → Input-D_KRJA9V.js} +2 -2
- package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js.map → Input-D_KRJA9V.js.map} +1 -1
- package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
- package/dist/core/web/public/next/assets/{McpSection-BRuCcTjT.js.map → McpSection-DGbRcyv8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js → MessageMarkdown-DFvk06qG.js} +3 -3
- package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js → Meter-CMj-VafN.js} +2 -2
- package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js.map → Meter-CMj-VafN.js.map} +1 -1
- package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
- package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
- package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
- package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CCsijdWt.js +2 -0
- package/dist/core/web/public/next/assets/{NeedsYouList-BgH8ezqf.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
- package/dist/core/web/public/next/assets/NeedsYouList-CH6Mq-E_.css +1 -0
- package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
- package/dist/core/web/public/next/assets/{NewChatDialog-Db5Xjrk8.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
- package/dist/core/web/public/next/assets/{OnboardingGate-C4VXn7BJ.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
- package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
- package/dist/core/web/public/next/assets/{PreviewPane-BPBbcROb.js.map → PreviewPane-COid5A0f.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js → ProviderLogo-Cq-CYIwT.js} +2 -2
- package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js → RailStatus-Co5UB6We.js} +2 -2
- package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js.map → RailStatus-Co5UB6We.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js → RefreshIndicator-DO9ibnSq.js} +2 -2
- package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BX2nkdmZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
- package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js → SeatSelector-J5R3zDkB.js} +3 -3
- package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Segmented-CametjLt.js → Segmented-CGh_-tBb.js} +2 -2
- package/dist/core/web/public/next/assets/{Segmented-CametjLt.js.map → Segmented-CGh_-tBb.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Select-De52fghU.js → Select-CWnmUzs3.js} +2 -2
- package/dist/core/web/public/next/assets/{Select-De52fghU.js.map → Select-CWnmUzs3.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js → SessionGate-sp4KsnUo.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js → SessionInsightChip-DLFAzdbi.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js → SessionSearch-DbFjwR1h.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SettingsSection-mI9wQYZg.js → SettingsSection-Ch23msJ5.js} +2 -2
- package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
- package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js +2 -0
- package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js.map +1 -0
- package/dist/core/web/public/next/assets/SetupChecklist-BhZpFLsj.css +1 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
- package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js → Sheet-BZ2AG4Eo.js} +2 -2
- package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
- package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js.map +1 -0
- package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js → Slider-KVoJLDD6.js} +2 -2
- package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js.map → Slider-KVoJLDD6.js.map} +1 -1
- package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
- package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
- package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js → StatusBadge-CXsYqmdU.js} +2 -2
- package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
- package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
- package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js → Surface-BfDmQcKe.js} +2 -2
- package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js.map → Surface-BfDmQcKe.js.map} +1 -1
- package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
- package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
- package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js → Switch-9NtO_6Lj.js} +2 -2
- package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js.map → Switch-9NtO_6Lj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js → Tag-DscCRFcN.js} +2 -2
- package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js.map → Tag-DscCRFcN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js → TerminalPane-B668-DJW.js} +5 -5
- package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js.map → TerminalPane-B668-DJW.js.map} +1 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-DtXFhAhw.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js → UniverseView-DG70zH0W.js} +4 -4
- package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js.map → UniverseView-DG70zH0W.js.map} +1 -1
- package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
- package/dist/core/web/public/next/assets/{Workspace-BQSZFSeO.js.map → Workspace-D1nP9BhD.js.map} +1 -1
- package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
- package/dist/core/web/public/next/assets/{actions-Ci6I4C0l.js.map → actions-CY-PjpGc.js.map} +1 -1
- package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
- package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js → apps-model-Du02KhAf.js} +2 -2
- package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js.map → apps-model-Du02KhAf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js → authority-model-79SeuKlJ.js} +2 -2
- package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js.map → authority-model-79SeuKlJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
- package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
- package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
- package/dist/core/web/public/next/assets/{budget-queries-DsAjH8ac.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
- package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
- package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
- package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
- package/dist/core/web/public/next/assets/cloud-model-BDivRMqv.js +2 -0
- package/dist/core/web/public/next/assets/{cloud-model-CX407gPY.js.map → cloud-model-BDivRMqv.js.map} +1 -1
- package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js → cloud-queries-BPQQ5_pJ.js} +2 -2
- package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
- package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{command-catalog-CF0cQQac.js → command-catalog-BIntSa9l.js} +2 -2
- package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
- package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js → context-model-Br8t9jgG.js} +2 -2
- package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js.map → context-model-Br8t9jgG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js → context-model-CokrgEUq.js} +3 -3
- package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js.map → context-model-CokrgEUq.js.map} +1 -1
- package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
- package/dist/core/web/public/next/assets/{context-queries-CktFQqSS.js.map → context-queries-eL3caKVG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js → control-queries-B9K-wmcB.js} +2 -2
- package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js.map → control-queries-B9K-wmcB.js.map} +1 -1
- package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js +2 -0
- package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js.map +1 -0
- package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js → dock-icons-BJ6ZqB2t.js} +2 -2
- package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js → fleet-model-BvDR3gjp.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js → fleet-queries-W2UFVMZJ.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js → focus-trap-CtI1SlMX.js} +2 -2
- package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
- package/dist/core/web/public/next/assets/format-CH4g_sl1.js +2 -0
- package/dist/core/web/public/next/assets/format-CH4g_sl1.js.map +1 -0
- package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
- package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js → git-model-Dnkd1TnK.js} +2 -2
- package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js.map → git-model-Dnkd1TnK.js.map} +1 -1
- package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
- package/dist/core/web/public/next/assets/{global-CNNGMril.js.map → global-CMNW_dqn.js.map} +1 -1
- package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
- package/dist/core/web/public/next/assets/{guarded-runners-DPh2d32e.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{icons-0haWy6nh.js → icons-D1sYbCTQ.js} +2 -2
- package/dist/core/web/public/next/assets/{icons-0haWy6nh.js.map → icons-D1sYbCTQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{index-QesfXBsb.js → index-DZ-UQ7v8.js} +3 -3
- package/dist/core/web/public/next/assets/{index-QesfXBsb.js.map → index-DZ-UQ7v8.js.map} +1 -1
- package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
- package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
- package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
- package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
- package/dist/core/web/public/next/assets/{live-model-De-q0ZFK.js → live-model-D_32RAOR.js} +2 -2
- package/dist/core/web/public/next/assets/live-model-D_32RAOR.js.map +1 -0
- package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js → mind.module-7hA92hRg.js} +2 -2
- package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js.map → mind.module-7hA92hRg.js.map} +1 -1
- package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
- package/dist/core/web/public/next/assets/{mutations-DTCtKCn_.js.map → mutations-DQPbFdRJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js → nav-0dOYe2rJ.js} +2 -2
- package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js.map → nav-0dOYe2rJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js → overnight-queries-C4wOnFtE.js} +2 -2
- package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
- package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
- package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js → queries-BTXWdZzU.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js.map → queries-BTXWdZzU.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js → reasoning-pref-Ca6lN6x_.js} +2 -2
- package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js → reveal-anchor-DfNLgK_I.js} +2 -2
- package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
- package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
- package/dist/core/web/public/next/assets/{seat-subscription-C5Tvr0WQ.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js → sidebar-model-CLCdqwkR.js} +2 -2
- package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
- package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js → slots-C-qBeu-8.js} +3 -3
- package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js.map → slots-C-qBeu-8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js → surface-data-Dj71tdD-.js} +2 -2
- package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js.map → surface-data-Dj71tdD-.js.map} +1 -1
- package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
- package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js → tasks-model-O8yR5YXp.js} +2 -2
- package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js → terminal-icons-CoRZq9iO.js} +2 -2
- package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
- package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
- package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
- package/dist/core/web/public/next/assets/types-IYKrYLku.js +2 -0
- package/dist/core/web/public/next/assets/types-IYKrYLku.js.map +1 -0
- package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js → usage-queries-AdjEyEtn.js} +2 -2
- package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js → use-guarded-action-CuuMHeDX.js} +2 -2
- package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js → use-ticker-BBcp02SZ.js} +2 -2
- package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js → use-token-gate-CbXVYQYI.js} +2 -2
- package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js → useOnboarding-C_Fpe_sH.js} +2 -2
- package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
- package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js → useVerseTranscript-DgbigUlV.js} +2 -2
- package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
- package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js → verse-icons-S56hIiXS.js} +2 -2
- package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js.map → verse-icons-S56hIiXS.js.map} +1 -1
- package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
- package/dist/core/web/public/next/assets/{verse-model-MMySehjj.js.map → verse-model-DAVevkNe.js.map} +1 -1
- package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js → warmup-B_RAtNZ_.js} +3 -3
- package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js.map → warmup-B_RAtNZ_.js.map} +1 -1
- package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js +2 -0
- package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js.map +1 -0
- package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js → workspace-model-dji5-Al3.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js.map → workspace-model-dji5-Al3.js.map} +1 -1
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/core/web/read-projection-worker.js +2 -1
- package/dist/core/web/read-projection-worker.js.map +1 -1
- package/dist/core/web/read-projections.d.ts +3 -0
- package/dist/core/web/read-projections.js +2 -2
- package/dist/core/web/read-projections.js.map +1 -1
- package/dist/core/web/visibility.js +3 -4
- package/dist/core/web/visibility.js.map +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/docs/AUTONOMY-GAP.md +1 -1
- package/package.json +3 -2
- package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js +0 -2
- package/dist/core/web/public/next/assets/App-E2zCDRxm.js +0 -7
- package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-B46igJKR.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js.map +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js +0 -2
- package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
- package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js +0 -2
- package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js.map +0 -1
- package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js +0 -2
- package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js +0 -3
- package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-iiQg6wvK.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-BRuCcTjT.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouList-BgH8ezqf.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js +0 -2
- package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js +0 -3
- package/dist/core/web/public/next/assets/PreviewPane-BPBbcROb.js +0 -2
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BX2nkdmZ.js +0 -7
- package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js +0 -2
- package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js.map +0 -1
- package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
- package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-DtXFhAhw.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js +0 -10
- package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
- package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js +0 -2
- package/dist/core/web/public/next/assets/budget-queries-DsAjH8ac.js +0 -2
- package/dist/core/web/public/next/assets/charts-C_xJbJiw.js +0 -2
- package/dist/core/web/public/next/assets/charts-C_xJbJiw.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
- package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-CktFQqSS.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js.map +0 -1
- package/dist/core/web/public/next/assets/format-Dk4Fmxax.js +0 -2
- package/dist/core/web/public/next/assets/format-Dk4Fmxax.js.map +0 -1
- package/dist/core/web/public/next/assets/global-CNNGMril.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-DPh2d32e.js +0 -2
- package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-DTCtKCn_.js +0 -2
- package/dist/core/web/public/next/assets/primitives-D0Fb3TtS.js +0 -1
- package/dist/core/web/public/next/assets/seat-subscription-C5Tvr0WQ.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js.map +0 -1
- package/dist/core/web/public/next/assets/types-D5XOdyw8.js +0 -2
- package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-model-MMySehjj.js +0 -2
- package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js +0 -2
- package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js.map +0 -1
|
@@ -0,0 +1,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":"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"}
|
package/dist/core/git.d.ts
CHANGED
|
@@ -14,11 +14,19 @@ import type { GitStatus } from './types.js';
|
|
|
14
14
|
* where `.git` is a plain file containing a `gitdir:` pointer.
|
|
15
15
|
*/
|
|
16
16
|
export declare function isRepo(dir: string): boolean;
|
|
17
|
+
/** {@link isRepo} with the stat off the event loop. Never rejects. */
|
|
18
|
+
export declare function isRepoAsync(dir: string): Promise<boolean>;
|
|
17
19
|
/**
|
|
18
20
|
* Returns a GitStatus snapshot for the repo at `repoPath`, or null when the
|
|
19
21
|
* path is not a repo or git is unavailable.
|
|
20
22
|
*/
|
|
21
23
|
export declare function getGitStatus(repoPath: string): GitStatus | null;
|
|
24
|
+
/**
|
|
25
|
+
* {@link getGitStatus} without blocking the event loop (see `gitAsync`): the
|
|
26
|
+
* same four git commands and the same answer. After the branch read succeeds
|
|
27
|
+
* the other three run concurrently; they are independent reads. Never rejects.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getGitStatusAsync(repoPath: string, signal?: AbortSignal): Promise<GitStatus | null>;
|
|
22
30
|
/**
|
|
23
31
|
* Resolve the repository's default branch name (the integration target for an
|
|
24
32
|
* auto-merge). Resolution order:
|
|
@@ -32,6 +40,8 @@ export declare function getGitStatus(repoPath: string): GitStatus | null;
|
|
|
32
40
|
* through to 'main'.
|
|
33
41
|
*/
|
|
34
42
|
export declare function defaultBranch(repoPath: string): string;
|
|
43
|
+
/** {@link defaultBranch} without blocking the event loop (see `gitAsync`): same commands, same answer. Never rejects. */
|
|
44
|
+
export declare function defaultBranchAsync(repoPath: string, signal?: AbortSignal): Promise<string>;
|
|
35
45
|
/**
|
|
36
46
|
* Resolve the sole GitHub owner/repo authorized by every `origin` fetch and
|
|
37
47
|
* effective push URL. Git applies fetch URLs as push destinations when no
|
|
@@ -50,6 +60,13 @@ export interface GitHubOriginAuthority {
|
|
|
50
60
|
}
|
|
51
61
|
/** Resolve the canonical identity and one exact effective push transport. */
|
|
52
62
|
export declare function resolveGitHubOriginAuthorityDetails(repoPath: string): GitHubOriginAuthority | null;
|
|
63
|
+
/**
|
|
64
|
+
* {@link resolveGitHubOriginAuthority} without blocking the event loop (see
|
|
65
|
+
* `gitAsync`): the same three git commands and the same fail-closed answer.
|
|
66
|
+
* The two URL reads run concurrently once the rewrite-rule check has passed.
|
|
67
|
+
* Never rejects.
|
|
68
|
+
*/
|
|
69
|
+
export declare function resolveGitHubOriginAuthorityAsync(repoPath: string, signal?: AbortSignal): Promise<string | null>;
|
|
53
70
|
/**
|
|
54
71
|
* Parses the `origin` remote URL of the repo at `repoPath` and extracts the
|
|
55
72
|
* GitHub org (or user) name. Returns `{ remote, org }` where either may be
|
package/dist/core/git.js
CHANGED
|
@@ -7,9 +7,10 @@
|
|
|
7
7
|
* - Every execFileSync call gets a tight timeout (5 s) and stdio:'pipe'
|
|
8
8
|
* so a hung git never blocks the indexer.
|
|
9
9
|
*/
|
|
10
|
-
import { execFileSync } from 'node:child_process';
|
|
10
|
+
import { execFile, execFileSync } from 'node:child_process';
|
|
11
11
|
import { existsSync, statSync } from 'node:fs';
|
|
12
|
-
import {
|
|
12
|
+
import { stat } from 'node:fs/promises';
|
|
13
|
+
import { join, resolve as resolvePath } from 'node:path';
|
|
13
14
|
// ---------------------------------------------------------------------------
|
|
14
15
|
// Internal helpers
|
|
15
16
|
// ---------------------------------------------------------------------------
|
|
@@ -33,6 +34,36 @@ function git(cwd, args) {
|
|
|
33
34
|
return null;
|
|
34
35
|
}
|
|
35
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* `git()` without blocking the event loop: the same command, timeout and
|
|
39
|
+
* output rules (trimmed stdout; null on a non-zero exit, a timeout, a spawn
|
|
40
|
+
* failure or stdout over execFileSync's default 1 MiB), but the wait happens
|
|
41
|
+
* in libuv instead of on the calling thread.
|
|
42
|
+
*
|
|
43
|
+
* WHY. A server calling these helpers per request (the Verse sidecar's
|
|
44
|
+
* GET /api/verse/workspaces, up to seven git calls per root) must not freeze
|
|
45
|
+
* while git works in a folder macOS guards with a privacy prompt (~/Desktop,
|
|
46
|
+
* ~/Documents, removable volumes): execFileSync parks the whole process until
|
|
47
|
+
* the prompt is answered or the timeout fires, once per call.
|
|
48
|
+
*
|
|
49
|
+
* The repo is named with `git -C <dir>` and the child starts in `/`, NOT with
|
|
50
|
+
* `cwd: dir`: the spawn's chdir runs inside the parent's posix_spawn/fork
|
|
51
|
+
* call, so a cwd behind a pending prompt would park the calling thread in
|
|
52
|
+
* uv_spawn itself. `-C` moves that chdir into git, where waiting is harmless.
|
|
53
|
+
* `-C` is git's documented equivalent of starting in that directory. Stdin is
|
|
54
|
+
* closed at once, as execFileSync's is, so a command that would read it sees EOF.
|
|
55
|
+
*/
|
|
56
|
+
function gitAsync(cwd, args, signal) {
|
|
57
|
+
return new Promise((resolvePromise) => {
|
|
58
|
+
try {
|
|
59
|
+
const child = execFile('git', ['-C', resolvePath(cwd), ...args], { cwd: '/', timeout: GIT_TIMEOUT, encoding: 'utf8', maxBuffer: 1024 * 1024, ...(signal ? { signal } : {}) }, (error, stdout) => resolvePromise(error ? null : String(stdout).trim()));
|
|
60
|
+
child.stdin?.end();
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
resolvePromise(null);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
36
67
|
/** Normalize one supported GitHub transport URL to lowercase owner/repo. */
|
|
37
68
|
function canonicalGitHubDestination(remote) {
|
|
38
69
|
const match = remote.match(/^https:\/\/(?:[^/?#@]+@)?github\.com(?::443)?\/([^/?#]+)\/([^/?#]+)$/i) ??
|
|
@@ -70,6 +101,22 @@ export function isRepo(dir) {
|
|
|
70
101
|
const st = statSync(gitEntry, { throwIfNoEntry: false });
|
|
71
102
|
return st !== undefined; // exists as either file or dir
|
|
72
103
|
}
|
|
104
|
+
/** {@link isRepo} with the stat off the event loop. Never rejects. */
|
|
105
|
+
export async function isRepoAsync(dir) {
|
|
106
|
+
try {
|
|
107
|
+
await stat(join(dir, '.git'));
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// The commands getGitStatus runs, shared with getGitStatusAsync so both ask
|
|
115
|
+
// git exactly the same questions.
|
|
116
|
+
const STATUS_BRANCH_ARGS = ['rev-parse', '--abbrev-ref', 'HEAD'];
|
|
117
|
+
const STATUS_PORCELAIN_ARGS = ['status', '--porcelain'];
|
|
118
|
+
const STATUS_REV_COUNT_ARGS = ['rev-list', '--left-right', '--count', '@{u}...HEAD'];
|
|
119
|
+
const STATUS_LAST_COMMIT_ARGS = ['log', '-1', '--format=%cI'];
|
|
73
120
|
/**
|
|
74
121
|
* Returns a GitStatus snapshot for the repo at `repoPath`, or null when the
|
|
75
122
|
* path is not a repo or git is unavailable.
|
|
@@ -78,24 +125,39 @@ export function getGitStatus(repoPath) {
|
|
|
78
125
|
if (!isRepo(repoPath))
|
|
79
126
|
return null;
|
|
80
127
|
// --- branch ---
|
|
81
|
-
const branchRaw = git(repoPath, [
|
|
128
|
+
const branchRaw = git(repoPath, [...STATUS_BRANCH_ARGS]);
|
|
82
129
|
if (branchRaw === null)
|
|
83
130
|
return null; // git not available / not a real repo
|
|
131
|
+
return gitStatusFrom(branchRaw, git(repoPath, [...STATUS_PORCELAIN_ARGS]), git(repoPath, [...STATUS_REV_COUNT_ARGS]), git(repoPath, [...STATUS_LAST_COMMIT_ARGS]));
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* {@link getGitStatus} without blocking the event loop (see `gitAsync`): the
|
|
135
|
+
* same four git commands and the same answer. After the branch read succeeds
|
|
136
|
+
* the other three run concurrently; they are independent reads. Never rejects.
|
|
137
|
+
*/
|
|
138
|
+
export async function getGitStatusAsync(repoPath, signal) {
|
|
139
|
+
if (!(await isRepoAsync(repoPath)))
|
|
140
|
+
return null;
|
|
141
|
+
const branchRaw = await gitAsync(repoPath, STATUS_BRANCH_ARGS, signal);
|
|
142
|
+
if (branchRaw === null)
|
|
143
|
+
return null; // git not available / not a real repo
|
|
144
|
+
const [porcelain, revCount, lastCommit] = await Promise.all([
|
|
145
|
+
gitAsync(repoPath, STATUS_PORCELAIN_ARGS, signal),
|
|
146
|
+
gitAsync(repoPath, STATUS_REV_COUNT_ARGS, signal),
|
|
147
|
+
gitAsync(repoPath, STATUS_LAST_COMMIT_ARGS, signal),
|
|
148
|
+
]);
|
|
149
|
+
return gitStatusFrom(branchRaw, porcelain, revCount, lastCommit);
|
|
150
|
+
}
|
|
151
|
+
/** The GitStatus four git outputs describe (a null output: that command failed). */
|
|
152
|
+
function gitStatusFrom(branchRaw, porcelain, revCount, lastCommitRaw) {
|
|
84
153
|
const branch = branchRaw || 'HEAD'; // detached HEAD shows 'HEAD'
|
|
85
154
|
// --- dirty (number of changed lines in porcelain output) ---
|
|
86
|
-
const porcelain = git(repoPath, ['status', '--porcelain']);
|
|
87
155
|
const dirty = porcelain === null || porcelain === ''
|
|
88
156
|
? 0
|
|
89
157
|
: porcelain.split('\n').filter(Boolean).length;
|
|
90
158
|
// --- ahead / behind upstream ---
|
|
91
159
|
let ahead = 0;
|
|
92
160
|
let behind = 0;
|
|
93
|
-
const revCount = git(repoPath, [
|
|
94
|
-
'rev-list',
|
|
95
|
-
'--left-right',
|
|
96
|
-
'--count',
|
|
97
|
-
'@{u}...HEAD',
|
|
98
|
-
]);
|
|
99
161
|
if (revCount !== null) {
|
|
100
162
|
// Output is "<behind>\t<ahead>" (left=upstream, right=HEAD)
|
|
101
163
|
const parts = revCount.split(/\s+/);
|
|
@@ -106,7 +168,7 @@ export function getGitStatus(repoPath) {
|
|
|
106
168
|
}
|
|
107
169
|
// If no upstream is configured, revCount is null → ahead/behind stay 0.
|
|
108
170
|
// --- last commit ISO timestamp ---
|
|
109
|
-
const lastCommit =
|
|
171
|
+
const lastCommit = lastCommitRaw || null;
|
|
110
172
|
return { branch, dirty, ahead, behind, lastCommit };
|
|
111
173
|
}
|
|
112
174
|
/**
|
|
@@ -122,15 +184,28 @@ export function getGitStatus(repoPath) {
|
|
|
122
184
|
* through to 'main'.
|
|
123
185
|
*/
|
|
124
186
|
export function defaultBranch(repoPath) {
|
|
125
|
-
const
|
|
126
|
-
if (
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
187
|
+
const fromOrigin = originHeadBranch(git(repoPath, [...ORIGIN_HEAD_ARGS]));
|
|
188
|
+
if (fromOrigin)
|
|
189
|
+
return fromOrigin;
|
|
190
|
+
return currentBranchOrMain(git(repoPath, [...STATUS_BRANCH_ARGS]));
|
|
191
|
+
}
|
|
192
|
+
/** {@link defaultBranch} without blocking the event loop (see `gitAsync`): same commands, same answer. Never rejects. */
|
|
193
|
+
export async function defaultBranchAsync(repoPath, signal) {
|
|
194
|
+
const fromOrigin = originHeadBranch(await gitAsync(repoPath, ORIGIN_HEAD_ARGS, signal));
|
|
195
|
+
if (fromOrigin)
|
|
196
|
+
return fromOrigin;
|
|
197
|
+
return currentBranchOrMain(await gitAsync(repoPath, STATUS_BRANCH_ARGS, signal));
|
|
198
|
+
}
|
|
199
|
+
const ORIGIN_HEAD_ARGS = ['symbolic-ref', '--short', 'refs/remotes/origin/HEAD'];
|
|
200
|
+
/** e.g. "origin/main" → "main"; null when there is no usable origin/HEAD. */
|
|
201
|
+
function originHeadBranch(sym) {
|
|
202
|
+
if (!sym)
|
|
203
|
+
return null;
|
|
204
|
+
const slash = sym.indexOf('/');
|
|
205
|
+
const name = slash >= 0 ? sym.slice(slash + 1) : sym;
|
|
206
|
+
return name || null;
|
|
207
|
+
}
|
|
208
|
+
function currentBranchOrMain(cur) {
|
|
134
209
|
if (cur && cur !== 'HEAD')
|
|
135
210
|
return cur;
|
|
136
211
|
return 'main';
|
|
@@ -151,13 +226,37 @@ export function resolveGitHubOriginAuthority(repoPath) {
|
|
|
151
226
|
export function resolveGitHubOriginAuthorityDetails(repoPath) {
|
|
152
227
|
// A resolved URL can be rewritten again when fed back to another git command.
|
|
153
228
|
// Refuse every rewrite rule instead of trying to reason about chained config.
|
|
154
|
-
const rewriteRules = git(repoPath, [
|
|
155
|
-
|
|
156
|
-
|
|
229
|
+
const rewriteRules = git(repoPath, [...ORIGIN_REWRITE_RULE_ARGS]);
|
|
230
|
+
if (rewriteRules)
|
|
231
|
+
return null;
|
|
232
|
+
return originAuthorityFrom(git(repoPath, [...ORIGIN_FETCH_URL_ARGS]), git(repoPath, [...ORIGIN_PUSH_URL_ARGS]));
|
|
233
|
+
}
|
|
234
|
+
// The commands resolveGitHubOriginAuthorityDetails runs, shared with its async twin.
|
|
235
|
+
const ORIGIN_REWRITE_RULE_ARGS = [
|
|
236
|
+
'config', '--get-regexp', '^url\\..*\\.(insteadof|pushinsteadof)$',
|
|
237
|
+
];
|
|
238
|
+
const ORIGIN_FETCH_URL_ARGS = ['remote', 'get-url', '--all', 'origin'];
|
|
239
|
+
const ORIGIN_PUSH_URL_ARGS = ['remote', 'get-url', '--push', '--all', 'origin'];
|
|
240
|
+
/**
|
|
241
|
+
* {@link resolveGitHubOriginAuthority} without blocking the event loop (see
|
|
242
|
+
* `gitAsync`): the same three git commands and the same fail-closed answer.
|
|
243
|
+
* The two URL reads run concurrently once the rewrite-rule check has passed.
|
|
244
|
+
* Never rejects.
|
|
245
|
+
*/
|
|
246
|
+
export async function resolveGitHubOriginAuthorityAsync(repoPath, signal) {
|
|
247
|
+
const rewriteRules = await gitAsync(repoPath, ORIGIN_REWRITE_RULE_ARGS, signal);
|
|
157
248
|
if (rewriteRules)
|
|
158
249
|
return null;
|
|
159
|
-
const
|
|
160
|
-
|
|
250
|
+
const [fetchOut, pushOut] = await Promise.all([
|
|
251
|
+
gitAsync(repoPath, ORIGIN_FETCH_URL_ARGS, signal),
|
|
252
|
+
gitAsync(repoPath, ORIGIN_PUSH_URL_ARGS, signal),
|
|
253
|
+
]);
|
|
254
|
+
return originAuthorityFrom(fetchOut, pushOut)?.nameWithOwner ?? null;
|
|
255
|
+
}
|
|
256
|
+
/** The authority two `remote get-url --all` outputs describe, or null (fail closed). */
|
|
257
|
+
function originAuthorityFrom(fetchOut, pushOut) {
|
|
258
|
+
const fetchUrls = gitUrls(fetchOut);
|
|
259
|
+
const pushUrls = gitUrls(pushOut);
|
|
161
260
|
if (!fetchUrls || !pushUrls)
|
|
162
261
|
return null;
|
|
163
262
|
const destinations = new Set();
|
package/dist/core/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ONE definition of an "open" (active) goal, shared by the Leader's
|
|
3
|
+
* evidence, the Leader's `active-goals` metric, and the digest / dashboard
|
|
4
|
+
* "goals in flight" list.
|
|
5
|
+
*
|
|
6
|
+
* WHY THIS FILE EXISTS (3.14 Leader reliability). The Leader counted open
|
|
7
|
+
* goals from `listGoalsDetailed()` and replaced the WHOLE goals section with
|
|
8
|
+
* `null` whenever the read was incomplete — while the digest counted from
|
|
9
|
+
* `listGoals()`, which silently drops unreadable files. Three goal files had
|
|
10
|
+
* a 1970 `updatedAt` (earlier than `createdAt`, which the store's record
|
|
11
|
+
* guard rejects), so every read was "degraded": the digest reported 18–21
|
|
12
|
+
* active goals while the Leader's model saw `GOALS AND FOCUS: null` and wrote
|
|
13
|
+
* "the fleet has zero active goals". Now both sides count the same readable
|
|
14
|
+
* goals with the same status rule, and an incomplete read is reported as a
|
|
15
|
+
* LOWER BOUND with the unreadable-file count — never as nothing.
|
|
16
|
+
*
|
|
17
|
+
* Pure (no I/O): callers pass the result of a goal-store read.
|
|
18
|
+
*/
|
|
19
|
+
import type { Goal, GoalStatus } from '../types.js';
|
|
20
|
+
/**
|
|
21
|
+
* Statuses that occupy focus capacity. `planning` counts: a goal with no
|
|
22
|
+
* milestones yet is still open work the fleet has committed to.
|
|
23
|
+
*/
|
|
24
|
+
export declare const OPEN_GOAL_STATUSES: readonly GoalStatus[];
|
|
25
|
+
export declare function isOpenGoal(goal: Pick<Goal, 'status'>): boolean;
|
|
26
|
+
export interface GoalReadLike {
|
|
27
|
+
goals: readonly Goal[];
|
|
28
|
+
/** False when any goal file could not be read (or the listing was truncated). */
|
|
29
|
+
complete: boolean;
|
|
30
|
+
/** Goal files that could not be read; undefined = not reported by the source. */
|
|
31
|
+
unreadable?: number;
|
|
32
|
+
}
|
|
33
|
+
export interface OpenGoalsSummary {
|
|
34
|
+
/** Open goals among the READABLE ones — a lower bound when `complete` is false. */
|
|
35
|
+
open: number;
|
|
36
|
+
active: number;
|
|
37
|
+
planning: number;
|
|
38
|
+
paused: number;
|
|
39
|
+
/** Readable goals of every status. */
|
|
40
|
+
total: number;
|
|
41
|
+
complete: boolean;
|
|
42
|
+
/** Goal files the store could not read (0 when complete; null = unknown). */
|
|
43
|
+
unreadable: number | null;
|
|
44
|
+
/** The open goals themselves, in the source's order. */
|
|
45
|
+
openGoals: Goal[];
|
|
46
|
+
}
|
|
47
|
+
export declare function summarizeOpenGoals(read: GoalReadLike): OpenGoalsSummary;
|