@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
@@ -50,7 +50,7 @@ export type PresentationVerbosity = "brief" | "lean" | "default" | "verbose";
50
50
 
51
51
  type TaskGateSummary = Record<TaskGateStatus, number> & { total: number };
52
52
 
53
- type TaskDetailLeanPresentation = Pick<TaskDetail, "validationItems" | "staleOwnerGone" | "terminalStage" | "completedAt" | "owner"> & {
53
+ type TaskDetailLeanPresentation = Pick<TaskDetail, "validationItems" | "staleOwnerGone" | "terminalStage" | "completedAt" | "owner" | "onDeploy"> & {
54
54
  id: number;
55
55
  title: string;
56
56
  status: string;
@@ -228,6 +228,7 @@ export function projectSpawnTargets(
228
228
  },
229
229
  baseline: matrix.baseline,
230
230
  orchestrators: matrix.orchestrators,
231
+ ...(matrix.apiBudgets ? { apiBudgets: matrix.apiBudgets } : {}),
231
232
  // #2656 — operator-disabled providers are absent from the matrix; name them so callers know why.
232
233
  ...(Array.isArray(full.disabledProviders) ? { disabledProviders: full.disabledProviders } : {}),
233
234
  // Profile prose stays in verbose; daily discovery needs only the spawnable names (#3594).
@@ -238,7 +239,7 @@ export function projectSpawnTargets(
238
239
  target: routingTargetLabel(asRecord(rule.target)),
239
240
  })),
240
241
  },
241
- guidance: "Choose an online host, provider, model, and effort above. Default to isSelf; prefer named profiles and use spawnRequestId for idempotency.",
242
+ guidance: "Default to isSelf; use named profiles and spawnRequestId for idempotency.",
242
243
  };
243
244
  }
244
245
 
@@ -328,7 +329,7 @@ export function projectTaskList(
328
329
  return tasks.map((task) => ({
329
330
  id: task.id,
330
331
  label: truncateTaskListLabel(task.label),
331
- status: task.status, ...taskValidationProjection(task),
332
+ status: task.status, ...taskValidationProjection(task), ...(task.onDeploy ? { onDeploy: task.onDeploy } : {}),
332
333
  }));
333
334
  }
