@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,9 +1,12 @@
1
+ import { insertLandingReceiptAsync } from "./db/runtime-tail-async";
2
+ import { createActivityEventAsync } from "./db/activity-async";
3
+ import { announceVerifiedLand } from "./branch-land-notice";
1
4
  import { errMessage, isHumanAgentId, type BaseWorktreeSyncResult } from "@humwick/sdk";
2
5
  import { emitRelayEvent } from "./events";
3
6
  import { routeNotification, INFORMATIONAL_TTL_MS } from "./notification-router";
4
7
  import { stampLifecycleSignal, taskSignalKey } from "./lifecycle-signal-registry";
5
8
  import { registerDefaultAudienceRules, audiencePredicates } from "./notification-rules";
6
- import { createActivityEvent, getAgent, getOrchestrator, getProject, getTaskDetail, insertLandingReceipt, markWorkspaceLanded, patchWorkspaceMetadataAsync, resolveProjectForCwd, updateWorkspaceStatusAsync, markWorkspaceLandedAsync} from "./db";
9
+ import { getAgent, getOrchestrator, getProject, getTaskDetail, markWorkspaceLanded, patchWorkspaceMetadataAsync, resolveProjectForCwd, updateWorkspaceStatusAsync, markWorkspaceLandedAsync } from "./db";
7
10
  import { renderTemplate } from "./prompt-resolver";
8
11
  import { resolveCoordinatorAgentId } from "./steward-identity";
9
12
  import { stewardFallbackTarget } from "./config";
@@ -32,6 +35,8 @@ export interface BranchLandedInput extends LandedTaskAttributionInput {
32
35
  workspace: Pick<WorkspaceRecord, "id" | "repoRoot" | "branch" | "baseRef" | "baseSha" | "ownerAgentId" | "orchestratorId">;
33
36
  /** SHA the base now points at after the land. */
34
37
  mergedSha?: string;
38
+ /** Landing host proof from its fresh origin ancestry check. Must match mergedSha. */
39
+ landVerifiedSha?: string;
35
40
  /** Original command settlement clock when recovering an older land. */
36
41
  landedAt?: number;
37
42
  /** Subject line of the landed commit, when the orchestrator reported it. */
@@ -168,7 +173,7 @@ async function landedCommitSubjects(input: BranchLandedInput, log: BranchLandedL
168
173
  }, log);
169
174
  }
170
175
 
