@humwick/server 0.130.2 → 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 (570) hide show
  1. package/bundled/prompts/manifest.json +1 -0
  2. package/bundled/prompts/task.hydration.md +1 -1
  3. package/bundled/roles/builder.md +1 -1
  4. package/docs/guides/sub-coordinators.md +12 -5
  5. package/docs/guides/tools-coordination.md +1 -0
  6. package/docs/guides/workflows.md +16 -0
  7. package/docs/openapi.json +73 -4
  8. package/package.json +8 -7
  9. package/public/assets/{MessageBubble-BWLqMGKG.js → MessageBubble-Bq9kr21N.js} +2 -2
  10. package/public/assets/{PlanGraphPanel-3TlIQpjk.js → PlanGraphPanel-Dqiroy06.js} +2 -2
  11. package/public/assets/{TraceView-Wimm0Czv.js → TraceView-DYU962-H.js} +2 -2
  12. package/public/assets/{VaultDecisionCard-Bau_vNax.js → VaultDecisionCard-DhPfzioE.js} +2 -2
  13. package/public/assets/{activity-CrSurn-r.js → activity-DzCcQTee.js} +2 -2
  14. package/public/assets/{agent-lineage-CknAJKcb.js → agent-lineage-SgDt9i3T.js} +2 -2
  15. package/public/assets/agent-liveness-Bq-s73jW.js +2 -0
  16. package/public/assets/{agent-name-DKbiIhBo.js → agent-name-CcY3Aijy.js} +2 -2
  17. package/public/assets/{agent-profiles-DwF6EQ4R.js → agent-profiles-cxtRBn6O.js} +2 -2
  18. package/public/assets/{agent-project-badge-Diz4Sjjb.js → agent-project-badge-DGYbIhaI.js} +2 -2
  19. package/public/assets/{agent-tools-CRhpRQza.js → agent-tools-DHbftV0N.js} +2 -2
  20. package/public/assets/{agent-type-icon-LrUEU3lB.js → agent-type-icon-CY113sp-.js} +2 -2
  21. package/public/assets/{agents-B-v66C-4.js → agents-BPzY7IlQ.js} +2 -2
  22. package/public/assets/{analytics-BqCb-LKi.js → analytics-DENFPv_a.js} +2 -2
  23. package/public/assets/{artifact-viewer-kf4pGuAR.js → artifact-viewer-KRvSc7sl.js} +2 -2
  24. package/public/assets/{artifacts-DJevXcvg.js → artifacts-C9gSmL3s.js} +2 -2
  25. package/public/assets/{artifacts-D32zyw4Y.js → artifacts-DT-HkI5O.js} +2 -2
  26. package/public/assets/{automation-BpRajx_5.js → automation-BsmjQhKD.js} +2 -2
  27. package/public/assets/{backlog-D_UjTdzX.js → backlog-8NYH_62t.js} +2 -2
  28. package/public/assets/{busy-health-N3VEh4ao.js → busy-health-D3hwvYb4.js} +2 -2
  29. package/public/assets/{channels-9jopungq.js → channels-DCJ5WL7O.js} +2 -2
  30. package/public/assets/{chat-CSXrTB3C.js → chat-DAIl357U.js} +3 -3
  31. package/public/assets/{code-preview-p1NnmqK0.js → code-preview-CzrZfr9U.js} +2 -2
  32. package/public/assets/{connectors-CZdqlDNL.js → connectors-xTxtlyou.js} +2 -2
  33. package/public/assets/{cosmos-BgdsE4dG.js → cosmos-BpebFLK2.js} +2 -2
  34. package/public/assets/{crate-agent-30aXTKva.js → crate-agent-BHvI5wXC.js} +2 -2
  35. package/public/assets/{dependency-graph-B_jvw2GE.js → dependency-graph-DGT0o3wJ.js} +2 -2
  36. package/public/assets/{deploys-DoN6bAb5.js → deploys-hqWOHSHE.js} +2 -2
  37. package/public/assets/{display-BrKWFGJz.js → display-CDeH4I8T.js} +2 -2
  38. package/public/assets/{files-D6XEu8Ng.js → files-BTeGVmTg.js} +2 -2
  39. package/public/assets/{fleet-C7jQWbw2.js → fleet-DgXtNgCa.js} +2 -2
  40. package/public/assets/{fleet-metrics-BiDs3MLx.js → fleet-metrics-BHEt5yc_.js} +2 -2
  41. package/public/assets/{formatted-body-CQBwc1fb.js → formatted-body-MLtodyPp.js} +3 -3
  42. package/public/assets/{formatted-body-impl-DyG0WsQS.js → formatted-body-impl-CAe664Z8.js} +2 -2
  43. package/public/assets/{host-providers-dialog-DKaW31dN.js → host-providers-dialog-mapF4Fj9.js} +2 -2
  44. package/public/assets/{index-CRHep3M9.js → index-CqqgOI5R.js} +5 -5
  45. package/public/assets/{insights-CzrtkpOE.js → insights-DNyf7IzF.js} +2 -2
  46. package/public/assets/{integrations-aVsUmigt.js → integrations-DlYOHq7T.js} +2 -2
  47. package/public/assets/{issue-ref-chip-BnSlM_95.js → issue-ref-chip-CeWBNWn7.js} +2 -2
  48. package/public/assets/{log-viewer-qe7Ee47Z.js → log-viewer-Cib8nqdE.js} +2 -2
  49. package/public/assets/{maintenance-NfjqFZAk.js → maintenance-DSn1cPm7.js} +2 -2
  50. package/public/assets/{managed-agents-BiH0HgaE.js → managed-agents-C3CkM81m.js} +2 -2
  51. package/public/assets/{markdown-preview-BixaT3Xr.js → markdown-preview-W4VQQPAv.js} +3 -3
  52. package/public/assets/{markdown-preview-impl-DNGlWIS3.js → markdown-preview-impl-CMsTdhjq.js} +2 -2
  53. package/public/assets/{memory-DNsCl6UX.js → memory-BV17qtO4.js} +2 -2
  54. package/public/assets/{messages-DopU1L1X.js → messages-Bm_1AqSA.js} +2 -2
  55. package/public/assets/{orchestrators-Cq7ckLQT.js → orchestrators-Dg-vfP09.js} +2 -2
  56. package/public/assets/{overview-C1DCTzzV.js → overview-DcYCrvlr.js} +2 -2
  57. package/public/assets/{pairs-DE_m6rrE.js → pairs-8o9nuG3V.js} +2 -2
  58. package/public/assets/{profile-icon-B3rfh77F.js → profile-icon-BsRyBMea.js} +2 -2
  59. package/public/assets/{project-profile-instructions-DQWZE0kA.js → project-profile-instructions-DETKFn_E.js} +2 -2
  60. package/public/assets/{projects-Br2Bd2h1.js → projects-M_m6AHws.js} +2 -2
  61. package/public/assets/{prompt-settings-BKvFsvGD.js → prompt-settings-C_mNCgeL.js} +2 -2
  62. package/public/assets/provider-display-BEeLXC_D.js +2 -0
  63. package/public/assets/{registry-Cw38_6gW.js → registry-DDHHHE5N.js} +2 -2
  64. package/public/assets/run-card-Dt4I4jaP.js +2 -0
  65. package/public/assets/{secrets-DxI-vzSq.js → secrets-BkVwxI5O.js} +2 -2
  66. package/public/assets/{service-access-settings-D9s_VJbd.js → service-access-settings-Crq-6a-B.js} +2 -2
  67. package/public/assets/{settings-CKZTVGIx.js → settings-CYcavMFu.js} +2 -2
  68. package/public/assets/shipping-H6gzEeZB.js +2 -0
  69. package/public/assets/{stats-DyUBKyWI.js → stats-BJVeWkpV.js} +2 -2
  70. package/public/assets/{status-dot-DYqlEUhJ.js → status-dot-BcHyw1Vw.js} +2 -2
  71. package/public/assets/store-DKPDIZBe.js +9 -0
  72. package/public/assets/{tasks-Bh7Chr4-.js → tasks-qJjlQPpx.js} +2 -2
  73. package/public/assets/{teams-bowI7qVY.js → teams-Cd5Sk1uX.js} +2 -2
  74. package/public/assets/{terminal-viewer-BgVLHdsU.js → terminal-viewer-CpY5_m7W.js} +3 -3
  75. package/public/assets/{terminal-viewer-impl-Dz22UPy6.js → terminal-viewer-impl-DI_2llFR.js} +2 -2
  76. package/public/assets/{use-agent-terminal-DSQQ-iY7.js → use-agent-terminal-0yJA_buM.js} +2 -2
  77. package/public/assets/{use-decisions-samMQhQf.js → use-decisions-uJXHf34W.js} +2 -2
  78. package/public/assets/{use-project-list-59LheVP7.js → use-project-list-CpWl6eHQ.js} +2 -2
  79. package/public/assets/{use-selectors-BZa25xEB.js → use-selectors-BdxBW8mL.js} +2 -2
  80. package/public/assets/{user-avatar-DHxlvUvV.js → user-avatar-3IndfpOc.js} +2 -2
  81. package/public/assets/{versioned-prompt-editor-BmED5DnJ.js → versioned-prompt-editor-CIVg7XB1.js} +2 -2
  82. package/public/assets/{work-queue-CSvpuNLz.js → work-queue-B9rnLwHZ.js} +2 -2
  83. package/public/assets/{workflow-marker-DAZcj5qt.js → workflow-marker-X8wxyhzC.js} +2 -2
  84. package/public/assets/{workflows-DdmxRSyg.js → workflows-o5YyMFW7.js} +2 -2
  85. package/public/assets/{workspaces-BxeKfVuF.js → workspaces-CzEGoAng.js} +2 -2
  86. package/public/cosmos.html +4 -4
  87. package/public/index.html +28 -28
  88. package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
  89. package/runner/src/adapters/claude-headless.ts +1 -1
  90. package/runner/src/adapters/claude-launch-exit.ts +26 -0
  91. package/runner/src/adapters/claude-session-probe.ts +1 -1
  92. package/runner/src/adapters/claude-tmux.ts +38 -10
  93. package/runner/src/adapters/claude.ts +28 -75
  94. package/runner/src/adapters/provider-quota-harvest.ts +20 -71
  95. package/runner/src/agent-runner/lifecycle-milestones.ts +2 -2
  96. package/runner/src/agent-runner/liveness-exchange.ts +104 -0
  97. package/runner/src/claude-system-prompt.ts +49 -0
  98. package/runner/src/launch-assembly.ts +14 -10
  99. package/runner/src/profile-home.ts +1 -1
  100. package/runner/src/project-instructions.ts +2 -2
  101. package/runner/src/provider-command.ts +18 -0
  102. package/runner/src/provider-setup.ts +2 -1
  103. package/runner/src/runner-core.ts +14 -15
  104. package/runner/src/runner-helpers.ts +0 -8
  105. package/runner/src/session-scratch.ts +6 -2
  106. package/runner/test-support/provisioning-context.ts +4 -2
  107. package/runner/test-support/runner-harness.ts +2 -1
  108. package/scripts/steward-policy-cleanup.ts +2 -2
  109. package/src/agent-authz.ts +2 -2
  110. package/src/agent-drive-arbiter.ts +3 -8
  111. package/src/agent-exit-cleanup-async.ts +2 -2
  112. package/src/agent-exit-cleanup.ts +23 -19
  113. package/src/agent-lifecycle-events.ts +112 -85
  114. package/src/agent-ref.ts +3 -2
  115. package/src/agent-status-events.ts +43 -14
  116. package/src/auth/password.ts +4 -3
  117. package/src/auth/session-refresh.ts +1 -1
  118. package/src/auth/session.test-fixture.ts +2 -2
  119. package/src/auth/session.ts +7 -7
  120. package/src/automations/crud.ts +8 -81
  121. package/src/automations/dispatch.ts +33 -58
  122. package/src/automations/index.ts +1 -1
  123. package/src/automations/persistence.ts +65 -0
  124. package/src/automations/precheck.ts +18 -16
  125. package/src/automations/read-async.ts +11 -0
  126. package/src/automations/reconcile.ts +30 -39
  127. package/src/automations/storage.ts +33 -10
  128. package/src/automations/write-async.ts +33 -0
  129. package/src/branch-land-notice.ts +3 -3
  130. package/src/branch-landed.ts +25 -23
  131. package/src/bus.ts +21 -19
  132. package/src/cd-deploy-notify.ts +2 -2
  133. package/src/ci/notifications.ts +4 -4
  134. package/src/ci/root-missing.ts +3 -3
  135. package/src/ci/transition-notify.ts +5 -5
  136. package/src/claude-app/oauth-http.ts +3 -3
  137. package/src/cli/workflow.ts +12 -3
  138. package/src/commands-db.ts +4 -4
  139. package/src/commands-write.ts +8 -0
  140. package/src/compaction-watch.ts +10 -8
  141. package/src/config-store-write.ts +2 -2
  142. package/src/config.ts +4 -11
  143. package/src/connectors.ts +10 -8
  144. package/src/context-advisory.ts +22 -21
  145. package/src/db/agent-action-write.ts +36 -0
  146. package/src/db/agent-control-async.ts +9 -0
  147. package/src/db/agent-control-write.ts +49 -0
  148. package/src/db/agent-effort-observe.ts +22 -0
  149. package/src/db/agent-meta.ts +14 -3
  150. package/src/db/agents-async.ts +8 -5
  151. package/src/db/agents.ts +15 -12
  152. package/src/db/auth-identities.ts +2 -2
  153. package/src/db/automation-read-ops.ts +11 -0
  154. package/src/db/automation-write-ops.ts +46 -0
  155. package/src/db/blackboard.ts +2 -2
  156. package/src/db/browser-session-write.ts +32 -0
  157. package/src/db/bus-outbox-write-ops.ts +3 -1
  158. package/src/db/checkout-refresh-schema.ts +47 -0
  159. package/src/db/checkout-refresh.ts +5 -5
  160. package/src/db/command-agent-profile-backfill.ts +39 -0
  161. package/src/db/command-agent-profiles.ts +5 -1
  162. package/src/db/command-retention.ts +126 -0
  163. package/src/db/commands-planner-stats.test-fixture.ts +8 -0
  164. package/src/db/commands-read-ops.ts +16 -0
  165. package/src/db/connection.ts +1 -182
  166. package/src/db/context-carry-write.ts +74 -0
  167. package/src/db/continuations.ts +4 -4
  168. package/src/db/db-error-registry.ts +12 -0
  169. package/src/db/gateway.ts +26 -133
  170. package/src/db/history-retention-ops.ts +13 -0
  171. package/src/db/inbox-async.ts +2 -2
  172. package/src/db/inbox-read-ops.ts +1 -1
  173. package/src/db/inbox.ts +9 -3
  174. package/src/db/issue-associations.ts +2 -2
  175. package/src/db/issue-refs-async.ts +4 -1
  176. package/src/db/issue-refs-read-ops.ts +6 -0
  177. package/src/db/issue-refs.ts +8 -8
  178. package/src/db/kernel-event-log-schema.ts +2 -0
  179. package/src/db/land-boundaries.ts +51 -5
  180. package/src/db/land-gate-attestations.ts +2 -2
  181. package/src/db/landing-receipts.ts +2 -2
  182. package/src/db/lifecycle-context-write.ts +5 -0
  183. package/src/db/lifecycle-tail-async.ts +76 -0
  184. package/src/db/lifecycle-tail-write-ops.ts +62 -0
  185. package/src/db/lifecycle-write-window.ts +2 -1
  186. package/src/db/lineage-pair-dedupe-sql.ts +3 -3
  187. package/src/db/main-connection-mode.ts +11 -0
  188. package/src/db/main-connection-writes.ts +20 -2
  189. package/src/db/maintenance-job-runs-async.ts +2 -2
  190. package/src/db/maintenance-job-write-ops.ts +1 -1
  191. package/src/db/maintenance-pauses.ts +2 -2
  192. package/src/db/message-send.ts +4 -0
  193. package/src/db/messages.ts +31 -25
  194. package/src/db/migrations.ts +18 -1
  195. package/src/db/notification-write-ops.ts +19 -0
  196. package/src/db/operator-answer-write.ts +19 -0
  197. package/src/db/orchestrators.ts +10 -4
  198. package/src/db/pairs-async.ts +22 -1
  199. package/src/db/pairs-write-ops.ts +8 -3
  200. package/src/db/pairs.ts +41 -48
  201. package/src/db/plan-dispatch-schema.ts +5 -1
  202. package/src/db/plan-ready-notices.ts +43 -0
  203. package/src/db/plan-tools-include-migration.ts +36 -0
  204. package/src/db/plans-write-ops.ts +2 -0
  205. package/src/db/presence-buffer.ts +5 -0
  206. package/src/db/presence-loop.ts +18 -23
  207. package/src/db/presence-write.ts +0 -6
  208. package/src/db/project-entries-async.ts +14 -0
  209. package/src/db/project-entries-read-ops.ts +5 -1
  210. package/src/db/project-entries-write-ops.ts +8 -0
  211. package/src/db/project-entries.ts +15 -12
  212. package/src/db/project-journal.ts +2 -2
  213. package/src/db/project-trust-approvals.ts +2 -2
  214. package/src/db/prompt-templates.ts +4 -4
  215. package/src/db/read-op-marshaling-fixtures.ts +18 -0
  216. package/src/db/read-ops.ts +4 -0
  217. package/src/db/retention.ts +13 -2
  218. package/src/db/review-publish-write.ts +8 -0
  219. package/src/db/runtime-admin-async.ts +19 -0
  220. package/src/db/runtime-admin-write-ops.ts +36 -0
  221. package/src/db/runtime-tail-async.ts +288 -0
  222. package/src/db/runtime-tail-write-ops.ts +97 -0
  223. package/src/db/schema.ts +4 -1
  224. package/src/db/spawn-budget.ts +5 -0
  225. package/src/db/spawn-delegation.ts +1 -11
  226. package/src/db/sql-audit-indexes.ts +3 -0
  227. package/src/db/stats-async.ts +5 -3
  228. package/src/db/task-entity.ts +5 -4
  229. package/src/db/team-claim-policy.ts +60 -0
  230. package/src/db/teams-async.ts +4 -0
  231. package/src/db/teams-write-ops.ts +4 -0
  232. package/src/db/terminal-events.ts +15 -0
  233. package/src/db/timer-cutover-bodies.ts +292 -0
  234. package/src/db/timer-cutover-core.ts +37 -278
  235. package/src/db/timer-cutover-state.ts +40 -0
  236. package/src/db/timer-cutover-write-ops.ts +1 -40
  237. package/src/db/token-db-write-ops.ts +2 -0
  238. package/src/db/token-standing-async.ts +12 -0
  239. package/src/db/token-standing.ts +6 -9
  240. package/src/db/token-usage-retention.ts +33 -0
  241. package/src/db/token-usage-write-ops.ts +1 -1
  242. package/src/db/token-usage.ts +4 -1
  243. package/src/db/user-invites-async.ts +13 -0
  244. package/src/db/user-invites.ts +3 -3
  245. package/src/db/users.ts +14 -6
  246. package/src/db/workspaces.ts +8 -5
  247. package/src/db/write-ops.ts +31 -12
  248. package/src/db/writer-fault-seam.ts +2 -9
  249. package/src/db/writer-fault-test-ops.ts +18 -0
  250. package/src/db/writer-gateway.ts +42 -46
  251. package/src/dev.ts +8 -3
  252. package/src/event-loop-lag.ts +4 -2
  253. package/src/event-loop-yield.ts +2 -2
  254. package/src/events.ts +10 -8
  255. package/src/host-provider-store.ts +5 -4
  256. package/src/hub-metrics-report.ts +5 -1
  257. package/src/hub-metrics.ts +38 -18
  258. package/src/injection-sweep-pacing.ts +6 -8
  259. package/src/land-gate-notifications.ts +11 -10
  260. package/src/land-gate-queue-progress.ts +3 -3
  261. package/src/land-settle-dispatch.ts +52 -92
  262. package/src/lifecycle-context-pressure.ts +11 -10
  263. package/src/lifecycle-manager.ts +104 -98
  264. package/src/maintenance/breaker.ts +18 -16
  265. package/src/maintenance/checkout-refresh.ts +18 -1
  266. package/src/maintenance/critical-job-watchdog.ts +3 -3
  267. package/src/maintenance/events.ts +3 -3
  268. package/src/maintenance/history-retention-job.ts +30 -0
  269. package/src/maintenance/jobs.ts +29 -67
  270. package/src/maintenance/long-running-work.ts +3 -1
  271. package/src/maintenance/offline-agent-prune-job.ts +28 -0
  272. package/src/maintenance/orphaned-sessions.ts +5 -4
  273. package/src/maintenance/pauses.ts +4 -10
  274. package/src/maintenance/plan-ready-notice-job.ts +71 -0
  275. package/src/maintenance/scheduler.ts +18 -13
  276. package/src/maintenance/stalled-delivery-pager.ts +4 -4
  277. package/src/maintenance/teams.ts +19 -30
  278. package/src/maintenance/workspaces.ts +17 -27
  279. package/src/managed-policy-escalation.ts +7 -7
  280. package/src/managed-policy.ts +3 -3
  281. package/src/managed-provider-gate.ts +5 -4
  282. package/src/managed-spawn-reservation.ts +5 -4
  283. package/src/mcp/index.ts +8 -8
  284. package/src/mcp/output-descriptions.ts +1 -1
  285. package/src/mcp/presentation.ts +2 -1
  286. package/src/mcp/runtime-output.ts +6 -1
  287. package/src/mcp/self-care-visibility.ts +2 -2
  288. package/src/mcp/spawn-targets-matrix.ts +10 -1
  289. package/src/mcp/tool-groups.ts +3 -2
  290. package/src/mcp/tool-roles.ts +81 -0
  291. package/src/mcp/tools-workspace.ts +1 -1
  292. package/src/mcp-blackboard-tools.ts +6 -5
  293. package/src/mcp-decision-tools.ts +7 -7
  294. package/src/mcp-egress-tools.ts +10 -9
  295. package/src/mcp-issue-activity-tools.ts +2 -2
  296. package/src/mcp-issue-association-tools.ts +4 -4
  297. package/src/mcp-issue-ref-tools.ts +3 -3
  298. package/src/mcp-merge-tools.ts +5 -5
  299. package/src/mcp-notification-subscription-tools.ts +14 -15
  300. package/src/mcp-output-levels.test-fixture.ts +1 -1
  301. package/src/mcp-profile-trust-tools.ts +1 -1
  302. package/src/mcp-project-journal-tools.ts +4 -12
  303. package/src/mcp-project-tools.ts +17 -18
  304. package/src/mcp-routing-policy-tools.ts +3 -2
  305. package/src/mcp-team-tools.ts +6 -6
  306. package/src/mcp-workflow-tools.ts +5 -3
  307. package/src/memory-area-injection.ts +13 -12
  308. package/src/memory-boundary-capture.ts +6 -6
  309. package/src/memory-injection.ts +45 -43
  310. package/src/merge-pause-maintenance.ts +5 -4
  311. package/src/notification-router.ts +44 -17
  312. package/src/notify.ts +5 -5
  313. package/src/observed-reset-refresh.ts +4 -4
  314. package/src/operator-alarm.ts +2 -5
  315. package/src/project-ingest.ts +6 -6
  316. package/src/project-instructions.ts +8 -1
  317. package/src/project-trust.ts +12 -11
  318. package/src/prompt-resolver.ts +3 -3
  319. package/src/provider-quota-async.ts +5 -7
  320. package/src/provider-timeline-event.ts +4 -7
  321. package/src/quota-band-delivery.ts +2 -2
  322. package/src/recipe-runner.ts +4 -3
  323. package/src/retention-config-store.ts +4 -3
  324. package/src/reviewer-pipeline.ts +11 -10
  325. package/src/routes/_route.ts +4 -4
  326. package/src/routes/_shared.ts +13 -12
  327. package/src/routes/agent-effort.ts +5 -5
  328. package/src/routes/agent-heartbeat-quota.ts +23 -0
  329. package/src/routes/agent-keep.ts +1 -1
  330. package/src/routes/agent-reporting.ts +1 -1
  331. package/src/routes/agent-self-effort.ts +5 -5
  332. package/src/routes/agent-sessions.ts +24 -24
  333. package/src/routes/agents-spawn.ts +1 -1
  334. package/src/routes/agents.ts +17 -119
  335. package/src/routes/auth.ts +14 -15
  336. package/src/routes/authority-audit.ts +2 -2
  337. package/src/routes/automations.ts +6 -5
  338. package/src/routes/channel-binding-delete.ts +1 -1
  339. package/src/routes/channel-output.ts +3 -3
  340. package/src/routes/claude-api-budget.ts +5 -5
  341. package/src/routes/commands-listing.ts +1 -1
  342. package/src/routes/commands.ts +29 -27
  343. package/src/routes/context-resets.ts +2 -2
  344. package/src/routes/coordinator-teams.ts +1 -1
  345. package/src/routes/decisions.ts +2 -2
  346. package/src/routes/host-secret-files.ts +1 -1
  347. package/src/routes/hosts.ts +11 -11
  348. package/src/routes/inbox.ts +3 -2
  349. package/src/routes/index.ts +2 -1
  350. package/src/routes/integrations.ts +9 -7
  351. package/src/routes/issue-activity.ts +2 -2
  352. package/src/routes/issue-associations.ts +4 -4
  353. package/src/routes/issue-refs.ts +3 -3
  354. package/src/routes/kernel-timers-operator.ts +1 -1
  355. package/src/routes/memory.ts +1 -1
  356. package/src/routes/merges.ts +11 -11
  357. package/src/routes/messages.ts +23 -17
  358. package/src/routes/orchestrator-bootstrap.ts +1 -1
  359. package/src/routes/orchestrator-host-registration.ts +2 -0
  360. package/src/routes/orchestrator-host-utilization.ts +2 -2
  361. package/src/routes/orchestrator-proxy.ts +2 -2
  362. package/src/routes/orchestrator.ts +27 -18
  363. package/src/routes/pairs.ts +8 -8
  364. package/src/routes/project-profile-instructions.ts +1 -1
  365. package/src/routes/project-trust.ts +1 -1
  366. package/src/routes/projects.ts +16 -16
  367. package/src/routes/prompt-templates.ts +12 -12
  368. package/src/routes/provider-quotas.ts +10 -10
  369. package/src/routes/run-command.ts +1 -1
  370. package/src/routes/secrets-backup.ts +2 -2
  371. package/src/routes/secrets-import.ts +1 -1
  372. package/src/routes/secrets-vault.ts +7 -7
  373. package/src/routes/settings.ts +1 -1
  374. package/src/routes/shipping.ts +9 -1
  375. package/src/routes/spawn-policy.ts +8 -7
  376. package/src/routes/sse.ts +2 -2
  377. package/src/routes/team-templates.ts +7 -7
  378. package/src/routes/teams.ts +10 -10
  379. package/src/routes/tokens.ts +18 -17
  380. package/src/routes/users.ts +24 -24
  381. package/src/routes/viewer-read.ts +3 -3
  382. package/src/routes/web-tool-calls.ts +4 -4
  383. package/src/routes/workflows.ts +2 -2
  384. package/src/routes/workspaces.ts +17 -16
  385. package/src/routing-policy-push.ts +6 -6
  386. package/src/runtime-grant.ts +17 -11
  387. package/src/runtime-tokens.ts +20 -28
  388. package/src/secrets-broker/config.ts +1 -1
  389. package/src/secrets-broker/service.ts +2 -2
  390. package/src/security.ts +3 -1
  391. package/src/self-resume-carry.ts +21 -110
  392. package/src/self-resume-supersede.ts +4 -3
  393. package/src/self-resume.ts +54 -66
  394. package/src/server-background.ts +1 -1
  395. package/src/server.ts +21 -22
  396. package/src/services/agent-action.ts +12 -31
  397. package/src/services/agent-effort.ts +7 -32
  398. package/src/services/agent-hang-watchdog-job.ts +2 -2
  399. package/src/services/agent-heartbeat.ts +166 -0
  400. package/src/services/agent-reporting.ts +1 -1
  401. package/src/services/browser-inventory.ts +3 -3
  402. package/src/services/browser-session-state.ts +3 -2
  403. package/src/services/browser-session.ts +21 -27
  404. package/src/services/bus-command-update.ts +9 -9
  405. package/src/services/checkout-refresh-state.ts +1 -0
  406. package/src/services/checkout-refresh.test-fixture.ts +3 -2
  407. package/src/services/command-host.ts +7 -2
  408. package/src/services/coordinator-digest.ts +3 -2
  409. package/src/services/dispatch-command.ts +12 -13
  410. package/src/services/effective-launch-driver.ts +14 -9
  411. package/src/services/host-changed-paths.test-fixture.ts +5 -6
  412. package/src/services/host-project-readiness.ts +2 -2
  413. package/src/services/host-providers.ts +1 -1
  414. package/src/services/host-utilization.ts +9 -9
  415. package/src/services/idle-agent-digest.ts +17 -12
  416. package/src/services/idle-epics.ts +4 -4
  417. package/src/services/interrupt-agent.ts +12 -9
  418. package/src/services/issue-activity.ts +3 -3
  419. package/src/services/issue-associations.ts +15 -18
  420. package/src/services/issue-lifecycle-comments.ts +3 -2
  421. package/src/services/issue-lifecycle.ts +14 -13
  422. package/src/services/issue-refs.ts +4 -5
  423. package/src/services/kernel-timers-cutover-chaos-worker.ts +1 -1
  424. package/src/services/kernel-timers-ingress-chaos-worker.ts +6 -1
  425. package/src/services/kernel-timers-ingress.ts +3 -3
  426. package/src/services/kernel-timers-message-authority-chaos-worker.ts +3 -10
  427. package/src/services/kernel-timers-operator-chaos-worker.ts +3 -2
  428. package/src/services/kernel-timers-outbox.ts +1 -1
  429. package/src/services/kernel-timers-stage10-operator.ts +1 -1
  430. package/src/services/kernel-timers.ts +4 -3
  431. package/src/services/land-gate-placement.ts +11 -2
  432. package/src/services/land-issue-relations.ts +5 -4
  433. package/src/services/land-restart-retry.ts +7 -6
  434. package/src/services/landed-ancestry.ts +6 -5
  435. package/src/services/legacy-landing-host.ts +4 -1
  436. package/src/services/legacy-landing-recovery.ts +8 -6
  437. package/src/services/managed-running.ts +17 -17
  438. package/src/services/memory-areas.ts +3 -3
  439. package/src/services/merge-pause.ts +9 -15
  440. package/src/services/operator-decisions.ts +37 -41
  441. package/src/services/orchestrator-registration-recovery.ts +6 -2
  442. package/src/services/orchestrator-upgrade.ts +14 -12
  443. package/src/services/permission-decision.ts +4 -3
  444. package/src/services/plan-ci-notice.ts +1 -1
  445. package/src/services/plan-conformance.ts +4 -4
  446. package/src/services/plan-dispatch-policy.ts +10 -3
  447. package/src/services/plan-dispatch.ts +35 -14
  448. package/src/services/plan-graph.ts +39 -261
  449. package/src/services/plan-import.ts +1 -1
  450. package/src/services/plan-live-bindings.ts +8 -37
  451. package/src/services/plan-task-create.ts +1 -1
  452. package/src/services/plan-terminal-refs.ts +2 -12
  453. package/src/services/plan-wake-digest.ts +8 -3
  454. package/src/services/profile-trust.ts +2 -2
  455. package/src/services/project.ts +11 -10
  456. package/src/services/prompt-templates.ts +6 -5
  457. package/src/services/provider-hold-nudge.ts +9 -9
  458. package/src/services/provider-hold-record.ts +13 -12
  459. package/src/services/provider-state-audit.ts +19 -18
  460. package/src/services/provisioning-harness/driver.ts +1 -1
  461. package/src/services/provisioning-harness/fixture-matrix.ts +3 -3
  462. package/src/services/provisioning-harness/lifecycle.ts +24 -22
  463. package/src/services/provisioning-harness/prepare.ts +16 -17
  464. package/src/services/rate-limit-resume.ts +10 -9
  465. package/src/services/red-main-auto-revert.ts +7 -5
  466. package/src/services/red-main-controller-deps.ts +20 -3
  467. package/src/services/red-main-incident.ts +3 -1
  468. package/src/services/red-main-quarantine.ts +2 -3
  469. package/src/services/register-agent.ts +22 -22
  470. package/src/services/restart-project-role.ts +1 -1
  471. package/src/services/restart-spawn.ts +17 -16
  472. package/src/services/review-publish.ts +7 -24
  473. package/src/services/review-ref-reconcile.ts +29 -38
  474. package/src/services/runtime-dependency-alert.ts +27 -0
  475. package/src/services/scheduler-command.ts +11 -9
  476. package/src/services/scheduler.ts +5 -5
  477. package/src/services/self-effort-grant.ts +5 -25
  478. package/src/services/send-message.ts +16 -33
  479. package/src/services/shutdown-agent.ts +17 -14
  480. package/src/services/spawn-agent.ts +12 -41
  481. package/src/services/spawn-chain-inspector.ts +1 -1
  482. package/src/services/spawn-cwd-placement.ts +21 -5
  483. package/src/services/spawn-issue-activity.ts +8 -6
  484. package/src/services/spawn-launch.ts +17 -1
  485. package/src/services/spawn-loss-escalation.ts +1 -1
  486. package/src/services/spawn-registration-watchdog.ts +2 -2
  487. package/src/services/spawn-repo-probe.ts +7 -5
  488. package/src/services/spawn-tree-cleanup.ts +7 -8
  489. package/src/services/steward-reaper.ts +4 -4
  490. package/src/services/task-context-hydration.ts +25 -1
  491. package/src/services/task-delivery.ts +20 -34
  492. package/src/services/task-entity.ts +40 -203
  493. package/src/services/task-issue-link.ts +13 -20
  494. package/src/services/task-issue-weave.ts +12 -11
  495. package/src/services/task-lifecycle.ts +27 -31
  496. package/src/services/task-repo-cwd.ts +37 -0
  497. package/src/services/task-review-hold.ts +4 -17
  498. package/src/services/task-semantic-events.ts +13 -11
  499. package/src/services/task-state-reconcile.ts +3 -4
  500. package/src/services/task-validation.ts +2 -2
  501. package/src/services/team-templates.ts +5 -5
  502. package/src/services/team.ts +31 -98
  503. package/src/services/terminal-provider-exit.ts +6 -5
  504. package/src/services/timer-message-fire-chaos-worker.ts +7 -3
  505. package/src/services/timer-message-fire-outbox.ts +1 -1
  506. package/src/services/transient-agent-reaper.ts +22 -19
  507. package/src/services/turn-reconcile-audit.ts +9 -9
  508. package/src/services/user-onboarding.ts +8 -6
  509. package/src/services/user-profile.ts +6 -9
  510. package/src/services/work-finality.ts +16 -4
  511. package/src/services/workflow-auto-start.ts +2 -1
  512. package/src/services/workflow-caller.ts +61 -4
  513. package/src/services/workflow-child-proof-worker.ts +1 -1
  514. package/src/services/workflow-control-proof-worker.ts +1 -1
  515. package/src/services/workflow-coordinator.ts +8 -2
  516. package/src/services/workflow-decisions.ts +5 -5
  517. package/src/services/workflow-deferred-cleanup.ts +1 -1
  518. package/src/services/workflow-effect-driver.ts +42 -19
  519. package/src/services/workflow-effects.ts +41 -27
  520. package/src/services/workflow-pins.ts +7 -4
  521. package/src/services/workflow-reconcile.ts +1 -0
  522. package/src/services/workflow-resume-pins.ts +3 -3
  523. package/src/services/workflow-routing-defaults.ts +18 -0
  524. package/src/services/workflow-run-view.ts +4 -3
  525. package/src/services/workflow-run.test-fixture.ts +1 -1
  526. package/src/services/workflow-runs.ts +34 -22
  527. package/src/services/workflow-supervisor-state.ts +21 -1
  528. package/src/services/workflow-supervisor.ts +4 -3
  529. package/src/services/workspace-recovery.ts +4 -3
  530. package/src/spawn-admission.ts +10 -2
  531. package/src/spawn-placement.ts +27 -9
  532. package/src/spawn-targets.ts +8 -8
  533. package/src/sse-agent-status.ts +15 -6
  534. package/src/sse.ts +49 -24
  535. package/src/startup-context-injection.ts +61 -57
  536. package/src/steward-handoff.ts +4 -3
  537. package/src/steward-policy-cleanup.ts +9 -8
  538. package/src/steward.ts +2 -2
  539. package/src/task-dispatch-live.ts +5 -2
  540. package/src/task-dispatcher.ts +2 -2
  541. package/src/token-db.ts +2 -2
  542. package/src/token-usage-async.ts +2 -4
  543. package/src/user-awaiting-reply.ts +5 -5
  544. package/src/workspace-actions.ts +24 -29
  545. package/src/workspace-auto-merge.ts +14 -12
  546. package/src/workspace-changed-paths-client.ts +16 -5
  547. package/src/workspace-cleanup-stale.ts +30 -7
  548. package/src/workspace-command-settle.ts +24 -16
  549. package/src/workspace-config.ts +1 -1
  550. package/src/workspace-conflict-resolver.ts +9 -7
  551. package/src/workspace-dead-owner-recovery.ts +5 -4
  552. package/src/workspace-escalation.ts +12 -11
  553. package/src/workspace-human-escalation.ts +3 -3
  554. package/src/workspace-land-gate-watchdog.ts +3 -3
  555. package/src/workspace-land-refusal.ts +20 -0
  556. package/src/workspace-land-stopped.ts +1 -0
  557. package/src/workspace-merge.ts +10 -26
  558. package/src/workspace-nothing-to-land-notice.ts +2 -2
  559. package/src/workspace-orphans.ts +18 -37
  560. package/src/workspace-pr-completion.ts +10 -8
  561. package/src/workspace-rekey.ts +3 -3
  562. package/src/workspace-steward-failure.ts +2 -2
  563. package/src/workspace-steward-wake.ts +2 -2
  564. package/public/assets/agent-liveness-CaNwK0Zf.js +0 -2
  565. package/public/assets/provider-display-DsuWMvVL.js +0 -2
  566. package/public/assets/run-card-CpKqRbhg.js +0 -2
  567. package/public/assets/shipping-B9YtnwtG.js +0 -2
  568. package/public/assets/store-DcClXLH0.js +0 -9
  569. package/runner/src/agent-runner/http-liveness.ts +0 -85
  570. package/src/db/on-loop-write-transaction.ts +0 -34
