@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.
Files changed (811) hide show
  1. package/README.md +5 -0
  2. package/bundled/prompts/manifest.json +1 -0
  3. package/bundled/prompts/task.hydration.md +1 -1
  4. package/bundled/roles/builder.md +1 -1
  5. package/docs/guides/sub-coordinators.md +12 -5
  6. package/docs/guides/tools-administration.md +4 -0
  7. package/docs/guides/tools-coordination.md +2 -0
  8. package/docs/guides/tools-tasks.md +8 -0
  9. package/docs/guides/workflows.md +74 -0
  10. package/docs/openapi.json +486 -4
  11. package/package.json +10 -18
  12. package/public/assets/{MessageBubble-BWpoBjl4.js → MessageBubble-Bq9kr21N.js} +2 -2
  13. package/public/assets/{PlanGraphPanel-C0auck3n.js → PlanGraphPanel-Dqiroy06.js} +2 -2
  14. package/public/assets/{TraceView-DBnOx7AQ.js → TraceView-DYU962-H.js} +2 -2
  15. package/public/assets/{VaultDecisionCard-0kp2oNBC.js → VaultDecisionCard-DhPfzioE.js} +2 -2
  16. package/public/assets/{activity-yLztXEBt.js → activity-DzCcQTee.js} +2 -2
  17. package/public/assets/{agent-lineage-BbJDR1dW.js → agent-lineage-SgDt9i3T.js} +2 -2
  18. package/public/assets/agent-liveness-Bq-s73jW.js +2 -0
  19. package/public/assets/{agent-name-CTZBrSD9.js → agent-name-CcY3Aijy.js} +2 -2
  20. package/public/assets/agent-profiles-cxtRBn6O.js +2 -0
  21. package/public/assets/{agent-project-badge-9TqzUUYE.js → agent-project-badge-DGYbIhaI.js} +2 -2
  22. package/public/assets/{agent-tools-D4n40pn8.js → agent-tools-DHbftV0N.js} +2 -2
  23. package/public/assets/{agent-type-icon-D6FUarOf.js → agent-type-icon-CY113sp-.js} +2 -2
  24. package/public/assets/{agents-BYDslkJc.js → agents-BPzY7IlQ.js} +2 -2
  25. package/public/assets/{analytics-B-XSbEMC.js → analytics-DENFPv_a.js} +2 -2
  26. package/public/assets/{artifact-viewer-DdWIfV6M.js → artifact-viewer-KRvSc7sl.js} +2 -2
  27. package/public/assets/{artifacts-DPN1q4pA.js → artifacts-C9gSmL3s.js} +2 -2
  28. package/public/assets/{artifacts-oBOqks-2.js → artifacts-DT-HkI5O.js} +2 -2
  29. package/public/assets/{automation-4KcRFXEu.js → automation-BsmjQhKD.js} +2 -2
  30. package/public/assets/{backlog-Cw9xPTCF.js → backlog-8NYH_62t.js} +2 -2
  31. package/public/assets/{busy-health-CTu32MZt.js → busy-health-D3hwvYb4.js} +2 -2
  32. package/public/assets/{channels-BiXzg1G9.js → channels-DCJ5WL7O.js} +2 -2
  33. package/public/assets/{chat-Ctk2qwvA.js → chat-DAIl357U.js} +3 -3
  34. package/public/assets/{code-preview-Bm1wWqAp.js → code-preview-CzrZfr9U.js} +2 -2
  35. package/public/assets/{connectors-C36ax4Vw.js → connectors-xTxtlyou.js} +2 -2
  36. package/public/assets/{cosmos-Jj9LK2Wf.js → cosmos-BpebFLK2.js} +2 -2
  37. package/public/assets/{crate-agent-H6S7-B9T.js → crate-agent-BHvI5wXC.js} +2 -2
  38. package/public/assets/{dependency-graph-Cd1E23wa.js → dependency-graph-DGT0o3wJ.js} +2 -2
  39. package/public/assets/{deploys-Bwfq146q.js → deploys-hqWOHSHE.js} +2 -2
  40. package/public/assets/{display-CfO7rTuF.js → display-CDeH4I8T.js} +2 -2
  41. package/public/assets/{files-DhhZI2Ih.js → files-BTeGVmTg.js} +2 -2
  42. package/public/assets/{fleet-B_rFEbnL.js → fleet-DgXtNgCa.js} +2 -2
  43. package/public/assets/{fleet-metrics-BkHP-P3R.js → fleet-metrics-BHEt5yc_.js} +2 -2
  44. package/public/assets/{formatted-body-Cm1RrzmN.js → formatted-body-MLtodyPp.js} +3 -3
  45. package/public/assets/{formatted-body-impl-DQiOuOD1.js → formatted-body-impl-CAe664Z8.js} +2 -2
  46. package/public/assets/{host-providers-dialog-CHqwXTov.js → host-providers-dialog-mapF4Fj9.js} +2 -2
  47. package/public/assets/index-CqqgOI5R.js +15 -0
  48. package/public/assets/index-MYAIwYTX.css +2 -0
  49. package/public/assets/{insights-fH1EL-qZ.js → insights-DNyf7IzF.js} +2 -2
  50. package/public/assets/{integrations-C5Oix6ng.js → integrations-DlYOHq7T.js} +2 -2
  51. package/public/assets/{issue-ref-chip-ODyondIa.js → issue-ref-chip-CeWBNWn7.js} +2 -2
  52. package/public/assets/{log-viewer-Cvfy6PW7.js → log-viewer-Cib8nqdE.js} +2 -2
  53. package/public/assets/{maintenance-D8CDH5wZ.js → maintenance-DSn1cPm7.js} +2 -2
  54. package/public/assets/{managed-agents-egllbpij.js → managed-agents-C3CkM81m.js} +2 -2
  55. package/public/assets/{markdown-preview-CYSFgVgK.js → markdown-preview-W4VQQPAv.js} +3 -3
  56. package/public/assets/{markdown-preview-impl-BteVIjX4.js → markdown-preview-impl-CMsTdhjq.js} +2 -2
  57. package/public/assets/{memory-C8WmXsyr.js → memory-BV17qtO4.js} +2 -2
  58. package/public/assets/{messages-BzQdqlO6.js → messages-Bm_1AqSA.js} +2 -2
  59. package/public/assets/{orchestrators-B1HxzkNw.js → orchestrators-Dg-vfP09.js} +2 -2
  60. package/public/assets/{overview-DCUnI4Z7.js → overview-DcYCrvlr.js} +2 -2
  61. package/public/assets/{pairs-ftCd2XcD.js → pairs-8o9nuG3V.js} +2 -2
  62. package/public/assets/{profile-icon-B2zH8DMH.js → profile-icon-BsRyBMea.js} +2 -2
  63. package/public/assets/project-profile-instructions-DETKFn_E.js +2 -0
  64. package/public/assets/projects-M_m6AHws.js +2 -0
  65. package/public/assets/{prompt-settings-Bftq9czX.js → prompt-settings-C_mNCgeL.js} +2 -2
  66. package/public/assets/provider-display-BEeLXC_D.js +2 -0
  67. package/public/assets/{registry-DWCU5c8q.js → registry-DDHHHE5N.js} +2 -2
  68. package/public/assets/run-card-Dt4I4jaP.js +2 -0
  69. package/public/assets/scroll-text-BKXS1ahr.js +2 -0
  70. package/public/assets/{secrets-C7GIUATz.js → secrets-BkVwxI5O.js} +2 -2
  71. package/public/assets/{service-access-settings-C3aujqTG.js → service-access-settings-Crq-6a-B.js} +2 -2
  72. package/public/assets/{settings-C6sZ9eBa.js → settings-CYcavMFu.js} +2 -2
  73. package/public/assets/shipping-H6gzEeZB.js +2 -0
  74. package/public/assets/{stats-V9Z-GxUd.js → stats-BJVeWkpV.js} +2 -2
  75. package/public/assets/{status-dot-CVv0iGHL.js → status-dot-BcHyw1Vw.js} +2 -2
  76. package/public/assets/store-DKPDIZBe.js +9 -0
  77. package/public/assets/{tasks-CXU75HRF.js → tasks-qJjlQPpx.js} +2 -2
  78. package/public/assets/{teams-BPf976zb.js → teams-Cd5Sk1uX.js} +2 -2
  79. package/public/assets/{terminal-viewer-DE9BOe-8.js → terminal-viewer-CpY5_m7W.js} +3 -3
  80. package/public/assets/{terminal-viewer-impl-D04pjmGh.js → terminal-viewer-impl-DI_2llFR.js} +2 -2
  81. package/public/assets/token-estimate-Co-Jdphh.js +2 -0
  82. package/public/assets/{use-agent-terminal-B1yR456R.js → use-agent-terminal-0yJA_buM.js} +2 -2
  83. package/public/assets/{use-decisions-D-S4tpDf.js → use-decisions-uJXHf34W.js} +2 -2
  84. package/public/assets/use-project-list-CpWl6eHQ.js +2 -0
  85. package/public/assets/{use-selectors-CnrAk2YP.js → use-selectors-BdxBW8mL.js} +2 -2
  86. package/public/assets/{user-avatar-nBFIcR4M.js → user-avatar-3IndfpOc.js} +2 -2
  87. package/public/assets/versioned-prompt-editor-CIVg7XB1.js +8 -0
  88. package/public/assets/{work-queue-TCjJxeT-.js → work-queue-B9rnLwHZ.js} +2 -2
  89. package/public/assets/{workflow-marker-Cf3Hf2fN.js → workflow-marker-X8wxyhzC.js} +2 -2
  90. package/public/assets/{workflows-CXQX20Qj.js → workflows-o5YyMFW7.js} +2 -2
  91. package/public/assets/{workspaces-qSYzKYMA.js → workspaces-CzEGoAng.js} +2 -2
  92. package/public/cosmos.html +4 -4
  93. package/public/index.html +31 -29
  94. package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
  95. package/runner/plugins/claude/hooks/gate-run-guard.provisioned.mjs +31 -1
  96. package/runner/src/adapters/claude-effort.ts +2 -4
  97. package/runner/src/adapters/claude-headless.ts +1 -1
  98. package/runner/src/adapters/claude-launch-exit.ts +26 -0
  99. package/runner/src/adapters/claude-session-probe.ts +1 -1
  100. package/runner/src/adapters/claude-tmux.ts +38 -10
  101. package/runner/src/adapters/claude.ts +28 -75
  102. package/runner/src/adapters/codex-launch-config.ts +4 -5
  103. package/runner/src/adapters/codex.ts +1 -1
  104. package/runner/src/adapters/opencode-provider.ts +7 -22
  105. package/runner/src/adapters/opencode.ts +4 -4
  106. package/runner/src/adapters/provider-quota-harvest.ts +20 -71
  107. package/runner/src/agent-runner/credentials.ts +42 -12
  108. package/runner/src/agent-runner/inbox.ts +27 -0
  109. package/runner/src/agent-runner/lifecycle-milestones.ts +2 -4
  110. package/runner/src/agent-runner/liveness-exchange.ts +104 -0
  111. package/runner/src/bin/claude.ts +4 -0
  112. package/runner/src/bin/codex.ts +4 -0
  113. package/runner/src/bin/opencode.ts +4 -0
  114. package/runner/src/claude-system-prompt.ts +49 -0
  115. package/runner/src/index.ts +5 -2
  116. package/runner/src/launch-assembly.ts +14 -10
  117. package/runner/src/profile-home.ts +1 -1
  118. package/runner/src/project-instructions.ts +2 -2
  119. package/runner/src/provider-command.ts +18 -0
  120. package/runner/src/provider-setup.ts +35 -0
  121. package/runner/src/providers.ts +2 -1
  122. package/runner/src/runner-core.ts +32 -38
  123. package/runner/src/runner-helpers.ts +0 -8
  124. package/runner/src/session-scratch.ts +6 -2
  125. package/runner/src/spawn-input.ts +2 -1
  126. package/runner/src/test-run-dedup.ts +59 -56
  127. package/runner/test-support/provisioning-context.ts +4 -2
  128. package/runner/test-support/runner-harness.ts +2 -1
  129. package/scripts/cd-config.ts +8 -0
  130. package/scripts/gate-run-lease.ts +10 -7
  131. package/scripts/gate.sh +5 -1
  132. package/scripts/steward-policy-cleanup.ts +2 -2
  133. package/src/agent-authz.ts +2 -2
  134. package/src/agent-drive-arbiter.ts +3 -8
  135. package/src/agent-exit-cleanup-async.ts +2 -2
  136. package/src/agent-exit-cleanup.ts +23 -19
  137. package/src/agent-lifecycle-events.ts +112 -85
  138. package/src/agent-ref.ts +3 -2
  139. package/src/agent-status-events.ts +43 -14
  140. package/src/auth/password.ts +4 -3
  141. package/src/auth/session-refresh.ts +1 -1
  142. package/src/auth/session.test-fixture.ts +2 -2
  143. package/src/auth/session.ts +7 -7
  144. package/src/automations/crud.ts +8 -81
  145. package/src/automations/dispatch.ts +33 -58
  146. package/src/automations/index.ts +1 -1
  147. package/src/automations/persistence.ts +65 -0
  148. package/src/automations/precheck.ts +18 -16
  149. package/src/automations/read-async.ts +11 -0
  150. package/src/automations/reconcile.ts +30 -39
  151. package/src/automations/storage.ts +33 -10
  152. package/src/automations/write-async.ts +33 -0
  153. package/src/branch-land-notice.ts +93 -0
  154. package/src/branch-landed.ts +31 -98
  155. package/src/bus.ts +40 -39
  156. package/src/cd-deploy-notify.ts +32 -4
  157. package/src/cd-host-lag-notify.ts +7 -6
  158. package/src/ci/incidents.ts +2 -2
  159. package/src/ci/monitor.ts +5 -8
  160. package/src/ci/notifications.ts +4 -4
  161. package/src/ci/root-missing.ts +4 -9
  162. package/src/ci/transition-notify.ts +12 -44
  163. package/src/claude-app/oauth-http.ts +3 -3
  164. package/src/cli/cd-pauses.ts +19 -0
  165. package/src/cli/orchestrator.ts +1 -1
  166. package/src/cli/state.ts +2 -19
  167. package/src/cli/task-edit.ts +22 -0
  168. package/src/cli/task.ts +3 -1
  169. package/src/cli/workflow.ts +19 -4
  170. package/src/commands-db.ts +7 -7
  171. package/src/commands-write.ts +8 -0
  172. package/src/compaction-watch.ts +10 -8
  173. package/src/config-store-write.ts +13 -1
  174. package/src/config-store.ts +25 -14
  175. package/src/config.ts +4 -11
  176. package/src/connectors.ts +10 -8
  177. package/src/context-advisory.ts +22 -21
  178. package/src/db/activity-async.ts +6 -1
  179. package/src/db/activity-write-ops.ts +12 -1
  180. package/src/db/activity.ts +1 -14
  181. package/src/db/agent-action-write.ts +36 -0
  182. package/src/db/agent-control-async.ts +9 -0
  183. package/src/db/agent-control-write.ts +49 -0
  184. package/src/db/agent-effort-observe.ts +22 -0
  185. package/src/db/agent-meta.ts +14 -3
  186. package/src/db/agent-search.ts +1 -15
  187. package/src/db/agents-async.ts +59 -9
  188. package/src/db/agents-write-ops.ts +12 -3
  189. package/src/db/agents.ts +95 -65
  190. package/src/db/auth-identities.ts +2 -2
  191. package/src/db/automation-read-ops.ts +11 -0
  192. package/src/db/automation-write-ops.ts +46 -0
  193. package/src/db/blackboard.ts +2 -2
  194. package/src/db/browser-session-write.ts +32 -0
  195. package/src/db/bus-outbox-write-ops.ts +3 -1
  196. package/src/db/checkout-refresh-schema.ts +47 -0
  197. package/src/db/checkout-refresh.ts +5 -5
  198. package/src/db/ci-incidents-async.ts +5 -5
  199. package/src/db/ci-incidents-write-ops.ts +2 -2
  200. package/src/db/command-agent-profile-backfill.ts +39 -0
  201. package/src/db/command-agent-profiles.ts +5 -1
  202. package/src/db/command-retention.ts +126 -0
  203. package/src/db/command-row.ts +10 -2
  204. package/src/db/commands-list-query.ts +2 -0
  205. package/src/db/commands-planner-stats.test-fixture.ts +8 -0
  206. package/src/db/commands-read-ops.ts +16 -0
  207. package/src/db/commands-spawn-read.ts +1 -1
  208. package/src/db/config-store-write-ops.ts +7 -2
  209. package/src/db/connection.ts +1 -182
  210. package/src/db/context-carry-write.ts +74 -0
  211. package/src/db/continuation-archives-async.ts +5 -0
  212. package/src/db/continuation-archives-write-ops.ts +7 -0
  213. package/src/db/continuations.ts +6 -6
  214. package/src/db/db-error-registry.ts +12 -0
  215. package/src/db/db-writer-worker.ts +8 -1
  216. package/src/db/deploy-events-async.ts +1 -0
  217. package/src/db/deploy-events-read-ops.ts +2 -1
  218. package/src/db/deploy-events.ts +35 -4
  219. package/src/db/gateway.ts +26 -133
  220. package/src/db/history-retention-ops.ts +13 -0
  221. package/src/db/hosts-registration.ts +10 -2
  222. package/src/db/hosts.ts +9 -6
  223. package/src/db/inbox-async.ts +2 -2
  224. package/src/db/inbox-read-ops.ts +1 -1
  225. package/src/db/inbox.ts +9 -17
  226. package/src/db/index.ts +2 -0
  227. package/src/db/integrations-async.ts +8 -0
  228. package/src/db/integrations-ops.ts +15 -0
  229. package/src/db/integrations.ts +15 -21
  230. package/src/db/issue-associations.ts +2 -2
  231. package/src/db/issue-lifecycle.ts +3 -4
  232. package/src/db/issue-refs-async.ts +23 -0
  233. package/src/db/issue-refs-read-ops.ts +6 -0
  234. package/src/db/issue-refs-write-ops.ts +29 -0
  235. package/src/db/issue-refs.ts +15 -16
  236. package/src/db/kernel-event-log-schema.ts +2 -0
  237. package/src/db/land-boundaries.ts +51 -5
  238. package/src/db/land-gate-attestations.ts +2 -2
  239. package/src/db/landing-receipts.ts +2 -2
  240. package/src/db/lifecycle-context-write.ts +5 -0
  241. package/src/db/lifecycle-tail-async.ts +76 -0
  242. package/src/db/lifecycle-tail-write-ops.ts +62 -0
  243. package/src/db/lifecycle-write-window.ts +2 -1
  244. package/src/db/lineage-pair-dedupe-sql.ts +3 -3
  245. package/src/db/long-running-work.ts +2 -2
  246. package/src/db/main-connection-mode.ts +11 -0
  247. package/src/db/main-connection-writes.ts +41 -2
  248. package/src/db/maintenance-job-reconcile.ts +61 -0
  249. package/src/db/maintenance-job-runs-async.ts +14 -0
  250. package/src/db/maintenance-job-write-ops.ts +9 -0
  251. package/src/db/maintenance-pauses.ts +2 -2
  252. package/src/db/mappers.ts +2 -14
  253. package/src/db/merge-lease.ts +1 -15
  254. package/src/db/message-send.ts +4 -0
  255. package/src/db/messages.ts +31 -25
  256. package/src/db/migrations.ts +25 -16
  257. package/src/db/notification-write-ops.ts +19 -0
  258. package/src/db/operator-answer-write.ts +19 -0
  259. package/src/db/orchestrators.ts +14 -76
  260. package/src/db/pairs-async.ts +22 -1
  261. package/src/db/pairs-write-ops.ts +8 -3
  262. package/src/db/pairs.ts +42 -61
  263. package/src/db/plan-dispatch-schema.ts +5 -1
  264. package/src/db/plan-ready-notices.ts +43 -0
  265. package/src/db/plan-tools-include-migration.ts +36 -0
  266. package/src/db/plans-write-ops.ts +2 -0
  267. package/src/db/presence-buffer.ts +5 -0
  268. package/src/db/presence-loop.ts +18 -23
  269. package/src/db/presence-write.ts +0 -6
  270. package/src/db/project-entries-async.ts +14 -0
  271. package/src/db/project-entries-read-ops.ts +5 -1
  272. package/src/db/project-entries-write-ops.ts +8 -0
  273. package/src/db/project-entries.ts +15 -12
  274. package/src/db/project-journal.ts +2 -2
  275. package/src/db/project-profile-instructions.ts +50 -0
  276. package/src/db/project-trust-approvals.ts +2 -2
  277. package/src/db/prompt-templates.ts +4 -4
  278. package/src/db/prompt-versions.ts +9 -2
  279. package/src/db/provider-config-history.ts +8 -3
  280. package/src/db/provider-model-seed.ts +34 -0
  281. package/src/db/read-op-marshaling-fixtures.ts +23 -0
  282. package/src/db/read-ops.ts +8 -0
  283. package/src/db/retention.ts +13 -2
  284. package/src/db/review-publish-write.ts +8 -0
  285. package/src/db/routing-policy.ts +2 -3
  286. package/src/db/runtime-admin-async.ts +19 -0
  287. package/src/db/runtime-admin-write-ops.ts +36 -0
  288. package/src/db/runtime-tail-async.ts +288 -0
  289. package/src/db/runtime-tail-write-ops.ts +97 -0
  290. package/src/db/schema.ts +13 -4
  291. package/src/db/spawn-budget.ts +5 -0
  292. package/src/db/spawn-delegation-state.ts +11 -4
  293. package/src/db/spawn-delegation.ts +1 -11
  294. package/src/db/sql-audit-indexes.ts +3 -0
  295. package/src/db/stats-async.ts +9 -6
  296. package/src/db/task-entity.ts +28 -6
  297. package/src/db/task-list.ts +3 -1
  298. package/src/db/tasks.ts +1 -17
  299. package/src/db/team-claim-policy.ts +60 -0
  300. package/src/db/teams-async.ts +4 -0
  301. package/src/db/teams-write-ops.ts +4 -0
  302. package/src/db/terminal-events.ts +15 -0
  303. package/src/db/timer-cutover-bodies.ts +292 -0
  304. package/src/db/timer-cutover-core.ts +37 -278
  305. package/src/db/timer-cutover-state.ts +40 -0
  306. package/src/db/timer-cutover-write-ops.ts +1 -40
  307. package/src/db/timer-ingress.ts +7 -1
  308. package/src/db/token-db-write-ops.ts +19 -0
  309. package/src/db/token-standing-async.ts +12 -0
  310. package/src/db/token-standing.ts +21 -20
  311. package/src/db/token-usage-retention.ts +33 -0
  312. package/src/db/token-usage-write-ops.ts +1 -1
  313. package/src/db/token-usage.ts +4 -1
  314. package/src/db/user-invites-async.ts +13 -0
  315. package/src/db/user-invites.ts +3 -3
  316. package/src/db/users.ts +14 -6
  317. package/src/db/workflow-contact.ts +1 -1
  318. package/src/db/workflow-task-read-ops.ts +30 -0
  319. package/src/db/workspaces.ts +8 -5
  320. package/src/db/write-ops.ts +37 -12
  321. package/src/db/writer-fault-seam.ts +2 -9
  322. package/src/db/writer-fault-test-ops.ts +18 -0
  323. package/src/db/writer-gateway.ts +58 -56
  324. package/src/dev.ts +8 -3
  325. package/src/dispatch-availability.ts +10 -6
  326. package/src/ephemeral/{landing-ingress-proof-worker.ts → landing-ingress-proof.test-fixture.ts} +4 -2
  327. package/src/event-loop-lag.ts +4 -2
  328. package/src/event-loop-yield.ts +2 -2
  329. package/src/events.ts +10 -8
  330. package/src/host/disk-alert.ts +121 -0
  331. package/src/host-provider-store.ts +5 -4
  332. package/src/hub-metrics-report.ts +5 -1
  333. package/src/hub-metrics.ts +38 -18
  334. package/src/injection-sweep-pacing.ts +6 -8
  335. package/src/land-gate-notifications.ts +11 -10
  336. package/src/land-gate-queue-progress.ts +3 -3
  337. package/src/land-settle-dispatch.ts +52 -92
  338. package/src/lifecycle-context-pressure.ts +11 -10
  339. package/src/lifecycle-manager.ts +107 -100
  340. package/src/maintenance/breaker.ts +18 -16
  341. package/src/maintenance/cd-watcher.ts +3 -3
  342. package/src/maintenance/checkout-refresh.ts +18 -1
  343. package/src/maintenance/critical-job-watchdog.ts +19 -20
  344. package/src/maintenance/events.ts +3 -3
  345. package/src/maintenance/history-retention-job.ts +30 -0
  346. package/src/maintenance/index.ts +1 -0
  347. package/src/maintenance/jobs.ts +32 -69
  348. package/src/maintenance/long-running-work.ts +3 -1
  349. package/src/maintenance/offline-agent-prune-job.ts +28 -0
  350. package/src/maintenance/orphaned-sessions.ts +5 -4
  351. package/src/maintenance/pauses.ts +4 -10
  352. package/src/maintenance/plan-ready-notice-job.ts +71 -0
  353. package/src/maintenance/scheduler.ts +98 -137
  354. package/src/maintenance/stalled-delivery-pager.ts +10 -9
  355. package/src/maintenance/teams.ts +19 -30
  356. package/src/maintenance/workspaces.ts +18 -28
  357. package/src/managed-policy-escalation.ts +7 -7
  358. package/src/managed-policy.ts +32 -28
  359. package/src/managed-provider-gate.ts +5 -4
  360. package/src/managed-spawn-reservation.ts +5 -4
  361. package/src/mcp/index.ts +12 -9
  362. package/src/mcp/output-descriptions.ts +8 -8
  363. package/src/mcp/presentation.ts +6 -5
  364. package/src/mcp/project-profile-instructions.ts +32 -0
  365. package/src/mcp/runtime-output.ts +6 -1
  366. package/src/mcp/self-care-visibility.ts +2 -2
  367. package/src/mcp/spawn-targets-matrix.ts +10 -1
  368. package/src/mcp/tool-groups.ts +4 -3
  369. package/src/mcp/tool-roles.ts +81 -0
  370. package/src/mcp/tools-spawn.ts +4 -3
  371. package/src/mcp/tools-workspace.ts +1 -1
  372. package/src/mcp-agent-action.ts +1 -2
  373. package/src/mcp-blackboard-tools.ts +6 -5
  374. package/src/mcp-decision-tools.ts +7 -7
  375. package/src/mcp-egress-tools.ts +10 -9
  376. package/src/mcp-issue-activity-tools.ts +2 -2
  377. package/src/mcp-issue-association-tools.ts +4 -4
  378. package/src/mcp-issue-ref-tools.ts +13 -12
  379. package/src/mcp-maintenance-tools.ts +2 -2
  380. package/src/mcp-merge-tools.ts +5 -5
  381. package/src/mcp-notification-subscription-tools.ts +14 -15
  382. package/src/mcp-output-levels.test-fixture.ts +1 -1
  383. package/src/mcp-profile-trust-tools.ts +5 -5
  384. package/src/mcp-project-journal-tools.ts +4 -12
  385. package/src/mcp-project-tools.ts +17 -18
  386. package/src/mcp-provider-catalog.ts +2 -2
  387. package/src/mcp-routing-policy-tools.ts +3 -2
  388. package/src/mcp-task-tools.ts +11 -5
  389. package/src/mcp-team-template-tools.ts +3 -3
  390. package/src/mcp-team-tools.ts +6 -6
  391. package/src/mcp-workflow-tools.ts +13 -4
  392. package/src/memory-area-injection.ts +13 -12
  393. package/src/memory-boundary-capture.ts +6 -6
  394. package/src/memory-injection.ts +45 -43
  395. package/src/merge-pause-maintenance.ts +5 -4
  396. package/src/notification-router.ts +44 -17
  397. package/src/notification-types.ts +2 -1
  398. package/src/notify.ts +5 -5
  399. package/src/observed-reset-refresh.ts +4 -4
  400. package/src/operator-alarm.ts +23 -11
  401. package/src/project-ingest.ts +6 -6
  402. package/src/project-instructions.ts +12 -1
  403. package/src/project-profile-instruction-text.ts +6 -0
  404. package/src/project-profile-instructions.ts +20 -0
  405. package/src/project-trust.ts +12 -11
  406. package/src/prompt-resolver.ts +3 -3
  407. package/src/provider-catalog-store.ts +3 -49
  408. package/src/provider-config-store.ts +12 -11
  409. package/src/provider-model-seed.ts +1 -18
  410. package/src/provider-quota-async.ts +5 -7
  411. package/src/provider-quota-config-store.ts +5 -4
  412. package/src/provider-secrets.test-fixture.ts +3 -3
  413. package/src/provider-timeline-event.ts +4 -7
  414. package/src/quota-band-delivery.ts +2 -2
  415. package/src/recipe-runner.ts +6 -5
  416. package/src/repo-config-source.ts +10 -4
  417. package/src/retention-config-store.ts +4 -3
  418. package/src/reviewer-pipeline.ts +11 -10
  419. package/src/routes/_route.ts +4 -4
  420. package/src/routes/_shared.ts +13 -12
  421. package/src/routes/agent-effort.ts +5 -5
  422. package/src/routes/agent-heartbeat-quota.ts +23 -0
  423. package/src/routes/agent-keep.ts +1 -1
  424. package/src/routes/agent-profiles.ts +6 -6
  425. package/src/routes/agent-reporting.ts +1 -1
  426. package/src/routes/agent-self-effort.ts +5 -5
  427. package/src/routes/agent-sessions.ts +24 -24
  428. package/src/routes/agents-spawn.ts +2 -2
  429. package/src/routes/agents.ts +19 -121
  430. package/src/routes/auth.ts +14 -15
  431. package/src/routes/authority-audit.ts +2 -2
  432. package/src/routes/automations.ts +6 -5
  433. package/src/routes/channel-binding-delete.ts +1 -1
  434. package/src/routes/channel-output.ts +3 -3
  435. package/src/routes/claude-api-budget.ts +5 -5
  436. package/src/routes/commands-listing.ts +5 -1
  437. package/src/routes/commands.ts +31 -29
  438. package/src/routes/context-resets.ts +2 -2
  439. package/src/routes/continuation-archives.ts +2 -2
  440. package/src/routes/coordinator-teams.ts +1 -1
  441. package/src/routes/decisions.ts +2 -2
  442. package/src/routes/host-secret-files.ts +1 -1
  443. package/src/routes/hosts.ts +11 -11
  444. package/src/routes/inbox.ts +3 -2
  445. package/src/routes/index.ts +12 -2
  446. package/src/routes/integrations.ts +32 -56
  447. package/src/routes/issue-activity.ts +2 -2
  448. package/src/routes/issue-associations.ts +4 -4
  449. package/src/routes/issue-refs.ts +9 -9
  450. package/src/routes/kernel-timers-operator.ts +1 -1
  451. package/src/routes/memory.ts +1 -1
  452. package/src/routes/merges.ts +11 -11
  453. package/src/routes/messages.ts +23 -17
  454. package/src/routes/orchestrator-bootstrap.ts +2 -2
  455. package/src/routes/orchestrator-host-registration.ts +4 -2
  456. package/src/routes/orchestrator-host-utilization.ts +5 -3
  457. package/src/routes/orchestrator-proxy.ts +4 -4
  458. package/src/routes/orchestrator.ts +28 -19
  459. package/src/routes/pairs.ts +8 -8
  460. package/src/routes/project-profile-instructions.ts +27 -0
  461. package/src/routes/project-trust.ts +3 -3
  462. package/src/routes/projects.ts +16 -16
  463. package/src/routes/prompt-templates.ts +12 -12
  464. package/src/routes/provider-config.ts +6 -6
  465. package/src/routes/provider-quota-config.ts +2 -2
  466. package/src/routes/provider-quotas.ts +10 -10
  467. package/src/routes/run-command.ts +1 -1
  468. package/src/routes/secrets-backup.ts +2 -2
  469. package/src/routes/secrets-import.ts +1 -1
  470. package/src/routes/secrets-vault.ts +7 -7
  471. package/src/routes/settings.ts +6 -6
  472. package/src/routes/shipping.ts +9 -1
  473. package/src/routes/spawn-policy.ts +8 -7
  474. package/src/routes/sse.ts +2 -2
  475. package/src/routes/stats.ts +6 -6
  476. package/src/routes/task-http.ts +15 -1
  477. package/src/routes/task-issues.ts +11 -26
  478. package/src/routes/tasks.ts +22 -53
  479. package/src/routes/team-templates.ts +12 -12
  480. package/src/routes/teams-config.ts +2 -2
  481. package/src/routes/teams.ts +10 -10
  482. package/src/routes/tokens.ts +30 -22
  483. package/src/routes/users.ts +24 -24
  484. package/src/routes/viewer-read.ts +3 -3
  485. package/src/routes/web-tool-calls.ts +4 -4
  486. package/src/routes/workflows.ts +22 -7
  487. package/src/routes/workspaces.ts +17 -16
  488. package/src/routing-policy-normalize.ts +1 -2
  489. package/src/routing-policy-push.ts +6 -6
  490. package/src/routing-step-defaults.ts +0 -2
  491. package/src/runner-token-mint-limit.ts +63 -0
  492. package/src/runtime-grant.ts +21 -13
  493. package/src/runtime-tokens.ts +59 -35
  494. package/src/secrets-broker/config.ts +1 -1
  495. package/src/secrets-broker/service.ts +2 -2
  496. package/src/security.ts +16 -21
  497. package/src/self-resume-carry.ts +21 -110
  498. package/src/self-resume-supersede.ts +4 -3
  499. package/src/self-resume.ts +54 -66
  500. package/src/server-background.ts +2 -2
  501. package/src/server.ts +26 -24
  502. package/src/services/agent-action.ts +12 -31
  503. package/src/services/agent-effort.ts +7 -32
  504. package/src/services/agent-hang-watchdog-job.ts +2 -2
  505. package/src/services/agent-heartbeat.ts +166 -0
  506. package/src/services/agent-reporting.ts +1 -1
  507. package/src/services/browser-inventory.ts +3 -3
  508. package/src/services/browser-session-state.ts +3 -2
  509. package/src/services/browser-session.ts +21 -27
  510. package/src/services/bus-command-update.ts +9 -9
  511. package/src/services/checkout-refresh-state.ts +1 -0
  512. package/src/services/checkout-refresh.test-fixture.ts +3 -2
  513. package/src/services/command-host.ts +7 -2
  514. package/src/services/coordinator-digest.ts +3 -2
  515. package/src/services/dispatch-command.ts +12 -13
  516. package/src/services/effective-launch-driver.ts +14 -9
  517. package/src/services/host-changed-paths.test-fixture.ts +5 -6
  518. package/src/services/host-project-readiness.ts +2 -2
  519. package/src/services/host-providers.ts +1 -1
  520. package/src/services/host-utilization.ts +27 -4
  521. package/src/services/idle-agent-digest.ts +17 -12
  522. package/src/services/idle-epics.ts +9 -10
  523. package/src/services/interrupt-agent.ts +12 -9
  524. package/src/services/issue-activity.ts +3 -3
  525. package/src/services/issue-associations.ts +15 -18
  526. package/src/services/issue-lifecycle-comments.ts +3 -2
  527. package/src/services/issue-lifecycle.ts +69 -72
  528. package/src/services/issue-refs.ts +10 -15
  529. package/src/services/kernel-timers-cutover-chaos-worker.ts +11 -8
  530. package/src/services/kernel-timers-ingress-chaos-worker.ts +6 -1
  531. package/src/services/kernel-timers-ingress.ts +4 -4
  532. package/src/services/kernel-timers-message-authority-chaos-worker.ts +3 -10
  533. package/src/services/kernel-timers-operator-chaos-worker.ts +3 -2
  534. package/src/services/kernel-timers-outbox.ts +1 -1
  535. package/src/services/kernel-timers-stage10-operator.ts +1 -1
  536. package/src/services/kernel-timers.ts +4 -3
  537. package/src/services/land-gate-placement.ts +11 -2
  538. package/src/services/land-issue-relations.ts +5 -4
  539. package/src/services/land-restart-retry.ts +7 -6
  540. package/src/services/landed-ancestry.ts +25 -8
  541. package/src/services/legacy-landing-host.ts +4 -1
  542. package/src/services/legacy-landing-recovery.ts +8 -6
  543. package/src/services/managed-running.ts +17 -17
  544. package/src/services/memory-areas.ts +17 -53
  545. package/src/services/merge-pause.ts +9 -15
  546. package/src/services/operator-decisions.ts +37 -41
  547. package/src/services/orchestrator-registration-recovery.ts +6 -2
  548. package/src/services/orchestrator-upgrade.ts +14 -12
  549. package/src/services/permission-decision.ts +4 -3
  550. package/src/services/plan-ci-notice.ts +57 -0
  551. package/src/services/plan-ci-recovery.ts +2 -55
  552. package/src/services/plan-conformance.ts +4 -4
  553. package/src/services/plan-dispatch-policy.ts +10 -3
  554. package/src/services/plan-dispatch.ts +35 -14
  555. package/src/services/plan-graph.ts +39 -261
  556. package/src/services/plan-import.ts +1 -1
  557. package/src/services/plan-live-bindings.ts +8 -37
  558. package/src/services/plan-task-create.ts +1 -1
  559. package/src/services/plan-terminal-refs.ts +2 -12
  560. package/src/services/plan-wake-digest.ts +9 -3
  561. package/src/services/profile-trust.ts +6 -5
  562. package/src/services/project-config-read.ts +70 -0
  563. package/src/services/project-profile-instructions.ts +54 -0
  564. package/src/services/project.ts +11 -10
  565. package/src/services/prompt-templates.ts +6 -5
  566. package/src/services/provider-hold-nudge.ts +9 -9
  567. package/src/services/provider-hold-record.ts +13 -12
  568. package/src/services/provider-state-audit.ts +19 -18
  569. package/src/services/provisioning-harness/budget-baseline.json +4 -4
  570. package/src/services/provisioning-harness/driver.ts +1 -1
  571. package/src/services/provisioning-harness/fixture-matrix.ts +3 -3
  572. package/src/services/provisioning-harness/lifecycle.ts +24 -22
  573. package/src/services/provisioning-harness/prepare.ts +16 -17
  574. package/src/services/rate-limit-resume.ts +10 -9
  575. package/src/services/red-main-auto-revert.ts +7 -5
  576. package/src/services/red-main-controller-deps.ts +20 -3
  577. package/src/services/red-main-incident.ts +3 -1
  578. package/src/services/red-main-quarantine.ts +2 -3
  579. package/src/services/register-agent.ts +22 -22
  580. package/src/services/restart-project-role.ts +1 -1
  581. package/src/services/restart-spawn.ts +74 -61
  582. package/src/services/review-publish.ts +7 -24
  583. package/src/services/review-ref-reconcile.ts +29 -38
  584. package/src/services/runtime-dependency-alert.ts +27 -0
  585. package/src/services/scheduler-command.ts +11 -9
  586. package/src/services/scheduler.ts +5 -5
  587. package/src/services/self-care-state.ts +2 -1
  588. package/src/services/self-effort-grant.ts +5 -25
  589. package/src/services/self-effort.ts +5 -5
  590. package/src/services/send-message.ts +21 -34
  591. package/src/services/shutdown-agent.ts +17 -14
  592. package/src/services/spawn-agent.ts +25 -43
  593. package/src/services/spawn-chain-inspector.ts +7 -14
  594. package/src/services/spawn-cwd-placement.ts +21 -5
  595. package/src/services/spawn-issue-activity.ts +8 -6
  596. package/src/services/spawn-launch.ts +17 -1
  597. package/src/services/spawn-loss-escalation.ts +1 -1
  598. package/src/services/spawn-policy.ts +68 -0
  599. package/src/services/spawn-registration-watchdog.ts +2 -2
  600. package/src/services/spawn-repo-probe.ts +7 -5
  601. package/src/services/spawn-tree-cleanup.ts +8 -9
  602. package/src/services/steward-reaper.ts +4 -4
  603. package/src/services/task-context-hydration.ts +25 -1
  604. package/src/services/task-delivery.ts +20 -34
  605. package/src/services/task-dispatch.ts +3 -0
  606. package/src/services/task-entity.ts +40 -203
  607. package/src/services/task-issue-link.ts +13 -20
  608. package/src/services/task-issue-weave.ts +12 -11
  609. package/src/services/task-lifecycle.ts +27 -31
  610. package/src/services/task-repo-cwd.ts +37 -0
  611. package/src/services/task-review-hold.ts +4 -17
  612. package/src/services/task-semantic-events.ts +13 -11
  613. package/src/services/task-state-reconcile.ts +8 -17
  614. package/src/services/task-validation.ts +2 -2
  615. package/src/services/team-templates.ts +12 -11
  616. package/src/services/team.ts +31 -98
  617. package/src/services/terminal-provider-exit.ts +6 -5
  618. package/src/services/timer-message-fire-chaos-worker.ts +7 -3
  619. package/src/services/timer-message-fire-outbox.ts +1 -1
  620. package/src/services/transient-agent-reaper.ts +25 -20
  621. package/src/services/turn-reconcile-audit.ts +9 -9
  622. package/src/services/user-onboarding.ts +8 -6
  623. package/src/services/user-profile.ts +6 -9
  624. package/src/services/work-finality.ts +16 -4
  625. package/src/services/workflow-auto-start.ts +26 -13
  626. package/src/services/workflow-caller.ts +61 -4
  627. package/src/services/workflow-child-proof-worker.ts +1 -1
  628. package/src/services/workflow-ci-main.ts +1 -1
  629. package/src/services/workflow-control-proof-worker.ts +1 -1
  630. package/src/services/workflow-coordinator.ts +8 -2
  631. package/src/services/workflow-decisions.ts +5 -5
  632. package/src/services/workflow-deferred-cleanup.ts +5 -3
  633. package/src/services/workflow-effect-driver.ts +42 -17
  634. package/src/services/workflow-effects.ts +58 -37
  635. package/src/services/workflow-land-notice.ts +10 -0
  636. package/src/services/workflow-pause-text.ts +43 -0
  637. package/src/services/workflow-pins.ts +7 -4
  638. package/src/services/workflow-reconcile.ts +14 -11
  639. package/src/services/workflow-resume-pins.ts +3 -3
  640. package/src/services/workflow-routing-defaults.ts +18 -0
  641. package/src/services/workflow-run-view.ts +6 -3
  642. package/src/services/workflow-run.test-fixture.ts +1 -1
  643. package/src/services/workflow-runs.ts +61 -33
  644. package/src/services/workflow-supervisor-state.ts +26 -1
  645. package/src/services/workflow-supervisor.ts +11 -6
  646. package/src/services/workspace-recovery.ts +4 -3
  647. package/src/settings/registry.ts +1 -2
  648. package/src/spawn-admission.ts +10 -2
  649. package/src/spawn-command.ts +4 -4
  650. package/src/spawn-models.ts +10 -12
  651. package/src/spawn-placement.ts +28 -10
  652. package/src/spawn-targets.ts +9 -9
  653. package/src/sse-agent-status.ts +15 -6
  654. package/src/sse.ts +49 -24
  655. package/src/startup-context-injection.ts +62 -57
  656. package/src/state-adoption/cd-cutover.ts +53 -7
  657. package/src/state-adoption/fleet-cutover.ts +35 -0
  658. package/src/state-adoption/fleet-plan.ts +36 -0
  659. package/src/state-adoption/index.ts +2 -2
  660. package/src/state-adoption/linux-plan.ts +2 -2
  661. package/src/state-adoption/linux.ts +2 -2
  662. package/src/state-adoption/macos-plan.ts +2 -2
  663. package/src/state-adoption/macos.ts +1 -1
  664. package/src/steward-handoff.ts +4 -3
  665. package/src/steward-policy-cleanup.ts +9 -8
  666. package/src/steward.ts +9 -8
  667. package/src/task-dispatch-live.ts +6 -3
  668. package/src/task-dispatcher.ts +3 -3
  669. package/src/teams-config-store.ts +4 -3
  670. package/src/token-db-write.ts +10 -0
  671. package/src/token-db.ts +2 -2
  672. package/src/token-usage-async.ts +2 -4
  673. package/src/user-awaiting-reply.ts +5 -5
  674. package/src/workspace-actions.ts +24 -29
  675. package/src/workspace-auto-merge.ts +14 -12
  676. package/src/workspace-changed-paths-client.ts +16 -5
  677. package/src/workspace-cleanup-stale.ts +30 -7
  678. package/src/workspace-command-settle.ts +26 -17
  679. package/src/workspace-config.ts +1 -1
  680. package/src/workspace-conflict-resolver.ts +9 -7
  681. package/src/workspace-dead-owner-recovery.ts +5 -4
  682. package/src/workspace-escalation.ts +12 -11
  683. package/src/workspace-human-escalation.ts +3 -3
  684. package/src/workspace-land-gate-watchdog.ts +3 -3
  685. package/src/workspace-land-refusal.ts +20 -0
  686. package/src/workspace-land-stopped.ts +1 -0
  687. package/src/workspace-merge.ts +10 -26
  688. package/src/workspace-nothing-to-land-notice.ts +2 -2
  689. package/src/workspace-orphans.ts +18 -37
  690. package/src/workspace-pr-completion.ts +10 -8
  691. package/src/workspace-rekey.ts +3 -3
  692. package/src/workspace-steward-failure.ts +2 -2
  693. package/src/workspace-steward-wake.ts +4 -4
  694. package/node_modules/@humwick/kernel/LICENSE +0 -167
  695. package/node_modules/@humwick/kernel/async-entity-persistence.ts +0 -344
  696. package/node_modules/@humwick/kernel/async-event-log.ts +0 -107
  697. package/node_modules/@humwick/kernel/automations.pilot.ts +0 -147
  698. package/node_modules/@humwick/kernel/config.ts +0 -111
  699. package/node_modules/@humwick/kernel/contract.ts +0 -572
  700. package/node_modules/@humwick/kernel/control-authz.ts +0 -281
  701. package/node_modules/@humwick/kernel/control.ts +0 -645
  702. package/node_modules/@humwick/kernel/effects.ts +0 -493
  703. package/node_modules/@humwick/kernel/event-log.ts +0 -319
  704. package/node_modules/@humwick/kernel/http-transport.ts +0 -384
  705. package/node_modules/@humwick/kernel/identity-grammar.ts +0 -20
  706. package/node_modules/@humwick/kernel/identity.ts +0 -248
  707. package/node_modules/@humwick/kernel/index.ts +0 -28
  708. package/node_modules/@humwick/kernel/kernel-persistence.ts +0 -181
  709. package/node_modules/@humwick/kernel/landing-incident.ts +0 -306
  710. package/node_modules/@humwick/kernel/landing.ts +0 -953
  711. package/node_modules/@humwick/kernel/manifest-validation.ts +0 -460
  712. package/node_modules/@humwick/kernel/mcp-transport.ts +0 -109
  713. package/node_modules/@humwick/kernel/message-authority-chaos-worker.ts +0 -200
  714. package/node_modules/@humwick/kernel/message-authority.ts +0 -281
  715. package/node_modules/@humwick/kernel/module-host.ts +0 -722
  716. package/node_modules/@humwick/kernel/openapi-init.ts +0 -14
  717. package/node_modules/@humwick/kernel/package.json +0 -39
  718. package/node_modules/@humwick/kernel/persistence-schema.ts +0 -248
  719. package/node_modules/@humwick/kernel/persistence.ts +0 -510
  720. package/node_modules/@humwick/kernel/registry.ts +0 -60
  721. package/node_modules/@humwick/kernel/sqlite-kernel-persistence.ts +0 -499
  722. package/node_modules/@humwick/kernel/sqlite-module-host.ts +0 -87
  723. package/node_modules/@humwick/kernel/timers-chaos-worker.ts +0 -186
  724. package/node_modules/@humwick/kernel/timers.pilot.ts +0 -1411
  725. package/node_modules/@humwick/kernel/workflow-activation.ts +0 -25
  726. package/node_modules/@humwick/kernel/workflow-backstop.ts +0 -40
  727. package/node_modules/@humwick/kernel/workflow-cancel-tree.ts +0 -20
  728. package/node_modules/@humwick/kernel/workflow-chaos-worker.ts +0 -213
  729. package/node_modules/@humwick/kernel/workflow-composition.ts +0 -231
  730. package/node_modules/@humwick/kernel/workflow-container.ts +0 -72
  731. package/node_modules/@humwick/kernel/workflow-control.test-fixture.ts +0 -42
  732. package/node_modules/@humwick/kernel/workflow-control.ts +0 -178
  733. package/node_modules/@humwick/kernel/workflow-definition.ts +0 -507
  734. package/node_modules/@humwick/kernel/workflow-dispatch.ts +0 -60
  735. package/node_modules/@humwick/kernel/workflow-foreach.ts +0 -167
  736. package/node_modules/@humwick/kernel/workflow-journal-codec.ts +0 -339
  737. package/node_modules/@humwick/kernel/workflow-journal.ts +0 -922
  738. package/node_modules/@humwick/kernel/workflow-lane.ts +0 -48
  739. package/node_modules/@humwick/kernel/workflow-lease-owner.ts +0 -60
  740. package/node_modules/@humwick/kernel/workflow-recovery.test-fixture.ts +0 -19
  741. package/node_modules/@humwick/kernel/workflow-runtime.ts +0 -938
  742. package/node_modules/@humwick/kernel/workflow-script.ts +0 -11
  743. package/node_modules/@humwick/kernel/workflow-state.ts +0 -299
  744. package/node_modules/@humwick/kernel/workflow-step-commit.ts +0 -195
  745. package/node_modules/@humwick/kernel/workflow-transitions.ts +0 -317
  746. package/node_modules/@humwick/kernel/workflow-values.ts +0 -153
  747. package/node_modules/@humwick/kernel/workflow.pilot.ts +0 -376
  748. package/node_modules/@humwick/offload/LICENSE +0 -167
  749. package/node_modules/@humwick/offload/README.md +0 -57
  750. package/node_modules/@humwick/offload/dist/async-runner.d.ts +0 -18
  751. package/node_modules/@humwick/offload/dist/async-runner.d.ts.map +0 -1
  752. package/node_modules/@humwick/offload/dist/async-runner.js +0 -158
  753. package/node_modules/@humwick/offload/dist/async-runner.js.map +0 -1
  754. package/node_modules/@humwick/offload/dist/envelope.d.ts +0 -25
  755. package/node_modules/@humwick/offload/dist/envelope.d.ts.map +0 -1
  756. package/node_modules/@humwick/offload/dist/envelope.js +0 -80
  757. package/node_modules/@humwick/offload/dist/envelope.js.map +0 -1
  758. package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts +0 -10
  759. package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts.map +0 -1
  760. package/node_modules/@humwick/offload/dist/fixtures/worker-task.js +0 -59
  761. package/node_modules/@humwick/offload/dist/fixtures/worker-task.js.map +0 -1
  762. package/node_modules/@humwick/offload/dist/index.d.ts +0 -5
  763. package/node_modules/@humwick/offload/dist/index.d.ts.map +0 -1
  764. package/node_modules/@humwick/offload/dist/index.js +0 -5
  765. package/node_modules/@humwick/offload/dist/index.js.map +0 -1
  766. package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts +0 -62
  767. package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts.map +0 -1
  768. package/node_modules/@humwick/offload/dist/subprocess-runner.js +0 -295
  769. package/node_modules/@humwick/offload/dist/subprocess-runner.js.map +0 -1
  770. package/node_modules/@humwick/offload/dist/types.d.ts +0 -111
  771. package/node_modules/@humwick/offload/dist/types.d.ts.map +0 -1
  772. package/node_modules/@humwick/offload/dist/types.js +0 -176
  773. package/node_modules/@humwick/offload/dist/types.js.map +0 -1
  774. package/node_modules/@humwick/offload/dist/worker-pool.d.ts +0 -23
  775. package/node_modules/@humwick/offload/dist/worker-pool.d.ts.map +0 -1
  776. package/node_modules/@humwick/offload/dist/worker-pool.js +0 -435
  777. package/node_modules/@humwick/offload/dist/worker-pool.js.map +0 -1
  778. package/node_modules/@humwick/offload/dist/worker-runtime.d.ts +0 -2
  779. package/node_modules/@humwick/offload/dist/worker-runtime.d.ts.map +0 -1
  780. package/node_modules/@humwick/offload/dist/worker-runtime.js +0 -27
  781. package/node_modules/@humwick/offload/dist/worker-runtime.js.map +0 -1
  782. package/node_modules/@humwick/offload/dist/worker.d.ts +0 -5
  783. package/node_modules/@humwick/offload/dist/worker.d.ts.map +0 -1
  784. package/node_modules/@humwick/offload/dist/worker.js +0 -1
  785. package/node_modules/@humwick/offload/dist/worker.js.map +0 -1
  786. package/node_modules/@humwick/offload/package.json +0 -42
  787. package/node_modules/@humwick/offload/src/async-runner.ts +0 -170
  788. package/node_modules/@humwick/offload/src/envelope.ts +0 -92
  789. package/node_modules/@humwick/offload/src/fixtures/worker-task.ts +0 -49
  790. package/node_modules/@humwick/offload/src/index.ts +0 -4
  791. package/node_modules/@humwick/offload/src/subprocess-runner.ts +0 -334
  792. package/node_modules/@humwick/offload/src/types.ts +0 -235
  793. package/node_modules/@humwick/offload/src/worker-pool.ts +0 -463
  794. package/node_modules/@humwick/offload/src/worker-runtime.ts +0 -32
  795. package/node_modules/@humwick/offload/src/worker.ts +0 -5
  796. package/public/assets/agent-liveness-DyqxfB-t.js +0 -2
  797. package/public/assets/agent-profiles-BpI_jTxq.js +0 -2
  798. package/public/assets/index-B7ZerHLY.css +0 -2
  799. package/public/assets/index-BU3uWo2t.js +0 -15
  800. package/public/assets/projects-B_lmcqfO.js +0 -2
  801. package/public/assets/provider-display-DbLWpP3j.js +0 -2
  802. package/public/assets/run-card-CO_bguQf.js +0 -2
  803. package/public/assets/shipping-Bu8p1gEw.js +0 -2
  804. package/public/assets/store-BvtFdlGX.js +0 -9
  805. package/public/assets/use-project-list-B-T2Bnnn.js +0 -2
  806. package/public/assets/versioned-prompt-editor-Diu8BIaM.js +0 -8
  807. package/runner/src/agent-runner/http-liveness.ts +0 -85
  808. package/runner/src/gate-run-lease-probe.ts +0 -38
  809. package/src/db/claude-catalog-reconcile.ts +0 -27
  810. package/src/db/on-loop-write-transaction.ts +0 -34
  811. package/src/routing-model-aliases.ts +0 -21