171
- function resolveLandedTask(input: LandedTaskAttributionInput): {
176
+ export function resolveLandedTask(input: LandedTaskAttributionInput): {
172
177
  taskId: number;
173
178
  taskLabel: string;
174
179
  projectId?: string;
@@ -206,9 +211,9 @@ function landedNotificationIdempotencyKey(input: BranchLandedInput, landedTask:
206
211
  * the announcement; this combined entry preserves the original all-synchronous behavior for the
207
212
  * maintenance reconcile path (reconcileLandedWorkspace) and direct callers/tests.
208
213
  */
209
- export function notifyBranchLanded(input: BranchLandedInput): void {
210
- recordLandingReceipt(input);
211
- announceBranchLanded(input);
214
+ export async function notifyBranchLanded(input: BranchLandedInput): Promise<void> {
215
+ (await recordLandingReceipt(input));
216
+ await announceBranchLanded(input);
212
217
  }
213
218
 
214
219
  /**
@@ -219,7 +224,7 @@ export function notifyBranchLanded(input: BranchLandedInput): void {
219
224
  * row with no receipt. The branch is already landed, so a receipt failure is loud (CRITICAL log) but
220
225
  * can never unwind or mask it.
221
226
  */
222
- export function recordLandingReceipt(input: BranchLandedInput): void {
227
+ export async function recordLandingReceipt(input: BranchLandedInput): Promise<void> {
223
228
  const { workspace } = input;
224
229
  // #1620 — a land that introduced ZERO commits is not a land: no receipt (see announceBranchLanded).
225
230
  if (input.landedCommitCount === 0) return;
@@ -234,7 +239,7 @@ export function recordLandingReceipt(input: BranchLandedInput): void {
234
239
  const mergedSha = cleanRef(input.mergedSha);
235
240
  const commitShas = [...new Set((input.commitShas ?? []).map(cleanRef).filter((sha): sha is string => Boolean(sha)))];
236
241
  if (commitShas.length === 0 && mergedSha) commitShas.push(mergedSha);
237
- insertLandingReceipt({
242
+ (await insertLandingReceiptAsync({
238
243
  ...(landedTask?.projectId ?? project?.id ? { projectId: landedTask?.projectId ?? project!.id } : {}),
239
244
  repo: landedTask?.repo ?? project?.issueRepo ?? repoFromGitRemote(workspace.repoRoot) ?? workspace.repoRoot,
240
245
  ref: workspace.baseRef ?? "base",
@@ -250,7 +255,7 @@ export function recordLandingReceipt(input: BranchLandedInput): void {
250
255
  ...(landedTask?.teamId ?? worker?.teamId ? { teamId: landedTask?.teamId ?? worker!.teamId } : {}),
251
256
  ...(workspace.orchestratorId ? { orchestratorId: workspace.orchestratorId } : {}),
252
257
  ...(orchestrator?.hostname ?? worker?.machine ?? worker?.rig ? { host: orchestrator?.hostname ?? worker?.machine ?? worker!.rig } : {}),
253
- });
258
+ }));
254
259
  } catch (error) {
255
260
  console.error(`[landing-receipt] CRITICAL: failed to persist landed branch ${workspace.id}: ${errMessage(error)}`);
256
261
  }
@@ -262,7 +267,7 @@ export function recordLandingReceipt(input: BranchLandedInput): void {
262
267
  * the issue/Task lifecycle drives. #1790 — the settle path DEFERS this off its synchronous critical
263
268
  * path; the durable receipt is recorded separately + synchronously by {@link recordLandingReceipt}.
264
269
  */
265
- export function announceBranchLanded(input: BranchLandedInput): void {
270
+ export async function announceBranchLanded(input: BranchLandedInput): Promise<void> {
266
271
  const { workspace } = input;
267
272
  const base = workspace.baseRef ?? "base";
268
273
  // #1620 — a land that introduced ZERO commits is not a land. It happens when a reconciliation
@@ -348,79 +353,7 @@ export function announceBranchLanded(input: BranchLandedInput): void {
348
353
  }
349
354
  })());
350
355
 
351
- const author = workspace.ownerAgentId;
352
- const shaLabel = shortSha ? ` as \`${shortSha}\`` : "";
353
- const subjectLabel = input.subject ? ` — "${input.subject}"` : "";
354
- const payload = {
355
- kind: "branch.landed",
356
- workspaceId: workspace.id,
357
- repoRoot: workspace.repoRoot,
358
- branch: landedBranch,
359
- base,
360
- sha: input.mergedSha,
361
- author,
362
- newBranch: input.newBranch,
363
- pushed: input.pushed,
364
- ...landedTaskPayload,
365
- };
366
-
367
- // A local-only land (push disabled, or base has no upstream) has NOT reached the
368
- // remote — say so rather than implying a published merge an agent would report as
369
- // shipped (#285). `undefined` (older orchestrators) keeps the message generic.
370
- const publishLabel = input.pushed === false ? ` Not yet pushed to \`origin/${base}\` — local only.` : "";
371
-
372
- // The branch author cares most — push regardless of online (store-ahead delivers it on
373
- // next poll if they've moved on, #234). A live owner continues in its worktree.
374
- if (author) {
375
- const branchLabel = landedBranch ? `\`${landedBranch}\`` : "Your branch";
376
- const continueLabel = input.newBranch
377
- ? ` You're now on \`${input.newBranch}\` — keep working there.`
378
- : " Worktree reclaimed.";
379
- // Durable (ttl null): the author's own branch landing must reach them even after they go
380
- // offline (store-ahead #234) — not a bystander notice that goes stale.
381
- const notices = routeNotification({
382
- type: "branch.landed",
383
- scope: { author, repoRoot: workspace.repoRoot, workspaceId: workspace.id },
384
- recipients: [author],
385
- ttlMs: null,
386
- message: {
387
- subject: "Your branch landed",
388
- body: renderTemplate("notify.land.success", {
389
- branch: branchLabel,
390
- base,
391
- sha: `${shaLabel}${subjectLabel}`,
392
- publishLabel,
393
- continueLabel,
394
- }),
395
- payload: { ...payload, notification: "landed-success" },
396
- idempotencyKey,
397
- replyExpected: false,
398
- },
399
- });
400
- if (landedTask && input.mergedSha) {
401
- for (const notice of notices) stampLifecycleSignal(notice.to, taskSignalKey(landedTask.taskId, "landed-on-main", input.mergedSha));
402
- }
403
- }
404
-
405
- // Coordinator copy (#2837), informational. No explicit recipients: the router records the rule decision (#446).
406
- const mainScope = { author, repoRoot: workspace.repoRoot, workspaceId: workspace.id, teamId: landedTask?.teamId ?? (author ? getAgent(author)?.teamId : undefined), coordinatorAgentIds: [...new Set([resolveCoordinatorAgentId(author), landedTask && resolveTaskOwnerAgentId(getTaskDetail(landedTask.taskId))].filter((id): id is string => !!id && !isHumanAgentId(id)))] };
407
- const branchLabel = landedBranch ? `\`${landedBranch}\`` : "A branch";
408
- const authorLabel = author ? ` by \`${author}\`` : "";
409
- const notices = routeNotification({
410
- type: "branch.landed",
411
- scope: mainScope, ...audienceWithTaskOwnerRole("branch.landed", mainScope, landedTask?.taskId), // #2862
412
- ttlMs: INFORMATIONAL_TTL_MS,
413
- message: {
414
- subject: `Merged to ${base}`,
415
- body: `🔀 ${branchLabel}${authorLabel} merged to \`${base}\`${shaLabel}${subjectLabel}.${publishLabel}`,
416
- payload: { ...payload, notification: "landed-success" },
417
- idempotencyKey,
418
- replyExpected: false,
419
- },
420
- });
421
- if (landedTask && input.mergedSha) {
422
- for (const notice of notices) stampLifecycleSignal(notice.to, taskSignalKey(landedTask.taskId, "landed-on-main", input.mergedSha));
423
- }
356
+ trackLandLifecycleDrive(announceVerifiedLand(input, landedTask, idempotencyKey));
424
357
  }
425
358
 
426
359
  /**
@@ -434,10 +367,10 @@ export function announceBranchLanded(input: BranchLandedInput): void {
434
367
  * the checkout. Human WIP is never auto-clobbered; `preservedWipPaths` flags paths to merge by
435
368
  * hand rather than blind-restore.
436
369
  */
437
- export function notifyBaseWorktreeStrand(input: {
370
+ export async function notifyBaseWorktreeStrand(input: {
438
371
  workspace: Pick<WorkspaceRecord, "id" | "repoRoot" | "branch" | "baseRef" | "ownerAgentId">;
439
372
  sync: BaseWorktreeSyncResult;
440
- }): void {
373
+ }): Promise<void> {
441
374
  const { workspace, sync } = input;
442
375
  if (sync.reconciled) return;
443
376
  const base = workspace.baseRef ?? "base";
@@ -466,7 +399,7 @@ export function notifyBaseWorktreeStrand(input: {
466
399
 
467
400
  emitRelayEvent({ type: "workspace.base_checkout_strand", source: "server", subject: workspace.id, data: payload });
468
401
 
469
- createActivityEvent({
402
+ (await createActivityEventAsync({
470
403
  clientId: `workspace-base-strand-${workspace.id}-${Date.now()}`,
471
404
  kind: "state",
472
405
  title: "Base checkout stranded after land (mixed state)",
@@ -475,13 +408,13 @@ export function notifyBaseWorktreeStrand(input: {
475
408
  icon: "ti-alert-octagon",
476
409
  view: "orchestrators",
477
410
  metadata: { source: "server", maintenanceJobId: "workspace-base-strand", workspaceId: workspace.id, repoRoot: workspace.repoRoot, unsyncedPaths: unsynced, preservedWipPaths: preservedWip },
478
- });
411
+ }));
479
412
 
480
413
  // Durable (ttl null) push to the owner and its coordinator — whoever works in the shared
481
414
  // checkout must learn it's stale before acting on it. Fallback steward covers a teamless land.
482
415
  const recipients = [...new Set([owner, coordinator, fallback].filter((r): r is string => Boolean(r)))];
483
416
  if (recipients.length) {
484
- routeNotification({
417
+ await routeNotification({
485
418
  type: "workspace.base_checkout_strand",
486
419
  scope: { author: owner, parent: coordinator ?? undefined, repoRoot: workspace.repoRoot, workspaceId: workspace.id },
487
420
  recipients,
@@ -501,12 +434,12 @@ export function notifyBaseWorktreeStrand(input: {
501
434
  * steward-task/conflict pings: it tells the worker that its post-ready idle wait ended without
502
435
  * a completed land, so it can inspect/report instead of silently staying parked forever.
503
436
  */
504
- export function notifyBranchLandFailed(input: {
437
+ export async function notifyBranchLandFailed(input: {
505
438
  workspace: Pick<WorkspaceRecord, "id" | "repoRoot" | "branch" | "baseRef" | "ownerAgentId">;
506
439
  commandId?: string;
507
440
  recipients?: string[];
508
441
  reason?: string;
509
- }): void {
442
+ }): Promise<void> {
510
443
  const { workspace } = input;
511
444
  const base = workspace.baseRef ?? "base";
512
445
  const author = workspace.ownerAgentId;
@@ -533,7 +466,7 @@ export function notifyBranchLandFailed(input: {
533
466
  const recipients = withWorkspaceTaskOwnerRoles(input.recipients ?? [author, coordinator], workspace); // #2862
534
467
  if (!recipients.length) return;
535
468
  const branchLabel = workspace.branch ? `\`${workspace.branch}\`` : "Your branch";
536
- routeNotification({
469
+ await routeNotification({
537
470
  type: "landed-failure",
538
471
  scope: { author, parent: coordinator ?? undefined, repoRoot: workspace.repoRoot, workspaceId: workspace.id },
539
472
  recipients,
@@ -563,7 +496,7 @@ export { notifyLandGateFailed, notifyLandGateWarnings, notifyLandGateSkipped } f
563
496
  * The steward id is the managed steward's policy name (reachable via `policy:<name>`) or an
564
497
  * elected steward's agent id, whichever the caller has in scope.
565
498
  */
566
- export function notifyStewardHandoff(input: {
499
+ export async function notifyStewardHandoff(input: {
567
500
  workspace: Pick<WorkspaceRecord, "id" | "repoRoot" | "branch" | "baseRef" | "ownerAgentId">;
568
501
  /** The steward now holding the merge — managed steward policy name or elected agent id. */
569
502
  stewardId: string;
@@ -571,7 +504,7 @@ export function notifyStewardHandoff(input: {
571
504
  coordinatorAgentId?: string | null;
572
505
  /** Why it was handed over ("conflict", "merge state unknown", auto-merge back-off, …). */
573
506
  reason?: string;
574
- }): void {
507
+ }): Promise<void> {
575
508
  const { workspace } = input;
576
509
  const base = workspace.baseRef ?? "base";
577
510
  const owner = workspace.ownerAgentId;
@@ -596,7 +529,7 @@ export function notifyStewardHandoff(input: {
596
529
  // thinking the branch silently failed. Durable (ttl null): the owner must learn this
597
530
  // even if it went idle. Mirror the "don't touch main" guardrail of the landed-failure wake.
598
531
  if (owner) {
599
- routeNotification({
532
+ await routeNotification({
600
533
  type: "workspace.steward_handoff",
601
534
  scope: { author: owner, repoRoot: workspace.repoRoot, workspaceId: workspace.id },
602
535
  recipients: [owner],
@@ -619,7 +552,7 @@ export function notifyStewardHandoff(input: {
619
552
  // (it spawned the branch agent and owns the merge landing). Skip when the coordinator IS
620
553
  // the owner (no real lineage) to avoid a duplicate ping.
621
554
  if (coordinator && coordinator !== owner) {
622
- routeNotification({
555
+ await routeNotification({
623
556
  type: "workspace.steward_handoff",
624
557
  scope: { author: owner, parent: coordinator, repoRoot: workspace.repoRoot, workspaceId: workspace.id },
625
558
  recipients: [coordinator],
@@ -682,7 +615,7 @@ const DRAINED_LAND_STRAND_BOOKKEEPING = {
682
615
  * (record the receipt, announce a real land, drain the steward/strand bookkeeping so no
683
616
  * watchdog re-wakes or re-pages a branch with nothing left to land).
684
617
  */
685
- export async function reconcileLandedWorkspace(ws: WorkspaceRecord, preview: WorkspaceMergePreview): Promise<LandedWorkspaceReconciliation> {
618
+ export async function reconcileLandedWorkspace(ws: WorkspaceRecord, preview: WorkspaceMergePreview, landVerifiedSha?: string): Promise<LandedWorkspaceReconciliation> {
686
619
  const observedSha = typeof preview.prMergeSha === "string"
687
620
  ? preview.prMergeSha
688
621
  : typeof preview.landedSha === "string"
@@ -740,7 +673,7 @@ export async function reconcileLandedWorkspace(ws: WorkspaceRecord, preview: Wor
740
673
  const closure = ownerAlive
741
674
  ? `owner \`${ws.ownerAgentId}\` is still running, so the workspace stays non-terminal and usable at ${nextStatus}${nextStatus === ws.status ? "" : ` (was ${ws.status} — out of the land queue, #1662)`} (#1631); steward/strand and no-progress bookkeeping cleared`
742
675
  : `marking merged${landedCommitCount === 0 ? "; nothing was landed" : ""}`;
743
- createActivityEvent({
676
+ (await createActivityEventAsync({
744
677
  clientId: "server-workspace-" + ws.id + "-merged-" + Date.now(),
745
678
  kind: "state",
746
679
  title: ownerAlive
@@ -751,9 +684,9 @@ export async function reconcileLandedWorkspace(ws: WorkspaceRecord, preview: Wor
751
684
  icon: "ti-git-merge",
752
685
  view: "orchestrators",
753
686
  metadata: { source: "server", maintenanceJobId: "workspace-conflict-scan", workspaceId: ws.id, fromStatus: ws.status, toStatus: nextStatus, ...(ownerAlive ? { ownerAlive: true, keptLive: true } : {}), ...(sha ? { landedSha: sha } : {}), ...(landedCommitCount === 0 ? { landedCommitCount: 0 } : {}) },
754
- });
687
+ }));
755
688
  try {
756
- notifyBranchLanded({ workspace: ws, mergedSha: sha, landedTipSha: sha, commitShas: sha ? [sha] : [], pushed: true, prLand: preview.prMerged === true, ...(landedCommitCount === 0 ? { landedCommitCount } : {}) });
689
+ await notifyBranchLanded({ workspace: ws, mergedSha: sha, landVerifiedSha, landedTipSha: sha, commitShas: sha ? [sha] : [], pushed: true, prLand: preview.prMerged === true, ...(landedCommitCount === 0 ? { landedCommitCount } : {}) });
757
690
  } catch {
758
691
  // Notification is best-effort; the status change + activity event still stand.
759
692
  }
package/src/bus.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { Server, ServerWebSocket } from "bun";
2
- import { ValidationError, applyAgentLifecycleUpdate, getAgent, getDb, orphanTasksForAgentAsync, recordHeartbeat, setStatus, validateAgentSession } from "./db";
2
+ import { ValidationError, applyAgentLifecycleUpdateAsync, getAgent, getDb, orphanTasksForAgentAsync, recordHeartbeatAsync, validateAgentSession } from "./db";
3
3
  import { getOutboxCursor, hasReplayGap, replayEventsSlice, type BusEvent } from "./bus-outbox";
4
4
  import { emitAgentStatus } from "./agent-status-events";
5
5
  import { AgentStatusSubscribers, matchesSubscription, wantsAgentStatus } from "./transport-subscriptions";
@@ -11,7 +11,7 @@ import { announceSpawnedAgentReady, registerAgent } from "./services/register-ag
11
11
  import { authContextFromBus } from "./services/auth-context";
12
12
  import { commandAuthorizationResource, dispatchCommandAsync } from "./services/dispatch-command";
13
13
  import { withRelayEventDrain } from "./relay-event-drain";
14
- import { runAsCaller } from "./hub-metrics";
14
+ import { framed, runAsCaller } from "./hub-metrics";
15
15
  import { auditProviderStateTransition } from "./services/provider-state-audit";
16
16
  import { agentProviderTimelineEvent, auditRunnerTimelineEvent } from "./provider-timeline-event";
17
17
  import { auditProviderTurnEmpty, auditProviderTurnWatchdog, auditReconciledProviderTurn } from "./services/turn-reconcile-audit";
@@ -19,6 +19,7 @@ import { ServiceAuthError } from "./services/errors";
19
19
  import { ShutdownAuthError, ShutdownTargetError, shutdownAgent, shutdownInputFromBusFrame } from "./services/shutdown-agent";
20
20
  import { flushQueuedDirectMessages } from "./services/managed-running";
21
21
  import { updateCommandFromBus } from "./services/bus-command-update";
22
+ import { heartbeatFromBus } from "./services/agent-heartbeat";
22
23
  import { isAgentUnavailable, reservedAgentIdSql } from "./db/agent-predicates";
23
24
  import { messageMatchesAgent, targetMatchesAgent } from "./agent-ref";
24
25
  import { probeWorkspaceOnTurnEnd } from "./workspace-probe";
@@ -34,7 +35,7 @@ import {
34
35
  type BusFrame,
35
36
  type RegisterFrame,
36
37
  } from "@humwick/sdk/protocol";
37
- import { errMessage, isRecord } from "@humwick/sdk";
38
+ import { errMessage, fireAndForget, isRecord } from "@humwick/sdk";
38
39
  import { getComponentAuth, isComponentAuthorizedFor, isAuthorized, isOriginAllowed, unauthorized } from "./security";
39
40
  import type { AgentCard, ComponentToken, ContextState, Message, ProviderCapabilities, QuotaState, RegisterAgentInput, Task } from "./types";
40
41
 
@@ -76,7 +77,7 @@ const liveBusSocketIds = new Set<string>();
76
77
  // stalls unrelated agents.
77
78
  const busFrameQueues = new Map<string, Promise<void>>();
78
79
 
79
- subscribeRelayEvents((event) => broadcastRelayEvent(event));
80
+ subscribeRelayEvents(broadcastRelayEvent);
80
81
 
81
82
  export function handleBusUpgrade(req: Request, server: Server<BusSocketData>): Response | undefined {
82
83
  if (!isOriginAllowed(req)) {
@@ -95,11 +96,11 @@ export function handleBusUpgrade(req: Request, server: Server<BusSocketData>): R
95
96
  return undefined;
96
97
  }
97
98
 
98
- export function busHandleOpen(ws: BusWebSocket): void {
99
+ export const busHandleOpen = framed("WS open", (ws: BusWebSocket): void => {
99
100
  liveBusSocketIds.add(ws.data.id);
100
101
  // Registration is explicit. The socket is not visible to projections until
101
102
  // a valid register frame establishes identity and subscriptions.
102
- }
103
+ });
103
104
 
104
105
  export function busHandleMessage(ws: BusWebSocket, data: string | Buffer): void {
105
106
  if (!liveBusSocketIds.has(ws.data.id)) return;
@@ -127,7 +128,7 @@ export function busHandleMessage(ws: BusWebSocket, data: string | Buffer): void
127
128
  busFrameQueues.set(ws.data.id, queued);
128
129
  }
129
130
 
130
- export function busHandleClose(ws: BusWebSocket): void {
131
+ export const busHandleClose = framed("WS close", (ws: BusWebSocket): void => {
131
132
  liveBusSocketIds.delete(ws.data.id);
132
133
  busFrameQueues.delete(ws.data.id);
133
134
  const conn = busConnections.get(ws.data.id);
@@ -138,11 +139,14 @@ export function busHandleClose(ws: BusWebSocket): void {
138
139
  // on the establishing socket id, so a foreign socket's close cannot evict the owner's binding and a stale
139
140
  // close cannot evict a newer register's binding).
140
141
  if (!conn.transportReconnect) {
141
- setStatus(conn.agentId, "stale", { instanceId: conn.instanceId, epoch: conn.epoch });
142
- queueAgentStatusEvent(conn.agentId);
142
+ const agentId = conn.agentId;
143
+ void fireAndForget(`[bus] mark ${agentId} stale on close`, async () => {
144
+ await applyAgentLifecycleUpdateAsync(agentId, { status: "stale" }, { instanceId: conn.instanceId, epoch: conn.epoch });
145
+ queueAgentStatusEvent(agentId);
146
+ });
143
147
  }
144
148
  }
145
- }
149
+ });
146
150
 
147
151
  export function getBusConnectionCount(): number {
148
152
  return busConnections.size;
@@ -162,7 +166,7 @@ export async function expireStaleBusAgents(graceMs = busStaleGraceMs(), lagGrace
162
166
  // but do NOT revoke the token — a reconnect accepts the EXISTING token and re-marks
163
167
  // live. The #484 restart-strand revoke now fires on instance takeover in registerAgent
164
168
  // (a fresh instanceId → epoch bump), never on a heartbeat lapse.
165
- setStatus(row.id, "offline");
169
+ await applyAgentLifecycleUpdateAsync(row.id, { status: "offline" });
166
170
  await emitAgentStatus(row.id);
167
171
  const tasks = await orphanTasksForAgentAsync(row.id);
168
172
  for (const task of tasks) {
@@ -187,7 +191,7 @@ async function handleFrame(ws: BusWebSocket, frame: ReturnType<typeof validateCl
187
191
  await handleRegister(ws, frame);
188
192
  return;
189
193
  case "heartbeat":
190
- await withRegistered(ws, frame, (conn) => {
194
+ await withRegistered(ws, frame, async (conn) => {
191
195
  if (conn.agentId) {
192
196
  // #633 — a runner whose provider terminally exited stays alive and keeps sending idle
193
197
  // keepalives (semanticStatus is never "offline"). Those must NOT resurrect an agent the
@@ -199,16 +203,15 @@ async function handleFrame(ws: BusWebSocket, frame: ReturnType<typeof validateCl
199
203
  if (!heldOffline) {
200
204
  const wasUnavailable = current ? isAgentUnavailable(current) : false;
201
205
  const runtime = runtimeFromMeta(frame.payload.meta);
202
- // #1468 — coalesce the steady-state liveness write; recordHeartbeat writes through
203
- // synchronously only on a status change / resurrection (and persists last_seen + runtime
204
- // then). This replaces the old heartbeat()+setStatus() pair that rewrote the row twice
205
- // per beat even when nothing changed.
206
- recordHeartbeat(conn.agentId, { guard: { instanceId: conn.instanceId, epoch: conn.epoch }, status: frame.payload.status, runtime });
206
+ // #1468 — coalesce the steady-state liveness write; only a status change / resurrection
207
+ // writes (last_seen + runtime), on the writer thread (#1870 S7). This replaces the old
208
+ // heartbeat()+setStatus() pair that rewrote the row twice per beat even when nothing changed.
209
+ await recordHeartbeatAsync(conn.agentId, { guard: { instanceId: conn.instanceId, epoch: conn.epoch }, status: frame.payload.status, runtime });
207
210
  queueAgentStatusEvent(conn.agentId);
208
211
  // #416 — flush queued messages if the agent transitioned from unavailable to available.
209
212
  if (wasUnavailable) {
210
213
  const after = getAgent(conn.agentId);
211
- if (after && !isAgentUnavailable(after)) flushQueuedDirectMessages(conn.agentId);
214
+ if (after && !isAgentUnavailable(after)) (await flushQueuedDirectMessages(conn.agentId));
212
215
  }
213
216
  }
214
217
  }
@@ -225,19 +228,16 @@ async function handleFrame(ws: BusWebSocket, frame: ReturnType<typeof validateCl
225
228
  await withRegistered(ws, frame, async (conn) => {
226
229
  if (!conn.agentId) return sendError(ws, frame.id, "AGENT_REQUIRED", "status frames require an agent registration");
227
230
  const guard = { instanceId: conn.instanceId, epoch: conn.epoch };
228
- // #1895 (S3.2 L10 review, D2) — DELIBERATELY left on the sync write path: this is the
229
- // per-status-frame hot WS seam (every heartbeat/status update from every live agent), not the
230
- // cold/admin lifecycle surface that leaf migrates. `withRegistered`'s callback runs with no
231
- // thread hop mid-frame, so routing these writes through their async facades would not move
232
- // them off-loop — it would only add a round-trip.
233
- // #2111 — but the three writes ARE now one. This used to be getAgent(before) + setStatus
231
+ // #1870 S7 — the per-status-frame write runs on the writer thread; this socket's FIFO frame
232
+ // queue keeps its frames ordered across the hop, and the lifecycle ordinal fences it against
233
+ // every other lifecycle writer. #2111 — the three writes are one. This used to be getAgent(before) + setStatus
234
234
  // (guard read + before read + UPDATE in its own BEGIN IMMEDIATE) + markReady (guard read +
235
235
  // UPDATE) + mergeAgentMeta (two reads + UPDATE) + getAgent(after): ~7 row reads and 3 UPDATEs
236
236
  // of one row per frame. `applyAgentLifecycleUpdate` does one guard read, one UPDATE and hands
237
237
  // back the before/after cards the audit calls below need. The flap ledger is different: it is
238
238
  // a cold durable history and must stay ordered with its status edge, so await it within this
239
239
  // socket's existing FIFO frame queue.
240
- const applied = applyAgentLifecycleUpdate(
240
+ const applied = await applyAgentLifecycleUpdateAsync(
241
241
  conn.agentId,
242
242
  { status: frame.payload.agentStatus, ready: frame.payload.ready, meta: frame.payload.meta },
243
243
  guard,
@@ -250,27 +250,27 @@ async function handleFrame(ws: BusWebSocket, frame: ReturnType<typeof validateCl
250
250
  const after = applied.after;
251
251
  await auditProviderStateTransition(conn.agentId, before, after);
252
252
  const timelineEvent = agentProviderTimelineEvent(after);
253
- auditRunnerTimelineEvent(conn.agentId, timelineEvent);
253
+ (await auditRunnerTimelineEvent(conn.agentId, timelineEvent));
254
254
  // #1621 — a turn the runner proved was cancelled out of band is a real state change the
255
255
  // waiting coordinator has to hear about, not just an activity-feed row.
256
- auditReconciledProviderTurn(conn.agentId, after, timelineEvent);
256
+ await auditReconciledProviderTurn(conn.agentId, after, timelineEvent);
257
257
  // #1980 — the busy backstop is HOLDING a long turn it can't prove idle (not cancelling);
258
258
  // tell the waiting coordinator the turn is still live rather than leaving it to guess.
259
259
  // #2010 — but only when there's no positive busy evidence already saying so (see the
260
260
  // busy-health gate inside auditProviderTurnWatchdog); a demonstrably working agent needs
261
261
  // no wake.
262
- auditProviderTurnWatchdog(conn.agentId, after, timelineEvent);
262
+ await auditProviderTurnWatchdog(conn.agentId, after, timelineEvent);
263
263
  // #2389 — a turn that ended clean and produced nothing is the least visible failure of the
264
264
  // three: the card reads healthy and idle. Tell the parent once the runner's own nudge has
265
265
  // failed to recover it.
266
- auditProviderTurnEmpty(conn.agentId, after, timelineEvent);
266
+ await auditProviderTurnEmpty(conn.agentId, after, timelineEvent);
267
267
  // #2432 — a first ready that arrives over a status frame (children whose register kept the
268
268
  // row not-ready, e.g. ox/opencode builders) must stamp readiness exactly like the HTTP and
269
269
  // registration seams, or the child later reaps as a false `agent.spawn_failed`.
270
- if (readyTransition) announceSpawnedAgentReady(conn.agentId, "bus-ready");
270
+ if (readyTransition) await announceSpawnedAgentReady(conn.agentId, "bus-ready");
271
271
  // A parked continuation consumes one retry on a genuine ready/idle transition only.
272
272
  const replayEpoch = continuationReplayEpoch(conn, before, after);
273
- if (replayEpoch) replayParkedContinuationInjections(conn.agentId, replayEpoch);
273
+ if (replayEpoch) (await replayParkedContinuationInjections(conn.agentId, replayEpoch));
274
274
  // A real PreCompact/SessionStart hook arrives as a timelineEvent in the
275
275
  // merged meta — clears any pending stall watch (stale events ignored).
276
276
  noteAgentTimelineEvent(conn.agentId, timelineEvent);
@@ -280,7 +280,7 @@ async function handleFrame(ws: BusWebSocket, frame: ReturnType<typeof validateCl
280
280
  // #633 — silent clean-exit: a runner that stays alive after its provider terminally exited
281
281
  // marks the offline edge with `terminalProviderExit`; the owning service turns that into a
282
282
  // terminal event + #636 diagnosis (and clears the hold on a genuine resume).
283
- reconcileTerminalProviderExit(conn.agentId, before, after);
283
+ await reconcileTerminalProviderExit(conn.agentId, before, after);
284
284
  });
285
285
  return;
286
286
  case "ack":
@@ -306,8 +306,9 @@ async function handleCommandFrame(
306
306
  target: string,
307
307
  params: Record<string, unknown>,
308
308
  ): Promise<void> {
309
+ if (commandType === "agent.heartbeat") return withRelayEventDrain(() => heartbeatFromBus(conn, target, params)).then((o) => sendCommandResult(ws, frameId, o.status, o.result, o.error));
309
310
  if (commandType === "command.update") {
310
- return withRelayEventDrain(() => updateCommandFromBus({ target, params, componentAuth: conn.componentAuth }))
311
+ return withRelayEventDrain(async () => (await updateCommandFromBus({ target, params, componentAuth: conn.componentAuth })))
311
312
  .then((result) => sendCommandResult(ws, frameId, result.status, result.result, result.error))
312
313
  .catch((error) => sendError(ws, frameId, "FRAME_FAILED", errMessage(error)));
313
314
  }
@@ -334,10 +335,10 @@ async function handleCommandFrame(
334
335
  // busCommandAuthorized gate), createCommand, and the "command.requested" emit. The bus
335
336
  // adapter only translates the typed ServiceAuthError into a rejected result frame.
336
337
  try {
337
- const command = await withRelayEventDrain(() => dispatchCommandAsync(
338
+ const command = await withRelayEventDrain(async () => (await dispatchCommandAsync(
338
339
  { type: commandType, source: conn.agentId ?? conn.componentId, target, params },
339
340
  authContextFromBus(conn.componentAuth),
340
- ));
341
+ )));
341
342
  sendCommandResult(ws, frameId, "succeeded", { command });
342
343
  } catch (e) {
343
344
  if (e instanceof ServiceAuthError) {
@@ -378,7 +379,7 @@ async function handleRegister(ws: BusWebSocket, frame: RegisterFrame): Promise<v
378
379
  machine: payload.machine,
379
380
  capabilities: payload.capabilities,
380
381
  status: runnerManaged ? "idle" : "online",
381
- ready: true,
382
+ ready: !runnerManaged,
382
383
  instanceId: payload.instanceId,
383
384
  ...(providerCapabilities ? { providerCapabilities } : {}),
384
385
  ...(context ? { context } : {}),
@@ -386,7 +387,7 @@ async function handleRegister(ws: BusWebSocket, frame: RegisterFrame): Promise<v
386
387
  ...(lifecycle === "transient" || lifecycle === "persistent" ? { lifecycle } : {}),
387
388
  meta: payload.meta,
388
389
  };
389
- const agent = registerAgent(input, authContextFromBus(ws.data.componentAuth), { emitStatus: false });
390
+ const agent = await registerAgent(input, authContextFromBus(ws.data.componentAuth), { emitStatus: false });
390
391
  epoch = agent.epoch;
391
392
  }
392
393
 
@@ -400,7 +401,7 @@ async function handleRegister(ws: BusWebSocket, frame: RegisterFrame): Promise<v
400
401
  // newly registered agent stale. Fence the install on liveness and clean up the provisional
401
402
  // registration with the same instance/epoch guard used by an established connection's close.
402
403
  if (!liveBusSocketIds.has(ws.data.id)) {
403
- if (payload.agentId && setStatus(payload.agentId, "stale", { instanceId: payload.instanceId, epoch })) {
404
+ if (payload.agentId && (await applyAgentLifecycleUpdateAsync(payload.agentId, { status: "stale" }, { instanceId: payload.instanceId, epoch })).changed) {
404
405
  queueAgentStatusEvent(payload.agentId);
405
406
  }
406
407
  return;
@@ -430,7 +431,7 @@ async function handleRegister(ws: BusWebSocket, frame: RegisterFrame): Promise<v
430
431
  epoch,
431
432
  cursor: getOutboxCursor(),
432
433
  sessionId: ws.data.id,
433
- features: { heartbeatAck: true },
434
+ features: { heartbeatAck: true, liveness: true },
434
435
  },
435
436
  });
436
437
  }
@@ -1,3 +1,7 @@
1
+ import { resolve } from "node:path";
2
+ import { getDeployEventForCommitAsync, deployChangesForCommitsAsync } from "./db/deploy-events-async";
3
+ import type { DeployChanges } from "./db/deploy-events";
4
+ import { runGit } from "./services/git-process";
1
5
  import { VERSION } from "./config";
2
6
  import { reportedGitSha } from "./git-sha";
3
7
  import { routeNotification } from "./notification-router";
@@ -17,6 +21,7 @@ registerDefaultAudienceRules("cd.deploy_live", [audiencePredicates.persistentCoo
17
21
  export interface CdDeployLiveInput {
18
22
  /** Defaults to this process's package version. */
19
23
  version?: string;
24
+ repoRoot?: string;
20
25
  /** Defaults to the running process's attested commit sha (undefined on an npm install). */
21
26
  gitSha?: string;
22
27
  }
@@ -32,28 +37,51 @@ export interface CdDeployLiveInput {
32
37
  * there is no stable identity to key the one-per-deploy dedup on, and this notice is specifically
33
38
  * about the CD-deploy restart glitch that only that deployment model produces.
34
39
  */
35
- export function notifyCdDeployLive(input: CdDeployLiveInput = {}): void {
40
+ export async function notifyCdDeployLive(input: CdDeployLiveInput = {}): Promise<void> {
36
41
  const version = input.version ?? VERSION;
37
42
  const gitSha = input.gitSha ?? reportedGitSha();
38
43
  if (!gitSha) {
39
- routeNotification({ type: "cd.deploy_live", scope: {}, recipients: [], message: {
44
+ await routeNotification({ type: "cd.deploy_live", scope: {}, recipients: [], message: {
40
45
  body: `Humwick v${version} is now running.`, payload: { kind: "cd.deploy-live", version },
41
46
  idempotencyKey: `release-deploy-live:${version}`, replyExpected: false,
42
47
  } });
43
48
  return;
44
49
  }
45
50
  const shortSha = gitSha.slice(0, 12);
51
+ const contents = await deployNoticeContents(gitSha, input.repoRoot ?? resolve(import.meta.dir, ".."));
46
52
 
47
- routeNotification({
53
+ await routeNotification({
48
54
  type: "cd.deploy_live",
49
55
  scope: {},
50
56
  ttlMs: null,
51
57
  message: {
52
58
  subject: `Humwick ${version} is now running`,
53
- body: `Humwick v${version} (\`${shortSha}\`) is now running after a restart. Any tool-call failures in the last ~1-2 min were the deploy, not an incident — you're good now; retry anything that failed.`,
59
+ body: `Humwick v${version} (\`${shortSha}\`) is now running after a restart. Interrupted tool calls were the deploy, not an incident; retry them.${contents}`,
54
60
  payload: { kind: "cd.deploy-live", version, gitSha },
55
61
  idempotencyKey: `cd-deploy-live:${gitSha}`,
56
62
  replyExpected: false,
57
63
  },
58
64
  });
59
65
  }
66
+
67
+ async function deployNoticeContents(gitSha: string, repoRoot: string): Promise<string> {
68
+ const event = await getDeployEventForCommitAsync(gitSha);
69
+ if (!event) return "";
70
+ let changes: DeployChanges | undefined = event.changes;
71
+ if (changes?.state !== "ready") {
72
+ if (!event.previousSha) return "\nContents unavailable: no previous deployed SHA.";
73
+ const result = await runGit(["-C", repoRoot, "log", "--format=%H%x00%s", `${event.previousSha}..${gitSha}`, "--"], 5000, 1024 * 1024);
74
+ if (result.unavailable || result.exitCode !== 0) return "\nContents unavailable: deploy range could not be read.";
75
+ const commits = result.stdout.trim().split("\n").filter(Boolean).map(line => {
76
+ const [sha, ...subject] = line.split("\x00");
77
+ return { sha: sha!, subject: subject.join("\x00") };
78
+ });
79
+ changes = { state: "ready", ...await deployChangesForCommitsAsync(commits) };
80
+ }
81
+ const lines = changes.tasks.flatMap(task => [
82
+ `T${task.id} ${task.label.replace(/\s+/g, " ")}${task.issues.length ? ` — ${task.issues.map(issue => `${issue.repo}#${issue.externalKey} (${issue.relation ?? "references"})`).join(", ")}` : ""}`,
83
+ ...(task.onDeploy ? [` onDeploy: ${task.onDeploy.replace(/\s+/g, " ")}`] : []),
84
+ ]);
85
+ lines.push(`${changes.unmatchedCommits.length} non-Task commit(s).`);
86
+ return `\n${lines.join("\n")}`;
87
+ }
@@ -1,9 +1,10 @@
1
1
  import { resolveCdFleetAllowlist } from "../scripts/cd-config.ts";
2
2
  import { isCdFleetHostAllowlisted } from "../scripts/cd-fleet-membership.ts";
3
- import { getConfig, setConfig } from "./config-store.ts";
4
- import { createActivityEvent } from "./db/activity.ts";
3
+ import { getConfig } from "./config-store.ts";
4
+ import { setConfigAsync } from "./config-store-write.ts";
5
+ import { createActivityEventAsync } from "./db/activity-async.ts";
5
6
  import { computeFleetConvergenceAsync, type FleetConvergence } from "./fleet-convergence.ts";
6
- import { raiseOperatorAlarm } from "./operator-alarm.ts";
7
+ import { raiseOperatorAlarmAsync } from "./operator-alarm.ts";
7
8
  import { listOrchestratorsAsync } from "./db/orchestrators-async.ts";
8
9
 
9
10
  /** Server-side: a durable alarm per lag episode, and a recovery record when it clears. */
@@ -17,7 +18,7 @@ export async function notifyCdHostLag(convergence?: FleetConvergence, allowlist
17
18
  // Keep the episode's identity while targets advance, until this Host catches up.
18
19
  const since = previous[host.id] ?? host.lag.since;
19
20
  current[host.id] = since;
20
- raiseOperatorAlarm({ clientId: `cd-host-lag:${host.id}:${since}`, source: "cd-host-lag", view: "deploys",
21
+ await raiseOperatorAlarmAsync({ clientId: `cd-host-lag:${host.id}:${since}`, source: "cd-host-lag", view: "deploys",
21
22
  subject: `CD deploy lag on ${host.id}`, dedupeEvent: true,
22
23
  detail: `${host.id} is ${Math.floor(host.lag.ageMs / 60_000)} minutes behind ${status.targetSha.slice(0, 12)}: ${host.deferred?.reason ?? host.reason}`,
23
24
  metadata: { orchestratorId: host.id, since, targetSha: status.targetSha, deferred: host.deferred } });
@@ -29,8 +30,8 @@ export async function notifyCdHostLag(convergence?: FleetConvergence, allowlist
29
30
  if (!host || !isCdFleetHostAllowlisted(host, allowlist)) { delete current[id]; continue; }
30
31
  if (!status.targetSha || host.gitSha !== status.targetSha) { current[id] = since; continue; }
31
32
  delete current[id];
32
- createActivityEvent({ clientId: `cd-host-lag-resolved:${id}:${since}`, kind: "state", view: "deploys",
33
+ await createActivityEventAsync({ clientId: `cd-host-lag-resolved:${id}:${since}`, kind: "state", view: "deploys",
33
34
  title: `CD deploy lag cleared on ${id}`, metadata: { source: "cd-host-lag", orchestratorId: id, since, resolved: true } });
34
35
  }
35
- if (JSON.stringify(current) !== JSON.stringify(previous)) setConfig("cd-host-lag", "alarms", current);
36
+ if (JSON.stringify(current) !== JSON.stringify(previous)) await setConfigAsync("cd-host-lag", "alarms", current);
36
37
  }