@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,317 +0,0 @@
|
|
|
1
|
-
import { enterActivation, settleActivation, valueContext } from "./workflow-composition";
|
|
2
|
-
import { expandItems } from "./workflow-container";
|
|
3
|
-
import { validateWorkflowValue, workflowValue, workflowCondition, WorkflowValueError } from "./workflow-values";
|
|
4
|
-
import { z } from "zod";
|
|
5
|
-
import { type ModuleCtx, type StepResult } from "./contract";
|
|
6
|
-
import { workflowBackstop, workflowStepChange } from "./workflow-backstop";
|
|
7
|
-
import { workflowScriptResultSchema } from "./workflow-script";
|
|
8
|
-
import { CI_MAIN_STEP, isLoopBack, routeOutcome, stepOutcome, stepReap, waitTimeoutMs, WORKFLOW_EXITED_OUTCOME, workflowStepPin, type RouteDecision } from "./workflow-definition";
|
|
9
|
-
import { stores, requireRun, writeEffect, SIGNAL_TOPIC, ciVerdictSchema, type WorkflowRunRecord, type Awaiting } from "./workflow-state";
|
|
10
|
-
export type RunState = { runId: string };
|
|
11
|
-
type RunStep = StepResult<RunState>;
|
|
12
|
-
|
|
13
|
-
function routeChange(run: WorkflowRunRecord, decision: RouteDecision, now: number) {
|
|
14
|
-
return { ...workflowStepChange(run, decision.target, now), counters: decision.counters, round: isLoopBack(run.definition, run.step, decision.target) ? run.round + 1 : run.round };
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function landIntent(run: WorkflowRunRecord, override = run.resuming !== undefined): Record<string, unknown> {
|
|
18
|
-
const resume = run.resumes?.at(-1);
|
|
19
|
-
const entry = run.rounds.at(-1)?.steps.at(-1);
|
|
20
|
-
const source = override ? { at: resume?.at, by: resume?.by, step: resume?.step, escalation: resume?.escalation }
|
|
21
|
-
: { at: entry?.at, taskId: entry?.taskId, step: entry?.step, outcome: entry?.outcome };
|
|
22
|
-
return { taskId: run.taskId, eventId: run.cursor, workspaceId: run.deliveryWorkspaceId, head: run.head,
|
|
23
|
-
approval: { kind: override ? "override" : "go", source } };
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** Enter `run.step`: write its effect and park until the src supervisor signals the wait. */
|
|
27
|
-
export async function enter(ctx: ModuleCtx, state: RunState): Promise<RunStep> {
|
|
28
|
-
const run = await requireRun(ctx, state.runId);
|
|
29
|
-
if (run.cancel) return finish(ctx, run, {}, { status: "cancelled", reason: run.cancel.reason });
|
|
30
|
-
const seq = run.waitSeq + 1;
|
|
31
|
-
const key = `${run.id}:${seq}`;
|
|
32
|
-
const now = ctx.clock.now();
|
|
33
|
-
const resume = run.resuming ? { resume: run.resuming } : {};
|
|
34
|
-
// The dispatch carries the pin it applies, so a retried effect spawns what this entry decided.
|
|
35
|
-
const applied = workflowStepPin(run.definition, run.pins, run.step, run.routingDefaults);
|
|
36
|
-
const pin = applied ? { pin: applied } : {};
|
|
37
|
-
const declared = run.definition.steps[run.step];
|
|
38
|
-
try {
|
|
39
|
-
if (declared?.condition !== undefined && !workflowCondition(declared.condition, valueContext(run))) {
|
|
40
|
-
await enterActivation(ctx, run, key, now, true);
|
|
41
|
-
const current = await requireRun(ctx, run.id);
|
|
42
|
-
const patch = await settleActivation(ctx, current, "skipped", {});
|
|
43
|
-
const decision = routeOutcome(run.definition, run.step, "skipped", run.counters, valueContext({ ...current, ...patch }));
|
|
44
|
-
const update = { ...patch, waitSeq: seq, counters: decision.counters };
|
|
45
|
-
if (decision.target === "done") return finish(ctx, current, update, { status: "done" });
|
|
46
|
-
if (decision.target === "fail" || decision.target === "escalate") return finish(ctx, current, update, { status: decision.target === "fail" ? "failed" : "escalated", reason: "skipped step route" });
|
|
47
|
-
await stores(ctx).run.update(run.id, { ...update, ...routeChange(run, decision, now) });
|
|
48
|
-
return { state, next: "enter" };
|
|
49
|
-
}
|
|
50
|
-
} catch (error) { return finish(ctx, await requireRun(ctx, run.id), {}, { status: "failed", reason: String(error) }); }
|
|
51
|
-
const decisionWait = run.definition.steps[run.step]?.decision;
|
|
52
|
-
const activationDeadline = decisionWait ? (decisionWait.deadlineMs === undefined ? undefined : now + decisionWait.deadlineMs) : now + waitTimeoutMs(run.definition, run.step);
|
|
53
|
-
let data: Record<string, unknown> = {};
|
|
54
|
-
try { data = await enterActivation(ctx, run, key, activationDeadline); }
|
|
55
|
-
catch (error) { return finish(ctx, run, {}, { status: "escalated", reason: String(error) }); }
|
|
56
|
-
let awaiting: Awaiting;
|
|
57
|
-
let landOperationId: string | undefined;
|
|
58
|
-
if (run.step === "close") {
|
|
59
|
-
const id = await writeEffect(ctx, run, seq, "close", {}, key);
|
|
60
|
-
awaiting = { key, kind: "closed", effectId: id, afterEventId: run.cursor, since: now };
|
|
61
|
-
} else if (run.step === "land") {
|
|
62
|
-
landOperationId = await writeEffect(ctx, run, seq, "clear-hold", landIntent(run), key);
|
|
63
|
-
awaiting = { key, kind: "landed", taskId: run.taskId, afterEventId: run.cursor, since: now };
|
|
64
|
-
} else if (run.step === CI_MAIN_STEP) {
|
|
65
|
-
// The work landed: no step agent has anything left to do while CI runs.
|
|
66
|
-
await writeEffect(ctx, run, seq, "reap", { scope: "run" });
|
|
67
|
-
awaiting = { key, kind: "ci", taskId: run.taskId, sha: run.landed!.sha, afterEventId: run.cursor, since: now };
|
|
68
|
-
} else {
|
|
69
|
-
const step = run.definition.steps[run.step]!;
|
|
70
|
-
if (step.forEach) {
|
|
71
|
-
try { await expandItems(ctx, await requireRun(ctx, run.id)); }
|
|
72
|
-
catch (error) { return finish(ctx, await requireRun(ctx, run.id), {}, { status: "escalated", reason: String(error) }); }
|
|
73
|
-
awaiting = { key, kind: "for-each", afterEventId: 0, since: now };
|
|
74
|
-
} else if (step.decision) {
|
|
75
|
-
const id = await writeEffect(ctx, run, seq, "decision", { step: run.step, ...data }, key);
|
|
76
|
-
awaiting = { key, kind: "decision", effectId: id, afterEventId: 0, since: now, ...(step.decision.deadlineMs !== undefined ? { deadline: now + step.decision.deadlineMs } : {}) };
|
|
77
|
-
} else if (step.workflow) {
|
|
78
|
-
const id = await writeEffect(ctx, run, seq, "child", { step: run.step, ...data }, key);
|
|
79
|
-
awaiting = { key, kind: "child", effectId: id, afterEventId: 0, since: now };
|
|
80
|
-
} else if (step.script) {
|
|
81
|
-
const poll = run.scriptPoll ?? { step: run.step, attempt: 1, deadline: now + step.script.timeoutMs, nextAt: now };
|
|
82
|
-
const id = await writeEffect(ctx, run, seq, "script", { ...poll, ...data }, key);
|
|
83
|
-
awaiting = { key, kind: "script", effectId: id, afterEventId: run.cursor, since: now, deadline: poll.deadline };
|
|
84
|
-
await stores(ctx).run.update(run.id, { scriptPoll: poll });
|
|
85
|
-
} else if (step.task === "input") {
|
|
86
|
-
// #3660 — a gated input step (a single-agent audit) links its Task with the gate, so its delivery is a verdict.
|
|
87
|
-
const inputGate = step.gate ? { gate: step.gate } : {};
|
|
88
|
-
if (run.resuming) {
|
|
89
|
-
// The src effect hands the note to the warm builder, or dispatches a fresh one when it is gone.
|
|
90
|
-
await writeEffect(ctx, run, seq, "dispatch", { step: run.step, role: step.role, taskId: run.taskId, round: run.round, hold: true, ...inputGate, ...resume, ...pin, ...data }, key);
|
|
91
|
-
} else if (run.entered.includes(run.step)) {
|
|
92
|
-
await writeEffect(ctx, run, seq, "findings", { taskId: run.taskId, round: run.round, ...run.feedback }, key);
|
|
93
|
-
} else {
|
|
94
|
-
await writeEffect(ctx, run, seq, "dispatch", { step: run.step, role: step.role, taskId: run.taskId, hold: true, ...inputGate, ...pin, ...data }, key);
|
|
95
|
-
}
|
|
96
|
-
awaiting = { key, kind: "delivery", taskId: run.taskId, afterEventId: run.cursor, since: now };
|
|
97
|
-
} else {
|
|
98
|
-
const id = await writeEffect(ctx, run, seq, "dispatch", {
|
|
99
|
-
step: run.step, role: step.role, round: run.round, parentTaskId: run.taskId,
|
|
100
|
-
...(run.head ? { head: run.head } : {}), ...(step.gate ? { gate: step.gate } : {}), ...resume, ...pin, ...data,
|
|
101
|
-
}, key);
|
|
102
|
-
awaiting = { key, kind: "delivery", effectId: id, afterEventId: 0, since: now };
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
if (awaiting.kind !== "decision") awaiting.deadline ??= now + waitTimeoutMs(run.definition, run.step);
|
|
106
|
-
const entered = run.step === "land" || run.entered.includes(run.step) ? run.entered : [...run.entered, run.step];
|
|
107
|
-
const backstop = run.scriptPoll && run.overdueAt !== undefined ? {} : workflowBackstop(run, now, awaiting.deadline);
|
|
108
|
-
await stores(ctx).run.update(run.id, { ...backstop, waitSeq: seq, awaiting, entered, resuming: undefined, ...(landOperationId ? { landOperationId } : {}), updatedAt: now });
|
|
109
|
-
return { state, next: "route", waitFor: { kind: "event", topic: SIGNAL_TOPIC, correlationId: key } };
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
type RunEnd = { status: "escalated" | "cancelled" | "failed"; reason: string } | { status: "done"; landedSha?: string; nothingToLand?: boolean; ci?: z.output<typeof ciVerdictSchema> };
|
|
113
|
-
|
|
114
|
-
async function finish(ctx: ModuleCtx, run: WorkflowRunRecord, patch: Partial<WorkflowRunRecord>, end: RunEnd, cleanupSettled = false): Promise<RunStep> {
|
|
115
|
-
const now = ctx.clock.now();
|
|
116
|
-
const final = { ...run, ...patch, status: end.status, ...(end.status === "done" && end.landedSha ? { landed: { ...run.landed, sha: end.landedSha, at: run.landed?.at ?? now } } : {}) };
|
|
117
|
-
let returned: Record<string, unknown> | undefined;
|
|
118
|
-
if (end.status === "done" && run.definition.version === 2) {
|
|
119
|
-
try {
|
|
120
|
-
returned = (cleanupSettled ? run.finalizing : workflowValue(run.definition.returns ?? {}, valueContext(final))) as Record<string, unknown>;
|
|
121
|
-
validateWorkflowValue(run.definition.outputs, returned, "OUTPUT_INVALID");
|
|
122
|
-
} catch (error) { return finish(ctx, run, patch, { status: "failed", reason: String(error) }); }
|
|
123
|
-
}
|
|
124
|
-
// The end consumes its seq, so a resumed run's next step and end never reuse these effect ids.
|
|
125
|
-
const seq = run.waitSeq + 1;
|
|
126
|
-
if (run.awaiting?.kind === "decision") await writeEffect(ctx, run, seq, "withdraw-decision", { effectId: run.awaiting.effectId });
|
|
127
|
-
if (run.activationId) {
|
|
128
|
-
const activation = await stores(ctx).activation.get(run.activationId);
|
|
129
|
-
if (activation && activation.state === "waiting") await stores(ctx).activation.update(activation.id, { state: end.status === "done" ? "succeeded" : end.status === "cancelled" ? "cancelled" : "paused", outcome: end.status, updatedAt: now });
|
|
130
|
-
}
|
|
131
|
-
if (end.status === "done" && !cleanupSettled) {
|
|
132
|
-
const ci = end.ci ?? final.landed?.ci;
|
|
133
|
-
const output = (cleanupSettled ? run.finalizing : undefined) ?? returned ?? { landedSha: end.landedSha, rounds: final.round, ...(end.nothingToLand ? { nothingToLand: true } : {}), ...(ci ? { ci } : {}) };
|
|
134
|
-
const key = `${run.id}:${seq}`;
|
|
135
|
-
const id = await writeEffect(ctx, final, seq, "reap", { scope: "run" }, key);
|
|
136
|
-
await stores(ctx).run.update(run.id, { ...patch, waitSeq: seq, ...(final.landed ? { landed: final.landed } : {}), finalizing: output, cleanup: { status: "pending", deadline: now + 300000 }, awaiting: { kind: "cleanup", key, effectId: id, afterEventId: run.cursor, since: now, deadline: now + 300000 }, updatedAt: now });
|
|
137
|
-
return { state: { runId: run.id }, next: "route", waitFor: { kind: "event", topic: SIGNAL_TOPIC, correlationId: key } };
|
|
138
|
-
}
|
|
139
|
-
if (!cleanupSettled) await writeEffect(ctx, final, seq, "reap", { scope: "run" });
|
|
140
|
-
if (end.status !== "done") {
|
|
141
|
-
// A cancel is the coordinator's own act (cancel, abandon): nothing to tell it.
|
|
142
|
-
const escalation = end.status === "escalated" || end.status === "failed" ? { escalation: { id: await writeEffect(ctx, final, seq, "escalate", { reason: end.reason }), at: now } } : {};
|
|
143
|
-
await stores(ctx).run.update(run.id, { ...patch, ...escalation, ...(end.status === "cancelled" ? { cleanup: run.cleanup ?? { status: "pending" as const, deadline: now + 300000 } } : {}), waitSeq: seq, status: end.status, reason: end.reason, awaiting: null, resuming: undefined, updatedAt: now });
|
|
144
|
-
} else {
|
|
145
|
-
const ci = end.ci ?? final.landed?.ci;
|
|
146
|
-
const output = (cleanupSettled ? run.finalizing : undefined) ?? returned ?? { landedSha: end.landedSha, rounds: final.round, ...(end.nothingToLand || final.landed?.nothingToLand ? { nothingToLand: true } : {}), ...(ci ? { ci } : {}) };
|
|
147
|
-
await writeEffect(ctx, final, seq, "result", output);
|
|
148
|
-
await stores(ctx).run.update(run.id, { ...patch, waitSeq: seq, status: "done", finalizing: undefined, cleanup: { status: "complete", deadline: run.cleanup?.deadline ?? now }, output, ...(run.rootRunId ? { outputs: output } : {}), awaiting: null, resuming: undefined, updatedAt: now });
|
|
149
|
-
}
|
|
150
|
-
await ctx.events.emit("workflow.finished", { runId: run.id, status: end.status });
|
|
151
|
-
return { state: { runId: run.id }, next: "done", output: end };
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
function textField(value: unknown): string | undefined {
|
|
155
|
-
return typeof value === "string" && value.trim() ? value : undefined;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/** Consume the signal of the current wait and decide the next step. */
|
|
159
|
-
export async function route(ctx: ModuleCtx, state: RunState): Promise<RunStep> {
|
|
160
|
-
try { return await routeSignal(ctx, state); }
|
|
161
|
-
catch (error) {
|
|
162
|
-
if (!(error instanceof WorkflowValueError)) throw error;
|
|
163
|
-
return finish(ctx, await requireRun(ctx, state.runId), {}, { status: "failed", reason: error.message });
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
async function routeSignal(ctx: ModuleCtx, state: RunState): Promise<RunStep> {
|
|
168
|
-
const run = await requireRun(ctx, state.runId);
|
|
169
|
-
// A cancel wins over whatever woke the wait, including a result that arrived first.
|
|
170
|
-
if (run.cancel) return finish(ctx, run, {}, { status: "cancelled", reason: run.cancel.reason });
|
|
171
|
-
const key = run.awaiting?.key;
|
|
172
|
-
const signal = key ? await stores(ctx).signal.get(key) : undefined;
|
|
173
|
-
if (!signal) throw new Error(`workflow run '${run.id}' woke without the signal for its wait`);
|
|
174
|
-
// The resume op already set the run up; a run leaving its land wait takes its step now the Task is held.
|
|
175
|
-
if (signal.kind === "resume") {
|
|
176
|
-
const to = run.resuming?.to;
|
|
177
|
-
if (to) await stores(ctx).run.update(run.id, { ...workflowStepChange(run, to, ctx.clock.now()), resuming: run.resuming?.note ? { note: run.resuming.note } : {} });
|
|
178
|
-
return { state, next: "enter" };
|
|
179
|
-
}
|
|
180
|
-
const payload = signal.payload;
|
|
181
|
-
if (run.awaiting?.kind === "cleanup" && signal.kind === "cleanup") return finish(ctx, run, {}, { status: "done" }, true);
|
|
182
|
-
if (signal.kind === "effect-failed") {
|
|
183
|
-
const message = `${String(payload.effect)} failed: ${String(payload.error)}`;
|
|
184
|
-
const patch = await settleActivation(ctx, run, "blocked", {}, { code: String(payload.error).split(":")[0], message, effectId: run.awaiting?.effectId });
|
|
185
|
-
return finish(ctx, run, patch, { status: "escalated", reason: message });
|
|
186
|
-
}
|
|
187
|
-
if (signal.kind === "land-withdrawn") {
|
|
188
|
-
// #3603 — a withdrawn land parks the run at the step that delivered it: same run, builder and worktree.
|
|
189
|
-
const delivering = run.rounds.flatMap((round) => round.steps).reverse().find((entry) => entry.taskId === run.taskId && run.definition.steps[entry.step]?.task === "input")?.step;
|
|
190
|
-
if (!delivering) return finish(ctx, run, {}, { status: "cancelled", reason: String(payload.reason) });
|
|
191
|
-
const note = `The armed land of ${run.head ?? "your delivered head"} was withdrawn: ${String(payload.reason)}. The run is parked here; your worktree and commits are kept.`;
|
|
192
|
-
await stores(ctx).run.update(run.id, { ...workflowStepChange(run, delivering, ctx.clock.now()), round: run.round + 1, feedback: null, resuming: { note } });
|
|
193
|
-
return { state, next: "enter" };
|
|
194
|
-
}
|
|
195
|
-
if (signal.kind === "land-cancelled" || signal.kind === "start-refused") return finish(ctx, run, {}, { status: "cancelled", reason: String(payload.reason) });
|
|
196
|
-
if (run.step === "close") return finish(ctx, run, {}, { status: "done", landedSha: String(payload.landedSha ?? run.landed?.sha) });
|
|
197
|
-
if (run.step === CI_MAIN_STEP) {
|
|
198
|
-
const ci = ciVerdictSchema.parse(payload);
|
|
199
|
-
if (run.definition.land?.then) {
|
|
200
|
-
if (ci.status !== "pass") return finish(ctx, run, {}, { status: "escalated", reason: `CI on main: ${ci.status}; verification did not run` });
|
|
201
|
-
await stores(ctx).run.update(run.id, { ...workflowStepChange(run, run.definition.land.then, ctx.clock.now()), landed: { ...run.landed!, ci } });
|
|
202
|
-
return { state, next: "enter" };
|
|
203
|
-
}
|
|
204
|
-
return finish(ctx, run, {}, { status: "done", landedSha: run.landed!.sha, ci });
|
|
205
|
-
}
|
|
206
|
-
if (run.step === "land") {
|
|
207
|
-
if (run.definition.land?.then) {
|
|
208
|
-
const landed = { sha: String(payload.sha), at: ctx.clock.now(), ...(payload.nothingToLand === true ? { nothingToLand: true } : {}) };
|
|
209
|
-
const next = run.definition.ciMain && !landed.nothingToLand ? CI_MAIN_STEP : run.definition.land.then;
|
|
210
|
-
await stores(ctx).run.update(run.id, { ...workflowStepChange(run, next, ctx.clock.now()), landed });
|
|
211
|
-
return { state, next: "enter" };
|
|
212
|
-
}
|
|
213
|
-
// Nothing landed, so CI on main has no land of this run's to judge.
|
|
214
|
-
if (payload.nothingToLand === true) return finish(ctx, run, {}, { status: "done", landedSha: String(payload.sha), nothingToLand: true });
|
|
215
|
-
if (!run.definition.ciMain) return finish(ctx, run, {}, { status: "done", landedSha: String(payload.sha) });
|
|
216
|
-
await stores(ctx).run.update(run.id, { ...workflowStepChange(run, CI_MAIN_STEP, ctx.clock.now()), landed: { sha: String(payload.sha), at: ctx.clock.now() } });
|
|
217
|
-
return { state, next: "enter" };
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
const step = run.definition.steps[run.step]!;
|
|
221
|
-
if (step.decision || step.workflow || step.forEach) {
|
|
222
|
-
const outputs = (payload.outputs ?? {}) as Record<string, unknown>;
|
|
223
|
-
const outcome = String(payload.outcome);
|
|
224
|
-
let patch: Partial<WorkflowRunRecord>;
|
|
225
|
-
try {
|
|
226
|
-
if (outcome === "complete" && step.outputSchema) validateWorkflowValue(step.outputSchema, outputs, "OUTPUT_INVALID");
|
|
227
|
-
patch = await settleActivation(ctx, run, outcome, outputs, payload.error as Record<string, unknown> | undefined);
|
|
228
|
-
} catch (error) {
|
|
229
|
-
patch = await settleActivation(ctx, run, "failed", {}, { code: "OUTPUT_INVALID", message: String(error), childRunId: payload.childRunId });
|
|
230
|
-
return finish(ctx, run, patch, { status: "failed", reason: String(error) });
|
|
231
|
-
}
|
|
232
|
-
const decision = routeOutcome(run.definition, run.step, outcome, run.counters, valueContext({ ...run, ...patch }));
|
|
233
|
-
patch.counters = decision.counters;
|
|
234
|
-
if (decision.target === "done") return finish(ctx, run, patch, { status: "done" });
|
|
235
|
-
if (decision.target === "fail" || decision.target === "escalate") return finish(ctx, run, patch, { status: decision.target === "fail" ? "failed" : "escalated", reason: String(payload.error ?? decision.reason ?? `child ${outcome}`) });
|
|
236
|
-
await stores(ctx).run.update(run.id, { ...patch, ...routeChange(run, decision, ctx.clock.now()) });
|
|
237
|
-
return { state, next: "enter" };
|
|
238
|
-
}
|
|
239
|
-
if (step.script) {
|
|
240
|
-
const result = workflowScriptResultSchema.parse(payload);
|
|
241
|
-
const outcome = result.timedOut ? "timeout" : String(result.exitCode ?? "unknown");
|
|
242
|
-
const decision = routeOutcome(run.definition, run.step, outcome, run.counters, valueContext({ ...run, results: { ...run.results, [run.step]: { status: result.exitCode === 0 ? "succeeded" : "failed", outputs: result.output ?? {} } } }));
|
|
243
|
-
await stores(ctx).scriptAttempt.create({ id: signal.id, runId: run.id, ...result });
|
|
244
|
-
const scriptOutputs = { ...run.scriptOutputs, ...(result.output ? { [run.step]: result.output } : {}) };
|
|
245
|
-
if (decision.target === "wait") {
|
|
246
|
-
await stores(ctx).run.update(run.id, { scriptOutputs, scriptPoll: { ...run.scriptPoll!, attempt: result.attempt + 1, nextAt: ctx.clock.now() + step.script.everyMs! }, updatedAt: ctx.clock.now() });
|
|
247
|
-
return { state, next: "enter" };
|
|
248
|
-
}
|
|
249
|
-
const entry = { step: run.step, taskId: run.taskId, outcome, startedAt: run.awaiting!.since, at: ctx.clock.now() };
|
|
250
|
-
const rounds = run.rounds.some((r) => r.round === run.round)
|
|
251
|
-
? run.rounds.map((r) => r.round === run.round ? { ...r, steps: [...r.steps, entry] } : r)
|
|
252
|
-
: [...run.rounds, { round: run.round, steps: [entry] }];
|
|
253
|
-
let activationPatch: Partial<WorkflowRunRecord> = {};
|
|
254
|
-
if (run.rootRunId) {
|
|
255
|
-
try {
|
|
256
|
-
if (result.error) throw new Error(String(result.error.message));
|
|
257
|
-
if (step.outputSchema) validateWorkflowValue(step.outputSchema, result.output ?? {}, "OUTPUT_INVALID");
|
|
258
|
-
activationPatch = await settleActivation(ctx, run, decision.outcome ?? (decision.target === "escalate" ? "blocked" : decision.target === "fail" ? "failed" : "complete"), result.output ?? {});
|
|
259
|
-
} catch (error) {
|
|
260
|
-
activationPatch = await settleActivation(ctx, run, "failed", {}, { code: "OUTPUT_INVALID", message: String(error), artifactId: result.logArtifactId });
|
|
261
|
-
return finish(ctx, run, { ...activationPatch, scriptPoll: undefined, rounds }, { status: "failed", reason: `OUTPUT_INVALID: ${String(error)}` });
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
const patch = { scriptOutputs, scriptPoll: undefined, rounds, ...activationPatch, counters: decision.counters };
|
|
265
|
-
if (decision.target === "escalate" || decision.target === "fail") return finish(ctx, run, patch, { status: decision.target === "fail" ? "failed" : "escalated", reason: decision.reason! });
|
|
266
|
-
if (decision.target === "done") return finish(ctx, run, patch, { status: "done", landedSha: run.landed?.sha ?? "" });
|
|
267
|
-
await stores(ctx).run.update(run.id, { ...patch, ...routeChange(run, decision, ctx.clock.now()) });
|
|
268
|
-
return { state, next: "enter" };
|
|
269
|
-
}
|
|
270
|
-
const exited = signal.kind === "agent-exited";
|
|
271
|
-
const outcome = exited ? WORKFLOW_EXITED_OUTCOME : stepOutcome(step, { disposition: String(payload.disposition), gateStatus: textField(payload.gateStatus) });
|
|
272
|
-
const input = step.task === "input";
|
|
273
|
-
const head = input ? textField(payload.head) ?? run.head : run.head;
|
|
274
|
-
const entry = {
|
|
275
|
-
step: run.step,
|
|
276
|
-
taskId: Number(payload.taskId),
|
|
277
|
-
outcome,
|
|
278
|
-
...(head ? { head } : {}),
|
|
279
|
-
...(textField(payload.summary) ? { summary: textField(payload.summary) } : {}),
|
|
280
|
-
...(textField(payload.findings) ? { findings: textField(payload.findings) } : {}),
|
|
281
|
-
...(run.awaiting ? { startedAt: run.awaiting.since } : {}),
|
|
282
|
-
at: ctx.clock.now(),
|
|
283
|
-
};
|
|
284
|
-
const rounds = run.rounds.some((r) => r.round === run.round)
|
|
285
|
-
? run.rounds.map((r) => (r.round === run.round ? { ...r, steps: [...r.steps, entry] } : r))
|
|
286
|
-
: [...run.rounds, { round: run.round, steps: [entry] }];
|
|
287
|
-
if (stepReap(step) === "on-step-done") await writeEffect(ctx, run, run.waitSeq, "reap", { scope: "step", step: run.step });
|
|
288
|
-
const decision = routeOutcome(run.definition, run.step, outcome, run.counters, valueContext({ ...run, results: { ...run.results, [run.step]: { status: outcome === "complete" || outcome === "pass" ? "succeeded" : "failed", outcome, outputs: payload.outputs ?? {} } } }));
|
|
289
|
-
// An exit consumed no delivery, so the next wait still counts from the last one.
|
|
290
|
-
let activationPatch: Partial<WorkflowRunRecord> = {};
|
|
291
|
-
if (run.rootRunId) {
|
|
292
|
-
const outputs = payload.outputs as Record<string, unknown> | undefined ?? {};
|
|
293
|
-
try {
|
|
294
|
-
if (step.outputSchema) validateWorkflowValue(step.outputSchema, outputs, "OUTPUT_INVALID");
|
|
295
|
-
activationPatch = await settleActivation(ctx, run, outcome, outputs);
|
|
296
|
-
} catch (error) {
|
|
297
|
-
activationPatch = await settleActivation(ctx, run, "failed", {}, { code: "OUTPUT_INVALID", message: String(error), deliveryEventId: payload.eventId });
|
|
298
|
-
return finish(ctx, run, activationPatch, { status: "failed", reason: String(error) });
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
const patch: Partial<WorkflowRunRecord> = { ...activationPatch, rounds, counters: decision.counters, scriptOutputs: { ...run.scriptOutputs, [run.step]: payload }, ...(input && !exited ? { cursor: Number(payload.eventId), deliveryWorkspaceId: textField(payload.workspaceId) } : {}), ...(head ? { head } : {}) };
|
|
302
|
-
await ctx.events.emit("workflow.routed", { runId: run.id, step: run.step, outcome, target: decision.target });
|
|
303
|
-
if (decision.target === "done") return finish(ctx, run, patch, { status: "done" });
|
|
304
|
-
if (decision.target === "fail") return finish(ctx, run, patch, { status: "failed", reason: `step ${run.step} returned ${outcome}` });
|
|
305
|
-
if (decision.target === "escalate") {
|
|
306
|
-
// An exit the workflow does not route escalates with its own account.
|
|
307
|
-
const reason = exited && !run.definition.routes[run.step]?.[outcome] ? String(payload.summary) : decision.reason ?? `step ${run.step} returned ${outcome}`;
|
|
308
|
-
return finish(ctx, run, patch, { status: "escalated", reason });
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
const loop = isLoopBack(run.definition, run.step, decision.target);
|
|
312
|
-
const feedback = loop && run.definition.steps[decision.target]?.task === "input"
|
|
313
|
-
? { ...(head ? { head } : {}), findings: entry.findings ?? entry.summary ?? outcome, taskId: entry.taskId, step: run.step }
|
|
314
|
-
: null;
|
|
315
|
-
await stores(ctx).run.update(run.id, { ...patch, ...routeChange(run, decision, ctx.clock.now()), feedback });
|
|
316
|
-
return { state, next: "enter" };
|
|
317
|
-
}
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
import jsep from "jsep";
|
|
2
|
-
import Ajv, { type ValidateFunction } from "ajv";
|
|
3
|
-
import { z } from "zod";
|
|
4
|
-
|
|
5
|
-
export const workflowObject = z.record(z.string(), z.unknown());
|
|
6
|
-
export const emptyBoundary = { type: "object", additionalProperties: false, properties: {} };
|
|
7
|
-
const ajv = new Ajv({ strict: true, allErrors: true, coerceTypes: false, useDefaults: false, removeAdditional: false });
|
|
8
|
-
const compiled = new Map<string, ValidateFunction>();
|
|
9
|
-
function schemaKey(schema: Record<string, unknown>): string { return JSON.stringify(schema); }
|
|
10
|
-
const keywords = new Set(["type", "properties", "required", "additionalProperties", "items", "enum", "const", "nullable", "minimum", "maximum", "exclusiveMinimum", "exclusiveMaximum", "multipleOf", "minLength", "maxLength", "minItems", "maxItems", "uniqueItems", "minProperties", "maxProperties", "$defs", "$ref", "description", "title"]);
|
|
11
|
-
|
|
12
|
-
export class WorkflowValueError extends Error {
|
|
13
|
-
constructor(readonly code: string, message: string) { super(`${code}: ${message}`); }
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function validateWorkflowSchema(schema: Record<string, unknown>, boundary = false): void {
|
|
17
|
-
if (boundary && (schema.type !== "object" || schema.additionalProperties !== false)) throw new WorkflowValueError("SCHEMA_INVALID", "boundary must declare type: object and additionalProperties: false");
|
|
18
|
-
let nodes = 0;
|
|
19
|
-
function visit(value: unknown, depth: number): void {
|
|
20
|
-
if (++nodes > 1000 || depth > 32) throw new WorkflowValueError("SCHEMA_INVALID", "schema exceeds depth/node limit");
|
|
21
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) throw new WorkflowValueError("SCHEMA_INVALID", "schema must be an object");
|
|
22
|
-
for (const [key, child] of Object.entries(value)) {
|
|
23
|
-
if (!keywords.has(key)) throw new WorkflowValueError("SCHEMA_INVALID", `unsupported keyword ${key}`);
|
|
24
|
-
if (key === "$ref" && (typeof child !== "string" || !child.startsWith("#/$defs/"))) throw new WorkflowValueError("SCHEMA_INVALID", "only local $defs references are supported");
|
|
25
|
-
if (key === "properties" || key === "$defs") {
|
|
26
|
-
if (!child || typeof child !== "object" || Array.isArray(child)) throw new WorkflowValueError("SCHEMA_INVALID", `${key} must be an object`);
|
|
27
|
-
for (const nested of Object.values(child)) visit(nested, depth + 1);
|
|
28
|
-
} else if (key === "items" || (key === "additionalProperties" && typeof child === "object")) visit(child, depth + 1);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
visit(schema, 0);
|
|
32
|
-
const key = schemaKey(schema);
|
|
33
|
-
if (!compiled.has(key)) {
|
|
34
|
-
if (compiled.size >= 512) compiled.delete(compiled.keys().next().value!);
|
|
35
|
-
compiled.set(key, ajv.compile(schema));
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function validateWorkflowValue(schema: Record<string, unknown> | undefined, data: Record<string, unknown>, code: string): void {
|
|
40
|
-
if (new TextEncoder().encode(JSON.stringify(data)).length > 65536) throw new WorkflowValueError(code, "object exceeds 64 KiB");
|
|
41
|
-
const definition = schema ?? emptyBoundary;
|
|
42
|
-
if (!compiled.has(schemaKey(definition))) validateWorkflowSchema(definition);
|
|
43
|
-
const check = compiled.get(schemaKey(definition))!;
|
|
44
|
-
if (!check(data)) throw new WorkflowValueError(code, ajv.errorsText(check.errors));
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const expressions = new Map<string, jsep.Expression>();
|
|
48
|
-
const binary = ["&&", "||", "==", "!=", "<", "<=", ">", ">="];
|
|
49
|
-
class MissingPath extends WorkflowValueError {}
|
|
50
|
-
function children(node: jsep.Expression): jsep.Expression[] {
|
|
51
|
-
if (node.type === "MemberExpression") return [(node as jsep.MemberExpression).object];
|
|
52
|
-
if (node.type === "UnaryExpression") return [(node as jsep.UnaryExpression).argument];
|
|
53
|
-
if (node.type === "BinaryExpression") return [(node as jsep.BinaryExpression).left, (node as jsep.BinaryExpression).right];
|
|
54
|
-
if (node.type === "CallExpression") return (node as jsep.CallExpression).arguments;
|
|
55
|
-
return [];
|
|
56
|
-
}
|
|
57
|
-
function expression(text: string): jsep.Expression {
|
|
58
|
-
const source = /^\$\{\{([\s\S]*)\}\}$/.exec(text)?.[1];
|
|
59
|
-
if (source === undefined || source.length > 4096) throw new WorkflowValueError("EXPRESSION_INVALID", "expected a whole expression");
|
|
60
|
-
const cached = expressions.get(source);
|
|
61
|
-
if (cached) return cached;
|
|
62
|
-
let parsed: jsep.Expression;
|
|
63
|
-
try { parsed = jsep(source); } catch (error) { throw new WorkflowValueError("EXPRESSION_INVALID", String(error)); }
|
|
64
|
-
let nodes = 0;
|
|
65
|
-
function check(node: jsep.Expression, depth: number): void {
|
|
66
|
-
if (++nodes > 256 || depth > 32) throw new WorkflowValueError("EXPRESSION_INVALID", "expression exceeds depth/node limit");
|
|
67
|
-
let valid = false;
|
|
68
|
-
if (node.type === "Identifier") valid = ["inputs", "steps", "run", "item", "index"].includes((node as jsep.Identifier).name);
|
|
69
|
-
if (node.type === "Literal") valid = (node as jsep.Literal).value === null || ["string", "boolean", "number"].includes(typeof (node as jsep.Literal).value);
|
|
70
|
-
if (node.type === "MemberExpression") {
|
|
71
|
-
const member = node as jsep.MemberExpression;
|
|
72
|
-
const property = member.computed ? (member.property as jsep.Literal).value : (member.property as jsep.Identifier).name;
|
|
73
|
-
valid = (!member.computed || member.property.type === "Literal") && (typeof property === "string" || typeof property === "number" && Number.isSafeInteger(property) && property >= 0) && !["__proto__", "prototype", "constructor"].includes(String(property));
|
|
74
|
-
}
|
|
75
|
-
if (node.type === "UnaryExpression") valid = (node as jsep.UnaryExpression).operator === "!" || (node as jsep.UnaryExpression).operator === "-" && (node as jsep.UnaryExpression).argument.type === "Literal" && typeof ((node as jsep.UnaryExpression).argument as jsep.Literal).value === "number";
|
|
76
|
-
if (node.type === "BinaryExpression") valid = binary.includes((node as jsep.BinaryExpression).operator);
|
|
77
|
-
if (node.type === "CallExpression") {
|
|
78
|
-
const call = node as jsep.CallExpression;
|
|
79
|
-
valid = call.callee.type === "Identifier" && (call.callee as jsep.Identifier).name === "has" && call.arguments.length === 1 && ["MemberExpression", "Identifier"].includes(call.arguments[0]!.type);
|
|
80
|
-
}
|
|
81
|
-
if (!valid) throw new WorkflowValueError("EXPRESSION_INVALID", `unsupported ${node.type}`);
|
|
82
|
-
for (const child of children(node)) check(child, depth + 1);
|
|
83
|
-
}
|
|
84
|
-
check(parsed, 0);
|
|
85
|
-
if (expressions.size >= 1024) expressions.delete(expressions.keys().next().value!);
|
|
86
|
-
expressions.set(source, parsed);
|
|
87
|
-
return parsed;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export function validateWorkflowExpressions(value: unknown, steps: readonly string[]): void {
|
|
91
|
-
if (typeof value === "string" && value.startsWith("${{")) {
|
|
92
|
-
function names(part: jsep.Expression): void {
|
|
93
|
-
if (part.type === "MemberExpression") {
|
|
94
|
-
const member = part as jsep.MemberExpression;
|
|
95
|
-
if (member.object.type === "Identifier" && (member.object as jsep.Identifier).name === "steps") {
|
|
96
|
-
const name = member.computed ? (member.property as jsep.Literal).value : (member.property as jsep.Identifier).name;
|
|
97
|
-
if (!steps.includes(String(name))) throw new WorkflowValueError("EXPRESSION_INVALID", `unknown step ${String(name)}`);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
for (const child of children(part)) names(child);
|
|
101
|
-
}
|
|
102
|
-
names(expression(value));
|
|
103
|
-
} else if (value && typeof value === "object") for (const item of Object.values(value)) validateWorkflowExpressions(item, steps);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function boolean(value: unknown): boolean {
|
|
107
|
-
if (typeof value !== "boolean") throw new WorkflowValueError("EXPRESSION_INVALID", "condition requires a boolean");
|
|
108
|
-
return value;
|
|
109
|
-
}
|
|
110
|
-
export function workflowCondition(value: unknown, context: Record<string, unknown>): boolean { return boolean(workflowValue(value, context)); }
|
|
111
|
-
|
|
112
|
-
export function workflowValue(value: unknown, context: Record<string, unknown>): unknown {
|
|
113
|
-
if (typeof value === "string" && value.startsWith("${{")) {
|
|
114
|
-
function evaluate(node: jsep.Expression): unknown {
|
|
115
|
-
if (node.type === "Literal") return (node as jsep.Literal).value;
|
|
116
|
-
if (node.type === "Identifier") {
|
|
117
|
-
const name = (node as jsep.Identifier).name;
|
|
118
|
-
if (!Object.hasOwn(context, name)) throw new MissingPath("EXPRESSION_INVALID", `missing context ${name}`);
|
|
119
|
-
return context[name];
|
|
120
|
-
}
|
|
121
|
-
if (node.type === "CallExpression") {
|
|
122
|
-
try { evaluate((node as jsep.CallExpression).arguments[0]!); return true; }
|
|
123
|
-
catch (error) { if (error instanceof MissingPath) return false; throw error; }
|
|
124
|
-
}
|
|
125
|
-
if (node.type === "UnaryExpression") {
|
|
126
|
-
const unary = node as jsep.UnaryExpression;
|
|
127
|
-
return unary.operator === "!" ? !boolean(evaluate(unary.argument)) : -Number((unary.argument as jsep.Literal).value);
|
|
128
|
-
}
|
|
129
|
-
if (node.type === "BinaryExpression") {
|
|
130
|
-
const { operator, left, right } = node as jsep.BinaryExpression;
|
|
131
|
-
const a = evaluate(left);
|
|
132
|
-
if (operator === "&&") return boolean(a) && boolean(evaluate(right));
|
|
133
|
-
if (operator === "||") return boolean(a) || boolean(evaluate(right));
|
|
134
|
-
const b = evaluate(right);
|
|
135
|
-
if ((a !== null && typeof a === "object") || (b !== null && typeof b === "object") || typeof a !== typeof b) throw new WorkflowValueError("EXPRESSION_INVALID", "comparison requires matching scalar types");
|
|
136
|
-
if (operator === "==") return a === b;
|
|
137
|
-
if (operator === "!=") return a !== b;
|
|
138
|
-
if (typeof a === "number" && typeof b === "number") return operator === "<" ? a < b : operator === "<=" ? a <= b : operator === ">" ? a > b : a >= b;
|
|
139
|
-
if (typeof a === "string" && typeof b === "string") return operator === "<" ? a < b : operator === "<=" ? a <= b : operator === ">" ? a > b : a >= b;
|
|
140
|
-
throw new WorkflowValueError("EXPRESSION_INVALID", "ordering requires numbers or strings");
|
|
141
|
-
}
|
|
142
|
-
const member = node as jsep.MemberExpression;
|
|
143
|
-
const target = evaluate(member.object);
|
|
144
|
-
const key = member.computed ? (member.property as jsep.Literal).value : (member.property as jsep.Identifier).name;
|
|
145
|
-
if (!target || typeof target !== "object" || !Object.hasOwn(target, String(key))) throw new MissingPath("EXPRESSION_INVALID", `missing property ${String(key)}`);
|
|
146
|
-
return (target as Record<string, unknown>)[String(key)];
|
|
147
|
-
}
|
|
148
|
-
return evaluate(expression(value));
|
|
149
|
-
}
|
|
150
|
-
if (Array.isArray(value)) return value.map(item => workflowValue(item, context));
|
|
151
|
-
if (value && typeof value === "object") return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, workflowValue(item, context)]));
|
|
152
|
-
return value;
|
|
153
|
-
}
|