@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,6 +1,5 @@
|
|
|
1
|
-
import { planCiNotice } from "./plan-ci-
|
|
1
|
+
import { planCiNotice } from "./plan-ci-notice";
|
|
2
2
|
import { performWorkflowDecision, performWithdrawWorkflowDecision } from "./workflow-decisions";
|
|
3
|
-
import { getCommandAsync } from "../commands-write";
|
|
4
3
|
// #3045 — the src half of a workflow run: the kernel writes effect intents and waits; this module
|
|
5
4
|
// performs each effect through the existing services and reads the durable facts that end a wait.
|
|
6
5
|
// Every effect is keyed by its intent id, so a re-drive after a crash repeats nothing.
|
|
@@ -23,9 +22,10 @@ import { spawnTaskDispatch } from "./task-dispatch";
|
|
|
23
22
|
import type { DispatchPin } from "../task-dispatcher";
|
|
24
23
|
import { createTaskEntityAsync } from "./task-entity";
|
|
25
24
|
import { workflowNotice } from "./workflow-notice";
|
|
25
|
+
import { workflowPauseNotice } from "./workflow-pause-text";
|
|
26
26
|
import { planQuietingRunNotice } from "./plan-wake-policy";
|
|
27
27
|
import { workflowOverdueLead } from "./workflow-overdue-notice";
|
|
28
|
-
import { workflowLandNotice } from "./workflow-land-notice";
|
|
28
|
+
import { workflowLandNotice, workflowLandVerification } from "./workflow-land-notice";
|
|
29
29
|
import { ciRedLead, ciResultLine } from "./workflow-ci-main";
|
|
30
30
|
import { stepTaskDispatch } from "./workflow-pins";
|
|
31
31
|
import { workflowDispatchResult } from "./workflow-dispatch-result";
|
|
@@ -36,12 +36,15 @@ import { isStewardHandbackPendingError } from "../db/withdraw-land-error";
|
|
|
36
36
|
import { ShutdownAuthError, ShutdownTargetError, shutdownAgent, UnlandedWorkRefusal } from "./shutdown-agent";
|
|
37
37
|
import { OfflineControlHostError, resolveControlOrchestrator } from "./agent-control-host";
|
|
38
38
|
import { workflowCoordinatorTarget } from "./workflow-coordinator";
|
|
39
|
+
import { supervisorNow } from "./workflow-supervisor-state";
|
|
40
|
+
import { isTerminalCommandStatus } from "../db/command-terminal-status";
|
|
41
|
+
import { isCoordinatorSeat } from "./workflow-caller";
|
|
39
42
|
import { deliveredWorkspace, ensureWorkflowLanding, landedSignal, WORKFLOW_CTX } from "./workflow-land";
|
|
40
43
|
import type { AuthContext } from "./auth-context";
|
|
41
44
|
import type { Command, TaskDetail } from "../types";
|
|
42
45
|
|
|
43
46
|
type Json = Record<string, unknown>;
|
|
44
|
-
type WorkflowOp = (op: string, input: Json) => Promise<unknown>;
|
|
47
|
+
export type WorkflowOp = (op: string, input: Json) => Promise<unknown>;
|
|
45
48
|
|
|
46
49
|
function short(sha: string | undefined): string {
|
|
47
50
|
return sha ? sha.slice(0, 12) : "an unknown head";
|
|
@@ -112,7 +115,7 @@ async function dispatchRole(run: WorkflowRunRecord, effect: WorkflowEffect, agen
|
|
|
112
115
|
const spawnRequestId = spawnRequestIdFor(effect);
|
|
113
116
|
await call("prepareDispatch", { id: effect.id, taskId, spawnRequestId });
|
|
114
117
|
const spawn = await spawnTaskDispatch({
|
|
115
|
-
taskId, role, roleSha: run.sha, ...(run.callerAgentId ? { workflowCaller: { agentId: run.callerAgentId, maxLiveAgents: run.maxLiveAgents ?? 2, runId: run.rootRunId ?? run.id } } : {}), ...(run.snapshot?.[run.workflow]?.roles[role] ? { roleSnapshot: run.snapshot[run.workflow]!.roles[role] as unknown as import("../project-roles").ProjectRole } : {}), workflowRunId: run.id, pin: stepDispatchPin(pin, step), pinSources: pin?.from, createReview: false, ...(pin?.orchestratorId ? { orchestratorId: pin.orchestratorId } : {}),
|
|
118
|
+
taskId, role, roleSha: run.sha, ...(run.callerAgentId ? { workflowCaller: { agentId: run.callerAgentId, maxLiveAgents: run.maxLiveAgents ?? 2, runId: run.rootRunId ?? run.id } } : {}), ...(run.snapshot?.[run.workflow]?.roles[role] ? { roleSnapshot: run.snapshot[run.workflow]!.roles[role] as unknown as import("../project-roles").ProjectRole } : {}), workflowRunId: run.id, workflowNames: [...new Set([run.workflow, ...Object.keys(run.snapshot ?? {})])], pin: stepDispatchPin(pin, step), pinSources: pin?.from, createReview: false, ...(pin?.orchestratorId ? { orchestratorId: pin.orchestratorId } : {}),
|
|
116
119
|
taskRepoCwd: run.cwd, roleHost: run.orchestratorId, ...(pin?.profile ? { roleProfile: pin.profile } : {}),
|
|
117
120
|
spawnRequestId, waitForRegistrationMs: 0, verbose: false, ...(steer ? { steer } : {}), ...avoid,
|
|
118
121
|
}, WORKFLOW_CTX);
|
|
@@ -168,16 +171,21 @@ async function createStepTask(run: WorkflowRunRecord, effect: WorkflowEffect): P
|
|
|
168
171
|
return task.id;
|
|
169
172
|
}
|
|
170
173
|
|
|
171
|
-
/** The builder of record if it still runs: the agent a loop's findings go to (warm, never respawned).
|
|
172
|
-
|
|
173
|
-
|
|
174
|
+
/** The builder of record if it still runs: the agent a loop's findings go to (warm, never respawned). It is the run's
|
|
175
|
+
* newest registered agent on the input Task, else the Task's assigned agent unless that is a coordinator seat (#3769):
|
|
176
|
+
* a sub-coordinator assigned the Task owns its runs and never builds them. */
|
|
177
|
+
export async function liveBuilder(run: Pick<WorkflowRunRecord, "id" | "taskId">, call: WorkflowOp): Promise<{ id: string | undefined; live: boolean }> {
|
|
178
|
+
const assigned = (await requireTask(run.taskId)).ownerAgentId ?? undefined;
|
|
179
|
+
const { items } = await call("runAgents", { runId: run.id }) as { items: WorkflowAgent[] };
|
|
180
|
+
const id = items.filter((entry) => entry.taskId === run.taskId && entry.agentId).at(-1)?.agentId
|
|
181
|
+
?? (assigned && !isCoordinatorSeat(getAgent(assigned)) ? assigned : undefined);
|
|
174
182
|
const agent = id ? getAgent(id) : null;
|
|
175
183
|
return { id, live: Boolean(agent && agent.status !== "offline") };
|
|
176
184
|
}
|
|
177
185
|
|
|
178
|
-
async function warmBuilder(
|
|
179
|
-
const builder = await liveBuilder(
|
|
180
|
-
if (!builder.live) throw new ValidationError(`the builder of T${taskId} (${builder.id ?? "none bound"}) is gone, so the findings cannot reach it`);
|
|
186
|
+
async function warmBuilder(run: WorkflowRunRecord, call: WorkflowOp): Promise<string> {
|
|
187
|
+
const builder = await liveBuilder(run, call);
|
|
188
|
+
if (!builder.live) throw new ValidationError(`the builder of T${run.taskId} (${builder.id ?? "none bound"}) is gone, so the findings cannot reach it`);
|
|
181
189
|
return builder.id!;
|
|
182
190
|
}
|
|
183
191
|
|
|
@@ -251,14 +259,19 @@ function reapTargets(run: WorkflowRunRecord, effect: WorkflowEffect, agents: rea
|
|
|
251
259
|
&& (agentIds ? agentIds.has(agent.id) : workflowReapIncludesAgent(run, effect.payload, agent)));
|
|
252
260
|
}
|
|
253
261
|
|
|
262
|
+
/** A stop the host found no target for is retried this rarely: a missing target does not reappear each pass. */
|
|
263
|
+
const TARGET_NOT_FOUND_RETRY_MS = 15 * 60_000;
|
|
264
|
+
|
|
254
265
|
/** The run's latest stop command for an agent. A failed or timed-out one is terminal and never runs again,
|
|
255
|
-
* so the next attempt gets its own id; a pump therefore retries the stop instead of rereading the failure.
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
266
|
+
* so the next attempt gets its own id; a pump therefore retries the stop instead of rereading the failure.
|
|
267
|
+
* One read of the newest attempt, whatever the history (#3827). */
|
|
268
|
+
export async function currentStop(baseId: string, now = supervisorNow()): Promise<{ id: string; prior?: Command }> {
|
|
269
|
+
const latest = await getGateway().read("commands.latestAttempt", { baseId });
|
|
270
|
+
if (!latest) return { id: baseId };
|
|
271
|
+
const { attempt, command } = latest;
|
|
272
|
+
const retry = (command.status === "failed" || command.status === "timed_out")
|
|
273
|
+
&& (command.result?.targetNotFound !== true || now - command.updatedAt >= TARGET_NOT_FOUND_RETRY_MS);
|
|
274
|
+
return retry ? { id: `${baseId}:${attempt + 1}` } : { id: command.id, prior: command };
|
|
262
275
|
}
|
|
263
276
|
|
|
264
277
|
/** Shut each target's live generation down through the shutdown service. The unlanded-work guard's
|
|
@@ -268,6 +281,7 @@ async function reapAgents(run: WorkflowRunRecord, effect: WorkflowEffect, target
|
|
|
268
281
|
const kept: Array<{ spawnRequestId: string; reason: string }> = [];
|
|
269
282
|
const retry: Array<{ spawnRequestId: string; reason: string }> = [];
|
|
270
283
|
const deferred: Array<{ spawnRequestId: string; orchestratorId: string }> = [];
|
|
284
|
+
let inFlight = false;
|
|
271
285
|
for (const agent of targets) {
|
|
272
286
|
const current = agent.agentId ? getAgent(agent.agentId) : null;
|
|
273
287
|
const agentId = current?.meta?.spawnRequestId === agent.spawnRequestId ? agent.agentId : undefined;
|
|
@@ -288,6 +302,7 @@ async function reapAgents(run: WorkflowRunRecord, effect: WorkflowEffect, target
|
|
|
288
302
|
if (stopId && command.type === "agent.spawn" && command.status === "canceled") command = (await shutdownAgent(stop, WORKFLOW_CTX)).command;
|
|
289
303
|
if (stopId && (command.status !== "succeeded" || command.result?.processTreeStopped !== true)) {
|
|
290
304
|
retry.push({ spawnRequestId: agent.spawnRequestId, reason: `shutdown ${command.id}: ${command.status}` });
|
|
305
|
+
if (!isTerminalCommandStatus(command.status)) inFlight = true;
|
|
291
306
|
continue;
|
|
292
307
|
}
|
|
293
308
|
reaped.push({ spawnRequestId: agent.spawnRequestId, ...(agent.agentId ? { agentId: agent.agentId } : {}) });
|
|
@@ -298,7 +313,7 @@ async function reapAgents(run: WorkflowRunRecord, effect: WorkflowEffect, target
|
|
|
298
313
|
else retry.push(entry);
|
|
299
314
|
}
|
|
300
315
|
}
|
|
301
|
-
return { reaped, ...(kept.length ? { kept } : {}), ...(retry.length ? { retry } : {}), ...(deferred.length ? { deferred } : {}) };
|
|
316
|
+
return { reaped, ...(kept.length ? { kept } : {}), ...(retry.length ? { retry } : {}), ...(deferred.length ? { deferred } : {}), ...(inFlight ? { inFlight } : {}) };
|
|
302
317
|
}
|
|
303
318
|
|
|
304
319
|
/** What a timed-out wait was waiting for, in words. */
|
|
@@ -359,7 +374,7 @@ export async function performWorkflowEffect(run: WorkflowRunRecord, effect: Work
|
|
|
359
374
|
if (run.cancel && ["dispatch", "findings", "clear-hold", "hold", "close"].includes(effect.kind)) return { stale: true };
|
|
360
375
|
switch (effect.kind) {
|
|
361
376
|
case "decision": return performWorkflowDecision(run, effect, call);
|
|
362
|
-
case "withdraw-decision": return performWithdrawWorkflowDecision(effect);
|
|
377
|
+
case "withdraw-decision": return (await performWithdrawWorkflowDecision(effect));
|
|
363
378
|
case "cancel-children": throw new ValidationError("tree cancellation is owned by the supervisor");
|
|
364
379
|
case "child": throw new ValidationError("child effects are owned by the workflow supervisor");
|
|
365
380
|
case "close": return closeWorkflowTask(run, effect);
|
|
@@ -367,7 +382,7 @@ export async function performWorkflowEffect(run: WorkflowRunRecord, effect: Work
|
|
|
367
382
|
case "started": {
|
|
368
383
|
const quietFor = await planQuietingRunNotice(run.taskId, "started");
|
|
369
384
|
if (quietFor) return { quiet: "plan-dispatched", planId: quietFor };
|
|
370
|
-
const message = notifySystemMessage(await workflowCoordinatorTarget(run), {
|
|
385
|
+
const message = await notifySystemMessage(await workflowCoordinatorTarget(run), {
|
|
371
386
|
subject: `${runLabel(run)} started`,
|
|
372
387
|
body: `${runLabel(run)} started at step ${run.definition.start}. You hear back only on a spawn failure, an escalation or the result; relay_workflow_get shows the run and its agents.`,
|
|
373
388
|
idempotencyKey: key,
|
|
@@ -377,6 +392,10 @@ export async function performWorkflowEffect(run: WorkflowRunRecord, effect: Work
|
|
|
377
392
|
return { messageId: message.id };
|
|
378
393
|
}
|
|
379
394
|
case "landed": return { superseded: "the CI verdict owns the coordinator notice" };
|
|
395
|
+
case "pause-notice": {
|
|
396
|
+
const message = await notifySystemMessage(await workflowCoordinatorTarget(run), { ...workflowPauseNotice(runLabel(run), run, effect), idempotencyKey: key, replyExpected: false });
|
|
397
|
+
return { messageId: message.id };
|
|
398
|
+
}
|
|
380
399
|
case "reap":
|
|
381
400
|
return reapAgents(run, effect, reapTargets(run, effect, agents));
|
|
382
401
|
case "dispatch": {
|
|
@@ -390,9 +409,9 @@ export async function performWorkflowEffect(run: WorkflowRunRecord, effect: Work
|
|
|
390
409
|
} else if (typeof effect.payload.taskId === "number") await holdTask(run, "routes its review");
|
|
391
410
|
if (typeof effect.payload.taskId === "number") {
|
|
392
411
|
const taskId = effect.payload.taskId;
|
|
393
|
-
const builder = resume ? await liveBuilder(taskId) : undefined;
|
|
412
|
+
const builder = resume ? await liveBuilder({ id: run.id, taskId }, call) : undefined;
|
|
394
413
|
if (builder?.live) {
|
|
395
|
-
const message = notifySystemMessage(builder.id!, {
|
|
414
|
+
const message = await notifySystemMessage(builder.id!, {
|
|
396
415
|
subject: `${runLabel(run)} resumed at ${String(effect.payload.step)}`,
|
|
397
416
|
body: brief!,
|
|
398
417
|
idempotencyKey: key,
|
|
@@ -408,9 +427,9 @@ export async function performWorkflowEffect(run: WorkflowRunRecord, effect: Work
|
|
|
408
427
|
return dispatchRole(run, effect, agents, await createStepTask(run, effect), role, brief, call);
|
|
409
428
|
}
|
|
410
429
|
case "findings": {
|
|
411
|
-
const builder = await warmBuilder(run
|
|
430
|
+
const builder = await warmBuilder(run, call);
|
|
412
431
|
const head = str(effect.payload.head);
|
|
413
|
-
const message = notifySystemMessage(builder, {
|
|
432
|
+
const message = await notifySystemMessage(builder, {
|
|
414
433
|
subject: `${runLabel(run)}: ${String(effect.payload.step)} returned NO-GO on ${short(head)}`,
|
|
415
434
|
body: [
|
|
416
435
|
`${String(effect.payload.step)} (T${String(effect.payload.taskId)}) returned NO-GO on head ${head ?? "(unknown)"}. Round ${String(effect.payload.round)} starts now.`,
|
|
@@ -433,7 +452,7 @@ export async function performWorkflowEffect(run: WorkflowRunRecord, effect: Work
|
|
|
433
452
|
const head = str(effect.payload.head);
|
|
434
453
|
const ensured = await ensureWorkflowLanding(run, effect);
|
|
435
454
|
if (ensured.outcome === "REFUSED" && ensured.held === true) {
|
|
436
|
-
const message = notifySystemMessage(await workflowCoordinatorTarget(run), {
|
|
455
|
+
const message = await notifySystemMessage(await workflowCoordinatorTarget(run), {
|
|
437
456
|
subject: `${runLabel(run)}: GO, awaiting your review hold release`,
|
|
438
457
|
body: `${runLabel(run)}: review returned GO on ${head ?? "an unknown head"}. Your review hold stays set; nothing is submitted for landing. After your review, clear it with relay_task_set_review_hold (taskId: ${run.taskId}, held: false, expectedHeadSha: ${head ?? "the held head"}). The run waits for the land.\n${workflowNotice(run, [])}`,
|
|
439
458
|
idempotencyKey: key,
|
|
@@ -451,12 +470,13 @@ export async function performWorkflowEffect(run: WorkflowRunRecord, effect: Work
|
|
|
451
470
|
}
|
|
452
471
|
if (effect.payload.reason === "ci-red" || effect.payload.reason === "ci-late") {
|
|
453
472
|
const sha = str(effect.payload.landedSha) ?? run.landed?.sha ?? "";
|
|
454
|
-
const
|
|
455
|
-
|
|
456
|
-
|
|
473
|
+
const proof = await workflowLandVerification(run, sha);
|
|
474
|
+
const message = await notifySystemMessage(await workflowCoordinatorTarget(run), {
|
|
475
|
+
subject: `${runLabel(run)} ${proof.verified ? "landed" : "land verification FAILED"}, CI on main ${effect.payload.reason === "ci-red" ? "red" : "late"}`,
|
|
476
|
+
body: workflowNotice(run, [proof.verified ? `T${run.taskId} landed as ${sha}. ${proof.line}` : proof.line, ...(effect.payload.reason === "ci-red" ? ciRedLead(runLabel(run), effect.payload) : [ciResultLine(effect.payload.ci as WorkflowCiVerdict)!])]),
|
|
457
477
|
idempotencyKey: `workflow:landed:${run.id}:${sha}:${effect.waitKey ?? effect.id}`,
|
|
458
478
|
replyExpected: false,
|
|
459
|
-
payload: { kind: "workflow.landed", runId: run.id, taskId: run.taskId, landedSha: sha, reason: effect.payload.reason, ci: effect.payload.ci },
|
|
479
|
+
payload: { verified: proof.verified, kind: "workflow.landed", runId: run.id, taskId: run.taskId, landedSha: sha, reason: effect.payload.reason, ci: effect.payload.ci },
|
|
460
480
|
});
|
|
461
481
|
return { messageId: message.id };
|
|
462
482
|
}
|
|
@@ -465,7 +485,7 @@ export async function performWorkflowEffect(run: WorkflowRunRecord, effect: Work
|
|
|
465
485
|
const lead = effect.payload.reason === "run-overdue" ? await workflowOverdueLead(run, effect.payload) : escalationLead(run, effect.payload);
|
|
466
486
|
if ((effect.payload.reason === "step-timeout" || effect.payload.reason === "run-overdue")
|
|
467
487
|
&& isRecord(effect.payload.waitingFor) && effect.payload.waitingFor.kind === "landed") lead.push(await workflowLandNotice(run));
|
|
468
|
-
const message = notifySystemMessage(await workflowCoordinatorTarget(run), {
|
|
488
|
+
const message = await notifySystemMessage(await workflowCoordinatorTarget(run), {
|
|
469
489
|
subject: `${runLabel(run)} ${run.status === "failed" ? "failed" : "escalated"}`,
|
|
470
490
|
body: workflowNotice(run, [...(run.status === "failed" ? [`Script failed: ${String(effect.payload.reason)}`] : lead), `Outcome: ${effect.payload.alert ? "still waiting" : run.status === "failed" ? "failed" : "escalated"}. Landed: ${run.landed?.sha ?? "none"}. Reason: ${String(effect.payload.reason)}.`, ciResultLine(isRecord(effect.payload.ci) ? effect.payload.ci as WorkflowCiVerdict : undefined) ?? "CI on main: pending or not configured."]),
|
|
471
491
|
idempotencyKey: key,
|
|
@@ -494,18 +514,19 @@ export async function performWorkflowEffect(run: WorkflowRunRecord, effect: Work
|
|
|
494
514
|
const receipt = await planCiNotice(run, effect.payload, true);
|
|
495
515
|
if (receipt) return receipt;
|
|
496
516
|
}
|
|
517
|
+
const proof = sha ? await workflowLandVerification(run, sha) : undefined;
|
|
497
518
|
const ciLine = ciResultLine(ci);
|
|
498
519
|
const quietFor = await planQuietingRunNotice(run.taskId, "result", ci);
|
|
499
|
-
if (quietFor) return { quiet: "plan-dispatched", planId: quietFor };
|
|
520
|
+
if (quietFor && proof?.verified !== false) return { quiet: "plan-dispatched", planId: quietFor };
|
|
500
521
|
const nothingToLand = effect.payload.nothingToLand === true || child?.output?.nothingToLand === true;
|
|
501
522
|
const rounds = typeof effect.payload.rounds === "number" ? effect.payload.rounds : child?.output?.rounds ?? child?.round;
|
|
502
|
-
const outcome = !sha ? "finished its script steps" : nothingToLand ? `had nothing to land: its reviewed head is already on main as ${sha}` : `landed as ${sha}`;
|
|
503
|
-
const message = notifySystemMessage(await workflowCoordinatorTarget(run), {
|
|
504
|
-
subject: `${runLabel(run)} done${nothingToLand ? ", nothing to land" : ""}${ci?.status === "fail" ? ", CI on main red" : ""}`,
|
|
505
|
-
body: workflowNotice(run, [`${runLabel(run)} is done: T${run.taskId} ${outcome}${rounds === undefined ? "" : ` after ${rounds} round(s)`}
|
|
523
|
+
const outcome = !sha ? "finished its script steps" : !proof?.verified ? `has an unverified land receipt for ${sha}` : nothingToLand ? `had nothing to land: its reviewed head is already on main as ${sha}` : `landed as ${sha}`;
|
|
524
|
+
const message = await notifySystemMessage(await workflowCoordinatorTarget(run), {
|
|
525
|
+
subject: `${runLabel(run)} ${proof?.verified === false ? "land verification FAILED" : "done"}${nothingToLand ? ", nothing to land" : ""}${ci?.status === "fail" ? ", CI on main red" : ""}`,
|
|
526
|
+
body: workflowNotice(run, [`${runLabel(run)} is done: T${run.taskId} ${outcome}${rounds === undefined ? "" : ` after ${rounds} round(s)`}.${proof ? ` ${proof.line}` : ""}`, ciLine ?? (child || !run.rootRunId ? "CI on main: not configured." : "CI on main: unknown.")], children.items, !!children.cursor),
|
|
506
527
|
idempotencyKey: key,
|
|
507
528
|
replyExpected: false,
|
|
508
|
-
payload: { kind: "workflow.result", runId: run.id, taskId: run.taskId, landedSha: sha, ...(rounds === undefined ? {} : { rounds }), ...(nothingToLand ? { nothingToLand } : {}), ...(ci ? { ci } : {}) },
|
|
529
|
+
payload: { ...(proof ? { verified: proof.verified } : {}), kind: "workflow.result", runId: run.id, taskId: run.taskId, landedSha: sha, ...(rounds === undefined ? {} : { rounds }), ...(nothingToLand ? { nothingToLand } : {}), ...(ci ? { ci } : {}) },
|
|
509
530
|
});
|
|
510
531
|
return { messageId: message.id };
|
|
511
532
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { isRecord } from "@humwick/sdk";
|
|
2
|
+
import { verifyPublishedLand } from "./landed-ancestry";
|
|
1
3
|
import type { WorkflowRunRecord } from "@humwick/kernel/workflow.pilot";
|
|
2
4
|
import { landLaneSnapshot } from "../db/commands-land-wait";
|
|
3
5
|
import { formatRelativeTime } from "../mcp/presentation";
|
|
@@ -16,3 +18,11 @@ export async function workflowLandNotice(run: WorkflowRunRecord): Promise<string
|
|
|
16
18
|
const progress = workspace.landProgressAt == null ? "unknown" : formatRelativeTime(workspace.landProgressAt).relative;
|
|
17
19
|
return `Land workspace ${workspace.id}: landState ${state} (${age}); last reported progress: ${progress}; lane position ${position} among waiting lands; merging now: ${active.length ? active.join(", ") : lane ? "none" : "unknown"}; gate host: ${gateHost}.`;
|
|
18
20
|
}
|
|
21
|
+
|
|
22
|
+
export async function workflowLandVerification(run: WorkflowRunRecord, sha: string): Promise<{ verified: boolean; line: string }> {
|
|
23
|
+
const workspace = await deliveredWorkspace(run);
|
|
24
|
+
const hostProof = workspace?.metadata.mergeResult;
|
|
25
|
+
const verdict = isRecord(hostProof) && hostProof.landVerifiedSha === sha ? "confirmed" : await verifyPublishedLand(workspace?.repoRoot ?? run.cwd, sha, workspace?.baseRef);
|
|
26
|
+
return verdict === "confirmed" ? { verified: true, line: "verified: true" }
|
|
27
|
+
: { verified: false, line: `Land NOT verified: ${sha} is ${verdict === "not-ancestor" ? "absent from" : "unresolvable on"} fetched origin. Coordinator action required.` };
|
|
28
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// #3757 — what a paused run tells its coordinator: a notice on pause and unpause, and one reminder line per paused run
|
|
2
|
+
// of its team in each new context generation (the self-care section of the self-resume continuation).
|
|
3
|
+
import { isRecord, parseJson } from "@humwick/sdk";
|
|
4
|
+
import type { WorkflowEffect, WorkflowRunRecord } from "@humwick/kernel/workflow.pilot";
|
|
5
|
+
import { coordinatedTeamIds } from "../db/coordinator-seat";
|
|
6
|
+
import { taskOwnerRoleTeamId } from "../db/task-owner";
|
|
7
|
+
import { pausedWorkflowRuns } from "../db/workflow-task-read-ops";
|
|
8
|
+
import { workflowText } from "./workflow-notice";
|
|
9
|
+
|
|
10
|
+
const UNPAUSE = "relay_workflow_resume {runId, pause: false}";
|
|
11
|
+
type Pause = NonNullable<WorkflowRunRecord["pause"]>;
|
|
12
|
+
|
|
13
|
+
function pauseOf(value: unknown): Pause | undefined {
|
|
14
|
+
return isRecord(value) && typeof value.reason === "string" && typeof value.by === "string" && typeof value.at === "number"
|
|
15
|
+
? { reason: value.reason, by: value.by, at: value.at } : undefined;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function pausedBy(pause: Pause): string {
|
|
19
|
+
return `paused since ${new Date(pause.at).toISOString()} by ${pause.by}: ${workflowText(pause.reason, 240)}`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** The coordinator notice a pause or an unpause sends. */
|
|
23
|
+
export function workflowPauseNotice(label: string, run: WorkflowRunRecord, effect: WorkflowEffect): { subject: string; body: string; payload: Record<string, unknown> } {
|
|
24
|
+
const pause = pauseOf(effect.payload) ?? { reason: "", by: "unknown", at: effect.createdAt };
|
|
25
|
+
const kind = effect.payload.action === "unpaused" ? "workflow.unpaused" : "workflow.paused";
|
|
26
|
+
const body = kind === "workflow.paused"
|
|
27
|
+
? `${label} is ${pausedBy(pause)}. A working step agent finishes; the run does not go past its next step, delivery, review or land, and its timers stand still. Continue it: ${UNPAUSE}.`
|
|
28
|
+
: `${label} was unpaused by ${String(effect.payload.unpausedBy)} after ${Math.round(Number(effect.payload.pausedMs) / 60_000)}m. It was ${pausedBy(pause)}. It goes on from step ${run.step}; its deadlines moved by the paused time.`;
|
|
29
|
+
return { subject: `${label} ${kind === "workflow.paused" ? "paused" : "unpaused"}`, body, payload: { kind, runId: run.id, taskId: run.taskId, ...pause, ...(kind === "workflow.unpaused" ? { unpausedBy: effect.payload.unpausedBy } : {}) } };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** The paused runs of the teams this agent coordinates, and the ones it started; "" when none are paused. */
|
|
33
|
+
export function renderPausedRunsSection(agentId: string): string {
|
|
34
|
+
const teams = new Set(coordinatedTeamIds(agentId));
|
|
35
|
+
const lines = pausedWorkflowRuns().flatMap((row) => {
|
|
36
|
+
const teamId = taskOwnerRoleTeamId(row.owner) ?? row.teamId;
|
|
37
|
+
if (row.coordinator !== agentId && row.callerAgentId !== agentId && !(teamId && teams.has(teamId))) return [];
|
|
38
|
+
const pause = pauseOf(parseJson<unknown>(row.pause, undefined));
|
|
39
|
+
if (!pause) return [];
|
|
40
|
+
return [`- ${row.runId} on T${row.taskId}${row.taskTitle ? ` (${workflowText(row.taskTitle, 80)})` : ""}: ${pausedBy(pause)}`];
|
|
41
|
+
});
|
|
42
|
+
return lines.length ? [`Paused workflow runs of your team: they keep their agents and wait. Continue one with ${UNPAUSE}.`, ...lines].join("\n") : "";
|
|
43
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// #3121 — per-step pins on a workflow run: the wire parser every surface shares, and the start check that
|
|
2
2
|
// resolves each step's launch (pin, role file and dispatch policy) through the spawn's own seam and refuses a
|
|
3
3
|
// launch that cannot run before anything spawns. Precedence (call pin > YAML step) is the kernel's workflowStepPin.
|
|
4
|
-
import { cleanString, isRecord, isSpawnProvider, SPAWN_PROVIDERS, stringValue, type SpawnProvider, type TaskDispatch } from "@humwick/sdk";
|
|
4
|
+
import { cleanString, isRecord, isSpawnProvider, SPAWN_PROVIDERS, stringValue, type SpawnProvider, type TaskDispatch, type WorkflowRunPins } from "@humwick/sdk";
|
|
5
5
|
import { findProviderCatalogModel, type ProviderCatalogEntry } from "@humwick/sdk/provider-catalog";
|
|
6
6
|
import {
|
|
7
7
|
stampWorkflowPins, WORKFLOW_PIN_FIELDS, WorkflowDefinitionError, workflowStepPin,
|
|
@@ -15,11 +15,12 @@ import { sameHostIdentity } from "../utils";
|
|
|
15
15
|
import { roleSpawnableProviders } from "./spawn-project-role";
|
|
16
16
|
import { resolveSpawnLaunch, roleLaunchDefaults } from "./spawn-launch";
|
|
17
17
|
import { ServiceAuthError } from "./errors";
|
|
18
|
+
import { PinnedHostCapacityError } from "../spawn-admission";
|
|
18
19
|
import type { ProjectRole } from "../project-roles";
|
|
19
20
|
import type { AgentCard } from "../types";
|
|
20
21
|
import type { AuthContext } from "./auth-context";
|
|
21
22
|
|
|
22
|
-
export type WorkflowPins =
|
|
23
|
+
export type WorkflowPins = WorkflowRunPins;
|
|
23
24
|
|
|
24
25
|
export const PIN_SOURCE_LABEL = { start: "start pin", resume: "resume pin", team: "team default", global: "global default", workflow: "workflow file" } as const;
|
|
25
26
|
|
|
@@ -118,12 +119,14 @@ export async function assertStepLaunches(check: StepLaunchCheck, ctx: AuthContex
|
|
|
118
119
|
const from = declared.crossProvider;
|
|
119
120
|
const avoid = from && !pin?.provider ? check.avoided?.(from) ?? launched.get(from) : undefined;
|
|
120
121
|
const defaults = roleLaunchDefaults(role);
|
|
121
|
-
const
|
|
122
|
+
const input = {
|
|
122
123
|
profile: defaults.profile, spawnCap: { callerAgentId: ctx.callerAgentId },
|
|
123
124
|
provider: (pin?.provider as SpawnProvider | undefined) ?? defaults.provider, dispatchPin: { model: pin?.model, effort: pin?.effort },
|
|
124
125
|
dispatchShape: stepTaskDispatch(check.inputTask, declared) ?? defaults.dispatchShape, orchestratorId: pin?.orchestratorId, ...(avoid ? { avoidProviders: [avoid] } : {}), projectRole: role,
|
|
125
126
|
pinSources: pin?.from,
|
|
126
|
-
}
|
|
127
|
+
};
|
|
128
|
+
const launch = await resolveSpawnLaunch(input).catch((error: Error) => {
|
|
129
|
+
if (error instanceof PinnedHostCapacityError) return resolveSpawnLaunch({ ...input, spawnCap: { ...input.spawnCap, attach: true } });
|
|
127
130
|
throw new ValidationError(`${where}: ${error.message}`);
|
|
128
131
|
});
|
|
129
132
|
const runnable = roleSpawnableProviders(pin?.orchestratorId, role, launch.catalog);
|
|
@@ -8,7 +8,7 @@ import { workflowDecisionSignal } from "./workflow-decisions";
|
|
|
8
8
|
import { errMessage, isRecord, stringValue } from "@humwick/sdk";
|
|
9
9
|
|
|
10
10
|
import { waitTimeoutMs } from "@humwick/kernel/workflow-definition";
|
|
11
|
-
import { workflowEffectId, type WorkflowAgent, type WorkflowEffect, type WorkflowRunRecord, type WorkflowSignal } from "@humwick/kernel/workflow.pilot";
|
|
11
|
+
import { workflowEffectId, workflowRunClock, type WorkflowAgent, type WorkflowEffect, type WorkflowRunRecord, type WorkflowSignal } from "@humwick/kernel/workflow.pilot";
|
|
12
12
|
import { listActivityEventsAsync } from "../db";
|
|
13
13
|
|
|
14
14
|
import { getGateway } from "../db/gateway";
|
|
@@ -21,7 +21,7 @@ import { workflowCleanupDeferred, notifyDeferredWorkflowCleanup } from "./workfl
|
|
|
21
21
|
|
|
22
22
|
import { deliveredWorkspace, landedSignal, landStopSignal } from "./workflow-land";
|
|
23
23
|
|
|
24
|
-
import { invoke, SUPERVISOR, testOptions, type Supervisor } from "./workflow-supervisor-state";
|
|
24
|
+
import { invoke, SUPERVISOR, supervisorNow, testOptions, type Supervisor } from "./workflow-supervisor-state";
|
|
25
25
|
import { workflowWaitAgent } from "./workflow-agent-obligation";
|
|
26
26
|
import { landingProgress } from "../workspace-phase";
|
|
27
27
|
type Json = Record<string, unknown>;
|
|
@@ -48,8 +48,9 @@ async function alertStalled(sup: Supervisor, run: WorkflowRunRecord, wait: Await
|
|
|
48
48
|
|
|
49
49
|
/** A wait past its deadline alerts the coordinator once and keeps waiting, like a stopped land (#3045 H1). */
|
|
50
50
|
async function alertTimeout(sup: Supervisor, run: WorkflowRunRecord, wait: Awaiting, taskId: number | undefined): Promise<boolean> {
|
|
51
|
+
if (wait.slot) return false;
|
|
51
52
|
const timeoutMs = wait.deadline !== undefined ? wait.deadline - wait.since : waitTimeoutMs(run.definition, run.step);
|
|
52
|
-
const now = (
|
|
53
|
+
const now = workflowRunClock(run, supervisorNow());
|
|
53
54
|
if (wait.timedOutAt !== undefined || now < wait.since + timeoutMs) return false;
|
|
54
55
|
if (wait.kind === "landed") {
|
|
55
56
|
const workspace = await deliveredWorkspace(run);
|
|
@@ -65,13 +66,15 @@ export async function reconcileRun(sup: Supervisor, run: WorkflowRunRecord, land
|
|
|
65
66
|
const wait = run.awaiting;
|
|
66
67
|
if (!wait || (await invoke<{ present: boolean }>(sup, "hasSignal", { key: wait.key })).present) return false;
|
|
67
68
|
if (wait.kind === "for-each") return false;
|
|
69
|
+
// #3757 — a paused run's deadlines stand still: they are read at its pause.
|
|
70
|
+
const now = workflowRunClock(run, supervisorNow());
|
|
68
71
|
let payload: Json | undefined;
|
|
69
72
|
let kind: WorkflowSignal["kind"] = wait.kind;
|
|
70
73
|
const taskId = wait.taskId ?? await effectTaskId(sup, wait.effectId);
|
|
71
74
|
if (wait.kind === "decision") {
|
|
72
75
|
payload = workflowDecisionSignal(wait.effectId!);
|
|
73
76
|
if (!payload) {
|
|
74
|
-
if (wait.deadline === undefined ||
|
|
77
|
+
if (wait.deadline === undefined || now < wait.deadline) return false;
|
|
75
78
|
kind = "effect-failed";
|
|
76
79
|
payload = { effect: "decision", error: "DECISION_DEADLINE: operator decision reached its explicit deadline" };
|
|
77
80
|
}
|
|
@@ -80,7 +83,7 @@ export async function reconcileRun(sup: Supervisor, run: WorkflowRunRecord, land
|
|
|
80
83
|
if (!effect?.result?.childRunId) return false;
|
|
81
84
|
const child = await invoke<WorkflowRunRecord>(sup, "get", { runId: effect.result.childRunId });
|
|
82
85
|
if (child.status === "running") {
|
|
83
|
-
if (wait.deadline !== undefined &&
|
|
86
|
+
if (wait.deadline !== undefined && now >= wait.deadline) return (await invoke<{ created: boolean }>(sup, "parkChild", { runId: run.id, childRunId: child.id, reason: `CHILD_TIMEOUT: ${child.id} exceeded ${wait.deadline}` })).created;
|
|
84
87
|
return false;
|
|
85
88
|
}
|
|
86
89
|
if (child.status === "escalated") {
|
|
@@ -112,19 +115,19 @@ export async function reconcileRun(sup: Supervisor, run: WorkflowRunRecord, land
|
|
|
112
115
|
payload = taskId === undefined ? undefined : await deliverySignal(run, taskId, wait.afterEventId, wait.since);
|
|
113
116
|
if (!payload) {
|
|
114
117
|
const { effect } = await invoke<{ effect?: WorkflowEffect }>(sup, "getEffect", { id: wait.effectId ?? workflowEffectId(run.id, run.waitSeq, "dispatch") });
|
|
115
|
-
payload = await spawnFailureSignal(effect,
|
|
118
|
+
payload = await spawnFailureSignal(effect, now);
|
|
116
119
|
if (payload) kind = "effect-failed";
|
|
117
120
|
}
|
|
118
121
|
if (!payload) {
|
|
119
|
-
payload = await exitSignal(sup, run);
|
|
122
|
+
payload = await exitSignal(sup, run, now);
|
|
120
123
|
if (payload) kind = payload.effect === "dispatch" ? "effect-failed" : "agent-exited";
|
|
121
124
|
}
|
|
122
125
|
} else if (wait.kind === "ci") {
|
|
123
126
|
// A CI wait ends on its verdict, never on a timeout alert: past the deadline it reports CI red or "no CI".
|
|
124
|
-
const outcome = await ciMainOutcome(run, wait,
|
|
127
|
+
const outcome = await ciMainOutcome(run, wait, now, (await deliveredWorkspace(run))?.baseRef);
|
|
125
128
|
if (outcome.red && (await invoke<{ created: boolean }>(sup, "alert", { runId: run.id, waitKey: wait.key, ...outcome.red })).created) return true;
|
|
126
129
|
if (!outcome.verdict) return false;
|
|
127
|
-
if (outcome.verdict.status === "none" && wait.deadline !== undefined &&
|
|
130
|
+
if (outcome.verdict.status === "none" && wait.deadline !== undefined && now >= wait.deadline
|
|
128
131
|
&& (await invoke<{ created: boolean }>(sup, "alert", { runId: run.id, waitKey: wait.key, key: "ci-late", reason: "ci-late", detail: { ci: outcome.verdict, landedSha: wait.sha } })).created) return true;
|
|
129
132
|
payload = outcome.verdict;
|
|
130
133
|
} else {
|
|
@@ -153,10 +156,10 @@ export async function reconcileRun(sup: Supervisor, run: WorkflowRunRecord, land
|
|
|
153
156
|
}
|
|
154
157
|
|
|
155
158
|
/** #3166 — the wait's step agent exited without a delivery, has stayed gone past the grace, and is not live again. */
|
|
156
|
-
async function exitSignal(sup: Supervisor, run: WorkflowRunRecord): Promise<Json | undefined> {
|
|
159
|
+
async function exitSignal(sup: Supervisor, run: WorkflowRunRecord, now: number): Promise<Json | undefined> {
|
|
157
160
|
const { agent } = await invoke<{ agent?: WorkflowAgent }>(sup, "exitedWaitAgent", { runId: run.id });
|
|
158
161
|
if (agent?.spawnFailedAt && !agent.readyAt) return { effect: "dispatch", error: `spawn ${agent.spawnRequestId}: ${agent.spawnError ?? "spawn failed"}` };
|
|
159
|
-
if (!agent?.exitedAt ||
|
|
162
|
+
if (!agent?.exitedAt || now - agent.exitedAt < AGENT_EXIT_GRACE_MS) return undefined;
|
|
160
163
|
return agentExitSignal(agent);
|
|
161
164
|
}
|
|
162
165
|
|
|
@@ -4,16 +4,16 @@ import type { WorkflowAgent, WorkflowRunRecord } from "@humwick/kernel/workflow.
|
|
|
4
4
|
import { getAgent, getTaskDetailAsync, ValidationError } from "../db";
|
|
5
5
|
import type { ProjectRole } from "../project-roles";
|
|
6
6
|
import { resolveSpawnProjectRole } from "./spawn-project-role";
|
|
7
|
-
import { liveBuilder, stepAgentProvider } from "./workflow-effects";
|
|
7
|
+
import { liveBuilder, stepAgentProvider, type WorkflowOp } from "./workflow-effects";
|
|
8
8
|
import { assertStepLaunches, unmetPinFields } from "./workflow-pins";
|
|
9
9
|
import type { AuthContext } from "./auth-context";
|
|
10
10
|
|
|
11
11
|
/** A resume's new pins: a live warm builder must already meet its step's pin, since the run hands it findings
|
|
12
12
|
* instead of spawning and replacing it would take its workspace; and each named step's launch must resolve and run. */
|
|
13
|
-
export async function assertResumePins(run: WorkflowRunRecord, pins: Record<string, WorkflowCallPin>, task: NonNullable<Awaited<ReturnType<typeof getTaskDetailAsync>>>, ctx: AuthContext, agents: readonly WorkflowAgent[]): Promise<void> {
|
|
13
|
+
export async function assertResumePins(run: WorkflowRunRecord, pins: Record<string, WorkflowCallPin>, task: NonNullable<Awaited<ReturnType<typeof getTaskDetailAsync>>>, ctx: AuthContext, agents: readonly WorkflowAgent[], call: WorkflowOp): Promise<void> {
|
|
14
14
|
const merged = { ...run.pins, ...pins };
|
|
15
15
|
const steps = Object.keys(run.definition.steps).filter((step) => pins[step]);
|
|
16
|
-
const builder = await liveBuilder(run
|
|
16
|
+
const builder = await liveBuilder(run, call);
|
|
17
17
|
const agent = builder.live ? getAgent(builder.id!) : null;
|
|
18
18
|
for (const step of steps.filter((name) => run.definition.steps[name]!.task === "input")) {
|
|
19
19
|
const pin = workflowStepPin(run.definition, merged, step, run.routingDefaults);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { StepRoutingDefaults, TaskDetail } from "@humwick/sdk";
|
|
2
|
+
import type { WorkflowRoutingDefaults } from "@humwick/kernel/workflow-definition";
|
|
3
|
+
import { getAgent, getTeam } from "../db";
|
|
4
|
+
import { taskOwnerRoleTeamId } from "../db/task-owner";
|
|
5
|
+
|
|
6
|
+
/** #3829 — defaults follow the Task's durable owner, then its nearest configured ancestor. */
|
|
7
|
+
export function resolveWorkflowRoutingDefaults(defaults: StepRoutingDefaults | undefined, task: Pick<TaskDetail, "owner" | "teamId" | "createdBy">, callerAgentId?: string): WorkflowRoutingDefaults | undefined {
|
|
8
|
+
if (!defaults) return undefined;
|
|
9
|
+
const coordinatorId = callerAgentId ?? task.createdBy;
|
|
10
|
+
const teamId = taskOwnerRoleTeamId(task.owner) ?? task.teamId ?? (coordinatorId ? getAgent(coordinatorId)?.teamId : undefined);
|
|
11
|
+
const visited = new Set<string>();
|
|
12
|
+
for (let current = teamId; current && !visited.has(current); current = getTeam(current)?.parentTeamId) {
|
|
13
|
+
visited.add(current);
|
|
14
|
+
const team = defaults.teams?.[current];
|
|
15
|
+
if (team) return { global: defaults.global, team, teamId: current };
|
|
16
|
+
}
|
|
17
|
+
return { global: defaults.global, ...(teamId ? { teamId } : {}) };
|
|
18
|
+
}
|
|
@@ -6,9 +6,9 @@ import { workflowText } from "./workflow-notice";
|
|
|
6
6
|
|
|
7
7
|
type Awaiting = NonNullable<WorkflowRunRecord["awaiting"]>;
|
|
8
8
|
|
|
9
|
-
function awaitingView({ kind, taskId, sha, deadline, timedOutAt }: Awaiting): NonNullable<WorkflowRunView["awaiting"]> {
|
|
9
|
+
function awaitingView({ kind, taskId, sha, deadline, timedOutAt, slot }: Awaiting): NonNullable<WorkflowRunView["awaiting"]> {
|
|
10
10
|
return {
|
|
11
|
-
kind, ...(taskId !== undefined ? { taskId } : {}), ...(sha ? { sha } : {}), ...(deadline !== undefined ? { deadline } : {}), ...(timedOutAt !== undefined ? { timedOutAt } : {}),
|
|
11
|
+
kind, ...(taskId !== undefined ? { taskId } : {}), ...(sha ? { sha } : {}), ...(deadline !== undefined ? { deadline } : {}), ...(timedOutAt !== undefined ? { timedOutAt } : {}), ...(slot ? { slot } : {}),
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
14
|
|
|
@@ -23,7 +23,7 @@ export function runView(run: WorkflowRunRecord): WorkflowRunView {
|
|
|
23
23
|
/** The declared steps in order; `land` follows the last. */
|
|
24
24
|
steps: Object.entries(run.definition.steps).map(([name, step]) => {
|
|
25
25
|
const pin = workflowStepPin(run.definition, run.pins, name, run.routingDefaults);
|
|
26
|
-
return { name, role: step.role, ...(step.gate ? { gate: step.gate } : {}), ...(step.crossProvider ? { crossProvider: step.crossProvider } : {}), ...(pin ? { pin } : {}) };
|
|
26
|
+
return { name, role: step.role, started: run.entered.includes(name), ...(step.gate ? { gate: step.gate } : {}), ...(step.crossProvider ? { crossProvider: step.crossProvider } : {}), ...(pin ? { pin } : {}) };
|
|
27
27
|
}),
|
|
28
28
|
...(run.definition.ciMain ? { ciMain: { ...(run.definition.ciMain.workflow ? { workflow: run.definition.ciMain.workflow } : {}) } } : {}),
|
|
29
29
|
ref: run.ref,
|
|
@@ -40,8 +40,10 @@ export function runView(run: WorkflowRunRecord): WorkflowRunView {
|
|
|
40
40
|
...(run.awaiting ? { awaiting: awaitingView(run.awaiting) } : {}),
|
|
41
41
|
...(run.overdueAt !== undefined ? { overdueAt: run.overdueAt } : {}),
|
|
42
42
|
...(run.overdueNotifiedAt !== undefined ? { overdueNotifiedAt: run.overdueNotifiedAt } : {}),
|
|
43
|
+
...(run.pause ? { paused: run.pause } : {}),
|
|
43
44
|
...(run.reason ? { reason: run.reason } : {}),
|
|
44
45
|
...(run.resumes?.length ? { resumes: run.resumes } : {}),
|
|
46
|
+
...(run.pinChanges?.length ? { pinChanges: run.pinChanges } : {}),
|
|
45
47
|
...(run.output ? { output: run.output } : {}),
|
|
46
48
|
createdAt: run.createdAt,
|
|
47
49
|
updatedAt: run.updatedAt,
|
|
@@ -57,6 +59,7 @@ export function leanRunView(run: WorkflowRunRecord, agents: WorkflowRunAgent[]):
|
|
|
57
59
|
...(run.overdueAt !== undefined ? { overdueAt: run.overdueAt } : {}),
|
|
58
60
|
...(run.overdueNotifiedAt !== undefined ? { overdueNotifiedAt: run.overdueNotifiedAt } : {}),
|
|
59
61
|
...(run.awaiting ? { awaiting: awaitingView(run.awaiting) } : {}),
|
|
62
|
+
...(run.pause ? { paused: run.pause } : {}),
|
|
60
63
|
...(run.reason ? { reason: workflowText(run.reason) } : {}),
|
|
61
64
|
...(run.output ? { output: { ...run.output, ...(run.output.ci ? { ci: { status: run.output.ci.status, ...(run.output.ci.sha ? { sha: run.output.ci.sha } : {}) } } : {}) } } : {}),
|
|
62
65
|
agents: agents.map((agent) => ({
|
|
@@ -90,7 +90,7 @@ export function installWorkflowHost(options: { confirmStops?: boolean } = {}): (
|
|
|
90
90
|
export async function initWorkflowDb(): Promise<void> {
|
|
91
91
|
await stopWorkflowServingForTests();
|
|
92
92
|
await settleLandLifecycleDrives();
|
|
93
|
-
flushTaskStatusPulses();
|
|
93
|
+
await flushTaskStatusPulses();
|
|
94
94
|
initDb(":memory:");
|
|
95
95
|
}
|
|
96
96
|
|