@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
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { runnerRuntimeTokenEnvAsync, SUCCESSOR_LAUNCH, type RunnerRuntimeTokenInput } from "../runtime-tokens";
|
|
2
|
+
import { updateManagedAgentStateAsync } from "../db/lifecycle-tail-async";
|
|
1
3
|
import { createCommandAsync } from "../commands-write";
|
|
2
4
|
import { restartHarnessSubagents } from "./harness-subagents";
|
|
3
5
|
import { RELAY_TOKEN_HEADER, isRecord, isSpawnProvider, stringValue } from "@humwick/sdk";
|
|
@@ -5,7 +7,7 @@ import { recordedLaunchMode } from "../launch-mode";
|
|
|
5
7
|
import type { ProviderEffort } from "@humwick/sdk/provider-catalog";
|
|
6
8
|
import { listCommands } from "../commands-db";
|
|
7
9
|
import { isTrustedOrchestratorApiUrl, relayToken } from "../config";
|
|
8
|
-
import { getAgentProfile, getManagedAgentState, getSpawnPolicy
|
|
10
|
+
import { getAgentProfile, getManagedAgentState, getSpawnPolicy } from "../config-store";
|
|
9
11
|
import { getMergeLease, getOrchestrator, listWorkspaces, ownedIsolatedWorkspace, ValidationError, withResolvedProvisioning, withResolvedProvisioningAsync, workflowRunIdOf } from "../db";
|
|
10
12
|
import { resolveProjectForCanonicalCwd } from "./project";
|
|
11
13
|
import { isProvenStewardAgent, stewardWorktreeCwdPrefixes } from "../steward-spawn-guard";
|
|
@@ -16,7 +18,6 @@ import { resolveWhoamiRole } from "../mcp/identity-projection";
|
|
|
16
18
|
import { listManagedOrchestratorsForAgent } from "../orchestrator-lookup";
|
|
17
19
|
import { applyDefaultSharedMcp } from "../shared-mcp";
|
|
18
20
|
import { buildSpawnCommand, generateSpawnRequestId, resolveSpawnModelParams, resolveSpawnModelParamsAsync } from "../spawn-command";
|
|
19
|
-
import { SUCCESSOR_LAUNCH, runnerRuntimeTokenEnv } from "../runtime-tokens";
|
|
20
21
|
import { restartEffortState } from "./self-effort";
|
|
21
22
|
// #2033 — from isolated-workspace-placement.ts, NOT ./spawn-identity: that module also exports
|
|
22
23
|
// buildProspectiveSpawnIdentity, which imports mcp/identity.ts → self-resume.ts → restart-spawn.ts,
|
|
@@ -27,7 +28,7 @@ import { restartInstructionParamsForAgent, restartInstructionParamsForAgentAsync
|
|
|
27
28
|
import { launchedProjectRole, projectRoleRestartError, refuseSyncProjectRoleRestart, restartProjectRole } from "./restart-project-role";
|
|
28
29
|
import { authContextFromSystem } from "./auth-context";
|
|
29
30
|
import { markManagedAgentRunning } from "./managed-running";
|
|
30
|
-
import type { AgentCard, AgentProfile, Command, Orchestrator, SpawnApprovalMode } from "../types";
|
|
31
|
+
import type { AgentCard, AgentProfile, SpawnPolicy, Command, Orchestrator, SpawnApprovalMode } from "../types";
|
|
31
32
|
|
|
32
33
|
export type SelfRestartReason = "upgrade" | "token-remint" | "manual" | "reset-unconfirmed";
|
|
33
34
|
type RestartOptions = { resumeId?: string; continuation?: string; generation?: number; reason?: string };
|
|
@@ -65,13 +66,13 @@ function resumeWorkspaceForRestart(agent: AgentCard): { branch: string; mode: "a
|
|
|
65
66
|
* self-restart. The token is minted here from the CURRENT profile, never cloned from the old
|
|
66
67
|
* runtime token, so changed scopes/tool groups take effect on the successor.
|
|
67
68
|
*/
|
|
68
|
-
function buildRestartSpawnParamsForAgent(
|
|
69
|
+
async function buildRestartSpawnParamsForAgent(
|
|
69
70
|
agent: AgentCard,
|
|
70
71
|
orchestrator: Orchestrator | null,
|
|
71
72
|
policyName?: string,
|
|
72
73
|
predecessorSpawnRequestId?: string,
|
|
73
74
|
opts: RestartOptions = {},
|
|
74
|
-
): Record<string, unknown> | undefined {
|
|
75
|
+
): Promise<Record<string, unknown> | undefined> {
|
|
75
76
|
if (!orchestrator) return undefined;
|
|
76
77
|
refuseSyncProjectRoleRestart(agent);
|
|
77
78
|
const requestId = generateSpawnRequestId();
|
|
@@ -110,36 +111,15 @@ function buildRestartSpawnParamsForAgent(
|
|
|
110
111
|
resumeWorktreePath: restartResumeWorkspace?.worktreePath,
|
|
111
112
|
});
|
|
112
113
|
const params = {
|
|
113
|
-
...buildManagedSpawnParams(relaunchPolicy(policy.value, relaunch.effort), requestId, { createdBy: requestedBy, authority: SUCCESSOR_LAUNCH, identityAgentId: agent.id }),
|
|
114
|
+
...(await buildManagedSpawnParams(relaunchPolicy(policy.value, relaunch.effort), requestId, { createdBy: requestedBy, authority: SUCCESSOR_LAUNCH, identityAgentId: agent.id })),
|
|
114
115
|
...relaunch.carried,
|
|
115
116
|
agentId: agent.id,
|
|
116
117
|
requestedBy,
|
|
117
118
|
// Override the policy builder's normal mint so stable team/project bindings are also
|
|
118
119
|
// carried by the fresh token, not merely preserved incidentally on the agent row.
|
|
119
|
-
env:
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
cwd: policy.value.cwd,
|
|
123
|
-
provider: policy.value.provider,
|
|
124
|
-
label: policy.value.label,
|
|
125
|
-
policyName: policy.value.name,
|
|
126
|
-
spawnRequestId: requestId,
|
|
127
|
-
createdBy: requestedBy,
|
|
128
|
-
profile: policy.value.profile || undefined,
|
|
129
|
-
// #2245 — the successor's posture comes from the POLICY (server config, unforgeable), the
|
|
130
|
-
// same value `buildManagedSpawnParams` launches it with; stamp it into the signed constraints.
|
|
131
|
-
approvalMode: policy.value.permissionMode,
|
|
132
|
-
...(agent.teamId ? { teamId: agent.teamId } : {}),
|
|
133
|
-
...(projectId ? { projectId } : {}),
|
|
134
|
-
...([...stewardExtraCwdPrefixes, ...isolatedExtraCwdPrefixes].length
|
|
135
|
-
? { extraCwdPrefixes: [...stewardExtraCwdPrefixes, ...isolatedExtraCwdPrefixes] }
|
|
136
|
-
: {}),
|
|
137
|
-
}),
|
|
138
|
-
...(opts.continuation ? { prompt: opts.continuation } : {}),
|
|
139
|
-
...(restartResumeWorkspace ? { resumeWorkspace: restartResumeWorkspace } : {}),
|
|
140
|
-
// F5 — carry the self-restart generation marker on BOTH successor spawns (policy and
|
|
141
|
-
// dashboard/non-policy), so the audit lineage is symmetric regardless of branch.
|
|
142
|
-
...(opts.generation ? { extra: { selfRestart: { generation: opts.generation, reason: opts.reason } } } : {}),
|
|
120
|
+
env: (await runnerRuntimeTokenEnvAsync(managedRestartTokenInput(agent, policy.value, requestId, requestedBy, projectId,
|
|
121
|
+
[...stewardExtraCwdPrefixes, ...isolatedExtraCwdPrefixes]))),
|
|
122
|
+
...managedRestartOptions(opts, restartResumeWorkspace),
|
|
143
123
|
};
|
|
144
124
|
return opts.resumeId ? withResumeParams(params, opts.resumeId, agent.id) : params;
|
|
145
125
|
}
|
|
@@ -147,7 +127,7 @@ function buildRestartSpawnParamsForAgent(
|
|
|
147
127
|
const provider = stringValue(agent.meta?.provider);
|
|
148
128
|
if (!isSpawnProvider(provider)) return undefined;
|
|
149
129
|
// #2033 review — fold in #2041: for an ISOLATED agent, `agent.meta.cwd` is caller-writable
|
|
150
|
-
// (not an AUTHZ_META_KEY) and this `cwd` feeds `
|
|
130
|
+
// (not an AUTHZ_META_KEY) and this `cwd` feeds `runnerRuntimeTokenEnvAsync({cwd})` below as the
|
|
151
131
|
// successor token's cwdPrefixes[0] — a forged value would mint a token authorizing an arbitrary
|
|
152
132
|
// path. Prefer the same unforgeable orchestrator-written DB row (`ownedIsolatedWorkspace`) G1
|
|
153
133
|
// sources the resume worktree from; it's undefined for a non-isolated (shared/coordinator) agent
|
|
@@ -160,7 +140,7 @@ function buildRestartSpawnParamsForAgent(
|
|
|
160
140
|
const resolvedProfile = withResolvedProvisioning(profileName ? getAgentProfile(profileName)?.value : undefined, provider);
|
|
161
141
|
const agentProfile = resolvedProfile ? applyDefaultSharedMcp(resolvedProfile) : undefined;
|
|
162
142
|
const workspaceMode = stringValue(agent.meta?.workspaceMode) ?? "inherit";
|
|
163
|
-
const resolvedModel = resolveSpawnModelParams(provider, model, effort, { modelSource: "runtime"
|
|
143
|
+
const resolvedModel = resolveSpawnModelParams(provider, model, effort, { modelSource: "runtime" });
|
|
164
144
|
const projectedInstructions = restartInstructionParamsForAgent(agent, { spawnRequestId: predecessorSpawnRequestId, cwd }) ?? {};
|
|
165
145
|
// #1598 — canonicalize so a worktree/subdir cwd binds to its owning checkout's project.
|
|
166
146
|
const projectId = resolveProjectForCanonicalCwd(cwd).project?.id;
|
|
@@ -175,7 +155,7 @@ function buildRestartSpawnParamsForAgent(
|
|
|
175
155
|
cwd,
|
|
176
156
|
orchestrator.baseDir,
|
|
177
157
|
);
|
|
178
|
-
|
|
158
|
+
const options = {
|
|
179
159
|
provider,
|
|
180
160
|
modelParams: resolvedModel,
|
|
181
161
|
cwd,
|
|
@@ -185,7 +165,10 @@ function buildRestartSpawnParamsForAgent(
|
|
|
185
165
|
policyName: policyName || undefined,
|
|
186
166
|
spawnRequestId: requestId,
|
|
187
167
|
requestedBy,
|
|
188
|
-
}
|
|
168
|
+
};
|
|
169
|
+
const tokenContext = { orchestratorId: orchestrator.id, projectId, extraCwdPrefixes: stewardExtraCwdPrefixes };
|
|
170
|
+
return buildRestartSpawnCommand(agent, predecessorSpawnRequestId, agentProfile, projectedInstructions, opts, options, tokenContext,
|
|
171
|
+
(await runnerRuntimeTokenEnvAsync(restartTokenInput(agent, options, tokenContext))));
|
|
189
172
|
}
|
|
190
173
|
|
|
191
174
|
/** Worker-safe restart command construction used by HTTP/orchestrator/self-restart flows. */
|
|
@@ -233,14 +216,8 @@ async function buildRestartSpawnParamsForAgentAsync(
|
|
|
233
216
|
const params = {
|
|
234
217
|
...await buildManagedSpawnParamsAsync(relaunchPolicy(policy.value, relaunch.effort), requestId, { createdBy: requestedBy, authority: SUCCESSOR_LAUNCH, identityAgentId: agent.id, gitRepoRoot }),
|
|
235
218
|
...relaunch.carried, agentId: agent.id, requestedBy,
|
|
236
|
-
env:
|
|
237
|
-
|
|
238
|
-
createdBy: requestedBy, profile: policy.value.profile || undefined, ...(agent.teamId ? { teamId: agent.teamId } : {}),
|
|
239
|
-
approvalMode: policy.value.permissionMode,
|
|
240
|
-
...(projectId ? { projectId } : {}), ...(combinedExtraCwdPrefixes.length ? { extraCwdPrefixes: combinedExtraCwdPrefixes } : {}), }),
|
|
241
|
-
...(opts.continuation ? { prompt: opts.continuation } : {}),
|
|
242
|
-
...(restartResumeWorkspace ? { resumeWorkspace: restartResumeWorkspace } : {}),
|
|
243
|
-
...(opts.generation ? { extra: { selfRestart: { generation: opts.generation, reason: opts.reason } } } : {}),
|
|
219
|
+
env: await runnerRuntimeTokenEnvAsync(managedRestartTokenInput(agent, policy.value, requestId, requestedBy, projectId, combinedExtraCwdPrefixes)),
|
|
220
|
+
...managedRestartOptions(opts, restartResumeWorkspace),
|
|
244
221
|
};
|
|
245
222
|
return opts.resumeId ? withResumeParams(params, opts.resumeId, agent.id) : params;
|
|
246
223
|
}
|
|
@@ -257,15 +234,55 @@ async function buildRestartSpawnParamsForAgentAsync(
|
|
|
257
234
|
const profileName = role ? role.profileName : stringValue(agent.meta?.profile);
|
|
258
235
|
const resolvedProfile = role ? undefined : await withResolvedProvisioningAsync(profileName ? getAgentProfile(profileName)?.value : undefined, provider);
|
|
259
236
|
const agentProfile = role?.agentProfile ?? (resolvedProfile ? applyDefaultSharedMcp(resolvedProfile) : undefined);
|
|
260
|
-
const resolvedModel = await resolveSpawnModelParamsAsync(provider, model, effort, { modelSource: "runtime"
|
|
237
|
+
const resolvedModel = await resolveSpawnModelParamsAsync(provider, model, effort, { modelSource: "runtime" });
|
|
261
238
|
const projectedInstructions = await restartInstructionParamsForAgentAsync(agent, { spawnRequestId: predecessorSpawnRequestId, cwd, ...(role ? { profile: role.agentProfile } : {}) }) ?? {};
|
|
262
239
|
const projectId = resolveProjectForCanonicalCwd(cwd).project?.id;
|
|
263
240
|
const stewardExtraCwdPrefixes = stewardWorktreeCwdPrefixes(isProvenStewardAgent(agent.id, policyName), cwd, orchestrator.baseDir);
|
|
264
|
-
|
|
241
|
+
const options = {
|
|
265
242
|
provider, modelParams: resolvedModel, cwd, workspaceMode, profile: profileName || undefined,
|
|
266
243
|
...relaunch.carried, ...role?.spawn, policyName: policyName || undefined, spawnRequestId: requestId,
|
|
267
244
|
requestedBy,
|
|
268
|
-
}
|
|
245
|
+
};
|
|
246
|
+
const tokenContext = { orchestratorId: orchestrator.id, projectId, extraCwdPrefixes: stewardExtraCwdPrefixes };
|
|
247
|
+
return buildRestartSpawnCommand(agent, predecessorSpawnRequestId, agentProfile, projectedInstructions, opts, options, tokenContext,
|
|
248
|
+
await runnerRuntimeTokenEnvAsync(restartTokenInput(agent, options, tokenContext)));
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function managedRestartOptions(opts: RestartOptions, restartResumeWorkspace: ReturnType<typeof resumeWorkspaceForRestart>) {
|
|
252
|
+
return {
|
|
253
|
+
...(opts.continuation ? { prompt: opts.continuation } : {}),
|
|
254
|
+
...(restartResumeWorkspace ? { resumeWorkspace: restartResumeWorkspace } : {}),
|
|
255
|
+
// F5 — carry the self-restart generation marker on BOTH successor spawns (policy and
|
|
256
|
+
// dashboard/non-policy), so the audit lineage is symmetric regardless of branch.
|
|
257
|
+
...(opts.generation ? { extra: { selfRestart: { generation: opts.generation, reason: opts.reason } } } : {}),
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function managedRestartTokenInput(agent: AgentCard, policy: SpawnPolicy, requestId: string, requestedBy: string, projectId: string | undefined, extraCwdPrefixes: string[]): RunnerRuntimeTokenInput {
|
|
262
|
+
return {
|
|
263
|
+
authority: SUCCESSOR_LAUNCH, agentId: agent.id, orchestratorId: policy.orchestratorId,
|
|
264
|
+
cwd: policy.cwd, provider: policy.provider, label: policy.label, policyName: policy.name,
|
|
265
|
+
spawnRequestId: requestId, createdBy: requestedBy, profile: policy.profile || undefined,
|
|
266
|
+
// #2245: both successor paths stamp the policy's current posture into signed constraints.
|
|
267
|
+
approvalMode: policy.permissionMode,
|
|
268
|
+
...(agent.teamId ? { teamId: agent.teamId } : {}),
|
|
269
|
+
...(projectId ? { projectId } : {}),
|
|
270
|
+
...(extraCwdPrefixes.length ? { extraCwdPrefixes } : {}),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
type RestartTokenContext = Pick<RunnerRuntimeTokenInput, "orchestratorId" | "projectId" | "extraCwdPrefixes">;
|
|
275
|
+
const restartApprovalMode = (agent: AgentCard): SpawnApprovalMode => (stringValue(agent.meta?.approvalMode) as SpawnApprovalMode | undefined) ?? "guarded";
|
|
276
|
+
const restartLabel = (agent: AgentCard): string | undefined => (stringValue(agent.meta?.label) ?? agent.label) || undefined;
|
|
277
|
+
|
|
278
|
+
/** The successor token a non-policy restart carries; the sync twin and the writer-op path mint the same input. */
|
|
279
|
+
function restartTokenInput(agent: AgentCard, options: Omit<Parameters<typeof buildSpawnCommand>[0], "env">, tokenContext: RestartTokenContext): RunnerRuntimeTokenInput {
|
|
280
|
+
return { ...tokenContext, authority: SUCCESSOR_LAUNCH,
|
|
281
|
+
agentId: agent.id, cwd: options.cwd, provider: options.provider, label: restartLabel(agent),
|
|
282
|
+
policyName: options.policyName, spawnRequestId: options.spawnRequestId,
|
|
283
|
+
createdBy: options.requestedBy, profile: options.profile, approvalMode: restartApprovalMode(agent),
|
|
284
|
+
...(agent.teamId ? { teamId: agent.teamId } : {}),
|
|
285
|
+
};
|
|
269
286
|
}
|
|
270
287
|
|
|
271
288
|
function buildRestartSpawnCommand(
|
|
@@ -275,25 +292,21 @@ function buildRestartSpawnCommand(
|
|
|
275
292
|
projectedInstructions: Record<string, unknown>,
|
|
276
293
|
opts: RestartOptions,
|
|
277
294
|
options: Omit<Parameters<typeof buildSpawnCommand>[0], "env">,
|
|
278
|
-
tokenContext:
|
|
295
|
+
tokenContext: RestartTokenContext,
|
|
296
|
+
env: Record<string, string>,
|
|
279
297
|
): Record<string, unknown> {
|
|
280
298
|
const memorySeam = parseMemorySeam(projectedInstructions.memorySeam);
|
|
281
299
|
const resumeWorkspace = resumeWorkspaceForRestart(agent);
|
|
282
300
|
const providerArgs = metaStringArray(agent.meta, "providerArgs");
|
|
283
|
-
const approvalMode = (
|
|
284
|
-
const label = (
|
|
301
|
+
const approvalMode = restartApprovalMode(agent);
|
|
302
|
+
const label = restartLabel(agent);
|
|
285
303
|
const params = buildSpawnCommand({
|
|
286
304
|
...options,
|
|
287
305
|
orchestratorId: tokenContext.orchestratorId,
|
|
288
306
|
headless: true, requestedAt: Date.now(),
|
|
289
307
|
...(opts.continuation ? { prompt: opts.continuation } : {}),
|
|
290
308
|
...(opts.generation ? { extra: { selfRestart: { generation: opts.generation, reason: opts.reason } } } : {}),
|
|
291
|
-
env
|
|
292
|
-
agentId: agent.id, cwd: options.cwd, provider: options.provider, label,
|
|
293
|
-
policyName: options.policyName, spawnRequestId: options.spawnRequestId,
|
|
294
|
-
createdBy: options.requestedBy, profile: options.profile, approvalMode,
|
|
295
|
-
...(agent.teamId ? { teamId: agent.teamId } : {}),
|
|
296
|
-
}),
|
|
309
|
+
env,
|
|
297
310
|
agentId: agent.id, tags: agent.tags, systemTags: agent.systemTags, capabilities: agent.capabilities,
|
|
298
311
|
label,
|
|
299
312
|
approvalMode, permissionMode: approvalMode,
|
|
@@ -445,11 +458,11 @@ export async function createSelfRestartCommandAsync(
|
|
|
445
458
|
const predecessorSpawnRequestId = stringValue(agent.meta?.spawnRequestId);
|
|
446
459
|
const restartSpawn = await restartSpawnParamsForAgentAsync(agent, orchestrator, policyName, predecessorSpawnRequestId, { continuation, generation, reason });
|
|
447
460
|
if (!restartSpawn) throw new ValidationError("self-restart could not build a fresh successor spawn");
|
|
448
|
-
return createCommandAsync(selfRestartInput(agent, orchestrator, restartSpawn, generation, continuation, fullContextMessageId, reason, now));
|
|
461
|
+
return (await createCommandAsync(selfRestartInput(agent, orchestrator, restartSpawn, generation, continuation, fullContextMessageId, reason, now)));
|
|
449
462
|
}
|
|
450
463
|
|
|
451
464
|
/** Settle managed runtime correlation only after the transactional orchestrator swap succeeds. */
|
|
452
|
-
export function settleSelfRestartManagedState(command: Command): void {
|
|
465
|
+
export async function settleSelfRestartManagedState(command: Command): Promise<void> {
|
|
453
466
|
if (command.type !== "agent.restart" || !isRecord(command.params.selfRestart)) return;
|
|
454
467
|
const policyName = stringValue(command.params.policyName);
|
|
455
468
|
if (!policyName || command.status !== "succeeded") return;
|
|
@@ -460,7 +473,7 @@ export function settleSelfRestartManagedState(command: Command): void {
|
|
|
460
473
|
const spawnRequestId = stringValue(restartSpawn?.spawnRequestId) ?? state?.spawnRequestId;
|
|
461
474
|
const tmuxSession = stringValue(report?.tmuxSession) ?? stringValue(report?.sessionName) ?? state?.tmuxSession;
|
|
462
475
|
if (!agentId || !spawnRequestId) return;
|
|
463
|
-
|
|
476
|
+
(await updateManagedAgentStateAsync(policyName, {
|
|
464
477
|
status: "starting",
|
|
465
478
|
agentId,
|
|
466
479
|
spawnRequestId,
|
|
@@ -468,12 +481,12 @@ export function settleSelfRestartManagedState(command: Command): void {
|
|
|
468
481
|
lastSpawnAt: command.updatedAt,
|
|
469
482
|
lastStopAt: command.updatedAt,
|
|
470
483
|
restartCount: (state?.restartCount ?? 0) + 1,
|
|
471
|
-
});
|
|
472
|
-
markManagedAgentRunning({ policyName, spawnRequestId, agentId, tmuxSession }, authContextFromSystem(), { now: () => command.updatedAt });
|
|
484
|
+
}));
|
|
485
|
+
(await markManagedAgentRunning({ policyName, spawnRequestId, agentId, tmuxSession }, authContextFromSystem(), { now: () => command.updatedAt }));
|
|
473
486
|
}
|
|
474
487
|
|
|
475
|
-
export function restartSpawnParamsForAgent(...args: Parameters<typeof buildRestartSpawnParamsForAgent>) {
|
|
476
|
-
return buildRestartSpawnParamsForAgent(...args);
|
|
488
|
+
export async function restartSpawnParamsForAgent(...args: Parameters<typeof buildRestartSpawnParamsForAgent>) {
|
|
489
|
+
return (await buildRestartSpawnParamsForAgent(...args));
|
|
477
490
|
}
|
|
478
491
|
export async function restartSpawnParamsForAgentAsync(...args: Parameters<typeof buildRestartSpawnParamsForAgentAsync>) {
|
|
479
492
|
return buildRestartSpawnParamsForAgentAsync(...args);
|
|
@@ -17,10 +17,10 @@ export interface ReviewPublishDispatch {
|
|
|
17
17
|
error?: string;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
export function dispatchReviewPublish(
|
|
20
|
+
export async function dispatchReviewPublish(
|
|
21
21
|
workspace: WorkspaceRecord | undefined,
|
|
22
22
|
opts: { requestedBy: string; taskId: number; sha?: string; emit: (command: Command) => void },
|
|
23
|
-
): ReviewPublishDispatch | undefined {
|
|
23
|
+
): Promise<ReviewPublishDispatch | undefined> {
|
|
24
24
|
if (!workspace || workspace.mode !== "isolated" || !workspace.worktreePath) return undefined;
|
|
25
25
|
// #1452 round-6 H2b / round-7 H3 — publishing REQUIRES an immutable delivered COMMIT OID (the host
|
|
26
26
|
// must pin exactly it, and settlement matches result.sha === requested sha). It must be a concrete
|
|
@@ -46,28 +46,11 @@ export function dispatchReviewPublish(
|
|
|
46
46
|
// failing ledger insert was swallowed, leaving a POLLABLE publish command with NO cleanup ledger
|
|
47
47
|
// (a crash/insert-failure orphan). The transaction makes them all-or-nothing: a ledger failure
|
|
48
48
|
// rolls back the command row too, so a reviewer never sees a command with no durable cleanup path.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// Round-9: PIN the exact ref (relay-derived, host-asserted-equal before push) so cleanup can
|
|
55
|
-
// delete it even if the host's success-result is lost. The row also holds the branch/host/
|
|
56
|
-
// requested-sha so cleanup survives a purge/recycle. On settlement the reconciler re-writes the
|
|
57
|
-
// host-confirmed ref (identical to this one, since the host refuses to push a divergent ref).
|
|
58
|
-
upsertReviewRefCleanup({
|
|
59
|
-
id: built.command.id,
|
|
60
|
-
ref: reviewRef,
|
|
61
|
-
workspaceId: workspace.id,
|
|
62
|
-
repoRoot: workspace.repoRoot,
|
|
63
|
-
worktreePath: workspace.worktreePath,
|
|
64
|
-
branch: workspace.branch,
|
|
65
|
-
orchestratorId: workspace.orchestratorId,
|
|
66
|
-
requestedSha: sha,
|
|
67
|
-
});
|
|
68
|
-
command = built.command;
|
|
69
|
-
});
|
|
70
|
-
if (!command) return { workspaceId: workspace.id, dispatched: false, error: buildError ?? "review publish not dispatched" };
|
|
49
|
+
const built = await buildWorkspacePublishReviewCommand(workspace, opts.requestedBy, { taskId: opts.taskId, sha, reviewRef,
|
|
50
|
+
cleanup: { ref: reviewRef, workspaceId: workspace.id, repoRoot: workspace.repoRoot, worktreePath: workspace.worktreePath,
|
|
51
|
+
branch: workspace.branch, orchestratorId: workspace.orchestratorId, requestedSha: sha } });
|
|
52
|
+
if (!built.ok) return { workspaceId: workspace.id, dispatched: false, error: built.error };
|
|
53
|
+
const command = built.command;
|
|
71
54
|
opts.emit(command); // durable state (command + ledger) is committed before anyone is notified
|
|
72
55
|
return { workspaceId: workspace.id, commandId: command.id, dispatched: true };
|
|
73
56
|
} catch (err) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { cancelPendingCommandAsync, recordReviewRefCleanupDispatchAsync, markReviewRefPublishedAsync, markReviewRefFailedAsync, markReviewRefClosedAsync, markReviewRefAnnouncedAsync, deleteReviewRefCleanupAsync } from "../db/runtime-tail-async";
|
|
1
2
|
// #1452 round-4 — the durable, OFF-critical-path engine that settles the review-ref (refs/review/*)
|
|
2
3
|
// lifecycle and cleans up leaked refs. It reads the review_ref_cleanups ledger (one row per EXACT
|
|
3
4
|
// server-derived ref) — NOT a per-workspace marker — so it fixes every round-4 finding at once:
|
|
@@ -23,18 +24,8 @@
|
|
|
23
24
|
// was never enabled, since rows are only written when a publish is dispatched.
|
|
24
25
|
|
|
25
26
|
import { getWorkspace } from "../db";
|
|
26
|
-
import {
|
|
27
|
-
|
|
28
|
-
getReviewRefFenceToken,
|
|
29
|
-
listReviewRefCleanups,
|
|
30
|
-
markReviewRefAnnounced,
|
|
31
|
-
markReviewRefClosed,
|
|
32
|
-
markReviewRefFailed,
|
|
33
|
-
markReviewRefPublished,
|
|
34
|
-
recordReviewRefCleanupDispatch,
|
|
35
|
-
type ReviewRefCleanup,
|
|
36
|
-
} from "../db/review-ref-cleanups";
|
|
37
|
-
import { cancelPendingCommand, getCommand } from "../commands-db";
|
|
27
|
+
import { getReviewRefFenceToken, listReviewRefCleanups, type ReviewRefCleanup } from "../db/review-ref-cleanups";
|
|
28
|
+
import { getCommand } from "../commands-db";
|
|
38
29
|
import { emitCommand } from "../maintenance/events";
|
|
39
30
|
import { emitRelayEvent } from "../events";
|
|
40
31
|
import { buildReviewRefUnpublishCommandFromFields } from "../workspace-actions";
|
|
@@ -81,16 +72,16 @@ interface ReconcileDeps {
|
|
|
81
72
|
* pending publish can still be externally spoofed to succeeded{pushed:true}. Requiring the token here
|
|
82
73
|
* refuses that phantom before it can announce a ref that was never pushed. Returns null when absent. */
|
|
83
74
|
getFenceToken: (id: string) => string | null;
|
|
84
|
-
markPublished: typeof
|
|
85
|
-
markFailed: typeof
|
|
86
|
-
markAnnounced: typeof
|
|
87
|
-
markClosed: typeof
|
|
88
|
-
recordDispatch: typeof
|
|
89
|
-
deleteCleanup: typeof
|
|
75
|
+
markPublished: typeof markReviewRefPublishedAsync;
|
|
76
|
+
markFailed: typeof markReviewRefFailedAsync;
|
|
77
|
+
markAnnounced: typeof markReviewRefAnnouncedAsync;
|
|
78
|
+
markClosed: typeof markReviewRefClosedAsync;
|
|
79
|
+
recordDispatch: typeof recordReviewRefCleanupDispatchAsync;
|
|
80
|
+
deleteCleanup: typeof deleteReviewRefCleanupAsync;
|
|
90
81
|
buildUnpublish: typeof buildReviewRefUnpublishCommandFromFields;
|
|
91
82
|
/** #1452 round-10 HIGH #1 — atomically cancel the publish command IFF still pending; true means it
|
|
92
83
|
* was never dispatched (proven no push can occur), so a closed round can retire it without racing. */
|
|
93
|
-
cancelPublish: (id: string) => boolean
|
|
84
|
+
cancelPublish: (id: string) => boolean | Promise<boolean>;
|
|
94
85
|
emit: (command: Command) => void;
|
|
95
86
|
/** Durable publish-settled announcement: emitted for a published-but-unannounced row, then marked
|
|
96
87
|
* announced only on success — so a crash/outbox failure re-emits next pass (round-6 H-atomicity). */
|
|
@@ -164,21 +155,21 @@ const realDeps: ReconcileDeps = {
|
|
|
164
155
|
},
|
|
165
156
|
getCommand,
|
|
166
157
|
getFenceToken: getReviewRefFenceToken,
|
|
167
|
-
markPublished:
|
|
168
|
-
markFailed:
|
|
169
|
-
markAnnounced:
|
|
170
|
-
markClosed:
|
|
171
|
-
recordDispatch:
|
|
172
|
-
deleteCleanup:
|
|
158
|
+
markPublished: markReviewRefPublishedAsync,
|
|
159
|
+
markFailed: markReviewRefFailedAsync,
|
|
160
|
+
markAnnounced: markReviewRefAnnouncedAsync,
|
|
161
|
+
markClosed: markReviewRefClosedAsync,
|
|
162
|
+
recordDispatch: recordReviewRefCleanupDispatchAsync,
|
|
163
|
+
deleteCleanup: deleteReviewRefCleanupAsync,
|
|
173
164
|
buildUnpublish: buildReviewRefUnpublishCommandFromFields,
|
|
174
|
-
cancelPublish: (id) =>
|
|
165
|
+
cancelPublish: async (id) => (await cancelPendingCommandAsync(id, "workspace.publish-review", "review publish canceled: round closed before dispatch")),
|
|
175
166
|
emit: emitCommand,
|
|
176
167
|
emitPublished: emitPublishedEvent,
|
|
177
168
|
now: () => Date.now(),
|
|
178
169
|
};
|
|
179
170
|
|
|
180
171
|
/** One reconcile pass over the durable ledger. Pure over its (injectable) deps for testing. */
|
|
181
|
-
export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: AbortSignal): ReviewRefReconcileResult {
|
|
172
|
+
export async function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: AbortSignal): Promise<ReviewRefReconcileResult> {
|
|
182
173
|
const rows = deps.listCleanups();
|
|
183
174
|
const published: string[] = [];
|
|
184
175
|
const failed: string[] = [];
|
|
@@ -208,7 +199,7 @@ export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: Abo
|
|
|
208
199
|
const roundClosed = !ws
|
|
209
200
|
|| TERMINAL_WORKSPACE_STATUSES.has(ws.status as any)
|
|
210
201
|
|| Boolean(ws.branch && row.branch && ws.branch !== row.branch);
|
|
211
|
-
if (roundClosed) { deps.markClosed(row.id, now); closed = true; }
|
|
202
|
+
if (roundClosed) { await deps.markClosed(row.id, now); closed = true; }
|
|
212
203
|
}
|
|
213
204
|
|
|
214
205
|
// 1) Settle the publish outcome (H2). A ref is only real once its push command TERMINALLY
|
|
@@ -229,8 +220,8 @@ export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: Abo
|
|
|
229
220
|
// push can occur) → retire with nothing on origin. If it was already claimed (accepted/running),
|
|
230
221
|
// the host may push, so WAIT for its terminal settlement — cleanup then runs safely AFTER it.
|
|
231
222
|
if (!closed) { inFlight.push(label()); continue; }
|
|
232
|
-
if (!deps.cancelPublish(row.id)) { inFlight.push(label()); continue; } // already claimed → wait
|
|
233
|
-
deps.markFailed(row.id, now, false); // canceled before dispatch → nothing on origin, drop the ref
|
|
223
|
+
if (!await deps.cancelPublish(row.id)) { inFlight.push(label()); continue; } // already claimed → wait
|
|
224
|
+
await deps.markFailed(row.id, now, false); // canceled before dispatch → nothing on origin, drop the ref
|
|
234
225
|
confirmedRef = undefined;
|
|
235
226
|
publishState = "failed";
|
|
236
227
|
failed.push(label());
|
|
@@ -242,7 +233,7 @@ export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: Abo
|
|
|
242
233
|
// never-claimed pending publish spoofed to succeeded has none, so it never advances to published.
|
|
243
234
|
const ref = confirmedPublishRef(cmd, row.requestedSha, row.ref, deps.getFenceToken(row.id));
|
|
244
235
|
if (ref) {
|
|
245
|
-
deps.markPublished(row.id, ref, now); // sets announced=0 → announced below (H-atomicity)
|
|
236
|
+
await deps.markPublished(row.id, ref, now); // sets announced=0 → announced below (H-atomicity)
|
|
246
237
|
confirmedRef = ref;
|
|
247
238
|
publishState = "published";
|
|
248
239
|
announced = false;
|
|
@@ -253,7 +244,7 @@ export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: Abo
|
|
|
253
244
|
// timed-out/canceled, a missing/pruned result, or a malformed success) may have pushed before
|
|
254
245
|
// its result was lost ⇒ RETAIN the pinned ref as a tombstone and unpublish before deletion.
|
|
255
246
|
const notPushed = definitivelyNotPushed(cmd);
|
|
256
|
-
deps.markFailed(row.id, now, !notPushed);
|
|
247
|
+
await deps.markFailed(row.id, now, !notPushed);
|
|
257
248
|
if (notPushed) confirmedRef = undefined;
|
|
258
249
|
publishState = "failed";
|
|
259
250
|
failed.push(label());
|
|
@@ -267,7 +258,7 @@ export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: Abo
|
|
|
267
258
|
if (publishState === "published" && !announced && confirmedRef) {
|
|
268
259
|
try {
|
|
269
260
|
deps.emitPublished({ workspaceId: row.workspaceId, ref: confirmedRef, ...(row.requestedSha ? { sha: row.requestedSha } : {}), ...(row.branch ? { branch: row.branch } : {}) });
|
|
270
|
-
deps.markAnnounced(row.id, now);
|
|
261
|
+
await deps.markAnnounced(row.id, now);
|
|
271
262
|
announced = true;
|
|
272
263
|
} catch { /* emit failed → leave announced=0 so the next pass re-emits (at-least-once) */ }
|
|
273
264
|
}
|
|
@@ -285,7 +276,7 @@ export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: Abo
|
|
|
285
276
|
|
|
286
277
|
// A closed round with NOTHING on origin — a DEFINITIVELY-not-pushed outcome, or a legacy row that
|
|
287
278
|
// never pinned a ref — has nothing to delete. Retire it directly, no host round-trip, no leak.
|
|
288
|
-
if (!confirmedRef) { deps.deleteCleanup(row.id); cleared.push(label()); continue; }
|
|
279
|
+
if (!confirmedRef) { await deps.deleteCleanup(row.id); cleared.push(label()); continue; }
|
|
289
280
|
|
|
290
281
|
// 3) Drive deletion (H4/M7) of the EXACT host-confirmed ref. CONFIRM a prior attempt first — a
|
|
291
282
|
// succeeded delete clears the row regardless of the backoff window; the backoff gates only a
|
|
@@ -294,20 +285,20 @@ export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: Abo
|
|
|
294
285
|
const cmd = deps.getCommand(row.cleanupCommandId);
|
|
295
286
|
if (cmd && !COMMAND_TERMINAL.has(cmd.status)) { inFlight.push(confirmedRef); continue; }
|
|
296
287
|
if (cmd && cmd.status === "succeeded" && !cmd.error) {
|
|
297
|
-
deps.deleteCleanup(row.id); // origin confirmed the ref is gone (deleted or already absent)
|
|
288
|
+
await deps.deleteCleanup(row.id); // origin confirmed the ref is gone (deleted or already absent)
|
|
298
289
|
cleared.push(confirmedRef);
|
|
299
290
|
continue;
|
|
300
291
|
}
|
|
301
292
|
// failed / timed_out / missing → re-dispatch below, subject to backoff.
|
|
302
293
|
}
|
|
303
294
|
if (row.nextAttemptAt != null && row.nextAttemptAt > now) { waiting.push(confirmedRef); continue; }
|
|
304
|
-
const built = deps.buildUnpublish(
|
|
295
|
+
const built = await deps.buildUnpublish(
|
|
305
296
|
{ workspaceId: row.workspaceId, repoRoot: row.repoRoot, worktreePath: row.worktreePath, branch: row.branch, orchestratorId: row.orchestratorId, ref: confirmedRef },
|
|
306
297
|
"review-ref-reconciler",
|
|
307
298
|
);
|
|
308
299
|
if (!built.ok) continue; // no owning host reachable yet — retry next tick (no backoff burned)
|
|
309
300
|
deps.emit(built.command);
|
|
310
|
-
deps.recordDispatch(row.id, built.command.id, now + cleanupBackoffMs(row.cleanupAttempts), now);
|
|
301
|
+
await deps.recordDispatch(row.id, built.command.id, now + cleanupBackoffMs(row.cleanupAttempts), now);
|
|
311
302
|
dispatched.push(confirmedRef);
|
|
312
303
|
}
|
|
313
304
|
|
|
@@ -326,7 +317,7 @@ export const REVIEW_REF_RECONCILE_JOB = {
|
|
|
326
317
|
intervalMs: WORKSPACE_ORPHAN_REAPER_INTERVAL_MS,
|
|
327
318
|
runOnStart: false,
|
|
328
319
|
deadlineMs: 60 * 1000,
|
|
329
|
-
handler: (context: { signal?: AbortSignal }) => reconcileReviewRefs(undefined, context.signal) as unknown as Record<string, unknown>,
|
|
320
|
+
handler: async (context: { signal?: AbortSignal }) => (await reconcileReviewRefs(undefined, context.signal)) as unknown as Record<string, unknown>,
|
|
330
321
|
};
|
|
331
322
|
|
|
332
323
|
// Test seam: backoff parameters so tests assert scheduling without duplicating literals.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { isRecord } from "@humwick/sdk";
|
|
3
|
+
import { createActivityEventByClientIdAsync } from "../db/activity-async";
|
|
4
|
+
import { notifyWorkspaceHumanEscalation } from "../workspace-human-escalation";
|
|
5
|
+
import { stewardFallbackTarget } from "../config";
|
|
6
|
+
import { notifyTarget } from "../maintenance/events";
|
|
7
|
+
|
|
8
|
+
/** Heartbeats already persist provider failures for Fleet; page once per broken checkout (#3791). */
|
|
9
|
+
export async function reportRuntimeDependencyFailure(hostId: string, hostname: string, body: unknown): Promise<void> {
|
|
10
|
+
if (!isRecord(body) || !Array.isArray(body.providerStatus)) return;
|
|
11
|
+
const failure = body.providerStatus.find((status) => isRecord(status) && status.available === false
|
|
12
|
+
&& typeof status.reason === "string" && status.reason.startsWith("Runtime dependencies unavailable in "));
|
|
13
|
+
if (!failure) return;
|
|
14
|
+
const reason = failure.reason as string;
|
|
15
|
+
const checkout = reason.split(": ")[0]!;
|
|
16
|
+
const key = `runtime-dependencies:${hostId}:${createHash("sha256").update(checkout).digest("hex")}`;
|
|
17
|
+
const subject = `Runtime dependencies broken on ${hostname}`;
|
|
18
|
+
const message = `${hostname}: ${reason}. Providers are unavailable until this checkout is repaired.`;
|
|
19
|
+
const event = await createActivityEventByClientIdAsync({ clientId: key, kind: "state", title: subject, body: message,
|
|
20
|
+
meta: hostId, icon: "ti-alert-triangle", view: "orchestrators", metadata: { hostId, reason } });
|
|
21
|
+
if (!event.created) return;
|
|
22
|
+
const payload = { hostId, reason, kind: "runtime-dependencies.failed" };
|
|
23
|
+
const human = await notifyWorkspaceHumanEscalation({ subject, body: message, priority: "urgent", source: "runtime-dependencies", payload, idempotencyKey: key });
|
|
24
|
+
const target = stewardFallbackTarget();
|
|
25
|
+
const routed = target ? await notifyTarget("maintenance.degraded", {}, target, subject, message, payload, key) : null;
|
|
26
|
+
console.warn(`[relay] ${subject}: ${reason}${human.accepted || routed ? "" : " — no notification target configured"}`);
|
|
27
|
+
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { updateCommandAsync } from "../commands-write";
|
|
1
2
|
import { writeChildEnv } from "@humwick/sdk/env";
|
|
2
3
|
import { basename } from "node:path";
|
|
3
4
|
import { SCHEDULER_RETRY_MS } from "../config";
|
|
4
5
|
import { errMessage, stringValue } from "@humwick/sdk";
|
|
5
6
|
import { hasScope } from "@humwick/sdk/types";
|
|
6
|
-
import {
|
|
7
|
+
import { getCommand } from "../commands-db";
|
|
8
|
+
import { findLatestCommandByCorrelationAsync } from "../commands-write";
|
|
7
9
|
import { RELAY_RUN_DEADLINE_GRACE_MS } from "../relay-run-lease";
|
|
8
10
|
import { storeTextArtifact } from "../artifact-text";
|
|
9
11
|
import { gateRunIdentity, recordAgentGateRun } from "../gate-run-capture";
|
|
@@ -119,7 +121,7 @@ export async function dispatchScheduledCommand(timer: ScheduledTimer, ctx = pers
|
|
|
119
121
|
// Freeze the agent generation that owns this command. Managed restarts reuse the
|
|
120
122
|
// durable agent id, so agentId alone would let predecessor teardown kill a successor's command.
|
|
121
123
|
const executionOwnerSpawnRequestId = spawnRequestIds?.length === 1 ? spawnRequestIds[0] : undefined;
|
|
122
|
-
const command =
|
|
124
|
+
const command = await findLatestCommandByCorrelationAsync("scheduler.command", timer.correlationId) ?? await dispatchCommandAsync({
|
|
123
125
|
type: "scheduler.command",
|
|
124
126
|
source: timer.createdBy,
|
|
125
127
|
target: `orchestrator-${timer.command.orchestratorId}`,
|
|
@@ -186,7 +188,7 @@ export async function fireScheduledCommandTimeout(timer: ScheduledTimer, now: nu
|
|
|
186
188
|
return { status: "deferred" };
|
|
187
189
|
}
|
|
188
190
|
const neverStarted = !!command && (command.status === "pending" || command.status === "accepted") && commandResult(command).phase !== "running";
|
|
189
|
-
if (command)
|
|
191
|
+
if (command) (await updateCommandAsync(command.id, { status: "timed_out", error: "background command timed out" }));
|
|
190
192
|
const result = command ? commandResult(command) : {};
|
|
191
193
|
const admittedAt = numberValue(result.admittedAt) ?? timer.command.admittedAt;
|
|
192
194
|
const durationMs = admittedAt === undefined ? 0 : Math.max(0, now - admittedAt);
|
|
@@ -202,7 +204,7 @@ export async function fireScheduledCommandTimeout(timer: ScheduledTimer, now: nu
|
|
|
202
204
|
stdoutTail: stringValue(result.stdoutTail) ?? timer.command.stdoutTail ?? "",
|
|
203
205
|
stderrTail: stringValue(result.stderrTail) ?? timer.command.stderrTail ?? (neverStarted ? queuedTimeoutReason(timer.command.orchestratorId) : "background command timed out"),
|
|
204
206
|
};
|
|
205
|
-
return fireScheduledCommandWake(timer, {
|
|
207
|
+
return (await fireScheduledCommandWake(timer, {
|
|
206
208
|
status: "timed_out",
|
|
207
209
|
finishedAt: timer.command.finishedAt ?? now,
|
|
208
210
|
durationMs,
|
|
@@ -213,7 +215,7 @@ export async function fireScheduledCommandTimeout(timer: ScheduledTimer, now: nu
|
|
|
213
215
|
exitCode: null,
|
|
214
216
|
stdoutTail: timeoutResult.stdoutTail,
|
|
215
217
|
stderrTail: timeoutResult.stderrTail,
|
|
216
|
-
}, timeoutResult, now, inlineWakeSuppressed(timer.command, now));
|
|
218
|
+
}, timeoutResult, now, inlineWakeSuppressed(timer.command, now)));
|
|
217
219
|
}
|
|
218
220
|
|
|
219
221
|
/** #2776 — admission report: the fallback timer now guards the RUN (end + grace), not the queue ceiling. */
|
|
@@ -243,7 +245,7 @@ export async function settleScheduledCommandTimer(command: Command, now = Date.n
|
|
|
243
245
|
: "failed";
|
|
244
246
|
const stdout = clipTail(stringValue(result.stdoutTail) ?? stringValue(result.stdout) ?? "");
|
|
245
247
|
const stderr = clipTail(stringValue(result.stderrTail) ?? stringValue(result.stderr) ?? command.error ?? "");
|
|
246
|
-
return fireScheduledCommandWake(timer, {
|
|
248
|
+
return (await fireScheduledCommandWake(timer, {
|
|
247
249
|
status,
|
|
248
250
|
finishedAt: timer.command.finishedAt ?? now,
|
|
249
251
|
startedAt: numberValue(result.startedAt),
|
|
@@ -262,7 +264,7 @@ export async function settleScheduledCommandTimer(command: Command, now = Date.n
|
|
|
262
264
|
// Strictly stronger than truncation: the command was KILLED for flooding, it did not finish.
|
|
263
265
|
outputLimitExceeded: result.outputLimitExceeded === true,
|
|
264
266
|
logArtifactId: stringValue(result.logArtifactId),
|
|
265
|
-
}, result, now, inlineWakeSuppressed(timer.command, now));
|
|
267
|
+
}, result, now, inlineWakeSuppressed(timer.command, now)));
|
|
266
268
|
}
|
|
267
269
|
|
|
268
270
|
/**
|
|
@@ -358,7 +360,7 @@ async function fireScheduledCommandWake(
|
|
|
358
360
|
try {
|
|
359
361
|
const runNumber = timerForSend.runCount + 1;
|
|
360
362
|
const payloadResult = commandPayload(timerForSend.command!, rawResult, logArtifactId);
|
|
361
|
-
const send = sendMessageService({
|
|
363
|
+
const send = (await sendMessageService({
|
|
362
364
|
from: timerForSend.deliveryFrom,
|
|
363
365
|
to: timerForSend.target,
|
|
364
366
|
kind: timerForSend.messageKind as SendMessageInput["kind"] | undefined,
|
|
@@ -387,7 +389,7 @@ async function fireScheduledCommandWake(
|
|
|
387
389
|
},
|
|
388
390
|
// One stable key per command completion (not per run count): overlapping settlements dedupe.
|
|
389
391
|
idempotencyKey: `${timerForSend.idempotencyKey ?? `scheduler:${timerForSend.id}`}:completion`,
|
|
390
|
-
}, persistedCommandAuthContext(timerForSend));
|
|
392
|
+
}, persistedCommandAuthContext(timerForSend)));
|
|
391
393
|
await completeTimerRunAsync(timerForSend, send.message.id, now);
|
|
392
394
|
return { status: "fired", messageId: send.message.id };
|
|
393
395
|
} catch (error) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { framed } from "../hub-metrics";
|
|
1
2
|
import { createScheduledTimer } from "./scheduler-create";
|
|
2
3
|
import { planScheduledTimerCreate, cleanOptionalString, canAdministerTimers, type ScheduleTimerInput } from "./scheduler-plan";
|
|
3
4
|
export { type ScheduleTimerInput } from "./scheduler-plan";
|
|
@@ -84,9 +85,8 @@ export function startRelayScheduler(): void {
|
|
|
84
85
|
if (isEphemeralMode()) return;
|
|
85
86
|
if (schedulerTimer) return;
|
|
86
87
|
void timePostBindPhase("runDueScheduledTimers", runDueScheduledTimers).catch((error) => console.warn(`relay scheduler tick failed: ${errMessage(error)}`));
|
|
87
|
-
schedulerTimer = setInterval(() =>
|
|
88
|
-
|
|
89
|
-
}, SCHEDULER_TICK_MS);
|
|
88
|
+
schedulerTimer = setInterval(framed("timer scheduled-timers", () =>
|
|
89
|
+
timePostBindPhase("runDueScheduledTimers", runDueScheduledTimers).catch((error) => console.warn(`relay scheduler tick failed: ${errMessage(error)}`))), SCHEDULER_TICK_MS);
|
|
90
90
|
// #1408 K7 Phase-2: additively light up the kernel-served timers supervisor iff the reversible
|
|
91
91
|
// switch is on (default OFF ⇒ pure no-op). Legacy above stays authoritative; the kernel path is
|
|
92
92
|
// not yet a functional replacement for message/command dispatch (see kernel-timers.ts).
|
|
@@ -292,7 +292,7 @@ async function fireClaimedTimer(
|
|
|
292
292
|
await disableTimerAsync(timer.id, "timer expired before delivery");
|
|
293
293
|
return { status: "disabled" };
|
|
294
294
|
}
|
|
295
|
-
return fireScheduledCommandTimeout(timer, now);
|
|
295
|
+
return (await fireScheduledCommandTimeout(timer, now));
|
|
296
296
|
}
|
|
297
297
|
|
|
298
298
|
try {
|
|
@@ -323,7 +323,7 @@ async function fireClaimedTimer(
|
|
|
323
323
|
await disableTimerAsync(timer.id, "timer expired before delivery");
|
|
324
324
|
return { status: "disabled" };
|
|
325
325
|
}
|
|
326
|
-
const result = sendMessageService(sendInput, persistedAuthContext(timer));
|
|
326
|
+
const result = (await sendMessageService(sendInput, persistedAuthContext(timer)));
|
|
327
327
|
await completeTimerRunAsync(timer, result.message.id, now);
|
|
328
328
|
return { status: "fired", messageId: result.message.id };
|
|
329
329
|
} catch (error) {
|