@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,8 +1,9 @@
1
+ import { setConfigAsync } from "./config-store-write";
1
2
  // #2855 — DB-backed readers for per-host provider enablement. Separate from
2
3
  // host-provider-enablement.ts (a config-store-imported leaf) so this module can
3
4
  // import getConfig/listConfig without closing a cycle.
4
5
  import { errMessage, type SpawnProvider } from "@humwick/sdk";
5
- import { getConfig, listConfig, setConfig } from "./config-store";
6
+ import { getConfig, listConfig } from "./config-store";
6
7
  import { listOrchestratorIds } from "./db";
7
8
  import {
8
9
  HOST_PROVIDER_ENABLEMENT_NAMESPACE,
@@ -75,11 +76,11 @@ export function hostProviderRefusal(hostId: string, provider: SpawnProvider): st
75
76
  /** One-time env migration: missing/unmarked rows merge omitted disables
76
77
  * without touching operator entries. In-env opt-ins store explicit true;
77
78
  * everything else outside env seeds as disabled. */
78
- export function seedHostProvidersFromEnv(
79
+ export async function seedHostProvidersFromEnv(
79
80
  hostId: string,
80
81
  envProviders: readonly string[],
81
82
  switchableCatalog: readonly SpawnProvider[],
82
- ): HostProviderEnablementSetting | null {
83
+ ): Promise<HostProviderEnablementSetting | null> {
83
84
  const existing = getHostProviderSetting(hostId);
84
85
  if (existing?.seeded) return null;
85
86
  const env = new Set(envProviders);
@@ -98,5 +99,5 @@ export function seedHostProvidersFromEnv(
98
99
  providers[provider] = { enabled: false, reason: "migrated from host env list" };
99
100
  }
100
101
  }
101
- return setConfig(HOST_PROVIDER_ENABLEMENT_NAMESPACE, hostId, { providers, seeded: true }, "migration-seed").value;
102
+ return (await setConfigAsync(HOST_PROVIDER_ENABLEMENT_NAMESPACE, hostId, { providers, seeded: true }, "migration-seed")).value;
102
103
  }
@@ -20,6 +20,7 @@ export function hubMetricsReport(now = Date.now()) {
20
20
  const emits = emitTable.snapshot(now);
21
21
  const readerOps = readerOpTable.snapshot(now);
22
22
  const cpuMs = callers.reduce((total, row) => total + row.cpuMs, 0);
23
+ const backgroundCpuMs = callers.find((row) => row.key === BACKGROUND_KEY)?.cpuMs ?? 0;
23
24
  const calls = callers.reduce((total, row) => total + row.count, 0);
24
25
  return {
25
26
  generatedAt: now,
@@ -28,7 +29,9 @@ export function hubMetricsReport(now = Date.now()) {
28
29
  mainThread: {
29
30
  cpuMs: Math.round(cpuMs),
30
31
  cpuPct: Math.round((cpuMs / windowMs) * 10_000) / 100,
31
- backgroundCpuMs: Math.round(callers.find((row) => row.key === BACKGROUND_KEY)?.cpuMs ?? 0),
32
+ backgroundCpuMs: Math.round(backgroundCpuMs),
33
+ // #3798 — the share of main-thread CPU a named frame (route, bus frame, timer, job) accounts for.
34
+ namedCpuPct: cpuMs > 0 ? Math.round(((cpuMs - backgroundCpuMs) / cpuMs) * 10_000) / 100 : 100,
32
35
  },
33
36
  callers: {
34
37
  count: calls,
@@ -62,6 +65,7 @@ export function hubLoadCheck(now = Date.now()): HealthCheck {
62
65
  busConnections: report.connections.bus,
63
66
  callsPerSec: report.callers.perSec,
64
67
  mainThreadCpuPct: report.mainThread.cpuPct,
68
+ mainThreadNamedCpuPct: report.mainThread.namedCpuPct,
65
69
  },
66
70
  };
67
71
  }
@@ -4,7 +4,7 @@
4
4
  // so caller CPU is split at marks (caller start/end, reader resumes): the CPU between two marks goes
5
5
  // to the caller that ran. docs/operations.md "Hub load metrics" describes the model and its limits.
6
6
 
7
- import { runWithLoopCallsite } from "./loop-block-attribution";
7
+ import { resolveLoopCallsite, runWithLoopCallsite, type LoopCallsiteContext } from "./loop-block-attribution";
8
8
 
9
9
  const BUCKET_MS = 10_000;
10
10
  const BUCKETS = 6;
@@ -109,25 +109,45 @@ export function markCallerResume(owner: string | undefined): void {
109
109
  ledgerOwner = owner;
110
110
  }
111
111
 
112
- /** Run `run` as caller `key`: one request or frame, its wall time and its main-thread CPU segments. */
113
- export async function trackCaller<T>(key: string, run: () => T | Promise<T>): Promise<T> {
114
- const startedAt = performance.now();
115
- markCallerResume(key);
116
- try {
117
- return await run();
118
- } finally {
119
- // The code finishing the caller is the caller itself, so the segment since the last mark is its own.
120
- const now = Date.now();
121
- settleCpu(key, now);
122
- ledgerOwner = undefined;
123
- callerTable.add(key, now, 1, performance.now() - startedAt);
124
- }
112
+ /** #3798 — run `run` as named frame `ctx.callsite` (request, bus frame, timer tick, job): its count, wall
113
+ * time and main-thread CPU. Opens the loop callsite scope, so reader and writer results inside it are
114
+ * charged back to it. Returns what `run` returns (a sync body stays sync); on exit the ledger goes back
115
+ * to the enclosing frame (a job inside the scheduler tick). */
116
+ export function runInFrame<T>(ctx: LoopCallsiteContext & { callsite: string }, run: () => T): T {
117
+ const outer = resolveLoopCallsite();
118
+ return runWithLoopCallsite(ctx, () => {
119
+ const key = ctx.callsite;
120
+ const startedAt = performance.now();
121
+ markCallerResume(key);
122
+ const end = () => {
123
+ // The code finishing the frame is the frame itself, so the segment since the last mark is its own.
124
+ const now = Date.now();
125
+ settleCpu(key, now);
126
+ ledgerOwner = outer;
127
+ callerTable.add(key, now, 1, performance.now() - startedAt);
128
+ };
129
+ let result: T;
130
+ try {
131
+ result = run();
132
+ } catch (error) {
133
+ end();
134
+ throw error;
135
+ }
136
+ if (result instanceof Promise) return result.finally(end) as T;
137
+ end();
138
+ return result;
139
+ });
140
+ }
141
+
142
+ /** `runInFrame` as a callback, for a timer or interval body: `setInterval(framed("timer x", tick), ms)`. */
143
+ export function framed<A extends unknown[], T>(key: string, fn: (...args: A) => T): (...args: A) => T {
144
+ const ctx = { callsite: key };
145
+ return (...args: A) => runInFrame(ctx, () => fn(...args));
125
146
  }
126
147
 
127
- /** `trackCaller` for a caller with no request scope of its own (a bus frame): also opens the loop
128
- * callsite scope, so reader resumes and on-loop frames inside it are attributed to it. */
129
- export function runAsCaller<T>(callsite: string, run: () => T | Promise<T>): Promise<T> {
130
- return runWithLoopCallsite({ callsite }, () => trackCaller(callsite, run));
148
+ /** A bus frame: always a promise, so a sync throw reaches the frame queue's `catch`. */
149
+ export async function runAsCaller<T>(callsite: string, run: () => T | Promise<T>): Promise<T> {
150
+ return runInFrame({ callsite }, run);
131
151
  }
132
152
 
133
153
  // ── Emits ─────────────────────────────────────────────────────────────────────────────────────────
@@ -2,23 +2,21 @@
2
2
  // one boundary per macrotask (`forEachPaced`); a backlog (a long pause, a crash that lost many settles)
3
3
  // is drained in runs of this budget, well inside the 30s job deadline, re-run this soon while a run
4
4
  // reports `moreWork`.
5
- import { isSqliteBusyError, withFastFailConnection, writerLockAvailable } from "./db/connection";
5
+ import { isSqliteBusyError } from "./db/connection";
6
6
  import { forEachPaced } from "./event-loop-yield";
7
7
 
8
8
  export const INJECTION_SWEEP_RUN_BUDGET_MS = 10_000;
9
9
  export const INJECTION_SWEEP_BACKLOG_INTERVAL_MS = 5_000;
10
- const SWEEP_BUSY_TIMEOUT_MS = 40;
11
10
 
12
- /** Each unit runs on the fast-fail connection, so a write under another writer's lock fails in 40ms
13
- * instead of the shared connection's ~1s; the run then stops with `moreWork` and retries soon. */
14
- export async function pacedInjectionSweep<T>(items: () => Iterable<T>, unit: (item: T) => void, signal?: AbortSignal): Promise<{ moreWork: boolean }> {
11
+ /** The gateway owns write contention; wait for each unit before continuing the bounded sweep. */
12
+ export async function pacedInjectionSweep<T>(items: () => Iterable<T>, unit: (item: T) => unknown, signal?: AbortSignal): Promise<{ moreWork: boolean }> {
15
13
  let contended = false;
16
- return forEachPaced(items, (item) => {
14
+ return forEachPaced(items, async (item) => {
17
15
  try {
18
- withFastFailConnection(SWEEP_BUSY_TIMEOUT_MS, () => unit(item));
16
+ await unit(item);
19
17
  } catch (error) {
20
18
  if (!isSqliteBusyError(error)) throw error;
21
19
  contended = true;
22
20
  }
23
- }, { signal, budgetMs: INJECTION_SWEEP_RUN_BUDGET_MS, ready: () => !contended && writerLockAvailable(SWEEP_BUSY_TIMEOUT_MS) });
21
+ }, { signal, budgetMs: INJECTION_SWEEP_RUN_BUDGET_MS, ready: () => !contended });
24
22
  }
@@ -1,7 +1,8 @@
1
+ import { createActivityEventAsync } from "./db/activity-async";
1
2
  import type { LandGateRunResult, WorkspaceRecord } from "@humwick/sdk";
2
3
  import { emitRelayEvent } from "./events";
3
4
  import { routeNotification, INFORMATIONAL_TTL_MS } from "./notification-router";
4
- import { createActivityEvent } from "./db";
5
+
5
6
  import { resolveCoordinatorAgentId } from "./steward-identity";
6
7
  import { stewardFallbackTarget } from "./config";
7
8
  import { routeLandGateFailure } from "./land-gate-failure-routing";
@@ -51,7 +52,7 @@ export async function notifyLandGateFailed(input: {
51
52
 
52
53
  emitRelayEvent({ type: "workspace.land_gate_failed", source: "server", subject: workspace.id, data: payload });
53
54
 
54
- createActivityEvent({
55
+ (await createActivityEventAsync({
55
56
  clientId: `workspace-land-gate-failed-${workspace.id}-${Date.now()}`,
56
57
  kind: "state",
57
58
  title: "Land blocked by gate failure",
@@ -60,11 +61,11 @@ export async function notifyLandGateFailed(input: {
60
61
  icon: "ti-alert-octagon",
61
62
  view: "orchestrators",
62
63
  metadata: { source: "server", maintenanceJobId: "workspace-land-gate", workspaceId: workspace.id, repoRoot: workspace.repoRoot, gateName: gate.name, ...(input.artifactId ? { artifactId: input.artifactId } : {}) },
63
- });
64
+ }));
64
65
 
65
66
  const routing = await routeLandGateFailure({ workspaceId: workspace.id, branch: workspace.branch, failedAt: input.failedAt, owner, coordinator, fallback, gateName: gate.name });
66
67
  if (routing.stale) return;
67
- routeNotification({
68
+ await routeNotification({
68
69
  type: "workspace.land_gate_failed",
69
70
  scope: { author: owner, parent: routing.parent, repoRoot: workspace.repoRoot, workspaceId: workspace.id },
70
71
  recipients: routing.recipients,
@@ -80,14 +81,14 @@ export async function notifyLandGateFailed(input: {
80
81
  }
81
82
 
82
83
  /** #902 — gate failures wake both owner and coordinator durably; full logs stay in artifacts. */
83
- export function notifyLandGateWarnings(input: {
84
+ export async function notifyLandGateWarnings(input: {
84
85
  workspace: Pick<WorkspaceRecord, "id" | "repoRoot" | "branch" | "baseRef" | "ownerAgentId">;
85
86
  warnings: LandGateRunResult[];
86
87
  /** #2474 R3 — false when any warning's wire output is a folded tail: the combined artifact is
87
88
  * then an index (tails + per-gate full-log refs), not full output, and the label must not
88
89
  * claim otherwise. Defaults to true (nothing folded). */
89
90
  artifactId?: string; fullOutput?: boolean;
90
- }): void {
91
+ }): Promise<void> {
91
92
  const { workspace, warnings } = input;
92
93
  if (warnings.length === 0) return;
93
94
  const base = workspace.baseRef ?? "base";
@@ -110,7 +111,7 @@ export function notifyLandGateWarnings(input: {
110
111
  emitRelayEvent({ type: "workspace.land_gate_warning", source: "server", subject: workspace.id, data: payload });
111
112
 
112
113
  if (!owner) return;
113
- routeNotification({
114
+ await routeNotification({
114
115
  type: "workspace.land_gate_warning",
115
116
  scope: { author: owner, repoRoot: workspace.repoRoot, workspaceId: workspace.id },
116
117
  recipients: [owner],
@@ -124,13 +125,13 @@ export function notifyLandGateWarnings(input: {
124
125
  });
125
126
  }
126
127
 
127
- export function notifyLandGateSkipped(input: {
128
+ export async function notifyLandGateSkipped(input: {
128
129
  workspace: Pick<WorkspaceRecord, "id" | "repoRoot" | "branch" | "baseRef" | "ownerAgentId">;
129
130
  level: "subset" | "none";
130
131
  reason: string;
131
132
  by: string;
132
133
  commit?: string;
133
- }): void {
134
+ }): Promise<void> {
134
135
  const { workspace } = input;
135
136
  const base = workspace.baseRef ?? "base";
136
137
  const owner = workspace.ownerAgentId;
@@ -157,7 +158,7 @@ export function notifyLandGateSkipped(input: {
157
158
 
158
159
  const recipients = [...new Set([owner, coordinator ?? fallback].filter((r): r is string => Boolean(r)))];
159
160
  if (!recipients.length) return;
160
- routeNotification({
161
+ await routeNotification({
161
162
  type: "workspace.land_gate_skipped",
162
163
  scope: { author: owner, parent: coordinator ?? undefined, repoRoot: workspace.repoRoot, workspaceId: workspace.id },
163
164
  recipients,
@@ -6,14 +6,14 @@ import { stewardFallbackTarget } from "./config";
6
6
  import type { Command, WorkspaceRecord } from "./types";
7
7
 
8
8
  /** An offline host is uncertain, never positive evidence to release its lane (#2777). */
9
- export function alertUnprovenLandLaneHolder(command: Command): void {
9
+ export async function alertUnprovenLandLaneHolder(command: Command): Promise<void> {
10
10
  const workspaceId = command.correlationId ?? command.params.workspaceId;
11
11
  const workspace = typeof workspaceId === "string" ? getWorkspace(workspaceId) : null;
12
12
  if (!workspace) return;
13
13
  const coordinator = resolveCoordinatorAgentId(workspace.ownerAgentId);
14
14
  const target = coordinator ?? stewardFallbackTarget() ?? workspace.ownerAgentId;
15
15
  if (!target) return;
16
- routeNotification({
16
+ await routeNotification({
17
17
  type: "workspace.land_gate_queue_stalled",
18
18
  scope: { author: workspace.ownerAgentId, parent: coordinator ?? undefined, repoRoot: workspace.repoRoot, workspaceId: workspace.id },
19
19
  recipients: [target], forceDelivery: true, ttlMs: null,
@@ -39,7 +39,7 @@ export async function recordLandGateQueueProgress(workspace: WorkspaceRecord, co
39
39
  const coordinator = resolveCoordinatorAgentId(workspace.ownerAgentId);
40
40
  const target = coordinator ?? stewardFallbackTarget() ?? workspace.ownerAgentId;
41
41
  if (!target) return;
42
- routeNotification({
42
+ await routeNotification({
43
43
  type: "workspace.land_gate_queue_stalled",
44
44
  scope: { author: workspace.ownerAgentId, parent: coordinator ?? undefined, repoRoot: workspace.repoRoot, workspaceId: workspace.id },
45
45
  recipients: [target], forceDelivery: true, ttlMs: null,
@@ -1,56 +1,7 @@
1
1
  import { errMessage } from "@humwick/sdk";
2
+ import { trackRelayEvent } from "./relay-event-drain";
2
3
 
3
- /**
4
- * #1790 — the land settle path (`settleWorkspaceMergeCommand`) fires 6–12 serialized SYNCHRONOUS
5
- * DB writes per land: the `branch.landed` + `landed-success` events, the per-recipient notification
6
- * fan-out (each a `sendMessage` + an activity-event audit, over an all-agents audience scan), the
7
- * issue/Task lifecycle drives, and — on the reviewer path — an eager policy spawn dispatch. NONE use
8
- * the async busy-retry wrapper, so each raw write can block the event-loop thread up to `busy_timeout`
9
- * (1s, `db/connection.ts`) under lock contention. A land BURST piles this onto the contended loop and
10
- * amplifies the ~2.4s event-loop lag that made the relay HTTP server miss a concurrent `spawn` (the
11
- * "socket connection closed" failures in #1790).
12
- *
13
- * None of that work belongs on the synchronous settle critical path. The AUTHORITATIVE land STATE —
14
- * the workspace status transition (ancestry-gated, #1713) and the landed-sha stamp — plus the durable
15
- * landing RECEIPT (`recordLandingReceipt`, one indexed INSERT) are written synchronously and ARE the
16
- * source of truth; the events, notifications, lifecycle drives and reviewer spawn are ANNOUNCEMENTS
17
- * derived from that state.
18
- *
19
- * ## Serialized, one-item-per-tick drain (#1790 review F2)
20
- * Deferring N announcements as N `setImmediate` callbacks does NOT relieve a burst: Node/Bun drain a
21
- * whole `setImmediate` batch as one contiguous group within a single check phase, BEFORE the poll
22
- * phase accepts the next connection — so an N×fan-out block still refuses a `spawn` arriving during
23
- * it. Instead this runs a SERIALIZED queue: each drain executes exactly ONE item and, only if the
24
- * queue is still non-empty, re-schedules itself. That guarantees a full event-loop iteration — poll
25
- * phase included, so incoming connections are accepted — between every two fan-outs.
26
- *
27
- * ## Shutdown drain (#1790 review F1)
28
- * A graceful stop is a SIGTERM/SIGINT (CD deploys are graceful SIGTERMs, often triggered BY a land —
29
- * a bad correlation). {@link drainPendingLandSettleSideEffects} runs every still-queued callback
30
- * synchronously; the process shutdown handler (a SINGLE `once` per signal in `db/agents.ts`) calls it
31
- * before re-raising, so an announcement already QUEUED by the time the signal is handled is never
32
- * dropped. Accepted residual: a HARD crash (SIGKILL / power loss) still loses any un-flushed deferred
33
- * announcement, but the durable landing RECEIPT is written synchronously right after the settle's own
34
- * `await` resolves (`recordLandingReceipt`, before `markWorkspaceLanded`), so a land whose settle has
35
- * fully RUN is never left unrecorded on a clean stop — only its wake/lifecycle drive would need a
36
- * re-poll to recover.
37
- *
38
- * #1830 (async land-settle git probes) narrowed this guarantee: `settleWorkspaceMergeCommand` now
39
- * awaits a bounded (up to ~12s worst case) async git ancestry check BEFORE it writes the land state,
40
- * the receipt, or queues any announcement here. A graceful stop that lands mid-await — the event loop
41
- * is genuinely free during that await, unlike the old fully-synchronous settle a signal handler could
42
- * never interrupt mid-function — sees NOTHING queued for this land yet, so `drainPendingLandSettleSideEffects`
43
- * flushes nothing for it and the settle can be lost in its entirety (state + receipt + announcement),
44
- * not just its announcement. The land is not silently mis-recorded (no state was written either), but
45
- * it is a real durability gap this module cannot close on its own — a full fix needs the settle path
46
- * itself to survive/resume across a restart (a fast re-settle on startup, or a bounded shutdown drain
47
- * that waits out in-flight settles). Tracked as #1831; out of scope here.
48
- *
49
- * Errors are isolated: a deferred announcement runs AFTER the land it announces has already settled,
50
- * so a throw here can never unwind or mask the land. This is a deliberate swallow-and-log (the inline
51
- * callers propagated most of these throws to the settle caller; moving them off-thread means there is
52
- * no caller left to catch them, so isolation is a behavior improvement, not parity).
53
- */
4
+ // #1790/#1870 — serialize post-commit announcements, yielding between items and awaiting them at shutdown.
54
5
  type LandSettleScheduler = (run: () => void) => void;
55
6
 
56
7
  const defaultScheduler: LandSettleScheduler = (run) => {
@@ -61,7 +12,8 @@ let scheduler: LandSettleScheduler = defaultScheduler;
61
12
 
62
13
  interface PendingSideEffect {
63
14
  label: string;
64
- fn: () => void;
15
+ fn: () => unknown;
16
+ complete: () => void;
65
17
  }
66
18
 
67
19
  // One global FIFO queue drained one item per scheduler tick (F2). `scheduled` guards against
@@ -69,25 +21,36 @@ interface PendingSideEffect {
69
21
  const queue: PendingSideEffect[] = [];
70
22
  let scheduled = false;
71
23
 
72
- function runOne(item: PendingSideEffect): void {
73
- try {
74
- item.fn();
75
- } catch (error) {
76
- console.warn(`[land-settle] deferred ${item.label} threw (land already settled; announcement only): ${errMessage(error)}`);
77
- }
24
+ let active: Promise<void> | undefined;
25
+ let shutdownDrain: Promise<void> | undefined;
26
+ let executing = false;
27
+ let draining = false;
28
+
29
+ async function runOne(item: PendingSideEffect): Promise<void> {
30
+ try { await item.fn(); }
31
+ catch (error) { console.warn(`[land-settle] deferred ${item.label} threw (land already settled; announcement only): ${errMessage(error)}`); }
32
+ finally { item.complete(); }
33
+ }
34
+
35
+ function scheduleNext(): void {
36
+ if (!queue.length || scheduled || executing || draining) return;
37
+ scheduled = true;
38
+ scheduler(drainOne);
78
39
  }
79
40
 
80
41
  function drainOne(): void {
81
42
  scheduled = false;
43
+ if (executing || draining) return;
82
44
  const item = queue.shift();
83
- if (item) runOne(item);
84
- // Re-schedule for the NEXT item only — one item per loop iteration, so the poll phase runs (and a
85
- // pending spawn connection is accepted) between fan-outs. A continuously-fed queue still terminates
86
- // each drain in O(1); it just keeps re-arming while work remains.
87
- if (queue.length > 0 && !scheduled) {
88
- scheduled = true;
89
- scheduler(drainOne);
90
- }
45
+ if (!item) return;
46
+ executing = true;
47
+ const running = runOne(item);
48
+ active = running;
49
+ void running.finally(() => {
50
+ if (active === running) active = undefined;
51
+ executing = false;
52
+ scheduleNext();
53
+ }).catch(error => console.warn(`[land-settle] drain failed: ${errMessage(error)}`));
91
54
  }
92
55
 
93
56
  /**
@@ -96,39 +59,36 @@ function drainOne(): void {
96
59
  * path and DOES run once flushed. Pass `undefined` to restore the `setImmediate` default. Also drains
97
60
  * any queued work so state never leaks across tests.
98
61
  */
99
- export function __setLandSettleSchedulerForTests(fn: LandSettleScheduler | undefined): void {
100
- drainPendingLandSettleSideEffects();
62
+ export async function __setLandSettleSchedulerForTests(fn: LandSettleScheduler | undefined): Promise<void> {
63
+ await drainPendingLandSettleSideEffects();
101
64
  scheduler = fn ?? defaultScheduler;
102
65
  }
103
66
 
104
67
  /** Schedule a land-settle announcement/side-effect off the synchronous settle critical path (#1790). */
105
- export function deferLandSettleSideEffect(label: string, fn: () => void): void {
106
- queue.push({ label, fn });
107
- if (!scheduled) {
108
- scheduled = true;
109
- scheduler(drainOne);
110
- }
68
+ export function deferLandSettleSideEffect(label: string, fn: () => unknown): void {
69
+ let complete!: () => void;
70
+ const pending = new Promise<void>(resolve => { complete = resolve; });
71
+ trackRelayEvent(pending, `land-settle.${label}`);
72
+ queue.push({ label, fn, complete });
73
+ scheduleNext();
111
74
  }
112
75
 
113
- /**
114
- * #1790 review F1 — run every still-queued side-effect synchronously, for the graceful-shutdown
115
- * (SIGTERM/SIGINT) drain so a deferred landing announcement is never dropped on a clean stop.
116
- * Re-entrant-safe: an announcement that itself defers more work is picked up by the same loop (the
117
- * loop re-reads `queue.length`), and each item's throw is swallowed so one bad announcement can never
118
- * block shutdown. A pathologically self-feeding queue is bounded by MAX_SHUTDOWN_DRAIN so shutdown
119
- * always terminates.
120
- */
121
76
  const MAX_SHUTDOWN_DRAIN = 100_000;
122
- export function drainPendingLandSettleSideEffects(): void {
77
+ export function drainPendingLandSettleSideEffects(): Promise<void> {
78
+ if (shutdownDrain) return shutdownDrain;
123
79
  scheduled = false;
124
- let drained = 0;
125
- while (queue.length > 0) {
126
- const item = queue.shift()!;
127
- runOne(item);
128
- if (++drained >= MAX_SHUTDOWN_DRAIN) {
129
- console.warn(`[land-settle] shutdown drain hit ${MAX_SHUTDOWN_DRAIN} items; abandoning ${queue.length} still-queued side-effect(s)`);
130
- queue.length = 0;
131
- break;
80
+ draining = true;
81
+ shutdownDrain = (async () => {
82
+ if (active) await active;
83
+ let drained = 0;
84
+ while (queue.length) {
85
+ await runOne(queue.shift()!);
86
+ if (++drained >= MAX_SHUTDOWN_DRAIN) {
87
+ console.warn(`[land-settle] shutdown drain hit ${MAX_SHUTDOWN_DRAIN} items; abandoning ${queue.length} still-queued side-effect(s)`);
88
+ for (const item of queue.splice(0)) item.complete();
89
+ break;
90
+ }
132
91
  }
133
- }
92
+ })().finally(() => { shutdownDrain = undefined; draining = false; scheduleNext(); });
93
+ return shutdownDrain;
134
94
  }
@@ -1,5 +1,6 @@
1
+ import { createCommandAsync } from "./commands-write";
1
2
  import { errMessage } from "@humwick/sdk";
2
- import { createCommand, listCommands } from "./commands-db";
3
+ import { listCommands } from "./commands-db";
3
4
  import { getAgent, listAgents } from "./db";
4
5
  import { getManagedAgentState } from "./config-store";
5
6
  import { emitCommandEvent } from "./command-events";
@@ -22,7 +23,7 @@ interface CompactAgentInput {
22
23
  hasActiveCommand: (target: string, type: string) => boolean;
23
24
  }
24
25
 
25
- export function reconcileLifecycleContextPressure(input: LifecycleContextPressureInput): Set<string> {
26
+ export async function reconcileLifecycleContextPressure(input: LifecycleContextPressureInput): Promise<Set<string>> {
26
27
  const byPolicy = new Map(input.policies.map((policy) => [policy.name, policy]));
27
28
  const candidates = new Map<string, { agent: AgentCard; policy?: SpawnPolicy }>();
28
29
 
@@ -42,26 +43,26 @@ export function reconcileLifecycleContextPressure(input: LifecycleContextPressur
42
43
 
43
44
  const handled = new Set<string>();
44
45
  for (const { agent, policy } of candidates.values()) {
45
- if (handleContextPressure({
46
+ if ((await handleContextPressure({
46
47
  agent,
47
48
  now: input.now,
48
49
  hasActiveCommand: input.hasActiveCommand,
49
- compact: (reason) => requestAgentCompact({
50
+ compact: async (reason) => (await requestAgentCompact({
50
51
  agent,
51
52
  reason,
52
53
  policyName: policy?.name,
53
54
  alwaysReload: alwaysReloadTags(agent.tags),
54
55
  now: input.now,
55
56
  hasActiveCommand: input.hasActiveCommand,
56
- }),
57
- })) {
57
+ })),
58
+ }))) {
58
59
  handled.add(agent.id);
59
60
  }
60
61
  }
61
62
  return handled;
62
63
  }
63
64
 
64
- export function requestAgentCompact(input: CompactAgentInput): Command | null {
65
+ export async function requestAgentCompact(input: CompactAgentInput): Promise<Command | null> {
65
66
  // #2004 — dedup BEFORE building the resume plan (which persists a recovery message): a compaction
66
67
  // may already be in flight as EITHER an agent.compact (native providers) or an agent.clearContext
67
68
  // (clear-inject providers), so guard against both shapes rather than only the legacy agent.compact.
@@ -81,7 +82,7 @@ export function requestAgentCompact(input: CompactAgentInput): Command | null {
81
82
  // whose identity/startup hooks still reinject the charter — never a clear, never nothing.
82
83
  let resume: ForcedResumePlan | null = null;
83
84
  try {
84
- resume = buildForcedResumePlan(input.agent.id, now);
85
+ resume = (await buildForcedResumePlan(input.agent.id, now));
85
86
  } catch (error) {
86
87
  console.warn(`[lifecycle] forced resume plan for '${input.agent.id}' failed; degrading to a bare compact: ${errMessage(error)}`);
87
88
  resume = null;
@@ -90,7 +91,7 @@ export function requestAgentCompact(input: CompactAgentInput): Command | null {
90
91
  const spawnRequestId = typeof input.agent.meta?.spawnRequestId === "string" ? input.agent.meta.spawnRequestId : undefined;
91
92
  const sessionName = typeof input.agent.meta?.sessionName === "string" ? input.agent.meta.sessionName : undefined;
92
93
  const tmuxSession = typeof input.agent.meta?.tmuxSession === "string" ? input.agent.meta.tmuxSession : undefined;
93
- const command = createCommand({
94
+ const command = (await createCommandAsync({
94
95
  type: commandType,
95
96
  source: "system",
96
97
  target: input.agent.id,
@@ -108,7 +109,7 @@ export function requestAgentCompact(input: CompactAgentInput): Command | null {
108
109
  requestedAt: now,
109
110
  ...(resume?.params ?? {}),
110
111
  },
111
- });
112
+ }));
112
113
  emitCommandEvent(command, "command.requested");
113
114
  return command;
114
115
  }