@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
|
@@ -19,12 +19,18 @@
|
|
|
19
19
|
*
|
|
20
20
|
* SEAT: leader-seat.ts — grok first, then local; Claude only for the weekly
|
|
21
21
|
* deep run inside Mason's reserve; no seat ⇒ `no-seat`, never a cloud
|
|
22
|
-
* fallback.
|
|
22
|
+
* fallback. 3.14: a run walks a CHAIN of router-approved seats (grok → fast
|
|
23
|
+
* local → large local → opt-in Claude) with per-attempt timeouts, and the
|
|
24
|
+
* memo records every attempt (leader-seat.ts planLeaderSeats,
|
|
25
|
+
* leader-run-chain.ts).
|
|
23
26
|
*
|
|
24
27
|
* CADENCE: daily at 06:30 local, plus runs triggered by 10 fleet merges, any
|
|
25
28
|
* revert, a seat window resetting, or a high-severity reasoning insight —
|
|
26
|
-
* skipped when the evidence digest is unchanged, and at most 3 model
|
|
27
|
-
* per local day.
|
|
29
|
+
* skipped when the evidence digest is unchanged, and at most 3 full model
|
|
30
|
+
* runs per local day. 3.14 (leader-cadence.ts): a failed full run retries
|
|
31
|
+
* (bounded, backed off), and a cheap advisory check-in may run every
|
|
32
|
+
* `foundry.leader.checkinHours` (default 2) in working hours when the
|
|
33
|
+
* evidence changed materially — at most 8 model runs a day in total.
|
|
28
34
|
*
|
|
29
35
|
* ACCOUNTABILITY: each move's expectedDelta is graded against the measured
|
|
30
36
|
* metric once 7 days have passed and its own deadline has come; the grades
|
|
@@ -41,8 +47,14 @@ import { ensurePrivateDirectory, readPrivateFileCapped, writePrivateFileAtomic }
|
|
|
41
47
|
import { LEADER_ACTION_KINDS, LEADER_LIMITS, } from './leader-types.js';
|
|
42
48
|
import { LEADER_MEMO_SCHEMA_TEXT, LEADER_METRICS, actionIdFor, cleanModelText, isLeaderMetric, leaderRoot, materializeHypotheses, newMemoId, parseLeaderMemoOutput, readRecentMemos, summarizeMemo, writeLeaderMemo, } from './leader-memo.js';
|
|
43
49
|
import { applyDueLeaderActions, enactLeaderActions, isLeaderDryRun, listLeaderActions, loadDefaultLeaderDeps, readLeaderDirectives, readStandards, } from './leader-apply.js';
|
|
44
|
-
import { loadDefaultLeaderSeatDeps,
|
|
50
|
+
import { loadDefaultLeaderSeatDeps, planLeaderSeats } from './leader-seat.js';
|
|
45
51
|
import { suggestLeaderCloudBacklog } from './leader-cloud.js';
|
|
52
|
+
import { readLeaderOperatorContext } from './leader-operator.js';
|
|
53
|
+
import { buildLeaderGoalEvidence } from './leader-goal-evidence.js';
|
|
54
|
+
import { LEADER_CHECKIN_SUFFIX, LEADER_MAX_RETRY_ATTEMPTS, LEGACY_LEADER_CADENCE, checkinWindowOpen, materialEvidenceDigest, resolveLeaderCadence, retryDelayMs, } from './leader-cadence.js';
|
|
55
|
+
import { runLeaderSeatChain } from './leader-run-chain.js';
|
|
56
|
+
import { buildLeaderHealth } from './leader-health.js';
|
|
57
|
+
import { isOpenGoal } from '../goals/open-goals.js';
|
|
46
58
|
// ---------------------------------------------------------------------------
|
|
47
59
|
// Persona
|
|
48
60
|
// ---------------------------------------------------------------------------
|
|
@@ -171,26 +183,11 @@ export async function gatherLeaderEvidence(sources, nowMs, state) {
|
|
|
171
183
|
})),
|
|
172
184
|
})).sort((a, b) => a.seatId.localeCompare(b.seatId)) : null;
|
|
173
185
|
const goalRead = attempt('goals', () => sources.goals());
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
return {
|
|
178
|
-
open: open.length,
|
|
179
|
-
total: goalRead.goals.length,
|
|
180
|
-
focusLimit: LEADER_LIMITS.maxActiveGoals,
|
|
181
|
-
items: shown.map((g) => ({
|
|
182
|
-
id: g.id,
|
|
183
|
-
objective: cleanModelText(g.objective, 200) ?? '',
|
|
184
|
-
status: g.status,
|
|
185
|
-
repo: g.project ? g.project.split(/[\\/]/).pop() ?? null : null,
|
|
186
|
-
milestonesDone: g.milestones.filter((m) => m.status === 'done').length,
|
|
187
|
-
milestones: g.milestones.length,
|
|
188
|
-
updatedOn: day(g.updatedAt) ?? '',
|
|
189
|
-
})),
|
|
190
|
-
};
|
|
191
|
-
})() : null;
|
|
186
|
+
// An incomplete read is a LOWER BOUND with its caveat, never null: null read
|
|
187
|
+
// as "zero goals" to the model while 21 were open (leader-goal-evidence.ts).
|
|
188
|
+
const goals = goalRead ? buildLeaderGoalEvidence(goalRead) : null;
|
|
192
189
|
if (goalRead && !goalRead.complete)
|
|
193
|
-
unknown.push('goals');
|
|
190
|
+
unknown.push('goals-partial');
|
|
194
191
|
const facts = await ledgerFacts((o) => sources.readLedger(o), nowMs);
|
|
195
192
|
if (!facts)
|
|
196
193
|
unknown.push('ledger');
|
|
@@ -219,6 +216,8 @@ export async function gatherLeaderEvidence(sources, nowMs, state) {
|
|
|
219
216
|
}
|
|
220
217
|
const directives = readLeaderDirectives();
|
|
221
218
|
const actions = listLeaderActions(200);
|
|
219
|
+
// 3.14 operator input (additive): unreadable is reported, never read as "no guidance".
|
|
220
|
+
const operator = attempt('operator', () => readLeaderOperatorContext(nowMs));
|
|
222
221
|
return {
|
|
223
222
|
grant,
|
|
224
223
|
budget,
|
|
@@ -238,6 +237,7 @@ export async function gatherLeaderEvidence(sources, nowMs, state) {
|
|
|
238
237
|
hitRate: computeHitRate(state.outcomes, nowMs),
|
|
239
238
|
recentVetoes: actions.filter((a) => a.status === 'vetoed').slice(0, 5).map((a) => ({ summary: a.summary, note: a.vetoNote })),
|
|
240
239
|
directives: directives ? { grokLanes: directives.grokLanes, codexEnabled: directives.codexEnabled, routerTuning: directives.routerTuning } : null,
|
|
240
|
+
...(operator ? { operator } : {}),
|
|
241
241
|
unknown: [...new Set(unknown)].sort(),
|
|
242
242
|
};
|
|
243
243
|
}
|
|
@@ -260,6 +260,22 @@ function untrustedBlock(label, value) {
|
|
|
260
260
|
.replace(/\u2029/gu, '\\u2029');
|
|
261
261
|
return `=== BEGIN UNTRUSTED DATA: ${label} ===\n${serialized}\n=== END UNTRUSTED DATA: ${label} ===`;
|
|
262
262
|
}
|
|
263
|
+
/**
|
|
264
|
+
* 3.14: Mason's standing directives and answers — the one TRUSTED block in
|
|
265
|
+
* the memo prompt. Serialized like the data blocks (JSON, line separators
|
|
266
|
+
* escaped) so its text cannot fake a delimiter. It steers judgement only:
|
|
267
|
+
* the grant and the policy check still bound every action.
|
|
268
|
+
*/
|
|
269
|
+
function operatorBlock(operator) {
|
|
270
|
+
const serialized = (JSON.stringify(operator.trusted) ?? 'null')
|
|
271
|
+
.replace(/\u0085/gu, '\\u0085')
|
|
272
|
+
.replace(/\u2028/gu, '\\u2028')
|
|
273
|
+
.replace(/\u2029/gu, '\\u2029');
|
|
274
|
+
return `=== OPERATOR DIRECTIVES FROM MASON (trusted: the owner's own words) ===
|
|
275
|
+
${serialized}
|
|
276
|
+
=== END OPERATOR DIRECTIVES ===
|
|
277
|
+
Honor every directive above in the bottleneck, the move, the kill list and every action; when evidence conflicts with a directive, follow the directive and say why in notes. Answers are Mason's replies to your earlier questions (joined by questionId to the data block below); approvals are actions he endorsed. None of this widens the standing grant — the policy check still classifies every action.`;
|
|
278
|
+
}
|
|
263
279
|
export function buildLeaderPrompt(evidence, opts) {
|
|
264
280
|
const blocks = [
|
|
265
281
|
untrustedBlock('STANDING GRANT (null = none: every action is a dry run)', evidence.grant),
|
|
@@ -274,6 +290,10 @@ export function buildLeaderPrompt(evidence, opts) {
|
|
|
274
290
|
untrustedBlock('YOUR STANDING DIRECTIVES', evidence.directives),
|
|
275
291
|
untrustedBlock('UNKNOWN SECTIONS (sources that failed — not zero)', evidence.unknown),
|
|
276
292
|
];
|
|
293
|
+
if (evidence.operator) {
|
|
294
|
+
blocks.unshift(operatorBlock(evidence.operator));
|
|
295
|
+
blocks.push(untrustedBlock('YOUR EARLIER WORDING THAT MASON ANSWERED OR APPROVED', evidence.operator.untrusted));
|
|
296
|
+
}
|
|
277
297
|
const openGoals = evidence.goals?.open ?? null;
|
|
278
298
|
const focus = openGoals !== null && openGoals > LEADER_LIMITS.maxActiveGoals
|
|
279
299
|
? `\nFOCUS FIRST: ${openGoals} goals are open; at most ${LEADER_LIMITS.maxActiveGoals} may be. Pause or archive the rest (priorityChanges or goal.pause / goal.archive actions) before anything else.`
|
|
@@ -300,12 +320,20 @@ export function readLeaderRunState() {
|
|
|
300
320
|
const parsed = JSON.parse(read.text);
|
|
301
321
|
if (parsed.v !== 1)
|
|
302
322
|
return emptyState();
|
|
323
|
+
const obj = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
303
324
|
return {
|
|
304
325
|
...emptyState(),
|
|
305
326
|
...parsed,
|
|
306
327
|
runDays: typeof parsed.runDays === 'object' && parsed.runDays !== null ? parsed.runDays : {},
|
|
307
328
|
baselines: typeof parsed.baselines === 'object' && parsed.baselines !== null ? parsed.baselines : {},
|
|
308
329
|
outcomes: Array.isArray(parsed.outcomes) ? parsed.outcomes : [],
|
|
330
|
+
checkinDays: obj(parsed.checkinDays) ? parsed.checkinDays : {},
|
|
331
|
+
retry: obj(parsed.retry) && typeof parsed.retry.at === 'string' && Number.isInteger(parsed.retry.attempt) ? parsed.retry : null,
|
|
332
|
+
// Absent (a pre-3.14 file) stays undefined: health then reads the last run's outcome.
|
|
333
|
+
consecutiveFailures: Number.isInteger(parsed.consecutiveFailures) && parsed.consecutiveFailures >= 0 ? parsed.consecutiveFailures : undefined,
|
|
334
|
+
lastFailure: obj(parsed.lastFailure) ? parsed.lastFailure : null,
|
|
335
|
+
lastAttempts: Array.isArray(parsed.lastAttempts) ? parsed.lastAttempts.filter(obj).slice(0, 20) : [],
|
|
336
|
+
lastServed: obj(parsed.lastServed) ? parsed.lastServed : null,
|
|
309
337
|
};
|
|
310
338
|
}
|
|
311
339
|
catch {
|
|
@@ -318,11 +346,22 @@ function writeLeaderRunState(state) {
|
|
|
318
346
|
const runDays = {};
|
|
319
347
|
for (const d of keepDays)
|
|
320
348
|
runDays[d] = state.runDays[d];
|
|
349
|
+
const checkinDays = {};
|
|
350
|
+
for (const d of Object.keys(state.checkinDays ?? {}).sort().slice(-14))
|
|
351
|
+
checkinDays[d] = state.checkinDays[d];
|
|
321
352
|
const memoIds = Object.keys(state.baselines).sort().slice(-300);
|
|
322
353
|
const baselines = {};
|
|
323
354
|
for (const id of memoIds)
|
|
324
355
|
baselines[id] = state.baselines[id];
|
|
325
|
-
writePrivateFileAtomic(leaderStatePath(), `${JSON.stringify({ ...state, runDays, baselines, outcomes: state.outcomes.slice(-300) })}\n`);
|
|
356
|
+
writePrivateFileAtomic(leaderStatePath(), `${JSON.stringify({ ...state, runDays, checkinDays, baselines, outcomes: state.outcomes.slice(-300) })}\n`);
|
|
357
|
+
}
|
|
358
|
+
/** Check-in runs on the local day of `ms` (3.14). */
|
|
359
|
+
export function checkinsOnDay(state, ms) {
|
|
360
|
+
return state.checkinDays?.[localDay(ms)] ?? 0;
|
|
361
|
+
}
|
|
362
|
+
/** Full (non-check-in) runs on the local day of `ms` — what the 3-a-day cap counts. */
|
|
363
|
+
export function fullRunsOnDay(state, ms) {
|
|
364
|
+
return Math.max(0, runsOnDay(state, ms) - checkinsOnDay(state, ms));
|
|
326
365
|
}
|
|
327
366
|
/** Local calendar day (the cadence and the 3-runs-a-day cap are local). */
|
|
328
367
|
export function localDay(ms) {
|
|
@@ -351,16 +390,30 @@ export function scheduleSlots(nowMs) {
|
|
|
351
390
|
today = next;
|
|
352
391
|
return { previous, next: today };
|
|
353
392
|
}
|
|
354
|
-
/**
|
|
355
|
-
|
|
393
|
+
/**
|
|
394
|
+
* Pure: is a Leader run due now, and why. `cadence` (3.14) adds the bounded
|
|
395
|
+
* retry and the working-hours check-in; without it this is the 3.10 cadence
|
|
396
|
+
* (no check-ins, 3 runs a day) — retries still apply, inside that cap.
|
|
397
|
+
*/
|
|
398
|
+
export function leaderRunDue(nowMs, state, signals, cadence = LEGACY_LEADER_CADENCE) {
|
|
356
399
|
const slots = scheduleSlots(nowMs);
|
|
357
400
|
const nextRunAt = new Date(slots.next).toISOString();
|
|
358
|
-
|
|
359
|
-
|
|
401
|
+
const capped = `The Leader already ran ${cadence.maxRunsPerDay} times today.`;
|
|
402
|
+
if (runsOnDay(state, nowMs) >= cadence.maxRunsPerDayTotal) {
|
|
403
|
+
return { due: false, trigger: null, reason: `The Leader already ran ${cadence.maxRunsPerDayTotal} times today.`, nextRunAt };
|
|
404
|
+
}
|
|
405
|
+
if (fullRunsOnDay(state, nowMs) >= cadence.maxRunsPerDay) {
|
|
406
|
+
// Full runs are spent for today; only a check-in may still run.
|
|
407
|
+
if (checkinWindowOpen(nowMs, state, cadence))
|
|
408
|
+
return { due: true, trigger: 'checkin', reason: 'A working-hours check-in is due.', nextRunAt };
|
|
409
|
+
return { due: false, trigger: null, reason: capped, nextRunAt };
|
|
360
410
|
}
|
|
361
411
|
const lastMs = state.lastRun ? Date.parse(state.lastRun.at) : -Infinity;
|
|
362
412
|
if (lastMs < slots.previous)
|
|
363
413
|
return { due: true, trigger: 'schedule', reason: 'The daily 06:30 run is due.', nextRunAt };
|
|
414
|
+
if (state.retry && Date.parse(state.retry.at) <= nowMs) {
|
|
415
|
+
return { due: true, trigger: 'retry', reason: `Retry ${state.retry.attempt} of ${LEADER_MAX_RETRY_ATTEMPTS} after a failed run.`, nextRunAt };
|
|
416
|
+
}
|
|
364
417
|
if (signals.revertsSinceLastRun !== null && signals.revertsSinceLastRun > 0) {
|
|
365
418
|
return { due: true, trigger: 'revert', reason: 'A fleet merge was reverted.', nextRunAt };
|
|
366
419
|
}
|
|
@@ -371,8 +424,31 @@ export function leaderRunDue(nowMs, state, signals) {
|
|
|
371
424
|
return { due: true, trigger: 'seat-reset', reason: 'A seat window reset.', nextRunAt };
|
|
372
425
|
if (signals.highInsightSinceLastRun)
|
|
373
426
|
return { due: true, trigger: 'insight', reason: 'A high-severity reasoning insight appeared.', nextRunAt };
|
|
427
|
+
if (checkinWindowOpen(nowMs, state, cadence))
|
|
428
|
+
return { due: true, trigger: 'checkin', reason: 'A working-hours check-in is due.', nextRunAt };
|
|
374
429
|
return { due: false, trigger: null, reason: 'Nothing new since the last memo.', nextRunAt };
|
|
375
430
|
}
|
|
431
|
+
/**
|
|
432
|
+
* PURE and cheap (state file only — no ledger, no evidence): could a tick run
|
|
433
|
+
* the Leader now for a TIME reason — the daily slot not yet run, a retry
|
|
434
|
+
* that came due, or an open check-in window? The comms poller (every 3 min,
|
|
435
|
+
* no daemon needed) uses it to decide whether to start `ashlr leader tick
|
|
436
|
+
* --wait` in the background; the tick then applies the real rules.
|
|
437
|
+
* Event triggers (merges, reverts, …) are left to the daily ticks.
|
|
438
|
+
*/
|
|
439
|
+
export function leaderWakeDue(nowMs, state, cadence) {
|
|
440
|
+
if (runsOnDay(state, nowMs) >= cadence.maxRunsPerDayTotal)
|
|
441
|
+
return { due: false, why: 'daily cap reached' };
|
|
442
|
+
const fullRoom = fullRunsOnDay(state, nowMs) < cadence.maxRunsPerDay;
|
|
443
|
+
const lastMs = state.lastRun ? Date.parse(state.lastRun.at) : -Infinity;
|
|
444
|
+
if (fullRoom && lastMs < scheduleSlots(nowMs).previous)
|
|
445
|
+
return { due: true, why: 'the daily run has not happened' };
|
|
446
|
+
if (fullRoom && state.retry && Date.parse(state.retry.at) <= nowMs)
|
|
447
|
+
return { due: true, why: `retry ${state.retry.attempt} is due` };
|
|
448
|
+
if (checkinWindowOpen(nowMs, state, cadence))
|
|
449
|
+
return { due: true, why: 'a check-in window is open' };
|
|
450
|
+
return { due: false, why: 'nothing is due' };
|
|
451
|
+
}
|
|
376
452
|
export async function gatherTriggerSignals(sources, state, nowMs) {
|
|
377
453
|
const lastIso = state.lastRun?.at ?? new Date(nowMs - 86_400_000).toISOString();
|
|
378
454
|
const lastMs = Date.parse(lastIso);
|
|
@@ -413,7 +489,8 @@ export async function measureLeaderMetric(metric, sources, nowMs) {
|
|
|
413
489
|
switch (metric) {
|
|
414
490
|
case 'active-goals': {
|
|
415
491
|
const read = sources.goals();
|
|
416
|
-
|
|
492
|
+
// Grading needs the exact count: a lower bound is not a measurement.
|
|
493
|
+
return read.complete ? read.goals.filter(isOpenGoal).length : null;
|
|
417
494
|
}
|
|
418
495
|
case 'proposals-7d':
|
|
419
496
|
return sources.quality7d().proposalsCreated;
|
|
@@ -487,7 +564,7 @@ export async function loadDefaultLeaderRunDeps(cfg) {
|
|
|
487
564
|
capacity: () => budgetStore.readCapacitySnapshot(),
|
|
488
565
|
goals: () => {
|
|
489
566
|
const read = goalsStore.listGoalsDetailed();
|
|
490
|
-
return { goals: read.goals, complete: read.complete || read.sourceState === 'missing' };
|
|
567
|
+
return { goals: read.goals, complete: read.complete || read.sourceState === 'missing', unreadable: read.unreadableFiles };
|
|
491
568
|
},
|
|
492
569
|
readLedger: (opts) => ledger.readLedger(opts),
|
|
493
570
|
holds: () => quarantine.listRepoHolds(),
|
|
@@ -569,13 +646,32 @@ async function runLeaderOnce(deps, trigger, opts) {
|
|
|
569
646
|
const nowMs = deps.now();
|
|
570
647
|
const nowIso = new Date(nowMs).toISOString();
|
|
571
648
|
const state = readLeaderRunState();
|
|
572
|
-
|
|
573
|
-
|
|
649
|
+
const cadence = resolveLeaderCadence(deps.cfg);
|
|
650
|
+
const mode = trigger === 'checkin' ? 'checkin' : 'full';
|
|
651
|
+
// Full runs keep the 3-a-day cap; check-ins have their own room under the total cap.
|
|
652
|
+
if (mode === 'full' && fullRunsOnDay(state, nowMs) >= cadence.maxRunsPerDay) {
|
|
653
|
+
return { outcome: 'skipped-unchanged', reason: `The Leader already ran ${cadence.maxRunsPerDay} times today.`, memo: null };
|
|
654
|
+
}
|
|
655
|
+
if (runsOnDay(state, nowMs) >= cadence.maxRunsPerDayTotal) {
|
|
656
|
+
return { outcome: 'skipped-unchanged', reason: `The Leader already ran ${cadence.maxRunsPerDayTotal} times today.`, memo: null };
|
|
574
657
|
}
|
|
575
658
|
const evidence = await gatherLeaderEvidence(deps.sources, nowMs, state);
|
|
576
659
|
const digest = evidenceDigest(evidence);
|
|
660
|
+
const material = materialEvidenceDigest(evidence);
|
|
661
|
+
if (mode === 'checkin' && !opts.force && (state.lastMaterialDigest ?? null) === material) {
|
|
662
|
+
// Nothing material: no model call, and the next look is a recheck interval away.
|
|
663
|
+
state.lastRun = { at: nowIso, outcome: 'skipped-unchanged', reason: 'Check-in: nothing material changed since the last memo.', memoId: null, trigger };
|
|
664
|
+
state.lastCheckinEvalAt = nowIso;
|
|
665
|
+
writeLeaderRunState(state);
|
|
666
|
+
return { outcome: 'skipped-unchanged', reason: state.lastRun.reason, memo: null };
|
|
667
|
+
}
|
|
577
668
|
if (!opts.force && state.lastEvidenceDigest === digest) {
|
|
578
669
|
state.lastRun = { at: nowIso, outcome: 'skipped-unchanged', reason: 'The evidence has not changed since the last memo.', memoId: null, trigger };
|
|
670
|
+
if (mode === 'checkin')
|
|
671
|
+
state.lastCheckinEvalAt = nowIso;
|
|
672
|
+
// A retry whose evidence a later run already consumed has nothing left to do.
|
|
673
|
+
if (trigger === 'retry')
|
|
674
|
+
state.retry = null;
|
|
579
675
|
writeLeaderRunState(state);
|
|
580
676
|
return { outcome: 'skipped-unchanged', reason: state.lastRun.reason, memo: null };
|
|
581
677
|
}
|
|
@@ -588,65 +684,120 @@ async function runLeaderOnce(deps, trigger, opts) {
|
|
|
588
684
|
}
|
|
589
685
|
})();
|
|
590
686
|
const dryRun = isLeaderDryRun(policy);
|
|
591
|
-
const
|
|
592
|
-
const
|
|
687
|
+
const basePrompt = buildLeaderPrompt(evidence, { dryRun, nowIso });
|
|
688
|
+
const prompt = mode === 'checkin' ? `${basePrompt}\n\n${LEADER_CHECKIN_SUFFIX}` : basePrompt;
|
|
689
|
+
// A retry of the 06:30 run is still that run (deep-eligible).
|
|
690
|
+
const scheduled = trigger === 'schedule' || (trigger === 'retry' && state.retry?.of === 'schedule');
|
|
691
|
+
const deep = scheduled
|
|
593
692
|
&& (state.lastDeepRunAt === null || nowMs - Date.parse(state.lastDeepRunAt) >= 7 * 86_400_000);
|
|
594
693
|
const memoId = newMemoId(nowMs);
|
|
595
694
|
const memo = emptyMemo(memoId, nowIso, trigger, digest, dryRun);
|
|
596
|
-
|
|
695
|
+
memo.mode = mode;
|
|
696
|
+
// Check-ins in reserve mode stay on free local models.
|
|
697
|
+
const budgetMode = (() => {
|
|
698
|
+
try {
|
|
699
|
+
return deps.sources.budgetPolicy().mode;
|
|
700
|
+
}
|
|
701
|
+
catch {
|
|
702
|
+
return null;
|
|
703
|
+
}
|
|
704
|
+
})();
|
|
705
|
+
const plan = await planLeaderSeats(deps.seat, {
|
|
706
|
+
deep,
|
|
707
|
+
promptChars: LEADER_SYSTEM_PROMPT.length + prompt.length,
|
|
708
|
+
mode,
|
|
709
|
+
localOnly: mode === 'checkin' && budgetMode === 'reserve',
|
|
710
|
+
});
|
|
711
|
+
let servedDeep = false;
|
|
712
|
+
let attempts = [];
|
|
597
713
|
const finish = (outcome, reason, countsAsRun) => {
|
|
598
714
|
memo.status = outcome;
|
|
599
715
|
memo.statusReason = reason === null ? null : scrubPrivateText(reason).slice(0, 400);
|
|
716
|
+
memo.attempts = attempts.map((a) => ({ ...a, reason: a.reason === null ? null : scrubPrivateText(a.reason).slice(0, 300) }));
|
|
600
717
|
writeLeaderMemo(memo);
|
|
601
718
|
recordMemoOnLedger(deps, memo);
|
|
602
719
|
const fresh = readLeaderRunState();
|
|
603
720
|
fresh.lastRun = { at: nowIso, outcome, reason: memo.statusReason, memoId, trigger };
|
|
604
721
|
fresh.lastMemoAt = nowIso;
|
|
722
|
+
const today = localDay(nowMs);
|
|
605
723
|
if (countsAsRun)
|
|
606
|
-
fresh.runDays[
|
|
607
|
-
|
|
608
|
-
|
|
724
|
+
fresh.runDays[today] = (fresh.runDays[today] ?? 0) + 1;
|
|
725
|
+
if (countsAsRun && mode === 'checkin')
|
|
726
|
+
fresh.checkinDays = { ...(fresh.checkinDays ?? {}), [today]: (fresh.checkinDays?.[today] ?? 0) + 1 };
|
|
727
|
+
fresh.lastAttempts = memo.attempts;
|
|
728
|
+
fresh.lastAttemptsAt = nowIso;
|
|
729
|
+
if (outcome === 'ok') {
|
|
730
|
+
// A failed run does not consume the evidence: the next trigger may retry it.
|
|
609
731
|
fresh.lastEvidenceDigest = digest;
|
|
610
|
-
|
|
611
|
-
fresh.
|
|
732
|
+
fresh.lastMaterialDigest = material;
|
|
733
|
+
fresh.lastSuccessAt = nowIso;
|
|
734
|
+
fresh.consecutiveFailures = 0;
|
|
735
|
+
fresh.lastFailure = null;
|
|
736
|
+
fresh.retry = null;
|
|
737
|
+
fresh.lastServed = memo.seatId ? { seatId: memo.seatId, model: memo.model, at: nowIso } : null;
|
|
738
|
+
if (memo.seatId && servedDeep)
|
|
739
|
+
fresh.lastDeepRunAt = nowIso;
|
|
740
|
+
}
|
|
741
|
+
else {
|
|
742
|
+
fresh.consecutiveFailures = (fresh.consecutiveFailures ?? 0) + 1;
|
|
743
|
+
fresh.lastFailure = { at: nowIso, outcome, reason: memo.statusReason };
|
|
744
|
+
if (mode === 'full') {
|
|
745
|
+
// A bounded retry instead of waiting for tomorrow's slot. A check-in
|
|
746
|
+
// does not retry: the next check-in window is its retry.
|
|
747
|
+
const attempt = trigger === 'retry' ? (fresh.retry?.attempt ?? 0) + 1 : 1;
|
|
748
|
+
const delay = retryDelayMs(attempt);
|
|
749
|
+
fresh.retry = delay === null ? null : {
|
|
750
|
+
attempt,
|
|
751
|
+
at: new Date(nowMs + delay).toISOString(),
|
|
752
|
+
of: trigger === 'retry' ? fresh.retry?.of ?? 'schedule' : trigger,
|
|
753
|
+
reason: memo.statusReason,
|
|
754
|
+
};
|
|
755
|
+
}
|
|
756
|
+
}
|
|
612
757
|
writeLeaderRunState(fresh);
|
|
613
758
|
return { outcome, reason: memo.statusReason, memo };
|
|
614
759
|
};
|
|
615
|
-
if (!
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
memo.model = seat.choice.model;
|
|
619
|
-
let raw;
|
|
620
|
-
try {
|
|
621
|
-
raw = await seat.complete(LEADER_SYSTEM_PROMPT, prompt);
|
|
622
|
-
}
|
|
623
|
-
catch (err) {
|
|
624
|
-
return finish('failed', `The ${seat.choice.engine} call failed: ${err instanceof Error ? err.message : 'error'}`, true);
|
|
760
|
+
if (!plan.ok) {
|
|
761
|
+
attempts = plan.skipped;
|
|
762
|
+
return finish('no-seat', plan.reason, false);
|
|
625
763
|
}
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
764
|
+
const chain = await runLeaderSeatChain(plan.steps, {
|
|
765
|
+
system: LEADER_SYSTEM_PROMPT,
|
|
766
|
+
user: prompt,
|
|
767
|
+
parse: (raw) => parseLeaderMemoOutput(raw, { nowMs }),
|
|
768
|
+
reask: (why) => `${prompt}\n\nYour previous reply could not be parsed (${why}). Reply with ONLY the JSON object.`,
|
|
769
|
+
}, () => deps.now());
|
|
770
|
+
attempts = [...chain.attempts, ...plan.skipped];
|
|
771
|
+
const step = chain.ok ? chain.step : chain.lastStep;
|
|
772
|
+
memo.seatId = step?.choice.seatId ?? null;
|
|
773
|
+
memo.model = step?.choice.model ?? null;
|
|
774
|
+
if (!chain.ok)
|
|
775
|
+
return finish(chain.outcome, chain.reason, true);
|
|
776
|
+
servedDeep = chain.step.choice.deep;
|
|
777
|
+
const draft = chain.draft;
|
|
638
778
|
memo.bottleneck = draft.bottleneck;
|
|
639
779
|
memo.move = draft.move;
|
|
640
780
|
memo.killList = draft.killList;
|
|
781
|
+
memo.questionsForMason = draft.questionsForMason;
|
|
782
|
+
memo.status = 'ok';
|
|
783
|
+
memo.statusReason = draft.notes.length > 0 ? draft.notes.join('; ').slice(0, 400) : null;
|
|
784
|
+
if (mode === 'checkin') {
|
|
785
|
+
// ADVISORY: a check-in's goals, hypotheses, standards and actions are
|
|
786
|
+
// never enacted (a cheap model every two hours does not act; the daily
|
|
787
|
+
// memo does). Its move is not graded either (gradeLeaderOutcomes).
|
|
788
|
+
const dropped = draft.actions.length + draft.goals.length + draft.hypotheses.length + draft.standards.length;
|
|
789
|
+
if (dropped > 0) {
|
|
790
|
+
memo.statusReason = [memo.statusReason, `Check-in: ${dropped} proposal(s) not enacted (check-ins are advisory).`]
|
|
791
|
+
.filter((n) => typeof n === 'string' && n.length > 0).join('; ').slice(0, 400);
|
|
792
|
+
}
|
|
793
|
+
return finish('ok', memo.statusReason, true);
|
|
794
|
+
}
|
|
641
795
|
memo.goals = draft.goals;
|
|
642
796
|
memo.priorityChanges = draft.priorityChanges;
|
|
643
797
|
memo.standards = draft.standards;
|
|
644
798
|
memo.critiques = draft.critiques;
|
|
645
799
|
memo.seatPlan = draft.seatPlan;
|
|
646
|
-
memo.questionsForMason = draft.questionsForMason;
|
|
647
800
|
memo.hypotheses = materializeHypotheses(memoId, draft.hypotheses, nowIso);
|
|
648
|
-
memo.status = 'ok';
|
|
649
|
-
memo.statusReason = draft.notes.length > 0 ? draft.notes.join('; ').slice(0, 400) : null;
|
|
650
801
|
// Written BEFORE the actions run: experiment.start reads its hypothesis from this file.
|
|
651
802
|
writeLeaderMemo(memo);
|
|
652
803
|
// Register the memo's hypotheses with U9's harness registry as OPEN (Growth
|
|
@@ -722,10 +873,16 @@ export async function runLeader(deps, trigger, opts = {}) {
|
|
|
722
873
|
return { outcome: 'skipped-unchanged', reason: 'A Leader run is already in progress.', memo: null };
|
|
723
874
|
const job = (async () => {
|
|
724
875
|
ensurePrivateDirectory(leaderRoot());
|
|
876
|
+
// Cross-process single flight: the lock is reclaimed only from a dead
|
|
877
|
+
// owner (pid + start identity), never on a timer, so a slow local memo
|
|
878
|
+
// keeps it for as long as it runs.
|
|
725
879
|
const lock = acquireLocalStoreLock(join(leaderRoot(), '.run.lock'), 0);
|
|
726
880
|
if (!lock)
|
|
727
881
|
return { outcome: 'skipped-unchanged', reason: 'Another process is running the Leader.', memo: null };
|
|
728
882
|
try {
|
|
883
|
+
if (opts.expectLastRunAt !== undefined && (readLeaderRunState().lastRun?.at ?? null) !== opts.expectLastRunAt) {
|
|
884
|
+
return { outcome: 'skipped-unchanged', reason: 'Another process ran the Leader since this run was scheduled.', memo: null };
|
|
885
|
+
}
|
|
729
886
|
return await runLeaderOnce(deps, trigger, { force: opts.force === true });
|
|
730
887
|
}
|
|
731
888
|
finally {
|
|
@@ -747,7 +904,8 @@ export async function gradeLeaderOutcomes(deps) {
|
|
|
747
904
|
const graded = new Set(state.outcomes.map((o) => o.memoId));
|
|
748
905
|
const fresh = [];
|
|
749
906
|
for (const memo of readRecentMemos(60)) {
|
|
750
|
-
|
|
907
|
+
// Check-ins are advisory (3.14): their moves are not graded into the hit-rate.
|
|
908
|
+
if (memo.status !== 'ok' || memo.mode === 'checkin' || graded.has(memo.id))
|
|
751
909
|
continue;
|
|
752
910
|
const due = gradeDueAt(memo);
|
|
753
911
|
const expected = memo.move?.expectedDelta;
|
|
@@ -797,11 +955,15 @@ export async function leaderTick(deps, opts = {}) {
|
|
|
797
955
|
}
|
|
798
956
|
catch { /* retried next tick */ }
|
|
799
957
|
const state = readLeaderRunState();
|
|
958
|
+
const cadence = resolveLeaderCadence(deps.cfg);
|
|
959
|
+
rememberCadence(state, cadence);
|
|
800
960
|
const signals = await gatherTriggerSignals(deps.sources, state, nowMs);
|
|
801
|
-
const due = leaderRunDue(nowMs, state, signals);
|
|
961
|
+
const due = leaderRunDue(nowMs, state, signals, cadence);
|
|
802
962
|
if (!due.due || !due.trigger || runInFlight)
|
|
803
963
|
return { applied, graded, due, started: false, run: null };
|
|
804
|
-
|
|
964
|
+
// The CAS token: if the daemon's tick and the comms poller's tick both saw
|
|
965
|
+
// this run as due, only the first to take the lock runs it.
|
|
966
|
+
const job = runLeader(deps, due.trigger, { expectLastRunAt: state.lastRun?.at ?? null });
|
|
805
967
|
if (opts.awaitRun)
|
|
806
968
|
return { applied, graded, due, started: true, run: await job };
|
|
807
969
|
void job.catch(() => undefined);
|
|
@@ -810,12 +972,49 @@ export async function leaderTick(deps, opts = {}) {
|
|
|
810
972
|
// ---------------------------------------------------------------------------
|
|
811
973
|
// State for the API / UI
|
|
812
974
|
// ---------------------------------------------------------------------------
|
|
813
|
-
|
|
975
|
+
/**
|
|
976
|
+
* The cadence the last tick ran under, kept in the state file so the read
|
|
977
|
+
* path (GET /api/verse/leader, which has no config in hand) reports the same
|
|
978
|
+
* check-in interval the runs use. Written only when it changed.
|
|
979
|
+
*/
|
|
980
|
+
function rememberCadence(state, cadence) {
|
|
981
|
+
const stored = state.cadence;
|
|
982
|
+
if (stored && stored.checkinHours === cadence.checkinHours
|
|
983
|
+
&& stored.workingHours.start === cadence.workingHours.start && stored.workingHours.end === cadence.workingHours.end)
|
|
984
|
+
return;
|
|
985
|
+
try {
|
|
986
|
+
const fresh = readLeaderRunState();
|
|
987
|
+
fresh.cadence = { checkinHours: cadence.checkinHours, workingHours: { ...cadence.workingHours } };
|
|
988
|
+
writeLeaderRunState(fresh);
|
|
989
|
+
}
|
|
990
|
+
catch { /* the health read falls back to the defaults */ }
|
|
991
|
+
}
|
|
992
|
+
function cadenceFor(state, cfg) {
|
|
993
|
+
if (cfg)
|
|
994
|
+
return resolveLeaderCadence(cfg);
|
|
995
|
+
const stored = state.cadence;
|
|
996
|
+
if (!stored)
|
|
997
|
+
return resolveLeaderCadence(undefined);
|
|
998
|
+
return resolveLeaderCadence({ foundry: { leader: { checkinHours: stored.checkinHours, workingHours: stored.workingHours } } });
|
|
999
|
+
}
|
|
1000
|
+
export function buildLeaderState(nowMs, cfg) {
|
|
814
1001
|
const state = readLeaderRunState();
|
|
815
1002
|
const memos = readRecentMemos(30);
|
|
816
1003
|
const outcomeByMemo = new Map(state.outcomes.map((o) => [o.memoId, o]));
|
|
817
1004
|
const timeline = memos.map((m) => summarizeMemo(m, outcomeByMemo.get(m.id) ?? null));
|
|
818
1005
|
const latest = memos.find((m) => m.status === 'ok') ?? memos[0] ?? null;
|
|
1006
|
+
const lastOk = memos.find((m) => m.status === 'ok') ?? null;
|
|
1007
|
+
const health = buildLeaderHealth({
|
|
1008
|
+
...state,
|
|
1009
|
+
// Pre-3.14 state files: the newest ok memo is the last success.
|
|
1010
|
+
lastSuccessAt: state.lastSuccessAt ?? lastOk?.at ?? null,
|
|
1011
|
+
lastServed: state.lastServed ?? (lastOk?.seatId ? { seatId: lastOk.seatId, model: lastOk.model, at: lastOk.at } : null),
|
|
1012
|
+
}, nowMs, {
|
|
1013
|
+
cadence: cadenceFor(state, cfg),
|
|
1014
|
+
nextScheduledAt: scheduleSlots(nowMs).next,
|
|
1015
|
+
runsToday: runsOnDay(state, nowMs),
|
|
1016
|
+
checkinsToday: checkinsOnDay(state, nowMs),
|
|
1017
|
+
});
|
|
819
1018
|
return {
|
|
820
1019
|
v: 1,
|
|
821
1020
|
generatedAt: new Date(nowMs).toISOString(),
|
|
@@ -828,6 +1027,7 @@ export function buildLeaderState(nowMs) {
|
|
|
828
1027
|
hitRate: computeHitRate(state.outcomes, nowMs),
|
|
829
1028
|
standards: readStandards(),
|
|
830
1029
|
directives: readLeaderDirectives(),
|
|
1030
|
+
health,
|
|
831
1031
|
};
|
|
832
1032
|
}
|
|
833
1033
|
//# sourceMappingURL=leader.js.map
|