@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,3 +1,5 @@
1
+ import { markTaskAgentReapedAsync } from "../db/task-entity-async";
2
+ import { markWorkspaceCarryPendingAsync } from "../db/runtime-tail-async";
1
3
  // #831 — Task lifecycle automation ON LAND. The land event already knows the branch, commit,
2
4
  // backlink, and (worker-reported) gate ledger; this service turns that authoritative land into
3
5
  // the Task drive the coordinator otherwise hand-does (~40% of its tool calls): advance the
@@ -24,13 +26,7 @@
24
26
  import { errMessage } from "@humwick/sdk";
25
27
  import { boundTaskIdsForWorkspace } from "./workspace-task-binding";
26
28
  import { resolveLandedTaskIds, type LandedTaskAttributionInput } from "./landed-task-attribution";
27
- import {
28
- activeWorkspaceCarryPendingHeadsForTask,
29
- getAgent,
30
- getTaskDetail,
31
- markTaskAgentReaped,
32
- markWorkspaceCarryPending,
33
- } from "../db";
29
+ import { activeWorkspaceCarryPendingHeadsForTask, getAgent, getTaskDetail } from "../db";
34
30
  import { setTaskEntityStage, setTaskEntityStatus } from "./task-entity";
35
31
  import { carryPendingBlocker, carryPendingDiscardedHead, isCarryPendingBlocker, openCarryPendingBlocker } from "./carry-pending";
36
32
  import { postTaskMilestoneComment, taskCloseBridgeAsync, type TaskCloseBridgeEntry } from "./task-issue-weave";