@@ -1,25 +0,0 @@
1
- import { z } from "zod";
2
- import { workflowDefinitionSchema } from "./workflow-definition";
3
- import { workflowObject } from "./workflow-values";
4
-
5
- export const workflowActivationSchema = z.object({
6
- id: z.string(), runId: z.string(), path: z.string(), entry: z.number().int(), attempt: z.number().int(),
7
- kind: z.enum(["role", "script", "decision", "workflow", "for-each", "parallel"]),
8
- state: z.enum(["pending", "ready", "running", "waiting", "paused", "succeeded", "failed", "skipped", "cancelled"]),
9
- inputs: workflowObject, outputs: workflowObject.optional(),
10
- error: workflowObject.optional(), childRunId: z.string().optional(), taskId: z.number().int().optional(),
11
- waitKey: z.string(), deadline: z.number().int().optional(), generation: z.number().int(),
12
- outcome: z.string().optional(), createdAt: z.number().int(), updatedAt: z.number().int(),
13
- parentId: z.string().optional(), index: z.number().int().optional(), item: z.unknown().optional(),
14
- key: z.string().optional(), needs: z.array(z.string()).optional(), successors: z.array(z.string()).optional(), remaining: z.number().int().optional(),
15
- lane: workflowObject.optional(),
16
- active: z.boolean().optional(), scheduling: z.boolean().optional(),
17
- container: z.object({ total: z.number().int(), next: z.number().int(), live: z.number().int(), settled: z.number().int(), failed: z.number().int(), stopped: z.boolean(), decision: z.boolean().optional(), winner: z.string().optional() }).optional(),
18
- });
19
- export const workflowSnapshotSchema = z.record(z.string(), z.object({
20
- definition: workflowDefinitionSchema, source: z.enum(["bundled", "project", "project-overrides-bundled"]),
21
- roles: z.record(z.string(), workflowObject),
22
- }));
23
- export const workflowBudgetSchema = z.object({ children: z.number().int(), activations: z.number().int(), agents: z.number().int(), scripts: z.number().int().optional() });
24
- export const workflowReservationSchema = z.object({ id: z.string(), runId: z.string(), rootRunId: z.string(), state: z.enum(["live", "released"]), kind: z.enum(["agents", "scripts"]).optional() });
25
- export type WorkflowActivation = z.output<typeof workflowActivationSchema>;
@@ -1,40 +0,0 @@
1
- import { z } from "zod";
2
- import type { ModuleCtx } from "./contract";
3
- import { waitTimeoutMs } from "./workflow-definition";
4
- import type { Stores, WorkflowRunRecord } from "./workflow.pilot";
5
-
6
- /** #3285 — leave at least two hours beyond the ordinary deadline, and double longer waits. */
7
- export function workflowOverdueAt(deadline: number, timeoutMs: number): number {
8
- return deadline + Math.max(timeoutMs, 2 * 60 * 60_000);
9
- }
10
-
11
- export function workflowBackstop(run: Pick<WorkflowRunRecord, "definition" | "step">, since: number, deadline = since + waitTimeoutMs(run.definition, run.step)) {
12
- if (run.definition.steps[run.step]?.decision) return { overdueAt: undefined, overdueSince: since, overdueNotifiedAt: undefined };
13
- return { overdueAt: workflowOverdueAt(deadline, waitTimeoutMs(run.definition, run.step)), overdueSince: since, overdueNotifiedAt: undefined };
14
- }
15
-
16
- export function workflowStepChange(run: WorkflowRunRecord, step: string, now: number) {
17
- return { step, ...workflowBackstop({ ...run, step }, now), awaiting: null, updatedAt: now };
18
- }
19
-
20
- export const workflowBackstopInput = z.object({ runId: z.string().min(1), now: z.number().int() });
21
-
22
- /** An independent maintenance pass writes the same durable escalation intent the supervisor sends. */
23
- export async function checkWorkflowBackstop(ctx: ModuleCtx, input: z.output<typeof workflowBackstopInput>, stores: Stores): Promise<{ created: boolean; effectId?: string }> {
24
- const run = await stores.run.get(input.runId);
25
- if (!run || run.status !== "running" || run.cancel) return { created: false };
26
- if (run.definition.steps[run.step]?.decision) return { created: false };
27
- const wait = run.awaiting;
28
- const since = run.overdueSince ?? wait?.since ?? run.createdAt;
29
- const overdueAt = run.overdueAt ?? workflowBackstop(run, since, wait?.deadline).overdueAt;
30
- if (overdueAt === undefined) return { created: false };
31
- // Old runs gain the same bound without resetting their age at deployment or restart.
32
- if (run.overdueAt === undefined) await stores.run.update(run.id, { overdueAt, overdueSince: since });
33
- const id = `${run.id}:overdue:${run.waitSeq}:${run.resumes?.length ?? 0}:${overdueAt}`;
34
- if (run.overdueNotifiedAt !== undefined) return { created: false, effectId: id };
35
- if (input.now < overdueAt) return { created: false };
36
- const payload = { reason: "run-overdue", alert: true, step: run.step, round: run.round, since, overdueAt, waitingFor: { kind: wait?.kind ?? "step transition", taskId: wait?.taskId ?? run.taskId } };
37
- await stores.effect.create({ id, runId: run.id, kind: "escalate", ...(wait ? { waitKey: wait.key } : {}), payload: { ...payload, ...(wait ? { wait } : {}) }, status: "pending", attempts: 0, createdAt: input.now });
38
- await stores.run.update(run.id, { overdueNotifiedAt: input.now, escalation: { id, at: input.now, ...(wait ? { waitKey: wait.key } : {}) }, updatedAt: input.now });
39
- return { created: true, effectId: id };
40
- }
@@ -1,20 +0,0 @@
1
- import { z } from "zod";
2
- import type { ModuleCtx } from "./contract";
3
- import { ADMIN_GRANT, stores } from "./workflow-state";
4
-
5
- const input = z.object({ id: z.string(), agentId: z.string(), reason: z.string() });
6
-
7
- /** Direct delegated children share the workflow driver's durable cleanup outbox. */
8
- export const workflowCancelTreeOps = {
9
- cancelAgentTree: {
10
- kind: "mutation", idempotent: true, grant: ADMIN_GRANT,
11
- summary: "Persist cleanup of a stopped delegated agent subtree (system-only).",
12
- expose: { http: false, mcp: false, cli: false }, input, output: z.object({ created: z.boolean() }),
13
- handler: async (ctx: ModuleCtx, args: z.output<typeof input>) => {
14
- const effects = stores(ctx).effect;
15
- if (await effects.get(args.id)) return { created: false };
16
- await effects.create({ id: args.id, runId: args.agentId, kind: "cancel-agent-tree", payload: args, status: "pending", attempts: 0, createdAt: ctx.clock.now() });
17
- return { created: true };
18
- },
19
- },
20
- } as const;
@@ -1,213 +0,0 @@
1
- import { relayEnv } from "@humwick/sdk/env";
2
- /**
3
- * M4 kill-9 chaos harness — the spawned WORKER entrypoint. This is NOT a test file (it takes env and
4
- * drives one workflow against a shared on-disk SQLite/WAL database, possibly SIGKILLing itself at a
5
- * labeled boundary). `kernel/workflow-chaos.integration.test.ts` spawns it as real OS processes.
6
- *
7
- * The harness proves exactly-once step execution survives a REAL `kill -9` across process boundaries,
8
- * which the single-thread `bun:sqlite` unit tests structurally cannot: only real processes against
9
- * one shared WAL file expose cross-process contention (SQLITE_BUSY) and a genuinely-aborted commit
10
- * transaction. A worker either drives a workflow to a crash at an armed boundary (self-`SIGKILL`) or,
11
- * as a fresh process, RECOVERS orphaned instances via the runtime's recover()/wakeup() entry points.
12
- *
13
- * The idempotency-keyed side-effect ledger (harness-owned tables, distinct from the kernel journal):
14
- * - `chaos_applied(key PRIMARY KEY)` — an external effect keyed by `${inputId}:${stepName}`,
15
- * written in the step body via INSERT OR IGNORE. A crash+resume re-runs the body, which repeats
16
- * the SAME key → absorbed. This proves the key was applied AT LEAST once (`applied.has(key)`);
17
- * it CANNOT prove "at most once" — `key` is a PRIMARY KEY, so a duplicate row is structurally
18
- * impossible regardless of runtime behavior. That claim instead rests on the raw `chaos_attempts`
19
- * counter plus the completed-journal-row set (see the integration test).
20
- * - `chaos_attempts(key)` — an append-only raw counter of every body execution, so the
21
- * at-least-once nature is directly observable (a resumed step's body ran ≥ once).
22
- * The K4 `mark` entity write inside each step is the IN-TRANSACTION effect: exactly-once by
23
- * construction (it commits atomically with the journal memo; a committed step is never re-run).
24
- *
25
- * The kernel runtime stays deterministic. Only THIS harness scaffolding uses real processes / real
26
- * wall-clock / real signals — exactly what the working agreement sanctions for the acceptance gate.
27
- */
28
- import { Database } from "bun:sqlite";
29
- import { z } from "zod";
30
- import {
31
- type EntityStore,
32
- type Grant,
33
- type ModuleCtx,
34
- type StepResult,
35
- type WorkflowStepCommitFaults,
36
- createSqliteModuleHost,
37
- createRealClock,
38
- defineModule,
39
- } from "./index";
40
-
41
- const DB_PATH = required("CHAOS_DB");
42
- const CMD = required("CHAOS_CMD"); // "start" | "recover"
43
- const WORKFLOW = process.env.CHAOS_WORKFLOW ?? "chain";
44
- const KEY = process.env.CHAOS_KEY ?? "k";
45
- const BOUNDARY = process.env.CHAOS_BOUNDARY ?? "none";
46
- const TARGET_STEP = process.env.CHAOS_TARGET_STEP ?? (WORKFLOW === "flaky" ? "attempt" : "s2");
47
- const LEASE_TTL_MS = Number(process.env.CHAOS_LEASE_TTL_MS ?? "200");
48
- const RECOVER_DEADLINE_MS = Number(process.env.CHAOS_RECOVER_DEADLINE_MS ?? "8000");
49
- const BUSY_TIMEOUT_MS = Number(process.env.CHAOS_BUSY_TIMEOUT_MS ?? "5000");
50
-
51
- function required(name: string): string {
52
- const value = relayEnv(process.env, name);
53
- if (!value) throw new Error(`chaos worker requires env ${name}`);
54
- return value;
55
- }
56
-
57
- function selfKill(): never {
58
- // A real, uncatchable kill-9 at the exact labeled boundary. SIGKILL cannot be trapped, so no
59
- // cleanup runs — precisely the crash the durability argument must survive.
60
- process.kill(process.pid, "SIGKILL");
61
- throw new Error("unreachable after SIGKILL");
62
- }
63
-
64
- /** Map a labeled COMMIT boundary to the fault hook that self-kills there. */
65
- function commitFaultFor(boundary: string): WorkflowStepCommitFaults | undefined {
66
- switch (boundary) {
67
- case "before-commit": return { beforeCommit: selfKill };
68
- case "after-fence": return { afterFenceBeforeEntities: selfKill };
69
- case "between-entities-events": return { betweenEntitiesAndEvents: selfKill };
70
- case "before-journal": return { insideTxBeforeJournal: selfKill };
71
- case "after-journal": return { afterJournalBeforeCommit: selfKill };
72
- case "after-commit": return { afterCommit: selfKill };
73
- // A crash while journaling the FAILED attempt / parking the retry backoff row.
74
- case "backoff": return { insideTxBeforeJournal: selfKill };
75
- default: return undefined; // "mid-body" is a body-level kill; "none" arms nothing.
76
- }
77
- }
78
-
79
- const markSchema = z.object({ id: z.string(), step: z.string(), n: z.number().int() });
80
- function markStore(ctx: ModuleCtx): EntityStore<{ schema: typeof markSchema }> {
81
- return (ctx.entities as unknown as { readonly mark: EntityStore<{ schema: typeof markSchema }> }).mark;
82
- }
83
-
84
- /** Open the shared on-disk connection in WAL with a real busy_timeout, and install the harness-owned
85
- * idempotency ledger tables (idempotent — every worker may run this). */
86
- function openDb(): Database {
87
- const db = new Database(DB_PATH);
88
- // busy_timeout FIRST: switching the file to WAL and creating the ledger tables both need the write
89
- // lock, and many workers open the shared db at once — without the timeout set first, that startup
90
- // race would fail with a raw `database is locked` before the runtime is even built.
91
- db.run(`PRAGMA busy_timeout = ${BUSY_TIMEOUT_MS}`);
92
- db.run("PRAGMA journal_mode = WAL");
93
- db.run("CREATE TABLE IF NOT EXISTS chaos_applied (key TEXT PRIMARY KEY)");
94
- db.run("CREATE TABLE IF NOT EXISTS chaos_attempts (key TEXT NOT NULL)");
95
- return db;
96
- }
97
-
98
- /** Record the external, idempotency-keyed side effect for a step: an idempotent apply + a raw
99
- * attempt, both autocommit writes OUTSIDE the step's K4/K5 commit tx — modelling a keyed external
100
- * effect that a resume re-issues but the key absorbs. Keyed by the per-instance-unique input id. */
101
- function recordExternalEffect(db: Database, inputId: string, stepName: string): void {
102
- const key = `${inputId}:${stepName}`;
103
- db.query("INSERT INTO chaos_attempts (key) VALUES (?)").run(key);
104
- db.query("INSERT OR IGNORE INTO chaos_applied (key) VALUES (?)").run(key);
105
- }
106
-
107
- const idInput = z.object({ id: z.string() });
108
- const chainState = z.object({ id: z.string(), n: z.number().int() });
109
- type ChainState = z.output<typeof chainState>;
110
-
111
- function buildModule(db: Database) {
112
- // Each step: (1) record the keyed EXTERNAL effect, (2) optionally self-kill mid-body (effect
113
- // emitted, process dies before commit), (3) do the IN-TX K4 write + K5 emit, (4) advance. A `chain`
114
- // is a straight s1→s2→s3(done); `flaky` is one step that throws until its ledger says it may pass.
115
- async function chainStep(name: string, next: string, ctx: ModuleCtx, s: ChainState): Promise<StepResult<ChainState>> {
116
- recordExternalEffect(db, s.id, name);
117
- if (BOUNDARY === "mid-body" && name === TARGET_STEP) selfKill();
118
- await markStore(ctx).create({ id: `${s.id}:${name}`, step: name, n: s.n + 1 });
119
- await ctx.events.emit("chaos.stepped", { id: s.id, step: name });
120
- return next === "done"
121
- ? { state: { ...s, n: s.n + 1 }, next: "done", output: { n: s.n + 1 } }
122
- : { state: { ...s, n: s.n + 1 }, next };
123
- }
124
-
125
- return defineModule({
126
- id: "chaos",
127
- title: "M4 kill-9 chaos pilot",
128
- description: "Real multi-process crash-safety fixture over a shared WAL db.",
129
- entities: { mark: { schema: markSchema, indexes: ["step"] } },
130
- events: { "chaos.stepped": z.object({ id: z.string(), step: z.string() }) },
131
- workflows: {
132
- chain: {
133
- input: idInput, state: chainState,
134
- init: (i): ChainState => ({ id: i.id, n: 0 }), start: "s1",
135
- steps: {
136
- s1: { run: (ctx, s: ChainState) => chainStep("s1", "s2", ctx, s) },
137
- s2: { run: (ctx, s: ChainState) => chainStep("s2", "s3", ctx, s) },
138
- s3: { run: (ctx, s: ChainState) => chainStep("s3", "done", ctx, s) },
139
- },
140
- },
141
- flaky: {
142
- input: idInput, state: chainState,
143
- init: (i): ChainState => ({ id: i.id, n: 0 }), start: "attempt",
144
- steps: {
145
- attempt: {
146
- run: async (ctx, s: ChainState): Promise<StepResult<ChainState>> => {
147
- recordExternalEffect(db, s.id, "attempt");
148
- // Fail on the first two body runs (observed via the raw attempt counter), then succeed —
149
- // so a `backoff` crash lands while the retry backoff row is being journaled.
150
- const attempts = (db.query("SELECT COUNT(*) AS c FROM chaos_attempts WHERE key = ?")
151
- .get(`${s.id}:attempt`) as { c: number }).c;
152
- if (attempts <= 2) throw new Error(`transient (attempt ${attempts})`);
153
- await markStore(ctx).create({ id: `${s.id}:attempt`, step: "attempt", n: s.n + 1 });
154
- return { state: { ...s, n: s.n + 1 }, next: "done", output: { n: s.n + 1 } };
155
- },
156
- retry: { maxAttempts: 5, backoff: { kind: "fixed", delayMs: 40 } },
157
- },
158
- },
159
- },
160
- },
161
- });
162
- }
163
-
164
- type Driver = ReturnType<ReturnType<typeof createSqliteModuleHost>["workflowDriver"]>;
165
-
166
- function buildDriver(db: Database): Driver {
167
- const module = buildModule(db);
168
- const host = createSqliteModuleHost({
169
- db,
170
- clock: createRealClock(),
171
- leaseTtlMs: LEASE_TTL_MS,
172
- busyTimeoutMs: BUSY_TIMEOUT_MS,
173
- workflowCommitFaults: (_instanceId, stepName) =>
174
- (stepName === TARGET_STEP ? commitFaultFor(BOUNDARY) : undefined),
175
- });
176
- host.register(module);
177
- return host.workflowDriver(module, { actor: "user:chaos", grants: [] as Grant[] });
178
- }
179
-
180
- /** Fresh-process recovery: reclaim orphaned instances and fire due timers/backoffs until every
181
- * instance is terminal or the deadline elapses. Polls on a short real-clock interval; a crashed
182
- * worker's lease is reclaimable only after its TTL lapses, so the loop simply waits it out. */
183
- async function recoverLoop(driver: Driver, db: Database): Promise<void> {
184
- const deadline = Date.now() + RECOVER_DEADLINE_MS;
185
- const openCount = () => (db.query(
186
- "SELECT COUNT(*) AS c FROM workflow_instances WHERE status NOT IN ('done','failed','canceled')",
187
- ).get() as { c: number }).c;
188
- while (Date.now() < deadline) {
189
- await driver.recover(); // reclaim expired-lease pending/running instances
190
- await driver.wakeup(); // fire due sleepers (retry backoffs) + satisfied waiters
191
- if (openCount() === 0) return;
192
- await Bun.sleep(15);
193
- }
194
- }
195
-
196
- async function main(): Promise<void> {
197
- const db = openDb();
198
- const driver = buildDriver(db);
199
-
200
- if (CMD === "start") {
201
- // start() seeds the pending instance then drives it; an armed crash boundary self-kills mid-drive
202
- // (this process never returns), otherwise the workflow runs to its terminal/parked state.
203
- await driver.start(WORKFLOW as never, { id: KEY } as never, { idempotencyKey: KEY });
204
- process.exit(0);
205
- }
206
- if (CMD === "recover") {
207
- await recoverLoop(driver, db);
208
- process.exit(0);
209
- }
210
- throw new Error(`unknown CHAOS_CMD '${CMD}'`);
211
- }
212
-
213
- await main();
@@ -1,231 +0,0 @@
1
- import { isDeepStrictEqual } from "node:util";
2
- import { z } from "zod";
3
- import { OpError, type ModuleCtx } from "./contract";
4
- import { workflowActivationSchema } from "./workflow-activation";
5
- import { workflowBackstop } from "./workflow-backstop";
6
- import { actionKind } from "./workflow-lane";
7
- import { validateWorkflowValue, workflowValue } from "./workflow-values";
8
- import { ADMIN_GRANT, runSchema, stores, requireRun, linkTask, writeEffect, type WorkflowRunRecord } from "./workflow-state";
9
-
10
- export function valueContext(run: WorkflowRunRecord): Record<string, unknown> {
11
- return { inputs: run.inputs ?? {}, steps: run.results ?? {}, ...run.itemContext, run: { id: run.id, rootRunId: run.rootRunId ?? run.id, taskId: run.taskId, round: run.round, headSha: run.head ?? "", landedSha: run.landed?.sha ?? "" } };
12
- }
13
- export async function rootRun(ctx: ModuleCtx, run: WorkflowRunRecord): Promise<WorkflowRunRecord> {
14
- return run.rootRunId && run.rootRunId !== run.id ? requireRun(ctx, run.rootRunId) : run;
15
- }
16
- export async function allocateRunId(ctx: ModuleCtx, taskId: number): Promise<string> {
17
- const key = `run:${taskId}`;
18
- let allocation = await stores(ctx).allocation.get(key);
19
- if (!allocation) {
20
- let max = 0;
21
- let cursor: string | undefined;
22
- do {
23
- const page = await stores(ctx).run.list({ where: { taskId }, limit: 200, ...(cursor ? { cursor } : {}) });
24
- for (const run of page.items) max = Math.max(max, Number(run.id.split("-").at(-1)) || 0);
25
- cursor = page.cursor;
26
- } while (cursor);
27
- allocation = await stores(ctx).allocation.create({ id: key, value: max });
28
- }
29
- await stores(ctx).allocation.update(key, { value: allocation.value + 1 });
30
- return `wf-T${taskId}-${allocation.value + 1}`;
31
- }
32
-
33
- export async function enterActivation(ctx: ModuleCtx, run: WorkflowRunRecord, key: string, deadline: number | undefined, skipped = false): Promise<Record<string, unknown>> {
34
- if (!run.rootRunId) return {};
35
- const root = await rootRun(ctx, run);
36
- if (root.cancel || root.status !== "running") throw new OpError("conflict", 409, "ROOT_STOPPED: root has stopped admissions");
37
- const step = run.definition.steps[run.step];
38
- if (run.itemContext) {
39
- const activation = await stores(ctx).activation.get(run.id);
40
- const inputs = activation!.inputs;
41
- if (new TextEncoder().encode(JSON.stringify(inputs)).length > 65536) throw new OpError("invalid_input", 400, "INPUT_INVALID: inputs exceed 64 KiB");
42
- await stores(ctx).activation.update(run.id, { inputs, waitKey: key, deadline, state: "waiting", updatedAt: ctx.clock.now() });
43
- return { activationId: activation!.id, inputs };
44
- }
45
- const id = `${run.id}:${run.waitSeq + 1}:1`;
46
- const inputs = skipped ? {} : workflowValue(step?.inputs ?? {}, valueContext(run)) as Record<string, unknown>;
47
- if (new TextEncoder().encode(JSON.stringify(inputs)).length > 65536) throw new OpError("invalid_input", 400, "INPUT_INVALID: inputs exceed 64 KiB");
48
- const budget = root.budget ?? { children: 0, activations: 0, agents: 0 };
49
- if (budget.activations >= (root.limits?.activations ?? 4096)) throw new OpError("conflict", 409, "ACTIVATION_LIMIT: root budget exhausted");
50
- const now = ctx.clock.now();
51
- await stores(ctx).activation.create({ id, runId: run.id, path: run.step, entry: run.waitSeq + 1, attempt: run.scriptPoll?.attempt ?? 1,
52
- kind: actionKind(step!), state: "waiting", inputs, waitKey: key, deadline,
53
- generation: root.generation ?? 0, createdAt: now, updatedAt: now });
54
- await stores(ctx).run.update(root.id, { budget: { ...budget, activations: budget.activations + 1 } });
55
- await stores(ctx).run.update(run.id, { activationId: id });
56
- if (!skipped && step?.task === "input" && !step.script && !step.workflow) await linkTask(ctx, run.taskId, run.id, step.gate, id);
57
- if (step?.workflow) {
58
- const link = await stores(ctx).link.get(String(run.taskId));
59
- if (link?.runId === run.id) await stores(ctx).link.delete(link.id);
60
- }
61
- return { activationId: id, inputs };
62
- }
63
-
64
- export async function settleActivation(ctx: ModuleCtx, run: WorkflowRunRecord, outcome: string, outputs: Record<string, unknown>, error?: Record<string, unknown>): Promise<Partial<WorkflowRunRecord>> {
65
- if (!run.activationId) return {};
66
- const successful = outcome === "complete" || outcome === "pass";
67
- const state = outcome === "skipped" ? "skipped" : error ? "failed" : successful ? "succeeded" : outcome === "blocked" ? "paused" : "failed";
68
- await stores(ctx).activation.update(run.activationId, { state, outcome, outputs: outcome === "skipped" ? undefined : outputs, ...(error ? { error } : {}), updatedAt: ctx.clock.now() });
69
- return { results: { ...run.results, [run.step]: { status: state, outcome, ...(outcome === "skipped" ? {} : { outputs }), ...(error ? { error } : {}) } } };
70
- }
71
-
72
- export async function releaseReservation(ctx: ModuleCtx, effectId: string): Promise<boolean> {
73
- const reservation = await stores(ctx).reservation.get(effectId);
74
- if (!reservation || reservation.state === "released") return false;
75
- const root = await requireRun(ctx, reservation.rootRunId);
76
- await stores(ctx).reservation.update(effectId, { state: "released" });
77
- const kind = reservation.kind ?? "agents";
78
- await stores(ctx).run.update(root.id, { budget: { ...root.budget!, [kind]: Math.max(0, (root.budget?.[kind] ?? 1) - 1) } });
79
- return true;
80
- }
81
-
82
- export async function parkDecision(ctx: ModuleCtx, child: WorkflowRunRecord, parent: WorkflowRunRecord, reason: string, sourceEffectId?: string): Promise<{ created: boolean; rootRunId: string; decisionEffectId?: string }> {
83
- const root = await rootRun(ctx, parent);
84
- if (root.cancel || root.status !== "running") return { created: false, rootRunId: root.id, ...(root.escalation ? { decisionEffectId: root.escalation.id } : {}) };
85
- const source = sourceEffectId ? await stores(ctx).effect.get(sourceEffectId) : undefined;
86
- const now = ctx.clock.now();
87
- let ancestor: WorkflowRunRecord | undefined = parent;
88
- while (ancestor) {
89
- if (ancestor.activationId) await stores(ctx).activation.update(ancestor.activationId, { state: "paused", error: { code: "CHILD_PAUSED", childRunId: child.id, message: reason }, updatedAt: now });
90
- await stores(ctx).run.update(ancestor.id, { status: "escalated", reason, decisionChildRunId: child.id, updatedAt: now });
91
- ancestor = ancestor.parentRunId ? await requireRun(ctx, ancestor.parentRunId) : undefined;
92
- }
93
- const seq = root.waitSeq + 1;
94
- const id = await writeEffect(ctx, root, seq, "escalate", { reason, childRunId: child.id,
95
- childDecision: { ...source?.payload, runId: child.id, step: source?.payload.step ?? child.step, ...(source?.payload.wait ? { wait: source.payload.wait } : child.awaiting ? { wait: child.awaiting } : {}), ...(sourceEffectId ? { sourceEffectId } : {}) } });
96
- await stores(ctx).run.update(root.id, { waitSeq: seq, escalation: { id, at: now } });
97
- return { created: true, rootRunId: root.id, decisionEffectId: id };
98
- }
99
-
100
- export const compositionOps = {
101
- parkChild: {
102
- kind: "mutation", idempotent: true, grant: ADMIN_GRANT, summary: "Park the owning tree on one child's durable decision.", expose: { http: false, mcp: false, cli: false },
103
- input: z.object({ runId: z.string(), childRunId: z.string(), reason: z.string().optional() }), output: z.object({ created: z.boolean() }),
104
- handler: async (ctx: ModuleCtx, input: { runId: string; childRunId: string; reason?: string }) => {
105
- const child = await requireRun(ctx, input.childRunId);
106
- const parent = await requireRun(ctx, input.runId);
107
- if (child.parentRunId !== parent.id || (child.status !== "escalated" && !input.reason) || parent.cancel) return { created: false };
108
- const reason = input.reason ?? `Child ${child.id} parked: ${child.reason ?? "decision required"}`;
109
- const decision = await parkDecision(ctx, child, parent, reason, input.reason ? undefined : child.escalation?.id);
110
- return { created: decision.created };
111
- },
112
- },
113
- routeDecision: {
114
- kind: "mutation", idempotent: true, grant: ADMIN_GRANT, summary: "Route a descendant decision fact through the root before acknowledging it.", expose: { http: false, mcp: false, cli: false },
115
- input: z.object({ effectId: z.string() }), output: z.object({ created: z.boolean(), rootRunId: z.string(), decisionEffectId: z.string().optional(), obsolete: z.boolean().optional() }),
116
- handler: async (ctx: ModuleCtx, input: { effectId: string }) => {
117
- const effect = await stores(ctx).effect.get(input.effectId);
118
- if (!effect || effect.kind !== "escalate") throw new OpError("not_found", 404, "decision effect not found");
119
- const child = await requireRun(ctx, effect.runId);
120
- if (!child.parentRunId) throw new OpError("invalid_input", 400, "decision already belongs to root");
121
- if (effect.payload.alert === true && (child.status !== "running" || (effect.waitKey && effect.waitKey !== child.awaiting?.key))) return { created: false, rootRunId: child.rootRunId!, obsolete: true };
122
- return parkDecision(ctx, child, await requireRun(ctx, child.parentRunId), `Child ${child.id}: ${String(effect.payload.reason)}`, effect.id);
123
- },
124
- },
125
- cleanup: {
126
- kind: "mutation", idempotent: true, grant: ADMIN_GRANT, summary: "Record cancellation cleanup without changing the terminal outcome.", expose: { http: false, mcp: false, cli: false },
127
- input: z.object({ runId: z.string(), complete: z.boolean(), error: z.string().optional() }), output: z.object({ recorded: z.boolean() }),
128
- handler: async (ctx: ModuleCtx, input: { runId: string; complete: boolean; error?: string }) => {
129
- const run = await requireRun(ctx, input.runId);
130
- if (!run.cleanup) return { recorded: false };
131
- const late = ctx.clock.now() >= run.cleanup.deadline;
132
- await stores(ctx).run.update(run.id, { cleanup: { ...run.cleanup, status: input.complete ? "complete" : late ? "incomplete" : "pending", ...(input.error ? { error: input.error } : {}) } });
133
- if (late && !input.complete) {
134
- const root = await rootRun(ctx, run);
135
- const id = `${root.id}:cleanup:${root.generation ?? 0}`;
136
- if (!await stores(ctx).effect.get(id)) await stores(ctx).effect.create({ id, runId: root.id, kind: "escalate", status: "pending", attempts: 0, payload: { reason: `CLEANUP_INCOMPLETE: ${input.error ?? run.id}`, cleanupRunId: run.id }, createdAt: ctx.clock.now() });
137
- }
138
- return { recorded: true };
139
- },
140
- },
141
- reserveAgent: {
142
- kind: "mutation", idempotent: true, grant: ADMIN_GRANT, summary: "Reserve one live root-tree agent before dispatch.", expose: { http: false, mcp: false, cli: false },
143
- input: z.object({ runId: z.string(), effectId: z.string() }), output: z.object({ reserved: z.boolean() }),
144
- handler: async (ctx: ModuleCtx, input: { runId: string; effectId: string }) => {
145
- const run = await requireRun(ctx, input.runId);
146
- if (!run.rootRunId) return { reserved: false };
147
- const existing = await stores(ctx).reservation.get(input.effectId);
148
- if (existing) return { reserved: existing.state === "live" };
149
- const root = await rootRun(ctx, run);
150
- if (root.cancel || root.status !== "running" || run.status !== "running") throw new OpError("conflict", 409, "ROOT_STOPPED: dispatch is stale");
151
- const budget = root.budget!;
152
- if (budget.agents >= Math.min(run.limits?.agents ?? 8, root.limits?.agents ?? 8)) throw new OpError("conflict", 409, "AGENT_BUDGET_BLOCKED: retained agents exhaust root capacity; change retention or limits");
153
- await stores(ctx).reservation.create({ id: input.effectId, runId: run.id, rootRunId: root.id, state: "live" });
154
- await stores(ctx).run.update(root.id, { budget: { ...budget, agents: budget.agents + 1 } });
155
- return { reserved: true };
156
- },
157
- },
158
- reserveScript: {
159
- kind: "mutation", idempotent: true, grant: ADMIN_GRANT, summary: "Reserve a root-tree script command before executor admission.", expose: { http: false, mcp: false, cli: false },
160
- input: z.object({ runId: z.string(), effectId: z.string() }), output: z.object({ reserved: z.boolean() }),
161
- handler: async (ctx: ModuleCtx, input: { runId: string; effectId: string }) => {
162
- const run = await requireRun(ctx, input.runId);
163
- if (!run.rootRunId) return { reserved: true };
164
- const existing = await stores(ctx).reservation.get(input.effectId);
165
- if (existing) return { reserved: existing.state === "live" };
166
- const root = await rootRun(ctx, run);
167
- if (root.cancel || run.cancel || root.status !== "running" || run.status !== "running") return { reserved: false };
168
- if ((root.budget?.scripts ?? 0) >= Math.min(run.limits?.scripts ?? 8, root.limits?.scripts ?? 8)) return { reserved: false };
169
- await stores(ctx).reservation.create({ id: input.effectId, runId: run.id, rootRunId: root.id, kind: "scripts", state: "live" });
170
- await stores(ctx).run.update(root.id, { budget: { ...root.budget!, scripts: (root.budget?.scripts ?? 0) + 1 } });
171
- return { reserved: true };
172
- },
173
- },
174
- releaseReservation: {
175
- kind: "mutation", idempotent: true, grant: ADMIN_GRANT, summary: "Release a confirmed ended or refused invocation's reservation.", expose: { http: false, mcp: false, cli: false },
176
- input: z.object({ effectId: z.string() }), output: z.object({ released: z.boolean() }),
177
- handler: async (ctx: ModuleCtx, input: { effectId: string }) => ({ released: await releaseReservation(ctx, input.effectId) }),
178
- },
179
- activations: {
180
- kind: "query", grant: ADMIN_GRANT, summary: "Page a run's sequential activation lane.", expose: { http: false, mcp: false, cli: false },
181
- input: z.object({ runId: z.string(), cursor: z.string().optional() }),
182
- output: z.object({ items: z.array(workflowActivationSchema), cursor: z.string().optional() }),
183
- handler: async (ctx: ModuleCtx, input: { runId: string; cursor?: string }) => stores(ctx).activation.list({ where: { runId: input.runId }, limit: 100, ...(input.cursor ? { cursor: input.cursor } : {}) }),
184
- },
185
- children: {
186
- kind: "query", grant: ADMIN_GRANT, summary: "Page linked child runs.", expose: { http: false, mcp: false, cli: false },
187
- input: z.object({ runId: z.string(), cursor: z.string().optional() }),
188
- output: z.object({ items: z.array(runSchema), cursor: z.string().optional() }),
189
- handler: async (ctx: ModuleCtx, input: { runId: string; cursor?: string }) => stores(ctx).run.list({ where: { parentRunId: input.runId }, limit: 100, ...(input.cursor ? { cursor: input.cursor } : {}) }),
190
- },
191
- createChild: {
192
- kind: "mutation", idempotent: true, grant: ADMIN_GRANT, summary: "Atomically allocate/link one pinned child and its first driver.", expose: { http: false, mcp: false, cli: false },
193
- input: z.object({ runId: z.string(), activationId: z.string(), afterEventId: z.number().int(), taskId: z.number().int().positive(), inputs: z.record(z.string(), z.unknown()) }),
194
- output: z.object({ run: runSchema, created: z.boolean() }),
195
- handler: async (ctx: ModuleCtx, input: { runId: string; activationId: string; afterEventId: number; taskId: number; inputs: Record<string, unknown> }) => {
196
- const parent = await requireRun(ctx, input.runId);
197
- const activation = await stores(ctx).activation.get(input.activationId);
198
- if (!activation || (activation.runId !== parent.id && activation.id !== parent.id)) throw new OpError("not_found", 404, "activation not found");
199
- if (activation.childRunId) {
200
- const child = await requireRun(ctx, activation.childRunId);
201
- if (!isDeepStrictEqual(child.inputs, input.inputs) || child.taskId !== input.taskId) throw new OpError("conflict", 409, "CHILD_INPUT_CONFLICT: child already allocated with other inputs");
202
- return { run: child, created: false };
203
- }
204
- const root = await rootRun(ctx, parent);
205
- if (root.cancel || root.status !== "running" || parent.status !== "running" || parent.activationId !== activation.id) throw new OpError("conflict", 409, "ROOT_STOPPED: child admission is stale");
206
- const name = parent.definition.steps[parent.step]!.workflow!;
207
- const snapshot = root.snapshot?.[name];
208
- if (!snapshot) throw new OpError("invalid_input", 400, "SOURCE_UNAVAILABLE: child missing from pinned closure");
209
- validateWorkflowValue(snapshot.definition.inputs, input.inputs, "INPUT_INVALID");
210
- const depth = (parent.depth ?? 0) + 1;
211
- const budget = root.budget!;
212
- const owner = parent.itemContext ? await requireRun(ctx, activation.runId) : parent;
213
- if (depth > (root.limits?.depth ?? 8) || (owner.childCount ?? 0) >= (owner.limits?.children ?? root.limits?.children ?? 256) || budget.children >= (root.limits?.treeChildren ?? 1024)) throw new OpError("conflict", 409, "CHILD_LIMIT: root child budget exhausted");
214
- const id = await allocateRunId(ctx, input.taskId);
215
- const now = ctx.clock.now();
216
- const run = await stores(ctx).run.create({ id, workflow: name, ref: root.ref, sha: root.sha, source: snapshot.source,
217
- taskId: input.taskId, coordinator: root.coordinator, callerAgentId: root.callerAgentId, maxLiveAgents: root.maxLiveAgents, cwd: root.cwd, orchestratorId: root.orchestratorId,
218
- definition: snapshot.definition, inputs: input.inputs, routingDefaults: root.routingDefaults, parentRunId: parent.id, parentActivationId: activation.id,
219
- rootRunId: root.id, depth, generation: root.generation ?? 0, limits: Object.fromEntries(Object.entries({ ...root.limits, ...snapshot.definition.limits }).map(([key, value]) => [key, Math.min(value, root.limits?.[key] ?? value)])),
220
- status: "running", step: snapshot.definition.start, round: 1, entered: [], counters: {}, waitSeq: 0, awaiting: null,
221
- cursor: input.afterEventId, feedback: null, rounds: [], ...workflowBackstop({ definition: snapshot.definition, step: snapshot.definition.start }, now), createdAt: now, updatedAt: now });
222
- const first = snapshot.definition.steps[snapshot.definition.start]!;
223
- if (first.task === "input" && !first.script && !first.workflow) await linkTask(ctx, input.taskId, id, first.gate);
224
- await stores(ctx).activation.update(activation.id, { childRunId: id, taskId: input.taskId, updatedAt: now });
225
- await stores(ctx).run.update(root.id, { budget: { ...budget, children: budget.children + 1 } });
226
- await stores(ctx).run.update(owner.id, { childCount: (owner.childCount ?? 0) + 1 });
227
- await ctx.workflows.start("run", { runId: id }, { idempotencyKey: id, enlist: "op-commit" });
228
- return { run, created: true };
229
- },
230
- },
231
- } as const;
@@ -1,72 +0,0 @@
1
- import { OpError, type ModuleCtx } from "./contract";
2
- import type { WorkflowActivation } from "./workflow-activation";
3
- import { workflowItemAction } from "./workflow-definition";
4
- import { actionKind } from "./workflow-lane";
5
- import { rootRun, valueContext } from "./workflow-composition";
6
- import { workflowValue, workflowCondition } from "./workflow-values";
7
- import { stores, type WorkflowRunRecord } from "./workflow-state";
8
-
9
- export function itemResult(slot: WorkflowActivation): Record<string, unknown> {
10
- return { index: slot.index, key: slot.key ?? String(slot.index), status: slot.state, outcome: slot.outcome ?? slot.state,
11
- ...(slot.needs ? { needs: slot.needs } : {}), ...(slot.outputs ? { outputs: slot.outputs } : {}), ...(slot.error ? { error: slot.error } : {}), ...(slot.childRunId ? { childRunId: slot.childRunId } : {}) };
12
- }
13
-
14
- export async function expandItems(ctx: ModuleCtx, run: WorkflowRunRecord): Promise<void> {
15
- const container = (await stores(ctx).activation.get(run.activationId!))!;
16
- if (container.container) return;
17
- const loop = run.definition.steps[run.step]!.forEach!;
18
- const items = typeof loop.items === "string" ? workflowValue(loop.items, valueContext(run)) : loop.items;
19
- if (!Array.isArray(items)) throw new OpError("invalid_input", 400, "ITEMS_INVALID: source must be an array");
20
- const root = await rootRun(ctx, run);
21
- if (items.length > 1000 || new TextEncoder().encode(JSON.stringify(items)).length > 1048576 || root.budget!.activations + items.length > (root.limits?.activations ?? 4096)) throw new OpError("invalid_input", 400, "EXPANSION_LIMIT: entire item expansion refused");
22
- const slots = items.map((item, index) => {
23
- const context = { ...valueContext(run), item, index };
24
- const key = loop.branches ? String(item) : loop.key === undefined ? String(index) : workflowValue(loop.key, context);
25
- const needs = workflowValue(loop.needs ?? [], context);
26
- if (typeof key !== "string" || !key.length || key.length > 256 || !Array.isArray(needs) || needs.some(key => typeof key !== "string") || new Set(needs).size !== needs.length) throw new OpError("invalid_input", 400, "DAG_INVALID: keys must be unique strings and needs must be distinct keys");
27
- const action = workflowItemAction(loop, { key, item });
28
- const inputs = action.condition !== undefined && !workflowCondition(action.condition, context) ? {} : workflowValue(action.inputs ?? {}, context) as Record<string, unknown>;
29
- if (new TextEncoder().encode(JSON.stringify(inputs)).length > 65536) throw new OpError("invalid_input", 400, "INPUT_INVALID: item inputs exceed 64 KiB");
30
- return { id: `${container.id}:item:${String(index).padStart(4, "0")}`, key, needs: needs as string[], successors: [] as string[], item, index, action, inputs };
31
- });
32
- const keyed = new Map(slots.map(slot => [slot.key, slot]));
33
- if (keyed.size !== slots.length) throw new OpError("invalid_input", 400, "DAG_INVALID: duplicate key");
34
- for (const slot of slots) for (const key of slot.needs) {
35
- const predecessor = keyed.get(key);
36
- if (!predecessor) throw new OpError("invalid_input", 400, `DAG_INVALID: missing dependency ${key}`);
37
- predecessor.successors.push(slot.id);
38
- }
39
- const byId = new Map(slots.map(slot => [slot.id, slot]));
40
- const remaining = new Map(slots.map(slot => [slot.id, slot.needs.length]));
41
- const ready = slots.filter(slot => !slot.needs.length).map(slot => slot.id);
42
- for (let index = 0; index < ready.length; index++) for (const id of byId.get(ready[index]!)!.successors) {
43
- remaining.set(id, remaining.get(id)! - 1);
44
- if (!remaining.get(id)) ready.push(id);
45
- }
46
- if (ready.length !== slots.length) throw new OpError("invalid_input", 400, "DAG_INVALID: dependency cycle");
47
- const children = slots.filter(slot => slot.action.workflow).length;
48
- if (children && (children + (run.childCount ?? 0) > (run.limits?.children ?? 256) || children + root.budget!.children > (root.limits?.treeChildren ?? 1024) || (run.depth ?? 0) + 1 > (root.limits?.depth ?? 8))) throw new OpError("invalid_input", 400, "EXPANSION_LIMIT: child allocation budget would be exceeded");
49
- const now = ctx.clock.now();
50
- for (const { action, ...slot } of slots) await stores(ctx).activation.create({ ...slot, runId: container.runId, parentId: container.id,
51
- path: loop.branches ? `${container.path}.${slot.key}` : `${container.path}[${slot.index}]`, entry: container.entry, attempt: 1,
52
- active: false, remaining: slot.needs.length, kind: actionKind(action), state: slot.needs.length ? "pending" : "ready", waitKey: "", deadline: container.deadline, generation: root.generation ?? 0, createdAt: now, updatedAt: now });
53
- await stores(ctx).run.update(root.id, { budget: { ...root.budget!, activations: root.budget!.activations + items.length } });
54
- await stores(ctx).activation.update(container.id, { scheduling: true, container: { total: items.length, next: 0, live: 0, settled: 0, failed: 0, stopped: false } });
55
- }
56
-
57
- export async function settleDependents(ctx: ModuleCtx, slot: WorkflowActivation, failed: boolean): Promise<number> {
58
- let skipped = 0;
59
- const pending = [...(slot.successors ?? [])];
60
- for (let index = 0; index < pending.length; index++) {
61
- const next = (await stores(ctx).activation.get(pending[index]!))!;
62
- if (next.state !== "pending") continue;
63
- if (failed) {
64
- await stores(ctx).activation.update(next.id, { state: "skipped", outcome: "skipped", error: { code: "DEPENDENCY_FAILED", predecessor: slot.key ?? String(slot.index) } });
65
- skipped++; pending.push(...(next.successors ?? []));
66
- } else {
67
- const remaining = next.remaining! - 1;
68
- await stores(ctx).activation.update(next.id, { remaining, ...(remaining === 0 ? { state: "ready" } : {}) });
69
- }
70
- }
71
- return skipped;
72
- }