@humwick/server 0.130.1 → 0.130.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (811) hide show
  1. package/README.md +5 -0
  2. package/bundled/prompts/manifest.json +1 -0
  3. package/bundled/prompts/task.hydration.md +1 -1
  4. package/bundled/roles/builder.md +1 -1
  5. package/docs/guides/sub-coordinators.md +12 -5
  6. package/docs/guides/tools-administration.md +4 -0
  7. package/docs/guides/tools-coordination.md +2 -0
  8. package/docs/guides/tools-tasks.md +8 -0
  9. package/docs/guides/workflows.md +74 -0
  10. package/docs/openapi.json +486 -4
  11. package/package.json +10 -18
  12. package/public/assets/{MessageBubble-BWpoBjl4.js → MessageBubble-Bq9kr21N.js} +2 -2
  13. package/public/assets/{PlanGraphPanel-C0auck3n.js → PlanGraphPanel-Dqiroy06.js} +2 -2
  14. package/public/assets/{TraceView-DBnOx7AQ.js → TraceView-DYU962-H.js} +2 -2
  15. package/public/assets/{VaultDecisionCard-0kp2oNBC.js → VaultDecisionCard-DhPfzioE.js} +2 -2
  16. package/public/assets/{activity-yLztXEBt.js → activity-DzCcQTee.js} +2 -2
  17. package/public/assets/{agent-lineage-BbJDR1dW.js → agent-lineage-SgDt9i3T.js} +2 -2
  18. package/public/assets/agent-liveness-Bq-s73jW.js +2 -0
  19. package/public/assets/{agent-name-CTZBrSD9.js → agent-name-CcY3Aijy.js} +2 -2
  20. package/public/assets/agent-profiles-cxtRBn6O.js +2 -0
  21. package/public/assets/{agent-project-badge-9TqzUUYE.js → agent-project-badge-DGYbIhaI.js} +2 -2
  22. package/public/assets/{agent-tools-D4n40pn8.js → agent-tools-DHbftV0N.js} +2 -2
  23. package/public/assets/{agent-type-icon-D6FUarOf.js → agent-type-icon-CY113sp-.js} +2 -2
  24. package/public/assets/{agents-BYDslkJc.js → agents-BPzY7IlQ.js} +2 -2
  25. package/public/assets/{analytics-B-XSbEMC.js → analytics-DENFPv_a.js} +2 -2
  26. package/public/assets/{artifact-viewer-DdWIfV6M.js → artifact-viewer-KRvSc7sl.js} +2 -2
  27. package/public/assets/{artifacts-DPN1q4pA.js → artifacts-C9gSmL3s.js} +2 -2
  28. package/public/assets/{artifacts-oBOqks-2.js → artifacts-DT-HkI5O.js} +2 -2
  29. package/public/assets/{automation-4KcRFXEu.js → automation-BsmjQhKD.js} +2 -2
  30. package/public/assets/{backlog-Cw9xPTCF.js → backlog-8NYH_62t.js} +2 -2
  31. package/public/assets/{busy-health-CTu32MZt.js → busy-health-D3hwvYb4.js} +2 -2
  32. package/public/assets/{channels-BiXzg1G9.js → channels-DCJ5WL7O.js} +2 -2
  33. package/public/assets/{chat-Ctk2qwvA.js → chat-DAIl357U.js} +3 -3
  34. package/public/assets/{code-preview-Bm1wWqAp.js → code-preview-CzrZfr9U.js} +2 -2
  35. package/public/assets/{connectors-C36ax4Vw.js → connectors-xTxtlyou.js} +2 -2
  36. package/public/assets/{cosmos-Jj9LK2Wf.js → cosmos-BpebFLK2.js} +2 -2
  37. package/public/assets/{crate-agent-H6S7-B9T.js → crate-agent-BHvI5wXC.js} +2 -2
  38. package/public/assets/{dependency-graph-Cd1E23wa.js → dependency-graph-DGT0o3wJ.js} +2 -2
  39. package/public/assets/{deploys-Bwfq146q.js → deploys-hqWOHSHE.js} +2 -2
  40. package/public/assets/{display-CfO7rTuF.js → display-CDeH4I8T.js} +2 -2
  41. package/public/assets/{files-DhhZI2Ih.js → files-BTeGVmTg.js} +2 -2
  42. package/public/assets/{fleet-B_rFEbnL.js → fleet-DgXtNgCa.js} +2 -2
  43. package/public/assets/{fleet-metrics-BkHP-P3R.js → fleet-metrics-BHEt5yc_.js} +2 -2
  44. package/public/assets/{formatted-body-Cm1RrzmN.js → formatted-body-MLtodyPp.js} +3 -3
  45. package/public/assets/{formatted-body-impl-DQiOuOD1.js → formatted-body-impl-CAe664Z8.js} +2 -2
  46. package/public/assets/{host-providers-dialog-CHqwXTov.js → host-providers-dialog-mapF4Fj9.js} +2 -2
  47. package/public/assets/index-CqqgOI5R.js +15 -0
  48. package/public/assets/index-MYAIwYTX.css +2 -0
  49. package/public/assets/{insights-fH1EL-qZ.js → insights-DNyf7IzF.js} +2 -2
  50. package/public/assets/{integrations-C5Oix6ng.js → integrations-DlYOHq7T.js} +2 -2
  51. package/public/assets/{issue-ref-chip-ODyondIa.js → issue-ref-chip-CeWBNWn7.js} +2 -2
  52. package/public/assets/{log-viewer-Cvfy6PW7.js → log-viewer-Cib8nqdE.js} +2 -2
  53. package/public/assets/{maintenance-D8CDH5wZ.js → maintenance-DSn1cPm7.js} +2 -2
  54. package/public/assets/{managed-agents-egllbpij.js → managed-agents-C3CkM81m.js} +2 -2
  55. package/public/assets/{markdown-preview-CYSFgVgK.js → markdown-preview-W4VQQPAv.js} +3 -3
  56. package/public/assets/{markdown-preview-impl-BteVIjX4.js → markdown-preview-impl-CMsTdhjq.js} +2 -2
  57. package/public/assets/{memory-C8WmXsyr.js → memory-BV17qtO4.js} +2 -2
  58. package/public/assets/{messages-BzQdqlO6.js → messages-Bm_1AqSA.js} +2 -2
  59. package/public/assets/{orchestrators-B1HxzkNw.js → orchestrators-Dg-vfP09.js} +2 -2
  60. package/public/assets/{overview-DCUnI4Z7.js → overview-DcYCrvlr.js} +2 -2
  61. package/public/assets/{pairs-ftCd2XcD.js → pairs-8o9nuG3V.js} +2 -2
  62. package/public/assets/{profile-icon-B2zH8DMH.js → profile-icon-BsRyBMea.js} +2 -2
  63. package/public/assets/project-profile-instructions-DETKFn_E.js +2 -0
  64. package/public/assets/projects-M_m6AHws.js +2 -0
  65. package/public/assets/{prompt-settings-Bftq9czX.js → prompt-settings-C_mNCgeL.js} +2 -2
  66. package/public/assets/provider-display-BEeLXC_D.js +2 -0
  67. package/public/assets/{registry-DWCU5c8q.js → registry-DDHHHE5N.js} +2 -2
  68. package/public/assets/run-card-Dt4I4jaP.js +2 -0
  69. package/public/assets/scroll-text-BKXS1ahr.js +2 -0
  70. package/public/assets/{secrets-C7GIUATz.js → secrets-BkVwxI5O.js} +2 -2
  71. package/public/assets/{service-access-settings-C3aujqTG.js → service-access-settings-Crq-6a-B.js} +2 -2
  72. package/public/assets/{settings-C6sZ9eBa.js → settings-CYcavMFu.js} +2 -2
  73. package/public/assets/shipping-H6gzEeZB.js +2 -0
  74. package/public/assets/{stats-V9Z-GxUd.js → stats-BJVeWkpV.js} +2 -2
  75. package/public/assets/{status-dot-CVv0iGHL.js → status-dot-BcHyw1Vw.js} +2 -2
  76. package/public/assets/store-DKPDIZBe.js +9 -0
  77. package/public/assets/{tasks-CXU75HRF.js → tasks-qJjlQPpx.js} +2 -2
  78. package/public/assets/{teams-BPf976zb.js → teams-Cd5Sk1uX.js} +2 -2
  79. package/public/assets/{terminal-viewer-DE9BOe-8.js → terminal-viewer-CpY5_m7W.js} +3 -3
  80. package/public/assets/{terminal-viewer-impl-D04pjmGh.js → terminal-viewer-impl-DI_2llFR.js} +2 -2
  81. package/public/assets/token-estimate-Co-Jdphh.js +2 -0
  82. package/public/assets/{use-agent-terminal-B1yR456R.js → use-agent-terminal-0yJA_buM.js} +2 -2
  83. package/public/assets/{use-decisions-D-S4tpDf.js → use-decisions-uJXHf34W.js} +2 -2
  84. package/public/assets/use-project-list-CpWl6eHQ.js +2 -0
  85. package/public/assets/{use-selectors-CnrAk2YP.js → use-selectors-BdxBW8mL.js} +2 -2
  86. package/public/assets/{user-avatar-nBFIcR4M.js → user-avatar-3IndfpOc.js} +2 -2
  87. package/public/assets/versioned-prompt-editor-CIVg7XB1.js +8 -0
  88. package/public/assets/{work-queue-TCjJxeT-.js → work-queue-B9rnLwHZ.js} +2 -2
  89. package/public/assets/{workflow-marker-Cf3Hf2fN.js → workflow-marker-X8wxyhzC.js} +2 -2
  90. package/public/assets/{workflows-CXQX20Qj.js → workflows-o5YyMFW7.js} +2 -2
  91. package/public/assets/{workspaces-qSYzKYMA.js → workspaces-CzEGoAng.js} +2 -2
  92. package/public/cosmos.html +4 -4
  93. package/public/index.html +31 -29
  94. package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
  95. package/runner/plugins/claude/hooks/gate-run-guard.provisioned.mjs +31 -1
  96. package/runner/src/adapters/claude-effort.ts +2 -4
  97. package/runner/src/adapters/claude-headless.ts +1 -1
  98. package/runner/src/adapters/claude-launch-exit.ts +26 -0
  99. package/runner/src/adapters/claude-session-probe.ts +1 -1
  100. package/runner/src/adapters/claude-tmux.ts +38 -10
  101. package/runner/src/adapters/claude.ts +28 -75
  102. package/runner/src/adapters/codex-launch-config.ts +4 -5
  103. package/runner/src/adapters/codex.ts +1 -1
  104. package/runner/src/adapters/opencode-provider.ts +7 -22
  105. package/runner/src/adapters/opencode.ts +4 -4
  106. package/runner/src/adapters/provider-quota-harvest.ts +20 -71
  107. package/runner/src/agent-runner/credentials.ts +42 -12
  108. package/runner/src/agent-runner/inbox.ts +27 -0
  109. package/runner/src/agent-runner/lifecycle-milestones.ts +2 -4
  110. package/runner/src/agent-runner/liveness-exchange.ts +104 -0
  111. package/runner/src/bin/claude.ts +4 -0
  112. package/runner/src/bin/codex.ts +4 -0
  113. package/runner/src/bin/opencode.ts +4 -0
  114. package/runner/src/claude-system-prompt.ts +49 -0
  115. package/runner/src/index.ts +5 -2
  116. package/runner/src/launch-assembly.ts +14 -10
  117. package/runner/src/profile-home.ts +1 -1
  118. package/runner/src/project-instructions.ts +2 -2
  119. package/runner/src/provider-command.ts +18 -0
  120. package/runner/src/provider-setup.ts +35 -0
  121. package/runner/src/providers.ts +2 -1
  122. package/runner/src/runner-core.ts +32 -38
  123. package/runner/src/runner-helpers.ts +0 -8
  124. package/runner/src/session-scratch.ts +6 -2
  125. package/runner/src/spawn-input.ts +2 -1
  126. package/runner/src/test-run-dedup.ts +59 -56
  127. package/runner/test-support/provisioning-context.ts +4 -2
  128. package/runner/test-support/runner-harness.ts +2 -1
  129. package/scripts/cd-config.ts +8 -0
  130. package/scripts/gate-run-lease.ts +10 -7
  131. package/scripts/gate.sh +5 -1
  132. package/scripts/steward-policy-cleanup.ts +2 -2
  133. package/src/agent-authz.ts +2 -2
  134. package/src/agent-drive-arbiter.ts +3 -8
  135. package/src/agent-exit-cleanup-async.ts +2 -2
  136. package/src/agent-exit-cleanup.ts +23 -19
  137. package/src/agent-lifecycle-events.ts +112 -85
  138. package/src/agent-ref.ts +3 -2
  139. package/src/agent-status-events.ts +43 -14
  140. package/src/auth/password.ts +4 -3
  141. package/src/auth/session-refresh.ts +1 -1
  142. package/src/auth/session.test-fixture.ts +2 -2
  143. package/src/auth/session.ts +7 -7
  144. package/src/automations/crud.ts +8 -81
  145. package/src/automations/dispatch.ts +33 -58
  146. package/src/automations/index.ts +1 -1
  147. package/src/automations/persistence.ts +65 -0
  148. package/src/automations/precheck.ts +18 -16
  149. package/src/automations/read-async.ts +11 -0
  150. package/src/automations/reconcile.ts +30 -39
  151. package/src/automations/storage.ts +33 -10
  152. package/src/automations/write-async.ts +33 -0
  153. package/src/branch-land-notice.ts +93 -0
  154. package/src/branch-landed.ts +31 -98
  155. package/src/bus.ts +40 -39
  156. package/src/cd-deploy-notify.ts +32 -4
  157. package/src/cd-host-lag-notify.ts +7 -6
  158. package/src/ci/incidents.ts +2 -2
  159. package/src/ci/monitor.ts +5 -8
  160. package/src/ci/notifications.ts +4 -4
  161. package/src/ci/root-missing.ts +4 -9
  162. package/src/ci/transition-notify.ts +12 -44
  163. package/src/claude-app/oauth-http.ts +3 -3
  164. package/src/cli/cd-pauses.ts +19 -0
  165. package/src/cli/orchestrator.ts +1 -1
  166. package/src/cli/state.ts +2 -19
  167. package/src/cli/task-edit.ts +22 -0
  168. package/src/cli/task.ts +3 -1
  169. package/src/cli/workflow.ts +19 -4
  170. package/src/commands-db.ts +7 -7
  171. package/src/commands-write.ts +8 -0
  172. package/src/compaction-watch.ts +10 -8
  173. package/src/config-store-write.ts +13 -1
  174. package/src/config-store.ts +25 -14
  175. package/src/config.ts +4 -11
  176. package/src/connectors.ts +10 -8
  177. package/src/context-advisory.ts +22 -21
  178. package/src/db/activity-async.ts +6 -1
  179. package/src/db/activity-write-ops.ts +12 -1
  180. package/src/db/activity.ts +1 -14
  181. package/src/db/agent-action-write.ts +36 -0
  182. package/src/db/agent-control-async.ts +9 -0
  183. package/src/db/agent-control-write.ts +49 -0
  184. package/src/db/agent-effort-observe.ts +22 -0
  185. package/src/db/agent-meta.ts +14 -3
  186. package/src/db/agent-search.ts +1 -15
  187. package/src/db/agents-async.ts +59 -9
  188. package/src/db/agents-write-ops.ts +12 -3
  189. package/src/db/agents.ts +95 -65
  190. package/src/db/auth-identities.ts +2 -2
  191. package/src/db/automation-read-ops.ts +11 -0
  192. package/src/db/automation-write-ops.ts +46 -0
  193. package/src/db/blackboard.ts +2 -2
  194. package/src/db/browser-session-write.ts +32 -0
  195. package/src/db/bus-outbox-write-ops.ts +3 -1
  196. package/src/db/checkout-refresh-schema.ts +47 -0
  197. package/src/db/checkout-refresh.ts +5 -5
  198. package/src/db/ci-incidents-async.ts +5 -5
  199. package/src/db/ci-incidents-write-ops.ts +2 -2
  200. package/src/db/command-agent-profile-backfill.ts +39 -0
  201. package/src/db/command-agent-profiles.ts +5 -1
  202. package/src/db/command-retention.ts +126 -0
  203. package/src/db/command-row.ts +10 -2
  204. package/src/db/commands-list-query.ts +2 -0
  205. package/src/db/commands-planner-stats.test-fixture.ts +8 -0
  206. package/src/db/commands-read-ops.ts +16 -0
  207. package/src/db/commands-spawn-read.ts +1 -1
  208. package/src/db/config-store-write-ops.ts +7 -2
  209. package/src/db/connection.ts +1 -182
  210. package/src/db/context-carry-write.ts +74 -0
  211. package/src/db/continuation-archives-async.ts +5 -0
  212. package/src/db/continuation-archives-write-ops.ts +7 -0
  213. package/src/db/continuations.ts +6 -6
  214. package/src/db/db-error-registry.ts +12 -0
  215. package/src/db/db-writer-worker.ts +8 -1
  216. package/src/db/deploy-events-async.ts +1 -0
  217. package/src/db/deploy-events-read-ops.ts +2 -1
  218. package/src/db/deploy-events.ts +35 -4
  219. package/src/db/gateway.ts +26 -133
  220. package/src/db/history-retention-ops.ts +13 -0
  221. package/src/db/hosts-registration.ts +10 -2
  222. package/src/db/hosts.ts +9 -6
  223. package/src/db/inbox-async.ts +2 -2
  224. package/src/db/inbox-read-ops.ts +1 -1
  225. package/src/db/inbox.ts +9 -17
  226. package/src/db/index.ts +2 -0
  227. package/src/db/integrations-async.ts +8 -0
  228. package/src/db/integrations-ops.ts +15 -0
  229. package/src/db/integrations.ts +15 -21
  230. package/src/db/issue-associations.ts +2 -2
  231. package/src/db/issue-lifecycle.ts +3 -4
  232. package/src/db/issue-refs-async.ts +23 -0
  233. package/src/db/issue-refs-read-ops.ts +6 -0
  234. package/src/db/issue-refs-write-ops.ts +29 -0
  235. package/src/db/issue-refs.ts +15 -16
  236. package/src/db/kernel-event-log-schema.ts +2 -0
  237. package/src/db/land-boundaries.ts +51 -5
  238. package/src/db/land-gate-attestations.ts +2 -2
  239. package/src/db/landing-receipts.ts +2 -2
  240. package/src/db/lifecycle-context-write.ts +5 -0
  241. package/src/db/lifecycle-tail-async.ts +76 -0
  242. package/src/db/lifecycle-tail-write-ops.ts +62 -0
  243. package/src/db/lifecycle-write-window.ts +2 -1
  244. package/src/db/lineage-pair-dedupe-sql.ts +3 -3
  245. package/src/db/long-running-work.ts +2 -2
  246. package/src/db/main-connection-mode.ts +11 -0
  247. package/src/db/main-connection-writes.ts +41 -2
  248. package/src/db/maintenance-job-reconcile.ts +61 -0
  249. package/src/db/maintenance-job-runs-async.ts +14 -0
  250. package/src/db/maintenance-job-write-ops.ts +9 -0
  251. package/src/db/maintenance-pauses.ts +2 -2
  252. package/src/db/mappers.ts +2 -14
  253. package/src/db/merge-lease.ts +1 -15
  254. package/src/db/message-send.ts +4 -0
  255. package/src/db/messages.ts +31 -25
  256. package/src/db/migrations.ts +25 -16
  257. package/src/db/notification-write-ops.ts +19 -0
  258. package/src/db/operator-answer-write.ts +19 -0
  259. package/src/db/orchestrators.ts +14 -76
  260. package/src/db/pairs-async.ts +22 -1
  261. package/src/db/pairs-write-ops.ts +8 -3
  262. package/src/db/pairs.ts +42 -61
  263. package/src/db/plan-dispatch-schema.ts +5 -1
  264. package/src/db/plan-ready-notices.ts +43 -0
  265. package/src/db/plan-tools-include-migration.ts +36 -0
  266. package/src/db/plans-write-ops.ts +2 -0
  267. package/src/db/presence-buffer.ts +5 -0
  268. package/src/db/presence-loop.ts +18 -23
  269. package/src/db/presence-write.ts +0 -6
  270. package/src/db/project-entries-async.ts +14 -0
  271. package/src/db/project-entries-read-ops.ts +5 -1
  272. package/src/db/project-entries-write-ops.ts +8 -0
  273. package/src/db/project-entries.ts +15 -12
  274. package/src/db/project-journal.ts +2 -2
  275. package/src/db/project-profile-instructions.ts +50 -0
  276. package/src/db/project-trust-approvals.ts +2 -2
  277. package/src/db/prompt-templates.ts +4 -4
  278. package/src/db/prompt-versions.ts +9 -2
  279. package/src/db/provider-config-history.ts +8 -3
  280. package/src/db/provider-model-seed.ts +34 -0
  281. package/src/db/read-op-marshaling-fixtures.ts +23 -0
  282. package/src/db/read-ops.ts +8 -0
  283. package/src/db/retention.ts +13 -2
  284. package/src/db/review-publish-write.ts +8 -0
  285. package/src/db/routing-policy.ts +2 -3
  286. package/src/db/runtime-admin-async.ts +19 -0
  287. package/src/db/runtime-admin-write-ops.ts +36 -0
  288. package/src/db/runtime-tail-async.ts +288 -0
  289. package/src/db/runtime-tail-write-ops.ts +97 -0
  290. package/src/db/schema.ts +13 -4
  291. package/src/db/spawn-budget.ts +5 -0
  292. package/src/db/spawn-delegation-state.ts +11 -4
  293. package/src/db/spawn-delegation.ts +1 -11
  294. package/src/db/sql-audit-indexes.ts +3 -0
  295. package/src/db/stats-async.ts +9 -6
  296. package/src/db/task-entity.ts +28 -6
  297. package/src/db/task-list.ts +3 -1
  298. package/src/db/tasks.ts +1 -17
  299. package/src/db/team-claim-policy.ts +60 -0
  300. package/src/db/teams-async.ts +4 -0
  301. package/src/db/teams-write-ops.ts +4 -0
  302. package/src/db/terminal-events.ts +15 -0
  303. package/src/db/timer-cutover-bodies.ts +292 -0
  304. package/src/db/timer-cutover-core.ts +37 -278
  305. package/src/db/timer-cutover-state.ts +40 -0
  306. package/src/db/timer-cutover-write-ops.ts +1 -40
  307. package/src/db/timer-ingress.ts +7 -1
  308. package/src/db/token-db-write-ops.ts +19 -0
  309. package/src/db/token-standing-async.ts +12 -0
  310. package/src/db/token-standing.ts +21 -20
  311. package/src/db/token-usage-retention.ts +33 -0
  312. package/src/db/token-usage-write-ops.ts +1 -1
  313. package/src/db/token-usage.ts +4 -1
  314. package/src/db/user-invites-async.ts +13 -0
  315. package/src/db/user-invites.ts +3 -3
  316. package/src/db/users.ts +14 -6
  317. package/src/db/workflow-contact.ts +1 -1
  318. package/src/db/workflow-task-read-ops.ts +30 -0
  319. package/src/db/workspaces.ts +8 -5
  320. package/src/db/write-ops.ts +37 -12
  321. package/src/db/writer-fault-seam.ts +2 -9
  322. package/src/db/writer-fault-test-ops.ts +18 -0
  323. package/src/db/writer-gateway.ts +58 -56
  324. package/src/dev.ts +8 -3
  325. package/src/dispatch-availability.ts +10 -6
  326. package/src/ephemeral/{landing-ingress-proof-worker.ts → landing-ingress-proof.test-fixture.ts} +4 -2
  327. package/src/event-loop-lag.ts +4 -2
  328. package/src/event-loop-yield.ts +2 -2
  329. package/src/events.ts +10 -8
  330. package/src/host/disk-alert.ts +121 -0
  331. package/src/host-provider-store.ts +5 -4
  332. package/src/hub-metrics-report.ts +5 -1
  333. package/src/hub-metrics.ts +38 -18
  334. package/src/injection-sweep-pacing.ts +6 -8
  335. package/src/land-gate-notifications.ts +11 -10
  336. package/src/land-gate-queue-progress.ts +3 -3
  337. package/src/land-settle-dispatch.ts +52 -92
  338. package/src/lifecycle-context-pressure.ts +11 -10
  339. package/src/lifecycle-manager.ts +107 -100
  340. package/src/maintenance/breaker.ts +18 -16
  341. package/src/maintenance/cd-watcher.ts +3 -3
  342. package/src/maintenance/checkout-refresh.ts +18 -1
  343. package/src/maintenance/critical-job-watchdog.ts +19 -20
  344. package/src/maintenance/events.ts +3 -3
  345. package/src/maintenance/history-retention-job.ts +30 -0
  346. package/src/maintenance/index.ts +1 -0
  347. package/src/maintenance/jobs.ts +32 -69
  348. package/src/maintenance/long-running-work.ts +3 -1
  349. package/src/maintenance/offline-agent-prune-job.ts +28 -0
  350. package/src/maintenance/orphaned-sessions.ts +5 -4
  351. package/src/maintenance/pauses.ts +4 -10
  352. package/src/maintenance/plan-ready-notice-job.ts +71 -0
  353. package/src/maintenance/scheduler.ts +98 -137
  354. package/src/maintenance/stalled-delivery-pager.ts +10 -9
  355. package/src/maintenance/teams.ts +19 -30
  356. package/src/maintenance/workspaces.ts +18 -28
  357. package/src/managed-policy-escalation.ts +7 -7
  358. package/src/managed-policy.ts +32 -28
  359. package/src/managed-provider-gate.ts +5 -4
  360. package/src/managed-spawn-reservation.ts +5 -4
  361. package/src/mcp/index.ts +12 -9
  362. package/src/mcp/output-descriptions.ts +8 -8
  363. package/src/mcp/presentation.ts +6 -5
  364. package/src/mcp/project-profile-instructions.ts +32 -0
  365. package/src/mcp/runtime-output.ts +6 -1
  366. package/src/mcp/self-care-visibility.ts +2 -2
  367. package/src/mcp/spawn-targets-matrix.ts +10 -1
  368. package/src/mcp/tool-groups.ts +4 -3
  369. package/src/mcp/tool-roles.ts +81 -0
  370. package/src/mcp/tools-spawn.ts +4 -3
  371. package/src/mcp/tools-workspace.ts +1 -1
  372. package/src/mcp-agent-action.ts +1 -2
  373. package/src/mcp-blackboard-tools.ts +6 -5
  374. package/src/mcp-decision-tools.ts +7 -7
  375. package/src/mcp-egress-tools.ts +10 -9
  376. package/src/mcp-issue-activity-tools.ts +2 -2
  377. package/src/mcp-issue-association-tools.ts +4 -4
  378. package/src/mcp-issue-ref-tools.ts +13 -12
  379. package/src/mcp-maintenance-tools.ts +2 -2
  380. package/src/mcp-merge-tools.ts +5 -5
  381. package/src/mcp-notification-subscription-tools.ts +14 -15
  382. package/src/mcp-output-levels.test-fixture.ts +1 -1
  383. package/src/mcp-profile-trust-tools.ts +5 -5
  384. package/src/mcp-project-journal-tools.ts +4 -12
  385. package/src/mcp-project-tools.ts +17 -18
  386. package/src/mcp-provider-catalog.ts +2 -2
  387. package/src/mcp-routing-policy-tools.ts +3 -2
  388. package/src/mcp-task-tools.ts +11 -5
  389. package/src/mcp-team-template-tools.ts +3 -3
  390. package/src/mcp-team-tools.ts +6 -6
  391. package/src/mcp-workflow-tools.ts +13 -4
  392. package/src/memory-area-injection.ts +13 -12
  393. package/src/memory-boundary-capture.ts +6 -6
  394. package/src/memory-injection.ts +45 -43
  395. package/src/merge-pause-maintenance.ts +5 -4
  396. package/src/notification-router.ts +44 -17
  397. package/src/notification-types.ts +2 -1
  398. package/src/notify.ts +5 -5
  399. package/src/observed-reset-refresh.ts +4 -4
  400. package/src/operator-alarm.ts +23 -11
  401. package/src/project-ingest.ts +6 -6
  402. package/src/project-instructions.ts +12 -1
  403. package/src/project-profile-instruction-text.ts +6 -0
  404. package/src/project-profile-instructions.ts +20 -0
  405. package/src/project-trust.ts +12 -11
  406. package/src/prompt-resolver.ts +3 -3
  407. package/src/provider-catalog-store.ts +3 -49
  408. package/src/provider-config-store.ts +12 -11
  409. package/src/provider-model-seed.ts +1 -18
  410. package/src/provider-quota-async.ts +5 -7
  411. package/src/provider-quota-config-store.ts +5 -4
  412. package/src/provider-secrets.test-fixture.ts +3 -3
  413. package/src/provider-timeline-event.ts +4 -7
  414. package/src/quota-band-delivery.ts +2 -2
  415. package/src/recipe-runner.ts +6 -5
  416. package/src/repo-config-source.ts +10 -4
  417. package/src/retention-config-store.ts +4 -3
  418. package/src/reviewer-pipeline.ts +11 -10
  419. package/src/routes/_route.ts +4 -4
  420. package/src/routes/_shared.ts +13 -12
  421. package/src/routes/agent-effort.ts +5 -5
  422. package/src/routes/agent-heartbeat-quota.ts +23 -0
  423. package/src/routes/agent-keep.ts +1 -1
  424. package/src/routes/agent-profiles.ts +6 -6
  425. package/src/routes/agent-reporting.ts +1 -1
  426. package/src/routes/agent-self-effort.ts +5 -5
  427. package/src/routes/agent-sessions.ts +24 -24
  428. package/src/routes/agents-spawn.ts +2 -2
  429. package/src/routes/agents.ts +19 -121
  430. package/src/routes/auth.ts +14 -15
  431. package/src/routes/authority-audit.ts +2 -2
  432. package/src/routes/automations.ts +6 -5
  433. package/src/routes/channel-binding-delete.ts +1 -1
  434. package/src/routes/channel-output.ts +3 -3
  435. package/src/routes/claude-api-budget.ts +5 -5
  436. package/src/routes/commands-listing.ts +5 -1
  437. package/src/routes/commands.ts +31 -29
  438. package/src/routes/context-resets.ts +2 -2
  439. package/src/routes/continuation-archives.ts +2 -2
  440. package/src/routes/coordinator-teams.ts +1 -1
  441. package/src/routes/decisions.ts +2 -2
  442. package/src/routes/host-secret-files.ts +1 -1
  443. package/src/routes/hosts.ts +11 -11
  444. package/src/routes/inbox.ts +3 -2
  445. package/src/routes/index.ts +12 -2
  446. package/src/routes/integrations.ts +32 -56
  447. package/src/routes/issue-activity.ts +2 -2
  448. package/src/routes/issue-associations.ts +4 -4
  449. package/src/routes/issue-refs.ts +9 -9
  450. package/src/routes/kernel-timers-operator.ts +1 -1
  451. package/src/routes/memory.ts +1 -1
  452. package/src/routes/merges.ts +11 -11
  453. package/src/routes/messages.ts +23 -17
  454. package/src/routes/orchestrator-bootstrap.ts +2 -2
  455. package/src/routes/orchestrator-host-registration.ts +4 -2
  456. package/src/routes/orchestrator-host-utilization.ts +5 -3
  457. package/src/routes/orchestrator-proxy.ts +4 -4
  458. package/src/routes/orchestrator.ts +28 -19
  459. package/src/routes/pairs.ts +8 -8
  460. package/src/routes/project-profile-instructions.ts +27 -0
  461. package/src/routes/project-trust.ts +3 -3
  462. package/src/routes/projects.ts +16 -16
  463. package/src/routes/prompt-templates.ts +12 -12
  464. package/src/routes/provider-config.ts +6 -6
  465. package/src/routes/provider-quota-config.ts +2 -2
  466. package/src/routes/provider-quotas.ts +10 -10
  467. package/src/routes/run-command.ts +1 -1
  468. package/src/routes/secrets-backup.ts +2 -2
  469. package/src/routes/secrets-import.ts +1 -1
  470. package/src/routes/secrets-vault.ts +7 -7
  471. package/src/routes/settings.ts +6 -6
  472. package/src/routes/shipping.ts +9 -1
  473. package/src/routes/spawn-policy.ts +8 -7
  474. package/src/routes/sse.ts +2 -2
  475. package/src/routes/stats.ts +6 -6
  476. package/src/routes/task-http.ts +15 -1
  477. package/src/routes/task-issues.ts +11 -26
  478. package/src/routes/tasks.ts +22 -53
  479. package/src/routes/team-templates.ts +12 -12
  480. package/src/routes/teams-config.ts +2 -2
  481. package/src/routes/teams.ts +10 -10
  482. package/src/routes/tokens.ts +30 -22
  483. package/src/routes/users.ts +24 -24
  484. package/src/routes/viewer-read.ts +3 -3
  485. package/src/routes/web-tool-calls.ts +4 -4
  486. package/src/routes/workflows.ts +22 -7
  487. package/src/routes/workspaces.ts +17 -16
  488. package/src/routing-policy-normalize.ts +1 -2
  489. package/src/routing-policy-push.ts +6 -6
  490. package/src/routing-step-defaults.ts +0 -2
  491. package/src/runner-token-mint-limit.ts +63 -0
  492. package/src/runtime-grant.ts +21 -13
  493. package/src/runtime-tokens.ts +59 -35
  494. package/src/secrets-broker/config.ts +1 -1
  495. package/src/secrets-broker/service.ts +2 -2
  496. package/src/security.ts +16 -21
  497. package/src/self-resume-carry.ts +21 -110
  498. package/src/self-resume-supersede.ts +4 -3
  499. package/src/self-resume.ts +54 -66
  500. package/src/server-background.ts +2 -2
  501. package/src/server.ts +26 -24
  502. package/src/services/agent-action.ts +12 -31
  503. package/src/services/agent-effort.ts +7 -32
  504. package/src/services/agent-hang-watchdog-job.ts +2 -2
  505. package/src/services/agent-heartbeat.ts +166 -0
  506. package/src/services/agent-reporting.ts +1 -1
  507. package/src/services/browser-inventory.ts +3 -3
  508. package/src/services/browser-session-state.ts +3 -2
  509. package/src/services/browser-session.ts +21 -27
  510. package/src/services/bus-command-update.ts +9 -9
  511. package/src/services/checkout-refresh-state.ts +1 -0
  512. package/src/services/checkout-refresh.test-fixture.ts +3 -2
  513. package/src/services/command-host.ts +7 -2
  514. package/src/services/coordinator-digest.ts +3 -2
  515. package/src/services/dispatch-command.ts +12 -13
  516. package/src/services/effective-launch-driver.ts +14 -9
  517. package/src/services/host-changed-paths.test-fixture.ts +5 -6
  518. package/src/services/host-project-readiness.ts +2 -2
  519. package/src/services/host-providers.ts +1 -1
  520. package/src/services/host-utilization.ts +27 -4
  521. package/src/services/idle-agent-digest.ts +17 -12
  522. package/src/services/idle-epics.ts +9 -10
  523. package/src/services/interrupt-agent.ts +12 -9
  524. package/src/services/issue-activity.ts +3 -3
  525. package/src/services/issue-associations.ts +15 -18
  526. package/src/services/issue-lifecycle-comments.ts +3 -2
  527. package/src/services/issue-lifecycle.ts +69 -72
  528. package/src/services/issue-refs.ts +10 -15
  529. package/src/services/kernel-timers-cutover-chaos-worker.ts +11 -8
  530. package/src/services/kernel-timers-ingress-chaos-worker.ts +6 -1
  531. package/src/services/kernel-timers-ingress.ts +4 -4
  532. package/src/services/kernel-timers-message-authority-chaos-worker.ts +3 -10
  533. package/src/services/kernel-timers-operator-chaos-worker.ts +3 -2
  534. package/src/services/kernel-timers-outbox.ts +1 -1
  535. package/src/services/kernel-timers-stage10-operator.ts +1 -1
  536. package/src/services/kernel-timers.ts +4 -3
  537. package/src/services/land-gate-placement.ts +11 -2
  538. package/src/services/land-issue-relations.ts +5 -4
  539. package/src/services/land-restart-retry.ts +7 -6
  540. package/src/services/landed-ancestry.ts +25 -8
  541. package/src/services/legacy-landing-host.ts +4 -1
  542. package/src/services/legacy-landing-recovery.ts +8 -6
  543. package/src/services/managed-running.ts +17 -17
  544. package/src/services/memory-areas.ts +17 -53
  545. package/src/services/merge-pause.ts +9 -15
  546. package/src/services/operator-decisions.ts +37 -41
  547. package/src/services/orchestrator-registration-recovery.ts +6 -2
  548. package/src/services/orchestrator-upgrade.ts +14 -12
  549. package/src/services/permission-decision.ts +4 -3
  550. package/src/services/plan-ci-notice.ts +57 -0
  551. package/src/services/plan-ci-recovery.ts +2 -55
  552. package/src/services/plan-conformance.ts +4 -4
  553. package/src/services/plan-dispatch-policy.ts +10 -3
  554. package/src/services/plan-dispatch.ts +35 -14
  555. package/src/services/plan-graph.ts +39 -261
  556. package/src/services/plan-import.ts +1 -1
  557. package/src/services/plan-live-bindings.ts +8 -37
  558. package/src/services/plan-task-create.ts +1 -1
  559. package/src/services/plan-terminal-refs.ts +2 -12
  560. package/src/services/plan-wake-digest.ts +9 -3
  561. package/src/services/profile-trust.ts +6 -5
  562. package/src/services/project-config-read.ts +70 -0
  563. package/src/services/project-profile-instructions.ts +54 -0
  564. package/src/services/project.ts +11 -10
  565. package/src/services/prompt-templates.ts +6 -5
  566. package/src/services/provider-hold-nudge.ts +9 -9
  567. package/src/services/provider-hold-record.ts +13 -12
  568. package/src/services/provider-state-audit.ts +19 -18
  569. package/src/services/provisioning-harness/budget-baseline.json +4 -4
  570. package/src/services/provisioning-harness/driver.ts +1 -1
  571. package/src/services/provisioning-harness/fixture-matrix.ts +3 -3
  572. package/src/services/provisioning-harness/lifecycle.ts +24 -22
  573. package/src/services/provisioning-harness/prepare.ts +16 -17
  574. package/src/services/rate-limit-resume.ts +10 -9
  575. package/src/services/red-main-auto-revert.ts +7 -5
  576. package/src/services/red-main-controller-deps.ts +20 -3
  577. package/src/services/red-main-incident.ts +3 -1
  578. package/src/services/red-main-quarantine.ts +2 -3
  579. package/src/services/register-agent.ts +22 -22
  580. package/src/services/restart-project-role.ts +1 -1
  581. package/src/services/restart-spawn.ts +74 -61
  582. package/src/services/review-publish.ts +7 -24
  583. package/src/services/review-ref-reconcile.ts +29 -38
  584. package/src/services/runtime-dependency-alert.ts +27 -0
  585. package/src/services/scheduler-command.ts +11 -9
  586. package/src/services/scheduler.ts +5 -5
  587. package/src/services/self-care-state.ts +2 -1
  588. package/src/services/self-effort-grant.ts +5 -25
  589. package/src/services/self-effort.ts +5 -5
  590. package/src/services/send-message.ts +21 -34
  591. package/src/services/shutdown-agent.ts +17 -14
  592. package/src/services/spawn-agent.ts +25 -43
  593. package/src/services/spawn-chain-inspector.ts +7 -14
  594. package/src/services/spawn-cwd-placement.ts +21 -5
  595. package/src/services/spawn-issue-activity.ts +8 -6
  596. package/src/services/spawn-launch.ts +17 -1
  597. package/src/services/spawn-loss-escalation.ts +1 -1
  598. package/src/services/spawn-policy.ts +68 -0
  599. package/src/services/spawn-registration-watchdog.ts +2 -2
  600. package/src/services/spawn-repo-probe.ts +7 -5
  601. package/src/services/spawn-tree-cleanup.ts +8 -9
  602. package/src/services/steward-reaper.ts +4 -4
  603. package/src/services/task-context-hydration.ts +25 -1
  604. package/src/services/task-delivery.ts +20 -34
  605. package/src/services/task-dispatch.ts +3 -0
  606. package/src/services/task-entity.ts +40 -203
  607. package/src/services/task-issue-link.ts +13 -20
  608. package/src/services/task-issue-weave.ts +12 -11
  609. package/src/services/task-lifecycle.ts +27 -31
  610. package/src/services/task-repo-cwd.ts +37 -0
  611. package/src/services/task-review-hold.ts +4 -17
  612. package/src/services/task-semantic-events.ts +13 -11
  613. package/src/services/task-state-reconcile.ts +8 -17
  614. package/src/services/task-validation.ts +2 -2
  615. package/src/services/team-templates.ts +12 -11
  616. package/src/services/team.ts +31 -98
  617. package/src/services/terminal-provider-exit.ts +6 -5
  618. package/src/services/timer-message-fire-chaos-worker.ts +7 -3
  619. package/src/services/timer-message-fire-outbox.ts +1 -1
  620. package/src/services/transient-agent-reaper.ts +25 -20
  621. package/src/services/turn-reconcile-audit.ts +9 -9
  622. package/src/services/user-onboarding.ts +8 -6
  623. package/src/services/user-profile.ts +6 -9
  624. package/src/services/work-finality.ts +16 -4
  625. package/src/services/workflow-auto-start.ts +26 -13
  626. package/src/services/workflow-caller.ts +61 -4
  627. package/src/services/workflow-child-proof-worker.ts +1 -1
  628. package/src/services/workflow-ci-main.ts +1 -1
  629. package/src/services/workflow-control-proof-worker.ts +1 -1
  630. package/src/services/workflow-coordinator.ts +8 -2
  631. package/src/services/workflow-decisions.ts +5 -5
  632. package/src/services/workflow-deferred-cleanup.ts +5 -3
  633. package/src/services/workflow-effect-driver.ts +42 -17
  634. package/src/services/workflow-effects.ts +58 -37
  635. package/src/services/workflow-land-notice.ts +10 -0
  636. package/src/services/workflow-pause-text.ts +43 -0
  637. package/src/services/workflow-pins.ts +7 -4
  638. package/src/services/workflow-reconcile.ts +14 -11
  639. package/src/services/workflow-resume-pins.ts +3 -3
  640. package/src/services/workflow-routing-defaults.ts +18 -0
  641. package/src/services/workflow-run-view.ts +6 -3
  642. package/src/services/workflow-run.test-fixture.ts +1 -1
  643. package/src/services/workflow-runs.ts +61 -33
  644. package/src/services/workflow-supervisor-state.ts +26 -1
  645. package/src/services/workflow-supervisor.ts +11 -6
  646. package/src/services/workspace-recovery.ts +4 -3
  647. package/src/settings/registry.ts +1 -2
  648. package/src/spawn-admission.ts +10 -2
  649. package/src/spawn-command.ts +4 -4
  650. package/src/spawn-models.ts +10 -12
  651. package/src/spawn-placement.ts +28 -10
  652. package/src/spawn-targets.ts +9 -9
  653. package/src/sse-agent-status.ts +15 -6
  654. package/src/sse.ts +49 -24
  655. package/src/startup-context-injection.ts +62 -57
  656. package/src/state-adoption/cd-cutover.ts +53 -7
  657. package/src/state-adoption/fleet-cutover.ts +35 -0
  658. package/src/state-adoption/fleet-plan.ts +36 -0
  659. package/src/state-adoption/index.ts +2 -2
  660. package/src/state-adoption/linux-plan.ts +2 -2
  661. package/src/state-adoption/linux.ts +2 -2
  662. package/src/state-adoption/macos-plan.ts +2 -2
  663. package/src/state-adoption/macos.ts +1 -1
  664. package/src/steward-handoff.ts +4 -3
  665. package/src/steward-policy-cleanup.ts +9 -8
  666. package/src/steward.ts +9 -8
  667. package/src/task-dispatch-live.ts +6 -3
  668. package/src/task-dispatcher.ts +3 -3
  669. package/src/teams-config-store.ts +4 -3
  670. package/src/token-db-write.ts +10 -0
  671. package/src/token-db.ts +2 -2
  672. package/src/token-usage-async.ts +2 -4
  673. package/src/user-awaiting-reply.ts +5 -5
  674. package/src/workspace-actions.ts +24 -29
  675. package/src/workspace-auto-merge.ts +14 -12
  676. package/src/workspace-changed-paths-client.ts +16 -5
  677. package/src/workspace-cleanup-stale.ts +30 -7
  678. package/src/workspace-command-settle.ts +26 -17
  679. package/src/workspace-config.ts +1 -1
  680. package/src/workspace-conflict-resolver.ts +9 -7
  681. package/src/workspace-dead-owner-recovery.ts +5 -4
  682. package/src/workspace-escalation.ts +12 -11
  683. package/src/workspace-human-escalation.ts +3 -3
  684. package/src/workspace-land-gate-watchdog.ts +3 -3
  685. package/src/workspace-land-refusal.ts +20 -0
  686. package/src/workspace-land-stopped.ts +1 -0
  687. package/src/workspace-merge.ts +10 -26
  688. package/src/workspace-nothing-to-land-notice.ts +2 -2
  689. package/src/workspace-orphans.ts +18 -37
  690. package/src/workspace-pr-completion.ts +10 -8
  691. package/src/workspace-rekey.ts +3 -3
  692. package/src/workspace-steward-failure.ts +2 -2
  693. package/src/workspace-steward-wake.ts +4 -4
  694. package/node_modules/@humwick/kernel/LICENSE +0 -167
  695. package/node_modules/@humwick/kernel/async-entity-persistence.ts +0 -344
  696. package/node_modules/@humwick/kernel/async-event-log.ts +0 -107
  697. package/node_modules/@humwick/kernel/automations.pilot.ts +0 -147
  698. package/node_modules/@humwick/kernel/config.ts +0 -111
  699. package/node_modules/@humwick/kernel/contract.ts +0 -572
  700. package/node_modules/@humwick/kernel/control-authz.ts +0 -281
  701. package/node_modules/@humwick/kernel/control.ts +0 -645
  702. package/node_modules/@humwick/kernel/effects.ts +0 -493
  703. package/node_modules/@humwick/kernel/event-log.ts +0 -319
  704. package/node_modules/@humwick/kernel/http-transport.ts +0 -384
  705. package/node_modules/@humwick/kernel/identity-grammar.ts +0 -20
  706. package/node_modules/@humwick/kernel/identity.ts +0 -248
  707. package/node_modules/@humwick/kernel/index.ts +0 -28
  708. package/node_modules/@humwick/kernel/kernel-persistence.ts +0 -181
  709. package/node_modules/@humwick/kernel/landing-incident.ts +0 -306
  710. package/node_modules/@humwick/kernel/landing.ts +0 -953
  711. package/node_modules/@humwick/kernel/manifest-validation.ts +0 -460
  712. package/node_modules/@humwick/kernel/mcp-transport.ts +0 -109
  713. package/node_modules/@humwick/kernel/message-authority-chaos-worker.ts +0 -200
  714. package/node_modules/@humwick/kernel/message-authority.ts +0 -281
  715. package/node_modules/@humwick/kernel/module-host.ts +0 -722
  716. package/node_modules/@humwick/kernel/openapi-init.ts +0 -14
  717. package/node_modules/@humwick/kernel/package.json +0 -39
  718. package/node_modules/@humwick/kernel/persistence-schema.ts +0 -248
  719. package/node_modules/@humwick/kernel/persistence.ts +0 -510
  720. package/node_modules/@humwick/kernel/registry.ts +0 -60
  721. package/node_modules/@humwick/kernel/sqlite-kernel-persistence.ts +0 -499
  722. package/node_modules/@humwick/kernel/sqlite-module-host.ts +0 -87
  723. package/node_modules/@humwick/kernel/timers-chaos-worker.ts +0 -186
  724. package/node_modules/@humwick/kernel/timers.pilot.ts +0 -1411
  725. package/node_modules/@humwick/kernel/workflow-activation.ts +0 -25
  726. package/node_modules/@humwick/kernel/workflow-backstop.ts +0 -40
  727. package/node_modules/@humwick/kernel/workflow-cancel-tree.ts +0 -20
  728. package/node_modules/@humwick/kernel/workflow-chaos-worker.ts +0 -213
  729. package/node_modules/@humwick/kernel/workflow-composition.ts +0 -231
  730. package/node_modules/@humwick/kernel/workflow-container.ts +0 -72
  731. package/node_modules/@humwick/kernel/workflow-control.test-fixture.ts +0 -42
  732. package/node_modules/@humwick/kernel/workflow-control.ts +0 -178
  733. package/node_modules/@humwick/kernel/workflow-definition.ts +0 -507
  734. package/node_modules/@humwick/kernel/workflow-dispatch.ts +0 -60
  735. package/node_modules/@humwick/kernel/workflow-foreach.ts +0 -167
  736. package/node_modules/@humwick/kernel/workflow-journal-codec.ts +0 -339
  737. package/node_modules/@humwick/kernel/workflow-journal.ts +0 -922
  738. package/node_modules/@humwick/kernel/workflow-lane.ts +0 -48
  739. package/node_modules/@humwick/kernel/workflow-lease-owner.ts +0 -60
  740. package/node_modules/@humwick/kernel/workflow-recovery.test-fixture.ts +0 -19
  741. package/node_modules/@humwick/kernel/workflow-runtime.ts +0 -938
  742. package/node_modules/@humwick/kernel/workflow-script.ts +0 -11
  743. package/node_modules/@humwick/kernel/workflow-state.ts +0 -299
  744. package/node_modules/@humwick/kernel/workflow-step-commit.ts +0 -195
  745. package/node_modules/@humwick/kernel/workflow-transitions.ts +0 -317
  746. package/node_modules/@humwick/kernel/workflow-values.ts +0 -153
  747. package/node_modules/@humwick/kernel/workflow.pilot.ts +0 -376
  748. package/node_modules/@humwick/offload/LICENSE +0 -167
  749. package/node_modules/@humwick/offload/README.md +0 -57
  750. package/node_modules/@humwick/offload/dist/async-runner.d.ts +0 -18
  751. package/node_modules/@humwick/offload/dist/async-runner.d.ts.map +0 -1
  752. package/node_modules/@humwick/offload/dist/async-runner.js +0 -158
  753. package/node_modules/@humwick/offload/dist/async-runner.js.map +0 -1
  754. package/node_modules/@humwick/offload/dist/envelope.d.ts +0 -25
  755. package/node_modules/@humwick/offload/dist/envelope.d.ts.map +0 -1
  756. package/node_modules/@humwick/offload/dist/envelope.js +0 -80
  757. package/node_modules/@humwick/offload/dist/envelope.js.map +0 -1
  758. package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts +0 -10
  759. package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts.map +0 -1
  760. package/node_modules/@humwick/offload/dist/fixtures/worker-task.js +0 -59
  761. package/node_modules/@humwick/offload/dist/fixtures/worker-task.js.map +0 -1
  762. package/node_modules/@humwick/offload/dist/index.d.ts +0 -5
  763. package/node_modules/@humwick/offload/dist/index.d.ts.map +0 -1
  764. package/node_modules/@humwick/offload/dist/index.js +0 -5
  765. package/node_modules/@humwick/offload/dist/index.js.map +0 -1
  766. package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts +0 -62
  767. package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts.map +0 -1
  768. package/node_modules/@humwick/offload/dist/subprocess-runner.js +0 -295
  769. package/node_modules/@humwick/offload/dist/subprocess-runner.js.map +0 -1
  770. package/node_modules/@humwick/offload/dist/types.d.ts +0 -111
  771. package/node_modules/@humwick/offload/dist/types.d.ts.map +0 -1
  772. package/node_modules/@humwick/offload/dist/types.js +0 -176
  773. package/node_modules/@humwick/offload/dist/types.js.map +0 -1
  774. package/node_modules/@humwick/offload/dist/worker-pool.d.ts +0 -23
  775. package/node_modules/@humwick/offload/dist/worker-pool.d.ts.map +0 -1
  776. package/node_modules/@humwick/offload/dist/worker-pool.js +0 -435
  777. package/node_modules/@humwick/offload/dist/worker-pool.js.map +0 -1
  778. package/node_modules/@humwick/offload/dist/worker-runtime.d.ts +0 -2
  779. package/node_modules/@humwick/offload/dist/worker-runtime.d.ts.map +0 -1
  780. package/node_modules/@humwick/offload/dist/worker-runtime.js +0 -27
  781. package/node_modules/@humwick/offload/dist/worker-runtime.js.map +0 -1
  782. package/node_modules/@humwick/offload/dist/worker.d.ts +0 -5
  783. package/node_modules/@humwick/offload/dist/worker.d.ts.map +0 -1
  784. package/node_modules/@humwick/offload/dist/worker.js +0 -1
  785. package/node_modules/@humwick/offload/dist/worker.js.map +0 -1
  786. package/node_modules/@humwick/offload/package.json +0 -42
  787. package/node_modules/@humwick/offload/src/async-runner.ts +0 -170
  788. package/node_modules/@humwick/offload/src/envelope.ts +0 -92
  789. package/node_modules/@humwick/offload/src/fixtures/worker-task.ts +0 -49
  790. package/node_modules/@humwick/offload/src/index.ts +0 -4
  791. package/node_modules/@humwick/offload/src/subprocess-runner.ts +0 -334
  792. package/node_modules/@humwick/offload/src/types.ts +0 -235
  793. package/node_modules/@humwick/offload/src/worker-pool.ts +0 -463
  794. package/node_modules/@humwick/offload/src/worker-runtime.ts +0 -32
  795. package/node_modules/@humwick/offload/src/worker.ts +0 -5
  796. package/public/assets/agent-liveness-DyqxfB-t.js +0 -2
  797. package/public/assets/agent-profiles-BpI_jTxq.js +0 -2
  798. package/public/assets/index-B7ZerHLY.css +0 -2
  799. package/public/assets/index-BU3uWo2t.js +0 -15
  800. package/public/assets/projects-B_lmcqfO.js +0 -2
  801. package/public/assets/provider-display-DbLWpP3j.js +0 -2
  802. package/public/assets/run-card-CO_bguQf.js +0 -2
  803. package/public/assets/shipping-Bu8p1gEw.js +0 -2
  804. package/public/assets/store-BvtFdlGX.js +0 -9
  805. package/public/assets/use-project-list-B-T2Bnnn.js +0 -2
  806. package/public/assets/versioned-prompt-editor-Diu8BIaM.js +0 -8
  807. package/runner/src/agent-runner/http-liveness.ts +0 -85
  808. package/runner/src/gate-run-lease-probe.ts +0 -38
  809. package/src/db/claude-catalog-reconcile.ts +0 -27
  810. package/src/db/on-loop-write-transaction.ts +0 -34
  811. package/src/routing-model-aliases.ts +0 -21