@@ -142,13 +138,13 @@ export interface CarryPendingMarkResult {
142
138
  // records a second blocker rather than being swallowed as idempotent. SCOPED (preserves other
143
139
  // blockers); never reopens a terminal Task.
144
140
  // FAILS CLOSED: a swallowed marking failure would silently drop the guard, so failures flip `ok`.
145
- export function markWorkspaceTasksCarryPending(workspace: LifecycleWorkspace, discardedHead: string, log: LogFn = (m) => console.warn(m)): CarryPendingMarkResult {
141
+ export async function markWorkspaceTasksCarryPending(workspace: LifecycleWorkspace, discardedHead: string, log: LogFn = (m) => console.warn(m)): Promise<CarryPendingMarkResult> {
146
142
  const head = discardedHead.trim();
147
143
  if (!head) return { ok: true, marked: [], failed: [] };
148
144
  // 1) DURABLE WORKSPACE MARKER FIRST — its successful persistence is half the fail-closed signal.
149
145
  let markerRecorded = false;
150
146
  try {
151
- markerRecorded = markWorkspaceCarryPending(workspace.id, head);
147
+ markerRecorded = (await markWorkspaceCarryPendingAsync(workspace.id, head));
152
148
  } catch (error) {
153
149
  log(`#1456 carry-pending workspace marker write failed for ${workspace.id}: ${errMessage(error)}`);
154
150
  }
@@ -163,7 +159,7 @@ export function markWorkspaceTasksCarryPending(workspace: LifecycleWorkspace, di
163
159
  // Already have a blocker for THIS exact head? nothing to add (idempotent per head).
164
160
  if (existing.some((b) => isCarryPendingBlocker(b) && carryPendingDiscardedHead(b) === head)) { marked.push(taskId); continue; }
165
161
  try {
166
- setTaskEntityStatus(taskId, {
162
+ await setTaskEntityStatus(taskId, {
167
163
  status: "blocked",
168
164
  blockedBy: [...existing, carryPendingBlocker(head)],
169
165
  note: `#1456 carry-pending: delivered head ${head} was reverted (moved base); it must be confirmed carried before landing`,
@@ -227,7 +223,7 @@ function landKeyFor(input: LandedTaskLifecycleInput): string {
227
223
  return `land:${base}:${input.workspace.id}:${input.workspace.branch ?? "unknown"}`.slice(0, 240);
228
224
  }
229
225
 
230
- export function emitWorkspaceTaskSemanticNotifications(input: {
226
+ export async function emitWorkspaceTaskSemanticNotifications(input: {
231
227
  workspace: LifecycleWorkspace;
232
228
  transition: TaskSemanticTransition;
233
229
  actor?: string;
@@ -235,13 +231,13 @@ export function emitWorkspaceTaskSemanticNotifications(input: {
235
231
  idempotencyKey?: string;
236
232
  outcome?: Record<string, unknown>;
237
233
  sha?: string;
238
- }): number[] {
234
+ }): Promise<number[]> {
239
235
  const emitted: number[] = [];
240
236
  const coordinator = resolveCoordinatorAgentId(input.workspace.ownerAgentId ?? undefined);
241
237
  for (const taskId of boundTaskIdsForWorkspace(input.workspace)) {
242
238
  const task = getTaskDetail(taskId);
243
239
  if (!task) continue;
244
- emitTaskSemanticNotification({
240
+ await emitTaskSemanticNotification({
245
241
  task,
246
242
  transition: input.transition,
247
243
  actor: input.actor,
@@ -273,7 +269,7 @@ interface ReapResult {
273
269
  // exist (already gone → nothing to reap) and be `transient` (one-shot); a `persistent` worker
274
270
  // keeps running (land-and-continue). Idempotent: any bound Task already stamped `reapedAt` short-
275
271
  // circuits, so a re-land never re-reaps. Reuses the reaper's canonical shutdown path.
276
- function maybeReapOwnerWorker(workspace: LifecycleWorkspace, outcomes: TaskLandOutcome[]): ReapResult {
272
+ async function maybeReapOwnerWorker(workspace: LifecycleWorkspace, outcomes: TaskLandOutcome[]): Promise<ReapResult> {
277
273
  const driven = outcomes.filter((outcome) => !outcome.error);
278
274
  if (driven.length === 0) return { reaped: false, reason: "no-task-driven" };
279
275
  const agentId = workspace.ownerAgentId?.trim();
@@ -295,7 +291,7 @@ function maybeReapOwnerWorker(workspace: LifecycleWorkspace, outcomes: TaskLandO
295
291
  const blocker = automaticDisposalBlocker(agent, Date.now(), { requireIdle: false });
296
292
  if (blocker === "pending-own-run") return { reaped: false, agentId, reason: "pending-own-relay-run" };
297
293
  if (blocker) return { reaped: false, agentId, reason: blocker };
298
- requestTransientAgentShutdown(agent, {
294
+ (await requestTransientAgentShutdown(agent, {
299
295
  reason: "deliverable-landed",
300
296
  requestedBy: "task-lifecycle",
301
297
  workspaceId: workspace.id,
@@ -303,13 +299,13 @@ function maybeReapOwnerWorker(workspace: LifecycleWorkspace, outcomes: TaskLandO
303
299
  activityTitle: "One-shot worker reaped on land",
304
300
  activityBody: `All ${driven.length} bound deliverable(s) landed green; disposing one-shot worker ${agentId} to free its slot + quota`,
305
301
  landReason: "deliverable-landed",
306
- });
302
+ }));
307
303
  return { reaped: true, agentId };
308
304
  }
309
305
 
310
306
  // Stamp the reap marker on every bound Task + annotate the outcomes (the reap is decided ONCE at
311
307
  // owner level, then applied across the owner's tasks).
312
- function finalizeReap(outcomes: TaskLandOutcome[], reap: ReapResult, log: LogFn): void {
308
+ async function finalizeReap(outcomes: TaskLandOutcome[], reap: ReapResult, log: LogFn): Promise<void> {
313
309
  for (const outcome of outcomes) {
314
310
  if (outcome.error) continue;
315
311
  outcome.reaped = reap.reaped;
@@ -317,10 +313,10 @@ function finalizeReap(outcomes: TaskLandOutcome[], reap: ReapResult, log: LogFn)
317
313
  if (reap.reason) outcome.reapSkipReason = reap.reason;
318
314
  if (reap.reaped && reap.agentId) {
319
315
  try {
320
- markTaskAgentReaped(outcome.taskId, { agentId: reap.agentId, reason: "deliverable-landed" });
316
+ (await markTaskAgentReapedAsync(outcome.taskId, { agentId: reap.agentId, reason: "deliverable-landed" }));
321
317
  const task = getTaskDetail(outcome.taskId);
322
318
  if (task && task.status !== "done" && isAgentExitDoneWhen(task.doneWhen)) {
323
- setTaskEntityStatus(outcome.taskId, {
319
+ await setTaskEntityStatus(outcome.taskId, {
324
320
  status: validationCompletionStatus(task.validationItems),
325
321
  note: "doneWhen=agent-exit satisfied by worker reap after land",
326
322
  actor: "task-lifecycle",
@@ -375,7 +371,7 @@ async function driveTaskOnLand(
375
371
  if (wsHeads.length > 0) {
376
372
  carryHead = wsHeads[0];
377
373
  try {
378
- setTaskEntityStatus(taskId, {
374
+ await setTaskEntityStatus(taskId, {
379
375
  status: "blocked",
380
376
  blockedBy: [...(before.blockedBy ?? []), ...wsHeads.map(carryPendingBlocker)],
381
377
  note: `#1456 carry-pending (inherited from workspace ${input.workspace.id}): delivered head(s) ${wsHeads.join(", ")} were reverted; confirm the carry before landing`,
@@ -405,7 +401,7 @@ async function driveTaskOnLand(
405
401
  // 1 + 2 (deliverable-position axis) — advance the stage to `landed-on-main` and ATTACH the
406
402
  // landed commit (idempotent append). The execution `status` axis is handled separately below.
407
403
  const commit = input.mergedSha ? { sha: input.mergedSha, ...(input.subject ? { subject: input.subject } : {}) } : undefined;
408
- let detail = setTaskEntityStage(taskId, {
404
+ let detail = await setTaskEntityStage(taskId, {
409
405
  deliverableStage: "landed-on-main",
410
406
  ...(input.workspace.branch ? { branch: input.workspace.branch } : {}),
411
407
  ...(commit ? { commit } : {}),
@@ -480,14 +476,14 @@ async function driveTaskOnLand(
480
476
  // the owner-level reap decision so `reaped` is accurate. A deliverable-LEVEL event ("task
481
477
  // deliverable landed", not "commit X merged") through the existing bus; #835 enriches the
482
478
  // audience/subscription layer on top of this same event.
483
- function emitDeliverableLandedEvent(input: LandedTaskLifecycleInput, outcome: TaskLandOutcome): void {
479
+ async function emitDeliverableLandedEvent(input: LandedTaskLifecycleInput, outcome: TaskLandOutcome): Promise<void> {
484
480
  const landKey = landKeyFor(input);
485
481
  if (outcome.deliveredTipSuperseded) {
486
- emitDeliverableSupersededEvent(input, outcome, landKey);
482
+ await emitDeliverableSupersededEvent(input, outcome, landKey);
487
483
  return;
488
484
  }
489
485
  if (outcome.error) {
490
- emitDeliverableErrorReceipt(input, outcome, landKey);
486
+ await emitDeliverableErrorReceipt(input, outcome, landKey);
491
487
  return;
492
488
  }
493
489
  emitRelayEvent({
@@ -513,7 +509,7 @@ function emitDeliverableLandedEvent(input: LandedTaskLifecycleInput, outcome: Ta
513
509
  const task = getTaskDetail(outcome.taskId);
514
510
  if (!task) return;
515
511
  const coordinator = resolveCoordinatorAgentId(input.workspace.ownerAgentId ?? undefined);
516
- emitTaskSemanticNotification({
512
+ await emitTaskSemanticNotification({
517
513
  task,
518
514
  transition: "landed-on-main",
519
515
  actor: "task-lifecycle",
@@ -530,7 +526,7 @@ function emitDeliverableLandedEvent(input: LandedTaskLifecycleInput, outcome: Ta
530
526
  // be proven to have reached `main` after a moved-base revert. Routed durably (ttl null) to the
531
527
  // coordinator AND the branch owner so it is confirmed/re-landed — the Task was held at `blocked`
532
528
  // (non-terminal, recoverable), NOT landed-on-main, so the tracker never reports a phantom landing.
533
- function emitDeliverableSupersededEvent(input: LandedTaskLifecycleInput, outcome: TaskLandOutcome, landKey: string): void {
529
+ async function emitDeliverableSupersededEvent(input: LandedTaskLifecycleInput, outcome: TaskLandOutcome, landKey: string): Promise<void> {
534
530
  emitRelayEvent({
535
531
  type: "task.deliverable_landed",
536
532
  source: "server",
@@ -558,7 +554,7 @@ function emitDeliverableSupersededEvent(input: LandedTaskLifecycleInput, outcome
558
554
  const createdBy = task?.createdBy?.trim();
559
555
  const recipients = [...new Set([coordinator, taskOwnerTarget(task), owner].filter((r): r is string => Boolean(r)))];
560
556
  if (recipients.length === 0) return;
561
- routeNotification({
557
+ await routeNotification({
562
558
  type: "task.land_conflict",
563
559
  scope: {
564
560
  taskId: String(outcome.taskId),
@@ -594,13 +590,13 @@ function emitDeliverableSupersededEvent(input: LandedTaskLifecycleInput, outcome
594
590
  });
595
591
  }
596
592
 
597
- function emitDeliverableErrorReceipt(input: LandedTaskLifecycleInput, outcome: TaskLandOutcome, landKey: string): void {
593
+ async function emitDeliverableErrorReceipt(input: LandedTaskLifecycleInput, outcome: TaskLandOutcome, landKey: string): Promise<void> {
598
594
  const coordinator = resolveCoordinatorAgentId(input.workspace.ownerAgentId ?? undefined);
599
595
  const task = getTaskDetail(outcome.taskId);
600
596
  const ownerTarget = task?.owner ? taskOwnerTarget(task) : undefined;
601
597
  const recipients = [coordinator, ownerTarget].filter((id): id is string => Boolean(id)).map((agentId) => ({ agentId, matchedRule: "task-stakeholder" }));
602
598
  if (!recipients.length) return;
603
- routeNotification({
599
+ await routeNotification({
604
600
  type: "task.landed",
605
601
  scope: {
606
602
  taskId: String(outcome.taskId),
@@ -662,7 +658,7 @@ export async function handleLandedTaskLifecycle(
662
658
  // Reap (step 5) is decided ONCE at owner level, only when ALL bound tasks are satisfied — then
663
659
  // applied/annotated across the outcomes. The deliverable event is emitted after, with the
664
660
  // accurate `reaped`.
665
- finalizeReap(outcomes, maybeReapOwnerWorker(input.workspace, outcomes), log);
666
- for (const outcome of outcomes) emitDeliverableLandedEvent(input, outcome);
661
+ await finalizeReap(outcomes, (await maybeReapOwnerWorker(input.workspace, outcomes)), log);
662
+ for (const outcome of outcomes) await emitDeliverableLandedEvent(input, outcome);
667
663
  return { handled: true, tasks: outcomes };
668
664
  }
@@ -0,0 +1,37 @@
1
+ import { stringValue, type AgentCard } from "@humwick/sdk";
2
+ import { getAgent, getTaskDetailAsync, getTeam, listProjects, rootsForProject, workspaceRepoRootForCwd, ValidationError } from "../db";
3
+ import { isPathWithinBase } from "../utils";
4
+
5
+ // #3769 — workflows and role spawns resolve the same Task checkout, including callers in worktrees.
6
+ export async function taskLinkedRepoCwd(taskId: number, callerCwd?: string, caller?: AgentCard): Promise<string> {
7
+ const task = await getTaskDetailAsync(taskId);
8
+ if (!task) throw new ValidationError(`task ${taskId} not found or not a deliverable task`);
9
+ // #2844 — a Task created with `repo:` but no linked issue still names its project repo.
10
+ const repos = [...new Set([...task.issues.map((issue) => issue.repo), task.repo].filter((repo): repo is string => Boolean(repo)))];
11
+ if (repos.length === 0) {
12
+ throw new ValidationError(`task ${taskId} has no linked issue repo; pass cwd/orchestratorId explicitly`);
13
+ }
14
+ const candidates = listProjects()
15
+ .filter((project) => project.issueRepo && repos.includes(project.issueRepo))
16
+ .flatMap((project) => rootsForProject(project.id).map((root) => ({ project, root })));
17
+ if (candidates.length === 0) {
18
+ // #1627 — only registered roots can resolve a repo to a host checkout.
19
+ throw new ValidationError(`task ${taskId} links repo ${repos.join(", ")} but no Relay project root is registered for it, so relay cannot resolve a checkout path for it; pass cwd + orchestratorId explicitly, or register the checkout with relay_project_add_root`);
20
+ }
21
+ const team = caller?.teamId ? getTeam(caller.teamId) : null;
22
+ const rootTeam = team?.parentTeamId ? getTeam(team.parentTeamId) : team;
23
+ const coordinator = rootTeam?.coordinatorId ? getAgent(rootTeam.coordinatorId) : null;
24
+ const sources = [callerCwd, caller?.branchWorkspaceProjectRoot, stringValue(coordinator?.meta?.cwd)];
25
+ for (const source of sources) {
26
+ if (!source) continue;
27
+ const sourceCwd = workspaceRepoRootForCwd(source) ?? source;
28
+ const matching = candidates.filter(candidate => isPathWithinBase(sourceCwd, candidate.root.rootPath))
29
+ .sort((a, b) => b.root.rootPath.length - a.root.rootPath.length)[0];
30
+ if (matching) return matching.root.rootPath;
31
+ }
32
+ const projectId = team?.projectId ?? rootTeam?.projectId ?? task.projectId;
33
+ const preferred = projectId ? candidates.filter(candidate => candidate.project.id === projectId) : [];
34
+ const paths = [...new Set((preferred.length ? preferred : candidates).map(candidate => candidate.root.rootPath))];
35
+ if (paths.length === 1) return paths[0]!;
36
+ throw new ValidationError(`task ${taskId} links repo ${repos.join(", ")} with multiple registered roots; pass cwd explicitly`);
37
+ }
@@ -17,19 +17,7 @@
17
17
  import { getCommandAsync } from "../commands-write";
18
18
  import { settleWorkspaceMergeCommand } from "../workspace-command-settle";
19
19
  import { errMessage, isRecord } from "@humwick/sdk";
20
- import {
21
- ReviewHoldConflictError,
22
- clearTaskReviewHoldAsync,
23
- getTaskDetail,
24
- getWorkspace,
25
- latestClearedReviewPromotion,
26
- taskPendingReviewDelivery,
27
- setTaskReviewHoldAsync,
28
- unsettledTaskMergeCommandIdsAsync,
29
- type ClearTaskReviewHoldResult,
30
- type ClearTaskReviewHoldBodyInput,
31
- type SetTaskReviewHoldResult,
32
- } from "../db";
20
+ import { ReviewHoldConflictError, clearTaskReviewHoldAsync, getTaskDetail, getWorkspace, latestClearedReviewPromotion, taskPendingReviewDelivery, setTaskReviewHoldAsync, unsettledTaskMergeCommandIdsAsync, type ClearTaskReviewHoldResult, type ClearTaskReviewHoldBodyInput, type SetTaskReviewHoldResult, ValidationError } from "../db";
33
21
  import { emitNewMessages, emitTaskChanged } from "../sse";
34
22
  import { routeNotification } from "../notification-router";
35
23
  import { COORDINATOR_AUTHORITY_HINT, callerHasTaskCoordinatorAuthority } from "../coordinator-authority";
@@ -42,7 +30,6 @@ import { landStoppedFact } from "../workspace-land-stopped";
42
30
  import { headLand } from "../workspace-recorded-land";
43
31
  import { reviewedHeadMatches } from "../db/task-review-hold";
44
32
  import { ServiceAuthError } from "./errors";
45
- import { ValidationError } from "../db";
46
33
  import type { AuthContext } from "./auth-context";
47
34
  import type { TaskDetail } from "../types";
48
35
  import { taskOwnerTarget } from "../task-owner";
@@ -79,10 +66,10 @@ export function canControlTaskReviewHold(ctx: AuthContext, task: Pick<TaskDetail
79
66
  return callerHasTaskCoordinatorAuthority(ctx.callerAgentId, task);
80
67
  }
81
68
 
82
- function notifyReviewHoldCleared(task: TaskDetail, promoted: { eventId: number; workspaceId: string; sourceHeadSha: string } | undefined): void {
69
+ async function notifyReviewHoldCleared(task: TaskDetail, promoted: { eventId: number; workspaceId: string; sourceHeadSha: string } | undefined): Promise<void> {
83
70
  if (!promoted) return;
84
71
  const recipients = [...new Set([task.ownerAgentId, taskOwnerTarget(task)].filter((item): item is string => Boolean(item && item.trim())))];
85
- const delivered = routeNotification({
72
+ const delivered = await routeNotification({
86
73
  type: "task.review-hold.cleared",
87
74
  scope: {
88
75
  taskId: String(task.id),
@@ -233,7 +220,7 @@ export async function setTaskReviewHoldControl(input: SetTaskReviewHoldControlIn
233
220
  if (detail) emitTaskChanged(detail, input.held ? "task.review-hold.set" : "task.review-hold.cleared");
234
221
  let landingHandoff: number | undefined;
235
222
  if (promoted) {
236
- if (detail) notifyReviewHoldCleared(detail, promoted);
223
+ if (detail) await notifyReviewHoldCleared(detail, promoted);
237
224
  // Re-drive the ready/schedule effect for the promoted delivery (the held park deferred it;
238
225
  // the promotion supplies the authorization the sweep needs).
239
226
  landingHandoff = await reDrivePromotedLanding(task.id, promoted, actor, input.landingOperationId);
@@ -1,6 +1,8 @@
1
+ import { framed } from "../hub-metrics";
2
+ import { addSubscriptionAsync } from "../db/lifecycle-tail-async";
1
3
  import { guardedTimeout, LEGACY_HUMAN_AGENT_ID } from "@humwick/sdk";
2
4
  import { getAgent } from "../db";
3
- import { addSubscription } from "../db/notification-subscriptions";
5
+
4
6
  import { getTaskOwnerFacet } from "../db/task-owner";
5
7
  import { isGoneAgentRecipient, resolveTaskOwnerAgentId, seatAgentIdOf, taskCoordinatorTarget, taskOwnerTarget, withoutSeatDuplicates } from "../task-owner";
6
8
  import { emitRelayEvent } from "../events";
@@ -99,7 +101,7 @@ interface StatusPulseBatch {
99
101
 
100
102
  const statusPulseBatches = new Map<string, StatusPulseBatch>();
101
103
 
102
- export function autoSubscribeTaskCoordinator(agentId: string | undefined, taskId: number): boolean {
104
+ export async function autoSubscribeTaskCoordinator(agentId: string | undefined, taskId: number): Promise<boolean> {
103
105
  const cleaned = agentId?.trim();
104
106
  if (!cleaned || !getAgent(cleaned)) return false;
105
107
  // #2862 — the owner (role seat or human) is addressed by every notice; a per-agent subscription
@@ -107,17 +109,17 @@ export function autoSubscribeTaskCoordinator(agentId: string | undefined, taskId
107
109
  const facet = getTaskOwnerFacet(taskId);
108
110
  if (facet?.owner && resolveTaskOwnerAgentId(facet) === cleaned) return true;
109
111
  for (const transition of TASK_NOTIFICATION_TRANSITIONS) {
110
- addSubscription({
112
+ (await addSubscriptionAsync({
111
113
  agentId: cleaned,
112
114
  type: TASK_NOTIFICATION_TYPE[transition],
113
115
  mode: "opt_in",
114
116
  scopeMatch: { taskId: String(taskId) },
115
- });
117
+ }));
116
118
  }
117
119
  return true;
118
120
  }
119
121
 
120
- export function emitTaskSemanticNotification(input: TaskSemanticNotificationInput): void {
122
+ export async function emitTaskSemanticNotification(input: TaskSemanticNotificationInput): Promise<void> {
121
123
  const type = TASK_NOTIFICATION_TYPE[input.transition as KnownTaskSemanticTransition] ?? UNKNOWN_TASK_NOTIFICATION_TYPE;
122
124
  const scope = taskNotificationScope(input);
123
125
  const semanticEvent = `task.${input.transition}`;
@@ -166,7 +168,7 @@ export function emitTaskSemanticNotification(input: TaskSemanticNotificationInpu
166
168
  .map((recipient) => ({ ...recipient, agentId: seatAgentIdOf(recipient.agentId) }));
167
169
  for (const recipient of dedupeRecipients(seated)) {
168
170
  if (recipient.agentId === input.actor) continue;
169
- enqueueStatusPulse(recipient.agentId, {
171
+ await enqueueStatusPulse(recipient.agentId, {
170
172
  taskId: input.task.id,
171
173
  title: input.task.title,
172
174
  transition: input.transition,
@@ -181,7 +183,7 @@ export function emitTaskSemanticNotification(input: TaskSemanticNotificationInpu
181
183
  return;
182
184
  }
183
185
 
184
- routeNotification({
186
+ await routeNotification({
185
187
  type,
186
188
  scope,
187
189
  recipients,
@@ -239,18 +241,18 @@ function pulseSupersededByLifecycle(agentId: string, item: StatusPulseDigestItem
239
241
  || (item.sha !== undefined && hasRecentLifecycleSignal(agentId, taskSignalKey(item.taskId, item.transition, item.sha)));
240
242
  }
241
243
 
242
- function enqueueStatusPulse(agentId: string, item: StatusPulseDigestItem): void {
244
+ async function enqueueStatusPulse(agentId: string, item: StatusPulseDigestItem): Promise<void> {
243
245
  if (pulseSupersededByLifecycle(agentId, item)) return; // #1032b/#1038
244
246
  const batch = statusPulseBatches.get(agentId) ?? { items: [] };
245
247
  batch.items.push(item);
246
248
  if (!batch.timer) {
247
249
  // #3643 — the flush writes a message; a BUSY thrown from a bare timer exited the hub.
248
- batch.timer = guardedTimeout(`[task-status-pulse] flush for ${agentId}`, TASK_STATUS_PULSE_BATCH_MS, () => flushTaskStatusPulses(agentId));
250
+ batch.timer = guardedTimeout(`[task-status-pulse] flush for ${agentId}`, TASK_STATUS_PULSE_BATCH_MS, framed("timer task-status-pulse", () => flushTaskStatusPulses(agentId)));
249
251
  }
250
252
  statusPulseBatches.set(agentId, batch);
251
253
  }
252
254
 
253
- export function flushTaskStatusPulses(agentId?: string): void {
255
+ export async function flushTaskStatusPulses(agentId?: string): Promise<void> {
254
256
  const targets = agentId ? [agentId] : [...statusPulseBatches.keys()];
255
257
  for (const target of targets) {
256
258
  const batch = statusPulseBatches.get(target);
@@ -263,7 +265,7 @@ export function flushTaskStatusPulses(agentId?: string): void {
263
265
  const fresh = batch.items.filter((item) => !pulseSupersededByLifecycle(target, item));
264
266
  if (fresh.length === 0) continue;
265
267
  const items = compactStatusPulseItems(fresh);
266
- notifySystemMessage(target, {
268
+ await notifySystemMessage(target, {
267
269
  subject: `Task status pulse (${items.length})`,
268
270
  body: taskStatusPulseBody(items),
269
271
  payload: {
@@ -4,8 +4,9 @@
4
4
  // live in src/db/task-state-reconcile.ts; every change is applied by its conditional writer, which
5
5
  // re-checks the rule in the transaction, then audited here with one `task.reconciled` relay event.
6
6
  import { errMessage } from "@humwick/sdk";
7
- import { isSqliteBusyError, withFastFailConnection, writerLockAvailable } from "../db/connection";
8
- import { getIssueRef, updateIssueRef } from "../db/issue-refs";
7
+ import { getGateway } from "../db/gateway";
8
+ import { getIssueRef } from "../db/issue-refs";
9
+ import { updateIssueRefAsync } from "../db/issue-refs-async";
9
10
  import { applyTaskStateReconcileAsync, listTaskStateReconcileCandidatesAsync } from "../db/task-state-reconcile-async";
10
11
  import { TASK_RECONCILE_ACTOR, type TaskReconcileRule, type TaskStateReconcileApplied } from "../db/task-state-reconcile";
11
12
  import { emitRelayEvent } from "../events";
@@ -24,7 +25,6 @@ const ISSUE_REFRESHES_PER_RUN = 20;
24
25
  const ISSUE_REFRESH_BACKOFF_MS = 60 * 60_000;
25
26
  const CANDIDATE_LIMIT = 100;
26
27
  /** A write step waits this long for another writer's lock before the run steps aside (the shared connection waits ~1 s). */
27
- const STEP_BUSY_TIMEOUT_MS = 40;
28
28
 
29
29
  export interface TaskStateReconcileOptions {
30
30
  now?: number;
@@ -55,7 +55,7 @@ const refreshFailedAt = new Map<string, number>();
55
55
 
56
56
  /** Post-commit effects of one applied change: the SSE/semantic pulse, plan refs and the audit event. */
57
57
  async function publishApplied(applied: TaskStateReconcileApplied): Promise<void> {
58
- emitStatusChangeEffects(applied.before, applied.detail, TASK_RECONCILE_ACTOR, undefined);
58
+ await emitStatusChangeEffects(applied.before, applied.detail, TASK_RECONCILE_ACTOR, undefined);
59
59
  if (applied.detail.status === "done") await advanceTerminalPlanRefsAsync({ taskId: applied.detail.id, actor: TASK_RECONCILE_ACTOR });
60
60
  emitRelayEvent({
61
61
  type: "task.reconciled",
@@ -84,7 +84,7 @@ function stepRunner(opts: TaskStateReconcileOptions, result: TaskStateReconcileR
84
84
  }
85
85
  },
86
86
  contended() {
87
- if (writerLockAvailable(STEP_BUSY_TIMEOUT_MS)) return false;
87
+ if (!getGateway().stats.writer.busy && getGateway().stats.writer.queued === 0) return false;
88
88
  result.moreWork = true;
89
89
  return true;
90
90
  },
@@ -104,19 +104,10 @@ async function refreshIssueRefs(refIds: string[], opts: TaskStateReconcileOption
104
104
  try {
105
105
  const live = await (opts.adapterResolver ?? resolveIssueTrackerAdapter)(ref).getStatus(ref);
106
106
  const status = live.status === "open" || live.status === "closed" ? live.status : ref.status;
107
- // The tracker read can take long: re-check the lock right before the write, and bound the write itself.
107
+ // The tracker read can take long: re-check the lock right before the write. The write itself waits on
108
+ // the writer thread, never on the loop (#1870 S7).
108
109
  if (steps.contended()) break;
109
- const written = await steps.timed(() => {
110
- try {
111
- withFastFailConnection(STEP_BUSY_TIMEOUT_MS, () => updateIssueRef(ref.id, { status, title: live.title, closeReason: live.closeReason, statusSyncedAt: Date.now() }));
112
- return true;
113
- } catch (error) {
114
- if (!isSqliteBusyError(error)) throw error;
115
- result.moreWork = true;
116
- return false;
117
- }
118
- });
119
- if (!written) break;
110
+ await updateIssueRefAsync(ref.id, { status, title: live.title, closeReason: live.closeReason, statusSyncedAt: Date.now() });
120
111
  closedAny ||= status === "closed";
121
112
  } catch (error) {
122
113
  refreshFailedAt.set(id, now);
@@ -21,12 +21,12 @@ export async function setTaskValidationControl(taskId: number, input: SetTaskVal
21
21
  const actor = ctx.callerAgentId ?? ctx.actor.id;
22
22
  const result = await getGateway().write("taskEntity.setValidation", { id: taskId, input, actor }, { critical: true, idempotencyKey }) as unknown as { task: TaskDetail; eventId: number; item: TaskValidationItem };
23
23
  emitTaskChanged(result.task, "task.validation");
24
- if (before.status !== result.task.status) emitStatusChangeEffects(before, result.task, actor, String(result.eventId));
24
+ if (before.status !== result.task.status) await emitStatusChangeEffects(before, result.task, actor, String(result.eventId));
25
25
  if (result.item.status === "failed") {
26
26
  const coordinator = (result.task.owner ? taskOwnerTarget(result.task) : undefined)
27
27
  ?? (result.task.teamId ? resolveTeamCoordinatorAgentId(result.task.teamId) : undefined)
28
28
  ?? resolveCoordinatorAgentId(result.task.ownerAgentId) ?? result.task.createdBy;
29
- emitTaskSemanticNotification({ task: result.task, transition: "gate-failed", actor, occurrenceKey: String(result.eventId), recipients: coordinator ? [coordinator] : [], outcome: { gate: "validation", detail: `${result.item.criterion}: ${result.item.note ?? "failed"}`, validationItem: result.item } });
29
+ await emitTaskSemanticNotification({ task: result.task, transition: "gate-failed", actor, occurrenceKey: String(result.eventId), recipients: coordinator ? [coordinator] : [], outcome: { gate: "validation", detail: `${result.item.criterion}: ${result.item.note ?? "failed"}`, validationItem: result.item } });
30
30
  }
31
31
  if (before.status !== "done" && result.task.status === "done") await advanceTerminalPlanRefsAsync({ taskId, actor });
32
32
  return result.task;
@@ -1,6 +1,7 @@
1
1
  import { isRecord, SPAWN_PROVIDERS, VALID_WORKSPACE_MODES, APPROVAL_MODES, VALID_AGENT_LIFECYCLES } from "@humwick/sdk";
2
2
  import { getTeam, ValidationError } from "../db";
3
- import { deleteConfig, getConfig, listConfig, setConfig } from "../config-store";
3
+ import { getConfig, listConfig } from "../config-store";
4
+ import { deleteConfigAsync, setConfigAsync } from "../config-store-write";
4
5
  import { TEAM_TEMPLATE_NAMESPACE } from "../team-template-config";
5
6
  import { cleanString, optionalEnum } from "../validation";
6
7
  import type { AuthContext } from "./auth-context";
@@ -21,7 +22,7 @@ interface TeamTemplateInstantiateInput {
21
22
 
22
23
  interface TeamTemplateInstantiateResult {
23
24
  template: TeamTemplate;
24
- team: ReturnType<typeof setCallerTeamBrief>["team"];
25
+ team: Awaited<ReturnType<typeof setCallerTeamBrief>>["team"];
25
26
  spawned: SpawnAgentResult[];
26
27
  }
27
28
 
@@ -47,11 +48,11 @@ function withTimestamps(template: TeamTemplate, existing?: TeamTemplate): TeamTe
47
48
  };
48
49
  }
49
50
 
50
- export function saveTeamTemplate(input: Record<string, unknown>, updatedBy?: string): TeamTemplate {
51
+ export async function saveTeamTemplateAsync(input: Record<string, unknown>, updatedBy?: string): Promise<TeamTemplate> {
51
52
  if (input.teamId !== undefined && input.composition !== undefined) {
52
53
  throw new ValidationError("teamId capture and manual composition are mutually exclusive");
53
54
  }
54
- if (input.teamId !== undefined) return captureTeamTemplateFromTeam(cleanString(input.teamId, "teamId", { required: true, max: 120 })!, input, updatedBy);
55
+ if (input.teamId !== undefined) return captureTeamTemplateFromTeamAsync(cleanString(input.teamId, "teamId", { required: true, max: 120 })!, input, updatedBy);
55
56
  const slug = templateSlug(input);
56
57
  const existing = getConfig<TeamTemplate>(TEAM_TEMPLATE_NAMESPACE, slug)?.value;
57
58
  const template = withTimestamps({
@@ -64,7 +65,7 @@ export function saveTeamTemplate(input: Record<string, unknown>, updatedBy?: str
64
65
  ...(cleanString(input.definitionOfDone, "definitionOfDone", { max: 4000 }) ? { definitionOfDone: cleanString(input.definitionOfDone, "definitionOfDone", { max: 4000 }) } : {}),
65
66
  ...(input.planSkeleton !== undefined ? { planSkeleton: input.planSkeleton as TeamTemplate["planSkeleton"] } : {}),
66
67
  }, existing);
67
- return setConfig(TEAM_TEMPLATE_NAMESPACE, template.slug, template, updatedBy).value as TeamTemplate;
68
+ return (await setConfigAsync(TEAM_TEMPLATE_NAMESPACE, template.slug, template, updatedBy)).value as TeamTemplate;
68
69
  }
69
70
 
70
71
  export function listTeamTemplates(): TeamTemplate[] {
@@ -75,8 +76,8 @@ export function getTeamTemplate(slug: string): TeamTemplate | null {
75
76
  return getConfig<TeamTemplate>(TEAM_TEMPLATE_NAMESPACE, slug)?.value ?? null;
76
77
  }
77
78
 
78
- export function deleteTeamTemplate(slug: string, updatedBy?: string): boolean {
79
- return deleteConfig(TEAM_TEMPLATE_NAMESPACE, slug, updatedBy);
79
+ export async function deleteTeamTemplateAsync(slug: string, updatedBy?: string): Promise<boolean> {
80
+ return (await deleteConfigAsync(TEAM_TEMPLATE_NAMESPACE, slug, updatedBy));
80
81
  }
81
82
 
82
83
  function parseFrozenComposition(raw: string): Array<Record<string, unknown>> {
@@ -107,7 +108,7 @@ function compositionFromFrozenSnapshot(raw: string): TeamTemplateCompositionEntr
107
108
  return composition;
108
109
  }
109
110
 
110
- export function captureTeamTemplateFromTeam(teamId: string, input: Record<string, unknown> = {}, updatedBy?: string): TeamTemplate {
111
+ export async function captureTeamTemplateFromTeamAsync(teamId: string, input: Record<string, unknown> = {}, updatedBy?: string): Promise<TeamTemplate> {
111
112
  const team = getTeam(teamId);
112
113
  if (!team) throw new ValidationError(`team ${teamId} not found`);
113
114
  if (!team.composition) throw new ValidationError("team has no frozen composition snapshot; dissolve it before capture");
@@ -123,7 +124,7 @@ export function captureTeamTemplateFromTeam(teamId: string, input: Record<string
123
124
  ...(team.brief ? { brief: team.brief } : {}),
124
125
  ...(team.definitionOfDone ? { definitionOfDone: team.definitionOfDone } : {}),
125
126
  }, existing);
126
- return setConfig(TEAM_TEMPLATE_NAMESPACE, template.slug, template, updatedBy).value as TeamTemplate;
127
+ return (await setConfigAsync(TEAM_TEMPLATE_NAMESPACE, template.slug, template, updatedBy)).value as TeamTemplate;
127
128
  }
128
129
 
129
130
  function cleanWait(value: unknown): number {
@@ -157,11 +158,11 @@ export async function instantiateTeamTemplate(input: TeamTemplateInstantiateInpu
157
158
  const slug = cleanString(input.slug, "slug", { required: true, max: 120 })!;
158
159
  const template = getTeamTemplate(slug);
159
160
  if (!template) throw new ValidationError(`team template ${slug} not found`);
160
- const teamPayload = setCallerTeamBrief(ctx, {
161
+ const teamPayload = (await setCallerTeamBrief(ctx, {
161
162
  title: template.title,
162
163
  brief: template.brief,
163
164
  definitionOfDone: template.definitionOfDone,
164
- });
165
+ }));
165
166
  const spawned: SpawnAgentResult[] = [];
166
167
  for (const entry of template.composition) {
167
168
  for (let i = 0; i < entry.count; i++) {