@@ -1,3 +1,4 @@
1
+ import { insertAutomationAsync, updateAutomationNormalizedAsync } from "./write-async";
1
2
  import { randomUUID } from "node:crypto";
2
3
  import { getOrchestrator, ValidationError } from "../db";
3
4
  import { AUTOMATION_KIND } from "./constants";
@@ -6,63 +7,18 @@ import { db, ensureAutomationTables, getAutomation } from "./storage";
6
7
  import { normalizeCreateInput, normalizeCreateInputAsync } from "./validation";
7
8
  import type { Automation, CreateAutomationInput, UpdateAutomationInput } from "../types";
8
9
 
9
- export function createAutomation(input: CreateAutomationInput, now = Date.now()): Automation {
10
- ensureAutomationTables();
11
- const normalized = normalizeCreateInput(input);
12
- return insertAutomation(normalized, now);
10
+ export function createAutomation(input: CreateAutomationInput, now = Date.now()): Promise<Automation> {
11
+ return createAutomationAsync(input, now);
13
12
  }
14
13
 
15
14
  /** HTTP request path: catalog validation happens through the reader pool before this write. */
16
15
  export async function createAutomationAsync(input: CreateAutomationInput, now = Date.now()): Promise<Automation> {
17
16
  ensureAutomationTables();
18
- return insertAutomation(await normalizeCreateInputAsync(input), now);
19
- }
20
-
21
- function insertAutomation(normalized: ReturnType<typeof normalizeCreateInput>, now: number): Automation {
22
- if (!getOrchestrator(normalized.orchestratorId)) throw new ValidationError(`orchestrator ${normalized.orchestratorId} not found`);
23
- const id = randomUUID();
24
- const nextRunAt = normalized.enabled ? nextScheduledAt(normalized.schedule, normalized.timezone, now) : undefined;
25
- db().query(`
26
- INSERT INTO automations (id, kind, name, description, enabled, schedule, timezone, next_run_at, catch_up_policy, concurrency_policy, orchestrator_id, target_policy, task_template, created_at, updated_at)
27
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
28
- `).run(
29
- id,
30
- AUTOMATION_KIND,
31
- normalized.name,
32
- normalized.description ?? null,
33
- normalized.enabled ? 1 : 0,
34
- normalized.schedule,
35
- normalized.timezone,
36
- nextRunAt ?? null,
37
- normalized.catchUpPolicy,
38
- normalized.concurrencyPolicy,
39
- normalized.orchestratorId,
40
- JSON.stringify(normalized.targetPolicy),
41
- JSON.stringify(normalized.taskTemplate),
42
- now,
43
- now,
44
- );
45
- return getAutomation(id)!;
17
+ return insertAutomationAsync(await normalizeCreateInputAsync(input), now);
46
18
  }
47
19
 
48
- export function updateAutomation(id: string, input: UpdateAutomationInput, now = Date.now()): Automation | null {
49
- ensureAutomationTables();
50
- const existing = getAutomation(id);
51
- if (!existing) return null;
52
- const next: CreateAutomationInput = {
53
- kind: AUTOMATION_KIND,
54
- name: input.name ?? existing.name,
55
- description: input.description === null ? undefined : input.description ?? existing.description,
56
- enabled: input.enabled ?? existing.enabled,
57
- schedule: input.schedule ?? existing.schedule,
58
- timezone: input.timezone ?? existing.timezone,
59
- catchUpPolicy: input.catchUpPolicy ?? existing.catchUpPolicy,
60
- concurrencyPolicy: input.concurrencyPolicy ?? existing.concurrencyPolicy,
61
- orchestratorId: input.orchestratorId ?? existing.orchestratorId,
62
- targetPolicy: input.targetPolicy ?? existing.targetPolicy,
63
- taskTemplate: input.taskTemplate ?? existing.taskTemplate,
64
- };
65
- return updateAutomationNormalized(id, normalizeCreateInput(next), now);
20
+ export function updateAutomation(id: string, input: UpdateAutomationInput, now = Date.now()): Promise<Automation | null> {
21
+ return updateAutomationAsync(id, input, now);
66
22
  }
67
23
 
68
24
  /** HTTP request path: catalog validation happens through the reader pool before this write. */
@@ -78,7 +34,7 @@ export async function updateAutomationAsync(id: string, input: UpdateAutomationI
78
34
  if (!current || JSON.stringify(current) !== JSON.stringify(existing)) {
79
35
  throw new ValidationError("automation changed or was deleted during catalog validation");
80
36
  }
81
- return updateAutomationNormalized(id, normalized, now);
37
+ return updateAutomationNormalizedAsync(id, normalized, existing, now);
82
38
  }
83
39
 
84
40
  function automationUpdateInput(existing: Automation, input: UpdateAutomationInput): CreateAutomationInput {
@@ -97,33 +53,4 @@ function automationUpdateInput(existing: Automation, input: UpdateAutomationInpu
97
53
  };
98
54
  }
99
55
 
100
- function updateAutomationNormalized(id: string, normalized: ReturnType<typeof normalizeCreateInput>, now: number): Automation {
101
- if (!getOrchestrator(normalized.orchestratorId)) throw new ValidationError(`orchestrator ${normalized.orchestratorId} not found`);
102
- const nextRunAt = normalized.enabled ? nextScheduledAt(normalized.schedule, normalized.timezone, now) : undefined;
103
- db().query(`
104
- UPDATE automations
105
- SET name = ?, description = ?, enabled = ?, schedule = ?, timezone = ?, next_run_at = ?,
106
- catch_up_policy = ?, concurrency_policy = ?, orchestrator_id = ?, target_policy = ?, task_template = ?, updated_at = ?
107
- WHERE id = ?
108
- `).run(
109
- normalized.name,
110
- normalized.description ?? null,
111
- normalized.enabled ? 1 : 0,
112
- normalized.schedule,
113
- normalized.timezone,
114
- nextRunAt ?? null,
115
- normalized.catchUpPolicy,
116
- normalized.concurrencyPolicy,
117
- normalized.orchestratorId,
118
- JSON.stringify(normalized.targetPolicy),
119
- JSON.stringify(normalized.taskTemplate),
120
- now,
121
- id,
122
- );
123
- return getAutomation(id)!;
124
- }
125
-
126
- export function deleteAutomation(id: string): boolean {
127
- ensureAutomationTables();
128
- return db().query("DELETE FROM automations WHERE id = ?").run(id).changes > 0;
129
- }
56
+ export { deleteAutomationAsync } from "./write-async";
@@ -1,11 +1,13 @@
1
+ import { rescheduleAutomationAsync as persistNextRunAsync, updateRunAsync, insertRunAsync, enqueueAutomationRunAsync, cancelActiveRunsAsync, admitAutomationRunAsync } from "./write-async";
2
+ import { ingestIntegrationEventAsync } from "../db/runtime-tail-async";
3
+ import { runnerRuntimeTokenEnvAsync, SYSTEM_LAUNCH } from "../runtime-tokens";
4
+ import { createCommandAsync, prepareCommandWriteAsync, submitPreparedCommandAsync } from "../commands-write";
1
5
  import { isHumanAgentId, errMessage } from "@humwick/sdk";
2
6
  import { emitAutomationRunCosmosEventAsync } from "../cosmos-events";
3
- import { createCommand } from "../commands-db";
4
- import { prepareCommandWriteAsync } from "../commands-write";
7
+
5
8
  import { getAgentProfile, getSpawnPolicy, resolveAgentProfileKey } from "../config-store";
6
- import { effectiveProviderCatalogListAsync, getOrchestrator, ingestIntegrationEvent, listAgents, ValidationError, withResolvedProvisioningAsync } from "../db";
9
+ import { effectiveProviderCatalogListAsync, getOrchestrator, listAgents, ValidationError, withResolvedProvisioningAsync } from "../db";
7
10
  import { composeProfileSpawnInstructionsAsync } from "../project-instructions";
8
- import { SYSTEM_LAUNCH, runnerRuntimeTokenEnv } from "../runtime-tokens";
9
11
  import { generateSpawnAgentId } from "../services/spawn-identity";
10
12
  import { applyDefaultSharedMcp } from "../shared-mcp";
11
13
  import { resolveHostLaunchMode } from "../launch-mode";
@@ -14,22 +16,8 @@ import { systemTagsForSpawn } from "../agent-system-tags";
14
16
  import { hostProviderRefusal, isProviderDisabledOnHost } from "../host-provider-store";
15
17
  import { nextScheduledAt, formatRunDate } from "./cron";
16
18
  import { alertPrecheckAutomationFailure, precheckTaskSection, startAutomationPrecheck } from "./precheck";
17
- import {
18
- cancelActiveRuns,
19
- db,
20
- enqueueAutomationRun,
21
- ensureAutomationTables,
22
- getAutomation,
23
- getAutomationRun,
24
- hasActiveRun,
25
- insertRun,
26
- listAutomations,
27
- listDispatchableQueuedRuns,
28
- rowToAutomation,
29
- rowToAutomationRun,
30
- updateRun,
31
- rescheduleAutomation as persistNextRun,
32
- } from "./storage";
19
+ import { ensureAutomationTables, getAutomation, getAutomationRun, hasActiveRun, listAutomations } from "./storage";
20
+ import { listDispatchableQueuedRunsAsync, listDueAutomationsAsync } from "./read-async";
33
21
  import type { AutomationDispatchResult } from "./types";
34
22
  import type { AgentCard, Automation, AutomationTargetPolicy, ManagedAgent, Orchestrator } from "../types";
35
23
 
@@ -53,24 +41,13 @@ export { runDueAutomationsAsync as runDueAutomations, runAutomationNowAsync as r
53
41
  export async function runDueAutomationsAsync(now = Date.now()): Promise<AutomationDispatchResult[]> {
54
42
  ensureAutomationTables();
55
43
  const results: AutomationDispatchResult[] = [];
56
- for (const run of listDispatchableQueuedRuns()) {
57
- const automation = getAutomation(run.automationId);
58
- if (!automation || hasActiveRun(automation.id)) continue;
59
- results.push(await dispatchAutomationRunAsync(automation, run, now));
44
+ for (const run of await listDispatchableQueuedRunsAsync()) {
45
+ const admitted = await admitAutomationRunAsync({ automationId: run.automationId, queuedRunId: run.id, now });
46
+ if (admitted) results.push(await dispatchAutomationRunAsync(admitted.automation, admitted.run, now));
60
47
  }
61
- const due = (db().query("SELECT * FROM automations WHERE enabled = 1 AND next_run_at IS NOT NULL AND next_run_at <= ? ORDER BY next_run_at ASC LIMIT 25").all(now) as any[]).map(rowToAutomation);
62
- for (const automation of due) {
63
- if (hasActiveRun(automation.id)) {
64
- if (automation.concurrencyPolicy === "replace") cancelActiveRuns(automation.id, now, "Replaced by newer scheduled run");
65
- else {
66
- if (automation.concurrencyPolicy === "queue") enqueueAutomationRun(automation, automation.nextRunAt ?? now, now);
67
- rescheduleAutomation(automation, now);
68
- continue;
69
- }
70
- }
71
- const run = insertRun(automation, automation.nextRunAt ?? now, now);
72
- results.push(await dispatchAutomationRunAsync(automation, run, now));
73
- rescheduleAutomation(automation, now);
48
+ for (const automation of await listDueAutomationsAsync(now)) {
49
+ const admitted = await admitAutomationRunAsync({ automationId: automation.id, now });
50
+ if (admitted) results.push(await dispatchAutomationRunAsync(admitted.automation, admitted.run, now));
74
51
  }
75
52
  return results;
76
53
  }
@@ -78,10 +55,8 @@ export async function runDueAutomationsAsync(now = Date.now()): Promise<Automati
78
55
  /** HTTP-triggered twin: on-demand spawn composition may canonicalize a caller cwd. */
79
56
  export async function runAutomationNowAsync(id: string, now = Date.now()): Promise<AutomationDispatchResult | null> {
80
57
  ensureAutomationTables();
81
- const automation = getAutomation(id);
82
- if (!automation) return null;
83
- if (hasActiveRun(automation.id)) throw new ValidationError("automation already has an active run");
84
- return dispatchAutomationRunAsync(automation, insertRun(automation, now, now), now);
58
+ const admitted = await admitAutomationRunAsync({ automationId: id, manual: true, now });
59
+ return admitted ? dispatchAutomationRunAsync(admitted.automation, admitted.run, now) : null;
85
60
  }
86
61
 
87
62
  async function dispatchAutomationRunAsync(
@@ -89,24 +64,24 @@ async function dispatchAutomationRunAsync(
89
64
  run: ReturnType<typeof getAutomationRun> & NonNullable<unknown>,
90
65
  now: number,
91
66
  ): Promise<AutomationDispatchResult> {
92
- updateRun(run.id, { status: "dispatching" }, now);
67
+ (await updateRunAsync(run.id, { status: "dispatching" }, now));
93
68
  try {
94
69
  await emitAutomationDispatchCosmosEventAsync(automation, run.id);
95
70
  await afterAsyncAutomationCosmosForTests?.();
96
71
  assertAutomationUnchangedBeforeAsyncSpawn(automation);
97
72
  const orchestrator = requireOnlineOrchestrator(automation.orchestratorId);
98
- const prechecking = startAutomationPrecheck(automation, run, orchestrator, now);
73
+ const prechecking = (await startAutomationPrecheck(automation, run, orchestrator, now));
99
74
  if (prechecking) return prechecking;
100
75
  if (automation.targetPolicy.mode === "existing_agent") {
101
76
  const agent = resolveExistingAgent(automation.targetPolicy, orchestrator);
102
77
  if (!agent && automation.targetPolicy.ifNoMatch !== "spawn") throw new ValidationError("no matching managed agent for automation");
103
- if (agent) return createRunTask(automation, run, durableExistingAgentTarget(automation.targetPolicy), now, { targetMode: "existing_agent", resolvedAgentId: agent.id });
78
+ if (agent) return (await createRunTask(automation, run, durableExistingAgentTarget(automation.targetPolicy), now, { targetMode: "existing_agent", resolvedAgentId: agent.id }));
104
79
  return await dispatchOnDemandAutomationAsync(automation, run, orchestrator, { mode: "on_demand_agent", provider: orchestrator.providers[0] ?? "codex", keepAlive: false }, now);
105
80
  }
106
81
  return await dispatchOnDemandAutomationAsync(automation, run, orchestrator, automation.targetPolicy, now);
107
82
  } catch (e) {
108
- updateRun(run.id, { status: "failed", finishedAt: now, error: errMessage(e) }, now);
109
- alertPrecheckAutomationFailure(automation, run.id, errMessage(e));
83
+ (await updateRunAsync(run.id, { status: "failed", finishedAt: now, error: errMessage(e) }, now));
84
+ (await alertPrecheckAutomationFailure(automation, run.id, errMessage(e)));
110
85
  return { automation, run: getAutomationRun(run.id)! };
111
86
  }
112
87
  }
@@ -156,13 +131,13 @@ async function dispatchOnDemandAutomationAsync(
156
131
  ...(composed.systemPromptAppend ? { systemPromptAppend: composed.systemPromptAppend } : {}),
157
132
  ...(composed.relayInjectionEvents.length ? { relayInjectionEvents: composed.relayInjectionEvents } : {}),
158
133
  ...(composed.memorySeam ? { memorySeam: composed.memorySeam } : {}),
159
- env: runnerRuntimeTokenEnv({ authority: SYSTEM_LAUNCH, agentId, orchestratorId: orchestrator.id, cwd, provider: policy.provider, label, createdBy: "automation", profile: policy.profile }),
134
+ env: (await runnerRuntimeTokenEnvAsync({ authority: SYSTEM_LAUNCH, agentId, orchestratorId: orchestrator.id, cwd, provider: policy.provider, label, createdBy: "automation", profile: policy.profile })),
160
135
  }),
161
136
  }, {}, "system");
162
137
  assertAutomationUnchangedBeforeAsyncSpawn(automation);
163
- const command = createCommand(prepared.input, prepared.options, prepared.id);
164
- const result = createRunTask(automation, run, `label:${label}`, now, { targetMode: "on_demand_agent", provider: policy.provider, label, profile: policy.profile, workspaceMode: policy.workspaceMode ?? "inherit" });
165
- updateRun(run.id, { status: "waiting_agent", meta: { ...result.run.meta, onDemandLabel: label, spawnCommandId: command.id, workspaceMode: policy.workspaceMode ?? "inherit" } }, now);
138
+ const command = (await submitPreparedCommandAsync(prepared));
139
+ const result = (await createRunTask(automation, run, `label:${label}`, now, { targetMode: "on_demand_agent", provider: policy.provider, label, profile: policy.profile, workspaceMode: policy.workspaceMode ?? "inherit" }));
140
+ (await updateRunAsync(run.id, { status: "waiting_agent", meta: { ...result.run.meta, onDemandLabel: label, spawnCommandId: command.id, workspaceMode: policy.workspaceMode ?? "inherit" } }, now));
166
141
  return { ...result, run: getAutomationRun(run.id)!, command };
167
142
  }
168
143
 
@@ -173,13 +148,13 @@ function assertAutomationUnchangedBeforeAsyncSpawn(automation: Automation): void
173
148
  }
174
149
  }
