@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
@@ -4,13 +4,14 @@ import { selectProviderConfigEnv } from "@humwick/sdk/child-env";
4
4
  import type { ProviderAdapter, ProviderStatusEvent } from "./adapter";
5
5
  import { logger } from "./logger";
6
6
  import { hostSourcesFor } from "./host-asset-plan";
7
+ import { resolveLaunchCommand } from "./provider-command";
7
8
 
8
9
  /** All real adapters share the managed-spawn login check, including replacements (#3751). */
9
10
  export function withProviderSetup(adapter: ProviderAdapter): ProviderAdapter {
10
11
  const spawn = adapter.spawn.bind(adapter);
11
12
  adapter.spawn = async (config) => {
12
13
  const env = selectProviderConfigEnv(config.providerConfig.env, hostSourcesFor(config).settings);
13
- const auth = await checkProviderAuth(config.provider, undefined, env, config.providerConfig.command);
14
+ const auth = await checkProviderAuth(config.provider, undefined, env, resolveLaunchCommand(config.providerConfig.command), config.env);
14
15
  if (!auth.ok) throw new Error(auth.reason);
15
16
  return spawn(config);
16
17
  };
@@ -21,7 +22,7 @@ export function providerStartupFailure(error: unknown): ProviderStatusEvent {
21
22
  const message = `Provider startup failed: ${errMessage(error)}`;
22
23
  return { status: "error", reason: "provider-turn", providerState: {
23
24
  state: "blocked", terminal: true, reason: "providerSetupRequired", label: "Provider setup required", message,
24
- recommendedAction: "Complete the provider login and first-run setup on this host, then restart the runner.",
25
+ recommendedAction: "Resolve the provider startup failure shown above, then restart the runner.",
25
26
  } };
26
27
  }
27
28
 
@@ -11,7 +11,7 @@ import { PromptCommands, promptOrigin } from "./agent-runner/commands/prompt";
11
11
  import type { NativeSelfResumeHandoff } from "./native-self-resume";
12
12
  import { LifecyclePhase } from "./agent-runner/lifecycle-phase";
13
13
  import { startRunnerMcpProxy, runnerWebToolLog, runnerWebSearch, runnerMcpHiddenTools } from "./runner-mcp-proxy";
14
- import { HttpLiveness } from "./agent-runner/http-liveness";
14
+ import { LivenessExchange } from "./agent-runner/liveness-exchange";
15
15
  import { TaskClaims } from "./agent-runner/task-claims";
16
16
  import { TurnReport } from "./agent-runner/turn-report";
17
17
  import { SessionMirror } from "./agent-runner/session-mirror";
@@ -22,7 +22,7 @@ import { hostname } from "node:os";
22
22
  import { resolveEnvLayers, selectProviderConfigEnv } from "@humwick/sdk/child-env";
23
23
  import { createHash } from "node:crypto";
24
24
  import { join } from "node:path";
25
- import { type ContextState, type Message, type ProviderState, HELD_FOR_PAYLOAD_KEY, PROVIDER_SUBMIT_UNCONFIRMED, PROXY_AUTH_HOLD_KIND, errMessage, frameSuppressedFromTurn, stringValue } from "@humwick/sdk";
25
+ import { type ContextState, type Message, type ProviderState, HELD_FOR_PAYLOAD_KEY, PROVIDER_SUBMIT_UNCONFIRMED, PROXY_AUTH_HOLD_KIND, errMessage, frameSuppressedFromTurn, relayBusUrl, stringValue } from "@humwick/sdk";
26
26
  import { exitRunner } from "./runner-exit";
27
27
  import { isResumeWake, ProviderHoldEpisodes } from "./provider-hold";
28
28
  import { contextStateFromProbeMetrics, quotaStateFromProbeMetrics } from "@humwick/sdk/context-probe";
@@ -88,7 +88,6 @@ import {
88
88
  providerMonitorUnavailableMessage,
89
89
  providerStateFromActiveWork,
90
90
  registerWithinDeadline,
91
- relayBusUrl,
92
91
  runnerAgentStatus,
93
92
  runnerBusErrorAction,
94
93
  runnerMessageMatches,
@@ -218,7 +217,7 @@ export class AgentRunner {
218
217
  private terminalProviderExit?: Record<string, unknown>;
219
218
  private nativeSelfResume = new NativeSelfResumeTracker();
220
219
  private readonly registration: Registration;
221
- private readonly httpLiveness: HttpLiveness;
220
+ private readonly liveness: LivenessExchange;
222
221
  private readonly taskClaims: TaskClaims;
223
222
  private delivering = false;
224
223
  private drainTimer?: Timer;
@@ -367,7 +366,7 @@ export class AgentRunner {
367
366
  disposeEmptyTurns: () => this.emptyTurns.dispose(), resetEmptyTurns: () => this.emptyTurns.reset(), resetLateClearRecovery: () => { this.lateClearRecovery.reset(); this.continuationFence.reset(); },
368
367
  clearLifecycleAction: () => this.lifecycle.setLifecycleAction(undefined), setOffline: () => this.claims.setTerminalStatus("offline"), publishStatus: () => this.publishStatus(),
369
368
  stopDrainTimer: () => { if (this.drainTimer) clearTimeout(this.drainTimer); this.drainTimer = undefined; }, stopSubmitRecoveryPoll: () => this.stopSubmitRecoveryPoll(),
370
- stopTaskClaims: () => this.taskClaims.stop(), stopHttpLiveness: () => this.httpLiveness.stop(), stopCredentials: () => this.credentials.stop(),
369
+ stopTaskClaims: () => this.taskClaims.stop(), stopLiveness: () => this.liveness.stop(), stopCredentials: () => this.credentials.stop(),
371
370
  disarmBusyLivenessReconcile: () => this.disarmBusyLivenessReconcile(), disarmBusyReconciler: () => this.busyReconciler.disarm(),
372
371
  disposeProviderInput: () => this.providerInput.dispose(), disposeParkPosts: () => this.parkPosts.dispose(),
373
372
  stopReasoningTail: () => this.sessionMirror.stopReasoningTail(), clearNativeSessionCapture: () => this.sessionMirror.clearNativeSessionCapture(), stopObligationCache: () => this.obligationCache.stop(),
@@ -433,11 +432,11 @@ export class AgentRunner {
433
432
  void this.proxy?.refreshTools().catch(() => {});
434
433
  },
435
434
  resumeLivenessAndPublishRotation: (status, jti) => {
436
- this.httpLiveness.resetAuthFailure();
435
+ this.liveness.resetAuthFailure();
437
436
  // An earlier auth failure may have stopped the liveness loop; restart it so the
438
- // agent reports live again on the fresh token. startHttpLiveness clears any
437
+ // agent reports live again on the fresh token. startLiveness clears any
439
438
  // existing timer first, so this is safe on the normal (proactive) renew path too.
440
- this.startHttpLiveness();
439
+ this.startLiveness();
441
440
  this.pendingTimelineEvent = { status, id: jti, timestamp: Date.now() };
442
441
  this.bus.reconnectTransport(status === "runtime-token-reminted" ? "runtime token re-minted" : "runtime token renewed");
443
442
  this.publishStatus();
@@ -469,14 +468,14 @@ export class AgentRunner {
469
468
  // #2514 — the per-provider config env carries a dedicated-home provider's (claude-b's) own
470
469
  // credential, which the quota harvest needs to key its reports under the B subscription.
471
470
  providerConfigEnv: () => this.options.providerConfig.env,
472
- http: () => this.http,
473
471
  });
474
- this.httpLiveness = new HttpLiveness({
475
- http: this.http, agentId: this.agentId, instanceId: options.instanceId, logIntervalMs: HTTP_LIVENESS_LOG_INTERVAL_MS,
472
+ this.liveness = new LivenessExchange({
473
+ http: this.http, bus: () => this.bus, agentId: this.agentId, instanceId: options.instanceId, logIntervalMs: HTTP_LIVENESS_LOG_INTERVAL_MS,
476
474
  isStopped: () => this.lifecycle.stopped, isTerminalStatusLatched: () => this.lifecycle.terminalStatusLatched,
477
475
  currentStatus: () => this.claims.currentStatus(),
478
- publishQuota: () => this.providerQuotaHarvest.publish(),
479
- bootstrapUnreadMessages: () => this.bootstrapUnreadMessages(), triggerEffort: () => this.effort.trigger(),
476
+ sampleQuota: () => this.providerQuotaHarvest.sample(),
477
+ acceptQuota: (report, result) => this.providerQuotaHarvest.accept(report, result),
478
+ enqueueMessage: (message) => this.enqueueMessage(message), triggerEffort: () => this.effort.trigger(),
480
479
  recoverRuntimeTokenAfterAuthFailure: (source) => this.credentials.recoverRuntimeTokenAfterAuthFailure(source),
481
480
  logRunnerDiagnostic: (message) => this.logRunnerDiagnostic(message),
482
481
  });
@@ -741,7 +740,7 @@ export class AgentRunner {
741
740
  }, (status) => this.setProviderStatus(status));
742
741
  await this.bootstrapUnreadMessages();
743
742
  this.taskClaims.start();
744
- this.startHttpLiveness();
743
+ this.startLiveness();
745
744
  this.testRunDedupSweep.start();
746
745
  this.credentials.scheduleRuntimeTokenRenewal();
747
746
  this.scheduleDrain();
@@ -2861,7 +2860,7 @@ export class AgentRunner {
2861
2860
  if (published && this.pendingTimelineEvent === timelineEvent) this.pendingTimelineEvent = undefined;
2862
2861
  }
2863
2862
 
2864
- private startHttpLiveness(): void { this.httpLiveness.start(); }
2863
+ private startLiveness(): void { this.liveness.start(); }
2865
2864
 
2866
2865
  private logRunnerDiagnostic(message: string): void { this.context.logRunnerDiagnostic(message); }
2867
2866
  private sessionLog(message: string): void { this.context.sessionLog(message); }
@@ -133,14 +133,6 @@ export function csvTags(raw: string | undefined): string[] {
133
133
  return (raw || "").split(",").map((tag) => tag.trim()).filter(Boolean);
134
134
  }
135
135
 
136
- export function relayBusUrl(relayUrl: string): string {
137
- const url = new URL(relayUrl);
138
- url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
139
- url.pathname = `${url.pathname.replace(/\/+$/, "")}/bus`;
140
- url.search = "";
141
- return url.toString();
142
- }
143
-
144
136
  export function runnerAgentStatus(status: "idle" | "busy" | "offline" | "error"): "idle" | "busy" | "offline" {
145
137
  return status === "error" ? "offline" : status;
146
138
  }
@@ -194,9 +194,13 @@ export function reapSessionScratch(target: SessionScratchTarget): void {
194
194
  // scratch dir reap to avoid leaking one file per spawn.
195
195
  export function reapSessionLauncher(target: SessionLauncherTarget): string[] {
196
196
  const removed: string[] = [];
197
- for (const path of dedupePaths([
197
+ const launchers = dedupePaths([
198
198
  target.launcherScript,
199
199
  target.tmuxSession ? launcherScriptPathForSession(target.tmuxSession, target.launcherDir) : undefined,
200
+ ]);
201
+ for (const path of dedupePaths([
202
+ ...launchers,
203
+ ...launchers.flatMap(path => [`${path}.exit-code`, `${path}.exit-code.stderr`]),
200
204
  target.tmuxSession ? launcherGatePathForSession(target.tmuxSession, target.launcherDir) : undefined,
201
205
  ])) {
202
206
  try {
@@ -286,7 +290,7 @@ export async function sweepStaleLaunchersAsync(opts: LauncherSweepOptions): Prom
286
290
  try {
287
291
  const current = await stat(scriptPath);
288
292
  if (!current.isFile() || opts.now - current.mtimeMs < minAge) continue;
289
- const agentId = await launcherAgentId(scriptPath);
293
+ const agentId = await launcherAgentId(scriptPath.replace(/\.exit-code(?:\.stderr)?$/, ""));
290
294
  if (agentId && opts.keepAgentIds.has(agentId)) continue;
291
295
  await rm(scriptPath, { force: true });
292
296
  removed.push(scriptPath);
@@ -1,3 +1,5 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { getManifest } from "@humwick/providers";
1
3
  import type { SpawnProvider } from "@humwick/sdk";
2
4
  import type { RunnerSpawnConfig, SpawnArgs } from "../src/adapter";
3
5
  import { codexLaunchContext } from "../src/adapters/codex";
@@ -16,8 +18,8 @@ export function systemPromptAppendFromSpawnArgs(
16
18
  spawnArgs: Pick<SpawnArgs, "args">,
17
19
  runnerConfig: RunnerSpawnConfig,
18
20
  ): string {
19
- return provider === "claude"
20
- ? flagValue(spawnArgs.args, "--append-system-prompt") ?? ""
21
+ return getManifest(provider)?.shim?.kind === "claude-relay"
22
+ ? readFileSync(flagValue(spawnArgs.args, "--append-system-prompt-file")!, "utf8")
21
23
  : codexLaunchContext({ meta: { config: runnerConfig } }) ?? "";
22
24
  }
23
25
 
@@ -91,7 +91,8 @@ export class RunnerHttp {
91
91
  });
92
92
  for (const method of ["listPromptTemplates", "listReplyObligations", "listAgents", "pollMessages"] as const) this.when(method, async () => []);
93
93
  this.when("getProviderQuotaConfig", async () => ({}));
94
- for (const method of ["setStatus", "setReady", "heartbeat", "markRead"] as const) this.when(method, async () => {});
94
+ this.when("heartbeat", async () => ({ ok: true, messages: [] }));
95
+ for (const method of ["setStatus", "setReady", "markRead"] as const) this.when(method, async () => {});
95
96
  this.when("recordMessageDeliveryAttempt", async () => ({}) as Awaited<ReturnType<HumwickHttpClient["recordMessageDeliveryAttempt"]>>);
96
97
  this.when("claimMessageResult", async () => ({ ok: true, claimExpiresAt: Date.now() + 60_000 }));
97
98
  this.when("updateTaskStatus", async () => ({}) as Awaited<ReturnType<HumwickHttpClient["updateTaskStatus"]>>);
@@ -44,7 +44,7 @@ const USAGE = [
44
44
  " --db <path> target DB (default: $DB_PATH, else <stateDir>/agent-relay.db)",
45
45
  ].join("\n");
46
46
 
47
- function main(): void {
47
+ async function main(): Promise<void> {
48
48
  const args = parseCleanupArgs(process.argv.slice(2));
49
49
  if (args.help) {
50
50
  console.log(USAGE);
@@ -58,7 +58,7 @@ function main(): void {
58
58
  console.log(`[steward-policy-cleanup] db=${dbPath} mode=${dryRun ? "DRY RUN" : "APPLY"}`);
59
59
  console.log(`[steward-policy-cleanup] scanned ${plan.scanned} steward polic${plan.scanned === 1 ? "y" : "ies"}`);
60
60
 
61
- const result = applyStewardPolicyCleanup(plan, { dryRun });
61
+ const result = (await applyStewardPolicyCleanup(plan, { dryRun }));
62
62
  for (const line of result.log) console.log(` ${line}`);
63
63
  if (result.log.length === 0) console.log(" (nothing to change — already canonical)");
64
64
 
@@ -189,9 +189,9 @@ export function sessionControlsOwnAgentsOnly(ctx: AuthContext): boolean {
189
189
  * operator on agents they are principal of, viewer never. Agent: coordinator authority and, with
190
190
  * several users, the target's principal (or an admin principal). Full-reach callers: always.
191
191
  * Single-user installs keep today's behavior: only the agent coordinator rule applies. */
192
- export function authorizeAgentControl(ctx: AuthContext, target: Pick<AgentCard, "id" | "spawnedBy" | "teamId">, action = "control"): AgentControlDenial | null {
192
+ export async function authorizeAgentControl(ctx: AuthContext, target: Pick<AgentCard, "id" | "spawnedBy" | "teamId">, action = "control"): Promise<AgentControlDenial | null> {
193
193
  const denied = agentControlDecision(ctx, target);
194
- if (denied) recordAuthorityDenial(ctx, target.id, action, denied.reason);
194
+ if (denied) (await recordAuthorityDenial(ctx, target.id, action, denied.reason));
195
195
  return denied;
196
196
  }
197
197
 
@@ -1,3 +1,4 @@
1
+ import { releaseDriveLeaseAsync } from "./db/runtime-tail-async";
1
2
  // Concurrency arbitration — "two humans driving one agent safely" (#388 users wave 5, #394).
2
3
  //
3
4
  // THE single decision home for "may this user drive this agent right now?". It composes three
@@ -18,13 +19,7 @@ import { canonicalHumanAgentId, userSinkId } from "@humwick/sdk";
18
19
  import { isMultiUserWorldAsync } from "./db/agent-ownership-async.ts";
19
20
  import { resolveViewer } from "./agent-authz.ts";
20
21
  import { getUser } from "./db/users.ts";
21
- import {
22
- acquireDriveLease,
23
- getDriveLease,
24
- releaseDriveLease,
25
- takeOverDriveLease,
26
- type DriveLeaseRecord,
27
- } from "./db/drive-leases.ts";
22
+ import { acquireDriveLease, getDriveLease, takeOverDriveLease, type DriveLeaseRecord } from "./db/drive-leases.ts";
28
23
 
29
24
  /** Who holds (or held) the wheel, resolved for human-readable "X is driving" messaging. */
30
25
  interface DriveHolder {
@@ -100,7 +95,7 @@ export async function releaseDrive(userId: string, agentId: string, opts: { forc
100
95
  if (!(await isMultiUserWorldAsync())) return { released: false };
101
96
  const current = getDriveLease(agentId);
102
97
  const isAdmin = resolveViewer(userId)?.role === "admin";
103
- const released = releaseDriveLease(opts.force && isAdmin ? { agentId } : { agentId, userId });
98
+ const released = (await releaseDriveLeaseAsync(opts.force && isAdmin ? { agentId } : { agentId, userId }));
104
99
  return released && current ? { released, previousHolder: driveHolder(current.holderUserId) } : { released };
105
100
  }
106
101
 
@@ -51,11 +51,11 @@ export async function settleAgentExitCleanupAsync(command: Command): Promise<boo
51
51
  const settled = await getGateway().write("commands.settleAgentCleanupSlice", { command: { ...command,
52
52
  result: { owners: [{ ...owner, workspaceIds: ids.slice(at, at + 8) }] } } }) as unknown as AgentCleanupSettlement;
53
53
  for (const workspace of settled.changed) emitWorkspaceChange(workspace);
54
- for (const alert of settled.alerts) alertCleanup(command, alert.agentId, alert.detail, owner);
54
+ for (const alert of settled.alerts) await alertCleanup(command, alert.agentId, alert.detail, owner);
55
55
  await Bun.sleep(5);
56
56
  }
57
57
  if (typeof owner.agentId === "string" && typeof owner.error === "string") {
58
- alertCleanup(command, owner.agentId, owner.error, owner);
58
+ await alertCleanup(command, owner.agentId, owner.error, owner);
59
59
  await Bun.sleep(5);
60
60
  }
61
61
  }
@@ -1,10 +1,14 @@
1
+ import { deleteWorkspaceAsync } from "./db/lifecycle-tail-async";
2
+ import { getGateway } from "./db/gateway";
3
+ import type { AgentCleanupSettlement } from "./db/agent-exit-cleanup";
4
+ import { createCommandAsync } from "./commands-write";
1
5
  import { subscribeRelayEvents } from "./events";
2
6
  import { createHash } from "node:crypto";
3
7
  import { isHumanAgentId, isRecord } from "@humwick/sdk";
4
- import { createCommand } from "./commands-db";
5
- import { hasActiveAgentCleanup, settleAgentCleanupWorkspaces } from "./db/agent-exit-cleanup";
8
+
9
+ import { hasActiveAgentCleanup } from "./db/agent-exit-cleanup";
6
10
  import { emitCommandEvent } from "./command-events";
7
- import { deleteWorkspace, emitWorkspaceChange, getAgent, listOrchestrators, listWorkspaces, getWorkspace } from "./db";
11
+ import { emitWorkspaceChange, getAgent, listOrchestrators, listWorkspaces, getWorkspace } from "./db";
8
12
  import { workspaceOwnerOrchestrator } from "./workspace-host";
9
13
  import { raiseOperatorAlarm } from "./operator-alarm";
10
14
  import { routeNotification } from "./notification-router";
@@ -14,17 +18,17 @@ import { exitCleanupCondition } from "./agent-exit-alarm";
14
18
  import { reapAgentBrowserSessions } from "./services/browser-session";
15
19
 
16
20
  // #3489 — HTTP, bus self-exit, host reports and reapers share the persisted status event.
17
- subscribeRelayEvents((event) => {
18
- if (event.type === "agent.status" && event.data.status === "offline" && event.subject) reapAgentBrowserSessions(event.subject);
21
+ subscribeRelayEvents(async (event) => {
22
+ if (event.type === "agent.status" && event.data.status === "offline" && event.subject) (await reapAgentBrowserSessions(event.subject));
19
23
  });
20
24
 
21
- export function requestAgentExitCleanup(agentId?: string): number {
25
+ export async function requestAgentExitCleanup(agentId?: string): Promise<number> {
22
26
  if (agentId === "system" || isHumanAgentId(agentId)) return 0;
23
27
  const agent = agentId ? getAgent(agentId) : null;
24
28
  if (agent && agent.status !== "offline") return 0;
25
- if (agentId) reapAgentBrowserSessions(agentId); // #3489 — a browser never outlives its agent
29
+ if (agentId) (await reapAgentBrowserSessions(agentId)); // #3489 — a browser never outlives its agent
26
30
  if (agentId) for (const ws of listWorkspaces({ ownerAgentId: agentId })) {
27
- if (ws.mode === "shared") deleteWorkspace(ws.id);
31
+ if (ws.mode === "shared") (await deleteWorkspaceAsync(ws.id));
28
32
  }
29
33
  const hosts = listOrchestrators().filter((host) => host.status === "online");
30
34
  const owned = agentId ? listWorkspaces({ ownerAgentId: agentId }) : [];
@@ -34,8 +38,8 @@ export function requestAgentExitCleanup(agentId?: string): number {
34
38
  for (const host of hosts) {
35
39
  if (agentId && hostIds.size && !hostIds.has(host.id)) continue;
36
40
  if (hasActiveAgentCleanup(host.agentId, agentId)) continue;
37
- const command = createCommand({ type: "agent.cleanup", source: "system", target: host.agentId, ttlMs: 10 * 60_000,
38
- params: { ...(agentId ? { agentId } : { sweep: true }), requestedBy: "agent-exit-cleanup" } });
41
+ const command = (await createCommandAsync({ type: "agent.cleanup", source: "system", target: host.agentId, ttlMs: 10 * 60_000,
42
+ params: { ...(agentId ? { agentId } : { sweep: true }), requestedBy: "agent-exit-cleanup" } }));
39
43
  emitCommandEvent(command, "command.requested");
40
44
  dispatched++;
41
45
  }
@@ -53,25 +57,25 @@ export async function settleAgentExitCleanup(command: Command): Promise<boolean>
53
57
  const error = command.error ?? "No cleanup inventory owner found; cleanup retained";
54
58
  await settleWorkspaceCleanupCommand({ ...command, status: "failed", error,
55
59
  result: { ...result, workspaceId: typeof command.params.workspaceId === "string" ? command.params.workspaceId : command.correlationId } });
56
- if (command.status === "succeeded") alertCleanup(command, undefined, error);
60
+ if (command.status === "succeeded") await alertCleanup(command, undefined, error);
57
61
  }
58
- const settled = settleAgentCleanupWorkspaces(command);
62
+ const settled = await getGateway().write("commands.settleAgentCleanupSlice", { command }) as unknown as AgentCleanupSettlement;
59
63
  for (const workspace of settled.changed) emitWorkspaceChange(workspace);
60
- for (const alert of settled.alerts) alertCleanup(command, alert.agentId, alert.detail);
64
+ for (const alert of settled.alerts) await alertCleanup(command, alert.agentId, alert.detail);
61
65
  for (const owner of owners) {
62
66
  if (typeof owner.agentId !== "string") continue;
63
- if (typeof owner.error === "string") alertCleanup(command, owner.agentId, owner.error, owner);
67
+ if (typeof owner.error === "string") await alertCleanup(command, owner.agentId, owner.error, owner);
64
68
  }
65
69
  if (command.status !== "succeeded" && !owners.some((owner) => typeof owner.error === "string")) {
66
70
  console.warn(`[agent-exit-cleanup] host ${command.target} agent ${command.params.agentId ?? "host sweep"}: ${command.error ?? "host cleanup failed"}`);
67
71
  }
68
72
  if (Array.isArray(result?.unattributed) && result.unattributed.length) {
69
- alertCleanup(command, undefined, `Host artifacts retained because ownership is unavailable: ${result.unattributed.join(", ")}`, { artifactPaths: result.unattributed });
73
+ await alertCleanup(command, undefined, `Host artifacts retained because ownership is unavailable: ${result.unattributed.join(", ")}`, { artifactPaths: result.unattributed });
70
74
  }
71
75
  return true;
72
76
  }
73
77
 
74
- export function alertCleanup(command: Command, agentId: string | undefined, detail: string, artifacts?: Record<string, unknown>): void {
78
+ export async function alertCleanup(command: Command, agentId: string | undefined, detail: string, artifacts?: Record<string, unknown>): Promise<void> {
75
79
  const owner = artifacts ?? (Array.isArray(command.result?.owners) ? command.result.owners.filter(isRecord)
76
80
  .find((owner) => owner.agentId === agentId) : undefined);
77
81
  if (owner?.inventoryFailed === true) return;
@@ -91,9 +95,9 @@ export function alertCleanup(command: Command, agentId: string | undefined, deta
91
95
  const host = listOrchestrators().find((host) => host.agentId === command.target);
92
96
  const body = `Agent ${agent?.label ?? agent?.name ?? "unknown"} (${identity ?? "unknown"}) on host ${host ? `${host.hostname} (${host.id})` : command.target}\nPaths: ${paths.join(", ")}\n${detail}`;
93
97
  const digest = createHash("sha256").update(`${command.target}:${identity}:${exitCleanupCondition(detail)}:${JSON.stringify(paths)}`).digest("hex").slice(0, 24);
94
- if (!raiseOperatorAlarm({ clientId: `exit-cleanup:${digest}`, source: "agent-exit-cleanup", subject: "Agent exit cleanup retained files", detail: body, dedupeEvent: true,
95
- metadata: { agentId, commandId: command.id, orchestrator: command.target, paths } })) return;
98
+ if (!(await raiseOperatorAlarm({ clientId: `exit-cleanup:${digest}`, source: "agent-exit-cleanup", subject: "Agent exit cleanup retained files", detail: body, dedupeEvent: true,
99
+ metadata: { agentId, commandId: command.id, orchestrator: command.target, paths } }))) return;
96
100
  const parent = agent?.spawnedBy;
97
- if (parent) routeNotification({ type: "agent.cleanup_failed", scope: { agentId, parent }, recipients: [parent], forceDelivery: true,
101
+ if (parent) await routeNotification({ type: "agent.cleanup_failed", scope: { agentId, parent }, recipients: [parent], forceDelivery: true,
98
102
  message: { subject: "Agent exit cleanup retained files", body, replyExpected: false, idempotencyKey: `exit-cleanup:${digest}`, payload: { kind: "agent.cleanup_failed", agentId, commandId: command.id } } });
99
103
  }