@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,7 +1,11 @@
1
+ import { TeamAuthError, TeamNotFoundError, type TeamClaimMode } from "../db/team-claim-policy";
2
+ import type { claimAuthorizedTeam } from "../db/team-claim-policy";
3
+ import { getGateway } from "../db/gateway";
4
+ import { ensureTeamAsync, setTeamBriefAsync } from "../db/teams-async";
1
5
  import { hasScope } from "@humwick/sdk/types";
2
6
  import { errMessage } from "@humwick/sdk";
3
7
  import { MAX_TEAM_ROSTER_ENTRIES, STALE_TTL_MS } from "../config";
4
- import { claimTeamWithAdoption, countLiveTeamMembers, dissolveTeam, ensureTeam, getAgent, getPlanByTeam, getTaskDetail, getTeam, getTeamBusyState, getTeamMemberStats, getTeamRoster, isClaimableTeam, setTeamBrief } from "../db";
8
+ import { claimTeamWithAdoption, countLiveTeamMembers, dissolveTeamAsync, ensureTeam, getAgent, getPlanByTeam, getTaskDetail, getTeam, getTeamBusyState, getTeamMemberStats, getTeamRoster, isClaimableTeam, setTeamBrief } from "../db";
5
9
  import { emitTaskChanged } from "../sse";
6
10
  import { emitRelayEvent } from "../events";
7
11
  import { listIssueRefsForEntity } from "./issue-associations";
@@ -12,8 +16,7 @@ import { flushQueuedDirectMessages } from "./managed-running";
12
16
  import { projectIdForAgent, seatTeamIdForProject } from "../db/team-project";
13
17
  import { AGENT_SYSTEM_TAGS, hasAgentSystemTag } from "../agent-system-tags";
14
18
 
15
- export class TeamAuthError extends Error {}
16
- export class TeamNotFoundError extends Error {}
19
+ export { TeamAuthError, TeamNotFoundError } from "../db/team-claim-policy";
17
20
 
18
21
  /** #1304 — what a bounded team payload actually carried vs. how many members the team has, so a
19
22
  * truncated roster is visible (not a silent "these are all the members") to the caller. */
@@ -112,71 +115,19 @@ function payloadForAgent(agentId: string, channel?: string): TeamPayload {
112
115
  };
113
116
  }
114
117
 
115
- function lineageRootForAgent(agentId: string): string | undefined {
116
- let current = getAgent(agentId);
117
- const seen = new Set<string>();
118
- while (current) {
119
- if (seen.has(current.id)) return undefined;
120
- seen.add(current.id);
121
- if (!current.spawnedBy) return current.id;
122
- current = getAgent(current.spawnedBy);
123
- }
124
- return undefined;
125
- }
126
-
127
- function coordinatorIsLive(team: Team): boolean {
128
- if (!team.coordinatorId) return false;
129
- const coordinator = getAgent(team.coordinatorId);
130
- if (!coordinator || coordinator.status === "offline") return false;
131
- if (coordinator.teamId === team.id) return countLiveTeamMembers(team.id, Date.now() - STALE_TTL_MS) > 0;
132
- return coordinator.lastSeen > Date.now() - STALE_TTL_MS;
133
- }
134
-
135
- /** How a claim was authorized — carried into the audit trail so an orphan takeover is
136
- * distinguishable from a routine same-lineage reclaim. */
137
- export type TeamClaimMode = "admin" | "same-lineage" | "orphan-takeover";
138
-
139
- /**
140
- * Authorize a team claim and classify HOW it is authorized. The security boundary is
141
- * `coordinatorIsLive`: a LIVE owner's team is NEVER claimable by a peer — only the team's own
142
- * lineage (or an admin) may reclaim it. A cross-lineage caller may take over ONLY when the owning
143
- * coordinator is offline/stale past STALE_TTL_MS (#1454 orphan takeover, recovering a coordinator
144
- * lost to a host crash / OOM / process death). The `teams:write` scope gate on `relay_team_claim`
145
- * already restricts every path here to coordinator-class tokens (worker tokens have `teams:write`
146
- * stripped at mint), so no extra role check is needed.
147
- */
148
- function assertCanClaimTeam(admin: boolean, team: Team, callerAgentId: string): TeamClaimMode {
149
- const caller = getAgent(callerAgentId);
150
- const callerTeam = caller?.teamId ? getTeam(caller.teamId) : null;
151
- if (!admin && callerTeam?.parentTeamId && team.id !== callerTeam.id) {
152
- throw new TeamAuthError("a sub-coordinator may claim only its own private team");
153
- }
154
- const callerRoot = lineageRootForAgent(callerAgentId);
155
- const teamRoot = team.rootCoordinatorId ?? team.coordinatorId;
156
- // Same-lineage reclaim is the routine fast path (a replacement spawned under the original
157
- // founder) and stays allowed regardless of owner liveness.
158
- if (callerRoot && teamRoot && callerRoot === teamRoot) return "same-lineage";
159
- if (admin) return "admin";
160
- // #1454 orphan takeover: a replacement coordinator of a DIFFERENT lineage may adopt the team only
161
- // when its owning coordinator is not live (offline, or stale past the heartbeat TTL). This is the
162
- // sole security boundary for the cross-lineage path — a healthy owner is never displaced.
163
- if (!coordinatorIsLive(team)) return "orphan-takeover";
164
- throw new TeamAuthError(`caller ${callerAgentId} cannot claim team ${team.id}`);
165
- }
166
-
167
118
  export function getCallerTeam(ctx: AuthContext, channel?: string): TeamPayload {
168
119
  return payloadForAgent(requireCallerAgentId(ctx), channel);
169
120
  }
