@humwick/server 0.130.1 → 0.130.3
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/README.md +5 -0
- package/bundled/prompts/manifest.json +1 -0
- package/bundled/prompts/task.hydration.md +1 -1
- package/bundled/roles/builder.md +1 -1
- package/docs/guides/sub-coordinators.md +12 -5
- package/docs/guides/tools-administration.md +4 -0
- package/docs/guides/tools-coordination.md +2 -0
- package/docs/guides/tools-tasks.md +8 -0
- package/docs/guides/workflows.md +74 -0
- package/docs/openapi.json +486 -4
- package/package.json +10 -18
- package/public/assets/{MessageBubble-BWpoBjl4.js → MessageBubble-Bq9kr21N.js} +2 -2
- package/public/assets/{PlanGraphPanel-C0auck3n.js → PlanGraphPanel-Dqiroy06.js} +2 -2
- package/public/assets/{TraceView-DBnOx7AQ.js → TraceView-DYU962-H.js} +2 -2
- package/public/assets/{VaultDecisionCard-0kp2oNBC.js → VaultDecisionCard-DhPfzioE.js} +2 -2
- package/public/assets/{activity-yLztXEBt.js → activity-DzCcQTee.js} +2 -2
- package/public/assets/{agent-lineage-BbJDR1dW.js → agent-lineage-SgDt9i3T.js} +2 -2
- package/public/assets/agent-liveness-Bq-s73jW.js +2 -0
- package/public/assets/{agent-name-CTZBrSD9.js → agent-name-CcY3Aijy.js} +2 -2
- package/public/assets/agent-profiles-cxtRBn6O.js +2 -0
- package/public/assets/{agent-project-badge-9TqzUUYE.js → agent-project-badge-DGYbIhaI.js} +2 -2
- package/public/assets/{agent-tools-D4n40pn8.js → agent-tools-DHbftV0N.js} +2 -2
- package/public/assets/{agent-type-icon-D6FUarOf.js → agent-type-icon-CY113sp-.js} +2 -2
- package/public/assets/{agents-BYDslkJc.js → agents-BPzY7IlQ.js} +2 -2
- package/public/assets/{analytics-B-XSbEMC.js → analytics-DENFPv_a.js} +2 -2
- package/public/assets/{artifact-viewer-DdWIfV6M.js → artifact-viewer-KRvSc7sl.js} +2 -2
- package/public/assets/{artifacts-DPN1q4pA.js → artifacts-C9gSmL3s.js} +2 -2
- package/public/assets/{artifacts-oBOqks-2.js → artifacts-DT-HkI5O.js} +2 -2
- package/public/assets/{automation-4KcRFXEu.js → automation-BsmjQhKD.js} +2 -2
- package/public/assets/{backlog-Cw9xPTCF.js → backlog-8NYH_62t.js} +2 -2
- package/public/assets/{busy-health-CTu32MZt.js → busy-health-D3hwvYb4.js} +2 -2
- package/public/assets/{channels-BiXzg1G9.js → channels-DCJ5WL7O.js} +2 -2
- package/public/assets/{chat-Ctk2qwvA.js → chat-DAIl357U.js} +3 -3
- package/public/assets/{code-preview-Bm1wWqAp.js → code-preview-CzrZfr9U.js} +2 -2
- package/public/assets/{connectors-C36ax4Vw.js → connectors-xTxtlyou.js} +2 -2
- package/public/assets/{cosmos-Jj9LK2Wf.js → cosmos-BpebFLK2.js} +2 -2
- package/public/assets/{crate-agent-H6S7-B9T.js → crate-agent-BHvI5wXC.js} +2 -2
- package/public/assets/{dependency-graph-Cd1E23wa.js → dependency-graph-DGT0o3wJ.js} +2 -2
- package/public/assets/{deploys-Bwfq146q.js → deploys-hqWOHSHE.js} +2 -2
- package/public/assets/{display-CfO7rTuF.js → display-CDeH4I8T.js} +2 -2
- package/public/assets/{files-DhhZI2Ih.js → files-BTeGVmTg.js} +2 -2
- package/public/assets/{fleet-B_rFEbnL.js → fleet-DgXtNgCa.js} +2 -2
- package/public/assets/{fleet-metrics-BkHP-P3R.js → fleet-metrics-BHEt5yc_.js} +2 -2
- package/public/assets/{formatted-body-Cm1RrzmN.js → formatted-body-MLtodyPp.js} +3 -3
- package/public/assets/{formatted-body-impl-DQiOuOD1.js → formatted-body-impl-CAe664Z8.js} +2 -2
- package/public/assets/{host-providers-dialog-CHqwXTov.js → host-providers-dialog-mapF4Fj9.js} +2 -2
- package/public/assets/index-CqqgOI5R.js +15 -0
- package/public/assets/index-MYAIwYTX.css +2 -0
- package/public/assets/{insights-fH1EL-qZ.js → insights-DNyf7IzF.js} +2 -2
- package/public/assets/{integrations-C5Oix6ng.js → integrations-DlYOHq7T.js} +2 -2
- package/public/assets/{issue-ref-chip-ODyondIa.js → issue-ref-chip-CeWBNWn7.js} +2 -2
- package/public/assets/{log-viewer-Cvfy6PW7.js → log-viewer-Cib8nqdE.js} +2 -2
- package/public/assets/{maintenance-D8CDH5wZ.js → maintenance-DSn1cPm7.js} +2 -2
- package/public/assets/{managed-agents-egllbpij.js → managed-agents-C3CkM81m.js} +2 -2
- package/public/assets/{markdown-preview-CYSFgVgK.js → markdown-preview-W4VQQPAv.js} +3 -3
- package/public/assets/{markdown-preview-impl-BteVIjX4.js → markdown-preview-impl-CMsTdhjq.js} +2 -2
- package/public/assets/{memory-C8WmXsyr.js → memory-BV17qtO4.js} +2 -2
- package/public/assets/{messages-BzQdqlO6.js → messages-Bm_1AqSA.js} +2 -2
- package/public/assets/{orchestrators-B1HxzkNw.js → orchestrators-Dg-vfP09.js} +2 -2
- package/public/assets/{overview-DCUnI4Z7.js → overview-DcYCrvlr.js} +2 -2
- package/public/assets/{pairs-ftCd2XcD.js → pairs-8o9nuG3V.js} +2 -2
- package/public/assets/{profile-icon-B2zH8DMH.js → profile-icon-BsRyBMea.js} +2 -2
- package/public/assets/project-profile-instructions-DETKFn_E.js +2 -0
- package/public/assets/projects-M_m6AHws.js +2 -0
- package/public/assets/{prompt-settings-Bftq9czX.js → prompt-settings-C_mNCgeL.js} +2 -2
- package/public/assets/provider-display-BEeLXC_D.js +2 -0
- package/public/assets/{registry-DWCU5c8q.js → registry-DDHHHE5N.js} +2 -2
- package/public/assets/run-card-Dt4I4jaP.js +2 -0
- package/public/assets/scroll-text-BKXS1ahr.js +2 -0
- package/public/assets/{secrets-C7GIUATz.js → secrets-BkVwxI5O.js} +2 -2
- package/public/assets/{service-access-settings-C3aujqTG.js → service-access-settings-Crq-6a-B.js} +2 -2
- package/public/assets/{settings-C6sZ9eBa.js → settings-CYcavMFu.js} +2 -2
- package/public/assets/shipping-H6gzEeZB.js +2 -0
- package/public/assets/{stats-V9Z-GxUd.js → stats-BJVeWkpV.js} +2 -2
- package/public/assets/{status-dot-CVv0iGHL.js → status-dot-BcHyw1Vw.js} +2 -2
- package/public/assets/store-DKPDIZBe.js +9 -0
- package/public/assets/{tasks-CXU75HRF.js → tasks-qJjlQPpx.js} +2 -2
- package/public/assets/{teams-BPf976zb.js → teams-Cd5Sk1uX.js} +2 -2
- package/public/assets/{terminal-viewer-DE9BOe-8.js → terminal-viewer-CpY5_m7W.js} +3 -3
- package/public/assets/{terminal-viewer-impl-D04pjmGh.js → terminal-viewer-impl-DI_2llFR.js} +2 -2
- package/public/assets/token-estimate-Co-Jdphh.js +2 -0
- package/public/assets/{use-agent-terminal-B1yR456R.js → use-agent-terminal-0yJA_buM.js} +2 -2
- package/public/assets/{use-decisions-D-S4tpDf.js → use-decisions-uJXHf34W.js} +2 -2
- package/public/assets/use-project-list-CpWl6eHQ.js +2 -0
- package/public/assets/{use-selectors-CnrAk2YP.js → use-selectors-BdxBW8mL.js} +2 -2
- package/public/assets/{user-avatar-nBFIcR4M.js → user-avatar-3IndfpOc.js} +2 -2
- package/public/assets/versioned-prompt-editor-CIVg7XB1.js +8 -0
- package/public/assets/{work-queue-TCjJxeT-.js → work-queue-B9rnLwHZ.js} +2 -2
- package/public/assets/{workflow-marker-Cf3Hf2fN.js → workflow-marker-X8wxyhzC.js} +2 -2
- package/public/assets/{workflows-CXQX20Qj.js → workflows-o5YyMFW7.js} +2 -2
- package/public/assets/{workspaces-qSYzKYMA.js → workspaces-CzEGoAng.js} +2 -2
- package/public/cosmos.html +4 -4
- package/public/index.html +31 -29
- package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/runner/plugins/claude/hooks/gate-run-guard.provisioned.mjs +31 -1
- package/runner/src/adapters/claude-effort.ts +2 -4
- package/runner/src/adapters/claude-headless.ts +1 -1
- package/runner/src/adapters/claude-launch-exit.ts +26 -0
- package/runner/src/adapters/claude-session-probe.ts +1 -1
- package/runner/src/adapters/claude-tmux.ts +38 -10
- package/runner/src/adapters/claude.ts +28 -75
- package/runner/src/adapters/codex-launch-config.ts +4 -5
- package/runner/src/adapters/codex.ts +1 -1
- package/runner/src/adapters/opencode-provider.ts +7 -22
- package/runner/src/adapters/opencode.ts +4 -4
- package/runner/src/adapters/provider-quota-harvest.ts +20 -71
- package/runner/src/agent-runner/credentials.ts +42 -12
- package/runner/src/agent-runner/inbox.ts +27 -0
- package/runner/src/agent-runner/lifecycle-milestones.ts +2 -4
- package/runner/src/agent-runner/liveness-exchange.ts +104 -0
- package/runner/src/bin/claude.ts +4 -0
- package/runner/src/bin/codex.ts +4 -0
- package/runner/src/bin/opencode.ts +4 -0
- package/runner/src/claude-system-prompt.ts +49 -0
- package/runner/src/index.ts +5 -2
- package/runner/src/launch-assembly.ts +14 -10
- package/runner/src/profile-home.ts +1 -1
- package/runner/src/project-instructions.ts +2 -2
- package/runner/src/provider-command.ts +18 -0
- package/runner/src/provider-setup.ts +35 -0
- package/runner/src/providers.ts +2 -1
- package/runner/src/runner-core.ts +32 -38
- package/runner/src/runner-helpers.ts +0 -8
- package/runner/src/session-scratch.ts +6 -2
- package/runner/src/spawn-input.ts +2 -1
- package/runner/src/test-run-dedup.ts +59 -56
- package/runner/test-support/provisioning-context.ts +4 -2
- package/runner/test-support/runner-harness.ts +2 -1
- package/scripts/cd-config.ts +8 -0
- package/scripts/gate-run-lease.ts +10 -7
- package/scripts/gate.sh +5 -1
- package/scripts/steward-policy-cleanup.ts +2 -2
- package/src/agent-authz.ts +2 -2
- package/src/agent-drive-arbiter.ts +3 -8
- package/src/agent-exit-cleanup-async.ts +2 -2
- package/src/agent-exit-cleanup.ts +23 -19
- package/src/agent-lifecycle-events.ts +112 -85
- package/src/agent-ref.ts +3 -2
- package/src/agent-status-events.ts +43 -14
- package/src/auth/password.ts +4 -3
- package/src/auth/session-refresh.ts +1 -1
- package/src/auth/session.test-fixture.ts +2 -2
- package/src/auth/session.ts +7 -7
- package/src/automations/crud.ts +8 -81
- package/src/automations/dispatch.ts +33 -58
- package/src/automations/index.ts +1 -1
- package/src/automations/persistence.ts +65 -0
- package/src/automations/precheck.ts +18 -16
- package/src/automations/read-async.ts +11 -0
- package/src/automations/reconcile.ts +30 -39
- package/src/automations/storage.ts +33 -10
- package/src/automations/write-async.ts +33 -0
- package/src/branch-land-notice.ts +93 -0
- package/src/branch-landed.ts +31 -98
- package/src/bus.ts +40 -39
- package/src/cd-deploy-notify.ts +32 -4
- package/src/cd-host-lag-notify.ts +7 -6
- package/src/ci/incidents.ts +2 -2
- package/src/ci/monitor.ts +5 -8
- package/src/ci/notifications.ts +4 -4
- package/src/ci/root-missing.ts +4 -9
- package/src/ci/transition-notify.ts +12 -44
- package/src/claude-app/oauth-http.ts +3 -3
- package/src/cli/cd-pauses.ts +19 -0
- package/src/cli/orchestrator.ts +1 -1
- package/src/cli/state.ts +2 -19
- package/src/cli/task-edit.ts +22 -0
- package/src/cli/task.ts +3 -1
- package/src/cli/workflow.ts +19 -4
- package/src/commands-db.ts +7 -7
- package/src/commands-write.ts +8 -0
- package/src/compaction-watch.ts +10 -8
- package/src/config-store-write.ts +13 -1
- package/src/config-store.ts +25 -14
- package/src/config.ts +4 -11
- package/src/connectors.ts +10 -8
- package/src/context-advisory.ts +22 -21
- package/src/db/activity-async.ts +6 -1
- package/src/db/activity-write-ops.ts +12 -1
- package/src/db/activity.ts +1 -14
- package/src/db/agent-action-write.ts +36 -0
- package/src/db/agent-control-async.ts +9 -0
- package/src/db/agent-control-write.ts +49 -0
- package/src/db/agent-effort-observe.ts +22 -0
- package/src/db/agent-meta.ts +14 -3
- package/src/db/agent-search.ts +1 -15
- package/src/db/agents-async.ts +59 -9
- package/src/db/agents-write-ops.ts +12 -3
- package/src/db/agents.ts +95 -65
- package/src/db/auth-identities.ts +2 -2
- package/src/db/automation-read-ops.ts +11 -0
- package/src/db/automation-write-ops.ts +46 -0
- package/src/db/blackboard.ts +2 -2
- package/src/db/browser-session-write.ts +32 -0
- package/src/db/bus-outbox-write-ops.ts +3 -1
- package/src/db/checkout-refresh-schema.ts +47 -0
- package/src/db/checkout-refresh.ts +5 -5
- package/src/db/ci-incidents-async.ts +5 -5
- package/src/db/ci-incidents-write-ops.ts +2 -2
- package/src/db/command-agent-profile-backfill.ts +39 -0
- package/src/db/command-agent-profiles.ts +5 -1
- package/src/db/command-retention.ts +126 -0
- package/src/db/command-row.ts +10 -2
- package/src/db/commands-list-query.ts +2 -0
- package/src/db/commands-planner-stats.test-fixture.ts +8 -0
- package/src/db/commands-read-ops.ts +16 -0
- package/src/db/commands-spawn-read.ts +1 -1
- package/src/db/config-store-write-ops.ts +7 -2
- package/src/db/connection.ts +1 -182
- package/src/db/context-carry-write.ts +74 -0
- package/src/db/continuation-archives-async.ts +5 -0
- package/src/db/continuation-archives-write-ops.ts +7 -0
- package/src/db/continuations.ts +6 -6
- package/src/db/db-error-registry.ts +12 -0
- package/src/db/db-writer-worker.ts +8 -1
- package/src/db/deploy-events-async.ts +1 -0
- package/src/db/deploy-events-read-ops.ts +2 -1
- package/src/db/deploy-events.ts +35 -4
- package/src/db/gateway.ts +26 -133
- package/src/db/history-retention-ops.ts +13 -0
- package/src/db/hosts-registration.ts +10 -2
- package/src/db/hosts.ts +9 -6
- package/src/db/inbox-async.ts +2 -2
- package/src/db/inbox-read-ops.ts +1 -1
- package/src/db/inbox.ts +9 -17
- package/src/db/index.ts +2 -0
- package/src/db/integrations-async.ts +8 -0
- package/src/db/integrations-ops.ts +15 -0
- package/src/db/integrations.ts +15 -21
- package/src/db/issue-associations.ts +2 -2
- package/src/db/issue-lifecycle.ts +3 -4
- package/src/db/issue-refs-async.ts +23 -0
- package/src/db/issue-refs-read-ops.ts +6 -0
- package/src/db/issue-refs-write-ops.ts +29 -0
- package/src/db/issue-refs.ts +15 -16
- package/src/db/kernel-event-log-schema.ts +2 -0
- package/src/db/land-boundaries.ts +51 -5
- package/src/db/land-gate-attestations.ts +2 -2
- package/src/db/landing-receipts.ts +2 -2
- package/src/db/lifecycle-context-write.ts +5 -0
- package/src/db/lifecycle-tail-async.ts +76 -0
- package/src/db/lifecycle-tail-write-ops.ts +62 -0
- package/src/db/lifecycle-write-window.ts +2 -1
- package/src/db/lineage-pair-dedupe-sql.ts +3 -3
- package/src/db/long-running-work.ts +2 -2
- package/src/db/main-connection-mode.ts +11 -0
- package/src/db/main-connection-writes.ts +41 -2
- package/src/db/maintenance-job-reconcile.ts +61 -0
- package/src/db/maintenance-job-runs-async.ts +14 -0
- package/src/db/maintenance-job-write-ops.ts +9 -0
- package/src/db/maintenance-pauses.ts +2 -2
- package/src/db/mappers.ts +2 -14
- package/src/db/merge-lease.ts +1 -15
- package/src/db/message-send.ts +4 -0
- package/src/db/messages.ts +31 -25
- package/src/db/migrations.ts +25 -16
- package/src/db/notification-write-ops.ts +19 -0
- package/src/db/operator-answer-write.ts +19 -0
- package/src/db/orchestrators.ts +14 -76
- package/src/db/pairs-async.ts +22 -1
- package/src/db/pairs-write-ops.ts +8 -3
- package/src/db/pairs.ts +42 -61
- package/src/db/plan-dispatch-schema.ts +5 -1
- package/src/db/plan-ready-notices.ts +43 -0
- package/src/db/plan-tools-include-migration.ts +36 -0
- package/src/db/plans-write-ops.ts +2 -0
- package/src/db/presence-buffer.ts +5 -0
- package/src/db/presence-loop.ts +18 -23
- package/src/db/presence-write.ts +0 -6
- package/src/db/project-entries-async.ts +14 -0
- package/src/db/project-entries-read-ops.ts +5 -1
- package/src/db/project-entries-write-ops.ts +8 -0
- package/src/db/project-entries.ts +15 -12
- package/src/db/project-journal.ts +2 -2
- package/src/db/project-profile-instructions.ts +50 -0
- package/src/db/project-trust-approvals.ts +2 -2
- package/src/db/prompt-templates.ts +4 -4
- package/src/db/prompt-versions.ts +9 -2
- package/src/db/provider-config-history.ts +8 -3
- package/src/db/provider-model-seed.ts +34 -0
- package/src/db/read-op-marshaling-fixtures.ts +23 -0
- package/src/db/read-ops.ts +8 -0
- package/src/db/retention.ts +13 -2
- package/src/db/review-publish-write.ts +8 -0
- package/src/db/routing-policy.ts +2 -3
- package/src/db/runtime-admin-async.ts +19 -0
- package/src/db/runtime-admin-write-ops.ts +36 -0
- package/src/db/runtime-tail-async.ts +288 -0
- package/src/db/runtime-tail-write-ops.ts +97 -0
- package/src/db/schema.ts +13 -4
- package/src/db/spawn-budget.ts +5 -0
- package/src/db/spawn-delegation-state.ts +11 -4
- package/src/db/spawn-delegation.ts +1 -11
- package/src/db/sql-audit-indexes.ts +3 -0
- package/src/db/stats-async.ts +9 -6
- package/src/db/task-entity.ts +28 -6
- package/src/db/task-list.ts +3 -1
- package/src/db/tasks.ts +1 -17
- package/src/db/team-claim-policy.ts +60 -0
- package/src/db/teams-async.ts +4 -0
- package/src/db/teams-write-ops.ts +4 -0
- package/src/db/terminal-events.ts +15 -0
- package/src/db/timer-cutover-bodies.ts +292 -0
- package/src/db/timer-cutover-core.ts +37 -278
- package/src/db/timer-cutover-state.ts +40 -0
- package/src/db/timer-cutover-write-ops.ts +1 -40
- package/src/db/timer-ingress.ts +7 -1
- package/src/db/token-db-write-ops.ts +19 -0
- package/src/db/token-standing-async.ts +12 -0
- package/src/db/token-standing.ts +21 -20
- package/src/db/token-usage-retention.ts +33 -0
- package/src/db/token-usage-write-ops.ts +1 -1
- package/src/db/token-usage.ts +4 -1
- package/src/db/user-invites-async.ts +13 -0
- package/src/db/user-invites.ts +3 -3
- package/src/db/users.ts +14 -6
- package/src/db/workflow-contact.ts +1 -1
- package/src/db/workflow-task-read-ops.ts +30 -0
- package/src/db/workspaces.ts +8 -5
- package/src/db/write-ops.ts +37 -12
- package/src/db/writer-fault-seam.ts +2 -9
- package/src/db/writer-fault-test-ops.ts +18 -0
- package/src/db/writer-gateway.ts +58 -56
- package/src/dev.ts +8 -3
- package/src/dispatch-availability.ts +10 -6
- package/src/ephemeral/{landing-ingress-proof-worker.ts → landing-ingress-proof.test-fixture.ts} +4 -2
- package/src/event-loop-lag.ts +4 -2
- package/src/event-loop-yield.ts +2 -2
- package/src/events.ts +10 -8
- package/src/host/disk-alert.ts +121 -0
- package/src/host-provider-store.ts +5 -4
- package/src/hub-metrics-report.ts +5 -1
- package/src/hub-metrics.ts +38 -18
- package/src/injection-sweep-pacing.ts +6 -8
- package/src/land-gate-notifications.ts +11 -10
- package/src/land-gate-queue-progress.ts +3 -3
- package/src/land-settle-dispatch.ts +52 -92
- package/src/lifecycle-context-pressure.ts +11 -10
- package/src/lifecycle-manager.ts +107 -100
- package/src/maintenance/breaker.ts +18 -16
- package/src/maintenance/cd-watcher.ts +3 -3
- package/src/maintenance/checkout-refresh.ts +18 -1
- package/src/maintenance/critical-job-watchdog.ts +19 -20
- package/src/maintenance/events.ts +3 -3
- package/src/maintenance/history-retention-job.ts +30 -0
- package/src/maintenance/index.ts +1 -0
- package/src/maintenance/jobs.ts +32 -69
- package/src/maintenance/long-running-work.ts +3 -1
- package/src/maintenance/offline-agent-prune-job.ts +28 -0
- package/src/maintenance/orphaned-sessions.ts +5 -4
- package/src/maintenance/pauses.ts +4 -10
- package/src/maintenance/plan-ready-notice-job.ts +71 -0
- package/src/maintenance/scheduler.ts +98 -137
- package/src/maintenance/stalled-delivery-pager.ts +10 -9
- package/src/maintenance/teams.ts +19 -30
- package/src/maintenance/workspaces.ts +18 -28
- package/src/managed-policy-escalation.ts +7 -7
- package/src/managed-policy.ts +32 -28
- package/src/managed-provider-gate.ts +5 -4
- package/src/managed-spawn-reservation.ts +5 -4
- package/src/mcp/index.ts +12 -9
- package/src/mcp/output-descriptions.ts +8 -8
- package/src/mcp/presentation.ts +6 -5
- package/src/mcp/project-profile-instructions.ts +32 -0
- package/src/mcp/runtime-output.ts +6 -1
- package/src/mcp/self-care-visibility.ts +2 -2
- package/src/mcp/spawn-targets-matrix.ts +10 -1
- package/src/mcp/tool-groups.ts +4 -3
- package/src/mcp/tool-roles.ts +81 -0
- package/src/mcp/tools-spawn.ts +4 -3
- package/src/mcp/tools-workspace.ts +1 -1
- package/src/mcp-agent-action.ts +1 -2
- package/src/mcp-blackboard-tools.ts +6 -5
- package/src/mcp-decision-tools.ts +7 -7
- package/src/mcp-egress-tools.ts +10 -9
- package/src/mcp-issue-activity-tools.ts +2 -2
- package/src/mcp-issue-association-tools.ts +4 -4
- package/src/mcp-issue-ref-tools.ts +13 -12
- package/src/mcp-maintenance-tools.ts +2 -2
- package/src/mcp-merge-tools.ts +5 -5
- package/src/mcp-notification-subscription-tools.ts +14 -15
- package/src/mcp-output-levels.test-fixture.ts +1 -1
- package/src/mcp-profile-trust-tools.ts +5 -5
- package/src/mcp-project-journal-tools.ts +4 -12
- package/src/mcp-project-tools.ts +17 -18
- package/src/mcp-provider-catalog.ts +2 -2
- package/src/mcp-routing-policy-tools.ts +3 -2
- package/src/mcp-task-tools.ts +11 -5
- package/src/mcp-team-template-tools.ts +3 -3
- package/src/mcp-team-tools.ts +6 -6
- package/src/mcp-workflow-tools.ts +13 -4
- package/src/memory-area-injection.ts +13 -12
- package/src/memory-boundary-capture.ts +6 -6
- package/src/memory-injection.ts +45 -43
- package/src/merge-pause-maintenance.ts +5 -4
- package/src/notification-router.ts +44 -17
- package/src/notification-types.ts +2 -1
- package/src/notify.ts +5 -5
- package/src/observed-reset-refresh.ts +4 -4
- package/src/operator-alarm.ts +23 -11
- package/src/project-ingest.ts +6 -6
- package/src/project-instructions.ts +12 -1
- package/src/project-profile-instruction-text.ts +6 -0
- package/src/project-profile-instructions.ts +20 -0
- package/src/project-trust.ts +12 -11
- package/src/prompt-resolver.ts +3 -3
- package/src/provider-catalog-store.ts +3 -49
- package/src/provider-config-store.ts +12 -11
- package/src/provider-model-seed.ts +1 -18
- package/src/provider-quota-async.ts +5 -7
- package/src/provider-quota-config-store.ts +5 -4
- package/src/provider-secrets.test-fixture.ts +3 -3
- package/src/provider-timeline-event.ts +4 -7
- package/src/quota-band-delivery.ts +2 -2
- package/src/recipe-runner.ts +6 -5
- package/src/repo-config-source.ts +10 -4
- package/src/retention-config-store.ts +4 -3
- package/src/reviewer-pipeline.ts +11 -10
- package/src/routes/_route.ts +4 -4
- package/src/routes/_shared.ts +13 -12
- package/src/routes/agent-effort.ts +5 -5
- package/src/routes/agent-heartbeat-quota.ts +23 -0
- package/src/routes/agent-keep.ts +1 -1
- package/src/routes/agent-profiles.ts +6 -6
- package/src/routes/agent-reporting.ts +1 -1
- package/src/routes/agent-self-effort.ts +5 -5
- package/src/routes/agent-sessions.ts +24 -24
- package/src/routes/agents-spawn.ts +2 -2
- package/src/routes/agents.ts +19 -121
- package/src/routes/auth.ts +14 -15
- package/src/routes/authority-audit.ts +2 -2
- package/src/routes/automations.ts +6 -5
- package/src/routes/channel-binding-delete.ts +1 -1
- package/src/routes/channel-output.ts +3 -3
- package/src/routes/claude-api-budget.ts +5 -5
- package/src/routes/commands-listing.ts +5 -1
- package/src/routes/commands.ts +31 -29
- package/src/routes/context-resets.ts +2 -2
- package/src/routes/continuation-archives.ts +2 -2
- package/src/routes/coordinator-teams.ts +1 -1
- package/src/routes/decisions.ts +2 -2
- package/src/routes/host-secret-files.ts +1 -1
- package/src/routes/hosts.ts +11 -11
- package/src/routes/inbox.ts +3 -2
- package/src/routes/index.ts +12 -2
- package/src/routes/integrations.ts +32 -56
- package/src/routes/issue-activity.ts +2 -2
- package/src/routes/issue-associations.ts +4 -4
- package/src/routes/issue-refs.ts +9 -9
- package/src/routes/kernel-timers-operator.ts +1 -1
- package/src/routes/memory.ts +1 -1
- package/src/routes/merges.ts +11 -11
- package/src/routes/messages.ts +23 -17
- package/src/routes/orchestrator-bootstrap.ts +2 -2
- package/src/routes/orchestrator-host-registration.ts +4 -2
- package/src/routes/orchestrator-host-utilization.ts +5 -3
- package/src/routes/orchestrator-proxy.ts +4 -4
- package/src/routes/orchestrator.ts +28 -19
- package/src/routes/pairs.ts +8 -8
- package/src/routes/project-profile-instructions.ts +27 -0
- package/src/routes/project-trust.ts +3 -3
- package/src/routes/projects.ts +16 -16
- package/src/routes/prompt-templates.ts +12 -12
- package/src/routes/provider-config.ts +6 -6
- package/src/routes/provider-quota-config.ts +2 -2
- package/src/routes/provider-quotas.ts +10 -10
- package/src/routes/run-command.ts +1 -1
- package/src/routes/secrets-backup.ts +2 -2
- package/src/routes/secrets-import.ts +1 -1
- package/src/routes/secrets-vault.ts +7 -7
- package/src/routes/settings.ts +6 -6
- package/src/routes/shipping.ts +9 -1
- package/src/routes/spawn-policy.ts +8 -7
- package/src/routes/sse.ts +2 -2
- package/src/routes/stats.ts +6 -6
- package/src/routes/task-http.ts +15 -1
- package/src/routes/task-issues.ts +11 -26
- package/src/routes/tasks.ts +22 -53
- package/src/routes/team-templates.ts +12 -12
- package/src/routes/teams-config.ts +2 -2
- package/src/routes/teams.ts +10 -10
- package/src/routes/tokens.ts +30 -22
- package/src/routes/users.ts +24 -24
- package/src/routes/viewer-read.ts +3 -3
- package/src/routes/web-tool-calls.ts +4 -4
- package/src/routes/workflows.ts +22 -7
- package/src/routes/workspaces.ts +17 -16
- package/src/routing-policy-normalize.ts +1 -2
- package/src/routing-policy-push.ts +6 -6
- package/src/routing-step-defaults.ts +0 -2
- package/src/runner-token-mint-limit.ts +63 -0
- package/src/runtime-grant.ts +21 -13
- package/src/runtime-tokens.ts +59 -35
- package/src/secrets-broker/config.ts +1 -1
- package/src/secrets-broker/service.ts +2 -2
- package/src/security.ts +16 -21
- package/src/self-resume-carry.ts +21 -110
- package/src/self-resume-supersede.ts +4 -3
- package/src/self-resume.ts +54 -66
- package/src/server-background.ts +2 -2
- package/src/server.ts +26 -24
- package/src/services/agent-action.ts +12 -31
- package/src/services/agent-effort.ts +7 -32
- package/src/services/agent-hang-watchdog-job.ts +2 -2
- package/src/services/agent-heartbeat.ts +166 -0
- package/src/services/agent-reporting.ts +1 -1
- package/src/services/browser-inventory.ts +3 -3
- package/src/services/browser-session-state.ts +3 -2
- package/src/services/browser-session.ts +21 -27
- package/src/services/bus-command-update.ts +9 -9
- package/src/services/checkout-refresh-state.ts +1 -0
- package/src/services/checkout-refresh.test-fixture.ts +3 -2
- package/src/services/command-host.ts +7 -2
- package/src/services/coordinator-digest.ts +3 -2
- package/src/services/dispatch-command.ts +12 -13
- package/src/services/effective-launch-driver.ts +14 -9
- package/src/services/host-changed-paths.test-fixture.ts +5 -6
- package/src/services/host-project-readiness.ts +2 -2
- package/src/services/host-providers.ts +1 -1
- package/src/services/host-utilization.ts +27 -4
- package/src/services/idle-agent-digest.ts +17 -12
- package/src/services/idle-epics.ts +9 -10
- package/src/services/interrupt-agent.ts +12 -9
- package/src/services/issue-activity.ts +3 -3
- package/src/services/issue-associations.ts +15 -18
- package/src/services/issue-lifecycle-comments.ts +3 -2
- package/src/services/issue-lifecycle.ts +69 -72
- package/src/services/issue-refs.ts +10 -15
- package/src/services/kernel-timers-cutover-chaos-worker.ts +11 -8
- package/src/services/kernel-timers-ingress-chaos-worker.ts +6 -1
- package/src/services/kernel-timers-ingress.ts +4 -4
- package/src/services/kernel-timers-message-authority-chaos-worker.ts +3 -10
- package/src/services/kernel-timers-operator-chaos-worker.ts +3 -2
- package/src/services/kernel-timers-outbox.ts +1 -1
- package/src/services/kernel-timers-stage10-operator.ts +1 -1
- package/src/services/kernel-timers.ts +4 -3
- package/src/services/land-gate-placement.ts +11 -2
- package/src/services/land-issue-relations.ts +5 -4
- package/src/services/land-restart-retry.ts +7 -6
- package/src/services/landed-ancestry.ts +25 -8
- package/src/services/legacy-landing-host.ts +4 -1
- package/src/services/legacy-landing-recovery.ts +8 -6
- package/src/services/managed-running.ts +17 -17
- package/src/services/memory-areas.ts +17 -53
- package/src/services/merge-pause.ts +9 -15
- package/src/services/operator-decisions.ts +37 -41
- package/src/services/orchestrator-registration-recovery.ts +6 -2
- package/src/services/orchestrator-upgrade.ts +14 -12
- package/src/services/permission-decision.ts +4 -3
- package/src/services/plan-ci-notice.ts +57 -0
- package/src/services/plan-ci-recovery.ts +2 -55
- package/src/services/plan-conformance.ts +4 -4
- package/src/services/plan-dispatch-policy.ts +10 -3
- package/src/services/plan-dispatch.ts +35 -14
- package/src/services/plan-graph.ts +39 -261
- package/src/services/plan-import.ts +1 -1
- package/src/services/plan-live-bindings.ts +8 -37
- package/src/services/plan-task-create.ts +1 -1
- package/src/services/plan-terminal-refs.ts +2 -12
- package/src/services/plan-wake-digest.ts +9 -3
- package/src/services/profile-trust.ts +6 -5
- package/src/services/project-config-read.ts +70 -0
- package/src/services/project-profile-instructions.ts +54 -0
- package/src/services/project.ts +11 -10
- package/src/services/prompt-templates.ts +6 -5
- package/src/services/provider-hold-nudge.ts +9 -9
- package/src/services/provider-hold-record.ts +13 -12
- package/src/services/provider-state-audit.ts +19 -18
- package/src/services/provisioning-harness/budget-baseline.json +4 -4
- package/src/services/provisioning-harness/driver.ts +1 -1
- package/src/services/provisioning-harness/fixture-matrix.ts +3 -3
- package/src/services/provisioning-harness/lifecycle.ts +24 -22
- package/src/services/provisioning-harness/prepare.ts +16 -17
- package/src/services/rate-limit-resume.ts +10 -9
- package/src/services/red-main-auto-revert.ts +7 -5
- package/src/services/red-main-controller-deps.ts +20 -3
- package/src/services/red-main-incident.ts +3 -1
- package/src/services/red-main-quarantine.ts +2 -3
- package/src/services/register-agent.ts +22 -22
- package/src/services/restart-project-role.ts +1 -1
- package/src/services/restart-spawn.ts +74 -61
- package/src/services/review-publish.ts +7 -24
- package/src/services/review-ref-reconcile.ts +29 -38
- package/src/services/runtime-dependency-alert.ts +27 -0
- package/src/services/scheduler-command.ts +11 -9
- package/src/services/scheduler.ts +5 -5
- package/src/services/self-care-state.ts +2 -1
- package/src/services/self-effort-grant.ts +5 -25
- package/src/services/self-effort.ts +5 -5
- package/src/services/send-message.ts +21 -34
- package/src/services/shutdown-agent.ts +17 -14
- package/src/services/spawn-agent.ts +25 -43
- package/src/services/spawn-chain-inspector.ts +7 -14
- package/src/services/spawn-cwd-placement.ts +21 -5
- package/src/services/spawn-issue-activity.ts +8 -6
- package/src/services/spawn-launch.ts +17 -1
- package/src/services/spawn-loss-escalation.ts +1 -1
- package/src/services/spawn-policy.ts +68 -0
- package/src/services/spawn-registration-watchdog.ts +2 -2
- package/src/services/spawn-repo-probe.ts +7 -5
- package/src/services/spawn-tree-cleanup.ts +8 -9
- package/src/services/steward-reaper.ts +4 -4
- package/src/services/task-context-hydration.ts +25 -1
- package/src/services/task-delivery.ts +20 -34
- package/src/services/task-dispatch.ts +3 -0
- package/src/services/task-entity.ts +40 -203
- package/src/services/task-issue-link.ts +13 -20
- package/src/services/task-issue-weave.ts +12 -11
- package/src/services/task-lifecycle.ts +27 -31
- package/src/services/task-repo-cwd.ts +37 -0
- package/src/services/task-review-hold.ts +4 -17
- package/src/services/task-semantic-events.ts +13 -11
- package/src/services/task-state-reconcile.ts +8 -17
- package/src/services/task-validation.ts +2 -2
- package/src/services/team-templates.ts +12 -11
- package/src/services/team.ts +31 -98
- package/src/services/terminal-provider-exit.ts +6 -5
- package/src/services/timer-message-fire-chaos-worker.ts +7 -3
- package/src/services/timer-message-fire-outbox.ts +1 -1
- package/src/services/transient-agent-reaper.ts +25 -20
- package/src/services/turn-reconcile-audit.ts +9 -9
- package/src/services/user-onboarding.ts +8 -6
- package/src/services/user-profile.ts +6 -9
- package/src/services/work-finality.ts +16 -4
- package/src/services/workflow-auto-start.ts +26 -13
- package/src/services/workflow-caller.ts +61 -4
- package/src/services/workflow-child-proof-worker.ts +1 -1
- package/src/services/workflow-ci-main.ts +1 -1
- package/src/services/workflow-control-proof-worker.ts +1 -1
- package/src/services/workflow-coordinator.ts +8 -2
- package/src/services/workflow-decisions.ts +5 -5
- package/src/services/workflow-deferred-cleanup.ts +5 -3
- package/src/services/workflow-effect-driver.ts +42 -17
- package/src/services/workflow-effects.ts +58 -37
- package/src/services/workflow-land-notice.ts +10 -0
- package/src/services/workflow-pause-text.ts +43 -0
- package/src/services/workflow-pins.ts +7 -4
- package/src/services/workflow-reconcile.ts +14 -11
- package/src/services/workflow-resume-pins.ts +3 -3
- package/src/services/workflow-routing-defaults.ts +18 -0
- package/src/services/workflow-run-view.ts +6 -3
- package/src/services/workflow-run.test-fixture.ts +1 -1
- package/src/services/workflow-runs.ts +61 -33
- package/src/services/workflow-supervisor-state.ts +26 -1
- package/src/services/workflow-supervisor.ts +11 -6
- package/src/services/workspace-recovery.ts +4 -3
- package/src/settings/registry.ts +1 -2
- package/src/spawn-admission.ts +10 -2
- package/src/spawn-command.ts +4 -4
- package/src/spawn-models.ts +10 -12
- package/src/spawn-placement.ts +28 -10
- package/src/spawn-targets.ts +9 -9
- package/src/sse-agent-status.ts +15 -6
- package/src/sse.ts +49 -24
- package/src/startup-context-injection.ts +62 -57
- package/src/state-adoption/cd-cutover.ts +53 -7
- package/src/state-adoption/fleet-cutover.ts +35 -0
- package/src/state-adoption/fleet-plan.ts +36 -0
- package/src/state-adoption/index.ts +2 -2
- package/src/state-adoption/linux-plan.ts +2 -2
- package/src/state-adoption/linux.ts +2 -2
- package/src/state-adoption/macos-plan.ts +2 -2
- package/src/state-adoption/macos.ts +1 -1
- package/src/steward-handoff.ts +4 -3
- package/src/steward-policy-cleanup.ts +9 -8
- package/src/steward.ts +9 -8
- package/src/task-dispatch-live.ts +6 -3
- package/src/task-dispatcher.ts +3 -3
- package/src/teams-config-store.ts +4 -3
- package/src/token-db-write.ts +10 -0
- package/src/token-db.ts +2 -2
- package/src/token-usage-async.ts +2 -4
- package/src/user-awaiting-reply.ts +5 -5
- package/src/workspace-actions.ts +24 -29
- package/src/workspace-auto-merge.ts +14 -12
- package/src/workspace-changed-paths-client.ts +16 -5
- package/src/workspace-cleanup-stale.ts +30 -7
- package/src/workspace-command-settle.ts +26 -17
- package/src/workspace-config.ts +1 -1
- package/src/workspace-conflict-resolver.ts +9 -7
- package/src/workspace-dead-owner-recovery.ts +5 -4
- package/src/workspace-escalation.ts +12 -11
- package/src/workspace-human-escalation.ts +3 -3
- package/src/workspace-land-gate-watchdog.ts +3 -3
- package/src/workspace-land-refusal.ts +20 -0
- package/src/workspace-land-stopped.ts +1 -0
- package/src/workspace-merge.ts +10 -26
- package/src/workspace-nothing-to-land-notice.ts +2 -2
- package/src/workspace-orphans.ts +18 -37
- package/src/workspace-pr-completion.ts +10 -8
- package/src/workspace-rekey.ts +3 -3
- package/src/workspace-steward-failure.ts +2 -2
- package/src/workspace-steward-wake.ts +4 -4
- package/node_modules/@humwick/kernel/LICENSE +0 -167
- package/node_modules/@humwick/kernel/async-entity-persistence.ts +0 -344
- package/node_modules/@humwick/kernel/async-event-log.ts +0 -107
- package/node_modules/@humwick/kernel/automations.pilot.ts +0 -147
- package/node_modules/@humwick/kernel/config.ts +0 -111
- package/node_modules/@humwick/kernel/contract.ts +0 -572
- package/node_modules/@humwick/kernel/control-authz.ts +0 -281
- package/node_modules/@humwick/kernel/control.ts +0 -645
- package/node_modules/@humwick/kernel/effects.ts +0 -493
- package/node_modules/@humwick/kernel/event-log.ts +0 -319
- package/node_modules/@humwick/kernel/http-transport.ts +0 -384
- package/node_modules/@humwick/kernel/identity-grammar.ts +0 -20
- package/node_modules/@humwick/kernel/identity.ts +0 -248
- package/node_modules/@humwick/kernel/index.ts +0 -28
- package/node_modules/@humwick/kernel/kernel-persistence.ts +0 -181
- package/node_modules/@humwick/kernel/landing-incident.ts +0 -306
- package/node_modules/@humwick/kernel/landing.ts +0 -953
- package/node_modules/@humwick/kernel/manifest-validation.ts +0 -460
- package/node_modules/@humwick/kernel/mcp-transport.ts +0 -109
- package/node_modules/@humwick/kernel/message-authority-chaos-worker.ts +0 -200
- package/node_modules/@humwick/kernel/message-authority.ts +0 -281
- package/node_modules/@humwick/kernel/module-host.ts +0 -722
- package/node_modules/@humwick/kernel/openapi-init.ts +0 -14
- package/node_modules/@humwick/kernel/package.json +0 -39
- package/node_modules/@humwick/kernel/persistence-schema.ts +0 -248
- package/node_modules/@humwick/kernel/persistence.ts +0 -510
- package/node_modules/@humwick/kernel/registry.ts +0 -60
- package/node_modules/@humwick/kernel/sqlite-kernel-persistence.ts +0 -499
- package/node_modules/@humwick/kernel/sqlite-module-host.ts +0 -87
- package/node_modules/@humwick/kernel/timers-chaos-worker.ts +0 -186
- package/node_modules/@humwick/kernel/timers.pilot.ts +0 -1411
- package/node_modules/@humwick/kernel/workflow-activation.ts +0 -25
- package/node_modules/@humwick/kernel/workflow-backstop.ts +0 -40
- package/node_modules/@humwick/kernel/workflow-cancel-tree.ts +0 -20
- package/node_modules/@humwick/kernel/workflow-chaos-worker.ts +0 -213
- package/node_modules/@humwick/kernel/workflow-composition.ts +0 -231
- package/node_modules/@humwick/kernel/workflow-container.ts +0 -72
- package/node_modules/@humwick/kernel/workflow-control.test-fixture.ts +0 -42
- package/node_modules/@humwick/kernel/workflow-control.ts +0 -178
- package/node_modules/@humwick/kernel/workflow-definition.ts +0 -507
- package/node_modules/@humwick/kernel/workflow-dispatch.ts +0 -60
- package/node_modules/@humwick/kernel/workflow-foreach.ts +0 -167
- package/node_modules/@humwick/kernel/workflow-journal-codec.ts +0 -339
- package/node_modules/@humwick/kernel/workflow-journal.ts +0 -922
- package/node_modules/@humwick/kernel/workflow-lane.ts +0 -48
- package/node_modules/@humwick/kernel/workflow-lease-owner.ts +0 -60
- package/node_modules/@humwick/kernel/workflow-recovery.test-fixture.ts +0 -19
- package/node_modules/@humwick/kernel/workflow-runtime.ts +0 -938
- package/node_modules/@humwick/kernel/workflow-script.ts +0 -11
- package/node_modules/@humwick/kernel/workflow-state.ts +0 -299
- package/node_modules/@humwick/kernel/workflow-step-commit.ts +0 -195
- package/node_modules/@humwick/kernel/workflow-transitions.ts +0 -317
- package/node_modules/@humwick/kernel/workflow-values.ts +0 -153
- package/node_modules/@humwick/kernel/workflow.pilot.ts +0 -376
- package/node_modules/@humwick/offload/LICENSE +0 -167
- package/node_modules/@humwick/offload/README.md +0 -57
- package/node_modules/@humwick/offload/dist/async-runner.d.ts +0 -18
- package/node_modules/@humwick/offload/dist/async-runner.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/async-runner.js +0 -158
- package/node_modules/@humwick/offload/dist/async-runner.js.map +0 -1
- package/node_modules/@humwick/offload/dist/envelope.d.ts +0 -25
- package/node_modules/@humwick/offload/dist/envelope.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/envelope.js +0 -80
- package/node_modules/@humwick/offload/dist/envelope.js.map +0 -1
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts +0 -10
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.js +0 -59
- package/node_modules/@humwick/offload/dist/fixtures/worker-task.js.map +0 -1
- package/node_modules/@humwick/offload/dist/index.d.ts +0 -5
- package/node_modules/@humwick/offload/dist/index.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/index.js +0 -5
- package/node_modules/@humwick/offload/dist/index.js.map +0 -1
- package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts +0 -62
- package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/subprocess-runner.js +0 -295
- package/node_modules/@humwick/offload/dist/subprocess-runner.js.map +0 -1
- package/node_modules/@humwick/offload/dist/types.d.ts +0 -111
- package/node_modules/@humwick/offload/dist/types.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/types.js +0 -176
- package/node_modules/@humwick/offload/dist/types.js.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-pool.d.ts +0 -23
- package/node_modules/@humwick/offload/dist/worker-pool.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-pool.js +0 -435
- package/node_modules/@humwick/offload/dist/worker-pool.js.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-runtime.d.ts +0 -2
- package/node_modules/@humwick/offload/dist/worker-runtime.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/worker-runtime.js +0 -27
- package/node_modules/@humwick/offload/dist/worker-runtime.js.map +0 -1
- package/node_modules/@humwick/offload/dist/worker.d.ts +0 -5
- package/node_modules/@humwick/offload/dist/worker.d.ts.map +0 -1
- package/node_modules/@humwick/offload/dist/worker.js +0 -1
- package/node_modules/@humwick/offload/dist/worker.js.map +0 -1
- package/node_modules/@humwick/offload/package.json +0 -42
- package/node_modules/@humwick/offload/src/async-runner.ts +0 -170
- package/node_modules/@humwick/offload/src/envelope.ts +0 -92
- package/node_modules/@humwick/offload/src/fixtures/worker-task.ts +0 -49
- package/node_modules/@humwick/offload/src/index.ts +0 -4
- package/node_modules/@humwick/offload/src/subprocess-runner.ts +0 -334
- package/node_modules/@humwick/offload/src/types.ts +0 -235
- package/node_modules/@humwick/offload/src/worker-pool.ts +0 -463
- package/node_modules/@humwick/offload/src/worker-runtime.ts +0 -32
- package/node_modules/@humwick/offload/src/worker.ts +0 -5
- package/public/assets/agent-liveness-DyqxfB-t.js +0 -2
- package/public/assets/agent-profiles-BpI_jTxq.js +0 -2
- package/public/assets/index-B7ZerHLY.css +0 -2
- package/public/assets/index-BU3uWo2t.js +0 -15
- package/public/assets/projects-B_lmcqfO.js +0 -2
- package/public/assets/provider-display-DbLWpP3j.js +0 -2
- package/public/assets/run-card-CO_bguQf.js +0 -2
- package/public/assets/shipping-Bu8p1gEw.js +0 -2
- package/public/assets/store-BvtFdlGX.js +0 -9
- package/public/assets/use-project-list-B-T2Bnnn.js +0 -2
- package/public/assets/versioned-prompt-editor-Diu8BIaM.js +0 -8
- package/runner/src/agent-runner/http-liveness.ts +0 -85
- package/runner/src/gate-run-lease-probe.ts +0 -38
- package/src/db/claude-catalog-reconcile.ts +0 -27
- package/src/db/on-loop-write-transaction.ts +0 -34
- package/src/routing-model-aliases.ts +0 -21
package/src/lifecycle-manager.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
+
import { framed } from "./hub-metrics";
|
|
2
|
+
import { upsertManagedAgentStateAsync, updateManagedAgentStateAsync } from "./db/lifecycle-tail-async";
|
|
3
|
+
import { createActivityEventAsync } from "./db/activity-async";
|
|
4
|
+
import { createCommandAsync, prepareCommandWriteAsync, submitPreparedCommandAsync } from "./commands-write";
|
|
1
5
|
import { timePostBindPhase } from "./post-bind-startup";
|
|
2
6
|
import { requestAgentExitCleanup } from "./agent-exit-cleanup";
|
|
3
7
|
import { hostSpawnsDrained } from "./db/spawn-host-cap";
|
|
4
|
-
|
|
5
|
-
import { createCommandAsync, prepareCommandWriteAsync } from "./commands-write";
|
|
8
|
+
|
|
6
9
|
import { errMessage, fireAndForget, guardedInterval } from "@humwick/sdk";
|
|
7
10
|
import { agentProviderState } from "./provider-state";
|
|
8
|
-
import {
|
|
9
|
-
import { getManagedAgentState, listSpawnPolicies
|
|
11
|
+
import { getAgent, getDb, getOrchestrator, listOrchestrators, listWorkspaces, pendingOwnRelayRunIds } from "./db";
|
|
12
|
+
import { getManagedAgentState, listSpawnPolicies } from "./config-store"; import { managedSpawnReservationCurrent, restoreDrainedSpawnReservation } from "./managed-spawn-reservation";
|
|
10
13
|
import { emitRelayEvent } from "./events";
|
|
11
14
|
import { alwaysReloadTags, reconcileLifecycleContextPressure, requestAgentCompact } from "./lifecycle-context-pressure";
|
|
12
15
|
import { escalateManagedSpawnFailure, escalateOfflineOrchestrator } from "./managed-policy-escalation";
|
|
@@ -53,7 +56,8 @@ const DEFAULT_COMPACT_TARGET = 0.3;
|
|
|
53
56
|
const DEFAULT_MAX_TASKS_BEFORE_COMPACT = 10;
|
|
54
57
|
const DEFAULT_COMPACT_COOLDOWN_MS = 60_000;
|
|
55
58
|
|
|
56
|
-
|
|
59
|
+
type ManagedSpawnParamsBuilder = (...args: Parameters<typeof buildManagedSpawnParamsAsync>) => Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
60
|
+
interface LifecycleManagerOptions { tickMs?: number; now?: () => number; buildManagedSpawnParams?: ManagedSpawnParamsBuilder; }
|
|
57
61
|
|
|
58
62
|
// #1021 A1 — the outcome of trying to wake an on-demand policy via a queued message. A
|
|
59
63
|
// caller (e.g. wakeRepoSteward) must be able to tell "a live agent will handle this" from
|
|
@@ -66,7 +70,7 @@ export class LifecycleManager {
|
|
|
66
70
|
private timer?: Timer;
|
|
67
71
|
private readonly tickMs: number;
|
|
68
72
|
private readonly now: () => number;
|
|
69
|
-
private readonly buildManagedSpawnParams:
|
|
73
|
+
private readonly buildManagedSpawnParams: ManagedSpawnParamsBuilder; private readonly pendingSpawnPreparations = new Map<string, Promise<Command | null>>();
|
|
70
74
|
private readonly updateRestartPending = new Set<string>();
|
|
71
75
|
// #1761 — how many times a policy's stop has been forcefully re-issued while the process refused to
|
|
72
76
|
// confirm dead. Bounds the escalation so a wedged steward is retried, then given up to `failed`,
|
|
@@ -81,7 +85,7 @@ export class LifecycleManager {
|
|
|
81
85
|
|
|
82
86
|
start(): void {
|
|
83
87
|
if (this.timer) return;
|
|
84
|
-
const tick = () => timePostBindPhase("lifecycle.tick", () => this.tick());
|
|
88
|
+
const tick = framed("timer lifecycle", () => timePostBindPhase("lifecycle.tick", () => this.tick()));
|
|
85
89
|
void fireAndForget("[lifecycle] tick", tick);
|
|
86
90
|
this.timer = guardedInterval("[lifecycle] tick", this.tickMs, tick);
|
|
87
91
|
}
|
|
@@ -101,13 +105,13 @@ export class LifecycleManager {
|
|
|
101
105
|
// #2171 — validation instructions must come from the policy's launch host. The tick primes
|
|
102
106
|
// remote land-gate files once per host so synchronous spawn composition reads current cache.
|
|
103
107
|
await primeLandGatesForPolicies(policies);
|
|
104
|
-
const contextHandled = this.reconcileContextPressure(policies);
|
|
108
|
+
const contextHandled = (await this.reconcileContextPressure(policies));
|
|
105
109
|
for (const policy of policies) {
|
|
106
110
|
await this.reconcilePolicy(policy, contextHandled);
|
|
107
111
|
}
|
|
108
112
|
}
|
|
109
113
|
|
|
110
|
-
onMessageForPolicy(policyName: string):
|
|
114
|
+
async onMessageForPolicy(policyName: string): Promise<PolicySpawnOutcome> {
|
|
111
115
|
const policy = this.loadPolicies().find((item) => item.name === policyName);
|
|
112
116
|
if (!policy) return { woke: false, reason: `no spawn policy '${policyName}'` };
|
|
113
117
|
if (policy.mode !== "on-demand") return { woke: false, reason: `spawn policy '${policyName}' is not on-demand` };
|
|
@@ -138,8 +142,7 @@ export class LifecycleManager {
|
|
|
138
142
|
// FAILURE, not a success. Propagate it so callers don't stamp a false hand-off.
|
|
139
143
|
// Explicit wake (watchdog / auto-merge / cooldown re-wake): exempt from the respawn-rate backstop
|
|
140
144
|
// — its own STEWARD_HANDOFF_REWAKE_MAX + wake cooldown already bound it (#1745).
|
|
141
|
-
const command = this.spawnAgent(policy, "message-trigger", { enforceStewardRate: false });
|
|
142
|
-
if (command instanceof Promise) return this.policyWakeOutcome(policyName, command, state);
|
|
145
|
+
const command = (await this.spawnAgent(policy, "message-trigger", { enforceStewardRate: false }));
|
|
143
146
|
if (!command) return { woke: false, reason: `steward spawn failed for '${policyName}' (${this.policyWakeFailureReason(policyName, state)})` };
|
|
144
147
|
return { woke: true, via: "spawned", command };
|
|
145
148
|
}
|
|
@@ -185,13 +188,13 @@ export class LifecycleManager {
|
|
|
185
188
|
// drifted registration copies (epic #342). Only the orchestrator-report projection
|
|
186
189
|
// below still enters managed-running from the lifecycle manager.
|
|
187
190
|
|
|
188
|
-
onOrchestratorManagedAgentsReported(orchestratorId: string, agents: ManagedAgent[], exitedAgents: ManagedSessionExitDiagnostics[] = []): void {
|
|
191
|
+
async onOrchestratorManagedAgentsReported(orchestratorId: string, agents: ManagedAgent[], exitedAgents: ManagedSessionExitDiagnostics[] = []): Promise<void> {
|
|
189
192
|
for (const agent of agents) {
|
|
190
193
|
if (!agent.policyName || !agent.spawnRequestId) continue;
|
|
191
194
|
const state = getManagedAgentState(agent.policyName);
|
|
192
195
|
if (!state || state.spawnRequestId !== agent.spawnRequestId) continue;
|
|
193
196
|
// Same came-up-running core the registration transports use — one home, no drift.
|
|
194
|
-
markManagedAgentRunning(
|
|
197
|
+
(await markManagedAgentRunning(
|
|
195
198
|
{
|
|
196
199
|
policyName: agent.policyName,
|
|
197
200
|
spawnRequestId: agent.spawnRequestId,
|
|
@@ -201,7 +204,7 @@ export class LifecycleManager {
|
|
|
201
204
|
},
|
|
202
205
|
authContextFromSystem(),
|
|
203
206
|
{ now: this.now },
|
|
204
|
-
);
|
|
207
|
+
));
|
|
205
208
|
|
|
206
209
|
// Liveness reconciliation: the orchestrator just reported this process as
|
|
207
210
|
// running. If the relay record says offline, the two truths disagree
|
|
@@ -210,12 +213,12 @@ export class LifecycleManager {
|
|
|
210
213
|
if (reportedAgentId) {
|
|
211
214
|
const relayAgent = getAgent(reportedAgentId);
|
|
212
215
|
if (relayAgent && relayAgent.status === "offline") {
|
|
213
|
-
this.emitLivenessMismatch(
|
|
216
|
+
(await this.emitLivenessMismatch(
|
|
214
217
|
reportedAgentId,
|
|
215
218
|
agent.policyName,
|
|
216
219
|
agent.spawnRequestId,
|
|
217
220
|
"orchestrator reports the process running but relay marked it offline",
|
|
218
|
-
);
|
|
221
|
+
));
|
|
219
222
|
}
|
|
220
223
|
}
|
|
221
224
|
}
|
|
@@ -237,23 +240,23 @@ export class LifecycleManager {
|
|
|
237
240
|
(state.tmuxSession && agent.tmuxSession === state.tmuxSession) ||
|
|
238
241
|
(agent.policyName === policy.name && (!state.spawnRequestId || agent.spawnRequestId === state.spawnRequestId))
|
|
239
242
|
));
|
|
240
|
-
this.markPolicyFailure(policy, state, exited?.lastError ?? "orchestrator session disappeared", { exited });
|
|
243
|
+
(await this.markPolicyFailure(policy, state, exited?.lastError ?? "orchestrator session disappeared", { exited }));
|
|
241
244
|
} else if (state.status === "stopping" && !reported) {
|
|
242
|
-
const next =
|
|
245
|
+
const next = (await updateManagedAgentStateAsync(policy.name, {
|
|
243
246
|
status: "stopped",
|
|
244
247
|
agentId: undefined,
|
|
245
248
|
tmuxSession: undefined,
|
|
246
249
|
lastStopAt: this.now(),
|
|
247
|
-
});
|
|
248
|
-
if (next) this.emitState(next);
|
|
250
|
+
}));
|
|
251
|
+
if (next) (await this.emitState(next));
|
|
249
252
|
}
|
|
250
253
|
}
|
|
251
254
|
}
|
|
252
255
|
|
|
253
|
-
onAgentDisappeared(agentId: string): void {
|
|
256
|
+
async onAgentDisappeared(agentId: string): Promise<void> {
|
|
254
257
|
// Reconcile the agent's worktrees before policy handling — this runs for
|
|
255
258
|
// every agent (managed or not), so it must not depend on a policy match.
|
|
256
|
-
this.reconcileWorkspacesForAgent(agentId);
|
|
259
|
+
(await this.reconcileWorkspacesForAgent(agentId));
|
|
257
260
|
const policy = this.loadPolicies().find((item) => getManagedAgentState(item.name)?.agentId === agentId);
|
|
258
261
|
if (!policy) {
|
|
259
262
|
const agent = getAgent(agentId);
|
|
@@ -263,23 +266,23 @@ export class LifecycleManager {
|
|
|
263
266
|
const state = getManagedAgentState(policy.name);
|
|
264
267
|
if (!state) return;
|
|
265
268
|
if (state.status === "stopping") {
|
|
266
|
-
const next =
|
|
269
|
+
const next = (await updateManagedAgentStateAsync(policy.name, {
|
|
267
270
|
status: "stopped",
|
|
268
271
|
agentId: undefined,
|
|
269
272
|
tmuxSession: undefined,
|
|
270
273
|
lastStopAt: this.now(),
|
|
271
|
-
});
|
|
272
|
-
if (next) this.emitState(next);
|
|
274
|
+
}));
|
|
275
|
+
if (next) (await this.emitState(next));
|
|
273
276
|
return;
|
|
274
277
|
}
|
|
275
|
-
this.markPolicyFailure(policy, state, "agent disappeared");
|
|
278
|
+
(await this.markPolicyFailure(policy, state, "agent disappeared"));
|
|
276
279
|
if (isStewardPolicy(policy)) void retryStewardLandsAfterSlotFreed().catch(error => console.warn(`[steward] slot recovery failed: ${errMessage(error)}`));
|
|
277
280
|
}
|
|
278
281
|
|
|
279
|
-
onConfigChanged(namespace: string, key: string): void {
|
|
282
|
+
async onConfigChanged(namespace: string, key: string): Promise<void> {
|
|
280
283
|
if (namespace !== "spawn-policy") return;
|
|
281
284
|
const policy = this.loadPolicies().find((item) => item.name === key);
|
|
282
|
-
if (policy)
|
|
285
|
+
if (policy) await fireAndForget(`[lifecycle] reconcile ${policy.name}`, async () => (await this.reconcilePolicy(policy, (await this.reconcileContextPressure([policy])))));
|
|
283
286
|
}
|
|
284
287
|
|
|
285
288
|
onRelayUpdated(_newVersion: string): void {
|
|
@@ -288,9 +291,16 @@ export class LifecycleManager {
|
|
|
288
291
|
}
|
|
289
292
|
}
|
|
290
293
|
|
|
291
|
-
spawnAgent(policy: SpawnPolicy, reason = "reconcile", opts: { enforceStewardRate?: boolean } = {}):
|
|
294
|
+
spawnAgent(policy: SpawnPolicy, reason = "reconcile", opts: { enforceStewardRate?: boolean } = {}): Promise<Command | null> {
|
|
292
295
|
const pending = this.pendingSpawnPreparations.get(policy.name);
|
|
293
296
|
if (pending) return pending;
|
|
297
|
+
const preparation = this.prepareSpawn(policy, reason, opts);
|
|
298
|
+
this.pendingSpawnPreparations.set(policy.name, preparation);
|
|
299
|
+
void preparation.finally(() => { if (this.pendingSpawnPreparations.get(policy.name) === preparation) this.pendingSpawnPreparations.delete(policy.name); }).catch(() => {});
|
|
300
|
+
return preparation;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
private async prepareSpawn(policy: SpawnPolicy, reason: string, opts: { enforceStewardRate?: boolean }): Promise<Command | null> {
|
|
294
304
|
// #1745 — universal steward chokepoint: every spawn path (message-trigger, reconcile respawn,
|
|
295
305
|
// backoff-expired, always-on) funnels through here, so the kill-switch + per-repo cap gate lives
|
|
296
306
|
// here as the last line of defence. A denied steward spawn returns null WITHOUT churning managed
|
|
@@ -309,7 +319,7 @@ export class LifecycleManager {
|
|
|
309
319
|
}
|
|
310
320
|
}
|
|
311
321
|
// #2656 — a disabled provider parks the policy (visible reason, no backoff); a later tick resumes it.
|
|
312
|
-
const providerOff = managedPolicyProviderDisabledMessage(policy); if (providerOff) { const parked = parkManagedPolicyForDisabledProvider(policy, providerOff); if (parked) this.emitState(parked, `spawn skipped: ${providerOff}`); return null; }
|
|
322
|
+
const providerOff = managedPolicyProviderDisabledMessage(policy); if (providerOff) { const parked = (await parkManagedPolicyForDisabledProvider(policy, providerOff)); if (parked) (await this.emitState(parked, `spawn skipped: ${providerOff}`)); return null; }
|
|
313
323
|
const orch = getOrchestrator(policy.orchestratorId);
|
|
314
324
|
if (!orch || orch.status !== "online") {
|
|
315
325
|
const state = getManagedAgentState(policy.name) ?? {
|
|
@@ -321,45 +331,42 @@ export class LifecycleManager {
|
|
|
321
331
|
consecutiveFailures: 0,
|
|
322
332
|
updatedAt: this.now(),
|
|
323
333
|
};
|
|
324
|
-
this.markBackoff(policy, state, "orchestrator offline");
|
|
334
|
+
(await this.markBackoff(policy, state, "orchestrator offline"));
|
|
325
335
|
const next = getManagedAgentState(policy.name);
|
|
326
|
-
if (next) escalateOfflineOrchestrator(policy, next, orch);
|
|
336
|
+
if (next) void fireAndForget(`[lifecycle] escalate ${policy.name}`, () => escalateOfflineOrchestrator(policy, next, orch));
|
|
327
337
|
return null;
|
|
328
338
|
}
|
|
329
339
|
if (hostSpawnsDrained(orch.agentId)) return null;
|
|
330
340
|
const spawnRequestId = generateSpawnRequestId(); const policySnapshot = JSON.stringify(policy);
|
|
331
341
|
// Reserve `starting` before an async parameter build. A second queued wake can then observe
|
|
332
342
|
// the reservation instead of minting a second request id while provisioning resolves.
|
|
333
|
-
const priorState = getManagedAgentState(policy.name); const reserved =
|
|
334
|
-
this.emitState(reserved, `spawn: ${reason}`);
|
|
335
|
-
const releaseReservation = (error: unknown): void => { const current = getManagedAgentState(policy.name); if (current?.spawnRequestId === spawnRequestId) { if (current.status === "starting") this.markPolicyFailure(policy, current, errMessage(error)); } };
|
|
343
|
+
const priorState = getManagedAgentState(policy.name); const reserved = (await upsertManagedAgentStateAsync({ policyName: policy.name, status: "starting", orchestratorId: policy.orchestratorId, provider: policy.provider, spawnRequestId, lastSpawnAt: this.now(), restartCount: priorState?.restartCount ?? 0, consecutiveFailures: priorState?.consecutiveFailures ?? 0 }));
|
|
344
|
+
(await this.emitState(reserved, `spawn: ${reason}`));
|
|
345
|
+
const releaseReservation = async (error: unknown): Promise<void> => { const current = getManagedAgentState(policy.name); if (current?.spawnRequestId === spawnRequestId) { if (current.status === "starting") (await this.markPolicyFailure(policy, current, errMessage(error))); } };
|
|
336
346
|
let params: Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
337
347
|
try { params = this.buildManagedSpawnParams(policy, spawnRequestId, { createdBy: "lifecycle-manager", authority: SYSTEM_LAUNCH, requestedAt: this.now() }); }
|
|
338
|
-
catch (error) { releaseReservation(error); return null; }
|
|
348
|
+
catch (error) { (await releaseReservation(error)); return null; }
|
|
339
349
|
const finish = async (spawnParams: Record<string, unknown>): Promise<Command | null> => {
|
|
340
350
|
const prepared = await prepareCommandWriteAsync({ type: "agent.spawn", source: "system", target: orch.agentId,
|
|
341
351
|
correlationId: spawnRequestId, params: { ...spawnParams, reason } }, { hostCap: { exempt: "managed-policy" } });
|
|
342
352
|
// Re-check after all async launch preparation, including vault reads (#3574).
|
|
343
353
|
if (!managedSpawnReservationCurrent(policy, policySnapshot, spawnRequestId)) return null;
|
|
344
|
-
if (hostSpawnsDrained(orch.agentId)) { restoreDrainedSpawnReservation(policy, spawnRequestId, priorState); return null; }
|
|
345
|
-
const command =
|
|
354
|
+
if (hostSpawnsDrained(orch.agentId)) { (await restoreDrainedSpawnReservation(policy, spawnRequestId, priorState)); return null; }
|
|
355
|
+
const command = (await submitPreparedCommandAsync(prepared));
|
|
346
356
|
emitCommandEvent(command, "command.requested");
|
|
347
357
|
// #1745 — record the actual spawn so the respawn-rate backstop can bound a repeatedly-dying
|
|
348
358
|
// steward (registers, then exits on quota — never a spawn failure, so backoff never engages).
|
|
349
359
|
if (isStewardPolicy(policy)) noteStewardSpawn(policy.name, this.now());
|
|
350
360
|
return command;
|
|
351
361
|
};
|
|
352
|
-
|
|
353
|
-
this.pendingSpawnPreparations.set(policy.name, preparation);
|
|
354
|
-
void preparation.finally(() => { if (this.pendingSpawnPreparations.get(policy.name) === preparation) this.pendingSpawnPreparations.delete(policy.name); }).catch(() => { /* preparation never rejects: it catches above */ });
|
|
355
|
-
return preparation;
|
|
362
|
+
return Promise.resolve(params).then(finish).catch(async (error) => { await releaseReservation(error); return null; });
|
|
356
363
|
}
|
|
357
364
|
|
|
358
|
-
stopAgent(policy: SpawnPolicy, graceful = true, reason = "reconcile-stop"): Command | null {
|
|
365
|
+
async stopAgent(policy: SpawnPolicy, graceful = true, reason = "reconcile-stop"): Promise<Command | null> {
|
|
359
366
|
const orch = getOrchestrator(policy.orchestratorId);
|
|
360
367
|
if (!orch) return null;
|
|
361
368
|
const state = getManagedAgentState(policy.name);
|
|
362
|
-
const next =
|
|
369
|
+
const next = (await upsertManagedAgentStateAsync({
|
|
363
370
|
policyName: policy.name,
|
|
364
371
|
status: "stopping",
|
|
365
372
|
agentId: state?.agentId,
|
|
@@ -371,9 +378,9 @@ export class LifecycleManager {
|
|
|
371
378
|
lastStopAt: this.now(),
|
|
372
379
|
restartCount: state?.restartCount ?? 0,
|
|
373
380
|
consecutiveFailures: state?.consecutiveFailures ?? 0,
|
|
374
|
-
});
|
|
375
|
-
this.emitState(next, `stop: ${reason}`);
|
|
376
|
-
const command =
|
|
381
|
+
}));
|
|
382
|
+
(await this.emitState(next, `stop: ${reason}`));
|
|
383
|
+
const command = (await createCommandAsync({
|
|
377
384
|
type: "agent.shutdown",
|
|
378
385
|
source: "system",
|
|
379
386
|
target: orch.agentId,
|
|
@@ -391,7 +398,7 @@ export class LifecycleManager {
|
|
|
391
398
|
requestedBy: "lifecycle-manager",
|
|
392
399
|
requestedAt: this.now(),
|
|
393
400
|
},
|
|
394
|
-
});
|
|
401
|
+
}));
|
|
395
402
|
emitCommandEvent(command, "command.requested");
|
|
396
403
|
return command;
|
|
397
404
|
}
|
|
@@ -403,7 +410,7 @@ export class LifecycleManager {
|
|
|
403
410
|
const restartRequestId = generateSpawnRequestId();
|
|
404
411
|
const restartSpawn = buildManagedSpawnParamsAsync(policy, restartRequestId, { createdBy: "lifecycle-manager", authority: SYSTEM_LAUNCH, requestedAt: this.now(), ...(state?.agentId ? { identityAgentId: state.agentId } : {}) }); const finish = async (spawnParams: Record<string, unknown>): Promise<Command | null> => {
|
|
405
412
|
if (hostSpawnsDrained(orch.agentId)) return null;
|
|
406
|
-
const restarted =
|
|
413
|
+
const restarted = (await upsertManagedAgentStateAsync({
|
|
407
414
|
policyName: policy.name,
|
|
408
415
|
status: "stopping",
|
|
409
416
|
agentId: state?.agentId,
|
|
@@ -415,8 +422,8 @@ export class LifecycleManager {
|
|
|
415
422
|
lastStopAt: this.now(),
|
|
416
423
|
restartCount: (state?.restartCount ?? 0) + 1,
|
|
417
424
|
consecutiveFailures: state?.consecutiveFailures ?? 0,
|
|
418
|
-
});
|
|
419
|
-
this.emitState(restarted, `restart: ${reason}`);
|
|
425
|
+
}));
|
|
426
|
+
(await this.emitState(restarted, `restart: ${reason}`));
|
|
420
427
|
const command = await createCommandAsync({ type: "agent.restart",
|
|
421
428
|
source: "system",
|
|
422
429
|
target: orch.agentId,
|
|
@@ -450,7 +457,7 @@ export class LifecycleManager {
|
|
|
450
457
|
if (!state) {
|
|
451
458
|
if (enabled && policy.mode === "always-on") await this.spawnAgent(policy, "always-on");
|
|
452
459
|
else if (enabled && hasQueuedPolicyWork(policy.name)) await this.spawnAgent(policy, "message-trigger");
|
|
453
|
-
else this.ensureStoppedState(policy);
|
|
460
|
+
else (await this.ensureStoppedState(policy));
|
|
454
461
|
return;
|
|
455
462
|
}
|
|
456
463
|
|
|
@@ -459,7 +466,7 @@ export class LifecycleManager {
|
|
|
459
466
|
// #1021 A3 — a never-registered spawn has no exit diagnostics, so isFastFailStorm
|
|
460
467
|
// can never trip and it would back off/retry forever in silence. Flag it so the
|
|
461
468
|
// escalation fires once it has failed repeatedly.
|
|
462
|
-
this.markPolicyFailure(policy, state, "spawn timed out before registration", { registerTimeout: true });
|
|
469
|
+
(await this.markPolicyFailure(policy, state, "spawn timed out before registration", { registerTimeout: true }));
|
|
463
470
|
}
|
|
464
471
|
return;
|
|
465
472
|
}
|
|
@@ -480,13 +487,13 @@ export class LifecycleManager {
|
|
|
480
487
|
const unconfirmedDead = agent?.meta?.lifecycleAction === "kill-failed" || managedRunningAgentAlive(agent);
|
|
481
488
|
if (!unconfirmedDead) {
|
|
482
489
|
this.stopRetries.delete(policy.name);
|
|
483
|
-
const next =
|
|
490
|
+
const next = (await updateManagedAgentStateAsync(policy.name, {
|
|
484
491
|
status: "stopped",
|
|
485
492
|
agentId: undefined,
|
|
486
493
|
tmuxSession: undefined,
|
|
487
494
|
lastStopAt: this.now(),
|
|
488
|
-
});
|
|
489
|
-
if (next) this.emitState(next);
|
|
495
|
+
}));
|
|
496
|
+
if (next) (await this.emitState(next));
|
|
490
497
|
} else if (isStewardPolicy(policy) && agent && (agent.status === "busy" || pendingOwnRelayRunIds(agent, this.now()).length > 0 || this.holdsActiveWorkspaceClaim(agent.id))) {
|
|
491
498
|
// #1761 — DEFER the forceful escalation while the steward is genuinely WORKING. Within the
|
|
492
499
|
// STOP_TIMEOUT window a `stopping` policy still reads managedProcessActive, so
|
|
@@ -510,7 +517,7 @@ export class LifecycleManager {
|
|
|
510
517
|
const retries = (this.stopRetries.get(policy.name) ?? 0) + 1;
|
|
511
518
|
if (retries <= MAX_STEWARD_STOP_RETRIES) {
|
|
512
519
|
this.stopRetries.set(policy.name, retries);
|
|
513
|
-
this.stopAgent(policy, false, `stop-retry-${retries} (unconfirmed dead after ${Math.round(STOP_TIMEOUT_MS / 1000)}s)`);
|
|
520
|
+
(await this.stopAgent(policy, false, `stop-retry-${retries} (unconfirmed dead after ${Math.round(STOP_TIMEOUT_MS / 1000)}s)`));
|
|
514
521
|
} else {
|
|
515
522
|
// Budget exhausted — release the policy from `stopping` to `stopped` and let go of the
|
|
516
523
|
// handle. This is now SAFE (unlike pre-#1745, when clearing the handle let a duplicate
|
|
@@ -520,13 +527,13 @@ export class LifecycleManager {
|
|
|
520
527
|
// deliberately no-ops on `stopping`, so transition directly here.
|
|
521
528
|
console.warn(`[lifecycle] steward '${policy.name}' stop did not confirm dead after ${MAX_STEWARD_STOP_RETRIES} forceful attempts; releasing the handle (agent cap + orphan reaper now own the zombie)`);
|
|
522
529
|
this.stopRetries.delete(policy.name);
|
|
523
|
-
const next =
|
|
530
|
+
const next = (await updateManagedAgentStateAsync(policy.name, {
|
|
524
531
|
status: "stopped",
|
|
525
532
|
agentId: undefined,
|
|
526
533
|
tmuxSession: undefined,
|
|
527
534
|
lastStopAt: this.now(),
|
|
528
|
-
});
|
|
529
|
-
if (next) this.emitState(next, "stop-retry exhausted: releasing handle");
|
|
535
|
+
}));
|
|
536
|
+
if (next) (await this.emitState(next, "stop-retry exhausted: releasing handle"));
|
|
530
537
|
}
|
|
531
538
|
}
|
|
532
539
|
}
|
|
@@ -539,28 +546,28 @@ export class LifecycleManager {
|
|
|
539
546
|
// stopping wedge (if any) gets its full MAX_STEWARD_STOP_RETRIES (#1761).
|
|
540
547
|
this.stopRetries.delete(policy.name);
|
|
541
548
|
if (!enabled) {
|
|
542
|
-
this.stopAgent(policy, true, "policy-disabled");
|
|
549
|
+
(await this.stopAgent(policy, true, "policy-disabled"));
|
|
543
550
|
return;
|
|
544
551
|
}
|
|
545
552
|
if (!managedRunningAgentAlive(agent)) {
|
|
546
|
-
this.markPolicyFailure(policy, state, agentTerminalFailureMessage(agent) ?? "agent offline");
|
|
553
|
+
(await this.markPolicyFailure(policy, state, agentTerminalFailureMessage(agent) ?? "agent offline"));
|
|
547
554
|
return;
|
|
548
555
|
}
|
|
549
|
-
this.resetBackoffAfterHealthyRun(policy, state);
|
|
556
|
+
(await this.resetBackoffAfterHealthyRun(policy, state));
|
|
550
557
|
if (policy.mode === "on-demand" && this.isIdle(policy, state)) {
|
|
551
|
-
this.stopAgent(policy, true, "idle-timeout");
|
|
558
|
+
(await this.stopAgent(policy, true, "idle-timeout"));
|
|
552
559
|
return;
|
|
553
560
|
}
|
|
554
561
|
if (contextHandled.has(agent.id)) return;
|
|
555
562
|
if (this.shouldCompact(agent)) {
|
|
556
|
-
requestAgentCompact({
|
|
563
|
+
(await requestAgentCompact({
|
|
557
564
|
agent,
|
|
558
565
|
reason: "context-threshold",
|
|
559
566
|
policyName: policy.name,
|
|
560
567
|
alwaysReload: alwaysReloadTags(agent.tags),
|
|
561
568
|
now: this.now,
|
|
562
569
|
hasActiveCommand: (target, type) => this.hasActiveCommand(target, type),
|
|
563
|
-
});
|
|
570
|
+
}));
|
|
564
571
|
return;
|
|
565
572
|
}
|
|
566
573
|
if (policy.scheduledDailyRestart && this.dailyRestartDue(policy, state) && this.isIdle(policy, state, 3600)) {
|
|
@@ -588,60 +595,60 @@ export class LifecycleManager {
|
|
|
588
595
|
}
|
|
589
596
|
}
|
|
590
597
|
|
|
591
|
-
private reconcileContextPressure(policies: SpawnPolicy[]): Set<string
|
|
592
|
-
return reconcileLifecycleContextPressure({
|
|
598
|
+
private async reconcileContextPressure(policies: SpawnPolicy[]): Promise<Set<string>> {
|
|
599
|
+
return (await reconcileLifecycleContextPressure({
|
|
593
600
|
policies,
|
|
594
601
|
now: this.now,
|
|
595
602
|
hasActiveCommand: (target, type) => this.hasActiveCommand(target, type),
|
|
596
|
-
});
|
|
603
|
+
}));
|
|
597
604
|
}
|
|
598
605
|
|
|
599
|
-
private ensureStoppedState(policy: SpawnPolicy): void {
|
|
600
|
-
const state =
|
|
606
|
+
private async ensureStoppedState(policy: SpawnPolicy): Promise<void> {
|
|
607
|
+
const state = (await upsertManagedAgentStateAsync({
|
|
601
608
|
policyName: policy.name,
|
|
602
609
|
status: "stopped",
|
|
603
610
|
orchestratorId: policy.orchestratorId,
|
|
604
611
|
provider: policy.provider,
|
|
605
|
-
});
|
|
606
|
-
this.emitState(state);
|
|
612
|
+
}));
|
|
613
|
+
(await this.emitState(state));
|
|
607
614
|
}
|
|
608
615
|
|
|
609
|
-
private markPolicyFailure(
|
|
616
|
+
private async markPolicyFailure(
|
|
610
617
|
policy: SpawnPolicy,
|
|
611
618
|
state: ManagedAgentState,
|
|
612
619
|
error: string,
|
|
613
620
|
opts: { exited?: ManagedSessionExitDiagnostics; registerTimeout?: boolean } = {},
|
|
614
|
-
): void {
|
|
621
|
+
): Promise<void> {
|
|
615
622
|
if (state.status === "stopping") return;
|
|
616
623
|
// Read the terminal reason from the adapter-surfaced typed provider state rather
|
|
617
624
|
// than re-parsing raw provider log text (#745 / #725 §4.4 leak #13).
|
|
618
625
|
const agentId = state.agentId || opts.exited?.agentId;
|
|
619
626
|
const modelUnavailable = agentId ? agentTerminalFailureMessage(getAgent(agentId)) : null;
|
|
620
627
|
if (modelUnavailable) {
|
|
621
|
-
this.markFailed(policy, state, modelUnavailable);
|
|
628
|
+
(await this.markFailed(policy, state, modelUnavailable));
|
|
622
629
|
return;
|
|
623
630
|
}
|
|
624
631
|
const failures = state.consecutiveFailures + 1;
|
|
625
632
|
if (isFastFailStorm(failures, opts.exited)) {
|
|
626
|
-
this.markFailed(policy, state, error);
|
|
633
|
+
(await this.markFailed(policy, state, error));
|
|
627
634
|
return;
|
|
628
635
|
}
|
|
629
|
-
this.markBackoff(policy, state, error, failures);
|
|
636
|
+
(await this.markBackoff(policy, state, error, failures));
|
|
630
637
|
// #1021 A3 — a register-never spawn never reaches markFailed (no exit diagnostics), so
|
|
631
638
|
// without this its escalation would never fire. Escalate once it has failed repeatedly.
|
|
632
639
|
if (isStewardPolicy(policy) && failures === MAX_FAST_FAILURES) {
|
|
633
640
|
const next = getManagedAgentState(policy.name);
|
|
634
|
-
if (next) escalateManagedSpawnFailure(policy, next, { phase: "spawn-backoff", error });
|
|
641
|
+
if (next) void fireAndForget(`[lifecycle] escalate ${policy.name}`, () => escalateManagedSpawnFailure(policy, next, { phase: "spawn-backoff", error }));
|
|
635
642
|
} else if (!isStewardPolicy(policy) && opts.registerTimeout && failures >= MAX_FAST_FAILURES) {
|
|
636
643
|
const next = getManagedAgentState(policy.name);
|
|
637
|
-
if (next) escalateManagedSpawnFailure(policy, next, { phase: "register-timeout", error });
|
|
644
|
+
if (next) void fireAndForget(`[lifecycle] escalate ${policy.name}`, () => escalateManagedSpawnFailure(policy, next, { phase: "register-timeout", error }));
|
|
638
645
|
}
|
|
639
646
|
}
|
|
640
647
|
|
|
641
|
-
private markBackoff(policy: SpawnPolicy, state: ManagedAgentState, error: string, failures = state.consecutiveFailures + 1): void {
|
|
648
|
+
private async markBackoff(policy: SpawnPolicy, state: ManagedAgentState, error: string, failures = state.consecutiveFailures + 1): Promise<void> {
|
|
642
649
|
if (state.status === "stopping") return;
|
|
643
650
|
const delay = this.backoffDelay(policy, state);
|
|
644
|
-
const next =
|
|
651
|
+
const next = (await upsertManagedAgentStateAsync({
|
|
645
652
|
policyName: policy.name,
|
|
646
653
|
status: "backoff",
|
|
647
654
|
agentId: undefined,
|
|
@@ -654,13 +661,13 @@ export class LifecycleManager {
|
|
|
654
661
|
consecutiveFailures: failures,
|
|
655
662
|
backoffUntil: this.now() + delay * 1000,
|
|
656
663
|
lastError: error,
|
|
657
|
-
});
|
|
658
|
-
this.emitState(next);
|
|
664
|
+
}));
|
|
665
|
+
(await this.emitState(next));
|
|
659
666
|
}
|
|
660
667
|
|
|
661
|
-
private markFailed(policy: SpawnPolicy, state: ManagedAgentState, error: string): void {
|
|
668
|
+
private async markFailed(policy: SpawnPolicy, state: ManagedAgentState, error: string): Promise<void> {
|
|
662
669
|
const failures = state.consecutiveFailures + 1;
|
|
663
|
-
const next =
|
|
670
|
+
const next = (await upsertManagedAgentStateAsync({
|
|
664
671
|
policyName: policy.name,
|
|
665
672
|
status: "failed",
|
|
666
673
|
agentId: undefined,
|
|
@@ -673,10 +680,10 @@ export class LifecycleManager {
|
|
|
673
680
|
consecutiveFailures: failures,
|
|
674
681
|
backoffUntil: isStewardPolicy(policy) ? this.now() + this.backoffDelay(policy, state) * 1000 : undefined,
|
|
675
682
|
lastError: error,
|
|
676
|
-
});
|
|
677
|
-
this.emitState(next);
|
|
683
|
+
}));
|
|
684
|
+
(await this.emitState(next));
|
|
678
685
|
// #1021 A3 — failed policies require an explicit wake/operator action. Surface the failure.
|
|
679
|
-
escalateManagedSpawnFailure(policy, next, { phase: "failed", error });
|
|
686
|
+
void fireAndForget(`[lifecycle] escalate ${policy.name}`, () => escalateManagedSpawnFailure(policy, next, { phase: "failed", error }));
|
|
680
687
|
}
|
|
681
688
|
|
|
682
689
|
private backoffDelay(policy: SpawnPolicy, state: ManagedAgentState | null): number {
|
|
@@ -686,16 +693,16 @@ export class LifecycleManager {
|
|
|
686
693
|
return schedule[index]!;
|
|
687
694
|
}
|
|
688
695
|
|
|
689
|
-
private resetBackoffAfterHealthyRun(policy: SpawnPolicy, state: ManagedAgentState): void {
|
|
696
|
+
private async resetBackoffAfterHealthyRun(policy: SpawnPolicy, state: ManagedAgentState): Promise<void> {
|
|
690
697
|
if (state.consecutiveFailures === 0) return;
|
|
691
698
|
const healthySince = state.healthySince ?? state.lastSpawnAt;
|
|
692
699
|
if (!healthySince || this.now() - healthySince < policy.backoff.resetAfterSeconds * 1000) return;
|
|
693
|
-
const next =
|
|
700
|
+
const next = (await updateManagedAgentStateAsync(policy.name, {
|
|
694
701
|
consecutiveFailures: 0,
|
|
695
702
|
backoffUntil: undefined,
|
|
696
703
|
lastError: undefined,
|
|
697
|
-
});
|
|
698
|
-
if (next) this.emitState(next);
|
|
704
|
+
}));
|
|
705
|
+
if (next) (await this.emitState(next));
|
|
699
706
|
}
|
|
700
707
|
|
|
701
708
|
private dailyRestartDue(_policy: SpawnPolicy, state: ManagedAgentState): boolean {
|
|
@@ -759,10 +766,10 @@ export class LifecycleManager {
|
|
|
759
766
|
// emitManagedState (src/services/managed-running.ts) so the registration service
|
|
760
767
|
// and this lifecycle reconciler emit identically (epic #342). We track the prior
|
|
761
768
|
// status per policy here only to compute the from→to for the transition row.
|
|
762
|
-
private emitState(state: ManagedAgentState, reason?: string): void {
|
|
769
|
+
private async emitState(state: ManagedAgentState, reason?: string): Promise<void> {
|
|
763
770
|
const previous = this.lastStatusByPolicy.get(state.policyName);
|
|
764
771
|
this.lastStatusByPolicy.set(state.policyName, state.status);
|
|
765
|
-
emitManagedState(state, previous, reason, this.now);
|
|
772
|
+
(await emitManagedState(state, previous, reason, this.now));
|
|
766
773
|
if (state.status === "stopped" && state.lastStopAt && this.loadPolicies().some(policy => policy.name === state.policyName && isStewardPolicy(policy))) {
|
|
767
774
|
void retryStewardLandsAfterSlotFreed().catch(error => console.warn(`[steward] slot recovery failed: ${errMessage(error)}`));
|
|
768
775
|
}
|
|
@@ -773,7 +780,7 @@ export class LifecycleManager {
|
|
|
773
780
|
// event (banner) and a persisted activity event (timeline). Observability only —
|
|
774
781
|
// it does not mutate agent status, since a live process may still have a dead
|
|
775
782
|
// relay connection.
|
|
776
|
-
private emitLivenessMismatch(agentId: string, policyName: string | undefined, spawnRequestId: string | undefined, detail: string): void {
|
|
783
|
+
private async emitLivenessMismatch(agentId: string, policyName: string | undefined, spawnRequestId: string | undefined, detail: string): Promise<void> {
|
|
777
784
|
emitRelayEvent({
|
|
778
785
|
type: "liveness.mismatch",
|
|
779
786
|
source: "lifecycle-manager",
|
|
@@ -782,7 +789,7 @@ export class LifecycleManager {
|
|
|
782
789
|
});
|
|
783
790
|
// #1912 §4 retained: orchestrator-report reconciliation is a synchronous projection loop;
|
|
784
791
|
// changing only its audit to a detached promise would make dashboard event order ambiguous.
|
|
785
|
-
|
|
792
|
+
(await createActivityEventAsync({
|
|
786
793
|
clientId: `liveness-mismatch-${agentId}-${this.now()}-${++this.transitionSeq}`,
|
|
787
794
|
kind: "state",
|
|
788
795
|
title: `Liveness mismatch: ${agentId}`,
|
|
@@ -791,11 +798,11 @@ export class LifecycleManager {
|
|
|
791
798
|
view: "managed-agents",
|
|
792
799
|
agentId,
|
|
793
800
|
metadata: { source: "lifecycle-manager", policyName, spawnRequestId, mismatch: true, detail },
|
|
794
|
-
});
|
|
801
|
+
}));
|
|
795
802
|
}
|
|
796
803
|
|
|
797
|
-
private reconcileWorkspacesForAgent(agentId: string): void {
|
|
798
|
-
requestAgentExitCleanup(agentId);
|
|
804
|
+
private async reconcileWorkspacesForAgent(agentId: string): Promise<void> {
|
|
805
|
+
(await requestAgentExitCleanup(agentId));
|
|
799
806
|
}
|
|
800
807
|
|
|
801
808
|
}
|