@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,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createActivityEventAsync } from "../db/activity-async";
|
|
2
|
+
import { updateWorkspaceStatusAsync } from "../db";
|
|
2
3
|
import { deferLandSettleSideEffect } from "../land-settle-dispatch";
|
|
3
4
|
import { routeNotification } from "../notification-router";
|
|
4
5
|
import { resolveCoordinatorAgentId } from "../steward-identity";
|
|
@@ -37,17 +38,17 @@ export async function settleRestartKilledLand(command: Command, workspace: Works
|
|
|
37
38
|
...mergeRetryEnqueuedAtPatch(mergeResult, command),
|
|
38
39
|
});
|
|
39
40
|
if (transitioned) {
|
|
40
|
-
deferLandSettleSideEffect("land-restart-retry", () => notifyLandRedispatching(transitioned, command, headSha));
|
|
41
|
+
deferLandSettleSideEffect("land-restart-retry", async () => await notifyLandRedispatching(transitioned, command, headSha));
|
|
41
42
|
}
|
|
42
43
|
return transitioned;
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
function notifyLandRedispatching(workspace: WorkspaceRecord, command: Command, headSha: string | undefined): void {
|
|
46
|
+
async function notifyLandRedispatching(workspace: WorkspaceRecord, command: Command, headSha: string | undefined): Promise<void> {
|
|
46
47
|
const branch = workspace.branch ?? workspace.id;
|
|
47
48
|
const base = workspace.baseRef ?? "main";
|
|
48
49
|
const head = headSha ? ` at \`${headSha.slice(0, 12)}\`` : "";
|
|
49
50
|
const body = `\`${branch}\` → \`${base}\`: ${LAND_RESTART_RETRY_REASON}. Relay re-dispatches the same land${head} automatically and re-runs its gate. No action needed; do not re-deliver. A land result follows.`;
|
|
50
|
-
|
|
51
|
+
(await createActivityEventAsync({
|
|
51
52
|
clientId: `land-restart-retry-${command.id}`,
|
|
52
53
|
kind: "state",
|
|
53
54
|
title: "Land killed by restart; re-dispatching",
|
|
@@ -56,12 +57,12 @@ function notifyLandRedispatching(workspace: WorkspaceRecord, command: Command, h
|
|
|
56
57
|
icon: "ti-refresh-alert",
|
|
57
58
|
view: "orchestrators",
|
|
58
59
|
metadata: { source: "server", workspaceId: workspace.id, commandId: command.id },
|
|
59
|
-
});
|
|
60
|
+
}));
|
|
60
61
|
const author = workspace.ownerAgentId;
|
|
61
62
|
const coordinator = resolveCoordinatorAgentId(author);
|
|
62
63
|
const recipients = withWorkspaceTaskOwnerRoles([author, coordinator], workspace);
|
|
63
64
|
if (!recipients.length) return;
|
|
64
|
-
routeNotification({
|
|
65
|
+
await routeNotification({
|
|
65
66
|
type: "workspace.land_redispatched",
|
|
66
67
|
scope: { author, parent: coordinator ?? undefined, repoRoot: workspace.repoRoot, workspaceId: workspace.id },
|
|
67
68
|
recipients,
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { createActivityEventAsync } from "../db/activity-async";
|
|
2
|
+
import { repoDefaultBranch } from "@humwick/sdk/land-gates";
|
|
3
|
+
import { withWorkspaceTaskOwnerRoles } from "../task-owner-notices";
|
|
1
4
|
// #1713 — the coordinator's "landed" signal, derived from GIT ANCESTRY rather than a command's
|
|
2
5
|
// reported status. The observed bug: a worker delivers `complete`, the merge executor stalls, and
|
|
3
6
|
// the coordinator is nonetheless told the work is "complete"/"landed" while `origin/main` is
|
|
@@ -13,7 +16,7 @@
|
|
|
13
16
|
// transport error). We do NOT guess "landed" — we degrade to an actionable
|
|
14
17
|
// "verify manually" signal that names the sha and the stalled merge command id.
|
|
15
18
|
import { landFailureEventKey } from "../land-failure-event-key";
|
|
16
|
-
|
|
19
|
+
|
|
17
20
|
import { stewardFallbackTarget } from "../config";
|
|
18
21
|
import { emitRelayEvent } from "../events";
|
|
19
22
|
import { routeNotification } from "../notification-router";
|
|
@@ -113,7 +116,8 @@ const realVerifier: AncestryVerifier = async (repoRoot, sha, targetRef) => {
|
|
|
113
116
|
// source of truth; a fetch failure/timeout is swallowed — the checks below then run against
|
|
114
117
|
// whatever refs are already local, preserving the prior fail-closed behavior exactly.
|
|
115
118
|
const remoteBranch = ref.startsWith("origin/") ? ref.slice("origin/".length) : ref;
|
|
116
|
-
|
|
119
|
+
const fetched = remoteBranch ? await gitStatus(root, ["fetch", "--quiet", "origin", `+refs/heads/${remoteBranch}:refs/remotes/origin/${remoteBranch}`], GIT_FETCH_TIMEOUT_MS) : null;
|
|
120
|
+
if (ref.startsWith("origin/") && fetched !== 0) return "unresolvable";
|
|
117
121
|
// The sha itself must resolve to a commit in this repo, else ancestry is unknowable (not a
|
|
118
122
|
// negative). `--verify --quiet ^{commit}` distinguishes "sha absent" from "sha present but not
|
|
119
123
|
// on the ref".
|
|
@@ -246,6 +250,18 @@ export async function verifyLandedAncestry(repoRoot: string | undefined, sha: st
|
|
|
246
250
|
}
|
|
247
251
|
}
|
|
248
252
|
|
|
253
|
+
/** Notice proof requires the freshly fetched remote; a local-only main never qualifies (#3761). */
|
|
254
|
+
export async function verifyPublishedLand(repoRoot: string | undefined, sha: string | undefined, baseRef?: string): Promise<LandedAncestryVerdict> {
|
|
255
|
+
if (!repoRoot || !sha?.trim()) return "unresolvable";
|
|
256
|
+
try {
|
|
257
|
+
const base = baseRef ?? await repoDefaultBranch(async args => {
|
|
258
|
+
const result = await gitOutput(repoRoot, args);
|
|
259
|
+
return { ok: result?.exitCode === 0, stdout: result?.stdout ?? "", unavailable: !result };
|
|
260
|
+
});
|
|
261
|
+
return base ? await verifyLandedAncestry(repoRoot, sha, base.startsWith("origin/") ? base : `origin/${base}`) : "unresolvable";
|
|
262
|
+
} catch { return "unresolvable"; }
|
|
263
|
+
}
|
|
264
|
+
|
|
249
265
|
// #2718 — the landing host's own fresh-fetch ancestry check (`landVerifiedSha`) is ref-backed proof
|
|
250
266
|
// that works wherever the repo lives; the hub's check needs a checkout of the same remote on its own
|
|
251
267
|
// disk. Without a matching host verdict, fall back to the hub check (an absent path never confirms).
|
|
@@ -357,7 +373,7 @@ function landUnconfirmedText(input: LandUnconfirmedInput): { subject: string; bo
|
|
|
357
373
|
* obligation) to the branch owner's coordinator and the fallback steward, and always leaves a
|
|
358
374
|
* durable relay event + activity event so the outcome is auditable even if no one is reachable.
|
|
359
375
|
*/
|
|
360
|
-
export function notifyLandUnconfirmed(input: LandUnconfirmedInput): void {
|
|
376
|
+
export async function notifyLandUnconfirmed(input: LandUnconfirmedInput): Promise<void> {
|
|
361
377
|
const { workspace, kind } = input;
|
|
362
378
|
const owner = workspace.ownerAgentId ?? undefined;
|
|
363
379
|
const coordinator = resolveCoordinatorAgentId(owner);
|
|
@@ -366,6 +382,7 @@ export function notifyLandUnconfirmed(input: LandUnconfirmedInput): void {
|
|
|
366
382
|
const { subject, body } = landUnconfirmedText(input);
|
|
367
383
|
|
|
368
384
|
const payload = {
|
|
385
|
+
verified: false,
|
|
369
386
|
kind: "workspace.land-unconfirmed",
|
|
370
387
|
notification: "land-unconfirmed",
|
|
371
388
|
landOutcome: kind,
|
|
@@ -382,7 +399,7 @@ export function notifyLandUnconfirmed(input: LandUnconfirmedInput): void {
|
|
|
382
399
|
|
|
383
400
|
// #1912 §4 retained: command settlement schedules this through a synchronous deferred callback;
|
|
384
401
|
// it cannot await without changing the settle/error contract for land completion.
|
|
385
|
-
|
|
402
|
+
(await createActivityEventAsync({
|
|
386
403
|
clientId: `workspace-land-unconfirmed-${workspace.id}-${input.commandId ?? "nocmd"}-${kind}`,
|
|
387
404
|
kind: "state",
|
|
388
405
|
title: kind === "not-ancestor"
|
|
@@ -395,11 +412,11 @@ export function notifyLandUnconfirmed(input: LandUnconfirmedInput): void {
|
|
|
395
412
|
icon: "ti-alert-octagon",
|
|
396
413
|
view: "orchestrators",
|
|
397
414
|
metadata: { source: "server", maintenanceJobId: "workspace-land-unconfirmed", workspaceId: workspace.id, mergeCommandId: input.commandId, landOutcome: kind },
|
|
398
|
-
});
|
|
415
|
+
}));
|
|
399
416
|
|
|
400
|
-
const recipients =
|
|
417
|
+
const recipients = withWorkspaceTaskOwnerRoles([owner, coordinator, fallback], workspace);
|
|
401
418
|
if (recipients.length === 0) return;
|
|
402
|
-
routeNotification({
|
|
419
|
+
await routeNotification({
|
|
403
420
|
type: "workspace.land_unconfirmed",
|
|
404
421
|
scope: { workspaceId: workspace.id, repoRoot: workspace.repoRoot, ...(owner ? { author: owner } : {}), ...(coordinator ? { parent: coordinator } : {}) },
|
|
405
422
|
recipients,
|
|
@@ -407,7 +424,7 @@ export function notifyLandUnconfirmed(input: LandUnconfirmedInput): void {
|
|
|
407
424
|
forceDelivery: true,
|
|
408
425
|
message: {
|
|
409
426
|
subject,
|
|
410
|
-
body
|
|
427
|
+
body: `${body} verified: false.`,
|
|
411
428
|
payload,
|
|
412
429
|
idempotencyKey: kind === "merge-failed" ? landFailureEventKey(workspace, input.commandId)
|
|
413
430
|
: `land-unconfirmed:${workspace.id}:${input.commandId ?? "nocmd"}:${kind}`,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cleanDeliveryGatePolicy, cleanLandGateRequirements } from "@humwick/sdk/land-gates";
|
|
2
|
-
import type { CapturedDeliveryGateRequirement, LandGatesConfig } from "@humwick/sdk";
|
|
2
|
+
import type { CapturedDeliveryGateRequirement, LandGatesConfig, WorktreeProvisionConfig } from "@humwick/sdk";
|
|
3
3
|
import { errMessage, exactLandingSourceIdentity, RELAY_TOKEN_HEADER, isRecord, stringValue, type LandingContainmentMode } from "@humwick/sdk";
|
|
4
4
|
import { isTrustedOrchestratorApiUrl, relayToken } from "../config";
|
|
5
5
|
import { classifyLegacyLanding, type LandingLaneIdentity } from "../landing-lane-key";
|
|
@@ -14,6 +14,7 @@ export interface HostResolvedLandingIdentity extends LandingLaneIdentity {
|
|
|
14
14
|
readonly sourceHeadSha: string;
|
|
15
15
|
readonly baseHeadSha?: string;
|
|
16
16
|
readonly gateRequirements?: LandGatesConfig["requirements"];
|
|
17
|
+
readonly gateDepsStrategy?: WorktreeProvisionConfig["depsStrategy"];
|
|
17
18
|
readonly deliveryGate?: CapturedDeliveryGateRequirement;
|
|
18
19
|
readonly landGateTimeoutBudgetMs?: number;
|
|
19
20
|
}
|
|
@@ -131,6 +132,8 @@ export async function discoverLandingIdentityOnHost(
|
|
|
131
132
|
return { ...classified.laneIdentity, sourceHeadSha: source.sourceHeadSha, ...(baseHeadSha ? { baseHeadSha } : {}),
|
|
132
133
|
...(delivery.deliveryRequire ? { deliveryGate: { command: delivery.delivery!, require: delivery.deliveryRequire } } : {}),
|
|
133
134
|
...(gateRequirements ? { gateRequirements } : {}),
|
|
135
|
+
...(body.gateDepsStrategy === "command" || body.gateDepsStrategy === "none" || body.gateDepsStrategy === "symlink"
|
|
136
|
+
? { gateDepsStrategy: body.gateDepsStrategy } : {}),
|
|
134
137
|
...(typeof body.landGateTimeoutBudgetMs === "number" && Number.isSafeInteger(body.landGateTimeoutBudgetMs) && body.landGateTimeoutBudgetMs >= 0
|
|
135
138
|
? { landGateTimeoutBudgetMs: body.landGateTimeoutBudgetMs } : {}) };
|
|
136
139
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { releaseMergeLeaseAsync } from "../db/runtime-tail-async";
|
|
2
|
+
import { updateCommandAsync } from "../commands-write";
|
|
3
|
+
import { commandExecutorConfirmedGone, getCommandClaimOwnerToken } from "../commands-db.ts";
|
|
4
|
+
|
|
3
5
|
import { recordExecutionProofAsync, terminalizeLegacyLandingAsync } from "../commands-landing-async.ts";
|
|
4
6
|
import { resolveCommandExecutorOwner } from "../merge-drain.ts";
|
|
5
7
|
import type { Command, Orchestrator } from "../types.ts";
|
|
@@ -30,9 +32,9 @@ export async function reconcileLegacyLandingExecution(
|
|
|
30
32
|
&& commandExecutorConfirmedGone(command, getCommandClaimOwnerToken(command.id),
|
|
31
33
|
resolveCommandExecutorOwner(command, orchestrators), now);
|
|
32
34
|
if (!pastLease && !ownerGone) return null;
|
|
33
|
-
const terminal =
|
|
34
|
-
? LEGACY_UNFENCED_RESTART_ERROR : "command timed out" }, { executor: true });
|
|
35
|
-
if (terminal)
|
|
35
|
+
const terminal = (await updateCommandAsync(command.id, { status: "timed_out", error: ownerGone
|
|
36
|
+
? LEGACY_UNFENCED_RESTART_ERROR : "command timed out" }, { executor: true }));
|
|
37
|
+
if (terminal) (await releaseMergeLeaseAsync({ commandId: terminal.id }));
|
|
36
38
|
return terminal;
|
|
37
39
|
}
|
|
38
40
|
if (command.landingContainmentMode !== "cgroup-v2-close-v1") return null;
|
|
@@ -82,7 +84,7 @@ export async function reconcileLegacyLandingExecution(
|
|
|
82
84
|
const ownerState = resolveCommandExecutorOwner(command, orchestrators);
|
|
83
85
|
if (!commandExecutorConfirmedGone(command, claimOwnerToken, ownerState, now)) {
|
|
84
86
|
if (typeof command.expiresAt === "number" && command.expiresAt <= now && ownerState?.status !== "online") {
|
|
85
|
-
alertUnprovenLandLaneHolder(command);
|
|
87
|
+
await alertUnprovenLandLaneHolder(command);
|
|
86
88
|
}
|
|
87
89
|
return null;
|
|
88
90
|
}
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
// Composed by `registerAgent` (HTTP + bus registration) and called directly by the
|
|
13
13
|
// orchestrator-report projection in lifecycle-manager. It does NOT upsert the agent
|
|
14
14
|
// row — the agent registers itself over HTTP/bus; this only reconciles managed state.
|
|
15
|
-
import {
|
|
16
|
-
import { getManagedAgentState
|
|
15
|
+
import { createActivityEventAsync } from "../db";
|
|
16
|
+
import { getManagedAgentState } from "../config-store";
|
|
17
17
|
import { emitRelayEvent } from "../events";
|
|
18
18
|
import { emitMessageAvailable, emitMessageDeliveryUpdated, emitNewMessage } from "../sse";
|
|
19
19
|
import type { AuthContext } from "./auth-context";
|
|
20
20
|
import type { ManagedAgentState, Message } from "../types";
|
|
21
|
-
import {
|
|
21
|
+
import { updateManagedAgentStateAsync, resolveQueuedDirectMessagesAsync, resolveQueuedPolicyMessagesAsync, resolveQueuedCoordinatorMessagesAsync } from "../db/lifecycle-tail-async";
|
|
22
22
|
|
|
23
23
|
interface ManagedRunningInput {
|
|
24
24
|
policyName?: string;
|
|
@@ -44,11 +44,11 @@ interface ManagedRunningInput {
|
|
|
44
44
|
* - the managed-state change emits via `emitManagedState` (source "lifecycle-manager"
|
|
45
45
|
* + an activity-feed transition row), never the source-"server" `emitManagedAgentStateChanged`.
|
|
46
46
|
*/
|
|
47
|
-
export function markManagedAgentRunning(
|
|
47
|
+
export async function markManagedAgentRunning(
|
|
48
48
|
input: ManagedRunningInput,
|
|
49
49
|
ctx: AuthContext,
|
|
50
50
|
opts: { now?: () => number } = {},
|
|
51
|
-
): void {
|
|
51
|
+
): Promise<void> {
|
|
52
52
|
if (!input.policyName || !input.spawnRequestId) return;
|
|
53
53
|
// #1797 — the reconcile REBINDS `managed_agent_state.agent_id` (and, via
|
|
54
54
|
// `updateManagedAgentState`, the retained `last_agent_id`), which `managedStewardBoundAgentId` →
|
|
@@ -88,7 +88,7 @@ export function markManagedAgentRunning(
|
|
|
88
88
|
const now = opts.now ?? (() => Date.now());
|
|
89
89
|
|
|
90
90
|
const fromState = state.status;
|
|
91
|
-
const patch: Parameters<typeof
|
|
91
|
+
const patch: Parameters<typeof updateManagedAgentStateAsync>[1] = {
|
|
92
92
|
status: "running",
|
|
93
93
|
agentId: input.agentId || state.agentId,
|
|
94
94
|
tmuxSession: input.tmuxSession ?? state.tmuxSession,
|
|
@@ -101,11 +101,11 @@ export function markManagedAgentRunning(
|
|
|
101
101
|
};
|
|
102
102
|
// #3615 — repeated roster reports still flush queued messages, without rewriting running state.
|
|
103
103
|
if (Object.entries(patch).some(([key, value]) => state[key as keyof ManagedAgentState] !== value)) {
|
|
104
|
-
const next =
|
|
105
|
-
if (next) emitManagedState(next, fromState);
|
|
104
|
+
const next = await updateManagedAgentStateAsync(input.policyName, patch);
|
|
105
|
+
if (next) await emitManagedState(next, fromState);
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
const available =
|
|
108
|
+
const available = await resolveQueuedPolicyMessagesAsync(input.policyName, input.agentId || state.agentId || "");
|
|
109
109
|
if (available.length) {
|
|
110
110
|
emitMessageAvailable(input.policyName, input.agentId || state.agentId || "", available);
|
|
111
111
|
for (const message of available) {
|
|
@@ -126,31 +126,31 @@ export function markManagedAgentRunning(
|
|
|
126
126
|
// the came-up-running op.
|
|
127
127
|
let transitionSeq = 0;
|
|
128
128
|
|
|
129
|
-
export function emitManagedState(
|
|
129
|
+
export async function emitManagedState(
|
|
130
130
|
state: ManagedAgentState,
|
|
131
131
|
fromState: string | undefined,
|
|
132
132
|
reason?: string,
|
|
133
133
|
now: () => number = () => Date.now(),
|
|
134
|
-
): void {
|
|
134
|
+
): Promise<void> {
|
|
135
135
|
emitRelayEvent({
|
|
136
136
|
type: "policy.state.changed",
|
|
137
137
|
source: "lifecycle-manager",
|
|
138
138
|
subject: state.policyName,
|
|
139
139
|
data: state as unknown as Record<string, unknown>,
|
|
140
140
|
});
|
|
141
|
-
if (fromState !== state.status) recordManagedTransition(state, fromState, reason, now);
|
|
141
|
+
if (fromState !== state.status) await recordManagedTransition(state, fromState, reason, now);
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
function recordManagedTransition(
|
|
144
|
+
async function recordManagedTransition(
|
|
145
145
|
state: ManagedAgentState,
|
|
146
146
|
fromState: string | undefined,
|
|
147
147
|
reason: string | undefined,
|
|
148
148
|
now: () => number,
|
|
149
|
-
): void {
|
|
149
|
+
): Promise<void> {
|
|
150
150
|
const why = reason ?? state.lastError ?? undefined;
|
|
151
151
|
// #1912 §4 retained: this is shared by synchronous registration, restart settlement, and
|
|
152
152
|
// orchestrator-report projection. Its transition + queue flush need one future async redesign.
|
|
153
|
-
|
|
153
|
+
await createActivityEventAsync({
|
|
154
154
|
clientId: `lifecycle-${state.policyName}-${state.status}-${now()}-${++transitionSeq}`,
|
|
155
155
|
kind: "state",
|
|
156
156
|
title: `${state.policyName}: ${fromState ?? "—"} → ${state.status}`,
|
|
@@ -177,8 +177,8 @@ function recordManagedTransition(
|
|
|
177
177
|
* No-op when there are no queued direct messages. Returns the flushed messages so
|
|
178
178
|
* callers (e.g. the resweep safety net, #706) can report how many were recovered.
|
|
179
179
|
*/
|
|
180
|
-
export function flushQueuedDirectMessages(agentId: string): Message[] {
|
|
181
|
-
const available = [...
|
|
180
|
+
export async function flushQueuedDirectMessages(agentId: string): Promise<Message[]> {
|
|
181
|
+
const available = [...await resolveQueuedDirectMessagesAsync(agentId), ...await resolveQueuedCoordinatorMessagesAsync(agentId)];
|
|
182
182
|
if (!available.length) return [];
|
|
183
183
|
emitMessageAvailable("direct", agentId, available);
|
|
184
184
|
for (const message of available) {
|
|
@@ -2,15 +2,13 @@
|
|
|
2
2
|
// (relay_project_write_entry, relay_store_memory, the project-entry REST routes) resolves the
|
|
3
3
|
// vocabulary and the stored value here, so the closed vocabulary cannot drift between them.
|
|
4
4
|
|
|
5
|
-
import { AREAS_FILE, SYSTEM_AREAS, SYSTEM_AREA_DESCRIPTIONS, areasAtCommit, injectsAtStartup, isSystemArea,
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { localProjectGit, readHostProjectFiles } from "../project-roles";
|
|
9
|
-
import { hostIsRelayHost } from "../relay-host-locality";
|
|
5
|
+
import { AREAS_FILE, SYSTEM_AREAS, SYSTEM_AREA_DESCRIPTIONS, areasAtCommit, injectsAtStartup, isSystemArea, type AreaDefinition, type AreasConfig } from "@humwick/sdk/areas";
|
|
6
|
+
import { stringValue } from "@humwick/sdk";
|
|
7
|
+
import { countActivePinnedEntriesInAreaAsync, getAgent, ValidationError } from "../db";
|
|
10
8
|
import type { Project, ProjectEntry } from "../types";
|
|
11
9
|
import type { AuthContext } from "./auth-context";
|
|
12
10
|
import { callerHost, callerProjectId } from "./memory-identity";
|
|
13
|
-
import {
|
|
11
|
+
import { readProjectConfig, readProjectConfigFirst, type ConfigLookup, type ProjectCheckout } from "./project-config-read";
|
|
14
12
|
|
|
15
13
|
export const MAX_ENTRY_AREAS = 4;
|
|
16
14
|
const PROJECT_WIDE = "project-wide";
|
|
@@ -47,42 +45,15 @@ export function areaCallerFromCtx(ctx: AuthContext): AreaCaller {
|
|
|
47
45
|
}
|
|
48
46
|
|
|
49
47
|
/** A checkout to read areas.json from: a cwd on a host (a hostname or a registered orchestrator). */
|
|
50
|
-
export
|
|
51
|
-
cwd: string;
|
|
52
|
-
host?: string;
|
|
53
|
-
orchestratorId?: string;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export type AreasLookup = AreasAtCommit | { status: "unreadable"; error: string };
|
|
48
|
+
export type AreasCheckout = ProjectCheckout;
|
|
57
49
|
|
|
58
|
-
|
|
50
|
+
export type AreasLookup = ConfigLookup<AreasConfig>;
|
|
59
51
|
|
|
60
|
-
|
|
61
|
-
if (loggedProblems.has(key)) return;
|
|
62
|
-
if (loggedProblems.size >= 1000) loggedProblems.clear();
|
|
63
|
-
loggedProblems.add(key);
|
|
64
|
-
console.warn(`[memory-areas] ${AREAS_FILE} for ${key}: ${problem}; accepting system areas only`);
|
|
65
|
-
}
|
|
52
|
+
const ACCEPTING_SYSTEM_AREAS = "accepting system areas only";
|
|
66
53
|
|
|
67
|
-
/** #3635 — the areas.json at the checkout's default branch
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
export async function readAreasConfig(checkout: AreasCheckout): Promise<AreasLookup> {
|
|
71
|
-
const where = `${checkout.orchestratorId ?? checkout.host ?? "local"}:${checkout.cwd}`;
|
|
72
|
-
try {
|
|
73
|
-
const lookup = !checkout.orchestratorId && hostIsRelayHost(checkout.host)
|
|
74
|
-
? await readAreasAtDefaultBranch(localProjectGit(checkout.cwd))
|
|
75
|
-
: areasAtCommit(await readHostProjectFiles(
|
|
76
|
-
resolveProjectFilesHost({ subject: AREAS_FILE, cwd: checkout.cwd, orchestratorId: checkout.orchestratorId, preferHost: checkout.host }),
|
|
77
|
-
checkout.cwd, { paths: [AREAS_FILE] }, AREAS_FILE,
|
|
78
|
-
));
|
|
79
|
-
if (lookup.status === "invalid") logProblemOnce(`${where}@${lookup.sha}`, `invalid: ${lookup.error}`);
|
|
80
|
-
return lookup;
|
|
81
|
-
} catch (err) {
|
|
82
|
-
const error = errMessage(err);
|
|
83
|
-
logProblemOnce(where, `unreadable: ${error}`);
|
|
84
|
-
return { status: "unreadable", error };
|
|
85
|
-
}
|
|
54
|
+
/** #3635 — the areas.json at the checkout's default branch, through the shared project-config reader. */
|
|
55
|
+
export function readAreasConfig(checkout: AreasCheckout): Promise<AreasLookup> {
|
|
56
|
+
return readProjectConfig(checkout, AREAS_FILE, areasAtCommit, ACCEPTING_SYSTEM_AREAS);
|
|
86
57
|
}
|
|
87
58
|
|
|
88
59
|
function invalidDetail(lookup: Extract<AreasLookup, { status: "invalid" }>): string {
|
|
@@ -94,18 +65,11 @@ function invalidDetail(lookup: Extract<AreasLookup, { status: "invalid" }>): str
|
|
|
94
65
|
* answers. Every other cell (base/provider/host) takes system areas only, optionally. */
|
|
95
66
|
export async function resolveAreaVocabulary(anchor: Project, caller: AreaCaller | undefined): Promise<AreaVocabulary> {
|
|
96
67
|
if (anchor.scope !== "project") return { pathAreas: [], required: false, pathAreasMissing: "not-project" };
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
];
|
|
101
|
-
|
|
102
|
-
for (const checkout of checkouts) {
|
|
103
|
-
const lookup = await readAreasConfig(checkout);
|
|
104
|
-
if (lookup.status === "found") return { pathAreas: lookup.config.areas, required: true };
|
|
105
|
-
if (lookup.status === "absent") return { pathAreas: [], required: false, pathAreasMissing: "undeclared" };
|
|
106
|
-
if (lookup.status === "invalid") return { pathAreas: [], required: false, pathAreasMissing: "invalid", pathAreasDetail: invalidDetail(lookup) };
|
|
107
|
-
failures.push(lookup.error);
|
|
108
|
-
}
|
|
68
|
+
const preferred = caller?.cwd && caller.projectId === anchor.id ? [{ cwd: caller.cwd, host: caller.host }] : [];
|
|
69
|
+
const { lookup, failures } = await readProjectConfigFirst(anchor.id, preferred, AREAS_FILE, areasAtCommit, ACCEPTING_SYSTEM_AREAS);
|
|
70
|
+
if (lookup?.status === "found") return { pathAreas: lookup.config.areas, required: true };
|
|
71
|
+
if (lookup?.status === "absent") return { pathAreas: [], required: false, pathAreasMissing: "undeclared" };
|
|
72
|
+
if (lookup?.status === "invalid") return { pathAreas: [], required: false, pathAreasMissing: "invalid", pathAreasDetail: invalidDetail(lookup) };
|
|
109
73
|
return { pathAreas: [], required: false, pathAreasMissing: "unreadable", pathAreasDetail: failures.join("; ") || "the project has no checkout to read it from" };
|
|
110
74
|
}
|
|
111
75
|
|
|
@@ -161,10 +125,10 @@ export async function resolveWriteAreas(
|
|
|
161
125
|
/** When a written entry reaches agents, by its areas. An entry the startup block does not carry
|
|
162
126
|
* arrives when an agent first touches a path area it names (#3409, #3508). A pinned `project-wide`
|
|
163
127
|
* entry loads into every agent's startup block, so its write reports how many the cell carries. */
|
|
164
|
-
export function areaDeliveryReport(entry: ProjectEntry): { deliveredOnTouch?: true; projectWideActive?: number; note?: string } {
|
|
128
|
+
export async function areaDeliveryReport(entry: ProjectEntry): Promise<{ deliveredOnTouch?: true; projectWideActive?: number; note?: string }> {
|
|
165
129
|
if (!injectsAtStartup(entry)) return entry.areas?.some((area) => !isSystemArea(area)) ? { deliveredOnTouch: true } : {};
|
|
166
130
|
if (!entry.areas?.includes(PROJECT_WIDE)) return {};
|
|
167
|
-
const projectWideActive =
|
|
131
|
+
const projectWideActive = await countActivePinnedEntriesInAreaAsync(entry.projectId, PROJECT_WIDE);
|
|
168
132
|
return {
|
|
169
133
|
projectWideActive,
|
|
170
134
|
note: `${projectWideActive} active project-wide entries load into every agent's startup block; prefer a path or process area when one fits.`,
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
getMergePause,
|
|
4
|
-
listMergePauses,
|
|
5
|
-
releaseMergePause as releaseMergePauseRow,
|
|
6
|
-
renewMergePause as renewMergePauseRow,
|
|
7
|
-
type MergePauseRecord,
|
|
8
|
-
} from "../db";
|
|
1
|
+
import { acquireMergePauseAsync as acquireMergePauseRowAsync, renewMergePauseAsync as renewMergePauseRowAsync, releaseMergePauseAsync as releaseMergePauseRowAsync } from "../db/runtime-tail-async";
|
|
2
|
+
import { getMergePause, listMergePauses, type MergePauseRecord } from "../db";
|
|
9
3
|
|
|
10
4
|
export type { MergePauseRecord };
|
|
11
5
|
|
|
@@ -17,21 +11,21 @@ export function getAutoMergePause(id: string): MergePauseRecord | null {
|
|
|
17
11
|
return getMergePause(id);
|
|
18
12
|
}
|
|
19
13
|
|
|
20
|
-
export function pauseAutoMerge(input: {
|
|
14
|
+
export async function pauseAutoMerge(input: {
|
|
21
15
|
repoRoot: string;
|
|
22
16
|
baseRef?: string;
|
|
23
17
|
holder: string;
|
|
24
18
|
reason?: string;
|
|
25
19
|
ttlMs?: number;
|
|
26
20
|
now?: number;
|
|
27
|
-
}): { ok: true; pause: MergePauseRecord } | { ok: false; pause: MergePauseRecord } {
|
|
28
|
-
return
|
|
21
|
+
}): Promise<{ ok: true; pause: MergePauseRecord } | { ok: false; pause: MergePauseRecord }> {
|
|
22
|
+
return (await acquireMergePauseRowAsync(input));
|
|
29
23
|
}
|
|
30
24
|
|
|
31
|
-
export function renewAutoMergePause(id: string, ttlMs?: number): MergePauseRecord | null {
|
|
32
|
-
return
|
|
25
|
+
export async function renewAutoMergePause(id: string, ttlMs?: number): Promise<MergePauseRecord | null> {
|
|
26
|
+
return (await renewMergePauseRowAsync(id, ttlMs));
|
|
33
27
|
}
|
|
34
28
|
|
|
35
|
-
export function resumeAutoMerge(input: { id?: string; repoRoot?: string; baseRef?: string }): boolean {
|
|
36
|
-
return
|
|
29
|
+
export async function resumeAutoMerge(input: { id?: string; repoRoot?: string; baseRef?: string }): Promise<boolean> {
|
|
30
|
+
return (await releaseMergePauseRowAsync(input));
|
|
37
31
|
}
|
|
@@ -1,17 +1,20 @@
|
|
|
1
|
+
import { withdrawOpenOperatorDecisionAsync, updateOpenOperatorDecisionAsync } from "../db/runtime-tail-async";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { getGateway } from "../db/gateway";
|
|
4
|
+
import type { answerOperatorDecisionBody } from "../db/operator-answer-write";
|
|
5
|
+
import type { SendMessageInput } from "../types";
|
|
1
6
|
import { workflowDecisionAnswer } from "./workflow-decision-answer";
|
|
2
7
|
import { getWorkflowOperatorDecision } from "../db/operator-decisions";
|
|
3
8
|
import { actingUserSinkOf } from "./auth-context";
|
|
4
9
|
import { DecisionNotFoundError, authorizeDecision } from "./decision-audience";
|
|
5
10
|
// #2885 — operator decisions: a coordinator files a structured question for the operator; the
|
|
6
11
|
// answer goes back as ONE message to `coordinator:<teamId>`, so whoever holds the seat gets it.
|
|
7
|
-
import { coordinatesActiveTeam, getAgent, getOperatorDecision, insertOperatorDecision, listOperatorDecisions, answerOpenOperatorDecision,
|
|
8
|
-
setOperatorDecisionAnswerMessage, updateOpenOperatorDecision, withdrawOpenOperatorDecision, writeTransaction, ValidationError,
|
|
9
|
-
type OperatorDecisionContent } from "../db";
|
|
12
|
+
import { coordinatesActiveTeam, getAgent, getOperatorDecision, insertOperatorDecision, listOperatorDecisions, answerOpenOperatorDecision, setOperatorDecisionAnswerMessage, writeTransaction, ValidationError, type OperatorDecisionContent } from "../db";
|
|
10
13
|
import { acquireCoordinatorTeam } from "./team";
|
|
11
14
|
import { emitRelayEvent } from "../events";
|
|
12
15
|
import { emitNotificationCreated, notificationForDecision } from "../dashboard-notifications";
|
|
13
16
|
import { cleanStringArray, optionalEnum, optionalString, stringField } from "../validation";
|
|
14
|
-
import {
|
|
17
|
+
import { validateSendMessageAuthorization, emitSendResults } from "./send-message";
|
|
15
18
|
import type { AuthContext } from "./auth-context";
|
|
16
19
|
import { ServiceAuthError } from "./errors";
|
|
17
20
|
import { OPERATOR_ACTION_DONE, OPERATOR_ACTION_NOT_DONE, OPERATOR_ACTION_OUTCOME_ID, OPERATOR_DECISION_KINDS, OPERATOR_DECISION_QUESTION_KINDS,
|
|
@@ -129,12 +132,12 @@ function emitDecisionChanged(decision: OperatorDecision): void {
|
|
|
129
132
|
}
|
|
130
133
|
|
|
131
134
|
/** The team the caller coordinates. `mint` lets a teamless coordinator-capable caller found one. */
|
|
132
|
-
export function callerDecisionTeam(ctx: AuthContext, mint: boolean): string {
|
|
135
|
+
export async function callerDecisionTeam(ctx: AuthContext, mint: boolean): Promise<string> {
|
|
133
136
|
const agentId = ctx.callerAgentId;
|
|
134
137
|
if (!agentId) throw new ServiceAuthError("relay_decision needs a single caller agent identity");
|
|
135
138
|
const agent = getAgent(agentId);
|
|
136
139
|
if (agent?.teamId && coordinatesActiveTeam(agentId, agent.teamId)) return agent.teamId;
|
|
137
|
-
if (mint && agent && !agent.teamId && ctx.scopes.includes("command:spawn")) return acquireCoordinatorTeam(agentId).id;
|
|
140
|
+
if (mint && agent && !agent.teamId && ctx.scopes.includes("command:spawn")) return (await acquireCoordinatorTeam(agentId)).id;
|
|
138
141
|
throw new ServiceAuthError("decisions belong to a team's coordinator; you do not coordinate an active team (a replacement claims it with relay_team_claim)");
|
|
139
142
|
}
|
|
140
143
|
|
|
@@ -144,12 +147,12 @@ export function teamDecision(teamId: string, id: number): OperatorDecision {
|
|
|
144
147
|
return decision;
|
|
145
148
|
}
|
|
146
149
|
|
|
147
|
-
function
|
|
150
|
+
async function prepareFiledDecision(ctx: AuthContext, args: Record<string, unknown>, projectId: string | undefined, now: number, workflow?: OperatorDecision["workflow"], coordinatorNote?: string): Promise<Parameters<typeof insertOperatorDecision>[0]> {
|
|
148
151
|
const content = cleanDecisionContent(args, undefined, Boolean(workflow));
|
|
149
152
|
// Each input keeps its own bound; appending a valid note must not reject a valid context (#3586).
|
|
150
153
|
if (coordinatorNote) content.context = [content.context, `Coordinator note: ${coordinatorNote}`].filter(Boolean).join("\n\n");
|
|
151
|
-
const teamId = callerDecisionTeam(ctx, true);
|
|
152
|
-
return
|
|
154
|
+
const teamId = (await callerDecisionTeam(ctx, true));
|
|
155
|
+
return { ...content, teamId, ...(projectId ? { projectId } : {}), filedBy: ctx.callerAgentId!, now, ...(workflow ? { workflow } : {}) };
|
|
153
156
|
}
|
|
154
157
|
|
|
155
158
|
function publishFiledDecision(decision: OperatorDecision): OperatorDecision {
|
|
@@ -158,22 +161,23 @@ function publishFiledDecision(decision: OperatorDecision): OperatorDecision {
|
|
|
158
161
|
return decision;
|
|
159
162
|
}
|
|
160
163
|
|
|
161
|
-
export function fileDecision(ctx: AuthContext, args: Record<string, unknown>, projectId: string | undefined, now = Date.now()): OperatorDecision {
|
|
162
|
-
|
|
164
|
+
export async function fileDecision(ctx: AuthContext, args: Record<string, unknown>, projectId: string | undefined, now = Date.now()): Promise<OperatorDecision> {
|
|
165
|
+
const input = await prepareFiledDecision(ctx, args, projectId, now);
|
|
166
|
+
return publishFiledDecision(await getGateway().write("operatorDecisions.insert", input, { idempotencyKey: randomUUID() }) as unknown as OperatorDecision);
|
|
163
167
|
}
|
|
164
168
|
|
|
165
|
-
export function updateDecision(ctx: AuthContext, id: number, args: Record<string, unknown>, now = Date.now()): OperatorDecision {
|
|
166
|
-
const current = teamDecision(callerDecisionTeam(ctx, false), id);
|
|
169
|
+
export async function updateDecision(ctx: AuthContext, id: number, args: Record<string, unknown>, now = Date.now()): Promise<OperatorDecision> {
|
|
170
|
+
const current = teamDecision((await callerDecisionTeam(ctx, false)), id);
|
|
167
171
|
if (current.workflow && args.questions !== undefined) throw new ValidationError("workflow choices are frozen for this step activation");
|
|
168
|
-
if (!
|
|
172
|
+
if (!(await updateOpenOperatorDecisionAsync(id, cleanDecisionContent(args, current), now))) throw new DecisionConflictError(`decision #${id} is ${current.status}, not open`);
|
|
169
173
|
const updated = getOperatorDecision(id)!;
|
|
170
174
|
emitDecisionChanged(updated);
|
|
171
175
|
return updated;
|
|
172
176
|
}
|
|
173
177
|
|
|
174
|
-
export function withdrawDecision(ctx: AuthContext, id: number, now = Date.now()): OperatorDecision {
|
|
175
|
-
const current = teamDecision(callerDecisionTeam(ctx, false), id);
|
|
176
|
-
if (!
|
|
178
|
+
export async function withdrawDecision(ctx: AuthContext, id: number, now = Date.now()): Promise<OperatorDecision> {
|
|
179
|
+
const current = teamDecision((await callerDecisionTeam(ctx, false)), id);
|
|
180
|
+
if (!(await withdrawOpenOperatorDecisionAsync(id, now))) throw new DecisionConflictError(`decision #${id} is ${current.status}, not open`);
|
|
177
181
|
const withdrawn = getOperatorDecision(id)!;
|
|
178
182
|
emitDecisionChanged(withdrawn);
|
|
179
183
|
return withdrawn;
|
|
@@ -201,7 +205,7 @@ function renderAnswerBody(decision: OperatorDecision, answers: OperatorDecisionA
|
|
|
201
205
|
* transaction: a crash or a refused send can never leave an answered row without its message.
|
|
202
206
|
* The message never expires (maxAgeSeconds null), so a seat vacant for days still receives it.
|
|
203
207
|
*/
|
|
204
|
-
export function answerDecision(ctx: AuthContext, id: number, input: { answers: unknown; note?: unknown }, now = Date.now()): { decision: OperatorDecision; messageId: number } {
|
|
208
|
+
export async function answerDecision(ctx: AuthContext, id: number, input: { answers: unknown; note?: unknown }, now = Date.now()): Promise<{ decision: OperatorDecision; messageId: number }> {
|
|
205
209
|
if (ctx.callerAgentId) throw new ServiceAuthError("operator decisions are answered by the operator, not by an agent");
|
|
206
210
|
const current = getOperatorDecision(id);
|
|
207
211
|
if (!current) throw new DecisionNotFoundError(`decision #${id} not found`);
|
|
@@ -216,21 +220,16 @@ export function answerDecision(ctx: AuthContext, id: number, input: { answers: u
|
|
|
216
220
|
throw new ValidationError(`note required: say why you could not do it (${OPERATOR_ACTION_NOT_DONE})`);
|
|
217
221
|
}
|
|
218
222
|
const answeredBy = ctx.actor.kind === "component" ? ctx.actor.id : actingUserSinkOf(ctx);
|
|
219
|
-
const
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
});
|
|
230
|
-
// Live effects only after COMMIT: a rolled-back answer must never have been delivered (#2887).
|
|
231
|
-
sent.publish?.();
|
|
232
|
-
const { messageId } = sent;
|
|
233
|
-
const decision = getOperatorDecision(id)!;
|
|
223
|
+
const message: SendMessageInput = {
|
|
224
|
+
from: actingUserSinkOf(ctx), to: current.teamId.startsWith("host-privacy:") || current.teamId === "vault-expiry:global" ? current.filedBy : `coordinator:${current.teamId}`, body: renderAnswerBody(current, answers, note),
|
|
225
|
+
idempotencyKey: `decision:${id}:answer`, maxAgeSeconds: null, meta: { decisionId: id },
|
|
226
|
+
};
|
|
227
|
+
validateSendMessageAuthorization(message, ctx);
|
|
228
|
+
const written = await getGateway().write("operatorDecisions.answer", { id, answer: { answers, ...(note ? { note } : {}), answeredBy, now }, message }, { critical: true }) as unknown as ReturnType<typeof answerOperatorDecisionBody>;
|
|
229
|
+
if (!written) throw new DecisionConflictError(`decision #${id} was answered or withdrawn meanwhile`);
|
|
230
|
+
const { decision, result } = written;
|
|
231
|
+
(await emitSendResults([result]));
|
|
232
|
+
const messageId = result.message.id;
|
|
234
233
|
emitDecisionChanged(decision);
|
|
235
234
|
return { decision, messageId };
|
|
236
235
|
}
|
|
@@ -244,17 +243,14 @@ export function cleanWorkflowAnswers(decision: Pick<OperatorDecision, "questions
|
|
|
244
243
|
}
|
|
245
244
|
|
|
246
245
|
/** The effect identity and filing share a transaction, so replay cannot create another card. */
|
|
247
|
-
export function fileWorkflowDecision(ctx: AuthContext, args: Record<string, unknown>, workflow: NonNullable<OperatorDecision["workflow"]>, projectId?: string, coordinatorNote?: string): OperatorDecision {
|
|
246
|
+
export async function fileWorkflowDecision(ctx: AuthContext, args: Record<string, unknown>, workflow: NonNullable<OperatorDecision["workflow"]>, projectId?: string, coordinatorNote?: string): Promise<OperatorDecision> {
|
|
248
247
|
const note = optionalString(coordinatorNote, "note", MAX_TEXT);
|
|
249
|
-
const
|
|
250
|
-
|
|
251
|
-
if (existing) return { decision: existing, created: false };
|
|
252
|
-
return { decision: insertFiledDecision(ctx, args, projectId, Date.now(), workflow, note), created: true };
|
|
253
|
-
});
|
|
248
|
+
const input = await prepareFiledDecision(ctx, args, projectId, Date.now(), workflow, note);
|
|
249
|
+
const filed = await getGateway().write("operatorDecisions.fileWorkflow", input) as unknown as { decision: OperatorDecision; created: boolean };
|
|
254
250
|
return filed.created ? publishFiledDecision(filed.decision) : filed.decision;
|
|
255
251
|
}
|
|
256
252
|
|
|
257
|
-
export function withdrawWorkflowDecision(effectId: string): void {
|
|
253
|
+
export async function withdrawWorkflowDecision(effectId: string): Promise<void> {
|
|
258
254
|
const decision = getWorkflowOperatorDecision(effectId);
|
|
259
|
-
if (decision &&
|
|
255
|
+
if (decision && (await withdrawOpenOperatorDecisionAsync(decision.id, Date.now()))) emitDecisionChanged(getOperatorDecision(decision.id)!);
|
|
260
256
|
}
|
|
@@ -4,9 +4,13 @@ import { recoverOrchestratorLegacyLandings } from "./orchestrator-landing-recove
|
|
|
4
4
|
import { resumeDeferredWorkflowCleanup } from "./workflow-deferred-cleanup";
|
|
5
5
|
import { workflowTaskDelivered } from "./workflow-runs";
|
|
6
6
|
|
|
7
|
+
/** #3826 — the workflow follow-up waits on the supervisor queue, so it runs after the register reply. Deferred
|
|
8
|
+
* cleanup stays durable: a failed resume is retried by the next registration or hub boot. */
|
|
7
9
|
export async function recoverRegisteredOrchestrator(orchestratorId: string): Promise<void> {
|
|
8
10
|
await reconcileOrchestratorSchedulerCommands(orchestratorId);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
void fireAndForget(`[orchestrator] workflow cleanup resume for ${orchestratorId}`, async () => {
|
|
12
|
+
await resumeDeferredWorkflowCleanup(orchestratorId);
|
|
13
|
+
await workflowTaskDelivered();
|
|
14
|
+
});
|
|
11
15
|
void fireAndForget(`[orchestrator] legacy landing recovery for ${orchestratorId}`, () => recoverOrchestratorLegacyLandings(orchestratorId));
|
|
12
16
|
}
|