@humwick/server 0.130.1 → 0.130.2
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/docs/guides/tools-administration.md +4 -0
- package/docs/guides/tools-coordination.md +1 -0
- package/docs/guides/tools-tasks.md +8 -0
- package/docs/guides/workflows.md +58 -0
- package/docs/openapi.json +414 -1
- package/package.json +8 -17
- package/public/assets/{MessageBubble-BWpoBjl4.js → MessageBubble-BWLqMGKG.js} +2 -2
- package/public/assets/{PlanGraphPanel-C0auck3n.js → PlanGraphPanel-3TlIQpjk.js} +2 -2
- package/public/assets/{TraceView-DBnOx7AQ.js → TraceView-Wimm0Czv.js} +2 -2
- package/public/assets/{VaultDecisionCard-0kp2oNBC.js → VaultDecisionCard-Bau_vNax.js} +2 -2
- package/public/assets/{activity-yLztXEBt.js → activity-CrSurn-r.js} +2 -2
- package/public/assets/{agent-lineage-BbJDR1dW.js → agent-lineage-CknAJKcb.js} +2 -2
- package/public/assets/agent-liveness-CaNwK0Zf.js +2 -0
- package/public/assets/{agent-name-CTZBrSD9.js → agent-name-DKbiIhBo.js} +2 -2
- package/public/assets/agent-profiles-DwF6EQ4R.js +2 -0
- package/public/assets/{agent-project-badge-9TqzUUYE.js → agent-project-badge-Diz4Sjjb.js} +2 -2
- package/public/assets/{agent-tools-D4n40pn8.js → agent-tools-CRhpRQza.js} +2 -2
- package/public/assets/{agent-type-icon-D6FUarOf.js → agent-type-icon-LrUEU3lB.js} +2 -2
- package/public/assets/{agents-BYDslkJc.js → agents-B-v66C-4.js} +2 -2
- package/public/assets/{analytics-B-XSbEMC.js → analytics-BqCb-LKi.js} +2 -2
- package/public/assets/{artifact-viewer-DdWIfV6M.js → artifact-viewer-kf4pGuAR.js} +2 -2
- package/public/assets/{artifacts-oBOqks-2.js → artifacts-D32zyw4Y.js} +2 -2
- package/public/assets/{artifacts-DPN1q4pA.js → artifacts-DJevXcvg.js} +2 -2
- package/public/assets/{automation-4KcRFXEu.js → automation-BpRajx_5.js} +2 -2
- package/public/assets/{backlog-Cw9xPTCF.js → backlog-D_UjTdzX.js} +2 -2
- package/public/assets/{busy-health-CTu32MZt.js → busy-health-N3VEh4ao.js} +2 -2
- package/public/assets/{channels-BiXzg1G9.js → channels-9jopungq.js} +2 -2
- package/public/assets/{chat-Ctk2qwvA.js → chat-CSXrTB3C.js} +2 -2
- package/public/assets/{code-preview-Bm1wWqAp.js → code-preview-p1NnmqK0.js} +2 -2
- package/public/assets/{connectors-C36ax4Vw.js → connectors-CZdqlDNL.js} +2 -2
- package/public/assets/{cosmos-Jj9LK2Wf.js → cosmos-BgdsE4dG.js} +2 -2
- package/public/assets/{crate-agent-H6S7-B9T.js → crate-agent-30aXTKva.js} +2 -2
- package/public/assets/{dependency-graph-Cd1E23wa.js → dependency-graph-B_jvw2GE.js} +2 -2
- package/public/assets/{deploys-Bwfq146q.js → deploys-DoN6bAb5.js} +2 -2
- package/public/assets/{display-CfO7rTuF.js → display-BrKWFGJz.js} +2 -2
- package/public/assets/{files-DhhZI2Ih.js → files-D6XEu8Ng.js} +2 -2
- package/public/assets/{fleet-B_rFEbnL.js → fleet-C7jQWbw2.js} +2 -2
- package/public/assets/{fleet-metrics-BkHP-P3R.js → fleet-metrics-BiDs3MLx.js} +2 -2
- package/public/assets/{formatted-body-Cm1RrzmN.js → formatted-body-CQBwc1fb.js} +3 -3
- package/public/assets/{formatted-body-impl-DQiOuOD1.js → formatted-body-impl-DyG0WsQS.js} +2 -2
- package/public/assets/{host-providers-dialog-CHqwXTov.js → host-providers-dialog-DKaW31dN.js} +2 -2
- package/public/assets/index-CRHep3M9.js +15 -0
- package/public/assets/index-MYAIwYTX.css +2 -0
- package/public/assets/{insights-fH1EL-qZ.js → insights-CzrtkpOE.js} +2 -2
- package/public/assets/{integrations-C5Oix6ng.js → integrations-aVsUmigt.js} +2 -2
- package/public/assets/{issue-ref-chip-ODyondIa.js → issue-ref-chip-BnSlM_95.js} +2 -2
- package/public/assets/{log-viewer-Cvfy6PW7.js → log-viewer-qe7Ee47Z.js} +2 -2
- package/public/assets/{maintenance-D8CDH5wZ.js → maintenance-NfjqFZAk.js} +2 -2
- package/public/assets/{managed-agents-egllbpij.js → managed-agents-BiH0HgaE.js} +2 -2
- package/public/assets/{markdown-preview-CYSFgVgK.js → markdown-preview-BixaT3Xr.js} +3 -3
- package/public/assets/{markdown-preview-impl-BteVIjX4.js → markdown-preview-impl-DNGlWIS3.js} +2 -2
- package/public/assets/{memory-C8WmXsyr.js → memory-DNsCl6UX.js} +2 -2
- package/public/assets/{messages-BzQdqlO6.js → messages-DopU1L1X.js} +2 -2
- package/public/assets/{orchestrators-B1HxzkNw.js → orchestrators-Cq7ckLQT.js} +2 -2
- package/public/assets/{overview-DCUnI4Z7.js → overview-C1DCTzzV.js} +2 -2
- package/public/assets/{pairs-ftCd2XcD.js → pairs-DE_m6rrE.js} +2 -2
- package/public/assets/{profile-icon-B2zH8DMH.js → profile-icon-B3rfh77F.js} +2 -2
- package/public/assets/project-profile-instructions-DQWZE0kA.js +2 -0
- package/public/assets/projects-Br2Bd2h1.js +2 -0
- package/public/assets/{prompt-settings-Bftq9czX.js → prompt-settings-BKvFsvGD.js} +2 -2
- package/public/assets/provider-display-DsuWMvVL.js +2 -0
- package/public/assets/{registry-DWCU5c8q.js → registry-Cw38_6gW.js} +2 -2
- package/public/assets/run-card-CpKqRbhg.js +2 -0
- package/public/assets/scroll-text-BKXS1ahr.js +2 -0
- package/public/assets/{secrets-C7GIUATz.js → secrets-DxI-vzSq.js} +2 -2
- package/public/assets/{service-access-settings-C3aujqTG.js → service-access-settings-D9s_VJbd.js} +2 -2
- package/public/assets/{settings-C6sZ9eBa.js → settings-CKZTVGIx.js} +2 -2
- package/public/assets/{shipping-Bu8p1gEw.js → shipping-B9YtnwtG.js} +2 -2
- package/public/assets/{stats-V9Z-GxUd.js → stats-DyUBKyWI.js} +2 -2
- package/public/assets/{status-dot-CVv0iGHL.js → status-dot-DYqlEUhJ.js} +2 -2
- package/public/assets/{store-BvtFdlGX.js → store-DcClXLH0.js} +3 -3
- package/public/assets/{tasks-CXU75HRF.js → tasks-Bh7Chr4-.js} +2 -2
- package/public/assets/{teams-BPf976zb.js → teams-bowI7qVY.js} +2 -2
- package/public/assets/{terminal-viewer-DE9BOe-8.js → terminal-viewer-BgVLHdsU.js} +3 -3
- package/public/assets/{terminal-viewer-impl-D04pjmGh.js → terminal-viewer-impl-Dz22UPy6.js} +2 -2
- package/public/assets/token-estimate-Co-Jdphh.js +2 -0
- package/public/assets/{use-agent-terminal-B1yR456R.js → use-agent-terminal-DSQQ-iY7.js} +2 -2
- package/public/assets/{use-decisions-D-S4tpDf.js → use-decisions-samMQhQf.js} +2 -2
- package/public/assets/use-project-list-59LheVP7.js +2 -0
- package/public/assets/{use-selectors-CnrAk2YP.js → use-selectors-BZa25xEB.js} +2 -2
- package/public/assets/{user-avatar-nBFIcR4M.js → user-avatar-DHxlvUvV.js} +2 -2
- package/public/assets/versioned-prompt-editor-BmED5DnJ.js +8 -0
- package/public/assets/{work-queue-TCjJxeT-.js → work-queue-CSvpuNLz.js} +2 -2
- package/public/assets/{workflow-marker-Cf3Hf2fN.js → workflow-marker-DAZcj5qt.js} +2 -2
- package/public/assets/{workflows-CXQX20Qj.js → workflows-DdmxRSyg.js} +2 -2
- package/public/assets/{workspaces-qSYzKYMA.js → workspaces-BxeKfVuF.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/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/agent-runner/credentials.ts +42 -12
- package/runner/src/agent-runner/inbox.ts +27 -0
- package/runner/src/agent-runner/lifecycle-milestones.ts +0 -2
- 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/index.ts +5 -2
- package/runner/src/provider-setup.ts +34 -0
- package/runner/src/providers.ts +2 -1
- package/runner/src/runner-core.ts +18 -23
- package/runner/src/spawn-input.ts +2 -1
- package/runner/src/test-run-dedup.ts +59 -56
- package/scripts/cd-config.ts +8 -0
- package/scripts/gate-run-lease.ts +10 -7
- package/scripts/gate.sh +5 -1
- package/src/branch-land-notice.ts +93 -0
- package/src/branch-landed.ts +7 -76
- package/src/bus.ts +19 -20
- package/src/cd-deploy-notify.ts +30 -2
- 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/root-missing.ts +2 -7
- package/src/ci/transition-notify.ts +7 -39
- 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 +8 -2
- package/src/commands-db.ts +3 -3
- package/src/config-store-write.ts +13 -1
- package/src/config-store.ts +25 -14
- 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-search.ts +1 -15
- package/src/db/agents-async.ts +52 -5
- package/src/db/agents-write-ops.ts +12 -3
- package/src/db/agents.ts +81 -54
- package/src/db/ci-incidents-async.ts +5 -5
- package/src/db/ci-incidents-write-ops.ts +2 -2
- package/src/db/command-row.ts +10 -2
- package/src/db/commands-list-query.ts +2 -0
- package/src/db/commands-spawn-read.ts +1 -1
- package/src/db/config-store-write-ops.ts +7 -2
- package/src/db/continuation-archives-async.ts +5 -0
- package/src/db/continuation-archives-write-ops.ts +7 -0
- package/src/db/continuations.ts +2 -2
- 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/hosts-registration.ts +10 -2
- package/src/db/hosts.ts +9 -6
- package/src/db/inbox.ts +0 -14
- 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-lifecycle.ts +3 -4
- package/src/db/issue-refs-async.ts +20 -0
- package/src/db/issue-refs-write-ops.ts +29 -0
- package/src/db/issue-refs.ts +7 -8
- package/src/db/long-running-work.ts +2 -2
- package/src/db/main-connection-writes.ts +23 -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/mappers.ts +2 -14
- package/src/db/merge-lease.ts +1 -15
- package/src/db/migrations.ts +7 -15
- package/src/db/orchestrators.ts +4 -72
- package/src/db/pairs.ts +1 -13
- package/src/db/project-profile-instructions.ts +50 -0
- 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 +5 -0
- package/src/db/read-ops.ts +4 -0
- package/src/db/routing-policy.ts +2 -3
- package/src/db/schema.ts +9 -3
- package/src/db/spawn-delegation-state.ts +11 -4
- package/src/db/stats-async.ts +4 -3
- package/src/db/task-entity.ts +23 -2
- package/src/db/task-list.ts +3 -1
- package/src/db/tasks.ts +1 -17
- package/src/db/timer-ingress.ts +7 -1
- package/src/db/token-db-write-ops.ts +17 -0
- package/src/db/token-standing.ts +15 -11
- package/src/db/workflow-contact.ts +1 -1
- package/src/db/workflow-task-read-ops.ts +30 -0
- package/src/db/write-ops.ts +6 -0
- package/src/db/writer-gateway.ts +17 -11
- 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/host/disk-alert.ts +121 -0
- package/src/lifecycle-manager.ts +3 -2
- package/src/maintenance/cd-watcher.ts +3 -3
- package/src/maintenance/critical-job-watchdog.ts +16 -17
- package/src/maintenance/index.ts +1 -0
- package/src/maintenance/jobs.ts +3 -2
- package/src/maintenance/scheduler.ts +84 -128
- package/src/maintenance/stalled-delivery-pager.ts +6 -5
- package/src/maintenance/workspaces.ts +1 -1
- package/src/managed-policy.ts +31 -27
- package/src/mcp/index.ts +5 -2
- package/src/mcp/output-descriptions.ts +8 -8
- package/src/mcp/presentation.ts +4 -4
- package/src/mcp/project-profile-instructions.ts +32 -0
- package/src/mcp/tool-groups.ts +1 -1
- package/src/mcp/tools-spawn.ts +4 -3
- package/src/mcp-agent-action.ts +1 -2
- package/src/mcp-issue-ref-tools.ts +12 -11
- package/src/mcp-maintenance-tools.ts +2 -2
- package/src/mcp-profile-trust-tools.ts +4 -4
- package/src/mcp-provider-catalog.ts +2 -2
- package/src/mcp-task-tools.ts +11 -5
- package/src/mcp-team-template-tools.ts +3 -3
- package/src/mcp-workflow-tools.ts +10 -3
- package/src/notification-types.ts +2 -1
- package/src/operator-alarm.ts +26 -11
- package/src/project-instructions.ts +4 -0
- package/src/project-profile-instruction-text.ts +6 -0
- package/src/project-profile-instructions.ts +20 -0
- 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-config-store.ts +5 -4
- package/src/provider-secrets.test-fixture.ts +3 -3
- package/src/recipe-runner.ts +2 -2
- package/src/repo-config-source.ts +10 -4
- package/src/routes/agent-profiles.ts +6 -6
- package/src/routes/agents-spawn.ts +1 -1
- package/src/routes/agents.ts +6 -6
- package/src/routes/commands-listing.ts +4 -0
- package/src/routes/commands.ts +2 -2
- package/src/routes/continuation-archives.ts +2 -2
- package/src/routes/index.ts +10 -1
- package/src/routes/integrations.ts +24 -50
- package/src/routes/issue-refs.ts +7 -7
- package/src/routes/orchestrator-bootstrap.ts +1 -1
- package/src/routes/orchestrator-host-registration.ts +2 -2
- package/src/routes/orchestrator-host-utilization.ts +3 -1
- package/src/routes/orchestrator-proxy.ts +2 -2
- package/src/routes/orchestrator.ts +2 -2
- package/src/routes/project-profile-instructions.ts +27 -0
- package/src/routes/project-trust.ts +2 -2
- package/src/routes/provider-config.ts +6 -6
- package/src/routes/provider-quota-config.ts +2 -2
- package/src/routes/settings.ts +5 -5
- 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 +5 -5
- package/src/routes/teams-config.ts +2 -2
- package/src/routes/tokens.ts +12 -5
- package/src/routes/workflows.ts +20 -5
- package/src/routing-policy-normalize.ts +1 -2
- package/src/routing-step-defaults.ts +0 -2
- package/src/runner-token-mint-limit.ts +63 -0
- package/src/runtime-grant.ts +4 -2
- package/src/runtime-tokens.ts +39 -7
- package/src/security.ts +13 -20
- package/src/server-background.ts +1 -1
- package/src/server.ts +5 -2
- package/src/services/host-utilization.ts +23 -0
- package/src/services/idle-epics.ts +5 -6
- package/src/services/issue-lifecycle.ts +57 -61
- package/src/services/issue-refs.ts +9 -13
- package/src/services/kernel-timers-cutover-chaos-worker.ts +10 -7
- package/src/services/kernel-timers-ingress.ts +1 -1
- package/src/services/landed-ancestry.ts +19 -3
- package/src/services/memory-areas.ts +15 -51
- package/src/services/plan-ci-notice.ts +57 -0
- package/src/services/plan-ci-recovery.ts +2 -55
- package/src/services/plan-wake-digest.ts +1 -0
- package/src/services/profile-trust.ts +4 -3
- package/src/services/project-config-read.ts +70 -0
- package/src/services/project-profile-instructions.ts +54 -0
- package/src/services/provisioning-harness/budget-baseline.json +4 -4
- package/src/services/restart-spawn.ts +61 -49
- package/src/services/self-care-state.ts +2 -1
- package/src/services/self-effort.ts +5 -5
- package/src/services/send-message.ts +5 -1
- package/src/services/spawn-agent.ts +13 -2
- package/src/services/spawn-chain-inspector.ts +6 -13
- package/src/services/spawn-policy.ts +68 -0
- package/src/services/spawn-tree-cleanup.ts +2 -2
- package/src/services/task-dispatch.ts +3 -0
- package/src/services/task-state-reconcile.ts +6 -14
- package/src/services/team-templates.ts +9 -8
- package/src/services/transient-agent-reaper.ts +3 -1
- package/src/services/workflow-auto-start.ts +25 -13
- package/src/services/workflow-ci-main.ts +1 -1
- package/src/services/workflow-deferred-cleanup.ts +4 -2
- package/src/services/workflow-effect-driver.ts +2 -0
- package/src/services/workflow-effects.ts +18 -11
- package/src/services/workflow-land-notice.ts +10 -0
- package/src/services/workflow-pause-text.ts +43 -0
- package/src/services/workflow-reconcile.ts +13 -11
- package/src/services/workflow-run-view.ts +2 -0
- package/src/services/workflow-runs.ts +29 -13
- package/src/services/workflow-supervisor-state.ts +5 -0
- package/src/services/workflow-supervisor.ts +7 -3
- package/src/settings/registry.ts +1 -2
- package/src/spawn-command.ts +4 -4
- package/src/spawn-models.ts +10 -12
- package/src/spawn-placement.ts +1 -1
- package/src/spawn-targets.ts +1 -1
- package/src/startup-context-injection.ts +1 -0
- 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.ts +7 -6
- package/src/task-dispatch-live.ts +1 -1
- package/src/task-dispatcher.ts +1 -1
- package/src/teams-config-store.ts +4 -3
- package/src/token-db-write.ts +10 -0
- package/src/workspace-command-settle.ts +2 -1
- package/src/workspace-steward-wake.ts +2 -2
- 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/use-project-list-B-T2Bnnn.js +0 -2
- package/public/assets/versioned-prompt-editor-Diu8BIaM.js +0 -8
- package/runner/src/gate-run-lease-probe.ts +0 -38
- package/src/db/claude-catalog-reconcile.ts +0 -27
- package/src/routing-model-aliases.ts +0 -21
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { afterEach } from "bun:test";
|
|
2
|
-
import { Database } from "bun:sqlite";
|
|
3
|
-
import { createSqliteModuleHost, createControllableClock } from "./index";
|
|
4
|
-
import { workflow } from "./workflow.pilot";
|
|
5
|
-
import { parseWorkflowDefinition } from "./workflow-definition";
|
|
6
|
-
|
|
7
|
-
const identity = { actor: "fixture", grants: ["workflow:admin" as const] };
|
|
8
|
-
const dbs: Database[] = [];
|
|
9
|
-
afterEach(() => { for (const db of dbs.splice(0)) db.close(); });
|
|
10
|
-
export async function fixture(items: unknown[], policy = "continue", action?: Record<string, unknown>, raw?: Record<string, unknown>) {
|
|
11
|
-
const db = new Database(":memory:"); dbs.push(db);
|
|
12
|
-
const clock = createControllableClock(1000);
|
|
13
|
-
const host = createSqliteModuleHost({ db, clock }); host.register(workflow);
|
|
14
|
-
const call = (op: string, input: Record<string, unknown> = {}): Promise<any> => host.invoke(workflow, op, identity, input);
|
|
15
|
-
const definition = parseWorkflowDefinition(raw ?? { version: 2,
|
|
16
|
-
outputs: { type: "object", additionalProperties: false, properties: { fleet: { type: "object", additionalProperties: true } } },
|
|
17
|
-
return: { fleet: "${{ steps.fleet.outputs }}" },
|
|
18
|
-
steps: { fleet: { timeout: "1m", "for-each": { items, concurrency: 2, "on-failure": policy, do: action ?? { script: { run: "fixture-host", timeout: "1m" }, inputs: { host: "${{ item }}", index: "${{ index }}" }, on: { 0: "next", default: "fail" } } } } } });
|
|
19
|
-
const { run } = await call("start", { workflow: "fleet", taskId: 1, coordinator: "fixture", cwd: "/fixture", orchestratorId: "fixture", sha: "a".repeat(40), ref: "origin/main", definition, afterEventId: 0 });
|
|
20
|
-
const driver = host.workflowDriver(workflow, identity);
|
|
21
|
-
async function pump() {
|
|
22
|
-
for (let pass = 0; pass < 8; pass++) {
|
|
23
|
-
const tick = await call("tickItems");
|
|
24
|
-
for (const runId of tick.cancel) await call("cancel", { runId, by: "fixture", reason: "fail-fast" });
|
|
25
|
-
await driver.recover(); await driver.wakeup();
|
|
26
|
-
for (const effect of (await call("pendingEffects")).items) {
|
|
27
|
-
if (effect.kind === "script") continue;
|
|
28
|
-
await call("settleEffect", { id: effect.id, status: "done", result: {} });
|
|
29
|
-
if (effect.kind === "cancel-children") await call("cleanup", { runId: effect.runId, complete: true });
|
|
30
|
-
if (effect.kind === "reap" && effect.waitKey) await call("signal", { runId: effect.runId, key: effect.waitKey, kind: "cleanup", payload: {} });
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
async function scripts() { return (await call("pendingEffects")).items.filter((effect: any) => effect.kind === "script"); }
|
|
35
|
-
async function finish(effect: any, exitCode = 0, output: Record<string, unknown> = { host: effect.payload.inputs.host }) {
|
|
36
|
-
await call("settleEffect", { id: effect.id, status: "done", result: {} });
|
|
37
|
-
await call("signal", { runId: effect.runId, key: effect.waitKey, kind: "script", payload: { step: effect.payload.step, round: 1, attempt: effect.payload.attempt, timerId: `wfs-${effect.id}`, exitCode, timedOut: false, output, at: 1 } });
|
|
38
|
-
await pump();
|
|
39
|
-
}
|
|
40
|
-
await pump();
|
|
41
|
-
return { call, pump, scripts, finish, runId: run.id, clock, host };
|
|
42
|
-
}
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { OpError, type ModuleCtx } from "./contract";
|
|
3
|
-
import { workflowBackstop } from "./workflow-backstop";
|
|
4
|
-
import { CI_MAIN_STEP, waitTimeoutMs, workflowCallPinSchema, workflowStations } from "./workflow-definition";
|
|
5
|
-
import { landIntent } from "./workflow-transitions";
|
|
6
|
-
import { retryItem, resumeContainer } from "./workflow-foreach";
|
|
7
|
-
import { SIGNAL_TOPIC, ADMIN_GRANT, json, runSchema, stores, requireRun, writeEffect, usedEffects, workflowEffectId } from "./workflow-state";
|
|
8
|
-
const alertInput = z.union([
|
|
9
|
-
// `waitKey` names the wait the fact was read for (red CI); without it the alert is about the land wait.
|
|
10
|
-
z.object({ runId: z.string().min(1), key: z.string().min(1), reason: z.string().min(1), waitKey: z.string().min(1).optional(), detail: json.optional() }),
|
|
11
|
-
// A timeout names the wait it read, so a run that moved on since is not alerted for its old step.
|
|
12
|
-
z.object({ runId: z.string().min(1), timeout: z.object({ waitKey: z.string().min(1), timeoutMs: z.number().int(), waitingFor: json }) }),
|
|
13
|
-
]);
|
|
14
|
-
const resumeInput = z.object({ runId: z.string().min(1), activationId: z.string().optional(), step: z.string().min(1).optional(), note: z.string().min(1).optional(), pins: z.record(z.string(), workflowCallPinSchema).optional(), workspaceId: z.string().optional(), by: z.string().min(1) });
|
|
15
|
-
const cancelInput = z.object({ runId: z.string().min(1), reason: z.string().min(1), by: z.string().min(1) });
|
|
16
|
-
export const workflowControlOps = {
|
|
17
|
-
alert: {
|
|
18
|
-
kind: "mutation",
|
|
19
|
-
idempotent: true,
|
|
20
|
-
grant: ADMIN_GRANT,
|
|
21
|
-
summary: "Escalate once per key while the run keeps waiting: a stopped land, red CI on main, or a wait past its deadline (system-only).",
|
|
22
|
-
expose: { http: false, mcp: false, cli: false },
|
|
23
|
-
input: alertInput,
|
|
24
|
-
output: z.object({ created: z.boolean() }),
|
|
25
|
-
handler: async (ctx: ModuleCtx, input: z.output<typeof alertInput>) => {
|
|
26
|
-
const run = await requireRun(ctx, input.runId);
|
|
27
|
-
const wait = run.awaiting;
|
|
28
|
-
// A run leaving its land wait for a resumed step is not waiting on that land any more.
|
|
29
|
-
if (run.status !== "running" || !wait || run.resuming?.to) return { created: false };
|
|
30
|
-
if ("timeout" in input ? wait.key !== input.timeout.waitKey || wait.timedOutAt !== undefined : input.waitKey ? wait.key !== input.waitKey : wait.kind !== "landed") return { created: false };
|
|
31
|
-
// A resume at `land` renews the same wait's deadline, so a timeout alert is keyed by the deadline it passed.
|
|
32
|
-
const id = "timeout" in input ? `${run.id}:timeout:${wait.key}:${wait.deadline ?? wait.since}` : `${workflowEffectId(run.id, run.waitSeq, "escalate")}:${input.key}`;
|
|
33
|
-
if (await stores(ctx).effect.get(id)) return { created: false };
|
|
34
|
-
const now = ctx.clock.now();
|
|
35
|
-
const payload = "timeout" in input
|
|
36
|
-
? { reason: "step-timeout", alert: true, step: run.step, round: run.round, waitingFor: input.timeout.waitingFor, timeoutMs: input.timeout.timeoutMs }
|
|
37
|
-
: { ...input.detail, reason: input.reason, alert: true };
|
|
38
|
-
await stores(ctx).effect.create({ id, runId: run.id, kind: "escalate", waitKey: wait.key, payload: { ...payload, wait }, status: "pending", attempts: 0, createdAt: now });
|
|
39
|
-
await stores(ctx).run.update(run.id, { ...("timeout" in input ? { awaiting: { ...wait, timedOutAt: now } } : {}), escalation: { id, at: now, waitKey: wait.key }, updatedAt: now });
|
|
40
|
-
return { created: true };
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
resume: {
|
|
44
|
-
kind: "mutation",
|
|
45
|
-
idempotent: true,
|
|
46
|
-
grant: ADMIN_GRANT,
|
|
47
|
-
summary: "Re-enter a run at its escalated step or a named one, once per escalation, with a fresh bound budget and step deadline (system-only).",
|
|
48
|
-
emits: [SIGNAL_TOPIC],
|
|
49
|
-
expose: { http: false, mcp: false, cli: false },
|
|
50
|
-
input: resumeInput,
|
|
51
|
-
output: z.object({ run: runSchema, resumed: z.boolean() }),
|
|
52
|
-
handler: async (ctx: ModuleCtx, input: z.output<typeof resumeInput>) => {
|
|
53
|
-
let run = await requireRun(ctx, input.runId);
|
|
54
|
-
const requested = run;
|
|
55
|
-
const treeRoot = run.rootRunId ? await requireRun(ctx, run.rootRunId) : undefined;
|
|
56
|
-
if (treeRoot?.cancel) throw new OpError("conflict", 409, "root tree is cancelled; it cannot resume");
|
|
57
|
-
if (treeRoot?.decisionChildRunId) {
|
|
58
|
-
if (input.step || input.pins) throw new OpError("invalid_input", 400, "resume a parked child without replacing its step or inputs");
|
|
59
|
-
run = await requireRun(ctx, treeRoot.decisionChildRunId);
|
|
60
|
-
if (run.itemContext && run.status === "failed") {
|
|
61
|
-
await retryItem(ctx, run, input.activationId);
|
|
62
|
-
return { run: await requireRun(ctx, requested.id), resumed: true };
|
|
63
|
-
}
|
|
64
|
-
if (run.status === "running" || run.status === "done") {
|
|
65
|
-
let ancestor = run.parentRunId ? await requireRun(ctx, run.parentRunId) : undefined;
|
|
66
|
-
const now = ctx.clock.now();
|
|
67
|
-
while (ancestor) {
|
|
68
|
-
await stores(ctx).run.update(ancestor.id, { status: "running", reason: undefined, decisionChildRunId: undefined, escalation: undefined, generation: (treeRoot.generation ?? 0) + 1,
|
|
69
|
-
...(ancestor.awaiting ? { awaiting: { ...ancestor.awaiting, deadline: now + waitTimeoutMs(ancestor.definition, ancestor.step), timedOutAt: undefined } } : {}), updatedAt: now });
|
|
70
|
-
if (ancestor.activationId) await stores(ctx).activation.update(ancestor.activationId, { state: "waiting", error: undefined, generation: (treeRoot.generation ?? 0) + 1, updatedAt: now });
|
|
71
|
-
ancestor = ancestor.parentRunId ? await requireRun(ctx, ancestor.parentRunId) : undefined;
|
|
72
|
-
}
|
|
73
|
-
return { run: await requireRun(ctx, requested.id), resumed: true };
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (await resumeContainer(ctx, run)) return { run: await requireRun(ctx, requested.id), resumed: true };
|
|
78
|
-
const retryCi = run.status === "done" && run.step === CI_MAIN_STEP && !!run.landed && !!run.output?.ci && run.output.ci.status !== "pass" && (input.step ?? run.step) === CI_MAIN_STEP;
|
|
79
|
-
if ((run.status === "done" && !retryCi) || run.status === "cancelled" || run.status === "failed" || run.cancel) throw new OpError("conflict", 409, `workflow run '${run.id}' is ${run.cancel ? "cancelled" : run.status}; only a run that escalated resumes`);
|
|
80
|
-
// A run escalated before #3045 H2 has no escalation record; its end is the escalation.
|
|
81
|
-
const escalation = (retryCi ? `${run.id}:ci:${run.waitSeq}` : undefined) ?? run.escalation?.id ?? (run.status === "escalated" ? `${run.id}:escalated` : undefined);
|
|
82
|
-
if (escalation && run.resumes?.at(-1)?.escalation === escalation) return { run, resumed: false };
|
|
83
|
-
if (!escalation || (run.status === "running" && run.escalation?.waitKey !== run.awaiting?.key)) {
|
|
84
|
-
throw new OpError("conflict", 409, `workflow run '${run.id}' is running and has not escalated at its current step; there is nothing to resume`);
|
|
85
|
-
}
|
|
86
|
-
// The Task's newest run owns it (start re-links it), so an older run never comes back beside it.
|
|
87
|
-
const owner = await stores(ctx).link.get(String(run.taskId));
|
|
88
|
-
if (owner && owner.runId !== run.id) throw new OpError("conflict", 409, `T${run.taskId} has a newer workflow run '${owner.runId}'; resume that one`);
|
|
89
|
-
const step = input.step ?? run.step;
|
|
90
|
-
const stations = workflowStations(run.definition);
|
|
91
|
-
const postLand = run.definition.land?.then ? stations.slice(stations.indexOf(run.definition.land.then)) : [];
|
|
92
|
-
if (run.landed && step !== CI_MAIN_STEP && !postLand.includes(step)) {
|
|
93
|
-
throw new OpError("invalid_input", 400, `workflow run '${run.id}' already landed T${run.taskId} as ${run.landed.sha}; only ${CI_MAIN_STEP} or a post-land step can be resumed`);
|
|
94
|
-
}
|
|
95
|
-
if (step === CI_MAIN_STEP || step === "close" ? !run.landed : step !== "land" && !run.definition.steps[step]) {
|
|
96
|
-
throw new OpError("invalid_input", 400, `workflow run '${run.id}' has no step "${step}"; resume at ${[...Object.keys(run.definition.steps), "land"].join(", ")}`);
|
|
97
|
-
}
|
|
98
|
-
// A resume replaces the call pin of each step it names; the others keep theirs.
|
|
99
|
-
const pins = input.pins ? { pins: { ...run.pins, ...input.pins } } : {};
|
|
100
|
-
const wait = run.status === "running" ? run.awaiting : null;
|
|
101
|
-
if (run.status === "running" && (!wait || await stores(ctx).signal.get(wait.key))) {
|
|
102
|
-
throw new OpError("conflict", 409, `workflow run '${run.id}' is routing a step result that just arrived; relay_workflow_get shows where it went`);
|
|
103
|
-
}
|
|
104
|
-
const now = ctx.clock.now();
|
|
105
|
-
const note = input.note ? { note: input.note } : {};
|
|
106
|
-
const used = await usedEffects(ctx, run);
|
|
107
|
-
const round = step === "land" || step === CI_MAIN_STEP ? run.round : run.round + 1;
|
|
108
|
-
const resumes = [...(run.resumes ?? []), { escalation, from: run.step, step, round, ...note, by: input.by, at: now }];
|
|
109
|
-
// The bound that escalated already reached the coordinator: the resumed loop gets a fresh budget.
|
|
110
|
-
const base = { status: "running" as const, ...workflowBackstop({ ...run, step }, now), reason: undefined, round, counters: {}, feedback: null, scriptPoll: undefined, ...(step === "land" ? { landOperationId: workflowEffectId(run.id, used.seq + 1, "clear-hold") } : {}), resumes, ...pins, ...(input.workspaceId ? { deliveryWorkspaceId: input.workspaceId } : {}), updatedAt: now };
|
|
111
|
-
// The run goes on with its agents, so its end-of-run reap is void.
|
|
112
|
-
for (const id of used.runReaps) await stores(ctx).effect.update(id, { status: "done", result: { superseded: "resume" }, settledAt: now });
|
|
113
|
-
if (wait?.kind === "landed" && step === "land") {
|
|
114
|
-
// The same land wait goes on with a fresh deadline: a new one would miss a land that completed before it.
|
|
115
|
-
const seq = used.seq + 1;
|
|
116
|
-
const landOperationId = await writeEffect(ctx, run, seq, "clear-hold", landIntent({ ...run, ...base }, true), wait.key);
|
|
117
|
-
await stores(ctx).run.update(run.id, { ...base, landOperationId, awaiting: { ...wait, deadline: now + waitTimeoutMs(run.definition, "land"), timedOutAt: undefined } });
|
|
118
|
-
} else if (wait?.kind === "landed") {
|
|
119
|
-
// The run owns its land wait until the Task is held again, so a land that wins still ends it with its result.
|
|
120
|
-
const seq = used.seq + 1;
|
|
121
|
-
await writeEffect(ctx, run, seq, "hold", { step }, wait.key);
|
|
122
|
-
await stores(ctx).run.update(run.id, { ...base, waitSeq: seq, resuming: { ...note, to: step } });
|
|
123
|
-
} else if (wait) {
|
|
124
|
-
await stores(ctx).run.update(run.id, { ...base, step, waitSeq: used.seq, resuming: note });
|
|
125
|
-
await stores(ctx).signal.create({ id: wait.key, runId: run.id, kind: "resume", payload: { step }, createdAt: now });
|
|
126
|
-
await ctx.events.emit(SIGNAL_TOPIC, { runId: run.id, correlationId: wait.key });
|
|
127
|
-
} else {
|
|
128
|
-
await stores(ctx).run.update(run.id, { ...base, step, waitSeq: used.seq, resuming: note, awaiting: null });
|
|
129
|
-
await ctx.workflows.start("run", { runId: run.id }, { idempotencyKey: `${run.id}:resume:${resumes.length}`, enlist: "op-commit" });
|
|
130
|
-
}
|
|
131
|
-
if (treeRoot?.decisionChildRunId) {
|
|
132
|
-
let ancestor = run.parentRunId ? await requireRun(ctx, run.parentRunId) : undefined;
|
|
133
|
-
while (ancestor) {
|
|
134
|
-
await stores(ctx).run.update(ancestor.id, { status: "running", reason: undefined, decisionChildRunId: undefined, escalation: undefined, generation: (treeRoot.generation ?? 0) + 1, updatedAt: now });
|
|
135
|
-
if (ancestor.activationId) await stores(ctx).activation.update(ancestor.activationId, { state: "waiting", error: undefined, generation: (treeRoot.generation ?? 0) + 1, updatedAt: now });
|
|
136
|
-
ancestor = ancestor.parentRunId ? await requireRun(ctx, ancestor.parentRunId) : undefined;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
return { run: await requireRun(ctx, requested.id), resumed: true };
|
|
140
|
-
},
|
|
141
|
-
},
|
|
142
|
-
cancel: {
|
|
143
|
-
kind: "mutation",
|
|
144
|
-
idempotent: true,
|
|
145
|
-
grant: ADMIN_GRANT,
|
|
146
|
-
summary: "End a run cancelled: a running one at its next routing (a parked wait wakes now), an escalated one at once; a done run refuses (system-only).",
|
|
147
|
-
emits: [SIGNAL_TOPIC, "workflow.finished"],
|
|
148
|
-
expose: { http: false, mcp: false, cli: false },
|
|
149
|
-
input: cancelInput,
|
|
150
|
-
output: z.object({ run: runSchema, cancelled: z.boolean() }),
|
|
151
|
-
handler: async (ctx: ModuleCtx, input: z.output<typeof cancelInput>) => {
|
|
152
|
-
const run = await requireRun(ctx, input.runId);
|
|
153
|
-
if (run.status === "done") throw new OpError("conflict", 409, `workflow run '${run.id}' is done${run.output ? `: T${run.taskId} landed as ${run.output.landedSha}` : ""}; there is nothing to cancel`);
|
|
154
|
-
if (run.status === "cancelled" || run.cancel) return { run, cancelled: false };
|
|
155
|
-
const now = ctx.clock.now();
|
|
156
|
-
if (run.status !== "running" && run.awaiting?.kind === "decision") await writeEffect(ctx, run, run.waitSeq + 1, "withdraw-decision", { effectId: run.awaiting.effectId });
|
|
157
|
-
if (run.rootRunId) {
|
|
158
|
-
await writeEffect(ctx, run, run.waitSeq + 1, "cancel-children", { scriptEffectId: run.awaiting?.kind === "script" ? run.awaiting.effectId : undefined });
|
|
159
|
-
if (run.activationId) await stores(ctx).activation.update(run.activationId, { state: "cancelled", updatedAt: now });
|
|
160
|
-
}
|
|
161
|
-
const cancel = { reason: input.reason, by: input.by, at: now };
|
|
162
|
-
if (run.status === "escalated" || run.status === "failed") {
|
|
163
|
-
await writeEffect(ctx, { ...run, cancel }, run.waitSeq + 1, "reap", { scope: "run" });
|
|
164
|
-
// Cancellation also shuts down agents retained by an escalation.
|
|
165
|
-
await stores(ctx).run.update(run.id, { cleanup: { status: "pending", deadline: now + 300000 }, status: "cancelled", reason: input.reason, cancel, updatedAt: now });
|
|
166
|
-
await ctx.events.emit("workflow.finished", { runId: run.id, status: "cancelled" });
|
|
167
|
-
return { run: await requireRun(ctx, run.id), cancelled: true };
|
|
168
|
-
}
|
|
169
|
-
await stores(ctx).run.update(run.id, { cancel, cleanup: { status: "pending", deadline: now + 300000 }, updatedAt: now });
|
|
170
|
-
const wait = run.awaiting;
|
|
171
|
-
if (wait && !(await stores(ctx).signal.get(wait.key))) {
|
|
172
|
-
await stores(ctx).signal.create({ id: wait.key, runId: run.id, kind: "cancel", payload: { reason: input.reason }, createdAt: now });
|
|
173
|
-
await ctx.events.emit(SIGNAL_TOPIC, { runId: run.id, correlationId: wait.key });
|
|
174
|
-
}
|
|
175
|
-
return { run: await requireRun(ctx, run.id), cancelled: true };
|
|
176
|
-
},
|
|
177
|
-
},
|
|
178
|
-
} as const;
|