334
335
  return tasks.map((task) => {
@@ -339,7 +340,7 @@ export function projectTaskList(
339
340
  status: task.status,
340
341
  deliverableStage: task.deliverableStage ?? null,
341
342
  ownerAgentId: task.ownerAgentId ?? null,
342
- ...taskValidationProjection(task),
343
+ ...taskValidationProjection(task), ...(task.onDeploy ? { onDeploy: task.onDeploy } : {}),
343
344
  updatedAt: updatedAt.relative,
344
345
  ...(crossRepo && task.repo ? { repo: task.repo } : {}),
345
346
  };
@@ -368,7 +369,7 @@ export function projectTaskDetail(
368
369
  deliverableStage: task.deliverableStage ?? null,
369
370
  ownerAgentLabel: task.ownerAgentLabel ?? null,
370
371
  ...(task.owner ? { owner: task.owner } : {}),
371
- ...taskValidationProjection(task),
372
+ ...taskValidationProjection(task), ...(task.onDeploy ? { onDeploy: task.onDeploy } : {}),
372
373
  issues: task.issues,
373
374
  ...(task.waitedOnBy?.length ? { waitedOnByPlans: task.waitedOnBy.length } : {}),
374
375
  gates: summarizeTaskGates(task.gates),
@@ -0,0 +1,32 @@
1
+ import { ValidationError } from "../db/connection";
2
+ import { authContextFromMcp } from "../services/auth-context";
3
+ import { listProjectProfileInstructions, mutateProjectProfileInstructions, projectProfileInstructionHistory, readProjectProfileInstructions } from "../services/project-profile-instructions";
4
+ import { stringField } from "./validation";
5
+ import type { McpAuthContext, ToolDefinition } from "./types";
6
+ import { hasAnyScope } from "./identity";
7
+ import { McpAuthError } from "../mcp-errors";
8
+
9
+ export const PROJECT_PROFILE_INSTRUCTION_TOOLS: ToolDefinition[] = [{
10
+ name: "relay_project_profile_instructions",
11
+ description: "Project additions to profile instructions. Empty version is 0. Writes need expectedVersion; restore appends history.",
12
+ requiredScopes: ["agent:read"],
13
+ inputSchema: { type: "object", properties: {
14
+ operation: { type: "string", enum: ["list", "get", "set", "history", "restore"] },
15
+ projectId: { type: "string" }, profile: { type: "string" }, template: { type: "string" },
16
+ expectedVersion: { type: "integer", minimum: 0 }, version: { type: "integer", minimum: 1 }, reason: { type: "string" },
17
+ }, required: ["operation"], additionalProperties: false },
18
+ }];
19
+
20
+ export async function relayProjectProfileInstructions(auth: McpAuthContext, args: Record<string, unknown>) {
21
+ if (["set", "restore"].includes(String(args.operation)) && !hasAnyScope(auth, ["agent:write"])) throw new McpAuthError("agent:write scope required");
22
+ const required = args.operation !== "list";
23
+ const projectId = stringField(args.projectId, "projectId", { required, max: 200 });
24
+ const profile = stringField(args.profile, "profile", { required, max: 200 });
25
+ switch (args.operation) {
26
+ case "list": return listProjectProfileInstructions({ projectId: projectId || undefined, profile: profile || undefined });
27
+ case "get": return readProjectProfileInstructions(projectId, profile);
28
+ case "history": return projectProfileInstructionHistory(projectId, profile);
29
+ case "set": case "restore": return mutateProjectProfileInstructions(authContextFromMcp(auth), projectId, profile, args, args.operation === "restore");
30
+ default: throw new ValidationError("unknown project profile instructions operation");
31
+ }
32
+ }
@@ -27,7 +27,7 @@ export const RUNTIME_OUTPUT: Record<string, OutputProjection> = {
27
27
  relay_spawn_targets: [],
28
28
  relay_channel_output: [],
29
29
  relay_claude_api_budget: [],
30
- relay_routing_policy_get: [],
30
+ relay_routing_policy_get: [{ path: "diagnostics", brief: null, lean: null }],
31
31
  relay_service_access: [],
32
32
  relay_list_timers: ["body", "command.stdoutTail", "command.stderrTail"].map(path => ({ path: `timers.*.${path}`, brief: 160 })),
33
33
  relay_list_artifacts: [{ path: "artifacts.*.links.*.title", brief: null }],
@@ -74,6 +74,11 @@ function jobSummary(job: MaintenanceJob, verbosity: OutputVerbosity): Record<str
74
74
  }
75
75
 
76
76
  export function projectRuntimeOutput(name: string, result: unknown, verbosity: OutputVerbosity): unknown {
77
+ // Migration provenance is already exposed by diagnostics; never send the notes twice (#3828).
78
+ if (name === "relay_routing_policy_get" && isRecord(result) && isRecord(result.policy)) {
79
+ const { migration, ...policy } = result.policy;
80
+ return { ...result, policy };
81
+ }
77
82
  if (name !== "relay_maintenance_jobs" || verbosity === "verbose" || !isRecord(result)) return result;
78
83
  if (verbosity === "brief" && isRecord(result.job)) return { job: jobSummary(result.job as unknown as MaintenanceJob, verbosity) };
79
84
  if (!Array.isArray(result.jobs)) return result;
@@ -1,7 +1,7 @@
1
1
  import { isRecord } from "@humwick/sdk";
2
2
  import type { AgentCard, ComponentToken } from "../types";
3
3
  import { hasComponentScope } from "../security";
4
- import { RELAY_TOOL_GROUPS, resolveRelayTools, SELF_CARE_TOOL_GROUP } from "./tool-groups";
4
+ import { resolveRelayTools, SELF_CARE_TOOL_GROUP } from "./tool-groups";
5
5
 
6
6
  export function supportsSelfResume(agent: AgentCard | null): boolean {
7
7
  const context = agent?.providerCapabilities?.context;
@@ -17,7 +17,7 @@ export function canDiscoverSelfResume(agent: AgentCard | null, token: ComponentT
17
17
  const constraints = token.constraints;
18
18
  const selection = { groups: constraints?.toolGroups, include: constraints?.toolInclude, exclude: constraints?.toolExclude };
19
19
  const tools = resolveRelayTools(selection, { alwaysOn: token.role === "provider" && Boolean(constraints?.profile || token.sub.startsWith("runner:")), allowUnknownGroups: true });
20
- if (token.role === "provider") for (const name of RELAY_TOOL_GROUPS[SELF_CARE_TOOL_GROUP]!) tools.add(name);
20
+ if (token.role === "provider") for (const name of resolveRelayTools({ groups: [SELF_CARE_TOOL_GROUP] }, { alwaysOn: false })) tools.add(name);
21
21
  if (!tools.has("relay_compact_and_resume")) return false;
22
22
  return !constraints?.toolAllowlist || constraints.toolAllowlist.includes("relay_compact_and_resume");
23
23
  }
@@ -31,7 +31,16 @@ export function projectSpawnTargetMatrix(full: Record<string, unknown>, enrich?:
31
31
  const baseline = choices.map(({ value }) => value);
32
32
  return {
33
33
  self: { orchestratorId: stringOrNull(self.orchestratorId), host: stringOrNull(self.host) },
34
- ...(Array.isArray(full.apiBudgets) ? { apiBudgets: full.apiBudgets } : {}),
34
+ ...(Array.isArray(full.apiBudgets) ? { apiBudgets: asRecords(full.apiBudgets).map((budget) => ({
35
+ budgetId: budget.budgetId, source: budget.source, month: budget.month,
36
+ headroomMicroUsd: budget.headroomMicroUsd,
37
+ ...(budget.baselineKnown ? {
38
+ startsAt: budget.startsAt, endsAt: budget.endsAt,
39
+ ceilingMicroUsd: budget.ceilingMicroUsd, estimatedSpentMicroUsd: budget.estimatedSpentMicroUsd,
40
+ enabled: budget.enabled,
41
+ ...(budget.refusalReason ? { refusalReason: budget.refusalReason } : {}),
42
+ } : {}),
43
+ })) } : {}),
35
44
  ...(Array.isArray(full.disabledProviders) ? { disabledProviders: full.disabledProviders } : {}),
36
45
  baseline: choices.map(({ value, original }) => ({ ...value, ...enrich?.(original) })),
37
46
  orchestrators: hosts.map(({ host, providers }) => {
@@ -1,5 +1,6 @@
1
1
  import { memoryRetirementMessage } from "../memory-retirement";
2
2
  import { registryToolName, type AgentProfile } from "@humwick/sdk";
3
+ import { ASSIGNED_RELAY_TOOLS } from "./tool-roles";
3
4
 
4
5
  // Tool group membership (#551). Each tool belongs to exactly one group; toolGroups in the token
5
6
  // constraints lists which groups are enabled (absent = all). This is the surface/eager layer on
@@ -29,7 +30,7 @@ export const RELAY_TOOL_GROUPS: Record<string, readonly string[]> = {
29
30
  // #3110 — opt-in: only profiles that list it (plus coordinator/ops-assistant by default) get the
30
31
  // tools AND the secrets:write scope; see runtime-tokens.ts.
31
32
  secrets: ["relay_service_access", "relay_secret_reader_create", "relay_secret_project_create", "relay_secret_set"],
32
- prompts: ["relay_prompt"],
33
+ prompts: ["relay_prompt", "relay_project_profile_instructions"],
33
34
  quota: ["relay_codex_reset_consume", "relay_claude_api_budget"],
34
35
  // #3327 — coordinator-only, like decisions: edits the fleet's routing preferences.
35
36
  routing: ["relay_routing_policy_get", "relay_routing_policy_set"],
@@ -93,11 +94,11 @@ export function resolveRelayTools(selection: AgentProfile["relay"]["tools"] = {}
93
94
  if (!RELAY_TOOL_NAMES.has(registryToolName(name))) throw new Error(memoryRetirementMessage(registryToolName(name)) ?? `${field}: unknown Relay tool "${name}"`);
94
95
  }
95
96
  }
96
- const tools = new Set((selection.groups ?? Object.keys(RELAY_TOOL_GROUPS)).flatMap((group) => (RELAY_TOOL_GROUPS[group] ?? [])));
97
+ const tools = new Set((selection.groups ?? Object.keys(RELAY_TOOL_GROUPS)).flatMap((group) => (RELAY_TOOL_GROUPS[group] ?? [])).filter(name => ASSIGNED_RELAY_TOOLS.has(name)));
97
98
  for (const name of selection.include ?? []) tools.add(registryToolName(name));
98
99
  for (const name of selection.exclude ?? []) tools.delete(registryToolName(name));
99
100
  for (const group of options.alwaysOn !== false ? ["core", SELF_CARE_TOOL_GROUP] : []) {
100
- for (const name of RELAY_TOOL_GROUPS[group]!) tools.add(name);
101
+ for (const name of RELAY_TOOL_GROUPS[group]!) if (ASSIGNED_RELAY_TOOLS.has(name)) tools.add(name);
101
102
  }
102
103
  return tools;
103
104
  }
@@ -0,0 +1,81 @@
1
+ import type { AgentProfile } from "@humwick/sdk";
2
+
3
+ // Explicit names, never registry/group expansion: adding a tool must not grow a role (#3817).
4
+ const COMMON_READ = ["relay_guide", "relay_whoami", "relay_get_message", "relay_get_thread", "relay_find_agents", "relay_task_get", "relay_recall", "web_search"];
5
+ const COMMON_WRITE = ["relay_secret_request", "relay_send_message", "relay_reply", "relay_task_deliver", "relay_compact_and_resume", "relay_run", "relay_schedule_timer"];
6
+ const MEMORY_READ = ["relay_project_read", "relay_project_search"];
7
+ const MEMORY_WRITE = ["relay_project_write_entry", "relay_project_retract"];
8
+ const ARTIFACT_READ = ["relay_list_artifacts", "relay_read_artifact"];
9
+ const ARTIFACT_WRITE = ["relay_upload_artifact", "relay_attach_artifact", "relay_pin_artifact"];
10
+ const TEAM_READ = ["relay_blackboard_get", "relay_blackboard_read", "relay_blackboard_search"];
11
+ const TEAM_WRITE = ["relay_blackboard_write", "relay_blackboard_retract"];
12
+ const TASK_READ = ["relay_task_list", "relay_task_history", "relay_task_memory_read"];
13
+ const PLAN_READ = ["relay_plan_get", "relay_plan_list", "relay_plan_conformance"];
14
+ const WORKSPACE_READ = ["relay_workspace_status", "relay_workspace_deps"];
15
+ const TIMER_READ = ["relay_list_timers"];
16
+ const TIMER_WRITE = ["relay_schedule_timer", "relay_cancel_timer"];
17
+ const WORK_READ = [...MEMORY_READ, ...ARTIFACT_READ, ...TEAM_READ, ...WORKSPACE_READ, ...TASK_READ, ...PLAN_READ, "relay_workflow_get"];
18
+ const WORK_WRITE = [...MEMORY_WRITE, ...ARTIFACT_WRITE, ...TEAM_WRITE];
19
+ const PLAN_WRITE = ["relay_plan_import", "relay_plan_create", "relay_plan_add_node", "relay_plan_update_node", "relay_plan_add_edge", "relay_plan_remove_node", "relay_plan_remove_edge", "relay_plan_archive", "relay_plan_delete", "relay_plan_bind_node", "relay_plan_start"];
20
+ const TASK_WRITE = ["relay_task_set_validation", "relay_task_needs_validation", "relay_task_create", "relay_task_update", "relay_task_set_status", "relay_task_set_stage", "relay_task_set_review_hold", "relay_task_withdraw_land", "relay_task_confirm_carry", "relay_task_record_gate", "relay_task_add_dependency", "relay_task_remove_dependency", "relay_task_add_ref", "relay_task_remove_ref", "relay_task_assign_agent", "relay_task_memory_replace_working_state", "relay_task_memory_append_ruled_out", "relay_task_memory_append_decision", "relay_task_dispatch", "relay_backlog_promote", "relay_task_comment", "relay_task_close_bridge"];
21
+ const SPAWN_READ = ["relay_spawn_targets", "relay_my_agents", "relay_agent_status", "relay_agent_crash_report", "relay_team_get"];
22
+ const SPAWN_WRITE = ["relay_spawn_agent", "relay_shutdown_agent", "relay_interrupt_agent", "relay_agent_keep", "relay_agent_action", "relay_permission_decision", "relay_team_set_spawn_delegation", "relay_team_set_brief", "relay_team_claim", "relay_team_dissolve"];
23
+ const WORKFLOW_WRITE = ["relay_workflow_start", "relay_workflow_resume", "relay_workflow_cancel"];
24
+
25
+ function role(why: string, read: readonly string[] = [], write: readonly string[] = []) {
26
+ return { why, read: [...new Set([...COMMON_READ, ...read])].sort(), write: [...new Set([...COMMON_WRITE, ...write])].sort() };
27
+ }
28
+
29
+ const implementer = role("Implement and deliver the hydrated bound Task. Bounded waits use relay_run.", [...MEMORY_READ, ...ARTIFACT_READ, ...TEAM_READ, ...WORKSPACE_READ], [...WORK_WRITE, "relay_set_effort"]);
30
+ const quality = role("Read Tasks and plans, execute checks and deliver findings; report through the bound Task.", WORK_READ, [...WORK_WRITE, ...TIMER_WRITE]);
31
+ const research = role("Research and report; keep findings and artifacts without workspace or orchestration administration.", [...MEMORY_READ, ...TEAM_READ, ...ARTIFACT_READ, "relay_web_tool_calls"], [...MEMORY_WRITE, ...TEAM_WRITE, ...ARTIFACT_WRITE]);
32
+
33
+ export const RELAY_TOOL_ROLES: Readonly<Record<string, ReturnType<typeof role>>> = {
34
+ coordinator: role("Own plan, Task, workflow and team lifecycle; request service access and delegate broker setup and operational work to specialists.",
35
+ [...WORK_READ, ...SPAWN_READ, ...TIMER_READ, "relay_backlog", "relay_release_readiness", "relay_hosts", "relay_merge_pauses", "relay_routing_policy_get", "relay_project_list", "relay_project_get", "relay_project_journal_get", "relay_team_template_list", "relay_team_template_get"],
36
+ [...WORK_WRITE, ...PLAN_WRITE, ...TASK_WRITE, ...SPAWN_WRITE, ...WORKFLOW_WRITE, ...TIMER_WRITE, "relay_decision", "relay_set_effort", "relay_service_access", "relay_red_main_recover", "relay_merge_pause", "relay_merge_renew", "relay_merge_resume", "relay_workspace_merge_hold", "relay_workspace_merge_resume", "relay_host_gate_budget", "relay_routing_policy_set", "relay_project_profile_instructions", "relay_prompt", "relay_project_onboard", "relay_project_checkout", "relay_project_add_root", "relay_project_add_edge", "relay_project_remove_edge", "relay_project_archive", "relay_project_promote_entry", "relay_project_ingest_claudemd", "relay_project_journal_update", "relay_team_template_save", "relay_team_template_delete", "relay_team_spawn_from_template"]),
37
+ "sub-coordinator": role("Coordinate a delegated project and its plan/workflow; parent owns fleet routing and project administration.",
38
+ [...WORK_READ, ...SPAWN_READ, ...TIMER_READ],
39
+ [...WORK_WRITE, ...PLAN_WRITE, ...WORKFLOW_WRITE, ...TIMER_WRITE, "relay_decision", "relay_set_effort", "relay_spawn_agent", "relay_shutdown_agent", "relay_interrupt_agent", "relay_agent_keep", "relay_agent_action", "relay_permission_decision", "relay_team_set_brief", "relay_team_dissolve", "relay_task_create", "relay_task_update", "relay_task_set_status", "relay_task_set_review_hold", "relay_task_withdraw_land", "relay_task_record_gate", "relay_task_add_dependency", "relay_task_remove_dependency", "relay_task_add_ref", "relay_task_remove_ref", "relay_task_assign_agent", "relay_task_memory_replace_working_state", "relay_task_memory_append_ruled_out", "relay_task_memory_append_decision", "relay_task_dispatch", "relay_task_comment"]),
40
+ worker: implementer,
41
+ "worker-gui": role("Implement GUI work from the hydrated Task and return artifacts; inspect its workspace.", [...MEMORY_READ, ...ARTIFACT_READ, ...WORKSPACE_READ], [...MEMORY_WRITE, ...ARTIFACT_WRITE, "relay_set_effort"]),
42
+ debugger: implementer,
43
+ reviewer: quality,
44
+ QA: quality,
45
+ "device-qa": quality,
46
+ "slice-qa": quality,
47
+ "plan-auditor": quality,
48
+ probe: role("Run a bounded proof and return its result; no project or workspace administration."),
49
+ "image-gen": role("Generate and deliver image artifacts for a bound Task.", [...MEMORY_READ, ...ARTIFACT_READ, ...WORKSPACE_READ], [...MEMORY_WRITE, ...ARTIFACT_WRITE]),
50
+ "software-design": role("Inspect architecture, Tasks and plans and deliver a design; coordinator authors orchestration.", WORK_READ, WORK_WRITE),
51
+ brainstorm: research,
52
+ explorer: research,
53
+ "isolated-research": research,
54
+ "social-media": role("Research and prepare channel output; no team or Task administration.", [...MEMORY_READ, ...ARTIFACT_READ, "relay_web_tool_calls"], [...MEMORY_WRITE, ...ARTIFACT_WRITE, "relay_channel_output", "relay_send_to_channel"]),
55
+ "ops-assistant": role("Operate gates, maintenance and delivery; inspect agent health without spawning or planning.",
56
+ [...MEMORY_READ, ...ARTIFACT_READ, ...WORKSPACE_READ, ...TIMER_READ, "relay_hosts", "relay_agent_status", "relay_agent_crash_report", "relay_maintenance_jobs", "relay_maintenance_pauses", "relay_merge_pauses", "relay_workspace_list", "relay_release_readiness"],
57
+ [...MEMORY_WRITE, ...ARTIFACT_WRITE, ...TIMER_WRITE, "relay_maintenance_pause", "relay_maintenance_resume", "relay_merge_pause", "relay_merge_renew", "relay_merge_resume", "relay_workspace_claim", "relay_workspace_release", "relay_workspace_merge_hold", "relay_workspace_merge_resume", "relay_red_main_recover", "relay_set_effort"]),
58
+ "sec-ops": role("Audit security and manage broker access; no orchestration or fleet mutation.",
59
+ [...MEMORY_READ, ...ARTIFACT_READ, ...WORKSPACE_READ, "relay_hosts", "relay_web_tool_calls"], [...MEMORY_WRITE, ...ARTIFACT_WRITE, "relay_service_access", "relay_secret_reader_create", "relay_secret_project_create", "relay_secret_set", "relay_notify_ntfy"]),
60
+ // These require admin/control tokens, not provider-agent grants. No hub agent profile is created.
61
+ operator: role("Operator/control-client tools that cannot be conferred by an agent profile.",
62
+ ["relay_kernel_listInstances", "relay_kernel_getInstance", "relay_kernel_getJournal", "relay_kernel_listEvents", "relay_kernel_listEntities", "relay_kernel_getEntity", "relay_issue_ref_get", "relay_issue_ref_list", "relay_issue_association_list_issues_for_entity", "relay_issue_association_list_entities_for_issue", "relay_issue_activity_by_issue", "relay_issue_activity_by_agent", "relay_list_subscriptions", "relay_why_notified", "relay_notification_preview"],
63
+ ["relay_kernel_cancel", "relay_kernel_pause", "relay_kernel_resume", "relay_kernel_retry", "relay_profile_trust", "relay_codex_reset_consume", "relay_claude_api_budget", "relay_delete_channel_binding", "relay_issue_ref_upsert", "relay_issue_ref_resolve", "relay_issue_ref_update", "relay_issue_ref_delete", "relay_issue_association_associate", "relay_issue_association_remove", "relay_issue_activity_record", "relay_issue_lifecycle_reopen", "relay_subscribe", "relay_unsubscribe", "relay_notify_ntfy", "relay_reevaluate_channel_delivery"]),
64
+ };
65
+
66
+ export const ASSIGNED_RELAY_TOOLS: ReadonlySet<string> = new Set(Object.values(RELAY_TOOL_ROLES).flatMap(role => [...role.read, ...role.write]));
67
+
68
+ /** Exact includes keep later group additions out of already-curated profiles. */
69
+ export function relayRoleSelection(name: string): NonNullable<AgentProfile["relay"]["tools"]> {
70
+ const assignment = RELAY_TOOL_ROLES[name];
71
+ if (!assignment) throw new Error(`No Relay tool role for profile ${name}`);
72
+ return { groups: [], include: [...new Set([...assignment.read, ...assignment.write])].sort(), exclude: [] };
73
+ }
74
+
75
+ export function relayToolRoleErrors(registered: readonly string[]): string[] {
76
+ const names = new Set(registered);
77
+ return [
78
+ ...registered.filter(name => !ASSIGNED_RELAY_TOOLS.has(name)).map(name => `${name}: assign this Relay tool to at least one role in src/mcp/tool-roles.ts`),
79
+ ...[...ASSIGNED_RELAY_TOOLS].filter(name => !names.has(name)).map(name => `${name}: role assignment names an unregistered Relay tool`),
80
+ ];
81
+ }
@@ -16,7 +16,7 @@ import { workflowForBuilderSpawn } from "../services/workflow-auto-start";
16
16
  import { optionalEnum } from "../validation";
17
17
  import { cleanTaskDispatch } from "../db/task-entity";
18
18
  import { DISPATCH_SHAPE_SCHEMA } from "./dispatch-shape-schema";
19
- import { APPROVAL_MODES, AUTO_MERGE_POLICIES, LAUNCH_MODES, REPORT_VERBOSITIES, SPAWN_PROVIDERS, stringValue, VALID_AGENT_LIFECYCLES, VALID_EFFORTS, VALID_WORKSPACE_MODES } from "@humwick/sdk";
19
+ import { APPROVAL_MODES, AUTO_MERGE_POLICIES, LAUNCH_MODES, REPORT_VERBOSITIES, SPAWN_PROVIDERS, stringValue, VALID_AGENT_LIFECYCLES, VALID_WORKSPACE_MODES } from "@humwick/sdk";
20
20
  import type { ProviderEffort } from "@humwick/sdk/provider-catalog";
21
21
  import type { AgentCard, AgentLifecycle, Command, SpawnApprovalMode, SpawnProvider, WorkspaceAutoMergePolicy, WorkspaceLandingPolicy, WorkspaceLandMechanism, WorkspaceMode, WorkspaceRecord } from "../types";
22
22
  import { projectMyAgent, projectSpawnTargets, type MyAgentFullPresentation, type PresentationVerbosity } from "./presentation";
@@ -43,7 +43,7 @@ export const SPAWN_TOOLS: ToolDefinition[] = [
43
43
  env: { type: "object", additionalProperties: { type: "string" }, description: "Vault refs: secret:<name>." },
44
44
  label: { type: "string" },
45
45
  model: { type: "string" },
46
- effort: { enum: VALID_EFFORTS },
46
+ effort: { type: "string" },
47
47
  approvalMode: { enum: APPROVAL_MODES, description: "Use open; read-only blocks reports/tests; guarded waits for prompts." },
48
48
  prompt: { type: "string" },
49
49
  taskId: { oneOf: [{ type: "integer", minimum: 1 }, { type: "string" }], description: "Task id or TNNNN; loads its spec." },
@@ -70,7 +70,7 @@ export const SPAWN_TOOLS: ToolDefinition[] = [
70
70
  hostPinned: { type: "boolean" },
71
71
  landBlocked: { type: "boolean", description: "Permanent ban; for review use a Task hold." },
72
72
  selfEffort: { type: "boolean" },
73
- selfEffortCeiling: { enum: VALID_EFFORTS },
73
+ selfEffortCeiling: { type: "string" },
74
74
  profile: { type: "string" },
75
75
  role: { type: "string", description: "Default-branch project role; mutually exclusive with profile." },
76
76
  tags: { type: "array", items: { type: "string" } },
@@ -229,6 +229,7 @@ export async function relaySpawnAgent(auth: McpAuthContext, args: Record<string,
229
229
  ...(result.taskId !== undefined ? { taskId: result.taskId } : {}),
230
230
  ...(result.task ? { task: result.task } : {}),
231
231
  ...(result.warnings ? { warnings: result.warnings } : {}),
232
+ ...(result.spawnPolicy ? { spawnPolicy: result.spawnPolicy } : {}),
232
233
  ...(result.dispatchDecision ? { dispatchDecision: { target: result.dispatchDecision.target, rationale: result.dispatchDecision.rationale, warnings: result.dispatchDecision.warnings } } : {}),
233
234
  ...(workflow.reason ? { workflow: { started: false, reason: workflow.reason } } : {}),
234
235
  };
@@ -238,7 +238,7 @@ export async function relayWorkspaceMutation(auth: McpAuthContext, action: Works
238
238
  payload.guidance = describeWorkspacePhase(result.workspace);
239
239
  // Legacy workspace-ready route/CLI path is an explicit, platform-owned completion signal: the caller
240
240
  // is declaring its work window closed. Close it, forwarding only the held final group.
241
- markAgentWorkFinal(result.workspace.ownerAgentId ?? callerAgentId(auth), "workspace-ready");
241
+ (await markAgentWorkFinal(result.workspace.ownerAgentId ?? callerAgentId(auth), "workspace-ready"));
242
242
  }
243
243
  return payload;
244
244
  }
@@ -1,7 +1,6 @@
1
1
  import { REPORT_VERBOSITIES } from "@humwick/sdk";
2
2
  import { setAgentReportVerbosity } from "./services/agent-reporting";
3
3
  import { INCLUDED_TOOL_SCOPE_NEEDS } from "./mcp/tool-groups";
4
- import { VALID_EFFORTS } from "@humwick/sdk/provider-catalog";
5
4
  import { cleanEnum, cleanString } from "./validation";
6
5
  import { AgentActionTargetError, dispatchAgentAction, type AgentAction } from "./services/agent-action";
7
6
  import { authContextFromMcp } from "./services/auth-context";
@@ -37,7 +36,7 @@ export const SET_EFFORT_TOOL = {
37
36
  inputSchema: {
38
37
  type: "object",
39
38
  properties: {
40
- effort: { type: "string", enum: VALID_EFFORTS },
39
+ effort: { type: "string" },
41
40
  reason: { type: "string" },
42
41
  requestId: { type: "string" },
43
42
  },
@@ -1,4 +1,5 @@
1
- import { getAgent, getEntry, getEntryChain, listEntries, retractEntry, searchEntries, ValidationError, writeEntry } from "./db";
1
+ import { writeEntryAsync, retractEntryAsync } from "./db/runtime-tail-async";
2
+ import { getAgent, getEntry, getEntryChain, listEntries, searchEntries, ValidationError } from "./db";
2
3
  import { McpNotFoundError } from "./mcp-errors";
3
4
  import { authContextFromMcp } from "./services/auth-context";
4
5
  import { cleanString, cleanStringArray, optionalEnum } from "./validation";
@@ -92,14 +93,14 @@ function ensureSameTeam(entryId: string, teamId: string): void {
92
93
  if (entry.teamId !== teamId) throw new McpNotFoundError("blackboard entry not found");
93
94
  }
94
95
 
95
- export function relayBlackboardTool(auth: McpAuthLike, name: string, args: Record<string, unknown>): Record<string, unknown> {
96
+ export async function relayBlackboardTool(auth: McpAuthLike, name: string, args: Record<string, unknown>): Promise<Record<string, unknown>> {
96
97
  const { agentId, teamId } = callerTeam(auth);
97
98
  if (name === "relay_blackboard_write") {
98
99
  const supersedes = cleanString(args.supersedes, "supersedes", { max: 120 });
99
100
  const kind = cleanKind(args.kind);
100
101
  if (!kind) throw new ValidationError("kind required");
101
102
  if (supersedes) ensureSameTeam(supersedes, teamId);
102
- return writeEntry({
103
+ return (await writeEntryAsync({
103
104
  teamId,
104
105
  authorId: agentId,
105
106
  kind,
@@ -107,7 +108,7 @@ export function relayBlackboardTool(auth: McpAuthLike, name: string, args: Recor
107
108
  body: cleanString(args.body, "body", { max: 16_000 }),
108
109
  tags: cleanStringArray(args.tags, "tags", { itemMax: 80, maxItems: 32 }),
109
110
  supersedes,
110
- }) as unknown as Record<string, unknown>;
111
+ })) as unknown as Record<string, unknown>;
111
112
  }
112
113
  if (name === "relay_blackboard_get") {
113
114
  const id = cleanString(args.id, "id", { required: true, max: 120 })!;
@@ -123,7 +124,7 @@ export function relayBlackboardTool(auth: McpAuthLike, name: string, args: Recor
123
124
  if (name === "relay_blackboard_retract") {
124
125
  const id = cleanString(args.id, "id", { required: true, max: 120 })!;
125
126
  ensureSameTeam(id, teamId);
126
- const entry = retractEntry(id);
127
+ const entry = (await retractEntryAsync(id));
127
128
  if (!entry) throw new McpNotFoundError("blackboard entry not found");
128
129
  return entry as unknown as Record<string, unknown>;
129
130
  }
@@ -66,16 +66,16 @@ function requiredId(args: Record<string, unknown>): number {
66
66
  return id;
67
67
  }
68
68
 
69
- function run(auth: McpAuthLike, args: Record<string, unknown>): Record<string, unknown> {
69
+ async function run(auth: McpAuthLike, args: Record<string, unknown>): Promise<Record<string, unknown>> {
70
70
  const ctx = authContextFromMcp(auth);
71
71
  const action = cleanEnum(args.action, "action", ACTIONS);
72
72
  if (action === "file") {
73
- const decision = fileDecision(ctx, args, callerProjectId(ctx));
73
+ const decision = (await fileDecision(ctx, args, callerProjectId(ctx)));
74
74
  return { id: decision.id, kind: decision.kind, status: decision.status, teamId: decision.teamId };
75
75
  }
76
- if (action === "update") return { id: updateDecision(ctx, requiredId(args), args).id, status: "open" };
77
- if (action === "withdraw") return { id: withdrawDecision(ctx, requiredId(args)).id, status: "withdrawn" };
78
- const teamId = callerDecisionTeam(ctx, false);
76
+ if (action === "update") return { id: (await updateDecision(ctx, requiredId(args), args)).id, status: "open" };
77
+ if (action === "withdraw") return { id: (await withdrawDecision(ctx, requiredId(args))).id, status: "withdrawn" };
78
+ const teamId = (await callerDecisionTeam(ctx, false));
79
79
  const id = optionalPositiveInt(args.id, "id");
80
80
  if (id !== undefined) return { decision: teamDecision(teamId, id) };
81
81
  const status = optionalEnum(args.status, "status", [...OPERATOR_DECISION_STATUSES, "all"] as const, "open");
@@ -84,9 +84,9 @@ function run(auth: McpAuthLike, args: Record<string, unknown>): Record<string, u
84
84
  return { lines: decisions.map((decision) => renderDecisionLine(decision)) };
85
85
  }
86
86
 
87
- export function relayDecisionTool(auth: McpAuthLike, args: Record<string, unknown>): Record<string, unknown> {
87
+ export async function relayDecisionTool(auth: McpAuthLike, args: Record<string, unknown>): Promise<Record<string, unknown>> {
88
88
  try {
89
- return run(auth, args);
89
+ return (await run(auth, args));
90
90
  } catch (error) {
91
91
  if (error instanceof ServiceAuthError) throw new McpAuthError(error.message);
92
92
  if (error instanceof DecisionNotFoundError) throw new McpNotFoundError(error.message);
@@ -1,3 +1,4 @@
1
+ import { sendMessageWithResultAsync } from "./db/message-send";
1
2
  // Generic egress MCP tool + relay_notify_ntfy shim (#777).
2
3
  //
3
4
  // relay_send_to_channel — resolves a registered channel agent by ID, builds a
@@ -15,7 +16,7 @@ import { channelOutputControl, changeChannelOutput } from "./channel-output-cont
15
16
  import { McpAuthError } from "./mcp-errors";
16
17
  import { isComponentAuthorizedFor, isIntegrationAllowed } from "./security";
17
18
  import { MAX_BODY_BYTES } from "./config";
18
- import { channelObligationAnsweredBy, getChannel, sendMessageWithResult, ValidationError } from "./db";
19
+ import { channelObligationAnsweredBy, getChannel, ValidationError } from "./db";
19
20
  import { validateChannelEnvelope } from "./routes/integrations";
20
21
  import { emitNewMessage } from "./sse";
21
22
  import { optionalEnum } from "./validation";
@@ -91,12 +92,12 @@ function egressBodyForEvent(event: Record<string, unknown>): string {
91
92
  return serialized;
92
93
  }
93
94
 
94
- function emitChannelEgress(
95
+ async function emitChannelEgress(
95
96
  channelId: string,
96
97
  event: Record<string, unknown>,
97
98
  callerId?: string,
98
99
  idempotencyKey?: string,
99
- ): { accepted: boolean; channelId: string; to: string } {
100
+ ): Promise<{ accepted: boolean; channelId: string; to: string }> {
100
101
  const channel = getChannel(channelId);
101
102
  if (!channel) throw new ValidationError(`channel ${channelId} not registered`);
102
103
  if (channel.direction === "inbound") {
@@ -123,7 +124,7 @@ function emitChannelEgress(
123
124
  // We DON'T route this through sendMessageService: that gate authorizes on message:send, but egress carries only channel:egress, so a component
124
125
  // token would 403; the raw path preserves the channel:egress scope model.
125
126
  const answeredObligation = callerId ? channelObligationAnsweredBy(callerId, channel.agentId) : null;
126
- const { message, created } = sendMessageWithResult({
127
+ const { message, created } = (await sendMessageWithResultAsync({
127
128
  from: callerId ?? "system",
128
129
  to: channel.agentId,
129
130
  kind: "channel.event",
@@ -132,19 +133,19 @@ function emitChannelEgress(
132
133
  replyExpected: false,
133
134
  ...(idempotencyKey ? { idempotencyKey } : {}),
134
135
  ...(answeredObligation !== null ? { replyTo: answeredObligation } : {}),
135
- });
136
+ }));
136
137
  if (created) emitNewMessage(message);
137
138
  return { accepted: true, channelId, to: channel.agentId };
138
139
  }
139
140
 
140
- export function relayEgressToChannel(args: Record<string, unknown>, auth?: McpAuthContext, idempotencyKey?: string): { accepted: boolean; channelId: string; to: string } {
141
+ export async function relayEgressToChannel(args: Record<string, unknown>, auth?: McpAuthContext, idempotencyKey?: string): Promise<{ accepted: boolean; channelId: string; to: string }> {
141
142
  const channelId = stringField(args.channelId, "channelId", { required: true, max: 200 });
142
143
  const event = recordField(args.event, "event");
143
144
  const callerId = auth ? callerAgentId(auth) : undefined;
144
- return emitChannelEgress(channelId, event, callerId, idempotencyKey);
145
+ return (await emitChannelEgress(channelId, event, callerId, idempotencyKey));
145
146
  }
146
147
 
147
- export function relayNotifyNtfy(args: Record<string, unknown>, idempotencyKey?: string): { accepted: boolean; channelId: string } {
148
+ export async function relayNotifyNtfy(args: Record<string, unknown>, idempotencyKey?: string): Promise<{ accepted: boolean; channelId: string }> {
148
149
  const title = stringField(args.title, "title", { required: true, max: 200 });
149
150
  const body = stringField(args.body, "body", { required: true, maxBytes: MAX_BODY_BYTES });
150
151
  const priority = optionalEnum(args.priority, "priority", NTFY_PRIORITIES) as NtfyPriority | undefined;
@@ -154,7 +155,7 @@ export function relayNotifyNtfy(args: Record<string, unknown>, idempotencyKey?:
154
155
  if (priority !== undefined) event.priority = priority;
155
156
  if (tags?.length) event.tags = tags;
156
157
  if (click !== undefined) event.click = click;
157
- const result = emitChannelEgress(NTFY_CHANNEL_ID, event, undefined, idempotencyKey);
158
+ const result = (await emitChannelEgress(NTFY_CHANNEL_ID, event, undefined, idempotencyKey));
158
159
  return { accepted: result.accepted, channelId: result.channelId };
159
160
  }
160
161
 
@@ -86,7 +86,7 @@ function limitArg(value: unknown): number | undefined {
86
86
 
87
87
  export async function relayIssueActivityTool(_auth: IssueActivityToolAuth, name: string, args: Record<string, unknown>): Promise<Record<string, unknown>> {
88
88
  if (name === "relay_issue_activity_record") {
89
- const event = recordAndEmitIssueActivity({
89
+ const event = (await recordAndEmitIssueActivity({
90
90
  agentId: cleanString(args.agentId, "agentId", { required: true, max: 200 })!,
91
91
  action: actionArg(args.action),
92
92
  issueRefId: cleanString(args.issueRefId, "issueRefId", { max: 120 }),
@@ -97,7 +97,7 @@ export async function relayIssueActivityTool(_auth: IssueActivityToolAuth, name:
97
97
  title: cleanString(args.title, "title", { max: 200 }),
98
98
  body: cleanString(args.body, "body", { max: 1000 }),
99
99
  metadata: cleanMeta(args.metadata),
100
- });
100
+ }));
101
101
  return { event };
102
102
  }
103
103
  if (name === "relay_issue_activity_by_issue") {
@@ -83,9 +83,9 @@ function associationInput(args: Record<string, unknown>) {
83
83
  };
84
84
  }
85
85
 
86
- export function relayIssueAssociationTool(_auth: IssueAssociationToolAuth, name: string, args: Record<string, unknown>): Record<string, unknown> {
86
+ export async function relayIssueAssociationTool(_auth: IssueAssociationToolAuth, name: string, args: Record<string, unknown>): Promise<Record<string, unknown>> {
87
87
  if (!isRecord(args)) throw new ValidationError("arguments must be an object");
88
- if (name === "relay_issue_association_associate") return associateIssueRef(associationInput(args)) as unknown as Record<string, unknown>;
88
+ if (name === "relay_issue_association_associate") return (await associateIssueRef(associationInput(args))) as unknown as Record<string, unknown>;
89
89
  if (name === "relay_issue_association_list_issues_for_entity") {
90
90
  return {
91
91
  issues: listIssueRefsForEntity(
@@ -95,9 +95,9 @@ export function relayIssueAssociationTool(_auth: IssueAssociationToolAuth, name:
95
95
  };
96
96
  }
97
97
  if (name === "relay_issue_association_list_entities_for_issue") {
98
- const issueRef = resolveAssociationIssueRef(issueInput(args));
98
+ const issueRef = (await resolveAssociationIssueRef(issueInput(args)));
99
99
  return { issueRef, entities: listIssueEntities(issueRef.id) };
100
100
  }
101
- if (name === "relay_issue_association_remove") return removeIssueAssociation(associationInput(args));
101
+ if (name === "relay_issue_association_remove") return (await removeIssueAssociation(associationInput(args)));
102
102
  throw new ValidationError(`unknown tool: ${name}`);
103
103
  }
@@ -1,9 +1,10 @@
1
- import { deleteIssueRef, getIssueRef, getIssueRefByExternalKey, issueRefClosedCompleted, issueRefForRefString, listIssueRefs, resolveIssueRefByExternalKey, resolveIssueRefFromString, updateIssueRef, upsertIssueRef } from "./db/issue-refs";
1
+ import { getIssueRef, getIssueRefByExternalKey, issueRefClosedCompleted, issueRefForRefString } from "./db/issue-refs";
2
+ import { deleteIssueRefAsync, listIssueRefsAsync, resolveIssueRefByExternalKeyAsync, resolveIssueRefFromStringAsync, updateIssueRefAsync, upsertIssueRefAsync } from "./db/issue-refs-async";
2
3
  import { McpNotFoundError } from "./mcp-errors";
3
4
  import { cleanEnum, cleanString, optionalEnum } from "./validation";
4
5
  import { ISSUE_REF_CLOSE_REASONS, ISSUE_PROVIDERS, ISSUE_REF_STATUSES, isRecord, type IssueProvider, type IssueRef, type IssueRefCloseReason, type IssueRefStatus } from "./types";
5
6
  import { ValidationError } from "./db";
6
- import { advanceTerminalPlanRefs } from "./services/plan-terminal-refs";
7
+ import { advanceTerminalPlanRefsAsync } from "./services/plan-terminal-refs";
7
8
 
8
9
  export const ISSUE_REF_TOOLS = [
9
10
  {
@@ -126,11 +127,11 @@ function currentRefFor(args: Record<string, unknown>) {
126
127
  return null;
127
128
  }
128
129
 
129
- export function relayIssueRefTool(_auth: IssueRefToolAuth, name: string, args: Record<string, unknown>): Record<string, unknown> {
130
+ export async function relayIssueRefTool(_auth: IssueRefToolAuth, name: string, args: Record<string, unknown>): Promise<Record<string, unknown>> {
130
131
  if (!isRecord(args)) throw new ValidationError("arguments must be an object");
131
132
  if (name === "relay_issue_ref_upsert") {
132
133
  const before = currentRefFor(args);
133
- const issueRef = upsertIssueRef({
134
+ const issueRef = await upsertIssueRefAsync({
134
135
  provider: providerArg(args.provider),
135
136
  repo: cleanString(args.repo, "repo", { required: true, max: 500 })!,
136
137
  externalKey: cleanString(args.externalKey, "externalKey", { required: true, max: 240 })!,
@@ -141,7 +142,7 @@ export function relayIssueRefTool(_auth: IssueRefToolAuth, name: string, args: R
141
142
  statusSyncedAt: timestampArg(args.statusSyncedAt),
142
143
  });
143
144
  // #2520 — the cached ref flipped to a completed close: propagate to bound plan nodes.
144
- if (issueRefClosedCompleted(before, issueRef)) advanceTerminalPlanRefs({ issueRefId: issueRef.id, actor: _auth.actor });
145
+ if (issueRefClosedCompleted(before, issueRef)) await advanceTerminalPlanRefsAsync({ issueRefId: issueRef.id, actor: _auth.actor });
145
146
  return issueRef as unknown as Record<string, unknown>;
146
147
  }
147
148
  if (name === "relay_issue_ref_resolve") {
@@ -153,7 +154,7 @@ export function relayIssueRefTool(_auth: IssueRefToolAuth, name: string, args: R
153
154
  ? issueRefForRefString(ref, cleanString(args.defaultRepo ?? args.repo, "defaultRepo", { max: 500 }))
154
155
  : currentRefFor(args);
155
156
  const issueRef = (ref
156
- ? resolveIssueRefFromString({
157
+ ? await resolveIssueRefFromStringAsync({
157
158
  ref,
158
159
  defaultRepo: cleanString(args.defaultRepo ?? args.repo, "defaultRepo", { max: 500 }),
159
160
  provider: optionalEnum(args.provider, "provider", ISSUE_PROVIDERS, "github") as IssueProvider,
@@ -162,7 +163,7 @@ export function relayIssueRefTool(_auth: IssueRefToolAuth, name: string, args: R
162
163
  closeReason: closeReasonArg(args.closeReason),
163
164
  statusSyncedAt: timestampArg(args.statusSyncedAt),
164
165
  })
165
- : resolveIssueRefByExternalKey({
166
+ : await resolveIssueRefByExternalKeyAsync({
166
167
  provider: providerArg(args.provider),
167
168
  repo: cleanString(args.repo, "repo", { required: true, max: 500 })!,
168
169
  externalKey: cleanString(args.externalKey, "externalKey", { required: true, max: 240 })!,
@@ -172,7 +173,7 @@ export function relayIssueRefTool(_auth: IssueRefToolAuth, name: string, args: R
172
173
  closeReason: closeReasonArg(args.closeReason),
173
174
  statusSyncedAt: timestampArg(args.statusSyncedAt),
174
175
  })) as unknown as IssueRef;
175
- if (issueRefClosedCompleted(before, issueRef)) advanceTerminalPlanRefs({ issueRefId: issueRef.id, actor: _auth.actor });
176
+ if (issueRefClosedCompleted(before, issueRef)) await advanceTerminalPlanRefsAsync({ issueRefId: issueRef.id, actor: _auth.actor });
176
177
  return issueRef as unknown as Record<string, unknown>;
177
178
  }
178
179
  if (name === "relay_issue_ref_get") {
@@ -182,7 +183,7 @@ export function relayIssueRefTool(_auth: IssueRefToolAuth, name: string, args: R
182
183
  }
183
184
  if (name === "relay_issue_ref_list") {
184
185
  return {
185
- issueRefs: listIssueRefs({
186
+ issueRefs: await listIssueRefsAsync({
186
187
  provider: optionalEnum(args.provider, "provider", ISSUE_PROVIDERS) as IssueProvider | undefined,
187
188
  repo: cleanString(args.repo, "repo", { max: 500 }),
188
189
  status: statusArg(args.status),
@@ -192,7 +193,7 @@ export function relayIssueRefTool(_auth: IssueRefToolAuth, name: string, args: R
192
193
  }
193
194
  if (name === "relay_issue_ref_update") {
194
195
  const before = currentRefFor(args);
195
- const issueRef = updateIssueRef(cleanString(args.id, "id", { required: true, max: 120 })!, {
196
+ const issueRef = await updateIssueRefAsync(cleanString(args.id, "id", { required: true, max: 120 })!, {
196
197
  url: cleanString(args.url, "url", { max: 2000 }),
197
198
  title: cleanString(args.title, "title", { max: 500 }),
198
199
  status: statusArg(args.status),
@@ -201,11 +202,11 @@ export function relayIssueRefTool(_auth: IssueRefToolAuth, name: string, args: R
201
202
  });
202
203
  if (!issueRef) throw new McpNotFoundError("issue ref not found");
203
204
  // #2520 — the cached ref flipped to a completed close: propagate to bound plan nodes.
204
- if (issueRefClosedCompleted(before, issueRef)) advanceTerminalPlanRefs({ issueRefId: issueRef.id, actor: _auth.actor });
205
+ if (issueRefClosedCompleted(before, issueRef)) await advanceTerminalPlanRefsAsync({ issueRefId: issueRef.id, actor: _auth.actor });
205
206
  return { issueRef };
206
207
  }
207
208
  if (name === "relay_issue_ref_delete") {
208
- const deleted = deleteIssueRef(cleanString(args.id, "id", { required: true, max: 120 })!);
209
+ const deleted = await deleteIssueRefAsync(cleanString(args.id, "id", { required: true, max: 120 })!);
209
210
  if (!deleted) throw new McpNotFoundError("issue ref not found");
210
211
  return { deleted };
211
212
  }