175
150
 
176
- function createRunTask(
151
+ async function createRunTask(
177
152
  automation: Automation,
178
153
  run: ReturnType<typeof getAutomationRun> & NonNullable<unknown>,
179
154
  target: string,
180
155
  now: number,
181
156
  meta: Record<string, unknown>,
182
- ): AutomationDispatchResult {
157
+ ): Promise<AutomationDispatchResult> {
183
158
  const template = automation.taskTemplate;
184
159
  // Inject the authoritative dispatch-time run date (#480). A long-lived managed agent's
185
160
  // session-start day awareness goes stale across midnight, so it can't be trusted to derive
@@ -193,7 +168,7 @@ function createRunTask(
193
168
  const usesRunDateToken = /\{\{\s*(runDate|runWeekday|runDateLine)\s*\}\}/.test(`${template.title}\n${template.body}`);
194
169
  const title = fill(template.title);
195
170
  const body = (usesRunDateToken ? fill(template.body) : `Run date: ${runDate.line}.\n\n${template.body}`) + precheckTaskSection(run);
196
- const result = ingestIntegrationEvent({
171
+ const result = (await ingestIntegrationEventAsync({
197
172
  source: "automation",
198
173
  type: "scheduled_task",
199
174
  severity: template.severity ?? "info",
@@ -218,8 +193,8 @@ function createRunTask(
218
193
  runTimezone: automation.timezone,
219
194
  ...meta,
220
195
  },
221
- }, "automation");
222
- updateRun(run.id, {
196
+ }, "automation"));
197
+ (await updateRunAsync(run.id, {
223
198
  status: meta.targetMode === "on_demand_agent" ? "waiting_agent" : "running",
224
199
  startedAt: now,
225
200
  targetAgentId: typeof meta.resolvedAgentId === "string"
@@ -230,7 +205,7 @@ function createRunTask(
230
205
  taskId: result.task.id,
231
206
  messageId: result.message?.id,
232
207
  meta: { ...run.meta, ...meta },
233
- }, now);
208
+ }, now));
234
209
  return { automation, run: getAutomationRun(run.id)!, task: result.task, message: result.message };
235
210
  }
236
211
 
@@ -242,9 +217,9 @@ function durableExistingAgentTarget(policy: Extract<AutomationTargetPolicy, { mo
242
217
  throw new ValidationError("existing-agent automation target selector must include a label or capability");
243
218
  }
244
219
 
245
- function rescheduleAutomation(automation: Automation, now: number): void {
220
+ async function rescheduleAutomation(automation: Automation, now: number): Promise<void> {
246
221
  const next = automation.enabled ? nextScheduledAt(automation.schedule, automation.timezone, now) : undefined;
247
- persistNextRun(automation, next, now);
222
+ (await persistNextRunAsync(automation, next, now));
248
223
  }
249
224
 
250
225
  function requireOnlineOrchestrator(orchestratorId: string): Orchestrator {
@@ -1,5 +1,5 @@
1
1
  export type { AutomationDispatchResult, AutomationReconcileResult } from "./types";
2
- export { createAutomation, createAutomationAsync, deleteAutomation, updateAutomation, updateAutomationAsync } from "./crud";
2
+ export { createAutomation, createAutomationAsync, deleteAutomationAsync, updateAutomation, updateAutomationAsync } from "./crud";
3
3
  export { getAutomation, listAutomationRuns, listAutomations } from "./storage";
4
4
  export { runAutomationNow, runAutomationNowAsync, runDueAutomations, runDueAutomationsAsync } from "./dispatch";
5
5
  export { reconcileAutomationRuns } from "./reconcile";
@@ -0,0 +1,65 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { getOrchestrator, ValidationError } from "../db";
3
+ import { AUTOMATION_KIND } from "./constants";
4
+ import { nextScheduledAt } from "./cron";
5
+ import { db, ensureAutomationTables, getAutomation } from "./storage";
6
+ import type { normalizeCreateInput } from "./validation";
7
+ import type { Automation } from "../types";
8
+
9
+ export function insertAutomation(normalized: ReturnType<typeof normalizeCreateInput>, now: number): Automation {
10
+ if (!getOrchestrator(normalized.orchestratorId)) throw new ValidationError(`orchestrator ${normalized.orchestratorId} not found`);
11
+ const id = randomUUID();
12
+ const nextRunAt = normalized.enabled ? nextScheduledAt(normalized.schedule, normalized.timezone, now) : undefined;
13
+ db().query(`
14
+ INSERT INTO automations (id, kind, name, description, enabled, schedule, timezone, next_run_at, catch_up_policy, concurrency_policy, orchestrator_id, target_policy, task_template, created_at, updated_at)
15
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
16
+ `).run(
17
+ id,
18
+ AUTOMATION_KIND,
19
+ normalized.name,
20
+ normalized.description ?? null,
21
+ normalized.enabled ? 1 : 0,
22
+ normalized.schedule,
23
+ normalized.timezone,
24
+ nextRunAt ?? null,
25
+ normalized.catchUpPolicy,
26
+ normalized.concurrencyPolicy,
27
+ normalized.orchestratorId,
28
+ JSON.stringify(normalized.targetPolicy),
29
+ JSON.stringify(normalized.taskTemplate),
30
+ now,
31
+ now,
32
+ );
33
+ return getAutomation(id)!;
34
+ }
35
+
36
+ export function updateAutomationNormalized(id: string, normalized: ReturnType<typeof normalizeCreateInput>, now: number): Automation {
37
+ if (!getOrchestrator(normalized.orchestratorId)) throw new ValidationError(`orchestrator ${normalized.orchestratorId} not found`);
38
+ const nextRunAt = normalized.enabled ? nextScheduledAt(normalized.schedule, normalized.timezone, now) : undefined;
39
+ db().query(`
40
+ UPDATE automations
41
+ SET name = ?, description = ?, enabled = ?, schedule = ?, timezone = ?, next_run_at = ?,
42
+ catch_up_policy = ?, concurrency_policy = ?, orchestrator_id = ?, target_policy = ?, task_template = ?, updated_at = ?
43
+ WHERE id = ?
44
+ `).run(
45
+ normalized.name,
46
+ normalized.description ?? null,
47
+ normalized.enabled ? 1 : 0,
48
+ normalized.schedule,
49
+ normalized.timezone,
50
+ nextRunAt ?? null,
51
+ normalized.catchUpPolicy,
52
+ normalized.concurrencyPolicy,
53
+ normalized.orchestratorId,
54
+ JSON.stringify(normalized.targetPolicy),
55
+ JSON.stringify(normalized.taskTemplate),
56
+ now,
57
+ id,
58
+ );
59
+ return getAutomation(id)!;
60
+ }
61
+
62
+ export function deleteAutomation(id: string): boolean {
63
+ ensureAutomationTables();
64
+ return db().query("DELETE FROM automations WHERE id = ?").run(id).changes > 0;
65
+ }
@@ -1,15 +1,17 @@
1
+ import { updateRunAsync } from "./write-async";
2
+ import { createCommandAsync, getCommandAsync } from "../commands-write";
1
3
  // #3175 — an automation precheck is a plain script run on the automation's host before any agent is
2
4
  // involved, so a quiet scheduled run costs no model quota. It reuses the `scheduler.command` executor
3
5
  // (bounded, process-group reaped, output capped); only exit {@link AUTOMATION_PRECHECK_HITS_EXIT_CODE}
4
6
  // re-queues the run for its normal target dispatch.
5
7
  import { AUTOMATION_PRECHECK_HITS_EXIT_CODE, OUTPUT_WITHHELD, RELAY_RUN_OUTPUT_MASKED_CAPABILITY } from "@humwick/sdk";
6
- import { createCommand } from "../commands-db";
7
- import { getCommandAsync } from "../commands-write";
8
+
8
9
  import { isTerminalCommandStatus } from "../db/command-terminal-status";
9
10
  import { raiseOperatorAlarm } from "../operator-alarm";
10
11
  import { notifyWorkspaceHumanEscalation } from "../workspace-human-escalation";
11
12
  import { DEFAULT_PRECHECK_TIMEOUT_MS } from "./constants";
12
- import { getAutomation, getAutomationRun, listPendingPrecheckRuns, updateRun } from "./storage";
13
+ import { getAutomation, getAutomationRun } from "./storage";
14
+ import { listPendingPrecheckRunsAsync } from "./read-async";
13
15
  import type { AutomationDispatchResult, AutomationReconcileResult } from "./types";
14
16
  import type { Automation, AutomationRun, Command, Orchestrator } from "../types";
15
17
 
@@ -31,7 +33,7 @@ export function runPrecheck(run: AutomationRun): AutomationRunPrecheck | undefin
31
33
  }
32
34
 
33
35
  /** Starts the precheck when the automation has one and this run has not passed it yet. */
34
- export function startAutomationPrecheck(automation: Automation, run: AutomationRun, orchestrator: Orchestrator, now: number): AutomationDispatchResult | undefined {
36
+ export async function startAutomationPrecheck(automation: Automation, run: AutomationRun, orchestrator: Orchestrator, now: number): Promise<AutomationDispatchResult | undefined> {
35
37
  const precheck = automation.targetPolicy.precheck;
36
38
  if (!precheck || runPrecheck(run)?.status === "hits") return undefined;
37
39
  // An executor that does not mask would store raw script output in the command, run and Task, so refuse it.
@@ -40,7 +42,7 @@ export function startAutomationPrecheck(automation: Automation, run: AutomationR
40
42
  }
41
43
  const timeoutMs = precheck.timeoutMs ?? DEFAULT_PRECHECK_TIMEOUT_MS;
42
44
  const policyCwd = automation.targetPolicy.mode === "on_demand_agent" ? automation.targetPolicy.cwd : undefined;
43
- const command = createCommand({
45
+ const command = (await createCommandAsync({
44
46
  type: "scheduler.command",
45
47
  source: "automation",
46
48
  target: orchestrator.agentId,
@@ -56,16 +58,16 @@ export function startAutomationPrecheck(automation: Automation, run: AutomationR
56
58
  automationId: automation.id,
57
59
  automationRunId: run.id,
58
60
  },
59
- });
61
+ }));
60
62
  const state: AutomationRunPrecheck = { commandId: command.id, status: "running" };
61
- updateRun(run.id, { status: "running", startedAt: now, meta: { ...run.meta, precheck: state } }, now);
63
+ (await updateRunAsync(run.id, { status: "running", startedAt: now, meta: { ...run.meta, precheck: state } }, now));
62
64
  return { automation, run: getAutomationRun(run.id)!, command };
63
65
  }
64
66
 
65
67
  /** Settles finished prechecks: quiet runs succeed with no agent, hits re-queue for target dispatch. */
66
68
  export async function settleAutomationPrechecks(now: number): Promise<AutomationReconcileResult[]> {
67
69
  const results: AutomationReconcileResult[] = [];
68
- for (const run of listPendingPrecheckRuns()) {
70
+ for (const run of await listPendingPrecheckRunsAsync()) {
69
71
  const state = runPrecheck(run)!;
70
72
  const command = await getCommandAsync(state.commandId);
71
73
  if (command && !isTerminalCommandStatus(command.status)) continue;
@@ -74,15 +76,15 @@ export async function settleAutomationPrechecks(now: number): Promise<Automation
74
76
  const meta = { ...run.meta, precheck };
75
77
  const automation = getAutomation(run.automationId);
76
78
  if (!automation) {
77
- updateRun(run.id, { status: "failed", finishedAt: now, error: "automation deleted while its precheck ran", meta }, now);
79
+ (await updateRunAsync(run.id, { status: "failed", finishedAt: now, error: "automation deleted while its precheck ran", meta }, now));
78
80
  } else if (outcome.status === "hits") {
79
81
  // `scheduled` hands the run to the queued-run dispatch, which skips the precheck on `hits`.
80
- updateRun(run.id, { status: "scheduled", meta }, now);
82
+ (await updateRunAsync(run.id, { status: "scheduled", meta }, now));
81
83
  } else if (outcome.status === "quiet") {
82
- updateRun(run.id, { status: "succeeded", finishedAt: now, result: { precheck: "quiet", exitCode: 0 }, meta }, now);
84
+ (await updateRunAsync(run.id, { status: "succeeded", finishedAt: now, result: { precheck: "quiet", exitCode: 0 }, meta }, now));
83
85
  } else {
84
- updateRun(run.id, { status: "failed", finishedAt: now, error: outcome.error, meta }, now);
85
- alertPrecheckAutomationFailure(automation, run.id, outcome.error!);
86
+ (await updateRunAsync(run.id, { status: "failed", finishedAt: now, error: outcome.error, meta }, now));
87
+ (await alertPrecheckAutomationFailure(automation, run.id, outcome.error!));
86
88
  }
87
89
  results.push({ run: getAutomationRun(run.id)! });
88
90
  }
@@ -107,12 +109,12 @@ function precheckOutcome(command: Command | null): { status: AutomationRunPreche
107
109
  }
108
110
 
109
111
  /** A precheck automation that stops running is a monitoring gap, so it pages the operator once per run. */
110
- export function alertPrecheckAutomationFailure(automation: Automation, runId: string, error: string): void {
112
+ export async function alertPrecheckAutomationFailure(automation: Automation, runId: string, error: string): Promise<void> {
111
113
  if (!automation.targetPolicy.precheck) return;
112
114
  const subject = `Automation precheck failed: ${automation.name}`;
113
115
  const detail = `Run ${runId} on ${automation.orchestratorId}: ${error}`;
114
- raiseOperatorAlarm({ clientId: `automation-precheck-failed:${runId}`, source: "automation", subject, detail, view: "automation", metadata: { automationId: automation.id, automationRunId: runId } });
115
- const human = notifyWorkspaceHumanEscalation({ subject, body: detail, priority: "high", tags: ["agent-relay", "automation"], source: "automation", idempotencyKey: `automation-precheck-failed:${runId}`, payload: { automationId: automation.id, automationRunId: runId } });
116
+ (await raiseOperatorAlarm({ clientId: `automation-precheck-failed:${runId}`, source: "automation", subject, detail, view: "automation", metadata: { automationId: automation.id, automationRunId: runId } }));
117
+ const human = (await notifyWorkspaceHumanEscalation({ subject, body: detail, priority: "high", tags: ["agent-relay", "automation"], source: "automation", idempotencyKey: `automation-precheck-failed:${runId}`, payload: { automationId: automation.id, automationRunId: runId } }));
116
118
  if (!human.accepted) console.warn(`[automations] precheck failure for ${automation.id} paged nobody: ${human.reason ?? "unknown reason"}`);
117
119
  }
118
120
 
@@ -0,0 +1,11 @@
1
+ // #3799 — async facades over the automation reader ops; the main thread never scans automation tables.
2
+ import { getGateway } from "../db/gateway";
3
+ import type { Automation, AutomationRun } from "../types";
4
+
5
+ const read = <T>(op: string, args: unknown = {}): Promise<T> => getGateway().read(op as never, args as never) as unknown as Promise<T>;
6
+
7
+ export const listAutomationRunsAsync = (filter: { automationId?: string; status?: string; limit?: number } = {}) => read<AutomationRun[]>("automations.listRuns", filter);
8
+ export const listPendingPrecheckRunsAsync = () => read<AutomationRun[]>("automations.pendingPrecheckRuns");
9
+ export const listReconcilableRunsAsync = () => read<AutomationRun[]>("automations.reconcilableRuns");
10
+ export const listDispatchableQueuedRunsAsync = () => read<AutomationRun[]>("automations.dispatchableQueuedRuns");
11
+ export const listDueAutomationsAsync = (now: number) => read<Automation[]>("automations.dueAutomations", { now });