@humwick/server 0.130.2 → 0.130.4

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 (587) hide show
  1. package/bundled/prompts/manifest.json +1 -0
  2. package/bundled/prompts/task.hydration.md +1 -1
  3. package/bundled/roles/builder.md +1 -1
  4. package/docs/guides/sub-coordinators.md +12 -5
  5. package/docs/guides/tools-coordination.md +1 -0
  6. package/docs/guides/workflows.md +16 -0
  7. package/docs/openapi.json +175 -4
  8. package/package.json +8 -7
  9. package/public/assets/{MessageBubble-BWLqMGKG.js → MessageBubble-BOkmEvgZ.js} +2 -2
  10. package/public/assets/{PlanGraphPanel-3TlIQpjk.js → PlanGraphPanel-BkaDJp0r.js} +2 -2
  11. package/public/assets/{TraceView-Wimm0Czv.js → TraceView-B99Uu2yT.js} +2 -2
  12. package/public/assets/{VaultDecisionCard-Bau_vNax.js → VaultDecisionCard-DUIfTTFF.js} +2 -2
  13. package/public/assets/{activity-CrSurn-r.js → activity-ZIX0N1El.js} +2 -2
  14. package/public/assets/{agent-lineage-CknAJKcb.js → agent-lineage-kq9TPYFw.js} +2 -2
  15. package/public/assets/agent-liveness-DSQY1Aa_.js +2 -0
  16. package/public/assets/{agent-name-DKbiIhBo.js → agent-name-C_7F4DFR.js} +2 -2
  17. package/public/assets/{agent-profiles-DwF6EQ4R.js → agent-profiles-BNOcrGcY.js} +2 -2
  18. package/public/assets/{agent-project-badge-Diz4Sjjb.js → agent-project-badge-B6yAh70a.js} +2 -2
  19. package/public/assets/{agent-tools-CRhpRQza.js → agent-tools-CcrhmOzF.js} +2 -2
  20. package/public/assets/{agent-type-icon-LrUEU3lB.js → agent-type-icon-CXSLrKiq.js} +2 -2
  21. package/public/assets/{agents-B-v66C-4.js → agents-DIZG97_X.js} +2 -2
  22. package/public/assets/{analytics-BqCb-LKi.js → analytics-rasmoPjR.js} +2 -2
  23. package/public/assets/{artifact-viewer-kf4pGuAR.js → artifact-viewer-tBpTrEPb.js} +2 -2
  24. package/public/assets/{artifacts-DJevXcvg.js → artifacts-BNkrynP1.js} +2 -2
  25. package/public/assets/{artifacts-D32zyw4Y.js → artifacts-Bjq-ZyBA.js} +2 -2
  26. package/public/assets/{automation-BpRajx_5.js → automation-Cx422L3L.js} +2 -2
  27. package/public/assets/{backlog-D_UjTdzX.js → backlog-RuFQ8PUu.js} +2 -2
  28. package/public/assets/{busy-health-N3VEh4ao.js → busy-health-BvNQ9g5x.js} +2 -2
  29. package/public/assets/{channels-9jopungq.js → channels-DNbKAS0I.js} +2 -2
  30. package/public/assets/{chat-CSXrTB3C.js → chat-Bp3Fx73h.js} +3 -3
  31. package/public/assets/{code-preview-p1NnmqK0.js → code-preview-KIRZA6cz.js} +2 -2
  32. package/public/assets/{connectors-CZdqlDNL.js → connectors-k7vO4vvc.js} +2 -2
  33. package/public/assets/{cosmos-BgdsE4dG.js → cosmos-BuVoq1aw.js} +2 -2
  34. package/public/assets/{crate-agent-30aXTKva.js → crate-agent-irqlt4NH.js} +2 -2
  35. package/public/assets/{dependency-graph-B_jvw2GE.js → dependency-graph-D_rurNBz.js} +2 -2
  36. package/public/assets/{deploys-DoN6bAb5.js → deploys-yzZqIpxE.js} +2 -2
  37. package/public/assets/{display-BrKWFGJz.js → display-BemJG1f_.js} +2 -2
  38. package/public/assets/{files-D6XEu8Ng.js → files-DXWcrxOz.js} +2 -2
  39. package/public/assets/{fleet-C7jQWbw2.js → fleet-TEuOCZXE.js} +2 -2
  40. package/public/assets/{fleet-metrics-BiDs3MLx.js → fleet-metrics-BGoDAFI-.js} +2 -2
  41. package/public/assets/{formatted-body-impl-DyG0WsQS.js → formatted-body-impl-BB9eq9nN.js} +2 -2
  42. package/public/assets/{formatted-body-CQBwc1fb.js → formatted-body-qy2nTD_1.js} +3 -3
  43. package/public/assets/{host-providers-dialog-DKaW31dN.js → host-providers-dialog-BGPHxuwT.js} +2 -2
  44. package/public/assets/{index-CRHep3M9.js → index-BC5XZc0z.js} +5 -5
  45. package/public/assets/{index-MYAIwYTX.css → index-D8Rp9pz2.css} +1 -1
  46. package/public/assets/{insights-CzrtkpOE.js → insights-C-KQG0h-.js} +2 -2
  47. package/public/assets/{integrations-aVsUmigt.js → integrations-ClPRPyKU.js} +2 -2
  48. package/public/assets/{issue-ref-chip-BnSlM_95.js → issue-ref-chip-DbH8J9Ak.js} +2 -2
  49. package/public/assets/{log-viewer-qe7Ee47Z.js → log-viewer-PH4zVn24.js} +2 -2
  50. package/public/assets/{maintenance-NfjqFZAk.js → maintenance-5lV43uTL.js} +2 -2
  51. package/public/assets/{managed-agents-BiH0HgaE.js → managed-agents-BdgU35aX.js} +2 -2
  52. package/public/assets/{markdown-preview-BixaT3Xr.js → markdown-preview-DNT4OUwQ.js} +3 -3
  53. package/public/assets/{markdown-preview-impl-DNGlWIS3.js → markdown-preview-impl-CnCcPy0A.js} +2 -2
  54. package/public/assets/{memory-DNsCl6UX.js → memory--GgWH1gH.js} +2 -2
  55. package/public/assets/{messages-DopU1L1X.js → messages-CzFl_97O.js} +2 -2
  56. package/public/assets/{orchestrators-Cq7ckLQT.js → orchestrators-CVvJVkzv.js} +2 -2
  57. package/public/assets/overview-DsrZvE86.js +2 -0
  58. package/public/assets/{pairs-DE_m6rrE.js → pairs-D2d0d2py.js} +2 -2
  59. package/public/assets/{profile-icon-B3rfh77F.js → profile-icon-_SMuSbYF.js} +2 -2
  60. package/public/assets/{project-profile-instructions-DQWZE0kA.js → project-profile-instructions-Apn15y43.js} +2 -2
  61. package/public/assets/{projects-Br2Bd2h1.js → projects-D3B6kto5.js} +2 -2
  62. package/public/assets/{prompt-settings-BKvFsvGD.js → prompt-settings-DnPB6Ez6.js} +2 -2
  63. package/public/assets/provider-display-bWwiuedV.js +2 -0
  64. package/public/assets/{registry-Cw38_6gW.js → registry-D790cIhN.js} +2 -2
  65. package/public/assets/run-card-BCro-Odj.js +2 -0
  66. package/public/assets/{secrets-DxI-vzSq.js → secrets-CVXvfvbU.js} +2 -2
  67. package/public/assets/{service-access-settings-D9s_VJbd.js → service-access-settings-D3Xxqb9w.js} +2 -2
  68. package/public/assets/{settings-CKZTVGIx.js → settings-CoUC7Jci.js} +2 -2
  69. package/public/assets/shipping-D_Lp9n_J.js +2 -0
  70. package/public/assets/{stats-DyUBKyWI.js → stats-CXiNjB9S.js} +2 -2
  71. package/public/assets/{status-dot-DYqlEUhJ.js → status-dot-C703YIy1.js} +2 -2
  72. package/public/assets/store-BgDALGIX.js +9 -0
  73. package/public/assets/{tasks-Bh7Chr4-.js → tasks-DO0WpJCx.js} +2 -2
  74. package/public/assets/{teams-bowI7qVY.js → teams-FGkdi_tL.js} +2 -2
  75. package/public/assets/{terminal-viewer-BgVLHdsU.js → terminal-viewer-Dh8dSC7e.js} +3 -3
  76. package/public/assets/{terminal-viewer-impl-Dz22UPy6.js → terminal-viewer-impl-B5Zriip3.js} +2 -2
  77. package/public/assets/{use-agent-terminal-DSQQ-iY7.js → use-agent-terminal-CRUVDvLC.js} +2 -2
  78. package/public/assets/{use-decisions-samMQhQf.js → use-decisions-CoaqRh4l.js} +2 -2
  79. package/public/assets/{use-project-list-59LheVP7.js → use-project-list-X-BgT53X.js} +2 -2
  80. package/public/assets/{use-selectors-BZa25xEB.js → use-selectors-0X_UZkk-.js} +2 -2
  81. package/public/assets/{user-avatar-DHxlvUvV.js → user-avatar-CkLhVBGu.js} +2 -2
  82. package/public/assets/{versioned-prompt-editor-BmED5DnJ.js → versioned-prompt-editor-BkTi7eim.js} +2 -2
  83. package/public/assets/{work-queue-CSvpuNLz.js → work-queue-DDOLEyKo.js} +2 -2
  84. package/public/assets/{workflow-marker-DAZcj5qt.js → workflow-marker-CzOsB8BM.js} +2 -2
  85. package/public/assets/{workflows-DdmxRSyg.js → workflows-DJilvmRM.js} +2 -2
  86. package/public/assets/{workspaces-BxeKfVuF.js → workspaces-CHcfbLR3.js} +2 -2
  87. package/public/cosmos.html +4 -4
  88. package/public/index.html +29 -29
  89. package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
  90. package/runner/src/adapters/claude-api.ts +1 -1
  91. package/runner/src/adapters/claude-headless.ts +1 -1
  92. package/runner/src/adapters/claude-launch-exit.ts +26 -0
  93. package/runner/src/adapters/claude-session-probe.ts +1 -1
  94. package/runner/src/adapters/claude-tmux.ts +38 -10
  95. package/runner/src/adapters/claude.ts +28 -75
  96. package/runner/src/adapters/provider-quota-harvest.ts +20 -71
  97. package/runner/src/agent-runner/lifecycle-milestones.ts +2 -2
  98. package/runner/src/agent-runner/liveness-exchange.ts +104 -0
  99. package/runner/src/claude-system-prompt.ts +49 -0
  100. package/runner/src/launch-assembly.ts +14 -10
  101. package/runner/src/profile-home.ts +1 -1
  102. package/runner/src/project-instructions.ts +2 -2
  103. package/runner/src/provider-command.ts +18 -0
  104. package/runner/src/provider-setup.ts +3 -2
  105. package/runner/src/runner-core.ts +14 -15
  106. package/runner/src/runner-helpers.ts +0 -8
  107. package/runner/src/session-scratch.ts +6 -2
  108. package/runner/test-support/provisioning-context.ts +4 -2
  109. package/runner/test-support/runner-harness.ts +2 -1
  110. package/scripts/steward-policy-cleanup.ts +2 -2
  111. package/src/agent-authz.ts +2 -2
  112. package/src/agent-drive-arbiter.ts +3 -8
  113. package/src/agent-exit-cleanup-async.ts +2 -2
  114. package/src/agent-exit-cleanup.ts +23 -19
  115. package/src/agent-lifecycle-events.ts +112 -85
  116. package/src/agent-ref.ts +3 -2
  117. package/src/agent-status-events.ts +43 -14
  118. package/src/auth/login-link.ts +35 -0
  119. package/src/auth/password.ts +4 -3
  120. package/src/auth/session-refresh.ts +1 -1
  121. package/src/auth/session.test-fixture.ts +2 -2
  122. package/src/auth/session.ts +7 -7
  123. package/src/automations/crud.ts +8 -81
  124. package/src/automations/dispatch.ts +33 -58
  125. package/src/automations/index.ts +1 -1
  126. package/src/automations/persistence.ts +65 -0
  127. package/src/automations/precheck.ts +18 -16
  128. package/src/automations/read-async.ts +11 -0
  129. package/src/automations/reconcile.ts +30 -39
  130. package/src/automations/storage.ts +33 -10
  131. package/src/automations/write-async.ts +33 -0
  132. package/src/branch-land-notice.ts +3 -3
  133. package/src/branch-landed.ts +25 -23
  134. package/src/bus.ts +21 -19
  135. package/src/cd-deploy-notify.ts +2 -2
  136. package/src/ci/notifications.ts +4 -4
  137. package/src/ci/root-missing.ts +3 -3
  138. package/src/ci/transition-notify.ts +5 -5
  139. package/src/claude-app/oauth-http.ts +3 -3
  140. package/src/cli/index.ts +7 -1
  141. package/src/cli/init.ts +53 -0
  142. package/src/cli/orchestrator.ts +1 -7
  143. package/src/cli/setup.ts +6 -4
  144. package/src/cli/workflow.ts +12 -3
  145. package/src/commands-db.ts +4 -4
  146. package/src/commands-write.ts +8 -0
  147. package/src/compaction-watch.ts +10 -8
  148. package/src/config-store-write.ts +2 -2
  149. package/src/config.ts +4 -11
  150. package/src/connectors.ts +10 -8
  151. package/src/context-advisory.ts +22 -21
  152. package/src/db/agent-action-write.ts +36 -0
  153. package/src/db/agent-control-async.ts +9 -0
  154. package/src/db/agent-control-write.ts +49 -0
  155. package/src/db/agent-effort-observe.ts +22 -0
  156. package/src/db/agent-meta.ts +14 -3
  157. package/src/db/agents-async.ts +8 -5
  158. package/src/db/agents.ts +15 -12
  159. package/src/db/auth-identities.ts +2 -2
  160. package/src/db/automation-read-ops.ts +11 -0
  161. package/src/db/automation-write-ops.ts +46 -0
  162. package/src/db/blackboard.ts +2 -2
  163. package/src/db/browser-session-write.ts +32 -0
  164. package/src/db/bus-outbox-write-ops.ts +3 -1
  165. package/src/db/checkout-refresh-schema.ts +47 -0
  166. package/src/db/checkout-refresh.ts +5 -5
  167. package/src/db/command-agent-profile-backfill.ts +39 -0
  168. package/src/db/command-agent-profiles.ts +5 -1
  169. package/src/db/command-retention.ts +126 -0
  170. package/src/db/commands-planner-stats.test-fixture.ts +8 -0
  171. package/src/db/commands-read-ops.ts +16 -0
  172. package/src/db/connection.ts +1 -182
  173. package/src/db/context-carry-write.ts +74 -0
  174. package/src/db/continuations.ts +4 -4
  175. package/src/db/db-error-registry.ts +12 -0
  176. package/src/db/gateway.ts +26 -133
  177. package/src/db/history-retention-ops.ts +13 -0
  178. package/src/db/inbox-async.ts +2 -2
  179. package/src/db/inbox-read-ops.ts +1 -1
  180. package/src/db/inbox.ts +9 -3
  181. package/src/db/issue-associations.ts +2 -2
  182. package/src/db/issue-refs-async.ts +4 -1
  183. package/src/db/issue-refs-read-ops.ts +6 -0
  184. package/src/db/issue-refs.ts +8 -8
  185. package/src/db/kernel-event-log-schema.ts +2 -0
  186. package/src/db/land-boundaries.ts +51 -5
  187. package/src/db/land-gate-attestations.ts +2 -2
  188. package/src/db/landing-receipts.ts +2 -2
  189. package/src/db/lifecycle-context-write.ts +5 -0
  190. package/src/db/lifecycle-tail-async.ts +76 -0
  191. package/src/db/lifecycle-tail-write-ops.ts +62 -0
  192. package/src/db/lifecycle-write-window.ts +2 -1
  193. package/src/db/lineage-pair-dedupe-sql.ts +3 -3
  194. package/src/db/main-connection-mode.ts +11 -0
  195. package/src/db/main-connection-writes.ts +20 -2
  196. package/src/db/maintenance-job-runs-async.ts +2 -2
  197. package/src/db/maintenance-job-write-ops.ts +1 -1
  198. package/src/db/maintenance-pauses.ts +2 -2
  199. package/src/db/message-send.ts +4 -0
  200. package/src/db/messages.ts +31 -25
  201. package/src/db/migrations.ts +18 -1
  202. package/src/db/notification-write-ops.ts +19 -0
  203. package/src/db/operator-answer-write.ts +19 -0
  204. package/src/db/orchestrators.ts +10 -4
  205. package/src/db/pairs-async.ts +22 -1
  206. package/src/db/pairs-write-ops.ts +8 -3
  207. package/src/db/pairs.ts +41 -48
  208. package/src/db/plan-dispatch-schema.ts +5 -1
  209. package/src/db/plan-ready-notices.ts +43 -0
  210. package/src/db/plan-tools-include-migration.ts +36 -0
  211. package/src/db/plans-write-ops.ts +2 -0
  212. package/src/db/presence-buffer.ts +5 -0
  213. package/src/db/presence-loop.ts +18 -23
  214. package/src/db/presence-write.ts +0 -6
  215. package/src/db/project-entries-async.ts +14 -0
  216. package/src/db/project-entries-read-ops.ts +5 -1
  217. package/src/db/project-entries-write-ops.ts +8 -0
  218. package/src/db/project-entries.ts +15 -12
  219. package/src/db/project-journal.ts +2 -2
  220. package/src/db/project-trust-approvals.ts +2 -2
  221. package/src/db/prompt-templates.ts +4 -4
  222. package/src/db/read-op-marshaling-fixtures.ts +18 -0
  223. package/src/db/read-ops.ts +4 -0
  224. package/src/db/retention.ts +13 -2
  225. package/src/db/review-publish-write.ts +8 -0
  226. package/src/db/runtime-admin-async.ts +19 -0
  227. package/src/db/runtime-admin-write-ops.ts +36 -0
  228. package/src/db/runtime-tail-async.ts +288 -0
  229. package/src/db/runtime-tail-write-ops.ts +97 -0
  230. package/src/db/schema.ts +4 -1
  231. package/src/db/spawn-budget.ts +5 -0
  232. package/src/db/spawn-delegation.ts +3 -12
  233. package/src/db/sql-audit-indexes.ts +3 -0
  234. package/src/db/stats-async.ts +5 -3
  235. package/src/db/task-entity.ts +5 -4
  236. package/src/db/team-claim-policy.ts +60 -0
  237. package/src/db/teams-async.ts +4 -0
  238. package/src/db/teams-write-ops.ts +4 -0
  239. package/src/db/terminal-events.ts +15 -0
  240. package/src/db/timer-cutover-bodies.ts +292 -0
  241. package/src/db/timer-cutover-core.ts +37 -278
  242. package/src/db/timer-cutover-state.ts +40 -0
  243. package/src/db/timer-cutover-write-ops.ts +1 -40
  244. package/src/db/token-db-write-ops.ts +2 -0
  245. package/src/db/token-standing-async.ts +12 -0
  246. package/src/db/token-standing.ts +6 -9
  247. package/src/db/token-usage-retention.ts +33 -0
  248. package/src/db/token-usage-write-ops.ts +1 -1
  249. package/src/db/token-usage.ts +4 -1
  250. package/src/db/user-invites-async.ts +13 -0
  251. package/src/db/user-invites.ts +3 -3
  252. package/src/db/users.ts +14 -6
  253. package/src/db/workflow-execution.ts +3 -3
  254. package/src/db/workspaces.ts +8 -5
  255. package/src/db/write-ops.ts +31 -12
  256. package/src/db/writer-fault-seam.ts +2 -9
  257. package/src/db/writer-fault-test-ops.ts +18 -0
  258. package/src/db/writer-gateway.ts +42 -46
  259. package/src/dev.ts +12 -16
  260. package/src/event-loop-lag.ts +4 -2
  261. package/src/event-loop-yield.ts +2 -2
  262. package/src/events.ts +10 -8
  263. package/src/host-provider-store.ts +5 -4
  264. package/src/hub-metrics-report.ts +5 -1
  265. package/src/hub-metrics.ts +38 -18
  266. package/src/init.ts +299 -0
  267. package/src/injection-sweep-pacing.ts +6 -8
  268. package/src/invite-link.ts +16 -9
  269. package/src/land-gate-notifications.ts +11 -10
  270. package/src/land-gate-queue-progress.ts +3 -3
  271. package/src/land-settle-dispatch.ts +52 -92
  272. package/src/lifecycle-context-pressure.ts +11 -10
  273. package/src/lifecycle-manager.ts +104 -98
  274. package/src/maintenance/breaker.ts +18 -16
  275. package/src/maintenance/checkout-refresh.ts +18 -1
  276. package/src/maintenance/critical-job-watchdog.ts +3 -3
  277. package/src/maintenance/events.ts +3 -3
  278. package/src/maintenance/history-retention-job.ts +30 -0
  279. package/src/maintenance/jobs.ts +29 -67
  280. package/src/maintenance/long-running-work.ts +3 -1
  281. package/src/maintenance/offline-agent-prune-job.ts +28 -0
  282. package/src/maintenance/orphaned-sessions.ts +5 -4
  283. package/src/maintenance/pauses.ts +4 -10
  284. package/src/maintenance/plan-ready-notice-job.ts +71 -0
  285. package/src/maintenance/scheduler.ts +18 -13
  286. package/src/maintenance/stalled-delivery-pager.ts +4 -4
  287. package/src/maintenance/teams.ts +19 -30
  288. package/src/maintenance/workspaces.ts +17 -27
  289. package/src/managed-policy-escalation.ts +7 -7
  290. package/src/managed-policy.ts +3 -3
  291. package/src/managed-provider-gate.ts +5 -4
  292. package/src/managed-spawn-reservation.ts +5 -4
  293. package/src/mcp/index.ts +8 -8
  294. package/src/mcp/output-descriptions.ts +1 -1
  295. package/src/mcp/presentation.ts +2 -1
  296. package/src/mcp/runtime-output.ts +6 -1
  297. package/src/mcp/self-care-visibility.ts +2 -2
  298. package/src/mcp/spawn-targets-matrix.ts +10 -1
  299. package/src/mcp/tool-groups.ts +3 -2
  300. package/src/mcp/tool-roles.ts +81 -0
  301. package/src/mcp/tools-workspace.ts +1 -1
  302. package/src/mcp-blackboard-tools.ts +6 -5
  303. package/src/mcp-decision-tools.ts +7 -7
  304. package/src/mcp-egress-tools.ts +10 -9
  305. package/src/mcp-issue-activity-tools.ts +2 -2
  306. package/src/mcp-issue-association-tools.ts +4 -4
  307. package/src/mcp-issue-ref-tools.ts +3 -3
  308. package/src/mcp-merge-tools.ts +5 -5
  309. package/src/mcp-notification-subscription-tools.ts +14 -15
  310. package/src/mcp-output-levels.test-fixture.ts +1 -1
  311. package/src/mcp-profile-trust-tools.ts +1 -1
  312. package/src/mcp-project-journal-tools.ts +4 -12
  313. package/src/mcp-project-tools.ts +17 -18
  314. package/src/mcp-routing-policy-tools.ts +3 -2
  315. package/src/mcp-team-tools.ts +6 -6
  316. package/src/mcp-workflow-tools.ts +5 -3
  317. package/src/memory-area-injection.ts +13 -12
  318. package/src/memory-boundary-capture.ts +6 -6
  319. package/src/memory-injection.ts +45 -43
  320. package/src/merge-pause-maintenance.ts +5 -4
  321. package/src/notification-router.ts +44 -17
  322. package/src/notify.ts +5 -5
  323. package/src/observed-reset-refresh.ts +4 -4
  324. package/src/operator-alarm.ts +2 -5
  325. package/src/project-ingest.ts +6 -6
  326. package/src/project-instructions.ts +8 -1
  327. package/src/project-trust.ts +12 -11
  328. package/src/prompt-resolver.ts +3 -3
  329. package/src/provider-quota-async.ts +5 -7
  330. package/src/provider-timeline-event.ts +4 -7
  331. package/src/quota-band-delivery.ts +2 -2
  332. package/src/recipe-runner.ts +4 -3
  333. package/src/retention-config-store.ts +4 -3
  334. package/src/reviewer-pipeline.ts +11 -10
  335. package/src/routes/_route.ts +4 -4
  336. package/src/routes/_shared.ts +13 -12
  337. package/src/routes/agent-effort.ts +5 -5
  338. package/src/routes/agent-heartbeat-quota.ts +23 -0
  339. package/src/routes/agent-keep.ts +1 -1
  340. package/src/routes/agent-reporting.ts +1 -1
  341. package/src/routes/agent-self-effort.ts +5 -5
  342. package/src/routes/agent-sessions.ts +24 -24
  343. package/src/routes/agents-spawn.ts +1 -1
  344. package/src/routes/agents.ts +17 -119
  345. package/src/routes/auth.ts +44 -17
  346. package/src/routes/authority-audit.ts +2 -2
  347. package/src/routes/automations.ts +6 -5
  348. package/src/routes/channel-binding-delete.ts +1 -1
  349. package/src/routes/channel-output.ts +3 -3
  350. package/src/routes/claude-api-budget.ts +5 -5
  351. package/src/routes/commands-listing.ts +1 -1
  352. package/src/routes/commands.ts +29 -27
  353. package/src/routes/context-resets.ts +2 -2
  354. package/src/routes/coordinator-teams.ts +1 -1
  355. package/src/routes/decisions.ts +2 -2
  356. package/src/routes/host-providers.ts +18 -0
  357. package/src/routes/host-secret-files.ts +1 -1
  358. package/src/routes/hosts.ts +11 -11
  359. package/src/routes/inbox.ts +3 -2
  360. package/src/routes/index.ts +7 -3
  361. package/src/routes/integrations.ts +9 -7
  362. package/src/routes/issue-activity.ts +2 -2
  363. package/src/routes/issue-associations.ts +4 -4
  364. package/src/routes/issue-refs.ts +3 -3
  365. package/src/routes/kernel-timers-operator.ts +1 -1
  366. package/src/routes/memory.ts +1 -1
  367. package/src/routes/merges.ts +11 -11
  368. package/src/routes/messages.ts +23 -17
  369. package/src/routes/orchestrator-bootstrap.ts +3 -1
  370. package/src/routes/orchestrator-host-registration.ts +2 -0
  371. package/src/routes/orchestrator-host-utilization.ts +2 -2
  372. package/src/routes/orchestrator-proxy.ts +2 -2
  373. package/src/routes/orchestrator.ts +27 -18
  374. package/src/routes/pairs.ts +8 -8
  375. package/src/routes/project-profile-instructions.ts +1 -1
  376. package/src/routes/project-trust.ts +1 -1
  377. package/src/routes/projects.ts +16 -16
  378. package/src/routes/prompt-templates.ts +12 -12
  379. package/src/routes/provider-quotas.ts +10 -10
  380. package/src/routes/run-command.ts +1 -1
  381. package/src/routes/secrets-backup.ts +4 -5
  382. package/src/routes/secrets-import.ts +3 -4
  383. package/src/routes/secrets-vault.ts +12 -14
  384. package/src/routes/settings.ts +1 -1
  385. package/src/routes/shipping.ts +9 -1
  386. package/src/routes/spawn-policy.ts +8 -7
  387. package/src/routes/sse.ts +2 -2
  388. package/src/routes/team-templates.ts +7 -7
  389. package/src/routes/teams.ts +10 -10
  390. package/src/routes/tokens.ts +18 -17
  391. package/src/routes/users.ts +24 -24
  392. package/src/routes/viewer-read.ts +3 -3
  393. package/src/routes/web-tool-calls.ts +4 -4
  394. package/src/routes/workflows.ts +2 -2
  395. package/src/routes/workspaces.ts +17 -16
  396. package/src/routing-policy-push.ts +6 -6
  397. package/src/runtime-grant.ts +17 -11
  398. package/src/runtime-install.ts +30 -0
  399. package/src/runtime-tokens.ts +20 -28
  400. package/src/secrets-broker/config.ts +1 -1
  401. package/src/secrets-broker/service.ts +2 -2
  402. package/src/security.ts +3 -1
  403. package/src/self-resume-carry.ts +21 -110
  404. package/src/self-resume-supersede.ts +4 -3
  405. package/src/self-resume.ts +54 -66
  406. package/src/server-background.ts +1 -1
  407. package/src/server.ts +25 -26
  408. package/src/services/agent-action.ts +12 -31
  409. package/src/services/agent-effort.ts +7 -32
  410. package/src/services/agent-hang-watchdog-job.ts +2 -2
  411. package/src/services/agent-heartbeat.ts +166 -0
  412. package/src/services/agent-reporting.ts +1 -1
  413. package/src/services/auth-context.ts +6 -0
  414. package/src/services/browser-inventory.ts +3 -3
  415. package/src/services/browser-session-state.ts +3 -2
  416. package/src/services/browser-session.ts +21 -27
  417. package/src/services/bus-command-update.ts +9 -9
  418. package/src/services/checkout-refresh-state.ts +1 -0
  419. package/src/services/checkout-refresh.test-fixture.ts +3 -2
  420. package/src/services/command-host.ts +7 -2
  421. package/src/services/coordinator-digest.ts +3 -2
  422. package/src/services/dispatch-command.ts +12 -13
  423. package/src/services/effective-launch-driver.ts +14 -9
  424. package/src/services/host-changed-paths.test-fixture.ts +5 -6
  425. package/src/services/host-project-readiness.ts +2 -2
  426. package/src/services/host-providers.ts +1 -1
  427. package/src/services/host-utilization.ts +9 -9
  428. package/src/services/idle-agent-digest.ts +17 -12
  429. package/src/services/idle-epics.ts +4 -4
  430. package/src/services/interrupt-agent.ts +12 -9
  431. package/src/services/issue-activity.ts +3 -3
  432. package/src/services/issue-associations.ts +15 -18
  433. package/src/services/issue-lifecycle-comments.ts +3 -2
  434. package/src/services/issue-lifecycle.ts +14 -13
  435. package/src/services/issue-refs.ts +4 -5
  436. package/src/services/kernel-timers-cutover-chaos-worker.ts +1 -1
  437. package/src/services/kernel-timers-ingress-chaos-worker.ts +6 -1
  438. package/src/services/kernel-timers-ingress.ts +3 -3
  439. package/src/services/kernel-timers-message-authority-chaos-worker.ts +3 -10
  440. package/src/services/kernel-timers-operator-chaos-worker.ts +3 -2
  441. package/src/services/kernel-timers-outbox.ts +1 -1
  442. package/src/services/kernel-timers-stage10-operator.ts +1 -1
  443. package/src/services/kernel-timers.ts +4 -3
  444. package/src/services/land-gate-placement.ts +11 -2
  445. package/src/services/land-issue-relations.ts +5 -4
  446. package/src/services/land-restart-retry.ts +7 -6
  447. package/src/services/landed-ancestry.ts +6 -5
  448. package/src/services/legacy-landing-host.ts +4 -1
  449. package/src/services/legacy-landing-recovery.ts +8 -6
  450. package/src/services/managed-running.ts +17 -17
  451. package/src/services/memory-areas.ts +3 -3
  452. package/src/services/merge-pause.ts +9 -15
  453. package/src/services/operator-decisions.ts +37 -41
  454. package/src/services/orchestrator-registration-recovery.ts +6 -2
  455. package/src/services/orchestrator-upgrade.ts +14 -12
  456. package/src/services/permission-decision.ts +4 -3
  457. package/src/services/plan-ci-notice.ts +1 -1
  458. package/src/services/plan-conformance.ts +4 -4
  459. package/src/services/plan-dispatch-policy.ts +10 -3
  460. package/src/services/plan-dispatch.ts +35 -14
  461. package/src/services/plan-graph.ts +39 -261
  462. package/src/services/plan-import.ts +1 -1
  463. package/src/services/plan-live-bindings.ts +8 -37
  464. package/src/services/plan-task-create.ts +1 -1
  465. package/src/services/plan-terminal-refs.ts +2 -12
  466. package/src/services/plan-wake-digest.ts +8 -3
  467. package/src/services/profile-trust.ts +2 -2
  468. package/src/services/project.ts +11 -10
  469. package/src/services/prompt-templates.ts +6 -5
  470. package/src/services/provider-api-key.ts +73 -0
  471. package/src/services/provider-hold-nudge.ts +9 -9
  472. package/src/services/provider-hold-record.ts +13 -12
  473. package/src/services/provider-state-audit.ts +19 -18
  474. package/src/services/provisioning-harness/driver.ts +1 -1
  475. package/src/services/provisioning-harness/fixture-matrix.ts +3 -3
  476. package/src/services/provisioning-harness/lifecycle.ts +24 -22
  477. package/src/services/provisioning-harness/prepare.ts +16 -17
  478. package/src/services/rate-limit-resume.ts +10 -9
  479. package/src/services/red-main-auto-revert.ts +7 -5
  480. package/src/services/red-main-controller-deps.ts +20 -3
  481. package/src/services/red-main-incident.ts +3 -1
  482. package/src/services/red-main-quarantine.ts +2 -3
  483. package/src/services/register-agent.ts +22 -22
  484. package/src/services/restart-project-role.ts +1 -1
  485. package/src/services/restart-spawn.ts +17 -16
  486. package/src/services/review-publish.ts +7 -24
  487. package/src/services/review-ref-reconcile.ts +29 -38
  488. package/src/services/runtime-dependency-alert.ts +27 -0
  489. package/src/services/scheduler-command.ts +11 -9
  490. package/src/services/scheduler.ts +5 -5
  491. package/src/services/self-effort-grant.ts +5 -25
  492. package/src/services/send-message.ts +16 -33
  493. package/src/services/shutdown-agent.ts +17 -14
  494. package/src/services/spawn-agent.ts +12 -41
  495. package/src/services/spawn-chain-inspector.ts +1 -1
  496. package/src/services/spawn-cwd-placement.ts +21 -5
  497. package/src/services/spawn-issue-activity.ts +8 -6
  498. package/src/services/spawn-launch.ts +17 -1
  499. package/src/services/spawn-loss-escalation.ts +1 -1
  500. package/src/services/spawn-registration-watchdog.ts +2 -2
  501. package/src/services/spawn-repo-probe.ts +7 -5
  502. package/src/services/spawn-tree-cleanup.ts +7 -8
  503. package/src/services/steward-reaper.ts +4 -4
  504. package/src/services/task-context-hydration.ts +25 -1
  505. package/src/services/task-delivery.ts +20 -34
  506. package/src/services/task-entity.ts +40 -203
  507. package/src/services/task-issue-link.ts +13 -20
  508. package/src/services/task-issue-weave.ts +12 -11
  509. package/src/services/task-lifecycle.ts +27 -31
  510. package/src/services/task-repo-cwd.ts +37 -0
  511. package/src/services/task-review-hold.ts +4 -17
  512. package/src/services/task-semantic-events.ts +13 -11
  513. package/src/services/task-state-reconcile.ts +3 -4
  514. package/src/services/task-validation.ts +2 -2
  515. package/src/services/team-templates.ts +5 -5
  516. package/src/services/team.ts +31 -98
  517. package/src/services/terminal-provider-exit.ts +6 -5
  518. package/src/services/timer-message-fire-chaos-worker.ts +7 -3
  519. package/src/services/timer-message-fire-outbox.ts +1 -1
  520. package/src/services/transient-agent-reaper.ts +22 -19
  521. package/src/services/turn-reconcile-audit.ts +9 -9
  522. package/src/services/user-onboarding.ts +8 -6
  523. package/src/services/user-profile.ts +6 -9
  524. package/src/services/work-finality.ts +16 -4
  525. package/src/services/workflow-auto-start.ts +2 -1
  526. package/src/services/workflow-caller.ts +61 -4
  527. package/src/services/workflow-child-proof-worker.ts +1 -1
  528. package/src/services/workflow-control-proof-worker.ts +1 -1
  529. package/src/services/workflow-coordinator.ts +8 -2
  530. package/src/services/workflow-decisions.ts +5 -5
  531. package/src/services/workflow-deferred-cleanup.ts +1 -1
  532. package/src/services/workflow-effect-driver.ts +42 -19
  533. package/src/services/workflow-effects.ts +41 -27
  534. package/src/services/workflow-pins.ts +7 -4
  535. package/src/services/workflow-reconcile.ts +1 -0
  536. package/src/services/workflow-resume-pins.ts +3 -3
  537. package/src/services/workflow-routing-defaults.ts +18 -0
  538. package/src/services/workflow-run-view.ts +4 -3
  539. package/src/services/workflow-run.test-fixture.ts +1 -1
  540. package/src/services/workflow-runs.ts +34 -22
  541. package/src/services/workflow-supervisor-state.ts +21 -1
  542. package/src/services/workflow-supervisor.ts +4 -3
  543. package/src/services/workspace-recovery.ts +4 -3
  544. package/src/setup.ts +47 -8
  545. package/src/spawn-admission.ts +10 -2
  546. package/src/spawn-placement.ts +27 -9
  547. package/src/spawn-targets.ts +8 -8
  548. package/src/sse-agent-status.ts +15 -6
  549. package/src/sse.ts +49 -24
  550. package/src/startup-context-injection.ts +61 -57
  551. package/src/steward-handoff.ts +4 -3
  552. package/src/steward-policy-cleanup.ts +9 -8
  553. package/src/steward.ts +2 -2
  554. package/src/task-dispatch-live.ts +5 -2
  555. package/src/task-dispatcher.ts +2 -2
  556. package/src/token-db.ts +2 -2
  557. package/src/token-usage-async.ts +2 -4
  558. package/src/user-awaiting-reply.ts +5 -5
  559. package/src/utils.ts +7 -0
  560. package/src/workspace-actions.ts +24 -29
  561. package/src/workspace-auto-merge.ts +14 -12
  562. package/src/workspace-changed-paths-client.ts +16 -5
  563. package/src/workspace-cleanup-stale.ts +30 -7
  564. package/src/workspace-command-settle.ts +24 -16
  565. package/src/workspace-config.ts +1 -1
  566. package/src/workspace-conflict-resolver.ts +9 -7
  567. package/src/workspace-dead-owner-recovery.ts +5 -4
  568. package/src/workspace-escalation.ts +12 -11
  569. package/src/workspace-human-escalation.ts +3 -3
  570. package/src/workspace-land-gate-watchdog.ts +3 -3
  571. package/src/workspace-land-refusal.ts +20 -0
  572. package/src/workspace-land-stopped.ts +1 -0
  573. package/src/workspace-merge.ts +10 -26
  574. package/src/workspace-nothing-to-land-notice.ts +2 -2
  575. package/src/workspace-orphans.ts +18 -37
  576. package/src/workspace-pr-completion.ts +10 -8
  577. package/src/workspace-rekey.ts +3 -3
  578. package/src/workspace-steward-failure.ts +2 -2
  579. package/src/workspace-steward-wake.ts +2 -2
  580. package/public/assets/agent-liveness-CaNwK0Zf.js +0 -2
  581. package/public/assets/overview-C1DCTzzV.js +0 -2
  582. package/public/assets/provider-display-DsuWMvVL.js +0 -2
  583. package/public/assets/run-card-CpKqRbhg.js +0 -2
  584. package/public/assets/shipping-B9YtnwtG.js +0 -2
  585. package/public/assets/store-DcClXLH0.js +0 -9
  586. package/runner/src/agent-runner/http-liveness.ts +0 -85
  587. package/src/db/on-loop-write-transaction.ts +0 -34
