@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,6 +1,7 @@
1
+ import { createCommandAsync } from "./commands-write";
1
2
  import { writeChildEnv } from "@humwick/sdk/env";
2
3
  import { randomUUID } from "node:crypto";
3
- import { createCommand, type CreateCommandWriteArgs } from "./commands-db";
4
+ import { type CreateCommandWriteArgs } from "./commands-db";
4
5
  import { effectiveProviderCatalogListAsync, listOrchestrators } from "./db";
5
6
  import { resolveProviderSelection } from "@humwick/sdk/provider-catalog";
6
7
  import { getRecipeAsync } from "./recipe-loader";
@@ -15,7 +16,7 @@ import {
15
16
  validateRecipeArtifactRefsAsync,
16
17
  } from "./recipe-async";
17
18
  import type { AttachmentRef, Command, RecipeInstance } from "./types";
18
- import { SYSTEM_LAUNCH, runnerRuntimeTokenEnv } from "./runtime-tokens";
19
+ import { SYSTEM_LAUNCH, runnerRuntimeTokenEnvAsync } from "./runtime-tokens";
19
20
  import { generateSpawnAgentId } from "./services/spawn-identity";
20
21
 
21
22
  interface StartRecipeInput {
@@ -114,7 +115,7 @@ export async function startRecipe(input: StartRecipeInput): Promise<StartRecipeR
114
115
  env: {
115
116
  ...(agent.env ?? {}),
116
117
  ...(attachments.length ? writeChildEnv({}, { AGENT_RELAY_RECIPE_ARTIFACTS: JSON.stringify(attachments) }) : {}),
117
- ...runnerRuntimeTokenEnv({ authority: SYSTEM_LAUNCH,
118
+ ...await runnerRuntimeTokenEnvAsync({ authority: SYSTEM_LAUNCH,
118
119
  agentId,
119
120
  orchestratorId: orchestrator.id,
120
121
  cwd,
@@ -148,13 +149,13 @@ export async function stopRecipe(instanceId: string, stoppedBy = "cli"): Promise
148
149
  // canceled by beginStop; a claimed one is already ordered before this stop and cannot be
149
150
  // targeted with an agent.shutdown command until its spawn result supplies a real agent id.
150
151
  if (agent.agentId.startsWith("pending:")) continue;
151
- const command = createCommand({
152
+ const command = (await createCommandAsync({
152
153
  type: "agent.shutdown",
153
154
  source: stoppedBy,
154
155
  target: agent.agentId,
155
156
  params: { recipeInstanceId: instance.id, role: agent.role },
156
157
  ttlMs: 30_000,
157
- });
158
+ }));
158
159
  commands.push(command);
159
160
  await updateRecipeAgentInstanceAsync(instance.id, agent.agentId, "stopping");
160
161
  }
@@ -6,7 +6,8 @@
6
6
  import { dirname, resolve } from "node:path";
7
7
  import { isRecord, stringValue } from "@humwick/sdk";
8
8
  import { isTrustedOrchestratorApiUrl, relayAuthHeaders } from "./config";
9
- import { getConfig, setConfig } from "./config-store";
9
+ import { getConfig } from "./config-store";
10
+ import { setConfigAsync } from "./config-store-write";
10
11
  import { listOrchestrators, reportedRepoRootForCwd } from "./db";
11
12
  import { hostIsRelayHost } from "./relay-host-locality";
12
13
  import { normalizeHostToken, parseJson, sameHostIdentity } from "./utils";
@@ -70,11 +71,16 @@ export function hostRepoConfigSource<T>(spec: HostRepoConfigSpec<T>): HostRepoCo
70
71
  return null;
71
72
  }
72
73
 
73
- function writeCached(host: string, keys: readonly string[], found: RepoConfigSource<T> | null): void {
74
+ /** #1870 S7: writes on the writer thread, and only when the answer changed. `at` is evidence, not a
75
+ * TTL, so re-stamping an identical answer on every read only bumped the version and history. */
76
+ async function writeCached(host: string, keys: readonly string[], found: RepoConfigSource<T> | null): Promise<void> {
74
77
  const at = Date.now();
78
+ const answer = JSON.stringify(found);
75
79
  for (const key of keys) {
76
80
  try {
77
- setConfig<CachedRepoConfigSource<T>>(spec.cacheNamespace, cacheKey(host, key), { found, at }, spec.cacheNamespace);
81
+ const current = getConfig<CachedRepoConfigSource<T>>(spec.cacheNamespace, cacheKey(host, key))?.value;
82
+ if (current?.at && JSON.stringify(current.found) === answer) continue;
83
+ await setConfigAsync<CachedRepoConfigSource<T>>(spec.cacheNamespace, cacheKey(host, key), { found, at }, spec.cacheNamespace);
78
84
  } catch {
79
85
  // The cache is an optimization for the sync paths; failing to record it must never fail a caller.
80
86
  }
@@ -149,7 +155,7 @@ export function hostRepoConfigSource<T>(spec: HostRepoConfigSpec<T>): HostRepoCo
149
155
  if (hostIsRelayHost(host)) return { known: true, found: await spec.findLocalAsync(cwd) };
150
156
  const read = await readFromHost(cwd, host!);
151
157
  if (read.known) {
152
- writeCached(host!, cacheWriteKeys(cwd, read.found, opts.alsoCacheFor), read.found);
158
+ await writeCached(host!, cacheWriteKeys(cwd, read.found, opts.alsoCacheFor), read.found);
153
159
  return read;
154
160
  }
155
161
  return cachedLookup(host!, cwd);
@@ -1,4 +1,5 @@
1
- import { getConfig, setConfig } from "./config-store";
1
+ import { setConfigAsync } from "./config-store-write";
2
+ import { getConfig } from "./config-store";
2
3
  import {
3
4
  RETENTION_CONFIG_DEFAULTS,
4
5
  RETENTION_KEY,
@@ -27,6 +28,6 @@ export function getRetentionConfigEntry(): ConfigEntry<RetentionConfig> {
27
28
  };
28
29
  }
29
30
 
30
- export function setRetentionConfig(value: unknown, updatedBy?: string): ConfigEntry<RetentionConfig> {
31
- return setConfig(RETENTION_NAMESPACE, RETENTION_KEY, value as RetentionConfig, updatedBy);
31
+ export async function setRetentionConfig(value: unknown, updatedBy?: string): Promise<ConfigEntry<RetentionConfig>> {
32
+ return (await setConfigAsync(RETENTION_NAMESPACE, RETENTION_KEY, value as RetentionConfig, updatedBy));
32
33
  }
@@ -1,6 +1,7 @@
1
+ import { createCommandAsync } from "./commands-write";
1
2
  import { isRecord } from "@humwick/sdk";
2
3
  import { planSend } from "./agent-ref";
3
- import { createCommand } from "./commands-db";
4
+
4
5
  import { getSpawnPolicy } from "./config-store";
5
6
  import { deferLandSettleSideEffect } from "./land-settle-dispatch";
6
7
  import { getLifecycleManager } from "./lifecycle-manager";
@@ -68,7 +69,7 @@ export async function handleReviewerMergeResult(command: Command, result: Record
68
69
  // it must reach the reviewer even if they're offline a while — not a bystander notice. So, like the
69
70
  // landing receipt, it is written SYNCHRONOUSLY on the settle path; only the bystander announcement
70
71
  // ping and the eager spawn defer off the hot path below.
71
- routeNotification({
72
+ await routeNotification({
72
73
  type: "workspace.review_request",
73
74
  scope: { workspaceId: workspace.id, repoRoot: workspace.repoRoot },
74
75
  recipients: [target],
@@ -102,8 +103,8 @@ export async function handleReviewerMergeResult(command: Command, result: Record
102
103
  // (`handleReviewerMergeResult` runs inside `settleWorkspaceMergeCommand`). They defer off the hot
103
104
  // path; the spawn self-heals via `reconcilePolicy` even if a deferred dispatch is missed, and the
104
105
  // review-request obligation it consumes is already durably queued synchronously above.
105
- deferLandSettleSideEffect("reviewer-review-request", () => {
106
- emitWorkspaceTaskSemanticNotifications({
106
+ deferLandSettleSideEffect("reviewer-review-request", async () => {
107
+ await emitWorkspaceTaskSemanticNotifications({
107
108
  workspace: reviewWorkspace,
108
109
  transition: "review-requested",
109
110
  actor: "reviewer-pipeline",
@@ -144,7 +145,7 @@ export async function handleReviewerPipelineScan(
144
145
 
145
146
  if (decision === "APPROVED") {
146
147
  if (!prNumber && !prUrl) return { skipped: "missing-pr" };
147
- const command = createCommand({
148
+ const command = (await createCommandAsync({
148
149
  type: "workspace.pr-arm-auto-merge",
149
150
  source: "system",
150
151
  target: orchestratorAgentId,
@@ -161,7 +162,7 @@ export async function handleReviewerPipelineScan(
161
162
  requestedBy: "reviewer-pipeline",
162
163
  requestedAt: now,
163
164
  },
164
- });
165
+ }));
165
166
  await patchWorkspaceMetadataAsync(workspace.id, {
166
167
  autoMergeArmed: true,
167
168
  autoMergeArmCommandId: command.id,
@@ -176,7 +177,7 @@ export async function handleReviewerPipelineScan(
176
177
  const last = text(workspace.metadata.lastReviewDecision);
177
178
  if (last === "CHANGES_REQUESTED") return { skipped: "changes-requested-already-notified" };
178
179
  const notifiedOwner = workspace.ownerAgentId
179
- ? notifyReviewChangesRequested(workspace, preview, prUrl, prNumber)
180
+ ? await notifyReviewChangesRequested(workspace, preview, prUrl, prNumber)
180
181
  : undefined;
181
182
  await patchWorkspaceMetadataAsync(workspace.id, {
182
183
  lastReviewDecision: decision,
@@ -198,17 +199,17 @@ function workspaceActiveArm(workspace: WorkspaceRecord): boolean {
198
199
  return workspace.metadata.autoMergeArmed === true || typeof workspace.metadata.autoMergeArmCommandId === "string";
199
200
  }
200
201
 
201
- function notifyReviewChangesRequested(
202
+ async function notifyReviewChangesRequested(
202
203
  workspace: WorkspaceRecord,
203
204
  preview: WorkspaceMergePreview,
204
205
  prUrl: string | undefined,
205
206
  prNumber: number | undefined,
206
- ): string | undefined {
207
+ ): Promise<string | undefined> {
207
208
  const target = workspace.ownerAgentId;
208
209
  if (!target) return undefined;
209
210
  // Durable (ttl null): the owner must learn changes were requested on THEIR workspace even after
210
211
  // being offline — store-ahead, not a freshness-gated bystander notice.
211
- routeNotification({
212
+ await routeNotification({
212
213
  type: "workspace.review_changes_requested",
213
214
  scope: { workspaceId: workspace.id, repoRoot: workspace.repoRoot, author: target },
214
215
  recipients: [target],
@@ -1,7 +1,7 @@
1
1
  import { scopeResourceReads } from "./viewer-read";
2
- import { captureSyncFrame, runWithLoopCallsite } from "../loop-block-attribution";
2
+ import { captureSyncFrame } from "../loop-block-attribution";
3
3
  import { withRelayEventDrain } from "../relay-event-drain";
4
- import { trackCaller } from "../hub-metrics";
4
+ import { runInFrame } from "../hub-metrics";
5
5
  import { error, type Handler } from "./_shared";
6
6
  import type { LoopCallsiteContext } from "../loop-block-attribution";
7
7
 
@@ -42,8 +42,8 @@ export function runMatchedRoute(
42
42
  req: Request,
43
43
  finish: (response: Response) => Promise<Response>,
44
44
  ): Promise<Response> {
45
- return runWithLoopCallsite(matched.loop.scope, () => trackCaller(matched.loop.scope.callsite, () => withRelayEventDrain(async () =>
46
- finish(await captureSyncFrame(matched.loop.frame, () => matched.handler(req, matched.params))))));
45
+ return runInFrame(matched.loop.scope, () => withRelayEventDrain(async () =>
46
+ finish(await captureSyncFrame(matched.loop.frame, () => matched.handler(req, matched.params)))));
47
47
  }
48
48
 
49
49
  export function matchRoutes(
@@ -1,9 +1,10 @@
1
+ import { sendMessageWithResultAsync } from "../db/message-send";
1
2
  import { hasPresentedCredential, relayHeader, canonicalHumanAgentId, DEFAULT_USER_ID, errMessage, fireAndForget, isHumanAgentId, isRecord, userIdFromAddress, userSinkId } from "@humwick/sdk";
2
3
  import { authorityDenied } from "../authority-audit";
3
4
  // Auto-split from routes.ts (#299). Domain: _shared.
4
5
  import { agentVisibleTo, visibleAgentIds, viewerScope, type ViewerScope } from "../db/viewer-scope";
5
6
  import { MAX_BODY_BYTES, getIntegrationTokens } from "../config";
6
- import { ValidationError, createActivityEventAsync, createCallbackDeliveryAsync, finishCallbackDeliveryAsync, getAgent, getTaskAsync, normalizeReactionEmoji, sendMessageWithResult } from "../db";
7
+ import { ValidationError, createActivityEventAsync, createCallbackDeliveryAsync, finishCallbackDeliveryAsync, getAgent, getTaskAsync, normalizeReactionEmoji } from "../db";
7
8
  import { cleanEpoch, cleanString, optionalEnum } from "../validation";
8
9
  import { emitActivityEvent, emitMessageQueued, emitNewMessage } from "../sse";
9
10
  import { authorizeAgentForUser, type AgentAction } from "../agent-authz";
@@ -25,19 +26,19 @@ export const json = (data: unknown, status = 200) =>
25
26
  export const error = (msg: string, status = 400) =>
26
27
  json({ error: msg }, status);
27
28
 
28
- export function authorizeRoute(req: Request, check: Parameters<typeof isRequestAuthorizedFor>[1]): Response | null {
29
+ export async function authorizeRoute(req: Request, check: Parameters<typeof isRequestAuthorizedFor>[1]): Promise<Response | null> {
29
30
  if (!hasPresentedCredential(req)) return null;
30
- return isRequestAuthorizedFor(req, check) ? null : authorityDenied(req, "forbidden");
31
+ return isRequestAuthorizedFor(req, check) ? null : (await authorityDenied(req, "forbidden"));
31
32
  }
32
33
 
33
34
  /** A write about agent `agentId` by that agent's own credential: the agent, its agent:write check and the parsed body. */
34
35
  export async function agentWriteRequest(req: Request, agentId: string): Promise<{ agent: NonNullable<ReturnType<typeof getAgent>>; body: Record<string, unknown> } | Response> {
35
36
  const agent = getAgent(agentId);
36
37
  if (!agent) return error("agent not found", 404);
37
- const denied = authorizeRoute(req, {
38
+ const denied = (await authorizeRoute(req, {
38
39
  scope: "agent:write",
39
40
  resource: { agentId: agent.id, policyName: metaString(agent.meta, "policyName"), spawnRequestId: metaString(agent.meta, "spawnRequestId") },
40
- });
41
+ }));
41
42
  if (denied) return denied;
42
43
  const parsed = await parseBody<Record<string, unknown>>(req);
43
44
  if (!parsed.ok) return error(parsed.error, parsed.status);
@@ -49,9 +50,9 @@ export async function agentWriteRequest(req: Request, agentId: string): Promise<
49
50
  // `command:fleet`-scoped token is authorized here without the sandbox constraint; every other
50
51
  // caller falls back to the normal constrained `command:write` check. Use ONLY at those three call
51
52
  // sites — everywhere else must keep going through `authorizeRoute`.
52
- export function authorizeFleetRoute(req: Request, resource?: Parameters<typeof isFleetActionAuthorized>[1]): Response | null {
53
+ export async function authorizeFleetRoute(req: Request, resource?: Parameters<typeof isFleetActionAuthorized>[1]): Promise<Response | null> {
53
54
  if (!hasPresentedCredential(req)) return null;
54
- return isFleetActionAuthorized(req, resource) ? null : authorityDenied(req, "forbidden");
55
+ return isFleetActionAuthorized(req, resource) ? null : (await authorityDenied(req, "forbidden"));
55
56
  }
56
57
 
57
58
  export function authAuditMetadata(req: Request): Record<string, unknown> {
@@ -181,8 +182,8 @@ export function requestUserAddress(req: Request): string {
181
182
  * Single-user worlds fail-open inside {@link authorizeAgentForUser}, so existing routes are
182
183
  * unchanged until #389 upgrades {@link requestUserId} to the real session user.
183
184
  */
184
- export function authorizeAgentRoute(req: Request, agentId: string, action: AgentAction, auditAction: string = action): Response | null {
185
- return authorizeAgentForUser(requestUserId(req), agentId, action) ? null : authorityDenied(req, "agent visibility or role", 403, agentId, auditAction);
185
+ export async function authorizeAgentRoute(req: Request, agentId: string, action: AgentAction, auditAction: string = action): Promise<Response | null> {
186
+ return authorizeAgentForUser(requestUserId(req), agentId, action) ? null : (await authorityDenied(req, "agent visibility or role", 403, agentId, auditAction));
186
187
  }
187
188
 
188
189
  /** Machine callers retain their existing reach; user sessions share one read scope. */
@@ -468,7 +469,7 @@ function reactionNotificationSender(parent: Message, actorId: string): string {
468
469
  return parent.channel && getAgent(parent.channel) ? parent.channel : "user";
469
470
  }
470
471
 
471
- export function sendReactionNotificationToAuthor(parent: Message, actorId: string, emoji: string, action: "add" | "remove"): void {
472
+ export async function sendReactionNotificationToAuthor(parent: Message, actorId: string, emoji: string, action: "add" | "remove"): Promise<void> {
472
473
  if (isHumanAgentId(parent.from) || parent.from === "system") return;
473
474
  const targetAgent = getAgent(parent.from);
474
475
  if (!targetAgent || targetAgent.kind === "channel") return;
@@ -477,7 +478,7 @@ export function sendReactionNotificationToAuthor(parent: Message, actorId: strin
477
478
  const now = Date.now();
478
479
  const actor = reactionActorView(actorId);
479
480
  const verb = action === "remove" ? "removed reaction" : "reacted";
480
- const result = sendMessageWithResult({
481
+ const result = (await sendMessageWithResultAsync({
481
482
  from,
482
483
  to: parent.from,
483
484
  kind: "system",
@@ -505,7 +506,7 @@ export function sendReactionNotificationToAuthor(parent: Message, actorId: strin
505
506
  },
506
507
  },
507
508
  },
508
- });
509
+ }));
509
510
  if (result.created) {
510
511
  if (result.message.deliveryStatus === "queued") emitMessageQueued(result.message);
511
512
  else emitNewMessage(result.message);
@@ -13,12 +13,12 @@ import { agentWriteRequest, authAuditMetadata, authorizeAgentRoute, authorizeRou
13
13
  export async function postAgentEffortAction(req: Request, agentId: string, body: Record<string, unknown>): Promise<Response> {
14
14
  const agent = getAgent(agentId);
15
15
  if (!agent) return error("agent not found", 404);
16
- const driveDenied = authorizeAgentRoute(req, agent.id, "drive", "effort");
16
+ const driveDenied = (await authorizeAgentRoute(req, agent.id, "drive", "effort"));
17
17
  if (driveDenied) return driveDenied;
18
- const denied = authorizeRoute(req, {
18
+ const denied = (await authorizeRoute(req, {
19
19
  scope: "agent:write",
20
20
  resource: { agentId: agent.id, policyName: metaString(agent.meta, "policyName"), spawnRequestId: metaString(agent.meta, "spawnRequestId") },
21
- });
21
+ }));
22
22
  if (denied) return denied;
23
23
  try {
24
24
  const result = await dispatchAgentAction({
@@ -54,12 +54,12 @@ export const postAgentEffortObservedRoute: Handler = async (req, params) => {
54
54
  try {
55
55
  const version = body.version;
56
56
  if (typeof version !== "number" || !Number.isSafeInteger(version) || version < 1) throw new ValidationError("version must be a positive integer");
57
- const observed = reportEffortObserved(agent.id, {
57
+ const observed = (await reportEffortObserved(agent.id, {
58
58
  instanceId: cleanString(body.instanceId, "instanceId", { required: true, max: 200 })!,
59
59
  version,
60
60
  effort: cleanString(body.effort, "effort", { required: true, max: 32 })!,
61
61
  previousEffort: cleanString(body.previousEffort, "previousEffort", { max: 32 }) ?? null,
62
- });
62
+ }));
63
63
  return json(observed);
64
64
  } catch (e) {
65
65
  if (e instanceof ValidationError || e instanceof EffortReportRejected) return error(e.message, 400);
@@ -0,0 +1,23 @@
1
+ import type { HeartbeatResult, ProviderQuotaUpdateInput } from "@humwick/sdk";
2
+ import { acquireProviderQuotaLeaseAsync } from "../db";
3
+ import { getProviderQuotaConfig } from "../provider-quota-config-store";
4
+ import { upsertProviderQuotaAsync } from "../provider-quota-async";
5
+ import { emitRelayEvent } from "../events";
6
+
7
+ /** Same lease and writer as standalone quota reports, with config resolved on the hub (#3608). */
8
+ export async function publishHeartbeatQuota(input: ProviderQuotaUpdateInput, leaseToken?: string): Promise<NonNullable<HeartbeatResult["providerQuota"]>> {
9
+ const config = getProviderQuotaConfig(input.provider);
10
+ if (!config.enabled) return { reported: false, retryAfterMs: 60_000 };
11
+ const holder = `runner:${input.sourceAgentId}`;
12
+ const lease = await acquireProviderQuotaLeaseAsync({
13
+ provider: input.provider, accountKey: input.accountKey, orchestratorId: holder, leaseToken,
14
+ ttlMs: Math.min(10 * 60_000, config.pollIntervalMs + 60_000),
15
+ });
16
+ if (!lease.acquired || !lease.lease) return { reported: false, retryAfterMs: Math.min(lease.retryAfterMs ?? config.pollIntervalMs, config.pollIntervalMs) };
17
+ const result = await upsertProviderQuotaAsync(input, { requiredLeaseHolder: holder });
18
+ if (result.outcome.kind === "stored") {
19
+ const record = result.outcome.record;
20
+ emitRelayEvent({ type: "provider-quota.updated", source: "server", subject: `${record.provider}:${record.accountKey}`, data: {} });
21
+ }
22
+ return { reported: result.outcome.kind === "stored", retryAfterMs: config.pollIntervalMs, leaseToken: lease.lease.leaseToken };
23
+ }
@@ -9,7 +9,7 @@ export const putAgentKeep: Handler = async (req, params) => {
9
9
  const parsed = await parseBody<unknown>(req);
10
10
  if (!parsed.ok) return error(parsed.error, parsed.status);
11
11
  if (!isRecord(parsed.body)) return error("keep required");
12
- const denied = authorizeRoute(req, { scope: "agent:write" });
12
+ const denied = (await authorizeRoute(req, { scope: "agent:write" }));
13
13
  if (denied) return denied;
14
14
  try {
15
15
  const result = await setAgentKeep({
@@ -1,12 +1,12 @@
1
1
  import { PromptVersionConflictError } from "../prompt-version-errors";
2
2
  import { versionedPromptsEnabled } from "../versioned-prompts";
3
3
  import { promptActor } from "../services/prompt-version-writer";
4
- import { setConfigAsync } from "../config-store-write";
4
+ import { deleteAgentProfileAsync, setAgentProfileAsync, setConfigAsync } from "../config-store-write";
5
5
  import { memoryRetirementMessage } from "../memory-retirement";
6
6
  // Auto-split from routes.ts (#299). Domain: agent-profiles.
7
7
  import { ValidationError, withResolvedProvisioningAsync } from "../db";
8
8
  import { cleanString, optionalEnum } from "../validation";
9
- import { deleteAgentProfile, getAgentProfile, listAgentProfiles, resolveAgentProfileKey, setAgentProfile, validateAgentProfile } from "../config-store";
9
+ import { getAgentProfile, listAgentProfiles, resolveAgentProfileKey, validateAgentProfile } from "../config-store";
10
10
  import { RELAY_TOOL_GROUPS } from "../mcp";
11
11
  import { emitConfigChanged } from "../sse";
12
12
  import { error, isAdminRequest, json, normalizeConfigPathParam, parseBody, type Handler } from "./_shared";
@@ -140,8 +140,8 @@ export const putAgentProfileRoute: Handler = async (req, params) => {
140
140
  return json(saved);
141
141
  }
142
142
  const profile = existing?.value.builtIn && isAdminRequest(req)
143
- ? setAgentProfile({ ...parsed.body, name } as AgentProfile, updatedBy, { overrideBuiltIn: true })
144
- : setAgentProfile({ ...parsed.body, name } as AgentProfile, updatedBy);
143
+ ? await setAgentProfileAsync({ ...parsed.body, name } as AgentProfile, updatedBy, { overrideBuiltIn: true })
144
+ : await setAgentProfileAsync({ ...parsed.body, name } as AgentProfile, updatedBy);
145
145
  emitConfigChanged(profile.namespace, profile.key, profile.version);
146
146
  return json(profile, existing ? 200 : profile.version === 1 ? 201 : 200);
147
147
  } catch (e) {
@@ -151,14 +151,14 @@ export const putAgentProfileRoute: Handler = async (req, params) => {
151
151
  }
152
152
  };
153
153
 
154
- export const deleteAgentProfileRoute: Handler = (req, params) => {
154
+ export const deleteAgentProfileRoute: Handler = async (req, params) => {
155
155
  try {
156
156
  const name = normalizeConfigPathParam(params.name, "name");
157
157
  const existing = getAgentProfile(name);
158
158
  if (!existing) return error(memoryRetirementMessage(name) ?? "agent profile not found", 404);
159
159
  const updatedBy = versionedPromptsEnabled() ? promptActor(req) : cleanString(new URL(req.url).searchParams.get("updatedBy") ?? undefined, "updatedBy", { max: 200 });
160
160
  if (existing.value.builtIn && !isAdminRequest(req)) return error("built-in agent profiles are managed by Relay", 400);
161
- deleteAgentProfile(name, updatedBy, { resetBuiltInOverride: existing.value.builtIn });
161
+ await deleteAgentProfileAsync(name, updatedBy, { resetBuiltInOverride: existing.value.builtIn });
162
162
  emitConfigChanged(existing.namespace, existing.key, existing.version + 1);
163
163
  return json({ ok: true });
164
164
  } catch (e) {
@@ -6,7 +6,7 @@ import { cleanString } from "../validation";
6
6
  import { authorizeAgentRoute, authorizeRoute, error, json } from "./_shared";
7
7
 
8
8
  export async function postAgentReportingAction(req: Request, agentId: string, body: Record<string, unknown>): Promise<Response> {
9
- const denied = authorizeAgentRoute(req, agentId, "drive") ?? authorizeRoute(req, { scope: "agent:write", resource: { agentId } });
9
+ const denied = (await authorizeAgentRoute(req, agentId, "drive")) ?? (await authorizeRoute(req, { scope: "agent:write", resource: { agentId } }));
10
10
  if (denied) return denied;
11
11
  try {
12
12
  return json({ ok: true, ...await setAgentReportVerbosity({ agentId, reportVerbosity: body.reportVerbosity, reason: cleanString(body.reason, "reason", { max: 500 }), requestedVia: "http" }, authContextFromRequest(req)) });
@@ -9,10 +9,10 @@ import { ShutdownAuthError, ShutdownTargetError } from "../services/shutdown-age
9
9
  import { authAuditMetadata, authorizeAgentRoute, authorizeRoute, dashboardAttribution, error, json, metaString, parseBody, requestUserAddress, type Handler } from "./_shared";
10
10
  import { isRecord } from "../types";
11
11
 
12
- export const getAgentSelfEffort: Handler = (req, params) => {
12
+ export const getAgentSelfEffort: Handler = async (req, params) => {
13
13
  const agent = getAgent(params.id!);
14
14
  if (!agent) return error("agent not found", 404);
15
- const denied = authorizeAgentRoute(req, agent.id, "view");
15
+ const denied = (await authorizeAgentRoute(req, agent.id, "view"));
16
16
  if (denied) return denied;
17
17
  return json({ agentId: agent.id, selfEffort: spawnSelfEffortPolicy(agent) ?? null });
18
18
  };
@@ -24,12 +24,12 @@ export const putAgentSelfEffort: Handler = async (req, params) => {
24
24
  const body = parsed.body;
25
25
  const agent = getAgent(params.id!);
26
26
  if (!agent) return error("agent not found", 404);
27
- const driveDenied = authorizeAgentRoute(req, agent.id, "drive");
27
+ const driveDenied = (await authorizeAgentRoute(req, agent.id, "drive"));
28
28
  if (driveDenied) return driveDenied;
29
- const denied = authorizeRoute(req, {
29
+ const denied = (await authorizeRoute(req, {
30
30
  scope: "agent:write",
31
31
  resource: { agentId: agent.id, policyName: metaString(agent.meta, "policyName"), spawnRequestId: metaString(agent.meta, "spawnRequestId") },
32
- });
32
+ }));
33
33
  if (denied) return denied;
34
34
  try {
35
35
  const result = await grantSelfEffort({
@@ -4,7 +4,7 @@ import { isHumanAgentId, PROVIDER_SUBMIT_UNCONFIRMED, RELAY_TOKEN_HEADER, SUBMIT
4
4
  import { authorizeAgentControl } from "../agent-authz";
5
5
  import { VALID_AGENT_ACTIONS, agentControlActionIcon, auditEvent, authAuditMetadata, authorizeAgentRoute, authorizeRoute, canViewAgentRoute, cleanAttachmentRefs, dashboardAttribution, emitCommand, error, json, metaString, parseBody, requestUserAddress, requestUserId, spawnRequestId, type AgentControlAction, type Handler } from "./_shared";
6
6
  import { arbitrateDrive, currentDriver, drivingMessage, releaseDrive, type DriveArbitration } from "../agent-drive-arbiter";
7
- import { ValidationError, getAgent, getAgentTimelineAsync, getOrchestrator, markReadyAsync, mergeAgentMetaAsync, sendMessage } from "../db";
7
+ import { sendMessageAsync, ValidationError, getAgent, getAgentTimelineAsync, getOrchestrator, markReadyAsync, mergeAgentMetaAsync } from "../db";
8
8
  import { announcePresence, viewersForAgent } from "../dashboard-presence";
9
9
  import { cleanString, optionalEnum } from "../validation";
10
10
  import { createCommandAsync } from "../commands-write";
@@ -40,10 +40,10 @@ export const postAgentSelfRestartRecheck: Handler = async (req, params) => {
40
40
  // orchestrator's own runtime token authorizes this exactly as it authorizes the agent.restart it
41
41
  // is executing — no over-refusal that would silently abort every self-restart.
42
42
  const orchestrator = agent ? managedControlOrchestrator(agent) : null;
43
- const denied = authorizeRoute(req, {
43
+ const denied = (await authorizeRoute(req, {
44
44
  scope: "command:write",
45
45
  resource: { agentId: params.id!, orchestratorId: orchestrator?.id, policyName: metaString(agent?.meta, "policyName"), spawnRequestId: metaString(agent?.meta, "spawnRequestId") },
46
- });
46
+ }));
47
47
  if (denied) return denied;
48
48
  if (!agent) return json({ ok: false, reason: `self-restart safe-point re-check: agent ${params.id} not found` });
49
49
  const violation = await evaluateSelfRestartSafePoint(agent);
@@ -161,11 +161,11 @@ export const postAgentAction: Handler = async (req, params) => {
161
161
  if (!agent) return error("agent not found", 404);
162
162
  // #392: the acting user must be allowed to drive this agent (fail-open single-user). Gated
163
163
  // before the capability probe so an unauthorized user learns nothing about what the agent supports.
164
- const driveDenied = authorizeAgentRoute(req, agent.id, "drive", action);
164
+ const driveDenied = (await authorizeAgentRoute(req, agent.id, "drive", action));
165
165
  if (driveDenied) return driveDenied;
166
166
  // #3567 — the one lifecycle-control check (the services re-run it for bus/MCP); self excepted.
167
167
  const actionCtx = authContextFromRequest(req);
168
- const controlDenied = actionCtx.callerAgentId === agent.id ? null : authorizeAgentControl(actionCtx, agent, action);
168
+ const controlDenied = actionCtx.callerAgentId === agent.id ? null : (await authorizeAgentControl(actionCtx, agent, action));
169
169
  if (controlDenied) return error(controlDenied.message, 403);
170
170
  // #2664 — releasing a hold that is already gone (recovered, or a double click) is an idempotent no-op.
171
171
  if (action === "releaseSubmitHold" && agentIsControlEligible(agent) && !agentSubmitHoldActive(agent)) return json({ ok: true, action, released: false }, 200);
@@ -181,10 +181,10 @@ export const postAgentAction: Handler = async (req, params) => {
181
181
  if (action === "interrupt") {
182
182
  const arb = await arbitrateDrive(requestUserId(req), agent.id);
183
183
  if (!arb.allowed) return driveBlockedResponse(arb);
184
- const denied = authorizeRoute(req, {
184
+ const denied = (await authorizeRoute(req, {
185
185
  scope: "agent:write",
186
186
  resource: controlResource,
187
- });
187
+ }));
188
188
  if (denied) return denied;
189
189
  try {
190
190
  const result = await dispatchInterrupt({
@@ -208,10 +208,10 @@ export const postAgentAction: Handler = async (req, params) => {
208
208
  // bus + MCP surfaces. The route still enforces the coarse `agent:write` scope +
209
209
  // constraint-list; the service adds the fine parent→child gate.
210
210
  if (action === "shutdown") {
211
- const denied = authorizeRoute(req, {
211
+ const denied = (await authorizeRoute(req, {
212
212
  scope: "agent:write",
213
213
  resource: controlResource,
214
- });
214
+ }));
215
215
  if (denied) return denied;
216
216
  try {
217
217
  if (parsed.body.hard !== undefined && typeof parsed.body.hard !== "boolean") throw new ValidationError("hard must be a boolean");
@@ -243,10 +243,10 @@ export const postAgentAction: Handler = async (req, params) => {
243
243
  const resumeId = action === "resume" ? await latestResumeIdForAgent(agent) : undefined;
244
244
  if (action === "resume" && !orchestrator) return error("no online orchestrator available to resume agent", 409);
245
245
  if (action === "resume" && !resumeId) return error("no resume id recorded for agent", 422);
246
- const denied = authorizeRoute(req, {
246
+ const denied = (await authorizeRoute(req, {
247
247
  scope: "agent:write",
248
248
  resource: { ...controlResource, orchestratorId: orchestrator?.id },
249
- });
249
+ }));
250
250
  if (denied) return denied;
251
251
  // #1953 RC3 — a dashboard restart/resume of a disabled steward is refused (see helper).
252
252
  // #1955 (#1953-review nit 2) — AFTER authorizeRoute: run pre-auth, the 409 disclosed to an
@@ -320,7 +320,7 @@ export const postAgentPrompt: Handler = async (req, params) => {
320
320
  const agent = getAgent(params.id!);
321
321
  if (!agent) return error("agent not found", 404);
322
322
  // #392: only a user authorized to drive this agent may prompt it (fail-open single-user).
323
- const driveDenied = authorizeAgentRoute(req, agent.id, "drive");
323
+ const driveDenied = (await authorizeAgentRoute(req, agent.id, "drive"));
324
324
  if (driveDenied) return driveDenied;
325
325
  // #394: submitting a prompt takes/refreshes the drive lease. A second human driving the same
326
326
  // agent is blocked here (single-user is a no-op), so two operators can't double-submit into one
@@ -328,10 +328,10 @@ export const postAgentPrompt: Handler = async (req, params) => {
328
328
  const arb = await arbitrateDrive(requestUserId(req), agent.id);
329
329
  if (!arb.allowed) return driveBlockedResponse(arb);
330
330
  if (agent.status === "offline") return error("agent is offline", 422);
331
- const denied = authorizeRoute(req, {
331
+ const denied = (await authorizeRoute(req, {
332
332
  scope: "message:send",
333
333
  resource: { target: agent.id, agentId: requestUserAddress(req) },
334
- });
334
+ }));
335
335
  if (denied) return denied;
336
336
  // #2664 — the runner holds exactly one unconfirmed prompt for the operator's resend; a new one
337
337
  // must not queue behind (or replace) it. Refused before any message row exists.
@@ -341,13 +341,13 @@ export const postAgentPrompt: Handler = async (req, params) => {
341
341
  // canonical `user` sink, so today's single operator routes/renders exactly as before; once
342
342
  // auth (#389) sets the real session user, the bubble carries the real `user:<id>`.
343
343
  const fromUser = requestUserAddress(req);
344
- const message = sendMessage({
344
+ const message = (await sendMessageAsync({
345
345
  from: fromUser,
346
346
  to: agent.id,
347
347
  kind: "session",
348
348
  body,
349
349
  ...(attachments ? { payload: { attachments } } : {}),
350
- });
350
+ }));
351
351
  const command = await createCommandAsync({
352
352
  type: "prompt.inject",
353
353
  source: "dashboard",
@@ -397,7 +397,7 @@ export const postAgentPermissionDecision: Handler = async (req, params) => {
397
397
  const agent = getAgent(params.id!);
398
398
  if (!agent) return error("agent not found", 404);
399
399
  // #392: approving/denying a permission is driving the agent (fail-open single-user).
400
- const driveDenied = authorizeAgentRoute(req, agent.id, "drive");
400
+ const driveDenied = (await authorizeAgentRoute(req, agent.id, "drive"));
401
401
  if (driveDenied) return driveDenied;
402
402
  // #394: a plan-approve / AskUserQuestion answer drives the turn — only the lease holder (or an
403
403
  // admin override) may answer, so two humans can't race competing decisions into one prompt.
@@ -405,10 +405,10 @@ export const postAgentPermissionDecision: Handler = async (req, params) => {
405
405
  if (!arb.allowed) return driveBlockedResponse(arb);
406
406
  const metaPolicyName = typeof agent.meta?.policyName === "string" ? agent.meta.policyName : undefined;
407
407
  const metaSpawnRequestId = typeof agent.meta?.spawnRequestId === "string" ? agent.meta.spawnRequestId : undefined;
408
- const denied = authorizeRoute(req, {
408
+ const denied = (await authorizeRoute(req, {
409
409
  scope: "agent:write",
410
410
  resource: { agentId: agent.id, policyName: metaPolicyName, spawnRequestId: metaSpawnRequestId },
411
- });
411
+ }));
412
412
  if (denied) return denied;
413
413
  const result = await dispatchAgentPermissionDecision({
414
414
  agentId: agent.id,
@@ -487,7 +487,7 @@ export const postAgentDrive: Handler = async (req, params) => {
487
487
  const agent = getAgent(params.id!);
488
488
  if (!agent) return error("agent not found", 404);
489
489
  // Driving the wheel requires the same #392 drive authorization the prompt/interrupt routes use.
490
- const driveDenied = authorizeAgentRoute(req, agent.id, "drive");
490
+ const driveDenied = (await authorizeAgentRoute(req, agent.id, "drive"));
491
491
  if (driveDenied) return driveDenied;
492
492
  const userId = requestUserId(req);
493
493
 
@@ -545,10 +545,10 @@ export const postAgentTerminalSession: Handler = async (req, params) => {
545
545
  const metaTmuxSession = typeof agent.meta?.tmuxSession === "string" ? agent.meta.tmuxSession : undefined;
546
546
  const metaPolicyName = typeof agent.meta?.policyName === "string" ? agent.meta.policyName : undefined;
547
547
  const metaSpawnRequestId = typeof agent.meta?.spawnRequestId === "string" ? agent.meta.spawnRequestId : undefined;
548
- const denied = authorizeRoute(req, {
548
+ const denied = (await authorizeRoute(req, {
549
549
  scope: "terminal:attach",
550
550
  resource: { agentId: agent.id, orchestratorId: orchestrator.id, policyName: metaPolicyName, spawnRequestId: metaSpawnRequestId, terminalAttach: true },
551
- });
551
+ }));
552
552
  if (denied) return denied;
553
553
  // Provider-owned attach surfaces are more specific than the runner's tmux pane.
554
554
  // Codex runs its real interactive TUI as a guest attached to the app-server thread;
@@ -588,7 +588,7 @@ export const deleteAgentTerminalSession: Handler = async (req, params) => {
588
588
  if (!agent) return error("agent not found", 404);
589
589
  const orchestrator = managedControlOrchestrator(agent);
590
590
  if (!orchestrator) return error("agent does not have an online orchestrator", 422);
591
- const denied = authorizeRoute(req, {
591
+ const denied = (await authorizeRoute(req, {
592
592
  scope: "terminal:attach",
593
593
  resource: {
594
594
  agentId: agent.id,
@@ -597,7 +597,7 @@ export const deleteAgentTerminalSession: Handler = async (req, params) => {
597
597
  spawnRequestId: typeof agent.meta?.spawnRequestId === "string" ? agent.meta.spawnRequestId : undefined,
598
598
  terminalAttach: true,
599
599
  },
600
- });
600
+ }));
601
601
  if (denied) return denied;
602
602
  const session = params.session!;
603
603
  return proxyOrchestratorDelete(req, orchestrator.id, `/api/terminal-guests/${encodeURIComponent(session)}`);
@@ -85,7 +85,7 @@ export const postAgent: Handler = async (req) => {
85
85
  // timeline note, parent-wake, audit) live in src/services/register-agent.ts so the HTTP,
86
86
  // bus, and orchestrator-report paths cannot drift (epic #342).
87
87
  const input = normalizeAgentInput(parsed.body);
88
- const agent = registerAgent(input, authContextFromRequest(req));
88
+ const agent = await registerAgent(input, authContextFromRequest(req));
89
89
  return json(agent, 201);
90
90
  } catch (e) {
91
91
  if (e instanceof ValidationError) return error(e.message, 400);
@@ -208,7 +208,7 @@ export const postAgentSpawn: Handler = async (req) => {
208
208
  // strip the heavy inlined provisioning file contents from the echoed-back summary.
209
209
  return json({
210
210
  ok: true, spawnRequestId: result.spawnRequestId, harnessSubagents: result.harnessSubagents, orchestratorId: result.orchestratorId, placementReason: result.placementReason, provider: result.provider, command: summarizeSpawnCommandForCaller(result.command),
211
- ...(result.task ? { task: result.task } : {}), ...(result.warnings ? { warnings: result.warnings } : {}), ...(result.dispatchDecision ? { dispatchDecision: result.dispatchDecision } : {}), ...(workflow.reason ? { workflow: { started: false, reason: workflow.reason } } : {}),
211
+ ...(result.task ? { task: result.task } : {}), ...(result.warnings ? { warnings: result.warnings } : {}), ...(result.spawnPolicy ? { spawnPolicy: result.spawnPolicy } : {}), ...(result.dispatchDecision ? { dispatchDecision: result.dispatchDecision } : {}), ...(workflow.reason ? { workflow: { started: false, reason: workflow.reason } } : {}),
212
212
  }, 202);
213
213
  } catch (e) {
214
214
  if (e instanceof McpAuthError) return error(e.message, 403);