170
121
 
171
- export function setCallerTeamBrief(ctx: AuthContext, input: TeamBriefInput): TeamPayload {
122
+ export async function setCallerTeamBrief(ctx: AuthContext, input: TeamBriefInput): Promise<TeamPayload> {
172
123
  const agentId = requireCallerAgentId(ctx);
173
- const team = acquireCoordinatorTeam(agentId);
174
- setTeamBrief({ teamId: team.id, ...input });
124
+ const team = (await acquireCoordinatorTeam(agentId));
125
+ await setTeamBriefAsync({ teamId: team.id, ...input });
175
126
  return payloadForAgent(agentId);
176
127
  }
177
128
 
178
- export function claimTeamForCaller(ctx: AuthContext, teamId: string, reason?: string): TeamPayload {
179
- const claimed = claimTeamAs(requireCallerAgentId(ctx), teamId, hasScope(ctx.scopes, "system:admin"), reason);
129
+ export async function claimTeamForCaller(ctx: AuthContext, teamId: string, reason?: string): Promise<TeamPayload> {
130
+ const claimed = (await claimTeamAs(requireCallerAgentId(ctx), teamId, hasScope(ctx.scopes, "system:admin"), reason));
180
131
  return {
181
132
  team: claimed,
182
133
  ...boundedTeamRoster(claimed.id, Date.now() - STALE_TTL_MS),
@@ -187,34 +138,16 @@ export function claimTeamForCaller(ctx: AuthContext, teamId: string, reason?: st
187
138
  };
188
139
  }
189
140
 
190
- function claimTeamAs(agentId: string, teamId: string, admin: boolean, reason?: string): Team {
191
- // Pre-check for a precise not-found error before taking the write lock; the AUTHORITATIVE active +
192
- // authorization check runs under the lock inside claimTeamWithAdoption (below), closing the claim TOCTOU.
193
- // #2561 — an auto-reaped team (its coordinator died and its members went quiet) stays claimable;
194
- // the claim re-activates it. An explicitly dissolved team does not.
195
- const pre = getTeam(teamId);
196
- if (!isClaimableTeam(pre)) throw new TeamNotFoundError(`active team ${teamId} not found`);
197
- // #1454 — authorize against the team as re-read UNDER claimTeamWithAdoption's write lock, so a racing claim
198
- // that already committed is visible to assertCanClaimTeam (a healthy new owner denies the loser).
199
- // The mode + prior coordinator captured here come from that same locked snapshot, so the audit
200
- // trail matches exactly what the compare-and-swap acted on.
201
- let captured: { mode: TeamClaimMode; priorCoordinatorId: string | null } | undefined;
202
- const { team: claimed, revived, adoptedTaskIds } = claimTeamWithAdoption(teamId, agentId, (lockedTeam) => {
203
- captured = {
204
- mode: assertCanClaimTeam(admin, lockedTeam, agentId),
205
- priorCoordinatorId: lockedTeam.coordinatorId ?? null,
206
- };
207
- });
208
- // claimTeamWithAdoption always invokes the callback before committing (or throws before returning), so this is
209
- // populated on every success.
210
- afterTeamClaimed(agentId, claimed, { ...captured!, revived, adoptedTaskIds, reason });
211
- return claimed;
141
+ async function claimTeamAs(agentId: string, teamId: string, admin: boolean, reason?: string): Promise<Team> {
142
+ const result = await getGateway().write("teams.claimAuthorized", { teamId, agentId, admin }) as unknown as ReturnType<typeof claimAuthorizedTeam>;
143
+ await afterTeamClaimed(agentId, result.team, { ...result, reason });
144
+ return result.team;
212
145
  }
213
146
 
214
147
  /** The one post-claim seam for relay_team_claim and seat acquisition: unread mail, audit, Task feeds. */
215
- function afterTeamClaimed(agentId: string, claimed: Team, claim: { mode: TeamClaimMode; priorCoordinatorId: string | null; revived: boolean; adoptedTaskIds: number[]; reason?: string }): void {
148
+ async function afterTeamClaimed(agentId: string, claimed: Team, claim: { mode: TeamClaimMode; priorCoordinatorId: string | null; revived: boolean; adoptedTaskIds: number[]; reason?: string }): Promise<void> {
216
149
  const { mode, priorCoordinatorId, revived, adoptedTaskIds, reason } = claim;
217
- flushQueuedDirectMessages(agentId);
150
+ (await flushQueuedDirectMessages(agentId));
218
151
  // Audit every ownership CHANGE (#1454) — an orphan takeover is the failover-recovery signal, but a
219
152
  // cross-lineage admin claim is equally worth a trail. A no-op reclaim (same owner) emits nothing.
220
153
  if (priorCoordinatorId !== agentId) {
@@ -245,48 +178,48 @@ function afterTeamClaimed(agentId: string, claimed: Team, claim: { mode: TeamCla
245
178
  /** #3107 — a coordinator-profile agent in project P founds P's stable seat team, or claims it under the
246
179
  * #1454 rule (same lineage, or the holder is offline). A refused claim yields a side team discovery never
247
180
  * lists; it takes the seat only by an explicit relay_team_claim. Sync, on the main thread. */
248
- export function acquireCoordinatorTeam(agentId: string): Team {
181
+ export async function acquireCoordinatorTeam(agentId: string): Promise<Team> {
249
182
  const agent = getAgent(agentId);
250
183
  const current = agent?.teamId ? getTeam(agent.teamId) : null;
251
184
  if (current?.status === "active") return current;
252
185
  const projectId = agent && hasAgentSystemTag(agent, AGENT_SYSTEM_TAGS.coordinator) ? projectIdForAgent(agent) : null;
253
- if (!projectId) return ensureTeam(agentId);
186
+ if (!projectId) return await ensureTeamAsync(agentId);
254
187
  const seatId = seatTeamIdForProject(projectId);
255
- if (seatId) return claimSeatOrSideTeam(agentId, seatId);
188
+ if (seatId) return (await claimSeatOrSideTeam(agentId, seatId));
256
189
  try {
257
- return ensureTeam(agentId, { projectId });
190
+ return await ensureTeamAsync(agentId, { projectId });
258
191
  } catch (e) {
259
192
  // A racing founder took the seat between the read and the insert: claim behind it, once.
260
193
  const winner = e instanceof Error && e.message.includes("teams.project_id") ? seatTeamIdForProject(projectId) : null;
261
194
  if (!winner) throw e;
262
- return claimSeatOrSideTeam(agentId, winner);
195
+ return (await claimSeatOrSideTeam(agentId, winner));
263
196
  }
264
197
  }
265
198
 
266
- function claimSeatOrSideTeam(agentId: string, seatId: string): Team {
199
+ async function claimSeatOrSideTeam(agentId: string, seatId: string): Promise<Team> {
267
200
  try {
268
- return claimTeamAs(agentId, seatId, false, "coordinator seat acquisition");
201
+ return (await claimTeamAs(agentId, seatId, false, "coordinator seat acquisition"));
269
202
  } catch (e) {
270
203
  if (!(e instanceof TeamAuthError)) throw e;
271
- return ensureTeam(agentId);
204
+ return await ensureTeamAsync(agentId);
272
205
  }
273
206
  }
274
207
 
275
208
  /** #3107 — a coordinator takes its project's seat at its ready transition, before queued mail flushes,
276
209
  * so a fresh replacement owns the topic before its first spawn. A restart keeps its team: no-op. */
277
- export function acquireTeamOnReady(agentId: string): void {
210
+ export async function acquireTeamOnReady(agentId: string): Promise<void> {
278
211
  const agent = getAgent(agentId);
279
212
  if (!agent || !hasAgentSystemTag(agent, AGENT_SYSTEM_TAGS.coordinator)) return;
280
213
  if (agent.teamId && getTeam(agent.teamId)?.status === "active") return;
281
214
  try {
282
- acquireCoordinatorTeam(agentId);
215
+ (await acquireCoordinatorTeam(agentId));
283
216
  } catch (e) {
284
217
  console.warn(`[teams] seat acquisition for ${agentId} failed: ${errMessage(e)}`);
285
218
  }
286
219
  }
287
220
 
288
- export function dissolveTeamById(teamId: string, input: TeamDissolveServiceInput = {}): Team {
289
- const { team, unpromotedBlackboard } = dissolveTeam(teamId, input);
221
+ export async function dissolveTeamById(teamId: string, input: TeamDissolveServiceInput = {}): Promise<Team> {
222
+ const { team, unpromotedBlackboard } = await dissolveTeamAsync(teamId, input);
290
223
  emitRelayEvent({
291
224
  type: "team.dissolved",
292
225
  source: "system",
@@ -304,11 +237,11 @@ export function dissolveTeamById(teamId: string, input: TeamDissolveServiceInput
304
237
  return team;
305
238
  }
306
239
 
307
- export function dissolveCallerTeam(ctx: AuthContext, input: TeamDissolveServiceInput): TeamPayload {
240
+ export async function dissolveCallerTeam(ctx: AuthContext, input: TeamDissolveServiceInput): Promise<TeamPayload> {
308
241
  const agentId = requireCallerAgentId(ctx);
309
242
  const agent = getAgent(agentId);
310
243
  if (!agent?.teamId) throw new TeamNotFoundError("caller has no team");
311
- const team = dissolveTeamById(agent.teamId, input);
244
+ const team = await dissolveTeamById(agent.teamId, input);
312
245
  return {
313
246
  team,
314
247
  ...boundedTeamRoster(team.id, Date.now() - STALE_TTL_MS),
@@ -1,3 +1,4 @@
1
+ import { clearAgentMetaKeysAsync } from "../db/agents-async";
1
2
  import { agentPrincipalSink } from "../db/agent-ownership";
2
3
  // #633 — owning service for the silent clean-exit terminal event. A runner whose provider
3
4
  // terminally exits stays alive (manual-resume hold), so neither the orchestrator tmux-gone path nor
@@ -6,7 +7,7 @@ import { agentPrincipalSink } from "../db/agent-ownership";
6
7
  // clears the hold when the provider genuinely resumes. Kept out of the bus transport so the
7
8
  // transport stays thin (transport-thinness ratchet, #348).
8
9
  import { isRecord } from "@humwick/sdk";
9
- import { clearAgentMetaKeys } from "../db";
10
+
10
11
  import { notifyAgentOffline } from "../agent-lifecycle-events";
11
12
  import { diagnoseAgentDeath } from "../agent-death-diagnosis";
12
13
  import { routeNotification } from "../notification-router";
@@ -20,9 +21,9 @@ import type { AgentCard } from "../types";
20
21
  * a death diagnosis (also persisted as a crash report inside notifyAgentOffline). No-op for
21
22
  * non-spawned agents (notifyAgentOffline guards on lineage) and graceful shutdowns (no marker).
22
23
  */
23
- export function reconcileTerminalProviderExit(agentId: string, before: AgentCard | null | undefined, after: AgentCard | null | undefined): void {
24
+ export async function reconcileTerminalProviderExit(agentId: string, before: AgentCard | null | undefined, after: AgentCard | null | undefined): Promise<void> {
24
25
  if (after && after.status !== "offline" && before?.status === "offline" && isRecord(after.meta?.terminalProviderExit)) {
25
- clearAgentMetaKeys(agentId, ["terminalProviderExit"]);
26
+ (await clearAgentMetaKeysAsync(agentId, ["terminalProviderExit"]));
26
27
  return;
27
28
  }
28
29
  if (!after || after.status !== "offline") return;
@@ -32,9 +33,9 @@ export function reconcileTerminalProviderExit(agentId: string, before: AgentCard
32
33
  const reasonText = typeof marker.reason === "string" ? marker.reason : "provider exited";
33
34
  const reason = `provider exited (${reasonText})`;
34
35
  const diagnosis = diagnoseAgentDeath({ agent: after, reason });
35
- notifyAgentOffline(agentId, reason, diagnosis);
36
+ (await notifyAgentOffline(agentId, reason, diagnosis));
36
37
  if (!after.spawnedBy && reasonText.startsWith("self-resume-")) {
37
- routeNotification({
38
+ await routeNotification({
38
39
  type: "agent.exited",
39
40
  scope: { agentId },
40
41
  recipients: [agentPrincipalSink(agentId)],
@@ -1,4 +1,5 @@
1
1
  import { initDb } from "../db";
2
+ import { getGateway } from "../db/gateway";
2
3
  import { runDueScheduledTimers, type RunDueScheduledTimersFaults } from "./scheduler";
3
4
 
4
5
  const [dbPath, boundary, rawNow] = process.argv.slice(2);
@@ -17,9 +18,12 @@ const faults: RunDueScheduledTimersFaults = {};
17
18
  if (boundary === "after-claim") faults.afterClaim = (timer) => {
18
19
  if (!timer.command) kill();
19
20
  };
20
- if (boundary === "after-authority") faults.afterAuthorityCasAndFireInsert = kill;
21
- if (boundary === "after-projection") faults.afterLegacyProjectionUpdate = kill;
22
- if (boundary === "before-commit") faults.beforeCommit = kill;
21
+ const writerBoundary = ({
22
+ "after-authority": "afterAuthorityCasAndFireInsert",
23
+ "after-projection": "afterLegacyProjectionUpdate",
24
+ "before-commit": "beforeCommit",
25
+ } as Record<string, string>)[boundary];
26
+ if (writerBoundary) await getGateway().write("seam.armFault", { name: `timers.decideFire.${writerBoundary}`, action: "kill" });
23
27
  if (boundary === "after-commit") faults.afterCommit = kill;
24
28
  if (boundary === "after-send") faults.afterSendBeforeSent = kill;
25
29
 
@@ -147,7 +147,7 @@ export async function drainTimerMessageFireOutbox(
147
147
  // Durable-timer fire-send proceeds on the FROZEN captured identity even when the original
148
148
  // sender agent has deregistered — the outbox row already carries that identity. The relaxation
149
149
  // is scoped to THIS path only; normal live sends keep the registration guard (#362 boundary).
150
- const sent = send(payload.input, authContextOf(payload), { allowUnregisteredSender: true });
150
+ const sent = await send(payload.input, authContextOf(payload), { allowUnregisteredSender: true });
151
151
  options.afterSendBeforeSent?.(row, sent.message.id);
152
152
  await markTimerMessageFireSentAsync(row.timerId, row.run, sent.message.id);
153
153
  await clearTimerMessageFireSendFailureAsync(row.timerId, row.run);
@@ -1,9 +1,12 @@
1
+ import { recordTerminalEventAsync } from "../db/lifecycle-tail-async";
2
+ import { createActivityEventAsync } from "../db/activity-async";
3
+ import { createCommandAsync } from "../commands-write";
1
4
  import { relayEnv } from "@humwick/sdk/env";
2
5
  import { notifyAgentExit } from "../agent-lifecycle-events";
3
6
  import { errMessage } from "@humwick/sdk";
4
- import { createCommand } from "../commands-db";
7
+
5
8
  import { emitRelayEvent } from "../events";
6
- import { agentsWithPendingOwnRelayRun, createActivityEvent, createActivityEventAsync, getAgent, hasArtifactCreatedBy, listAgents, listFinalResponseCaptureMessages, listWorkspaces, onBeforeAgentStatusTransition, recordTerminalEvent, workflowRunIdOf } from "../db";
9
+ import { agentsWithPendingOwnRelayRun, getAgent, hasArtifactCreatedBy, listAgents, listFinalResponseCaptureMessages, listWorkspaces, onBeforeAgentStatusTransition, workflowRunIdOf } from "../db";
7
10
  import { routeNotification } from "../notification-router";
8
11
  import { isProviderBlocked } from "../provider-state";
9
12
  import { TERMINAL_WORKSPACE_STATUSES } from "../workspace-phase";
@@ -15,6 +18,7 @@ import { activeAgentKeep } from "./agent-keep";
15
18
  import { automaticDisposalBlocker } from "./automatic-disposal";
16
19
  import { agentGenerationKey } from "../db/agent-shutdown-in-flight";
17
20
  import { workflowAgentObligation } from "./workflow-agent-obligation";
21
+ import { workflowRunPaused } from "../db/workflow-task-read-ops";
18
22
  import type { AgentCard, Command, WorkspaceRecord } from "../types";
19
23
  import { emitCommandEvent } from "../command-events";
20
24
 
@@ -36,25 +40,25 @@ export interface TransientShutdownOptions {
36
40
  now?: number;
37
41
  }
38
42
 
39
- export function requestTransientAgentShutdown(agent: AgentCard, opts: TransientShutdownOptions): Command {
43
+ export async function requestTransientAgentShutdown(agent: AgentCard, opts: TransientShutdownOptions): Promise<Command> {
40
44
  const now = opts.now ?? Date.now();
41
- const command = createCommand({
45
+ const command = (await createCommandAsync({
42
46
  type: "agent.shutdown",
43
47
  source: "system",
44
48
  target: agent.id,
45
49
  params: { action: "shutdown", agentId: agent.id, agentGeneration: agentGenerationKey(agent), graceful: true, timeoutMs: 10_000, reason: opts.reason, requestedBy: opts.requestedBy, requestedAt: now },
46
- });
50
+ }));
47
51
  emitCommandEvent(command, "command.requested");
48
52
  // #1084 — reaping a transient agent always follows a verified-complete land/idle-grace check
49
53
  // (the caller only reaches here once `land.complete`/gates-passed holds), so it is a genuine
50
54
  // teardown completion signal: close its work window, forwarding only the held final group.
51
- markAgentWorkFinal(agent.id, "edge-fallback");
55
+ (await markAgentWorkFinal(agent.id, "edge-fallback"));
52
56
  // #645 — persist a clean terminal marker so the #634 heartbeat-gap watchdog reads this benign
53
57
  // completion as a terminus (not a silent death) once the reaped worker stops heartbeating.
54
- recordTerminalEvent({ agentId: agent.id, reason: opts.reason, kind: "agent.exited", epoch: agent.epoch, createdAt: now });
58
+ (await recordTerminalEventAsync({ agentId: agent.id, reason: opts.reason, kind: "agent.exited", epoch: agent.epoch, createdAt: now }));
55
59
  // #1912 §4 retained: callers need the created command synchronously to preserve teardown
56
60
  // ordering; an async activity-only hop here would sever that command/audit contract.
57
- createActivityEvent({
61
+ (await createActivityEventAsync({
58
62
  clientId: `transient-agent-reaped-${agent.id}-${now}`,
59
63
  kind: "state",
60
64
  title: opts.activityTitle,
@@ -64,8 +68,8 @@ export function requestTransientAgentShutdown(agent: AgentCard, opts: TransientS
64
68
  view: "agents",
65
69
  agentId: agent.id,
66
70
  metadata: { source: "server", maintenanceJobId: opts.requestedBy, commandId: command.id, reason: opts.reason, workspaceId: opts.workspaceId, landReason: opts.landReason },
67
- });
68
- notifyAgentExit(agent, opts.reason, undefined, { workspaceId: opts.workspaceId, workspaceStatus: opts.workspaceStatus });
71
+ }));
72
+ (await notifyAgentExit(agent, opts.reason, undefined, { workspaceId: opts.workspaceId, workspaceStatus: opts.workspaceStatus }));
69
73
  return command;
70
74
  }
71
75
 
@@ -94,9 +98,9 @@ const persistentIdleTracker = new Map<string, { firstIdleAt: number; lastFlushed
94
98
  // #1333 — the reaper owns the observed-idle settle clock, but its next poll is too late to close
95
99
  // the old window: capture B from the new turn can already displace final A in the held ring. Flush
96
100
  // synchronously inside the actual idle→busy mutation, before that write returns and B is accepted.
97
- onBeforeAgentStatusTransition((agent, nextStatus) => {
101
+ onBeforeAgentStatusTransition(async (agent, nextStatus) => {
98
102
  if (agent.status !== "idle" || nextStatus !== "busy" || !persistentIdleTracker.has(agent.id)) return;
99
- markAgentWorkFinal(agent.id, "edge-fallback");
103
+ (await markAgentWorkFinal(agent.id, "edge-fallback"));
100
104
  persistentIdleTracker.delete(agent.id);
101
105
  });
102
106
 
@@ -245,7 +249,7 @@ async function notifyTransientHeld(agentId: string, workspaceId: string | undefi
245
249
  // the live card, never from the pre-await snapshot used only to describe this hold event.
246
250
  const parent = getAgent(agentId)?.spawnedBy;
247
251
  if (parent) {
248
- routeNotification({
252
+ await routeNotification({
249
253
  type: "agent.transient_land_hold",
250
254
  scope: { agentId, parent, workspaceId },
251
255
  recipients: [parent],
@@ -315,7 +319,7 @@ export async function reapTransientAgents(context: { signal?: AbortSignal } = {}
315
319
  const persistentIdleForMs = now - persistentEntry.firstIdleAt;
316
320
  if (persistentIdleForMs < persistentGrace || persistentEntry.lastFlushedAt) continue;
317
321
  persistentEntry.lastFlushedAt = now;
318
- markAgentWorkFinal(agent.id, "edge-fallback");
322
+ (await markAgentWorkFinal(agent.id, "edge-fallback"));
319
323
  persistentFinalsFlushed.push(agent.id);
320
324
  continue;
321
325
  }
@@ -339,7 +343,7 @@ export async function reapTransientAgents(context: { signal?: AbortSignal } = {}
339
343
  // A graceful runner shutdown flushes its session outbox immediately before it reports
340
344
  // offline. That final capture can therefore arrive after the initial reap closed the
341
345
  // work window; close it once more at the terminal edge before dropping the tracker (#1139).
342
- markAgentWorkFinal(agent.id, "edge-fallback");
346
+ (await markAgentWorkFinal(agent.id, "edge-fallback"));
343
347
  if (priorEntry.workspaceId) {
344
348
  const reconciled = await reconcileReapedWorkspace(priorEntry.workspaceId);
345
349
  if (!reconciled) continue; // retain tracker → retry next scan
@@ -356,7 +360,8 @@ export async function reapTransientAgents(context: { signal?: AbortSignal } = {}
356
360
  if (completedProviderTurns(agent) === 0) { transientTracker.delete(agent.id); waiting.push(agent.id); continue; }
357
361
  // #3234 — an empty branch is not completion while the workflow still awaits this agent's delivery.
358
362
  const runId = workflowRunIdOf(agent);
359
- if (runId && await workflowAgentObligation(runId, agent.id)) { transientTracker.delete(agent.id); waiting.push(agent.id); continue; }
363
+ // #3757 — a paused run keeps all its step agents.
364
+ if (runId && (workflowRunPaused(runId) || await workflowAgentObligation(runId, agent.id))) { transientTracker.delete(agent.id); waiting.push(agent.id); continue; }
360
365
  const entry = transientTracker.get(agent.id) ?? { firstIdleAt: now };
361
366
  transientTracker.set(agent.id, entry);
362
367
  const idleForMs = now - entry.firstIdleAt;
@@ -377,7 +382,7 @@ export async function reapTransientAgents(context: { signal?: AbortSignal } = {}
377
382
  // #2124 — a worker stuck at held-pending-land (wedged workspace) hits none of the other
378
383
  // finality anchors (workspace-ready, task->done, teardown-reap). Close its work window here,
379
384
  // once, so its turn-final report isn't stranded in the ring for the duration of the hold.
380
- markAgentWorkFinal(agent.id, "edge-fallback");
385
+ (await markAgentWorkFinal(agent.id, "edge-fallback"));
381
386
  }
382
387
  } else waiting.push(agent.id);
383
388
  continue;
@@ -385,7 +390,7 @@ export async function reapTransientAgents(context: { signal?: AbortSignal } = {}
385
390
  if (entry.lastReapAt) continue;
386
391
  entry.lastReapAt = now;
387
392
  entry.workspaceId = land.workspaceId;
388
- requestTransientAgentShutdown(agent, {
393
+ (await requestTransientAgentShutdown(agent, {
389
394
  reason: "transient-complete",
390
395
  requestedBy: "transient-agent-reaper",
391
396
  workspaceId: land.workspaceId,
@@ -394,11 +399,11 @@ export async function reapTransientAgents(context: { signal?: AbortSignal } = {}
394
399
  activityBody: "Agent idle grace elapsed and transient work is complete; shutdown requested",
395
400
  landReason: land.reason,
396
401
  now,
397
- });
402
+ }));
398
403
  // #889 — finalize any bound task whose doneWhen is "agent-exit" (auto-scaffolded ephemeral
399
404
  // tasks that produce no deliverable and would otherwise hang in_progress forever).
400
405
  const spawnRequestId = typeof agent.meta?.spawnRequestId === "string" ? agent.meta.spawnRequestId : undefined;
401
- finalizeEphemeralTasksOnReap(agent.id, { spawnRequestId, reason: "transient-complete", producedWork: land.producedWork, evidence: land.reason });
406
+ await finalizeEphemeralTasksOnReap(agent.id, { spawnRequestId, reason: "transient-complete", producedWork: land.producedWork, evidence: land.reason });
402
407
  reaped.push(agent.id);
403
408
  }
404
409
  // #1819 — only sweep on a COMPLETE pass. An abort truncates `seen`/`seenPersistent`, and dropping a
@@ -38,11 +38,11 @@ function describeAge(ageMs: number | undefined): string {
38
38
  * ("idle at its prompt now") is precisely what live work contradicts. Operator-reported false
39
39
  * positive, 2026-09-27 (`dogfood-first-ship`), cost: a coordinator re-sending the work.
40
40
  */
41
- export function auditReconciledProviderTurn(
41
+ export async function auditReconciledProviderTurn(
42
42
  agentId: string,
43
43
  after: AgentCard | null | undefined,
44
44
  timelineEvent: ProviderTimelineEvent | null,
45
- ): void {
45
+ ): Promise<void> {
46
46
  if (!timelineEvent || timelineEvent.status !== RECONCILED_TURN_TIMELINE_STATUS) return;
47
47
  const metadata = timelineEvent.metadata ?? {};
48
48
  if (metadata.source !== "runner") return;
@@ -51,7 +51,7 @@ export function auditReconciledProviderTurn(
51
51
  const reason = stringValue(metadata.reconcileReason);
52
52
  const label = after?.label ?? after?.name ?? agentId;
53
53
  try {
54
- routeNotification({
54
+ await routeNotification({
55
55
  type: "agent.turn_interrupted",
56
56
  scope: { agentId, parent: after?.spawnedBy, teamId: after?.teamId },
57
57
  message: {
@@ -86,12 +86,12 @@ export function auditReconciledProviderTurn(
86
86
  * No liveness verdict means there is no stall evidence; the activity row still records the hold.
87
87
  * Transport heartbeats alone do not count as provider progress.
88
88
  */
89
- export function auditProviderTurnWatchdog(
89
+ export async function auditProviderTurnWatchdog(
90
90
  agentId: string,
91
91
  after: AgentCard | null | undefined,
92
92
  timelineEvent: ProviderTimelineEvent | null,
93
93
  now?: number,
94
- ): void {
94
+ ): Promise<void> {
95
95
  if (!timelineEvent || timelineEvent.status !== PROVIDER_TURN_WATCHDOG_TIMELINE_STATUS) return;
96
96
  const metadata = timelineEvent.metadata ?? {};
97
97
  if (metadata.source !== "runner") return;
@@ -114,7 +114,7 @@ export function auditProviderTurnWatchdog(
114
114
  const reason = stringValue(metadata.watchdogReason);
115
115
  const label = after?.label ?? after?.name ?? agentId;
116
116
  try {
117
- routeNotification({
117
+ await routeNotification({
118
118
  type: "agent.turn_watchdog",
119
119
  scope: { agentId, parent: after?.spawnedBy, teamId: after?.teamId },
120
120
  message: {
@@ -175,11 +175,11 @@ export function auditProviderTurnWatchdog(
175
175
  * one here, and only `EmptyTurnLedger.escalateOnTimeout` deferring to "retry" on tracked live work can
176
176
  * tell them apart — see `answers()`.
177
177
  */
178
- export function auditProviderTurnEmpty(
178
+ export async function auditProviderTurnEmpty(
179
179
  agentId: string,
180
180
  after: AgentCard | null | undefined,
181
181
  timelineEvent: ProviderTimelineEvent | null,
182
- ): void {
182
+ ): Promise<void> {
183
183
  if (!timelineEvent || timelineEvent.status !== PROVIDER_TURN_EMPTY_TIMELINE_STATUS) return;
184
184
  const metadata = timelineEvent.metadata ?? {};
185
185
  if (metadata.source !== "runner") return;
@@ -199,7 +199,7 @@ export function auditProviderTurnEmpty(
199
199
  const stalled = stringValue(metadata.emptyKind) === "input-stalled";
200
200
  const label = after?.label ?? after?.name ?? agentId;
201
201
  try {
202
- routeNotification({
202
+ await routeNotification({
203
203
  type: "agent.turn_empty",
204
204
  scope: { agentId, parent: after?.spawnedBy, teamId: after?.teamId },
205
205
  message: {
@@ -1,7 +1,9 @@
1
+ import { createUserInviteAsync, acceptUserInviteAsync } from "../db/user-invites-async";
2
+ import { updateUserAccessAsync, setUserSecretAsync } from "../db/runtime-tail-async";
1
3
  // User onboarding (#3567 D2): the invites flag, invite acceptance and password setup. The admin
2
4
  // sets their own password with the admin token, then invites users with single-use links.
3
5
  import { DEFAULT_USER_ID, userSinkId, type User, type UserRole, type UserStatus } from "@humwick/sdk";
4
- import { ValidationError, acceptUserInvite, reassignAgentOwnershipAsync, createUserInvite, getAgent, getUser, listAuthIdentitiesForUser, setUserSecret, updateUserAccess, type UserInvite } from "../db";
6
+ import { ValidationError, reassignAgentOwnershipAsync, getAgent, getUser, listAuthIdentitiesForUser, type UserInvite } from "../db";
5
7
  import { liveTokenJtisForSub } from "../token-db";
6
8
  import { revokeTokenAsync } from "../token-db-write";
7
9
  import { getConfig } from "../config-store";
@@ -32,8 +34,8 @@ function cleanPassword(raw: unknown): string {
32
34
  }
33
35
 
34
36
  /** Create a single-use invite; the plaintext code is returned once and never stored. */
35
- export function createInvite(input: { role: UserRole; displayName?: string; createdBy: string }): { invite: UserInvite; code: string } {
36
- return createUserInvite(input);
37
+ export async function createInvite(input: { role: UserRole; displayName?: string; createdBy: string }): Promise<{ invite: UserInvite; code: string }> {
38
+ return (await createUserInviteAsync(input));
37
39
  }
38
40
 
39
41
  /** Accept an invite: hash the password, then create the user and their login in one write. */
@@ -41,7 +43,7 @@ export async function acceptInvite(input: { code: unknown; handle: unknown; pass
41
43
  if (typeof input.code !== "string" || !input.code) throw new ValidationError("code required");
42
44
  const handle = cleanHandle(input.handle);
43
45
  const secretHash = await hashPassword(cleanPassword(input.password));
44
- return acceptUserInvite({ code: input.code, userId: handle, handle, displayName: input.displayName, provider: PASSWORD_PROVIDER_ID, secretHash });
46
+ return (await acceptUserInviteAsync({ code: input.code, userId: handle, handle, displayName: input.displayName, provider: PASSWORD_PROVIDER_ID, secretHash }));
45
47
  }
46
48
 
47
49
  /** True once the user has a password login (the dashboard offers "Set your password" until then). */
@@ -62,7 +64,7 @@ export async function setPassword(input: { userId: string; password: unknown; cu
62
64
  const current = typeof input.currentPassword === "string" ? input.currentPassword : "";
63
65
  if (!(await verifyPassword(current, existing.secretHash))) throw new ValidationError("current password is wrong");
64
66
  }
65
- setUserSecret({ userId: user.id, provider: PASSWORD_PROVIDER_ID, providerSubject: user.handle, secretHash: await hashPassword(password) });
67
+ (await setUserSecretAsync({ userId: user.id, provider: PASSWORD_PROVIDER_ID, providerSubject: user.handle, secretHash: await hashPassword(password) }));
66
68
  }
67
69
 
68
70
  /**
@@ -74,7 +76,7 @@ export async function changeUserAccess(input: { actorUserId: string; userId: str
74
76
  if (input.userId === input.actorUserId) throw new ValidationError("you cannot change your own role or status; ask another admin");
75
77
  const before = getUser(input.userId);
76
78
  if (!before) throw new ValidationError("user not found");
77
- const user = updateUserAccess({ id: input.userId, role: input.role, status: input.status });
79
+ const user = (await updateUserAccessAsync({ id: input.userId, role: input.role, status: input.status }));
78
80
  if (user.role !== before.role || user.status !== before.status) await revokeUserSessions(user.id);
79
81
  return user;
80
82
  }
@@ -1,16 +1,13 @@
1
- import {
2
- deleteArtifactLinksForEntityAsync,
3
- linkArtifactAsync,
4
- updateUserProfile,
5
- } from "../db";
1
+ import { updateUserProfileAsync } from "../db/runtime-tail-async";
2
+ import { deleteArtifactLinksForEntityAsync, linkArtifactAsync } from "../db";
6
3
  import { normalizeDigest } from "../artifact-storage";
7
4
  import { storeArtifactWithReference } from "./artifact-write";
8
5
  import { bytesToStream } from "../http-body";
9
6
  import { emitRelayEvent } from "../events";
10
7
  import type { Artifact, User } from "../types";
11
8
 
12
- export function updateUserDisplayName(input: { userId: string; displayName: string }): User {
13
- const user = updateUserProfile({ id: input.userId, displayName: input.displayName });
9
+ export async function updateUserDisplayName(input: { userId: string; displayName: string }): Promise<User> {
10
+ const user = (await updateUserProfileAsync({ id: input.userId, displayName: input.displayName }));
14
11
  emitRelayEvent({ type: "user.updated", source: "server", subject: user.id, data: { user } });
15
12
  return user;
16
13
  }
@@ -44,14 +41,14 @@ export async function storeUserAvatar(input: {
44
41
  title: input.filename ?? "avatar",
45
42
  createdBy: input.actor,
46
43
  });
47
- const user = updateUserProfile({ id: input.userId, avatarArtifactId: artifact.id });
44
+ const user = (await updateUserProfileAsync({ id: input.userId, avatarArtifactId: artifact.id }));
48
45
  emitRelayEvent({ type: "user.avatar.updated", source: "server", subject: user.id, data: { user, artifact } });
49
46
  return { user, artifact };
50
47
  }
51
48
 
52
49
  export async function removeUserAvatar(input: { userId: string }): Promise<User> {
53
50
  await deleteArtifactLinksForEntityAsync("user", input.userId);
54
- const user = updateUserProfile({ id: input.userId, avatarArtifactId: null });
51
+ const user = (await updateUserProfileAsync({ id: input.userId, avatarArtifactId: null }));
55
52
  emitRelayEvent({ type: "user.avatar.removed", source: "server", subject: user.id, data: { user } });
56
53
  return user;
57
54
  }
@@ -1,3 +1,5 @@
1
+ import { getGateway } from "../db/gateway";
2
+ import { takeDeferredLineageReports, restoreDeferredLineageReports } from "../db/deferred-lineage-reports";
1
3
  // #1084 (Part D of #1079) — the work-window finality service. A "work-final" is a RELAY-LEVEL
2
4
  // mark anchored to explicit completion signals the platform already owns: `relay_workspace_ready`
3
5
  // (src/mcp/tools-workspace.ts), a task's execution status reaching `done` (src/services/task-entity.ts),
@@ -12,22 +14,32 @@
12
14
  // the original already-rendered session captures as `message.finalized` (so a bubble the dashboard
13
15
  // showed as ordinary mid-turn narration can be retroactively upgraded once its window closes).
14
16
  import type { MessageWorkFinalitySource } from "@humwick/sdk";
15
- import { flushWorkFinalReports, type WorkFinalFlushResult } from "../db/messages.ts";
17
+ import { applyLineageReportEffects, type WorkFinalFlushResult } from "../db/messages.ts";
16
18
  import { emitMessageFinalized, emitNewMessages } from "../sse.ts";
17
19
 
18
- export function markAgentWorkFinal(
20
+ export async function markAgentWorkFinal(
19
21
  agentId: string | undefined | null,
20
22
  source: MessageWorkFinalitySource,
21
23
  options: { includeStaleCompletedFinals?: boolean } = {},
22
- ): WorkFinalFlushResult {
24
+ ): Promise<WorkFinalFlushResult> {
23
25
  if (!agentId) return { forwarded: [], finalizedOriginals: [] };
24
- const result = flushWorkFinalReports(agentId, source, options);
26
+ const queues = takeDeferredLineageReports([agentId]);
27
+ const queue = queues[agentId];
28
+ if (!queue?.length) return { forwarded: [], finalizedOriginals: [] };
29
+ let result: WorkFinalFlushResult;
30
+ try {
31
+ result = await getGateway().write("messages.flushWorkFinal", { agentId, queue, source, options }) as unknown as WorkFinalFlushResult;
32
+ } catch (error) {
33
+ restoreDeferredLineageReports(queues);
34
+ throw error;
35
+ }
25
36
  emitWorkFinalityResult(result);
26
37
  return result;
27
38
  }
28
39
 
29
40
  /** Publish finality only after its synchronous or gateway-routed DB mutation commits. */
30
41
  export function emitWorkFinalityResult(result: WorkFinalFlushResult): void {
42
+ for (const report of result.forwarded) applyLineageReportEffects(report);
31
43
  const created = result.forwarded.filter((entry) => entry.created).map((entry) => entry.message);
32
44
  if (created.length > 0) emitNewMessages(created);
33
45
  for (const original of result.finalizedOriginals) emitMessageFinalized(original);