@@ -123,7 +123,7 @@ function writeResult(result: Record<string, unknown>): void {
123
123
  * live-slow-applier boundary, a LIVE stall handshaken over marker files). */
124
124
  function faultsFor(boundary: string): TimerIngressFaults {
125
125
  switch (boundary) {
126
- case "accept-before-commit": return { beforeAcceptCommit: selfKill };
126
+ case "accept-before-commit": return {}; // Armed on the writer thread in main().
127
127
  case "accept-after-commit": return { afterAcceptCommit: selfKill };
128
128
  case "apply-after-claim": return { afterClaim: selfKill };
129
129
  case "apply-after-target": return { afterApply: selfKill };
@@ -253,6 +253,11 @@ async function recoverLoop(host: ModuleHost, ingress: TimerIngress): Promise<voi
253
253
 
254
254
  async function main(): Promise<void> {
255
255
  initDb(DB_PATH);
256
+ if (BOUNDARY === "accept-before-commit") {
257
+ const { getGateway } = await import("../db/gateway");
258
+ const kind = CMD === "accept-cancel" ? "Cancel" : "Create";
259
+ await getGateway().write("seam.armFault", { name: `timerIngress.accept${kind}.beforeCommit`, action: "kill" });
260
+ }
256
261
  const host = buildHost();
257
262
 
258
263
  if (CMD === "accept-create") {
@@ -121,6 +121,7 @@
121
121
  * undriven seed only parks later).
122
122
  *
123
123
  */
124
+ import { framed } from "../hub-metrics";
124
125
  import { randomUUID } from "node:crypto";
125
126
  import { errMessage } from "@humwick/sdk";
126
127
  import {
@@ -669,9 +670,8 @@ export function createTimerIngress(options: TimerIngressOptions): TimerIngress {
669
670
 
670
671
  start() {
671
672
  if (ticker) return;
672
- const pass = () => {
673
- void api.applyOnce().catch((error) => console.warn(`timer ingress applier pass failed: ${errMessage(error)}`));
674
- };
673
+ const pass = framed("timer kernel-timer-ingress", () =>
674
+ api.applyOnce().catch((error) => console.warn(`timer ingress applier pass failed: ${errMessage(error)}`)));
675
675
  pass(); // boot recovery: converge whatever a prior process left unsettled
676
676
  ticker = setInterval(pass, tickMs);
677
677
  },
@@ -1,14 +1,7 @@
1
+ import { upsertAgentAsync } from "../db/agents-async";
1
2
  import { createControllableClock, createSqliteModuleHost, createSeededRng, type WorkflowStepCommitFaults } from "@humwick/kernel";
2
3
  import { timers } from "@humwick/kernel/timers.pilot";
3
- import {
4
- getDb,
5
- getScheduledTimer,
6
- initDb,
7
- insertScheduledTimer,
8
- TimerMessageAuthorityParticipantStore,
9
- TimerMessageAuthorityStore,
10
- upsertAgent,
11
- } from "../db";
4
+ import { getDb, getScheduledTimer, initDb, insertScheduledTimer, TimerMessageAuthorityParticipantStore, TimerMessageAuthorityStore } from "../db";
12
5
  import { migrateInputFor } from "./kernel-timers-migrate";
13
6
 
14
7
  const [dbPath, command, boundary = "none", shape = "once"] = process.argv.slice(2);
@@ -49,7 +42,7 @@ const host = createSqliteModuleHost({
49
42
  host.register(timers);
50
43
 
51
44
  if (command === "seed") {
52
- upsertAgent({ id: "stage5-agent", name: "stage5-agent", status: "online", ready: true });
45
+ upsertAgentAsync({ id: "stage5-agent", name: "stage5-agent", status: "online", ready: true });
53
46
  const inserted = insertScheduledTimer({
54
47
  target: "stage5-agent",
55
48
  createdBy: "stage5-agent",
@@ -1,7 +1,8 @@
1
+ import { upsertAgentAsync } from "../db/agents-async";
1
2
  import { relayEnv } from "@humwick/sdk/env";
2
3
  import { Database } from "bun:sqlite";
3
4
  import { existsSync, writeFileSync } from "node:fs";
4
- import { applyConnectionPragmas, getDb, initDb, insertScheduledTimer, setDb, upsertAgent } from "../db";
5
+ import { applyConnectionPragmas, getDb, initDb, insertScheduledTimer, setDb } from "../db";
5
6
  import { decideLegacyTimerMessageFire } from "../db/timer-message-fire";
6
7
  import { executeTimerMessageOperator } from "./kernel-timers-operator";
7
8
  import { createToken } from "../token-db";
@@ -73,7 +74,7 @@ const audit = { actor: "dashboard:chaos", authenticated: true, authorized: true
73
74
  async function main(): Promise<void> {
74
75
  if (action === "seed") {
75
76
  initDb(dbPath);
76
- upsertAgent({ id: "chaos-agent", name: "chaos-agent", status: "online", ready: true });
77
+ (await upsertAgentAsync({ id: "chaos-agent", name: "chaos-agent", status: "online", ready: true }));
77
78
  seed("message-a");
78
79
  seed("message-b");
79
80
  seed("message-c");
@@ -124,7 +124,7 @@ export async function drainKernelRelayOutbox(host: ModuleHost, options: DrainOut
124
124
  try {
125
125
  // At-least-once: a re-drained row re-presents the SAME `base:run:N` key, so `sendMessageService`
126
126
  // returns the already-stored message (`created:false`) instead of storing a second — no double-send.
127
- const message = send(sendInputOf(row), sendAuthContext(row));
127
+ const message = await send(sendInputOf(row), sendAuthContext(row));
128
128
  await host.invoke(timers, "markRelaySendSent", DRAINER_IDENTITY, { id: row.id, messageId: message.message.id });
129
129
  result.sent += 1;
130
130
  } catch (error) {
@@ -181,7 +181,7 @@ export async function runStage10OperatorTransfer(
181
181
  if (!await recordG1TransferAsync(input.requestId, options.ownerId, fenced.epoch, g1)) {
182
182
  return access.result(input, commandId, "running");
183
183
  }
184
- } else coordinator.markReverseTransferDesired(targetMode, sourceMode);
184
+ } else (await coordinator.markReverseTransferDesired(targetMode, sourceMode));
185
185
 
186
186
  let batchNumber = 0;
187
187
  for (;;) {
@@ -1,3 +1,4 @@
1
+ import { framed } from "../hub-metrics";
1
2
  import { errMessage } from "@humwick/sdk";
2
3
  import { createModuleHost, type ModuleHost } from "@humwick/kernel";
3
4
  import type { WorkflowRuntime } from "@humwick/kernel/workflow-runtime";
@@ -213,11 +214,11 @@ export function startKernelServedTimers(options: { autoTick?: boolean } = {}): K
213
214
 
214
215
  // Boot + interval both drive the single-flight pass. Capturing `running` per tick means a tick that
215
216
  // fires after teardown returns early rather than pumping a torn-down supervisor.
216
- const pump = () => {
217
+ const pump = framed("timer kernel-timers", () => {
217
218
  const current = running;
218
219
  if (!current) return;
219
- void pumpRunningTimers(current).catch((error) => console.warn(`kernel timers pump failed: ${errMessage(error)}`));
220
- };
220
+ return pumpRunningTimers(current).catch((error) => console.warn(`kernel timers pump failed: ${errMessage(error)}`));
221
+ });
221
222
  // Tests that drive the supervisor only by awaited pumps opt out of the boot pass and the interval.
222
223
  if (options.autoTick === false) return running;
223
224
  pump();
@@ -1,4 +1,6 @@
1
- import type { Command, LandGatesConfig, Orchestrator, WorkspaceRecord } from "@humwick/sdk";
1
+ import type { Command, LandGatesConfig, Orchestrator, WorkspaceRecord, WorktreeProvisionConfig } from "@humwick/sdk";
2
+ import { DELEGATED_LAND_DEPS_REQUIRED } from "@humwick/sdk/worktree-config";
3
+ import { LandConfigurationError } from "../workspace-land-refusal";
2
4
  import { recordTaskEventAsync } from "../db/task-async";
3
5
  import { boundTaskIdsForWorkspace } from "./workspace-task-binding";
4
6
  import { listOrchestrators } from "../db";
@@ -13,7 +15,7 @@ export function gateHostMeetsRequirements(host: Orchestrator, requirements: NonN
13
15
 
14
16
  /** Absence preserves local landing; declared requirements opt into fleet placement. */
15
17
  export async function selectLandGateHost(workspace: WorkspaceRecord, owner: Orchestrator,
16
- remoteIdentity: string, requirements?: LandGatesConfig["requirements"],
18
+ remoteIdentity: string, requirements?: LandGatesConfig["requirements"], depsStrategy?: WorktreeProvisionConfig["depsStrategy"],
17
19
  ): Promise<{ orchestrator: Orchestrator; repoRoot: string; delegated: boolean }> {
18
20
  if (!requirements) return { orchestrator: owner, repoRoot: workspace.repoRoot, delegated: false };
19
21
  const views = new Map(listHostViews(Date.now()).map((host) => [host.id, host]));
@@ -39,6 +41,13 @@ export async function selectLandGateHost(workspace: WorkspaceRecord, owner: Orch
39
41
  };
40
42
  const delegates = eligible.filter((host) => host.id !== owner.id && host.capabilities?.delegatedLandGateV1 === true)
41
43
  .sort((a, b) => availableSlots(b) - availableSlots(a));
44
+ if (delegates.length && depsStrategy === "symlink") {
45
+ if (gateHostMeetsRequirements(owner, requirements)) {
46
+ throw new Error(`owner ${owner.hostname} temporarily unavailable for local symlink dependency gates`
47
+ + (notReady.length ? `: ${notReady.join("; ")}` : " (gate admission disabled)"));
48
+ }
49
+ throw new LandConfigurationError(`${DELEGATED_LAND_DEPS_REQUIRED}; owner ${owner.hostname} does not meet gate host requirements`);
50
+ }
42
51
  const mapped = delegates.length ? await repoCwdsByHost(workspace.sourceCwd || workspace.repoRoot,
43
52
  remoteIdentity, delegates.map((host) => host.id), true) : undefined;
44
53
  for (const host of delegates) {
@@ -1,4 +1,5 @@
1
- import { getTask, getTaskDetail, insertTaskEvent, listTaskEvents } from "../db";
1
+ import { insertTaskEventAsync } from "../db/runtime-tail-async";
2
+ import { getTask, getTaskDetail, listTaskEvents } from "../db";
2
3
  import { listIssuesForEntity } from "../db/issue-associations";
3
4
  import { defaultTaskIssueRelation } from "../db/task-issue-relation";
4
5
  import { emitTaskChanged } from "../sse";
@@ -29,17 +30,17 @@ export function canCloseBacklink(ref: IssueRef, links: LandTaskIssueLinks): bool
29
30
  return (linkedTasks.length ? linkedTasks : links).some((link) => link.buildLike);
30
31
  }
31
32
 
32
- export function recordReferencesOnlyLand(links: LandTaskIssueLinks, selected: IssueRef[], landKey: string): void {
33
+ export async function recordReferencesOnlyLand(links: LandTaskIssueLinks, selected: IssueRef[], landKey: string): Promise<void> {
33
34
  const selectedIds = new Set(selected.map((ref) => ref.id));
34
35
  for (const link of links) {
35
36
  const refs = link.issues.filter((issue) => issue.relation === "references" && issue.ref.status !== "closed" && !selectedIds.has(issue.ref.id));
36
37
  if (!refs.length || listTaskEvents(link.taskId).some((event) => event.type === "issue-left-open" && event.metadata.landKey === landKey)) continue;
37
- insertTaskEvent(link.taskId, {
38
+ (await insertTaskEventAsync(link.taskId, {
38
39
  source: "issue-lifecycle", type: "issue-left-open", severity: "info",
39
40
  title: "Issue left open: references-only",
40
41
  body: `Left open because this Task references these issues: ${refs.map((issue) => `${issue.ref.repo}#${issue.ref.externalKey}`).join(", ")}.`,
41
42
  metadata: { landKey, reason: "references-only", issueRefIds: refs.map((issue) => issue.ref.id) },
42
- }, Date.now());
43
+ }, Date.now()));
43
44
  const task = getTaskDetail(link.taskId);
44
45
  if (task) emitTaskChanged(task, "task.issue-left-open");
45
46
  }
@@ -1,4 +1,5 @@
1
- import { createActivityEvent, updateWorkspaceStatusAsync } from "../db";
1
+ import { createActivityEventAsync } from "../db/activity-async";
2
+ import { updateWorkspaceStatusAsync } from "../db";
2
3
  import { deferLandSettleSideEffect } from "../land-settle-dispatch";
3
4
  import { routeNotification } from "../notification-router";
4
5
  import { resolveCoordinatorAgentId } from "../steward-identity";
@@ -37,17 +38,17 @@ export async function settleRestartKilledLand(command: Command, workspace: Works
37
38
  ...mergeRetryEnqueuedAtPatch(mergeResult, command),
38
39
  });
39
40
  if (transitioned) {
40
- deferLandSettleSideEffect("land-restart-retry", () => notifyLandRedispatching(transitioned, command, headSha));
41
+ deferLandSettleSideEffect("land-restart-retry", async () => await notifyLandRedispatching(transitioned, command, headSha));
41
42
  }
42
43
  return transitioned;
43
44
  }
44
45
 
45
- function notifyLandRedispatching(workspace: WorkspaceRecord, command: Command, headSha: string | undefined): void {
46
+ async function notifyLandRedispatching(workspace: WorkspaceRecord, command: Command, headSha: string | undefined): Promise<void> {
46
47
  const branch = workspace.branch ?? workspace.id;
47
48
  const base = workspace.baseRef ?? "main";
48
49
  const head = headSha ? ` at \`${headSha.slice(0, 12)}\`` : "";
49
50
  const body = `\`${branch}\` → \`${base}\`: ${LAND_RESTART_RETRY_REASON}. Relay re-dispatches the same land${head} automatically and re-runs its gate. No action needed; do not re-deliver. A land result follows.`;
50
- createActivityEvent({
51
+ (await createActivityEventAsync({
51
52
  clientId: `land-restart-retry-${command.id}`,
52
53
  kind: "state",
53
54
  title: "Land killed by restart; re-dispatching",
@@ -56,12 +57,12 @@ function notifyLandRedispatching(workspace: WorkspaceRecord, command: Command, h
56
57
  icon: "ti-refresh-alert",
57
58
  view: "orchestrators",
58
59
  metadata: { source: "server", workspaceId: workspace.id, commandId: command.id },
59
- });
60
+ }));
60
61
  const author = workspace.ownerAgentId;
61
62
  const coordinator = resolveCoordinatorAgentId(author);
62
63
  const recipients = withWorkspaceTaskOwnerRoles([author, coordinator], workspace);
63
64
  if (!recipients.length) return;
64
- routeNotification({
65
+ await routeNotification({
65
66
  type: "workspace.land_redispatched",
66
67
  scope: { author, parent: coordinator ?? undefined, repoRoot: workspace.repoRoot, workspaceId: workspace.id },
67
68
  recipients,
@@ -1,3 +1,4 @@
1
+ import { createActivityEventAsync } from "../db/activity-async";
1
2
  import { repoDefaultBranch } from "@humwick/sdk/land-gates";
2
3
  import { withWorkspaceTaskOwnerRoles } from "../task-owner-notices";
3
4
  // #1713 — the coordinator's "landed" signal, derived from GIT ANCESTRY rather than a command's
@@ -15,7 +16,7 @@ import { withWorkspaceTaskOwnerRoles } from "../task-owner-notices";
15
16
  // transport error). We do NOT guess "landed" — we degrade to an actionable
16
17
  // "verify manually" signal that names the sha and the stalled merge command id.
17
18
  import { landFailureEventKey } from "../land-failure-event-key";
18
- import { createActivityEvent } from "../db";
19
+
19
20
  import { stewardFallbackTarget } from "../config";
20
21
  import { emitRelayEvent } from "../events";
21
22
  import { routeNotification } from "../notification-router";
@@ -372,7 +373,7 @@ function landUnconfirmedText(input: LandUnconfirmedInput): { subject: string; bo
372
373
  * obligation) to the branch owner's coordinator and the fallback steward, and always leaves a
373
374
  * durable relay event + activity event so the outcome is auditable even if no one is reachable.
374
375
  */
375
- export function notifyLandUnconfirmed(input: LandUnconfirmedInput): void {
376
+ export async function notifyLandUnconfirmed(input: LandUnconfirmedInput): Promise<void> {
376
377
  const { workspace, kind } = input;
377
378
  const owner = workspace.ownerAgentId ?? undefined;
378
379
  const coordinator = resolveCoordinatorAgentId(owner);
@@ -398,7 +399,7 @@ export function notifyLandUnconfirmed(input: LandUnconfirmedInput): void {
398
399
 
399
400
  // #1912 §4 retained: command settlement schedules this through a synchronous deferred callback;
400
401
  // it cannot await without changing the settle/error contract for land completion.
401
- createActivityEvent({
402
+ (await createActivityEventAsync({
402
403
  clientId: `workspace-land-unconfirmed-${workspace.id}-${input.commandId ?? "nocmd"}-${kind}`,
403
404
  kind: "state",
404
405
  title: kind === "not-ancestor"
@@ -411,11 +412,11 @@ export function notifyLandUnconfirmed(input: LandUnconfirmedInput): void {
411
412
  icon: "ti-alert-octagon",
412
413
  view: "orchestrators",
413
414
  metadata: { source: "server", maintenanceJobId: "workspace-land-unconfirmed", workspaceId: workspace.id, mergeCommandId: input.commandId, landOutcome: kind },
414
- });
415
+ }));
415
416
 
416
417
  const recipients = withWorkspaceTaskOwnerRoles([owner, coordinator, fallback], workspace);
417
418
  if (recipients.length === 0) return;
418
- routeNotification({
419
+ await routeNotification({
419
420
  type: "workspace.land_unconfirmed",
420
421
  scope: { workspaceId: workspace.id, repoRoot: workspace.repoRoot, ...(owner ? { author: owner } : {}), ...(coordinator ? { parent: coordinator } : {}) },
421
422
  recipients,
@@ -1,5 +1,5 @@
1
1
  import { cleanDeliveryGatePolicy, cleanLandGateRequirements } from "@humwick/sdk/land-gates";
2
- import type { CapturedDeliveryGateRequirement, LandGatesConfig } from "@humwick/sdk";
2
+ import type { CapturedDeliveryGateRequirement, LandGatesConfig, WorktreeProvisionConfig } from "@humwick/sdk";
3
3
  import { errMessage, exactLandingSourceIdentity, RELAY_TOKEN_HEADER, isRecord, stringValue, type LandingContainmentMode } from "@humwick/sdk";
4
4
  import { isTrustedOrchestratorApiUrl, relayToken } from "../config";
5
5
  import { classifyLegacyLanding, type LandingLaneIdentity } from "../landing-lane-key";
@@ -14,6 +14,7 @@ export interface HostResolvedLandingIdentity extends LandingLaneIdentity {
14
14
  readonly sourceHeadSha: string;
15
15
  readonly baseHeadSha?: string;
16
16
  readonly gateRequirements?: LandGatesConfig["requirements"];
17
+ readonly gateDepsStrategy?: WorktreeProvisionConfig["depsStrategy"];
17
18
  readonly deliveryGate?: CapturedDeliveryGateRequirement;
18
19
  readonly landGateTimeoutBudgetMs?: number;
19
20
  }
@@ -131,6 +132,8 @@ export async function discoverLandingIdentityOnHost(
131
132
  return { ...classified.laneIdentity, sourceHeadSha: source.sourceHeadSha, ...(baseHeadSha ? { baseHeadSha } : {}),
132
133
  ...(delivery.deliveryRequire ? { deliveryGate: { command: delivery.delivery!, require: delivery.deliveryRequire } } : {}),
133
134
  ...(gateRequirements ? { gateRequirements } : {}),
135
+ ...(body.gateDepsStrategy === "command" || body.gateDepsStrategy === "none" || body.gateDepsStrategy === "symlink"
136
+ ? { gateDepsStrategy: body.gateDepsStrategy } : {}),
134
137
  ...(typeof body.landGateTimeoutBudgetMs === "number" && Number.isSafeInteger(body.landGateTimeoutBudgetMs) && body.landGateTimeoutBudgetMs >= 0
135
138
  ? { landGateTimeoutBudgetMs: body.landGateTimeoutBudgetMs } : {}) };
136
139
  }
@@ -1,5 +1,7 @@
1
- import { commandExecutorConfirmedGone, getCommandClaimOwnerToken, updateCommand } from "../commands-db.ts";
2
- import { releaseMergeLease } from "../db/merge-lease.ts";
1
+ import { releaseMergeLeaseAsync } from "../db/runtime-tail-async";
2
+ import { updateCommandAsync } from "../commands-write";
3
+ import { commandExecutorConfirmedGone, getCommandClaimOwnerToken } from "../commands-db.ts";
4
+
3
5
  import { recordExecutionProofAsync, terminalizeLegacyLandingAsync } from "../commands-landing-async.ts";
4
6
  import { resolveCommandExecutorOwner } from "../merge-drain.ts";
5
7
  import type { Command, Orchestrator } from "../types.ts";
@@ -30,9 +32,9 @@ export async function reconcileLegacyLandingExecution(
30
32
  && commandExecutorConfirmedGone(command, getCommandClaimOwnerToken(command.id),
31
33
  resolveCommandExecutorOwner(command, orchestrators), now);
32
34
  if (!pastLease && !ownerGone) return null;
33
- const terminal = updateCommand(command.id, { status: "timed_out", error: ownerGone
34
- ? LEGACY_UNFENCED_RESTART_ERROR : "command timed out" }, { executor: true });
35
- if (terminal) releaseMergeLease({ commandId: terminal.id });
35
+ const terminal = (await updateCommandAsync(command.id, { status: "timed_out", error: ownerGone
36
+ ? LEGACY_UNFENCED_RESTART_ERROR : "command timed out" }, { executor: true }));
37
+ if (terminal) (await releaseMergeLeaseAsync({ commandId: terminal.id }));
36
38
  return terminal;
37
39
  }
38
40
  if (command.landingContainmentMode !== "cgroup-v2-close-v1") return null;
@@ -82,7 +84,7 @@ export async function reconcileLegacyLandingExecution(
82
84
  const ownerState = resolveCommandExecutorOwner(command, orchestrators);
83
85
  if (!commandExecutorConfirmedGone(command, claimOwnerToken, ownerState, now)) {
84
86
  if (typeof command.expiresAt === "number" && command.expiresAt <= now && ownerState?.status !== "online") {
85
- alertUnprovenLandLaneHolder(command);
87
+ await alertUnprovenLandLaneHolder(command);
86
88
  }
87
89
  return null;
88
90
  }
@@ -12,13 +12,13 @@
12
12
  // Composed by `registerAgent` (HTTP + bus registration) and called directly by the
13
13
  // orchestrator-report projection in lifecycle-manager. It does NOT upsert the agent
14
14
  // row — the agent registers itself over HTTP/bus; this only reconciles managed state.
15
- import { createActivityEvent, resolveQueuedDirectMessages, resolveQueuedPolicyMessages } from "../db";
16
- import { getManagedAgentState, updateManagedAgentState } from "../config-store";
15
+ import { createActivityEventAsync } from "../db";
16
+ import { getManagedAgentState } from "../config-store";
17
17
  import { emitRelayEvent } from "../events";
18
18
  import { emitMessageAvailable, emitMessageDeliveryUpdated, emitNewMessage } from "../sse";
19
19
  import type { AuthContext } from "./auth-context";
20
20
  import type { ManagedAgentState, Message } from "../types";
21
- import { resolveQueuedCoordinatorMessages } from "../db/coordinator-delivery.ts";
21
+ import { updateManagedAgentStateAsync, resolveQueuedDirectMessagesAsync, resolveQueuedPolicyMessagesAsync, resolveQueuedCoordinatorMessagesAsync } from "../db/lifecycle-tail-async";
22
22
 
23
23
  interface ManagedRunningInput {
24
24
  policyName?: string;
@@ -44,11 +44,11 @@ interface ManagedRunningInput {
44
44
  * - the managed-state change emits via `emitManagedState` (source "lifecycle-manager"
45
45
  * + an activity-feed transition row), never the source-"server" `emitManagedAgentStateChanged`.
46
46
  */
47
- export function markManagedAgentRunning(
47
+ export async function markManagedAgentRunning(
48
48
  input: ManagedRunningInput,
49
49
  ctx: AuthContext,
50
50
  opts: { now?: () => number } = {},
51
- ): void {
51
+ ): Promise<void> {
52
52
  if (!input.policyName || !input.spawnRequestId) return;
53
53
  // #1797 — the reconcile REBINDS `managed_agent_state.agent_id` (and, via
54
54
  // `updateManagedAgentState`, the retained `last_agent_id`), which `managedStewardBoundAgentId` →
@@ -88,7 +88,7 @@ export function markManagedAgentRunning(
88
88
  const now = opts.now ?? (() => Date.now());
89
89
 
90
90
  const fromState = state.status;
91
- const patch: Parameters<typeof updateManagedAgentState>[1] = {
91
+ const patch: Parameters<typeof updateManagedAgentStateAsync>[1] = {
92
92
  status: "running",
93
93
  agentId: input.agentId || state.agentId,
94
94
  tmuxSession: input.tmuxSession ?? state.tmuxSession,
@@ -101,11 +101,11 @@ export function markManagedAgentRunning(
101
101
  };
102
102
  // #3615 — repeated roster reports still flush queued messages, without rewriting running state.
103
103
  if (Object.entries(patch).some(([key, value]) => state[key as keyof ManagedAgentState] !== value)) {
104
- const next = updateManagedAgentState(input.policyName, patch);
105
- if (next) emitManagedState(next, fromState);
104
+ const next = await updateManagedAgentStateAsync(input.policyName, patch);
105
+ if (next) await emitManagedState(next, fromState);
106
106
  }
107
107
 
108
- const available = resolveQueuedPolicyMessages(input.policyName, input.agentId || state.agentId || "");
108
+ const available = await resolveQueuedPolicyMessagesAsync(input.policyName, input.agentId || state.agentId || "");
109
109
  if (available.length) {
110
110
  emitMessageAvailable(input.policyName, input.agentId || state.agentId || "", available);
111
111
  for (const message of available) {
@@ -126,31 +126,31 @@ export function markManagedAgentRunning(
126
126
  // the came-up-running op.
127
127
  let transitionSeq = 0;
128
128
 
129
- export function emitManagedState(
129
+ export async function emitManagedState(
130
130
  state: ManagedAgentState,
131
131
  fromState: string | undefined,
132
132
  reason?: string,
133
133
  now: () => number = () => Date.now(),
134
- ): void {
134
+ ): Promise<void> {
135
135
  emitRelayEvent({
136
136
  type: "policy.state.changed",
137
137
  source: "lifecycle-manager",
138
138
  subject: state.policyName,
139
139
  data: state as unknown as Record<string, unknown>,
140
140
  });
141
- if (fromState !== state.status) recordManagedTransition(state, fromState, reason, now);
141
+ if (fromState !== state.status) await recordManagedTransition(state, fromState, reason, now);
142
142
  }
143
143
 
144
- function recordManagedTransition(
144
+ async function recordManagedTransition(
145
145
  state: ManagedAgentState,
146
146
  fromState: string | undefined,
147
147
  reason: string | undefined,
148
148
  now: () => number,
149
- ): void {
149
+ ): Promise<void> {
150
150
  const why = reason ?? state.lastError ?? undefined;
151
151
  // #1912 §4 retained: this is shared by synchronous registration, restart settlement, and
152
152
  // orchestrator-report projection. Its transition + queue flush need one future async redesign.
153
- createActivityEvent({
153
+ await createActivityEventAsync({
154
154
  clientId: `lifecycle-${state.policyName}-${state.status}-${now()}-${++transitionSeq}`,
155
155
  kind: "state",
156
156
  title: `${state.policyName}: ${fromState ?? "—"} → ${state.status}`,
@@ -177,8 +177,8 @@ function recordManagedTransition(
177
177
  * No-op when there are no queued direct messages. Returns the flushed messages so
178
178
  * callers (e.g. the resweep safety net, #706) can report how many were recovered.
179
179
  */
180
- export function flushQueuedDirectMessages(agentId: string): Message[] {
181
- const available = [...resolveQueuedDirectMessages(agentId), ...resolveQueuedCoordinatorMessages(agentId)];
180
+ export async function flushQueuedDirectMessages(agentId: string): Promise<Message[]> {
181
+ const available = [...await resolveQueuedDirectMessagesAsync(agentId), ...await resolveQueuedCoordinatorMessagesAsync(agentId)];
182
182
  if (!available.length) return [];
183
183
  emitMessageAvailable("direct", agentId, available);
184
184
  for (const message of available) {
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { AREAS_FILE, SYSTEM_AREAS, SYSTEM_AREA_DESCRIPTIONS, areasAtCommit, injectsAtStartup, isSystemArea, type AreaDefinition, type AreasConfig } from "@humwick/sdk/areas";
6
6
  import { stringValue } from "@humwick/sdk";
7
- import { countActivePinnedEntriesInArea, getAgent, ValidationError } from "../db";
7
+ import { countActivePinnedEntriesInAreaAsync, getAgent, ValidationError } from "../db";
8
8
  import type { Project, ProjectEntry } from "../types";
9
9
  import type { AuthContext } from "./auth-context";
10
10
  import { callerHost, callerProjectId } from "./memory-identity";
@@ -125,10 +125,10 @@ export async function resolveWriteAreas(
125
125
  /** When a written entry reaches agents, by its areas. An entry the startup block does not carry
126
126
  * arrives when an agent first touches a path area it names (#3409, #3508). A pinned `project-wide`
127
127
  * entry loads into every agent's startup block, so its write reports how many the cell carries. */
128
- export function areaDeliveryReport(entry: ProjectEntry): { deliveredOnTouch?: true; projectWideActive?: number; note?: string } {
128
+ export async function areaDeliveryReport(entry: ProjectEntry): Promise<{ deliveredOnTouch?: true; projectWideActive?: number; note?: string }> {
129
129
  if (!injectsAtStartup(entry)) return entry.areas?.some((area) => !isSystemArea(area)) ? { deliveredOnTouch: true } : {};
130
130
  if (!entry.areas?.includes(PROJECT_WIDE)) return {};
131
- const projectWideActive = countActivePinnedEntriesInArea(entry.projectId, PROJECT_WIDE);
131
+ const projectWideActive = await countActivePinnedEntriesInAreaAsync(entry.projectId, PROJECT_WIDE);
132
132
  return {
133
133
  projectWideActive,
134
134
  note: `${projectWideActive} active project-wide entries load into every agent's startup block; prefer a path or process area when one fits.`,
@@ -1,11 +1,5 @@
1
- import {
2
- acquireMergePause as acquireMergePauseRow,
3
- getMergePause,
4
- listMergePauses,
5
- releaseMergePause as releaseMergePauseRow,
6
- renewMergePause as renewMergePauseRow,
7
- type MergePauseRecord,
8
- } from "../db";
1
+ import { acquireMergePauseAsync as acquireMergePauseRowAsync, renewMergePauseAsync as renewMergePauseRowAsync, releaseMergePauseAsync as releaseMergePauseRowAsync } from "../db/runtime-tail-async";
2
+ import { getMergePause, listMergePauses, type MergePauseRecord } from "../db";
9
3
 
10
4
  export type { MergePauseRecord };
11
5
 
@@ -17,21 +11,21 @@ export function getAutoMergePause(id: string): MergePauseRecord | null {
17
11
  return getMergePause(id);
18
12
  }
19
13
 
20
- export function pauseAutoMerge(input: {
14
+ export async function pauseAutoMerge(input: {
21
15
  repoRoot: string;
22
16
  baseRef?: string;
23
17
  holder: string;
24
18
  reason?: string;
25
19
  ttlMs?: number;
26
20
  now?: number;
27
- }): { ok: true; pause: MergePauseRecord } | { ok: false; pause: MergePauseRecord } {
28
- return acquireMergePauseRow(input);
21
+ }): Promise<{ ok: true; pause: MergePauseRecord } | { ok: false; pause: MergePauseRecord }> {
22
+ return (await acquireMergePauseRowAsync(input));
29
23
  }
30
24
 
31
- export function renewAutoMergePause(id: string, ttlMs?: number): MergePauseRecord | null {
32
- return renewMergePauseRow(id, ttlMs);
25
+ export async function renewAutoMergePause(id: string, ttlMs?: number): Promise<MergePauseRecord | null> {
26
+ return (await renewMergePauseRowAsync(id, ttlMs));
33
27
  }
34
28
 
35
- export function resumeAutoMerge(input: { id?: string; repoRoot?: string; baseRef?: string }): boolean {
36
- return releaseMergePauseRow(input);
29
+ export async function resumeAutoMerge(input: { id?: string; repoRoot?: string; baseRef?: string }): Promise<boolean> {
30
+ return (await releaseMergePauseRowAsync(input));
37
31
  }