@@ -1,3 +1,5 @@
1
+ import { runnerRuntimeTokenEnvAsync, SUCCESSOR_LAUNCH, type RunnerRuntimeTokenInput } from "../runtime-tokens";
2
+ import { updateManagedAgentStateAsync } from "../db/lifecycle-tail-async";
1
3
  import { createCommandAsync } from "../commands-write";
2
4
  import { restartHarnessSubagents } from "./harness-subagents";
3
5
  import { RELAY_TOKEN_HEADER, isRecord, isSpawnProvider, stringValue } from "@humwick/sdk";
@@ -5,7 +7,7 @@ import { recordedLaunchMode } from "../launch-mode";
5
7
  import type { ProviderEffort } from "@humwick/sdk/provider-catalog";
6
8
  import { listCommands } from "../commands-db";
7
9
  import { isTrustedOrchestratorApiUrl, relayToken } from "../config";
8
- import { getAgentProfile, getManagedAgentState, getSpawnPolicy, updateManagedAgentState } from "../config-store";
10
+ import { getAgentProfile, getManagedAgentState, getSpawnPolicy } from "../config-store";
9
11
  import { getMergeLease, getOrchestrator, listWorkspaces, ownedIsolatedWorkspace, ValidationError, withResolvedProvisioning, withResolvedProvisioningAsync, workflowRunIdOf } from "../db";
10
12
  import { resolveProjectForCanonicalCwd } from "./project";
11
13
  import { isProvenStewardAgent, stewardWorktreeCwdPrefixes } from "../steward-spawn-guard";
@@ -16,7 +18,6 @@ import { resolveWhoamiRole } from "../mcp/identity-projection";
16
18
  import { listManagedOrchestratorsForAgent } from "../orchestrator-lookup";
17
19
  import { applyDefaultSharedMcp } from "../shared-mcp";
18
20
  import { buildSpawnCommand, generateSpawnRequestId, resolveSpawnModelParams, resolveSpawnModelParamsAsync } from "../spawn-command";
19
- import { SUCCESSOR_LAUNCH, runnerRuntimeTokenEnv } from "../runtime-tokens";
20
21
  import { restartEffortState } from "./self-effort";
21
22
  // #2033 — from isolated-workspace-placement.ts, NOT ./spawn-identity: that module also exports
22
23
  // buildProspectiveSpawnIdentity, which imports mcp/identity.ts → self-resume.ts → restart-spawn.ts,
@@ -27,7 +28,7 @@ import { restartInstructionParamsForAgent, restartInstructionParamsForAgentAsync
27
28
  import { launchedProjectRole, projectRoleRestartError, refuseSyncProjectRoleRestart, restartProjectRole } from "./restart-project-role";
28
29
  import { authContextFromSystem } from "./auth-context";
29
30
  import { markManagedAgentRunning } from "./managed-running";
30
- import type { AgentCard, AgentProfile, Command, Orchestrator, SpawnApprovalMode } from "../types";
31
+ import type { AgentCard, AgentProfile, SpawnPolicy, Command, Orchestrator, SpawnApprovalMode } from "../types";
31
32
 
32
33
  export type SelfRestartReason = "upgrade" | "token-remint" | "manual" | "reset-unconfirmed";
33
34
  type RestartOptions = { resumeId?: string; continuation?: string; generation?: number; reason?: string };
@@ -65,13 +66,13 @@ function resumeWorkspaceForRestart(agent: AgentCard): { branch: string; mode: "a
65
66
  * self-restart. The token is minted here from the CURRENT profile, never cloned from the old
66
67
  * runtime token, so changed scopes/tool groups take effect on the successor.
67
68
  */
68
- function buildRestartSpawnParamsForAgent(
69
+ async function buildRestartSpawnParamsForAgent(
69
70
  agent: AgentCard,
70
71
  orchestrator: Orchestrator | null,
71
72
  policyName?: string,
72
73
  predecessorSpawnRequestId?: string,
73
74
  opts: RestartOptions = {},
74
- ): Record<string, unknown> | undefined {
75
+ ): Promise<Record<string, unknown> | undefined> {
75
76
  if (!orchestrator) return undefined;
76
77
  refuseSyncProjectRoleRestart(agent);
77
78
  const requestId = generateSpawnRequestId();
@@ -110,36 +111,15 @@ function buildRestartSpawnParamsForAgent(
110
111
  resumeWorktreePath: restartResumeWorkspace?.worktreePath,
111
112
  });
112
113
  const params = {
113
- ...buildManagedSpawnParams(relaunchPolicy(policy.value, relaunch.effort), requestId, { createdBy: requestedBy, authority: SUCCESSOR_LAUNCH, identityAgentId: agent.id }),
114
+ ...(await buildManagedSpawnParams(relaunchPolicy(policy.value, relaunch.effort), requestId, { createdBy: requestedBy, authority: SUCCESSOR_LAUNCH, identityAgentId: agent.id })),
114
115
  ...relaunch.carried,
115
116
  agentId: agent.id,
116
117
  requestedBy,
117
118
  // Override the policy builder's normal mint so stable team/project bindings are also
118
119
  // carried by the fresh token, not merely preserved incidentally on the agent row.
119
- env: runnerRuntimeTokenEnv({ authority: SUCCESSOR_LAUNCH,
120
- agentId: agent.id,
121
- orchestratorId: policy.value.orchestratorId,
122
- cwd: policy.value.cwd,
123
- provider: policy.value.provider,
124
- label: policy.value.label,
125
- policyName: policy.value.name,
126
- spawnRequestId: requestId,
127
- createdBy: requestedBy,
128
- profile: policy.value.profile || undefined,
129
- // #2245 — the successor's posture comes from the POLICY (server config, unforgeable), the
130
- // same value `buildManagedSpawnParams` launches it with; stamp it into the signed constraints.
131
- approvalMode: policy.value.permissionMode,
132
- ...(agent.teamId ? { teamId: agent.teamId } : {}),
133
- ...(projectId ? { projectId } : {}),
134
- ...([...stewardExtraCwdPrefixes, ...isolatedExtraCwdPrefixes].length
135
- ? { extraCwdPrefixes: [...stewardExtraCwdPrefixes, ...isolatedExtraCwdPrefixes] }
136
- : {}),
137
- }),
138
- ...(opts.continuation ? { prompt: opts.continuation } : {}),
139
- ...(restartResumeWorkspace ? { resumeWorkspace: restartResumeWorkspace } : {}),
140
- // F5 — carry the self-restart generation marker on BOTH successor spawns (policy and
141
- // dashboard/non-policy), so the audit lineage is symmetric regardless of branch.
142
- ...(opts.generation ? { extra: { selfRestart: { generation: opts.generation, reason: opts.reason } } } : {}),
120
+ env: (await runnerRuntimeTokenEnvAsync(managedRestartTokenInput(agent, policy.value, requestId, requestedBy, projectId,
121
+ [...stewardExtraCwdPrefixes, ...isolatedExtraCwdPrefixes]))),
122
+ ...managedRestartOptions(opts, restartResumeWorkspace),
143
123
  };
144
124
  return opts.resumeId ? withResumeParams(params, opts.resumeId, agent.id) : params;
145
125
  }
@@ -147,7 +127,7 @@ function buildRestartSpawnParamsForAgent(
147
127
  const provider = stringValue(agent.meta?.provider);
148
128
  if (!isSpawnProvider(provider)) return undefined;
149
129
  // #2033 review — fold in #2041: for an ISOLATED agent, `agent.meta.cwd` is caller-writable
150
- // (not an AUTHZ_META_KEY) and this `cwd` feeds `runnerRuntimeTokenEnv({cwd})` below as the
130
+ // (not an AUTHZ_META_KEY) and this `cwd` feeds `runnerRuntimeTokenEnvAsync({cwd})` below as the
151
131
  // successor token's cwdPrefixes[0] — a forged value would mint a token authorizing an arbitrary
152
132
  // path. Prefer the same unforgeable orchestrator-written DB row (`ownedIsolatedWorkspace`) G1
153
133
  // sources the resume worktree from; it's undefined for a non-isolated (shared/coordinator) agent
@@ -160,7 +140,7 @@ function buildRestartSpawnParamsForAgent(
160
140
  const resolvedProfile = withResolvedProvisioning(profileName ? getAgentProfile(profileName)?.value : undefined, provider);
161
141
  const agentProfile = resolvedProfile ? applyDefaultSharedMcp(resolvedProfile) : undefined;
162
142
  const workspaceMode = stringValue(agent.meta?.workspaceMode) ?? "inherit";
163
- const resolvedModel = resolveSpawnModelParams(provider, model, effort, { modelSource: "runtime", skipDefaultWhenEmpty: true });
143
+ const resolvedModel = resolveSpawnModelParams(provider, model, effort, { modelSource: "runtime" });
164
144
  const projectedInstructions = restartInstructionParamsForAgent(agent, { spawnRequestId: predecessorSpawnRequestId, cwd }) ?? {};
165
145
  // #1598 — canonicalize so a worktree/subdir cwd binds to its owning checkout's project.
166
146
  const projectId = resolveProjectForCanonicalCwd(cwd).project?.id;
@@ -175,7 +155,7 @@ function buildRestartSpawnParamsForAgent(
175
155
  cwd,
176
156
  orchestrator.baseDir,
177
157
  );
178
- return buildRestartSpawnCommand(agent, predecessorSpawnRequestId, agentProfile, projectedInstructions, opts, {
158
+ const options = {
179
159
  provider,
180
160
  modelParams: resolvedModel,
181
161
  cwd,
@@ -185,7 +165,10 @@ function buildRestartSpawnParamsForAgent(
185
165
  policyName: policyName || undefined,
186
166
  spawnRequestId: requestId,
187
167
  requestedBy,
188
- }, { orchestratorId: orchestrator.id, projectId, extraCwdPrefixes: stewardExtraCwdPrefixes });
168
+ };
169
+ const tokenContext = { orchestratorId: orchestrator.id, projectId, extraCwdPrefixes: stewardExtraCwdPrefixes };
170
+ return buildRestartSpawnCommand(agent, predecessorSpawnRequestId, agentProfile, projectedInstructions, opts, options, tokenContext,
171
+ (await runnerRuntimeTokenEnvAsync(restartTokenInput(agent, options, tokenContext))));
189
172
  }
190
173
 
191
174
  /** Worker-safe restart command construction used by HTTP/orchestrator/self-restart flows. */
@@ -233,14 +216,8 @@ async function buildRestartSpawnParamsForAgentAsync(
233
216
  const params = {
234
217
  ...await buildManagedSpawnParamsAsync(relaunchPolicy(policy.value, relaunch.effort), requestId, { createdBy: requestedBy, authority: SUCCESSOR_LAUNCH, identityAgentId: agent.id, gitRepoRoot }),
235
218
  ...relaunch.carried, agentId: agent.id, requestedBy,
236
- env: runnerRuntimeTokenEnv({ authority: SUCCESSOR_LAUNCH, agentId: agent.id, orchestratorId: policy.value.orchestratorId, cwd: policy.value.cwd,
237
- provider: policy.value.provider, label: policy.value.label, policyName: policy.value.name, spawnRequestId: requestId,
238
- createdBy: requestedBy, profile: policy.value.profile || undefined, ...(agent.teamId ? { teamId: agent.teamId } : {}),
239
- approvalMode: policy.value.permissionMode,
240
- ...(projectId ? { projectId } : {}), ...(combinedExtraCwdPrefixes.length ? { extraCwdPrefixes: combinedExtraCwdPrefixes } : {}), }),
241
- ...(opts.continuation ? { prompt: opts.continuation } : {}),
242
- ...(restartResumeWorkspace ? { resumeWorkspace: restartResumeWorkspace } : {}),
243
- ...(opts.generation ? { extra: { selfRestart: { generation: opts.generation, reason: opts.reason } } } : {}),
219
+ env: await runnerRuntimeTokenEnvAsync(managedRestartTokenInput(agent, policy.value, requestId, requestedBy, projectId, combinedExtraCwdPrefixes)),
220
+ ...managedRestartOptions(opts, restartResumeWorkspace),
244
221
  };
245
222
  return opts.resumeId ? withResumeParams(params, opts.resumeId, agent.id) : params;
246
223
  }
@@ -257,15 +234,55 @@ async function buildRestartSpawnParamsForAgentAsync(
257
234
  const profileName = role ? role.profileName : stringValue(agent.meta?.profile);
258
235
  const resolvedProfile = role ? undefined : await withResolvedProvisioningAsync(profileName ? getAgentProfile(profileName)?.value : undefined, provider);
259
236
  const agentProfile = role?.agentProfile ?? (resolvedProfile ? applyDefaultSharedMcp(resolvedProfile) : undefined);
260
- const resolvedModel = await resolveSpawnModelParamsAsync(provider, model, effort, { modelSource: "runtime", skipDefaultWhenEmpty: true });
237
+ const resolvedModel = await resolveSpawnModelParamsAsync(provider, model, effort, { modelSource: "runtime" });
261
238
  const projectedInstructions = await restartInstructionParamsForAgentAsync(agent, { spawnRequestId: predecessorSpawnRequestId, cwd, ...(role ? { profile: role.agentProfile } : {}) }) ?? {};
262
239
  const projectId = resolveProjectForCanonicalCwd(cwd).project?.id;
263
240
  const stewardExtraCwdPrefixes = stewardWorktreeCwdPrefixes(isProvenStewardAgent(agent.id, policyName), cwd, orchestrator.baseDir);
264
- return buildRestartSpawnCommand(agent, predecessorSpawnRequestId, agentProfile, projectedInstructions, opts, {
241
+ const options = {
265
242
  provider, modelParams: resolvedModel, cwd, workspaceMode, profile: profileName || undefined,
266
243
  ...relaunch.carried, ...role?.spawn, policyName: policyName || undefined, spawnRequestId: requestId,
267
244
  requestedBy,
268
- }, { orchestratorId: orchestrator.id, projectId, extraCwdPrefixes: stewardExtraCwdPrefixes });
245
+ };
246
+ const tokenContext = { orchestratorId: orchestrator.id, projectId, extraCwdPrefixes: stewardExtraCwdPrefixes };
247
+ return buildRestartSpawnCommand(agent, predecessorSpawnRequestId, agentProfile, projectedInstructions, opts, options, tokenContext,
248
+ await runnerRuntimeTokenEnvAsync(restartTokenInput(agent, options, tokenContext)));
249
+ }
250
+
251
+ function managedRestartOptions(opts: RestartOptions, restartResumeWorkspace: ReturnType<typeof resumeWorkspaceForRestart>) {
252
+ return {
253
+ ...(opts.continuation ? { prompt: opts.continuation } : {}),
254
+ ...(restartResumeWorkspace ? { resumeWorkspace: restartResumeWorkspace } : {}),
255
+ // F5 — carry the self-restart generation marker on BOTH successor spawns (policy and
256
+ // dashboard/non-policy), so the audit lineage is symmetric regardless of branch.
257
+ ...(opts.generation ? { extra: { selfRestart: { generation: opts.generation, reason: opts.reason } } } : {}),
258
+ };
259
+ }
260
+
261
+ function managedRestartTokenInput(agent: AgentCard, policy: SpawnPolicy, requestId: string, requestedBy: string, projectId: string | undefined, extraCwdPrefixes: string[]): RunnerRuntimeTokenInput {
262
+ return {
263
+ authority: SUCCESSOR_LAUNCH, agentId: agent.id, orchestratorId: policy.orchestratorId,
264
+ cwd: policy.cwd, provider: policy.provider, label: policy.label, policyName: policy.name,
265
+ spawnRequestId: requestId, createdBy: requestedBy, profile: policy.profile || undefined,
266
+ // #2245: both successor paths stamp the policy's current posture into signed constraints.
267
+ approvalMode: policy.permissionMode,
268
+ ...(agent.teamId ? { teamId: agent.teamId } : {}),
269
+ ...(projectId ? { projectId } : {}),
270
+ ...(extraCwdPrefixes.length ? { extraCwdPrefixes } : {}),
271
+ };
272
+ }
273
+
274
+ type RestartTokenContext = Pick<RunnerRuntimeTokenInput, "orchestratorId" | "projectId" | "extraCwdPrefixes">;
275
+ const restartApprovalMode = (agent: AgentCard): SpawnApprovalMode => (stringValue(agent.meta?.approvalMode) as SpawnApprovalMode | undefined) ?? "guarded";
276
+ const restartLabel = (agent: AgentCard): string | undefined => (stringValue(agent.meta?.label) ?? agent.label) || undefined;
277
+
278
+ /** The successor token a non-policy restart carries; the sync twin and the writer-op path mint the same input. */
279
+ function restartTokenInput(agent: AgentCard, options: Omit<Parameters<typeof buildSpawnCommand>[0], "env">, tokenContext: RestartTokenContext): RunnerRuntimeTokenInput {
280
+ return { ...tokenContext, authority: SUCCESSOR_LAUNCH,
281
+ agentId: agent.id, cwd: options.cwd, provider: options.provider, label: restartLabel(agent),
282
+ policyName: options.policyName, spawnRequestId: options.spawnRequestId,
283
+ createdBy: options.requestedBy, profile: options.profile, approvalMode: restartApprovalMode(agent),
284
+ ...(agent.teamId ? { teamId: agent.teamId } : {}),
285
+ };
269
286
  }
270
287
 
271
288
  function buildRestartSpawnCommand(
@@ -275,25 +292,21 @@ function buildRestartSpawnCommand(
275
292
  projectedInstructions: Record<string, unknown>,
276
293
  opts: RestartOptions,
277
294
  options: Omit<Parameters<typeof buildSpawnCommand>[0], "env">,
278
- tokenContext: Pick<Parameters<typeof runnerRuntimeTokenEnv>[0], "orchestratorId" | "projectId" | "extraCwdPrefixes">,
295
+ tokenContext: RestartTokenContext,
296
+ env: Record<string, string>,
279
297
  ): Record<string, unknown> {
280
298
  const memorySeam = parseMemorySeam(projectedInstructions.memorySeam);
281
299
  const resumeWorkspace = resumeWorkspaceForRestart(agent);
282
300
  const providerArgs = metaStringArray(agent.meta, "providerArgs");
283
- const approvalMode = (stringValue(agent.meta?.approvalMode) as SpawnApprovalMode | undefined) ?? "guarded";
284
- const label = (stringValue(agent.meta?.label) ?? agent.label) || undefined;
301
+ const approvalMode = restartApprovalMode(agent);
302
+ const label = restartLabel(agent);
285
303
  const params = buildSpawnCommand({
286
304
  ...options,
287
305
  orchestratorId: tokenContext.orchestratorId,
288
306
  headless: true, requestedAt: Date.now(),
289
307
  ...(opts.continuation ? { prompt: opts.continuation } : {}),
290
308
  ...(opts.generation ? { extra: { selfRestart: { generation: opts.generation, reason: opts.reason } } } : {}),
291
- env: runnerRuntimeTokenEnv({ ...tokenContext, authority: SUCCESSOR_LAUNCH,
292
- agentId: agent.id, cwd: options.cwd, provider: options.provider, label,
293
- policyName: options.policyName, spawnRequestId: options.spawnRequestId,
294
- createdBy: options.requestedBy, profile: options.profile, approvalMode,
295
- ...(agent.teamId ? { teamId: agent.teamId } : {}),
296
- }),
309
+ env,
297
310
  agentId: agent.id, tags: agent.tags, systemTags: agent.systemTags, capabilities: agent.capabilities,
298
311
  label,
299
312
  approvalMode, permissionMode: approvalMode,
@@ -445,11 +458,11 @@ export async function createSelfRestartCommandAsync(
445
458
  const predecessorSpawnRequestId = stringValue(agent.meta?.spawnRequestId);
446
459
  const restartSpawn = await restartSpawnParamsForAgentAsync(agent, orchestrator, policyName, predecessorSpawnRequestId, { continuation, generation, reason });
447
460
  if (!restartSpawn) throw new ValidationError("self-restart could not build a fresh successor spawn");
448
- return createCommandAsync(selfRestartInput(agent, orchestrator, restartSpawn, generation, continuation, fullContextMessageId, reason, now));
461
+ return (await createCommandAsync(selfRestartInput(agent, orchestrator, restartSpawn, generation, continuation, fullContextMessageId, reason, now)));
449
462
  }
450
463
 
451
464
  /** Settle managed runtime correlation only after the transactional orchestrator swap succeeds. */
452
- export function settleSelfRestartManagedState(command: Command): void {
465
+ export async function settleSelfRestartManagedState(command: Command): Promise<void> {
453
466
  if (command.type !== "agent.restart" || !isRecord(command.params.selfRestart)) return;
454
467
  const policyName = stringValue(command.params.policyName);
455
468
  if (!policyName || command.status !== "succeeded") return;
@@ -460,7 +473,7 @@ export function settleSelfRestartManagedState(command: Command): void {
460
473
  const spawnRequestId = stringValue(restartSpawn?.spawnRequestId) ?? state?.spawnRequestId;
461
474
  const tmuxSession = stringValue(report?.tmuxSession) ?? stringValue(report?.sessionName) ?? state?.tmuxSession;
462
475
  if (!agentId || !spawnRequestId) return;
463
- updateManagedAgentState(policyName, {
476
+ (await updateManagedAgentStateAsync(policyName, {
464
477
  status: "starting",
465
478
  agentId,
466
479
  spawnRequestId,
@@ -468,12 +481,12 @@ export function settleSelfRestartManagedState(command: Command): void {
468
481
  lastSpawnAt: command.updatedAt,
469
482
  lastStopAt: command.updatedAt,
470
483
  restartCount: (state?.restartCount ?? 0) + 1,
471
- });
472
- markManagedAgentRunning({ policyName, spawnRequestId, agentId, tmuxSession }, authContextFromSystem(), { now: () => command.updatedAt });
484
+ }));
485
+ (await markManagedAgentRunning({ policyName, spawnRequestId, agentId, tmuxSession }, authContextFromSystem(), { now: () => command.updatedAt }));
473
486
  }
474
487
 
475
- export function restartSpawnParamsForAgent(...args: Parameters<typeof buildRestartSpawnParamsForAgent>) {
476
- return buildRestartSpawnParamsForAgent(...args);
488
+ export async function restartSpawnParamsForAgent(...args: Parameters<typeof buildRestartSpawnParamsForAgent>) {
489
+ return (await buildRestartSpawnParamsForAgent(...args));
477
490
  }
478
491
  export async function restartSpawnParamsForAgentAsync(...args: Parameters<typeof buildRestartSpawnParamsForAgentAsync>) {
479
492
  return buildRestartSpawnParamsForAgentAsync(...args);
@@ -17,10 +17,10 @@ export interface ReviewPublishDispatch {
17
17
  error?: string;
18
18
  }
19
19
 
20
- export function dispatchReviewPublish(
20
+ export async function dispatchReviewPublish(
21
21
  workspace: WorkspaceRecord | undefined,
22
22
  opts: { requestedBy: string; taskId: number; sha?: string; emit: (command: Command) => void },
23
- ): ReviewPublishDispatch | undefined {
23
+ ): Promise<ReviewPublishDispatch | undefined> {
24
24
  if (!workspace || workspace.mode !== "isolated" || !workspace.worktreePath) return undefined;
25
25
  // #1452 round-6 H2b / round-7 H3 — publishing REQUIRES an immutable delivered COMMIT OID (the host
26
26
  // must pin exactly it, and settlement matches result.sha === requested sha). It must be a concrete
@@ -46,28 +46,11 @@ export function dispatchReviewPublish(
46
46
  // failing ledger insert was swallowed, leaving a POLLABLE publish command with NO cleanup ledger
47
47
  // (a crash/insert-failure orphan). The transaction makes them all-or-nothing: a ledger failure
48
48
  // rolls back the command row too, so a reviewer never sees a command with no durable cleanup path.
49
- let command: Command | undefined;
50
- let buildError: string | undefined;
51
- writeTransaction(() => {
52
- const built = buildWorkspacePublishReviewCommand(workspace, opts.requestedBy, { taskId: opts.taskId, sha, reviewRef });
53
- if (!built.ok) { buildError = built.error; return; } // nothing was persisted (owner/worktree check)
54
- // Round-9: PIN the exact ref (relay-derived, host-asserted-equal before push) so cleanup can
55
- // delete it even if the host's success-result is lost. The row also holds the branch/host/
56
- // requested-sha so cleanup survives a purge/recycle. On settlement the reconciler re-writes the
57
- // host-confirmed ref (identical to this one, since the host refuses to push a divergent ref).
58
- upsertReviewRefCleanup({
59
- id: built.command.id,
60
- ref: reviewRef,
61
- workspaceId: workspace.id,
62
- repoRoot: workspace.repoRoot,
63
- worktreePath: workspace.worktreePath,
64
- branch: workspace.branch,
65
- orchestratorId: workspace.orchestratorId,
66
- requestedSha: sha,
67
- });
68
- command = built.command;
69
- });
70
- if (!command) return { workspaceId: workspace.id, dispatched: false, error: buildError ?? "review publish not dispatched" };
49
+ const built = await buildWorkspacePublishReviewCommand(workspace, opts.requestedBy, { taskId: opts.taskId, sha, reviewRef,
50
+ cleanup: { ref: reviewRef, workspaceId: workspace.id, repoRoot: workspace.repoRoot, worktreePath: workspace.worktreePath,
51
+ branch: workspace.branch, orchestratorId: workspace.orchestratorId, requestedSha: sha } });
52
+ if (!built.ok) return { workspaceId: workspace.id, dispatched: false, error: built.error };
53
+ const command = built.command;
71
54
  opts.emit(command); // durable state (command + ledger) is committed before anyone is notified
72
55
  return { workspaceId: workspace.id, commandId: command.id, dispatched: true };
73
56
  } catch (err) {
@@ -1,3 +1,4 @@
1
+ import { cancelPendingCommandAsync, recordReviewRefCleanupDispatchAsync, markReviewRefPublishedAsync, markReviewRefFailedAsync, markReviewRefClosedAsync, markReviewRefAnnouncedAsync, deleteReviewRefCleanupAsync } from "../db/runtime-tail-async";
1
2
  // #1452 round-4 — the durable, OFF-critical-path engine that settles the review-ref (refs/review/*)
2
3
  // lifecycle and cleans up leaked refs. It reads the review_ref_cleanups ledger (one row per EXACT
3
4
  // server-derived ref) — NOT a per-workspace marker — so it fixes every round-4 finding at once:
@@ -23,18 +24,8 @@
23
24
  // was never enabled, since rows are only written when a publish is dispatched.
24
25
 
25
26
  import { getWorkspace } from "../db";
26
- import {
27
- deleteReviewRefCleanup,
28
- getReviewRefFenceToken,
29
- listReviewRefCleanups,
30
- markReviewRefAnnounced,
31
- markReviewRefClosed,
32
- markReviewRefFailed,
33
- markReviewRefPublished,
34
- recordReviewRefCleanupDispatch,
35
- type ReviewRefCleanup,
36
- } from "../db/review-ref-cleanups";
37
- import { cancelPendingCommand, getCommand } from "../commands-db";
27
+ import { getReviewRefFenceToken, listReviewRefCleanups, type ReviewRefCleanup } from "../db/review-ref-cleanups";
28
+ import { getCommand } from "../commands-db";
38
29
  import { emitCommand } from "../maintenance/events";
39
30
  import { emitRelayEvent } from "../events";
40
31
  import { buildReviewRefUnpublishCommandFromFields } from "../workspace-actions";
@@ -81,16 +72,16 @@ interface ReconcileDeps {
81
72
  * pending publish can still be externally spoofed to succeeded{pushed:true}. Requiring the token here
82
73
  * refuses that phantom before it can announce a ref that was never pushed. Returns null when absent. */
83
74
  getFenceToken: (id: string) => string | null;
84
- markPublished: typeof markReviewRefPublished;
85
- markFailed: typeof markReviewRefFailed;
86
- markAnnounced: typeof markReviewRefAnnounced;
87
- markClosed: typeof markReviewRefClosed;
88
- recordDispatch: typeof recordReviewRefCleanupDispatch;
89
- deleteCleanup: typeof deleteReviewRefCleanup;
75
+ markPublished: typeof markReviewRefPublishedAsync;
76
+ markFailed: typeof markReviewRefFailedAsync;
77
+ markAnnounced: typeof markReviewRefAnnouncedAsync;
78
+ markClosed: typeof markReviewRefClosedAsync;
79
+ recordDispatch: typeof recordReviewRefCleanupDispatchAsync;
80
+ deleteCleanup: typeof deleteReviewRefCleanupAsync;
90
81
  buildUnpublish: typeof buildReviewRefUnpublishCommandFromFields;
91
82
  /** #1452 round-10 HIGH #1 — atomically cancel the publish command IFF still pending; true means it
92
83
  * was never dispatched (proven no push can occur), so a closed round can retire it without racing. */
93
- cancelPublish: (id: string) => boolean;
84
+ cancelPublish: (id: string) => boolean | Promise<boolean>;
94
85
  emit: (command: Command) => void;
95
86
  /** Durable publish-settled announcement: emitted for a published-but-unannounced row, then marked
96
87
  * announced only on success — so a crash/outbox failure re-emits next pass (round-6 H-atomicity). */
@@ -164,21 +155,21 @@ const realDeps: ReconcileDeps = {
164
155
  },
165
156
  getCommand,
166
157
  getFenceToken: getReviewRefFenceToken,
167
- markPublished: markReviewRefPublished,
168
- markFailed: markReviewRefFailed,
169
- markAnnounced: markReviewRefAnnounced,
170
- markClosed: markReviewRefClosed,
171
- recordDispatch: recordReviewRefCleanupDispatch,
172
- deleteCleanup: deleteReviewRefCleanup,
158
+ markPublished: markReviewRefPublishedAsync,
159
+ markFailed: markReviewRefFailedAsync,
160
+ markAnnounced: markReviewRefAnnouncedAsync,
161
+ markClosed: markReviewRefClosedAsync,
162
+ recordDispatch: recordReviewRefCleanupDispatchAsync,
163
+ deleteCleanup: deleteReviewRefCleanupAsync,
173
164
  buildUnpublish: buildReviewRefUnpublishCommandFromFields,
174
- cancelPublish: (id) => cancelPendingCommand(id, "workspace.publish-review", "review publish canceled: round closed before dispatch"),
165
+ cancelPublish: async (id) => (await cancelPendingCommandAsync(id, "workspace.publish-review", "review publish canceled: round closed before dispatch")),
175
166
  emit: emitCommand,
176
167
  emitPublished: emitPublishedEvent,
177
168
  now: () => Date.now(),
178
169
  };
179
170
 
180
171
  /** One reconcile pass over the durable ledger. Pure over its (injectable) deps for testing. */
181
- export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: AbortSignal): ReviewRefReconcileResult {
172
+ export async function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: AbortSignal): Promise<ReviewRefReconcileResult> {
182
173
  const rows = deps.listCleanups();
183
174
  const published: string[] = [];
184
175
  const failed: string[] = [];
@@ -208,7 +199,7 @@ export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: Abo
208
199
  const roundClosed = !ws
209
200
  || TERMINAL_WORKSPACE_STATUSES.has(ws.status as any)
210
201
  || Boolean(ws.branch && row.branch && ws.branch !== row.branch);
211
- if (roundClosed) { deps.markClosed(row.id, now); closed = true; }
202
+ if (roundClosed) { await deps.markClosed(row.id, now); closed = true; }
212
203
  }
213
204
 
214
205
  // 1) Settle the publish outcome (H2). A ref is only real once its push command TERMINALLY
@@ -229,8 +220,8 @@ export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: Abo
229
220
  // push can occur) → retire with nothing on origin. If it was already claimed (accepted/running),
230
221
  // the host may push, so WAIT for its terminal settlement — cleanup then runs safely AFTER it.
231
222
  if (!closed) { inFlight.push(label()); continue; }
232
- if (!deps.cancelPublish(row.id)) { inFlight.push(label()); continue; } // already claimed → wait
233
- deps.markFailed(row.id, now, false); // canceled before dispatch → nothing on origin, drop the ref
223
+ if (!await deps.cancelPublish(row.id)) { inFlight.push(label()); continue; } // already claimed → wait
224
+ await deps.markFailed(row.id, now, false); // canceled before dispatch → nothing on origin, drop the ref
234
225
  confirmedRef = undefined;
235
226
  publishState = "failed";
236
227
  failed.push(label());
@@ -242,7 +233,7 @@ export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: Abo
242
233
  // never-claimed pending publish spoofed to succeeded has none, so it never advances to published.
243
234
  const ref = confirmedPublishRef(cmd, row.requestedSha, row.ref, deps.getFenceToken(row.id));
244
235
  if (ref) {
245
- deps.markPublished(row.id, ref, now); // sets announced=0 → announced below (H-atomicity)
236
+ await deps.markPublished(row.id, ref, now); // sets announced=0 → announced below (H-atomicity)
246
237
  confirmedRef = ref;
247
238
  publishState = "published";
248
239
  announced = false;
@@ -253,7 +244,7 @@ export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: Abo
253
244
  // timed-out/canceled, a missing/pruned result, or a malformed success) may have pushed before
254
245
  // its result was lost ⇒ RETAIN the pinned ref as a tombstone and unpublish before deletion.
255
246
  const notPushed = definitivelyNotPushed(cmd);
256
- deps.markFailed(row.id, now, !notPushed);
247
+ await deps.markFailed(row.id, now, !notPushed);
257
248
  if (notPushed) confirmedRef = undefined;
258
249
  publishState = "failed";
259
250
  failed.push(label());
@@ -267,7 +258,7 @@ export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: Abo
267
258
  if (publishState === "published" && !announced && confirmedRef) {
268
259
  try {
269
260
  deps.emitPublished({ workspaceId: row.workspaceId, ref: confirmedRef, ...(row.requestedSha ? { sha: row.requestedSha } : {}), ...(row.branch ? { branch: row.branch } : {}) });
270
- deps.markAnnounced(row.id, now);
261
+ await deps.markAnnounced(row.id, now);
271
262
  announced = true;
272
263
  } catch { /* emit failed → leave announced=0 so the next pass re-emits (at-least-once) */ }
273
264
  }
@@ -285,7 +276,7 @@ export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: Abo
285
276
 
286
277
  // A closed round with NOTHING on origin — a DEFINITIVELY-not-pushed outcome, or a legacy row that
287
278
  // never pinned a ref — has nothing to delete. Retire it directly, no host round-trip, no leak.
288
- if (!confirmedRef) { deps.deleteCleanup(row.id); cleared.push(label()); continue; }
279
+ if (!confirmedRef) { await deps.deleteCleanup(row.id); cleared.push(label()); continue; }
289
280
 
290
281
  // 3) Drive deletion (H4/M7) of the EXACT host-confirmed ref. CONFIRM a prior attempt first — a
291
282
  // succeeded delete clears the row regardless of the backoff window; the backoff gates only a
@@ -294,20 +285,20 @@ export function reconcileReviewRefs(deps: ReconcileDeps = realDeps, signal?: Abo
294
285
  const cmd = deps.getCommand(row.cleanupCommandId);
295
286
  if (cmd && !COMMAND_TERMINAL.has(cmd.status)) { inFlight.push(confirmedRef); continue; }
296
287
  if (cmd && cmd.status === "succeeded" && !cmd.error) {
297
- deps.deleteCleanup(row.id); // origin confirmed the ref is gone (deleted or already absent)
288
+ await deps.deleteCleanup(row.id); // origin confirmed the ref is gone (deleted or already absent)
298
289
  cleared.push(confirmedRef);
299
290
  continue;
300
291
  }
301
292
  // failed / timed_out / missing → re-dispatch below, subject to backoff.
302
293
  }
303
294
  if (row.nextAttemptAt != null && row.nextAttemptAt > now) { waiting.push(confirmedRef); continue; }
304
- const built = deps.buildUnpublish(
295
+ const built = await deps.buildUnpublish(
305
296
  { workspaceId: row.workspaceId, repoRoot: row.repoRoot, worktreePath: row.worktreePath, branch: row.branch, orchestratorId: row.orchestratorId, ref: confirmedRef },
306
297
  "review-ref-reconciler",
307
298
  );
308
299
  if (!built.ok) continue; // no owning host reachable yet — retry next tick (no backoff burned)
309
300
  deps.emit(built.command);
310
- deps.recordDispatch(row.id, built.command.id, now + cleanupBackoffMs(row.cleanupAttempts), now);
301
+ await deps.recordDispatch(row.id, built.command.id, now + cleanupBackoffMs(row.cleanupAttempts), now);
311
302
  dispatched.push(confirmedRef);
312
303
  }
313
304
 
@@ -326,7 +317,7 @@ export const REVIEW_REF_RECONCILE_JOB = {
326
317
  intervalMs: WORKSPACE_ORPHAN_REAPER_INTERVAL_MS,
327
318
  runOnStart: false,
328
319
  deadlineMs: 60 * 1000,
329
- handler: (context: { signal?: AbortSignal }) => reconcileReviewRefs(undefined, context.signal) as unknown as Record<string, unknown>,
320
+ handler: async (context: { signal?: AbortSignal }) => (await reconcileReviewRefs(undefined, context.signal)) as unknown as Record<string, unknown>,
330
321
  };
331
322
 
332
323
  // Test seam: backoff parameters so tests assert scheduling without duplicating literals.
@@ -0,0 +1,27 @@
1
+ import { createHash } from "node:crypto";
2
+ import { isRecord } from "@humwick/sdk";
3
+ import { createActivityEventByClientIdAsync } from "../db/activity-async";
4
+ import { notifyWorkspaceHumanEscalation } from "../workspace-human-escalation";
5
+ import { stewardFallbackTarget } from "../config";
6
+ import { notifyTarget } from "../maintenance/events";
7
+
8
+ /** Heartbeats already persist provider failures for Fleet; page once per broken checkout (#3791). */
9
+ export async function reportRuntimeDependencyFailure(hostId: string, hostname: string, body: unknown): Promise<void> {
10
+ if (!isRecord(body) || !Array.isArray(body.providerStatus)) return;
11
+ const failure = body.providerStatus.find((status) => isRecord(status) && status.available === false
12
+ && typeof status.reason === "string" && status.reason.startsWith("Runtime dependencies unavailable in "));
13
+ if (!failure) return;
14
+ const reason = failure.reason as string;
15
+ const checkout = reason.split(": ")[0]!;
16
+ const key = `runtime-dependencies:${hostId}:${createHash("sha256").update(checkout).digest("hex")}`;
17
+ const subject = `Runtime dependencies broken on ${hostname}`;
18
+ const message = `${hostname}: ${reason}. Providers are unavailable until this checkout is repaired.`;
19
+ const event = await createActivityEventByClientIdAsync({ clientId: key, kind: "state", title: subject, body: message,
20
+ meta: hostId, icon: "ti-alert-triangle", view: "orchestrators", metadata: { hostId, reason } });
21
+ if (!event.created) return;
22
+ const payload = { hostId, reason, kind: "runtime-dependencies.failed" };
23
+ const human = await notifyWorkspaceHumanEscalation({ subject, body: message, priority: "urgent", source: "runtime-dependencies", payload, idempotencyKey: key });
24
+ const target = stewardFallbackTarget();
25
+ const routed = target ? await notifyTarget("maintenance.degraded", {}, target, subject, message, payload, key) : null;
26
+ console.warn(`[relay] ${subject}: ${reason}${human.accepted || routed ? "" : " — no notification target configured"}`);
27
+ }
@@ -1,9 +1,11 @@
1
+ import { updateCommandAsync } from "../commands-write";
1
2
  import { writeChildEnv } from "@humwick/sdk/env";
2
3
  import { basename } from "node:path";
3
4
  import { SCHEDULER_RETRY_MS } from "../config";
4
5
  import { errMessage, stringValue } from "@humwick/sdk";
5
6
  import { hasScope } from "@humwick/sdk/types";
6
- import { findLatestCommandByCorrelation, getCommand, updateCommand } from "../commands-db";
7
+ import { getCommand } from "../commands-db";
8
+ import { findLatestCommandByCorrelationAsync } from "../commands-write";
7
9
  import { RELAY_RUN_DEADLINE_GRACE_MS } from "../relay-run-lease";
8
10
  import { storeTextArtifact } from "../artifact-text";
9
11
  import { gateRunIdentity, recordAgentGateRun } from "../gate-run-capture";
@@ -119,7 +121,7 @@ export async function dispatchScheduledCommand(timer: ScheduledTimer, ctx = pers
119
121
  // Freeze the agent generation that owns this command. Managed restarts reuse the
120
122
  // durable agent id, so agentId alone would let predecessor teardown kill a successor's command.
121
123
  const executionOwnerSpawnRequestId = spawnRequestIds?.length === 1 ? spawnRequestIds[0] : undefined;
122
- const command = findLatestCommandByCorrelation("scheduler.command", timer.correlationId) ?? await dispatchCommandAsync({
124
+ const command = await findLatestCommandByCorrelationAsync("scheduler.command", timer.correlationId) ?? await dispatchCommandAsync({
123
125
  type: "scheduler.command",
124
126
  source: timer.createdBy,
125
127
  target: `orchestrator-${timer.command.orchestratorId}`,
@@ -186,7 +188,7 @@ export async function fireScheduledCommandTimeout(timer: ScheduledTimer, now: nu
186
188
  return { status: "deferred" };
187
189
  }
188
190
  const neverStarted = !!command && (command.status === "pending" || command.status === "accepted") && commandResult(command).phase !== "running";
189
- if (command) updateCommand(command.id, { status: "timed_out", error: "background command timed out" });
191
+ if (command) (await updateCommandAsync(command.id, { status: "timed_out", error: "background command timed out" }));
190
192
  const result = command ? commandResult(command) : {};
191
193
  const admittedAt = numberValue(result.admittedAt) ?? timer.command.admittedAt;
192
194
  const durationMs = admittedAt === undefined ? 0 : Math.max(0, now - admittedAt);
@@ -202,7 +204,7 @@ export async function fireScheduledCommandTimeout(timer: ScheduledTimer, now: nu
202
204
  stdoutTail: stringValue(result.stdoutTail) ?? timer.command.stdoutTail ?? "",
203
205
  stderrTail: stringValue(result.stderrTail) ?? timer.command.stderrTail ?? (neverStarted ? queuedTimeoutReason(timer.command.orchestratorId) : "background command timed out"),
204
206
  };
205
- return fireScheduledCommandWake(timer, {
207
+ return (await fireScheduledCommandWake(timer, {
206
208
  status: "timed_out",
207
209
  finishedAt: timer.command.finishedAt ?? now,
208
210
  durationMs,
@@ -213,7 +215,7 @@ export async function fireScheduledCommandTimeout(timer: ScheduledTimer, now: nu
213
215
  exitCode: null,
214
216
  stdoutTail: timeoutResult.stdoutTail,
215
217
  stderrTail: timeoutResult.stderrTail,
216
- }, timeoutResult, now, inlineWakeSuppressed(timer.command, now));
218
+ }, timeoutResult, now, inlineWakeSuppressed(timer.command, now)));
217
219
  }
218
220
 
219
221
  /** #2776 — admission report: the fallback timer now guards the RUN (end + grace), not the queue ceiling. */
@@ -243,7 +245,7 @@ export async function settleScheduledCommandTimer(command: Command, now = Date.n
243
245
  : "failed";
244
246
  const stdout = clipTail(stringValue(result.stdoutTail) ?? stringValue(result.stdout) ?? "");
245
247
  const stderr = clipTail(stringValue(result.stderrTail) ?? stringValue(result.stderr) ?? command.error ?? "");
246
- return fireScheduledCommandWake(timer, {
248
+ return (await fireScheduledCommandWake(timer, {
247
249
  status,
248
250
  finishedAt: timer.command.finishedAt ?? now,
249
251
  startedAt: numberValue(result.startedAt),
@@ -262,7 +264,7 @@ export async function settleScheduledCommandTimer(command: Command, now = Date.n
262
264
  // Strictly stronger than truncation: the command was KILLED for flooding, it did not finish.
263
265
  outputLimitExceeded: result.outputLimitExceeded === true,
264
266
  logArtifactId: stringValue(result.logArtifactId),
265
- }, result, now, inlineWakeSuppressed(timer.command, now));
267
+ }, result, now, inlineWakeSuppressed(timer.command, now)));
266
268
  }
267
269
 
268
270
  /**
@@ -358,7 +360,7 @@ async function fireScheduledCommandWake(
358
360
  try {
359
361
  const runNumber = timerForSend.runCount + 1;
360
362
  const payloadResult = commandPayload(timerForSend.command!, rawResult, logArtifactId);
361
- const send = sendMessageService({
363
+ const send = (await sendMessageService({
362
364
  from: timerForSend.deliveryFrom,
363
365
  to: timerForSend.target,
364
366
  kind: timerForSend.messageKind as SendMessageInput["kind"] | undefined,
@@ -387,7 +389,7 @@ async function fireScheduledCommandWake(
387
389
  },
388
390
  // One stable key per command completion (not per run count): overlapping settlements dedupe.
389
391
  idempotencyKey: `${timerForSend.idempotencyKey ?? `scheduler:${timerForSend.id}`}:completion`,
390
- }, persistedCommandAuthContext(timerForSend));
392
+ }, persistedCommandAuthContext(timerForSend)));
391
393
  await completeTimerRunAsync(timerForSend, send.message.id, now);
392
394
  return { status: "fired", messageId: send.message.id };
393
395
  } catch (error) {
@@ -1,3 +1,4 @@
1
+ import { framed } from "../hub-metrics";
1
2
  import { createScheduledTimer } from "./scheduler-create";
2
3
  import { planScheduledTimerCreate, cleanOptionalString, canAdministerTimers, type ScheduleTimerInput } from "./scheduler-plan";
3
4
  export { type ScheduleTimerInput } from "./scheduler-plan";
@@ -84,9 +85,8 @@ export function startRelayScheduler(): void {
84
85
  if (isEphemeralMode()) return;
85
86
  if (schedulerTimer) return;
86
87
  void timePostBindPhase("runDueScheduledTimers", runDueScheduledTimers).catch((error) => console.warn(`relay scheduler tick failed: ${errMessage(error)}`));
87
- schedulerTimer = setInterval(() => {
88
- void timePostBindPhase("runDueScheduledTimers", runDueScheduledTimers).catch((error) => console.warn(`relay scheduler tick failed: ${errMessage(error)}`));
89
- }, SCHEDULER_TICK_MS);
88
+ schedulerTimer = setInterval(framed("timer scheduled-timers", () =>
89
+ timePostBindPhase("runDueScheduledTimers", runDueScheduledTimers).catch((error) => console.warn(`relay scheduler tick failed: ${errMessage(error)}`))), SCHEDULER_TICK_MS);
90
90
  // #1408 K7 Phase-2: additively light up the kernel-served timers supervisor iff the reversible
91
91
  // switch is on (default OFF ⇒ pure no-op). Legacy above stays authoritative; the kernel path is
92
92
  // not yet a functional replacement for message/command dispatch (see kernel-timers.ts).
@@ -292,7 +292,7 @@ async function fireClaimedTimer(
292
292
  await disableTimerAsync(timer.id, "timer expired before delivery");
293
293
  return { status: "disabled" };
294
294
  }
295
- return fireScheduledCommandTimeout(timer, now);
295
+ return (await fireScheduledCommandTimeout(timer, now));
296
296
  }
297
297
 
298
298
  try {
@@ -323,7 +323,7 @@ async function fireClaimedTimer(
323
323
  await disableTimerAsync(timer.id, "timer expired before delivery");
324
324
  return { status: "disabled" };
325
325
  }
326
- const result = sendMessageService(sendInput, persistedAuthContext(timer));
326
+ const result = (await sendMessageService(sendInput, persistedAuthContext(timer)));
327
327
  await completeTimerRunAsync(timer, result.message.id, now);
328
328
  return { status: "fired", messageId: result.message.id };
329
329
  } catch (error) {