@humwick/server 0.130.1 → 0.130.2

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 (437) hide show
  1. package/README.md +5 -0
  2. package/docs/guides/tools-administration.md +4 -0
  3. package/docs/guides/tools-coordination.md +1 -0
  4. package/docs/guides/tools-tasks.md +8 -0
  5. package/docs/guides/workflows.md +58 -0
  6. package/docs/openapi.json +414 -1
  7. package/package.json +8 -17
  8. package/public/assets/{MessageBubble-BWpoBjl4.js → MessageBubble-BWLqMGKG.js} +2 -2
  9. package/public/assets/{PlanGraphPanel-C0auck3n.js → PlanGraphPanel-3TlIQpjk.js} +2 -2
  10. package/public/assets/{TraceView-DBnOx7AQ.js → TraceView-Wimm0Czv.js} +2 -2
  11. package/public/assets/{VaultDecisionCard-0kp2oNBC.js → VaultDecisionCard-Bau_vNax.js} +2 -2
  12. package/public/assets/{activity-yLztXEBt.js → activity-CrSurn-r.js} +2 -2
  13. package/public/assets/{agent-lineage-BbJDR1dW.js → agent-lineage-CknAJKcb.js} +2 -2
  14. package/public/assets/agent-liveness-CaNwK0Zf.js +2 -0
  15. package/public/assets/{agent-name-CTZBrSD9.js → agent-name-DKbiIhBo.js} +2 -2
  16. package/public/assets/agent-profiles-DwF6EQ4R.js +2 -0
  17. package/public/assets/{agent-project-badge-9TqzUUYE.js → agent-project-badge-Diz4Sjjb.js} +2 -2
  18. package/public/assets/{agent-tools-D4n40pn8.js → agent-tools-CRhpRQza.js} +2 -2
  19. package/public/assets/{agent-type-icon-D6FUarOf.js → agent-type-icon-LrUEU3lB.js} +2 -2
  20. package/public/assets/{agents-BYDslkJc.js → agents-B-v66C-4.js} +2 -2
  21. package/public/assets/{analytics-B-XSbEMC.js → analytics-BqCb-LKi.js} +2 -2
  22. package/public/assets/{artifact-viewer-DdWIfV6M.js → artifact-viewer-kf4pGuAR.js} +2 -2
  23. package/public/assets/{artifacts-oBOqks-2.js → artifacts-D32zyw4Y.js} +2 -2
  24. package/public/assets/{artifacts-DPN1q4pA.js → artifacts-DJevXcvg.js} +2 -2
  25. package/public/assets/{automation-4KcRFXEu.js → automation-BpRajx_5.js} +2 -2
  26. package/public/assets/{backlog-Cw9xPTCF.js → backlog-D_UjTdzX.js} +2 -2
  27. package/public/assets/{busy-health-CTu32MZt.js → busy-health-N3VEh4ao.js} +2 -2
  28. package/public/assets/{channels-BiXzg1G9.js → channels-9jopungq.js} +2 -2
  29. package/public/assets/{chat-Ctk2qwvA.js → chat-CSXrTB3C.js} +2 -2
  30. package/public/assets/{code-preview-Bm1wWqAp.js → code-preview-p1NnmqK0.js} +2 -2
  31. package/public/assets/{connectors-C36ax4Vw.js → connectors-CZdqlDNL.js} +2 -2
  32. package/public/assets/{cosmos-Jj9LK2Wf.js → cosmos-BgdsE4dG.js} +2 -2
  33. package/public/assets/{crate-agent-H6S7-B9T.js → crate-agent-30aXTKva.js} +2 -2
  34. package/public/assets/{dependency-graph-Cd1E23wa.js → dependency-graph-B_jvw2GE.js} +2 -2
  35. package/public/assets/{deploys-Bwfq146q.js → deploys-DoN6bAb5.js} +2 -2
  36. package/public/assets/{display-CfO7rTuF.js → display-BrKWFGJz.js} +2 -2
  37. package/public/assets/{files-DhhZI2Ih.js → files-D6XEu8Ng.js} +2 -2
  38. package/public/assets/{fleet-B_rFEbnL.js → fleet-C7jQWbw2.js} +2 -2
  39. package/public/assets/{fleet-metrics-BkHP-P3R.js → fleet-metrics-BiDs3MLx.js} +2 -2
  40. package/public/assets/{formatted-body-Cm1RrzmN.js → formatted-body-CQBwc1fb.js} +3 -3
  41. package/public/assets/{formatted-body-impl-DQiOuOD1.js → formatted-body-impl-DyG0WsQS.js} +2 -2
  42. package/public/assets/{host-providers-dialog-CHqwXTov.js → host-providers-dialog-DKaW31dN.js} +2 -2
  43. package/public/assets/index-CRHep3M9.js +15 -0
  44. package/public/assets/index-MYAIwYTX.css +2 -0
  45. package/public/assets/{insights-fH1EL-qZ.js → insights-CzrtkpOE.js} +2 -2
  46. package/public/assets/{integrations-C5Oix6ng.js → integrations-aVsUmigt.js} +2 -2
  47. package/public/assets/{issue-ref-chip-ODyondIa.js → issue-ref-chip-BnSlM_95.js} +2 -2
  48. package/public/assets/{log-viewer-Cvfy6PW7.js → log-viewer-qe7Ee47Z.js} +2 -2
  49. package/public/assets/{maintenance-D8CDH5wZ.js → maintenance-NfjqFZAk.js} +2 -2
  50. package/public/assets/{managed-agents-egllbpij.js → managed-agents-BiH0HgaE.js} +2 -2
  51. package/public/assets/{markdown-preview-CYSFgVgK.js → markdown-preview-BixaT3Xr.js} +3 -3
  52. package/public/assets/{markdown-preview-impl-BteVIjX4.js → markdown-preview-impl-DNGlWIS3.js} +2 -2
  53. package/public/assets/{memory-C8WmXsyr.js → memory-DNsCl6UX.js} +2 -2
  54. package/public/assets/{messages-BzQdqlO6.js → messages-DopU1L1X.js} +2 -2
  55. package/public/assets/{orchestrators-B1HxzkNw.js → orchestrators-Cq7ckLQT.js} +2 -2
  56. package/public/assets/{overview-DCUnI4Z7.js → overview-C1DCTzzV.js} +2 -2
  57. package/public/assets/{pairs-ftCd2XcD.js → pairs-DE_m6rrE.js} +2 -2
  58. package/public/assets/{profile-icon-B2zH8DMH.js → profile-icon-B3rfh77F.js} +2 -2
  59. package/public/assets/project-profile-instructions-DQWZE0kA.js +2 -0
  60. package/public/assets/projects-Br2Bd2h1.js +2 -0
  61. package/public/assets/{prompt-settings-Bftq9czX.js → prompt-settings-BKvFsvGD.js} +2 -2
  62. package/public/assets/provider-display-DsuWMvVL.js +2 -0
  63. package/public/assets/{registry-DWCU5c8q.js → registry-Cw38_6gW.js} +2 -2
  64. package/public/assets/run-card-CpKqRbhg.js +2 -0
  65. package/public/assets/scroll-text-BKXS1ahr.js +2 -0
  66. package/public/assets/{secrets-C7GIUATz.js → secrets-DxI-vzSq.js} +2 -2
  67. package/public/assets/{service-access-settings-C3aujqTG.js → service-access-settings-D9s_VJbd.js} +2 -2
  68. package/public/assets/{settings-C6sZ9eBa.js → settings-CKZTVGIx.js} +2 -2
  69. package/public/assets/{shipping-Bu8p1gEw.js → shipping-B9YtnwtG.js} +2 -2
  70. package/public/assets/{stats-V9Z-GxUd.js → stats-DyUBKyWI.js} +2 -2
  71. package/public/assets/{status-dot-CVv0iGHL.js → status-dot-DYqlEUhJ.js} +2 -2
  72. package/public/assets/{store-BvtFdlGX.js → store-DcClXLH0.js} +3 -3
  73. package/public/assets/{tasks-CXU75HRF.js → tasks-Bh7Chr4-.js} +2 -2
  74. package/public/assets/{teams-BPf976zb.js → teams-bowI7qVY.js} +2 -2
  75. package/public/assets/{terminal-viewer-DE9BOe-8.js → terminal-viewer-BgVLHdsU.js} +3 -3
  76. package/public/assets/{terminal-viewer-impl-D04pjmGh.js → terminal-viewer-impl-Dz22UPy6.js} +2 -2
  77. package/public/assets/token-estimate-Co-Jdphh.js +2 -0
  78. package/public/assets/{use-agent-terminal-B1yR456R.js → use-agent-terminal-DSQQ-iY7.js} +2 -2
  79. package/public/assets/{use-decisions-D-S4tpDf.js → use-decisions-samMQhQf.js} +2 -2
  80. package/public/assets/use-project-list-59LheVP7.js +2 -0
  81. package/public/assets/{use-selectors-CnrAk2YP.js → use-selectors-BZa25xEB.js} +2 -2
  82. package/public/assets/{user-avatar-nBFIcR4M.js → user-avatar-DHxlvUvV.js} +2 -2
  83. package/public/assets/versioned-prompt-editor-BmED5DnJ.js +8 -0
  84. package/public/assets/{work-queue-TCjJxeT-.js → work-queue-CSvpuNLz.js} +2 -2
  85. package/public/assets/{workflow-marker-Cf3Hf2fN.js → workflow-marker-DAZcj5qt.js} +2 -2
  86. package/public/assets/{workflows-CXQX20Qj.js → workflows-DdmxRSyg.js} +2 -2
  87. package/public/assets/{workspaces-qSYzKYMA.js → workspaces-BxeKfVuF.js} +2 -2
  88. package/public/cosmos.html +4 -4
  89. package/public/index.html +31 -29
  90. package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
  91. package/runner/plugins/claude/hooks/gate-run-guard.provisioned.mjs +31 -1
  92. package/runner/src/adapters/claude-effort.ts +2 -4
  93. package/runner/src/adapters/codex-launch-config.ts +4 -5
  94. package/runner/src/adapters/codex.ts +1 -1
  95. package/runner/src/adapters/opencode-provider.ts +7 -22
  96. package/runner/src/adapters/opencode.ts +4 -4
  97. package/runner/src/agent-runner/credentials.ts +42 -12
  98. package/runner/src/agent-runner/inbox.ts +27 -0
  99. package/runner/src/agent-runner/lifecycle-milestones.ts +0 -2
  100. package/runner/src/bin/claude.ts +4 -0
  101. package/runner/src/bin/codex.ts +4 -0
  102. package/runner/src/bin/opencode.ts +4 -0
  103. package/runner/src/index.ts +5 -2
  104. package/runner/src/provider-setup.ts +34 -0
  105. package/runner/src/providers.ts +2 -1
  106. package/runner/src/runner-core.ts +18 -23
  107. package/runner/src/spawn-input.ts +2 -1
  108. package/runner/src/test-run-dedup.ts +59 -56
  109. package/scripts/cd-config.ts +8 -0
  110. package/scripts/gate-run-lease.ts +10 -7
  111. package/scripts/gate.sh +5 -1
  112. package/src/branch-land-notice.ts +93 -0
  113. package/src/branch-landed.ts +7 -76
  114. package/src/bus.ts +19 -20
  115. package/src/cd-deploy-notify.ts +30 -2
  116. package/src/cd-host-lag-notify.ts +7 -6
  117. package/src/ci/incidents.ts +2 -2
  118. package/src/ci/monitor.ts +5 -8
  119. package/src/ci/root-missing.ts +2 -7
  120. package/src/ci/transition-notify.ts +7 -39
  121. package/src/cli/cd-pauses.ts +19 -0
  122. package/src/cli/orchestrator.ts +1 -1
  123. package/src/cli/state.ts +2 -19
  124. package/src/cli/task-edit.ts +22 -0
  125. package/src/cli/task.ts +3 -1
  126. package/src/cli/workflow.ts +8 -2
  127. package/src/commands-db.ts +3 -3
  128. package/src/config-store-write.ts +13 -1
  129. package/src/config-store.ts +25 -14
  130. package/src/db/activity-async.ts +6 -1
  131. package/src/db/activity-write-ops.ts +12 -1
  132. package/src/db/activity.ts +1 -14
  133. package/src/db/agent-search.ts +1 -15
  134. package/src/db/agents-async.ts +52 -5
  135. package/src/db/agents-write-ops.ts +12 -3
  136. package/src/db/agents.ts +81 -54
  137. package/src/db/ci-incidents-async.ts +5 -5
  138. package/src/db/ci-incidents-write-ops.ts +2 -2
  139. package/src/db/command-row.ts +10 -2
  140. package/src/db/commands-list-query.ts +2 -0
  141. package/src/db/commands-spawn-read.ts +1 -1
  142. package/src/db/config-store-write-ops.ts +7 -2
  143. package/src/db/continuation-archives-async.ts +5 -0
  144. package/src/db/continuation-archives-write-ops.ts +7 -0
  145. package/src/db/continuations.ts +2 -2
  146. package/src/db/db-writer-worker.ts +8 -1
  147. package/src/db/deploy-events-async.ts +1 -0
  148. package/src/db/deploy-events-read-ops.ts +2 -1
  149. package/src/db/deploy-events.ts +35 -4
  150. package/src/db/hosts-registration.ts +10 -2
  151. package/src/db/hosts.ts +9 -6
  152. package/src/db/inbox.ts +0 -14
  153. package/src/db/index.ts +2 -0
  154. package/src/db/integrations-async.ts +8 -0
  155. package/src/db/integrations-ops.ts +15 -0
  156. package/src/db/integrations.ts +15 -21
  157. package/src/db/issue-lifecycle.ts +3 -4
  158. package/src/db/issue-refs-async.ts +20 -0
  159. package/src/db/issue-refs-write-ops.ts +29 -0
  160. package/src/db/issue-refs.ts +7 -8
  161. package/src/db/long-running-work.ts +2 -2
  162. package/src/db/main-connection-writes.ts +23 -2
  163. package/src/db/maintenance-job-reconcile.ts +61 -0
  164. package/src/db/maintenance-job-runs-async.ts +14 -0
  165. package/src/db/maintenance-job-write-ops.ts +9 -0
  166. package/src/db/mappers.ts +2 -14
  167. package/src/db/merge-lease.ts +1 -15
  168. package/src/db/migrations.ts +7 -15
  169. package/src/db/orchestrators.ts +4 -72
  170. package/src/db/pairs.ts +1 -13
  171. package/src/db/project-profile-instructions.ts +50 -0
  172. package/src/db/prompt-versions.ts +9 -2
  173. package/src/db/provider-config-history.ts +8 -3
  174. package/src/db/provider-model-seed.ts +34 -0
  175. package/src/db/read-op-marshaling-fixtures.ts +5 -0
  176. package/src/db/read-ops.ts +4 -0
  177. package/src/db/routing-policy.ts +2 -3
  178. package/src/db/schema.ts +9 -3
  179. package/src/db/spawn-delegation-state.ts +11 -4
  180. package/src/db/stats-async.ts +4 -3
  181. package/src/db/task-entity.ts +23 -2
  182. package/src/db/task-list.ts +3 -1
  183. package/src/db/tasks.ts +1 -17
  184. package/src/db/timer-ingress.ts +7 -1
  185. package/src/db/token-db-write-ops.ts +17 -0
  186. package/src/db/token-standing.ts +15 -11
  187. package/src/db/workflow-contact.ts +1 -1
  188. package/src/db/workflow-task-read-ops.ts +30 -0
  189. package/src/db/write-ops.ts +6 -0
  190. package/src/db/writer-gateway.ts +17 -11
  191. package/src/dispatch-availability.ts +10 -6
  192. package/src/ephemeral/{landing-ingress-proof-worker.ts → landing-ingress-proof.test-fixture.ts} +4 -2
  193. package/src/host/disk-alert.ts +121 -0
  194. package/src/lifecycle-manager.ts +3 -2
  195. package/src/maintenance/cd-watcher.ts +3 -3
  196. package/src/maintenance/critical-job-watchdog.ts +16 -17
  197. package/src/maintenance/index.ts +1 -0
  198. package/src/maintenance/jobs.ts +3 -2
  199. package/src/maintenance/scheduler.ts +84 -128
  200. package/src/maintenance/stalled-delivery-pager.ts +6 -5
  201. package/src/maintenance/workspaces.ts +1 -1
  202. package/src/managed-policy.ts +31 -27
  203. package/src/mcp/index.ts +5 -2
  204. package/src/mcp/output-descriptions.ts +8 -8
  205. package/src/mcp/presentation.ts +4 -4
  206. package/src/mcp/project-profile-instructions.ts +32 -0
  207. package/src/mcp/tool-groups.ts +1 -1
  208. package/src/mcp/tools-spawn.ts +4 -3
  209. package/src/mcp-agent-action.ts +1 -2
  210. package/src/mcp-issue-ref-tools.ts +12 -11
  211. package/src/mcp-maintenance-tools.ts +2 -2
  212. package/src/mcp-profile-trust-tools.ts +4 -4
  213. package/src/mcp-provider-catalog.ts +2 -2
  214. package/src/mcp-task-tools.ts +11 -5
  215. package/src/mcp-team-template-tools.ts +3 -3
  216. package/src/mcp-workflow-tools.ts +10 -3
  217. package/src/notification-types.ts +2 -1
  218. package/src/operator-alarm.ts +26 -11
  219. package/src/project-instructions.ts +4 -0
  220. package/src/project-profile-instruction-text.ts +6 -0
  221. package/src/project-profile-instructions.ts +20 -0
  222. package/src/provider-catalog-store.ts +3 -49
  223. package/src/provider-config-store.ts +12 -11
  224. package/src/provider-model-seed.ts +1 -18
  225. package/src/provider-quota-config-store.ts +5 -4
  226. package/src/provider-secrets.test-fixture.ts +3 -3
  227. package/src/recipe-runner.ts +2 -2
  228. package/src/repo-config-source.ts +10 -4
  229. package/src/routes/agent-profiles.ts +6 -6
  230. package/src/routes/agents-spawn.ts +1 -1
  231. package/src/routes/agents.ts +6 -6
  232. package/src/routes/commands-listing.ts +4 -0
  233. package/src/routes/commands.ts +2 -2
  234. package/src/routes/continuation-archives.ts +2 -2
  235. package/src/routes/index.ts +10 -1
  236. package/src/routes/integrations.ts +24 -50
  237. package/src/routes/issue-refs.ts +7 -7
  238. package/src/routes/orchestrator-bootstrap.ts +1 -1
  239. package/src/routes/orchestrator-host-registration.ts +2 -2
  240. package/src/routes/orchestrator-host-utilization.ts +3 -1
  241. package/src/routes/orchestrator-proxy.ts +2 -2
  242. package/src/routes/orchestrator.ts +2 -2
  243. package/src/routes/project-profile-instructions.ts +27 -0
  244. package/src/routes/project-trust.ts +2 -2
  245. package/src/routes/provider-config.ts +6 -6
  246. package/src/routes/provider-quota-config.ts +2 -2
  247. package/src/routes/settings.ts +5 -5
  248. package/src/routes/stats.ts +6 -6
  249. package/src/routes/task-http.ts +15 -1
  250. package/src/routes/task-issues.ts +11 -26
  251. package/src/routes/tasks.ts +22 -53
  252. package/src/routes/team-templates.ts +5 -5
  253. package/src/routes/teams-config.ts +2 -2
  254. package/src/routes/tokens.ts +12 -5
  255. package/src/routes/workflows.ts +20 -5
  256. package/src/routing-policy-normalize.ts +1 -2
  257. package/src/routing-step-defaults.ts +0 -2
  258. package/src/runner-token-mint-limit.ts +63 -0
  259. package/src/runtime-grant.ts +4 -2
  260. package/src/runtime-tokens.ts +39 -7
  261. package/src/security.ts +13 -20
  262. package/src/server-background.ts +1 -1
  263. package/src/server.ts +5 -2
  264. package/src/services/host-utilization.ts +23 -0
  265. package/src/services/idle-epics.ts +5 -6
  266. package/src/services/issue-lifecycle.ts +57 -61
  267. package/src/services/issue-refs.ts +9 -13
  268. package/src/services/kernel-timers-cutover-chaos-worker.ts +10 -7
  269. package/src/services/kernel-timers-ingress.ts +1 -1
  270. package/src/services/landed-ancestry.ts +19 -3
  271. package/src/services/memory-areas.ts +15 -51
  272. package/src/services/plan-ci-notice.ts +57 -0
  273. package/src/services/plan-ci-recovery.ts +2 -55
  274. package/src/services/plan-wake-digest.ts +1 -0
  275. package/src/services/profile-trust.ts +4 -3
  276. package/src/services/project-config-read.ts +70 -0
  277. package/src/services/project-profile-instructions.ts +54 -0
  278. package/src/services/provisioning-harness/budget-baseline.json +4 -4
  279. package/src/services/restart-spawn.ts +61 -49
  280. package/src/services/self-care-state.ts +2 -1
  281. package/src/services/self-effort.ts +5 -5
  282. package/src/services/send-message.ts +5 -1
  283. package/src/services/spawn-agent.ts +13 -2
  284. package/src/services/spawn-chain-inspector.ts +6 -13
  285. package/src/services/spawn-policy.ts +68 -0
  286. package/src/services/spawn-tree-cleanup.ts +2 -2
  287. package/src/services/task-dispatch.ts +3 -0
  288. package/src/services/task-state-reconcile.ts +6 -14
  289. package/src/services/team-templates.ts +9 -8
  290. package/src/services/transient-agent-reaper.ts +3 -1
  291. package/src/services/workflow-auto-start.ts +25 -13
  292. package/src/services/workflow-ci-main.ts +1 -1
  293. package/src/services/workflow-deferred-cleanup.ts +4 -2
  294. package/src/services/workflow-effect-driver.ts +2 -0
  295. package/src/services/workflow-effects.ts +18 -11
  296. package/src/services/workflow-land-notice.ts +10 -0
  297. package/src/services/workflow-pause-text.ts +43 -0
  298. package/src/services/workflow-reconcile.ts +13 -11
  299. package/src/services/workflow-run-view.ts +2 -0
  300. package/src/services/workflow-runs.ts +29 -13
  301. package/src/services/workflow-supervisor-state.ts +5 -0
  302. package/src/services/workflow-supervisor.ts +7 -3
  303. package/src/settings/registry.ts +1 -2
  304. package/src/spawn-command.ts +4 -4
  305. package/src/spawn-models.ts +10 -12
  306. package/src/spawn-placement.ts +1 -1
  307. package/src/spawn-targets.ts +1 -1
  308. package/src/startup-context-injection.ts +1 -0
  309. package/src/state-adoption/cd-cutover.ts +53 -7
  310. package/src/state-adoption/fleet-cutover.ts +35 -0
  311. package/src/state-adoption/fleet-plan.ts +36 -0
  312. package/src/state-adoption/index.ts +2 -2
  313. package/src/state-adoption/linux-plan.ts +2 -2
  314. package/src/state-adoption/linux.ts +2 -2
  315. package/src/state-adoption/macos-plan.ts +2 -2
  316. package/src/state-adoption/macos.ts +1 -1
  317. package/src/steward.ts +7 -6
  318. package/src/task-dispatch-live.ts +1 -1
  319. package/src/task-dispatcher.ts +1 -1
  320. package/src/teams-config-store.ts +4 -3
  321. package/src/token-db-write.ts +10 -0
  322. package/src/workspace-command-settle.ts +2 -1
  323. package/src/workspace-steward-wake.ts +2 -2
  324. package/node_modules/@humwick/kernel/LICENSE +0 -167
  325. package/node_modules/@humwick/kernel/async-entity-persistence.ts +0 -344
  326. package/node_modules/@humwick/kernel/async-event-log.ts +0 -107
  327. package/node_modules/@humwick/kernel/automations.pilot.ts +0 -147
  328. package/node_modules/@humwick/kernel/config.ts +0 -111
  329. package/node_modules/@humwick/kernel/contract.ts +0 -572
  330. package/node_modules/@humwick/kernel/control-authz.ts +0 -281
  331. package/node_modules/@humwick/kernel/control.ts +0 -645
  332. package/node_modules/@humwick/kernel/effects.ts +0 -493
  333. package/node_modules/@humwick/kernel/event-log.ts +0 -319
  334. package/node_modules/@humwick/kernel/http-transport.ts +0 -384
  335. package/node_modules/@humwick/kernel/identity-grammar.ts +0 -20
  336. package/node_modules/@humwick/kernel/identity.ts +0 -248
  337. package/node_modules/@humwick/kernel/index.ts +0 -28
  338. package/node_modules/@humwick/kernel/kernel-persistence.ts +0 -181
  339. package/node_modules/@humwick/kernel/landing-incident.ts +0 -306
  340. package/node_modules/@humwick/kernel/landing.ts +0 -953
  341. package/node_modules/@humwick/kernel/manifest-validation.ts +0 -460
  342. package/node_modules/@humwick/kernel/mcp-transport.ts +0 -109
  343. package/node_modules/@humwick/kernel/message-authority-chaos-worker.ts +0 -200
  344. package/node_modules/@humwick/kernel/message-authority.ts +0 -281
  345. package/node_modules/@humwick/kernel/module-host.ts +0 -722
  346. package/node_modules/@humwick/kernel/openapi-init.ts +0 -14
  347. package/node_modules/@humwick/kernel/package.json +0 -39
  348. package/node_modules/@humwick/kernel/persistence-schema.ts +0 -248
  349. package/node_modules/@humwick/kernel/persistence.ts +0 -510
  350. package/node_modules/@humwick/kernel/registry.ts +0 -60
  351. package/node_modules/@humwick/kernel/sqlite-kernel-persistence.ts +0 -499
  352. package/node_modules/@humwick/kernel/sqlite-module-host.ts +0 -87
  353. package/node_modules/@humwick/kernel/timers-chaos-worker.ts +0 -186
  354. package/node_modules/@humwick/kernel/timers.pilot.ts +0 -1411
  355. package/node_modules/@humwick/kernel/workflow-activation.ts +0 -25
  356. package/node_modules/@humwick/kernel/workflow-backstop.ts +0 -40
  357. package/node_modules/@humwick/kernel/workflow-cancel-tree.ts +0 -20
  358. package/node_modules/@humwick/kernel/workflow-chaos-worker.ts +0 -213
  359. package/node_modules/@humwick/kernel/workflow-composition.ts +0 -231
  360. package/node_modules/@humwick/kernel/workflow-container.ts +0 -72
  361. package/node_modules/@humwick/kernel/workflow-control.test-fixture.ts +0 -42
  362. package/node_modules/@humwick/kernel/workflow-control.ts +0 -178
  363. package/node_modules/@humwick/kernel/workflow-definition.ts +0 -507
  364. package/node_modules/@humwick/kernel/workflow-dispatch.ts +0 -60
  365. package/node_modules/@humwick/kernel/workflow-foreach.ts +0 -167
  366. package/node_modules/@humwick/kernel/workflow-journal-codec.ts +0 -339
  367. package/node_modules/@humwick/kernel/workflow-journal.ts +0 -922
  368. package/node_modules/@humwick/kernel/workflow-lane.ts +0 -48
  369. package/node_modules/@humwick/kernel/workflow-lease-owner.ts +0 -60
  370. package/node_modules/@humwick/kernel/workflow-recovery.test-fixture.ts +0 -19
  371. package/node_modules/@humwick/kernel/workflow-runtime.ts +0 -938
  372. package/node_modules/@humwick/kernel/workflow-script.ts +0 -11
  373. package/node_modules/@humwick/kernel/workflow-state.ts +0 -299
  374. package/node_modules/@humwick/kernel/workflow-step-commit.ts +0 -195
  375. package/node_modules/@humwick/kernel/workflow-transitions.ts +0 -317
  376. package/node_modules/@humwick/kernel/workflow-values.ts +0 -153
  377. package/node_modules/@humwick/kernel/workflow.pilot.ts +0 -376
  378. package/node_modules/@humwick/offload/LICENSE +0 -167
  379. package/node_modules/@humwick/offload/README.md +0 -57
  380. package/node_modules/@humwick/offload/dist/async-runner.d.ts +0 -18
  381. package/node_modules/@humwick/offload/dist/async-runner.d.ts.map +0 -1
  382. package/node_modules/@humwick/offload/dist/async-runner.js +0 -158
  383. package/node_modules/@humwick/offload/dist/async-runner.js.map +0 -1
  384. package/node_modules/@humwick/offload/dist/envelope.d.ts +0 -25
  385. package/node_modules/@humwick/offload/dist/envelope.d.ts.map +0 -1
  386. package/node_modules/@humwick/offload/dist/envelope.js +0 -80
  387. package/node_modules/@humwick/offload/dist/envelope.js.map +0 -1
  388. package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts +0 -10
  389. package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts.map +0 -1
  390. package/node_modules/@humwick/offload/dist/fixtures/worker-task.js +0 -59
  391. package/node_modules/@humwick/offload/dist/fixtures/worker-task.js.map +0 -1
  392. package/node_modules/@humwick/offload/dist/index.d.ts +0 -5
  393. package/node_modules/@humwick/offload/dist/index.d.ts.map +0 -1
  394. package/node_modules/@humwick/offload/dist/index.js +0 -5
  395. package/node_modules/@humwick/offload/dist/index.js.map +0 -1
  396. package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts +0 -62
  397. package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts.map +0 -1
  398. package/node_modules/@humwick/offload/dist/subprocess-runner.js +0 -295
  399. package/node_modules/@humwick/offload/dist/subprocess-runner.js.map +0 -1
  400. package/node_modules/@humwick/offload/dist/types.d.ts +0 -111
  401. package/node_modules/@humwick/offload/dist/types.d.ts.map +0 -1
  402. package/node_modules/@humwick/offload/dist/types.js +0 -176
  403. package/node_modules/@humwick/offload/dist/types.js.map +0 -1
  404. package/node_modules/@humwick/offload/dist/worker-pool.d.ts +0 -23
  405. package/node_modules/@humwick/offload/dist/worker-pool.d.ts.map +0 -1
  406. package/node_modules/@humwick/offload/dist/worker-pool.js +0 -435
  407. package/node_modules/@humwick/offload/dist/worker-pool.js.map +0 -1
  408. package/node_modules/@humwick/offload/dist/worker-runtime.d.ts +0 -2
  409. package/node_modules/@humwick/offload/dist/worker-runtime.d.ts.map +0 -1
  410. package/node_modules/@humwick/offload/dist/worker-runtime.js +0 -27
  411. package/node_modules/@humwick/offload/dist/worker-runtime.js.map +0 -1
  412. package/node_modules/@humwick/offload/dist/worker.d.ts +0 -5
  413. package/node_modules/@humwick/offload/dist/worker.d.ts.map +0 -1
  414. package/node_modules/@humwick/offload/dist/worker.js +0 -1
  415. package/node_modules/@humwick/offload/dist/worker.js.map +0 -1
  416. package/node_modules/@humwick/offload/package.json +0 -42
  417. package/node_modules/@humwick/offload/src/async-runner.ts +0 -170
  418. package/node_modules/@humwick/offload/src/envelope.ts +0 -92
  419. package/node_modules/@humwick/offload/src/fixtures/worker-task.ts +0 -49
  420. package/node_modules/@humwick/offload/src/index.ts +0 -4
  421. package/node_modules/@humwick/offload/src/subprocess-runner.ts +0 -334
  422. package/node_modules/@humwick/offload/src/types.ts +0 -235
  423. package/node_modules/@humwick/offload/src/worker-pool.ts +0 -463
  424. package/node_modules/@humwick/offload/src/worker-runtime.ts +0 -32
  425. package/node_modules/@humwick/offload/src/worker.ts +0 -5
  426. package/public/assets/agent-liveness-DyqxfB-t.js +0 -2
  427. package/public/assets/agent-profiles-BpI_jTxq.js +0 -2
  428. package/public/assets/index-B7ZerHLY.css +0 -2
  429. package/public/assets/index-BU3uWo2t.js +0 -15
  430. package/public/assets/projects-B_lmcqfO.js +0 -2
  431. package/public/assets/provider-display-DbLWpP3j.js +0 -2
  432. package/public/assets/run-card-CO_bguQf.js +0 -2
  433. package/public/assets/use-project-list-B-T2Bnnn.js +0 -2
  434. package/public/assets/versioned-prompt-editor-Diu8BIaM.js +0 -8
  435. package/runner/src/gate-run-lease-probe.ts +0 -38
  436. package/src/db/claude-catalog-reconcile.ts +0 -27
  437. package/src/routing-model-aliases.ts +0 -21
@@ -1,6 +1,6 @@
1
1
  // Auto-split from routes.ts (#299). Domain: orchestrator-proxy.
2
2
  import { RELAY_TOKEN_HEADER, SPAWN_PROVIDERS, isRecord } from "@humwick/sdk";
3
- import { ValidationError, getOrchestrator, orchestratorHeartbeat } from "../db";
3
+ import { ValidationError, getOrchestrator, orchestratorHeartbeatAsync } from "../db";
4
4
  import { authorizeRoute, cleanJsonArray, error, json, type Handler } from "./_shared";
5
5
  import { cleanStringArray } from "../validation";
6
6
  import { emitOrchestratorStatus } from "../sse";
@@ -136,7 +136,7 @@ export const getOrchestratorProviders: Handler = async (req, params) => {
136
136
  }
137
137
  }
138
138
  }
139
- const updated = orchestratorHeartbeat(params.id!, {
139
+ const updated = await orchestratorHeartbeatAsync(params.id!, {
140
140
  providers,
141
141
  providerStatus: cleanJsonArray(payload.providerStatus, "providerStatus") as OrchestratorRuntimeInput["providerStatus"],
142
142
  providerCatalog: cleanJsonArray(payload.providerCatalog, "providerCatalog") as OrchestratorRuntimeInput["providerCatalog"],
@@ -6,7 +6,7 @@ import { CONTRACT_VERSIONS, parseRuntimeCapabilities, parseRuntimeContracts, par
6
6
  import { notifyAgentOffline, notifyAgentSpawnQueued } from "../agent-lifecycle-events";
7
7
  import { diagnoseReportedExit } from "../services/reported-exit-death";
8
8
  import { VERSION } from "../config";
9
- import { ValidationError, deleteOrchestrator, effectiveProviderCatalogListAsync, getAgent, getOrchestrator, getOrchestratorAsync, listOrchestrators, listOrchestratorsAsync, orchestratorHeartbeat, orchestratorHeartbeatAsync, recordAgentExitDiagnosticsAsync, reportOrchestratorRosterAsync, setOrchestratorUpgradeState, upsertOrchestratorAsync } from "../db";
9
+ import { ValidationError, deleteOrchestrator, effectiveProviderCatalogListAsync, getAgent, getOrchestrator, getOrchestratorAsync, listOrchestrators, listOrchestratorsAsync, orchestratorHeartbeatAsync, recordAgentExitDiagnosticsAsync, reportOrchestratorRosterAsync, setOrchestratorUpgradeStateAsync, upsertOrchestratorAsync } from "../db";
10
10
  import { reconcileOrchestratorSchedulerCommands } from "../services/scheduler-recovery.ts";
11
11
  import { recoverRegisteredOrchestrator } from "../services/orchestrator-registration-recovery";
12
12
  import { recoverOrchestratorLegacyLandings } from "../services/orchestrator-landing-recovery";
@@ -624,7 +624,7 @@ export const postOrchestratorAction: Handler = async (req, params) => {
624
624
  ...(mode === "git-checkout" ? { mode, commitSha, repoUrl } : (npmReuseRepoUrl ? { repoUrl: npmReuseRepoUrl } : {})),
625
625
  },
626
626
  });
627
- setOrchestratorUpgradeState(orch.id, {
627
+ await setOrchestratorUpgradeStateAsync(orch.id, {
628
628
  desiredVersion: targetVersion, ...(mode === "git-checkout" && commitSha ? { targetGitSha: commitSha } : {}),
629
629
  status: "pending",
630
630
  commandId: command.id,
@@ -0,0 +1,27 @@
1
+ import { cleanString } from "../validation";
2
+ import { ValidationError } from "../db/connection";
3
+ import { authorizeRoute, error, json, parseBody, type Handler } from "./_shared";
4
+ import { authContextFromRequest } from "../services/auth-context";
5
+ import { PromptVersionConflictError } from "../prompt-version-errors";
6
+ import { listProjectProfileInstructions, mutateProjectProfileInstructions, projectProfileInstructionHistory, readProjectProfileInstructions } from "../services/project-profile-instructions";
7
+
8
+ export const projectProfileInstructionsRoute: Handler = async (req, params) => {
9
+ const denied = authorizeRoute(req, { scope: req.method === "GET" ? "agent:read" : "agent:write" });
10
+ if (denied) return denied;
11
+ try {
12
+ const projectId = cleanString(params.id, "projectId", { max: 200 });
13
+ const profile = cleanString(params.profile ?? params.name, "profile", { max: 200 });
14
+ if (!projectId || !profile) return json(await listProjectProfileInstructions({ projectId, profile }));
15
+ const path = new URL(req.url).pathname;
16
+ if (req.method === "GET") return json(path.endsWith("/history")
17
+ ? await projectProfileInstructionHistory(projectId, profile)
18
+ : await readProjectProfileInstructions(projectId, profile));
19
+ const body = await parseBody<unknown>(req);
20
+ if (!body.ok) return error(body.error, body.status);
21
+ return json(await mutateProjectProfileInstructions(authContextFromRequest(req), projectId, profile, body.body, path.endsWith("/restore")));
22
+ } catch (err) {
23
+ if (err instanceof PromptVersionConflictError) return json({ error: err.message, current: err.current }, 409);
24
+ if (err instanceof ValidationError) return error(err.message, /not found/.test(err.message) ? 404 : 400);
25
+ throw err;
26
+ }
27
+ };
@@ -5,7 +5,7 @@
5
5
  // code runs, and built-in profiles are admin-edited anyway.
6
6
  import { isRecord } from "@humwick/sdk";
7
7
  import { ValidationError } from "../db";
8
- import { approveProfileProjectTrust, PROJECT_REVIEW_MODES, PROJECT_TRUST_CAPABILITIES, updateProfileProjectTrust } from "../services/profile-trust";
8
+ import { approveProfileProjectTrust, PROJECT_REVIEW_MODES, PROJECT_TRUST_CAPABILITIES, updateProfileProjectTrustAsync } from "../services/profile-trust";
9
9
  import { cleanString, optionalEnum } from "../validation";
10
10
  import { auditEvent, error, isAdminRequest, json, normalizeConfigPathParam, parseBody, requestUserAddress, type Handler } from "./_shared";
11
11
  import { getAgentProfile } from "../config-store";
@@ -57,7 +57,7 @@ export const patchProjectTrustRoute: Handler = async (req, params) => {
57
57
  if (body.ack !== undefined && !Array.isArray(body.ack)) return error("ack must be an array of hooks|mcp", 400);
58
58
  const ack = (body.ack as unknown[] | undefined)?.map((capability) => optionalEnum(capability, "ack", PROJECT_TRUST_CAPABILITIES)!);
59
59
  const by = requestUserAddress(req);
60
- const saved = updateProfileProjectTrust(name, { ...(review ? { review } : {}), ...(ack ? { ack } : {}) }, by);
60
+ const saved = await updateProfileProjectTrustAsync(name, { ...(review ? { review } : {}), ...(ack ? { ack } : {}) }, by);
61
61
  await auditEvent({
62
62
  kind: "state",
63
63
  title: `Project trust updated: ${saved.value.name}`,
@@ -6,7 +6,7 @@ import { cleanString, cleanStringArray, optionalEnum } from "../validation";
6
6
  import { getCommand } from "../commands-db";
7
7
  import { deleteCommandAsync } from "../commands-write";
8
8
  import { emitCommand, error, json, parseBody, type Handler } from "./_shared";
9
- import { getProviderConfigEntry, listProviderConfigEntries, migrateLocalProviderConfigs, providerConfigPublic, setProviderConfig, VALID_PROVIDER_CONFIGS } from "../provider-config-store";
9
+ import { getProviderConfigEntry, listProviderConfigEntries, migrateLocalProviderConfigsAsync, providerConfigPublic, setProviderConfigAsync, VALID_PROVIDER_CONFIGS } from "../provider-config-store";
10
10
  import { cleanProviderModelLimits } from "../provider-catalog-store";
11
11
  import { emitConfigChanged } from "../sse";
12
12
  import { setConfigAsync } from "../config-store-write";
@@ -28,9 +28,9 @@ export const getProvidersRoute: Handler = async () => {
28
28
  });
29
29
  };
30
30
 
31
- export const getProviderConfigsRoute: Handler = (req) => {
31
+ export const getProviderConfigsRoute: Handler = async (req) => {
32
32
  const host = new URL(req.url).searchParams.get("host") ?? undefined;
33
- migrateLocalProviderConfigs();
33
+ await migrateLocalProviderConfigsAsync();
34
34
  const entries = listProviderConfigEntries(host);
35
35
  return json(Object.fromEntries(VALID_PROVIDER_CONFIGS.map((provider) => {
36
36
  return [provider, providerConfigPublic(entries[provider] ?? getProviderConfigEntry(provider, host))];
@@ -127,12 +127,12 @@ export const deleteProviderModelRoute: Handler = async (_req, params) => {
127
127
  }
128
128
  };
129
129
 
130
- export const getProviderConfigRoute: Handler = (_req, params) => {
130
+ export const getProviderConfigRoute: Handler = async (_req, params) => {
131
131
  const provider = optionalEnum(params.provider, "provider", VALID_PROVIDER_CONFIGS);
132
132
  if (!provider) return error("provider required");
133
133
  const host = new URL(_req.url).searchParams.get("host") ?? undefined;
134
134
  const includeSecrets = new URL(_req.url).searchParams.get("includeSecrets") === "1";
135
- migrateLocalProviderConfigs();
135
+ await migrateLocalProviderConfigsAsync();
136
136
  return json(providerConfigPublic(getProviderConfigEntry(provider, host), { maskEnv: !includeSecrets }));
137
137
  };
138
138
 
@@ -145,7 +145,7 @@ export const putProviderConfigRoute: Handler = async (req, params) => {
145
145
  if (!isRecord(parsed.body)) return error("provider config body must be an object");
146
146
  const host = new URL(req.url).searchParams.get("host") ?? undefined;
147
147
  const updatedBy = cleanString(parsed.body.updatedBy, "updatedBy", { max: 200 });
148
- const entry = setProviderConfig(provider, parsed.body, { host, updatedBy });
148
+ const entry = await setProviderConfigAsync(provider, parsed.body, { host, updatedBy });
149
149
  emitConfigChanged(entry.namespace, entry.key, entry.version);
150
150
  return json(providerConfigPublic(entry), entry.version === 1 ? 201 : 200);
151
151
  } catch (e) {
@@ -8,7 +8,7 @@ import { error, json, parseBody, type Handler } from "./_shared";
8
8
  import {
9
9
  getProviderQuotaConfig,
10
10
  listProviderQuotaConfigs,
11
- setProviderQuotaConfig,
11
+ setProviderQuotaConfigAsync,
12
12
  VALID_QUOTA_CONFIG_PROVIDERS,
13
13
  } from "../provider-quota-config-store";
14
14
  import { cleanString, optionalEnum } from "../validation";
@@ -40,7 +40,7 @@ export const putProviderQuotaConfigRoute: Handler = async (req, params) => {
40
40
  if (!parsed.ok) return error(parsed.error, parsed.status);
41
41
  try {
42
42
  const updatedBy = isRecord(parsed.body) ? cleanString(parsed.body.updatedBy, "updatedBy", { max: 200 }) : undefined;
43
- return json(setProviderQuotaConfig(provider, parsed.body, { updatedBy }));
43
+ return json(await setProviderQuotaConfigAsync(provider, parsed.body, { updatedBy }));
44
44
  } catch (e) {
45
45
  if (e instanceof ValidationError) return error(e.message, 400);
46
46
  throw e;
@@ -4,7 +4,7 @@ import { ValidationError } from "../db";
4
4
  import { getConfig } from "../config-store";
5
5
  import { setConfigAsync } from "../config-store-write";
6
6
  import { getUserSettingAsync, setUserSettingAsync } from "../user-settings-async";
7
- import { ensureProviderConfigDescriptors, migrateLocalProviderConfigs } from "../provider-config-store";
7
+ import { ensureProviderConfigDescriptors, migrateLocalProviderConfigsAsync } from "../provider-config-store";
8
8
  import { ensureNotificationSettingDescriptors } from "../notification-settings-store";
9
9
  import { NOTIFICATIONS_NAMESPACE } from "../notification-settings";
10
10
  import { getSettingDescriptor, listSettingDescriptors, validateSettingValue, PROVIDER_CONFIG_NAMESPACE } from "../settings/registry";
@@ -23,7 +23,7 @@ type SettingEnvelope = SettingEntry;
23
23
  // as before the migration (back-compat). Server-runtime/bootstrap/browser tiers ignore this.
24
24
 
25
25
  export const getSettingsRoute: Handler = async (req) => {
26
- migrateLocalProviderConfigs();
26
+ await migrateLocalProviderConfigsAsync();
27
27
  ensureProviderConfigDescriptors();
28
28
  ensureNotificationSettingDescriptors();
29
29
  return json({ settings: await listVisibleSettings(req) });
@@ -31,7 +31,7 @@ export const getSettingsRoute: Handler = async (req) => {
31
31
 
32
32
  export const getSettingsNamespaceRoute: Handler = async (req, params) => {
33
33
  const namespace = normalizeConfigPathParam(params.namespace, "namespace");
34
- migrateLocalProviderConfigs();
34
+ await migrateLocalProviderConfigsAsync();
35
35
  ensureProviderConfigDescriptors();
36
36
  if (namespace === NOTIFICATIONS_NAMESPACE) ensureNotificationSettingDescriptors();
37
37
  const settings = await listVisibleSettings(req);
@@ -41,7 +41,7 @@ export const getSettingsNamespaceRoute: Handler = async (req, params) => {
41
41
  export const getSettingRoute: Handler = async (req, params) => {
42
42
  const namespace = normalizeConfigPathParam(params.namespace, "namespace");
43
43
  const key = normalizeConfigPathParam(params.key, "key");
44
- migrateLocalProviderConfigs();
44
+ await migrateLocalProviderConfigsAsync();
45
45
  ensureProviderConfigDescriptors(namespace === PROVIDER_CONFIG_NAMESPACE ? [key] : []);
46
46
  if (namespace === NOTIFICATIONS_NAMESPACE) ensureNotificationSettingDescriptors([key]);
47
47
  const descriptor = getSettingDescriptor(namespace, key);
@@ -82,7 +82,7 @@ async function putSetting(req: Request, namespaceRaw: string | undefined, keyRaw
82
82
  if (!Object.prototype.hasOwnProperty.call(parsed.body, "value")) return error("value required", 400);
83
83
 
84
84
  try {
85
- migrateLocalProviderConfigs();
85
+ await migrateLocalProviderConfigsAsync();
86
86
  ensureProviderConfigDescriptors(namespace === PROVIDER_CONFIG_NAMESPACE ? [key] : []);
87
87
  if (namespace === NOTIFICATIONS_NAMESPACE) ensureNotificationSettingDescriptors([key]);
88
88
  const descriptor = getSettingDescriptor(namespace, key);
@@ -7,7 +7,7 @@ import { listPauses, pauseJob, resumeJobAsync } from "../maintenance/pauses";
7
7
  import { defaultIssueRepo } from "../config";
8
8
  import { listSpawnPolicies } from "../config-store";
9
9
  import { disabledBackingPolicyNames } from "../channel-policy-health";
10
- import { cancelMaintenanceRun, listMaintenanceJobs, listRecentMaintenanceRuns, listRunningMaintenanceRuns, runLegacyMaintenanceReaper, runMaintenanceJobNow } from "../maintenance";
10
+ import { cancelMaintenanceRun, listMaintenanceJobsAsync, listRecentMaintenanceRuns, listRunningMaintenanceRuns, runLegacyMaintenanceReaper, runMaintenanceJobNow } from "../maintenance";
11
11
  import { claudeAppOAuthHealth } from "../claude-app/oauth-http";
12
12
  import { getConnector } from "../connectors";
13
13
  import { channelsHostEnsureHealthCheck } from "../connector-boot-health";
@@ -66,7 +66,7 @@ export const getHealthRoute: Handler = async () => {
66
66
  // #3606 — rolling 60 s load breakdown: callers by rate and CPU, emits, reader-pool ops.
67
67
  export const getHubMetricsRoute: Handler = () => json(hubMetricsReport());
68
68
 
69
- export const getMaintenanceJobs: Handler = () => json(listMaintenanceJobs());
69
+ export const getMaintenanceJobs: Handler = async () => json(await listMaintenanceJobsAsync());
70
70
 
71
71
  // #1728 stage 0 — a POST-HOC diagnostic surface, not a live incident one: it reads the in-memory
72
72
  // run registry the scheduler maintains (see src/maintenance/scheduler.ts). That registry can only
@@ -87,7 +87,7 @@ export const postMaintenanceJobRun: Handler = async (req, params) => {
87
87
  const parsed = await parseBody<{ overridePause?: unknown }>(req);
88
88
  const overridePause = parsed.ok && parsed.body?.overridePause === true;
89
89
  const run = await runMaintenanceJobNow(params.id!, { overridePause });
90
- return json({ run, jobs: listMaintenanceJobs() }, run.status === "failed" ? 500 : 202);
90
+ return json({ run, jobs: await listMaintenanceJobsAsync() }, run.status === "failed" ? 500 : 202);
91
91
  } catch (e) {
92
92
  if (e instanceof Error && e.message.includes("not found")) return error(e.message, 404);
93
93
  throw e;
@@ -110,7 +110,7 @@ export const postMaintenanceJobCancel: Handler = async (req, params) => {
110
110
  if (cancelledRunIds.length === 0) {
111
111
  return json({ ok: false, error: "maintenance job is not running", cancelledRunIds: [] }, 404);
112
112
  }
113
- return json({ ok: true, cancelledRunIds, requester, jobs: listMaintenanceJobs() });
113
+ return json({ ok: true, cancelledRunIds, requester, jobs: await listMaintenanceJobsAsync() });
114
114
  };
115
115
 
116
116
  export const getMaintenancePauses: Handler = () => {
@@ -136,7 +136,7 @@ export const postMaintenanceJobPause: Handler = async (req, params) => {
136
136
  if (!result.ok) {
137
137
  return json({ ok: false, error: "maintenance job already paused", pause: result.pause }, 409);
138
138
  }
139
- return json({ ok: true, pause: result.pause, jobs: listMaintenanceJobs() });
139
+ return json({ ok: true, pause: result.pause, jobs: await listMaintenanceJobsAsync() });
140
140
  } catch (e) {
141
141
  if (e instanceof ValidationError) return error(e.message, 400);
142
142
  throw e;
@@ -147,7 +147,7 @@ export const postMaintenanceJobResume: Handler = async (_req, params) => {
147
147
  try {
148
148
  const result = await resumeJobAsync({ jobId: params.id! });
149
149
  if (!result.resumed) return error("maintenance job is not paused", 404);
150
- return json({ ok: true, ...result, jobs: listMaintenanceJobs() });
150
+ return json({ ok: true, ...result, jobs: await listMaintenanceJobsAsync() });
151
151
  } catch (e) {
152
152
  if (e instanceof ValidationError) return error(e.message, 400);
153
153
  throw e;
@@ -1,4 +1,5 @@
1
- import { resolveActingUser, requestUserAddress, resolveActorLabel, error } from "./_shared";
1
+ import { isRecord } from "@humwick/sdk";
2
+ import { resolveActingUser, requestUserAddress, resolveActorLabel, error, parseBody, parseId } from "./_shared";
2
3
  import { ValidationError } from "../db/connection";
3
4
  import { authContextFromRequest } from "../services/auth-context";
4
5
  import { isRequestAuthorizedFor } from "../security";
@@ -25,3 +26,16 @@ export function taskEntityError(e: unknown): Response {
25
26
  }
26
27
  throw e;
27
28
  }
29
+
30
+ export async function parseTaskMutation(req: Request, rawId: string | undefined): Promise<
31
+ { ok: true; id: number; body: Record<string, unknown> } | { ok: false; response: Response }
32
+ > {
33
+ const id = parseId(rawId);
34
+ if (id === null) return { ok: false, response: error("invalid task id") };
35
+ const forbidden = await requireTaskMutationAuth(req, id);
36
+ if (forbidden) return { ok: false, response: forbidden };
37
+ const parsed = await parseBody<Record<string, unknown>>(req);
38
+ if (!parsed.ok) return { ok: false, response: error(parsed.error, parsed.status) };
39
+ if (!isRecord(parsed.body)) return { ok: false, response: error("JSON object body required") };
40
+ return { ok: true, id, body: parsed.body };
41
+ }
@@ -6,18 +6,13 @@ import { cleanIssueRefRelation } from "../db/task-issue-relation";
6
6
  import { issueRefsFromArgs } from "../services/issue-refs";
7
7
  import { cleanString } from "../validation";
8
8
  import { isRecord } from "@humwick/sdk";
9
- import { error, json, parseBody, parseId, type Handler } from "./_shared";
10
- import { taskHttpActor as actorOf, requireTaskMutationAuth, taskEntityError as entityError } from "./task-http";
9
+ import { error, json, type Handler } from "./_shared";
10
+ import { taskHttpActor as actorOf, parseTaskMutation, taskEntityError as entityError } from "./task-http";
11
11
 
12
12
  export const postTaskRef: Handler = async (req, params) => {
13
- const id = parseId(params.id);
14
- if (id === null) return error("invalid task id");
15
- const forbidden = await requireTaskMutationAuth(req, id);
16
- if (forbidden) return forbidden;
17
- const parsed = await parseBody<Record<string, unknown>>(req);
18
- if (!parsed.ok) return error(parsed.error, parsed.status);
19
- const body = parsed.body;
20
- if (!isRecord(body)) return error("JSON object body required");
13
+ const parsed = await parseTaskMutation(req, params.id);
14
+ if (!parsed.ok) return parsed.response;
15
+ const { id, body } = parsed;
21
16
  try {
22
17
  // Same alias tolerance + attach-nothing rejection as relay_task_add_ref (#2214), one body.
23
18
  return json(await attachTaskRefs(id, {
@@ -33,14 +28,9 @@ export const postTaskRef: Handler = async (req, params) => {
33
28
  }
34
29
  };
35
30
  export const deleteTaskRef: Handler = async (req, params) => {
36
- const id = parseId(params.id);
37
- if (id === null) return error("invalid task id");
38
- const forbidden = await requireTaskMutationAuth(req, id);
39
- if (forbidden) return forbidden;
40
- const parsed = await parseBody<Record<string, unknown>>(req);
41
- if (!parsed.ok) return error(parsed.error, parsed.status);
42
- const body = parsed.body;
43
- if (!isRecord(body)) return error("JSON object body required");
31
+ const parsed = await parseTaskMutation(req, params.id);
32
+ if (!parsed.ok) return parsed.response;
33
+ const { id, body } = parsed;
44
34
  try {
45
35
  const detail = await removeTaskEntityRefAsync(id, {
46
36
  issueRefId: cleanString(body.issueRefId, "issueRefId", { max: 120 }),
@@ -57,14 +47,9 @@ export const deleteTaskRef: Handler = async (req, params) => {
57
47
  // #833 — comment-on-Task writes THROUGH to the linked GitHub issue (discussion lives in
58
48
  // GitHub, never a relay table). Execution telemetry never reaches this path.
59
49
  export const postTaskComment: Handler = async (req, params) => {
60
- const id = parseId(params.id);
61
- if (id === null) return error("invalid task id");
62
- const forbidden = await requireTaskMutationAuth(req, id);
63
- if (forbidden) return forbidden;
64
- const parsed = await parseBody<Record<string, unknown>>(req);
65
- if (!parsed.ok) return error(parsed.error, parsed.status);
66
- const body = parsed.body;
67
- if (!isRecord(body)) return error("JSON object body required");
50
+ const parsed = await parseTaskMutation(req, params.id);
51
+ if (!parsed.ok) return parsed.response;
52
+ const { id, body } = parsed;
68
53
  try {
69
54
  const result = await commentOnTaskThrough({
70
55
  taskId: id,
@@ -2,9 +2,9 @@
2
2
  export { postTaskRef, deleteTaskRef, postTaskComment } from "./task-issues";
3
3
  import { createPlanTaskAsync, isPlanTaskCreate } from "../services/plan-task-create";
4
4
  import { prepareIssueTaskCreate, refreshTaskIssueUpdateAsync } from "../services/task-from-issue";
5
- import { taskHttpActor as actorOf, requireTaskMutationAuth, taskEntityError as entityError } from "./task-http";
5
+ import { taskHttpActor as actorOf, requireTaskMutationAuth, parseTaskMutation, taskEntityError as entityError } from "./task-http";
6
6
  import { MAX_BODY_BYTES } from "../config";
7
- import { VALID_TASK_STATUSES, agentSessionStatus, auditEvent, dispatchTaskCallbacksInBackground, emitCommand, error, json, normalizeAgentSessionGuard, parseBody, parseId, type Handler } from "./_shared";
7
+ import { VALID_TASK_STATUSES, agentSessionStatus, auditEvent, dispatchTaskCallbacksInBackground, error, json, normalizeAgentSessionGuard, parseBody, parseId, type Handler } from "./_shared";
8
8
  import { isRequestAuthorizedFor } from "../security";
9
9
  import { authContextFromRequest } from "../services/auth-context";
10
10
  import { hasTaskReadAdminScope } from "../task-authz";
@@ -25,7 +25,7 @@ import { cleanIssueRefRelation } from "../db/task-issue-relation";
25
25
  import { issueRefsFromArgs } from "../services/issue-refs";
26
26
  import { cleanEpoch, cleanMeta, cleanString, dependencyRefField, optionalEnum, taskIdField } from "../validation";
27
27
  import { emitMessageClaimed, emitTaskChanged } from "../sse";
28
- import { errMessage, isRecord, TASK_TERMINAL_STAGES, TASK_DELIVERABLE_STAGES, TASK_DISPATCH_COMPLEXITIES, type TaskBlocker, type TaskDispatch, type TaskGateStatus, type TaskPriority } from "@humwick/sdk";
28
+ import { isRecord, TASK_TERMINAL_STAGES, TASK_DELIVERABLE_STAGES, TASK_DISPATCH_COMPLEXITIES, type TaskBlocker, type TaskDispatch, type TaskGateStatus, type TaskPriority } from "@humwick/sdk";
29
29
  import { type AgentSessionGuard, type TaskStatus, type TaskStatusInput } from "../types";
30
30
 
31
31
  async function taskDetailOr404(id: number) {
@@ -100,6 +100,7 @@ export const postTaskCreate: Handler = async (req) => {
100
100
  complexity: optionalEnum(body.complexity, "complexity", TASK_DISPATCH_COMPLEXITIES),
101
101
  context: cleanString(body.context, "context", { max: MAX_BODY_BYTES }),
102
102
  terminalStage: optionalEnum(body.terminalStage, "terminalStage", TASK_TERMINAL_STAGES),
103
+ onDeploy: cleanString(body.onDeploy, "onDeploy", { max: 500 }),
103
104
  doneWhen: cleanString(body.doneWhen, "doneWhen", { max: MAX_BODY_BYTES }),
104
105
  teamId: cleanString(body.teamId, "teamId", { max: 200 }),
105
106
  projectId: cleanString(body.projectId, "projectId", { max: 120 }),
@@ -109,6 +110,7 @@ export const postTaskCreate: Handler = async (req) => {
109
110
  // Raw passthrough (same convention as `dispatch` above) — validated inside
110
111
  // createDeliverableTask (cleanTags / cleanTaskPriority), not at the route layer.
111
112
  tags: body.tags as string[] | undefined,
113
+ paths: body.paths as string[] | undefined,
112
114
  priority: body.priority as TaskPriority | undefined,
113
115
  // Same alias-tolerant normalization the MCP surface uses (#2214) — one home, both transports.
114
116
  issueRefs: issueRefsFromArgs(body),
@@ -148,21 +150,10 @@ export const postTaskCreate: Handler = async (req) => {
148
150
  }
149
151
  };
150
152
 
151
-
152
-
153
-
154
-
155
-
156
-
157
153
  export const patchTaskEntity: Handler = async (req, params) => {
158
- const id = parseId(params.id);
159
- if (id === null) return error("invalid task id");
160
- const forbidden = await requireTaskMutationAuth(req, id);
161
- if (forbidden) return forbidden;
162
- const parsed = await parseBody<Record<string, unknown>>(req);
163
- if (!parsed.ok) return error(parsed.error, parsed.status);
164
- const body = parsed.body;
165
- if (!isRecord(body)) return error("JSON object body required");
154
+ const parsed = await parseTaskMutation(req, params.id);
155
+ if (!parsed.ok) return parsed.response;
156
+ const { id, body } = parsed;
166
157
  try {
167
158
  if (body.refreshIssue !== undefined) return json(await refreshTaskIssueUpdateAsync(id, body, actorOf(req)));
168
159
  const detail = await updateTaskEntityAsync(id, {
@@ -171,6 +162,7 @@ export const patchTaskEntity: Handler = async (req, params) => {
171
162
  ...(body.complexity !== undefined ? { complexity: optionalEnum(body.complexity, "complexity", TASK_DISPATCH_COMPLEXITIES) } : {}),
172
163
  ...(body.context !== undefined ? { context: cleanString(body.context, "context", { max: MAX_BODY_BYTES }) ?? "" } : {}),
173
164
  ...(body.latestSteer !== undefined ? { latestSteer: cleanString(body.latestSteer, "latestSteer", { max: MAX_BODY_BYTES }) ?? "" } : {}),
165
+ ...(body.onDeploy !== undefined ? { onDeploy: cleanString(body.onDeploy, "onDeploy", { max: 500 }) ?? "" } : {}),
174
166
  ...(body.doneWhen !== undefined ? { doneWhen: cleanString(body.doneWhen, "doneWhen", { max: MAX_BODY_BYTES }) ?? "" } : {}),
175
167
  ...(body.dispatch !== undefined ? { dispatch: body.dispatch as TaskDispatch } : {}),
176
168
  ...(body.teamId !== undefined ? { teamId: cleanString(body.teamId, "teamId", { max: 200 }) ?? "" } : {}),
@@ -180,6 +172,7 @@ export const patchTaskEntity: Handler = async (req, params) => {
180
172
  // survive into updateDeliverableTask, which cleanString's `?? ""` collapse would erase.
181
173
  ...(body.terminalStage !== undefined ? { terminalStage: body.terminalStage === null ? null : optionalEnum(body.terminalStage, "terminalStage", TASK_TERMINAL_STAGES) } : {}),
182
174
  ...(body.tags !== undefined ? { tags: body.tags as string[] | null } : {}),
175
+ ...(body.paths !== undefined ? { paths: body.paths as string[] | null } : {}),
183
176
  ...(body.priority !== undefined ? { priority: body.priority as TaskPriority | null } : {}),
184
177
  actor: actorOf(req),
185
178
  });
@@ -190,14 +183,9 @@ export const patchTaskEntity: Handler = async (req, params) => {
190
183
  };
191
184
 
192
185
  export const postTaskEntityStatus: Handler = async (req, params) => {
193
- const id = parseId(params.id);
194
- if (id === null) return error("invalid task id");
195
- const forbidden = await requireTaskMutationAuth(req, id);
196
- if (forbidden) return forbidden;
197
- const parsed = await parseBody<Record<string, unknown>>(req);
198
- if (!parsed.ok) return error(parsed.error, parsed.status);
199
- const body = parsed.body;
200
- if (!isRecord(body)) return error("JSON object body required");
186
+ const parsed = await parseTaskMutation(req, params.id);
187
+ if (!parsed.ok) return parsed.response;
188
+ const { id, body } = parsed;
201
189
  try {
202
190
  const detail = await setTaskStatusControl(id, {
203
191
  status: body.status as TaskStatus,
@@ -213,14 +201,9 @@ export const postTaskEntityStatus: Handler = async (req, params) => {
213
201
  };
214
202
 
215
203
  export const postTaskEntityStage: Handler = async (req, params) => {
216
- const id = parseId(params.id);
217
- if (id === null) return error("invalid task id");
218
- const forbidden = await requireTaskMutationAuth(req, id);
219
- if (forbidden) return forbidden;
220
- const parsed = await parseBody<Record<string, unknown>>(req);
221
- if (!parsed.ok) return error(parsed.error, parsed.status);
222
- const body = parsed.body;
223
- if (!isRecord(body)) return error("JSON object body required");
204
+ const parsed = await parseTaskMutation(req, params.id);
205
+ if (!parsed.ok) return parsed.response;
206
+ const { id, body } = parsed;
224
207
  try {
225
208
  const detail = await setTaskEntityStageAsync(id, {
226
209
  deliverableStage: optionalEnum(body.deliverableStage, "deliverableStage", TASK_DELIVERABLE_STAGES) as any,
@@ -235,14 +218,9 @@ export const postTaskEntityStage: Handler = async (req, params) => {
235
218
  };
236
219
 
237
220
  export const postTaskEntityGate: Handler = async (req, params) => {
238
- const id = parseId(params.id);
239
- if (id === null) return error("invalid task id");
240
- const forbidden = await requireTaskMutationAuth(req, id);
241
- if (forbidden) return forbidden;
242
- const parsed = await parseBody<Record<string, unknown>>(req);
243
- if (!parsed.ok) return error(parsed.error, parsed.status);
244
- const body = parsed.body;
245
- if (!isRecord(body)) return error("JSON object body required");
221
+ const parsed = await parseTaskMutation(req, params.id);
222
+ if (!parsed.ok) return parsed.response;
223
+ const { id, body } = parsed;
246
224
  try {
247
225
  return json(await recordTaskEntityGateAsync(id, {
248
226
  gate: cleanString(body.gate, "gate", { required: true, max: 120 })!,
@@ -345,14 +323,9 @@ export const deleteTaskRelated: Handler = async (req, params) => {
345
323
  };
346
324
 
347
325
  export const postTaskAssign: Handler = async (req, params) => {
348
- const id = parseId(params.id);
349
- if (id === null) return error("invalid task id");
350
- const forbidden = await requireTaskMutationAuth(req, id);
351
- if (forbidden) return forbidden;
352
- const parsed = await parseBody<Record<string, unknown>>(req);
353
- if (!parsed.ok) return error(parsed.error, parsed.status);
354
- const body = parsed.body;
355
- if (!isRecord(body)) return error("JSON object body required");
326
+ const parsed = await parseTaskMutation(req, params.id);
327
+ if (!parsed.ok) return parsed.response;
328
+ const { id, body } = parsed;
356
329
  try {
357
330
  const detail = await assignTaskEntityAgentAsync(id, cleanString(body.agentId, "agentId", { required: true, max: 200 })!, cleanString(body.role, "role", { max: 120 }), actorOf(req));
358
331
  return json(detail);
@@ -444,10 +417,6 @@ export const postWorkspaceWithdrawLand: Handler = async (req) => {
444
417
  }
445
418
  };
446
419
 
447
-
448
-
449
-
450
-
451
420
  export const postClaimTask: Handler = async (req, params) => {
452
421
  const id = parseId(params.id);
453
422
  if (id === null) return error("invalid task id");
@@ -1,5 +1,5 @@
1
1
  import { authContextFromRequest } from "../services/auth-context";
2
- import { deleteTeamTemplate, getTeamTemplate, listTeamTemplates, saveTeamTemplate } from "../services/team-templates";
2
+ import { deleteTeamTemplateAsync, getTeamTemplate, listTeamTemplates, saveTeamTemplateAsync } from "../services/team-templates";
3
3
  import { cleanString } from "../validation";
4
4
  import { authorizeRoute, error, json, parseBody, type Handler } from "./_shared";
5
5
 
@@ -39,7 +39,7 @@ export const postTeamTemplateRoute: Handler = async (req) => {
39
39
  const parsed = await parseBody<Record<string, unknown>>(req);
40
40
  if (!parsed.ok) return error(parsed.error, parsed.status);
41
41
  try {
42
- return json(saveTeamTemplate(parsed.body ?? {}, updatedBy(req)), 201);
42
+ return json(await saveTeamTemplateAsync(parsed.body ?? {}, updatedBy(req)), 201);
43
43
  } catch (err) {
44
44
  return routeError(err);
45
45
  }
@@ -51,15 +51,15 @@ export const putTeamTemplateRoute: Handler = async (req, params) => {
51
51
  const parsed = await parseBody<Record<string, unknown>>(req);
52
52
  if (!parsed.ok) return error(parsed.error, parsed.status);
53
53
  try {
54
- return json(saveTeamTemplate({ ...(parsed.body ?? {}), slug: slugParam(params) }, updatedBy(req)));
54
+ return json(await saveTeamTemplateAsync({ ...(parsed.body ?? {}), slug: slugParam(params) }, updatedBy(req)));
55
55
  } catch (err) {
56
56
  return routeError(err);
57
57
  }
58
58
  };
59
59
 
60
- export const deleteTeamTemplateRoute: Handler = (req, params) => {
60
+ export const deleteTeamTemplateRoute: Handler = async (req, params) => {
61
61
  const denied = authorizeRoute(req, { scope: "system:admin" });
62
62
  if (denied) return denied;
63
63
  const slug = slugParam(params);
64
- return json({ slug, deleted: deleteTeamTemplate(slug, updatedBy(req)) });
64
+ return json({ slug, deleted: await deleteTeamTemplateAsync(slug, updatedBy(req)) });
65
65
  };
@@ -1,4 +1,4 @@
1
- import { getTeamsConfig, setTeamsConfig } from "../teams-config-store";
1
+ import { getTeamsConfig, setTeamsConfigAsync } from "../teams-config-store";
2
2
  import { cleanString } from "../validation";
3
3
  import { error, json, parseBody, type Handler } from "./_shared";
4
4
  import { isRecord } from "@humwick/sdk";
@@ -11,5 +11,5 @@ export const putTeamsConfigRoute: Handler = async (req) => {
11
11
  const parsed = await parseBody<unknown>(req);
12
12
  if (!parsed.ok) return error(parsed.error, parsed.status);
13
13
  const updatedBy = isRecord(parsed.body) ? cleanString(parsed.body.updatedBy, "updatedBy", { max: 200 }) : undefined;
14
- return json(setTeamsConfig(parsed.body, { updatedBy }));
14
+ return json(await setTeamsConfigAsync(parsed.body, { updatedBy }));
15
15
  };
@@ -6,13 +6,19 @@ import { ValidationError, getOrchestrator, upsertIntegrationRegistry } from "../
6
6
  import { auditEvent, authAuditMetadata, authorizeRoute, error, isRootCredentialRequest, json, parseBody, resolveActingUser, type Handler } from "./_shared";
7
7
  import { cleanString, cleanStringArray, cleanTokenConstraints, optionalEnum } from "../validation";
8
8
  import { deleteTokenProfile, getToken, getTokenProfile, listTokenProfiles, listTokens, updateTokenProfile, upsertTokenProfile } from "../token-db";
9
- import { createTokenAsync, handoffTokenAsync, revokeTokenAsync } from "../token-db-write";
9
+ import { createTokenAsync, revokeTokenAsync } from "../token-db-write";
10
10
  import { getComponentAuth, getIntegrationAuth, isAuthorized } from "../security";
11
- import { issueIntegrationRuntimeToken, issueInteractiveRunnerRuntimeToken, issueMcpRuntimeToken, reissueRunnerRuntimeToken, remintRunnerRuntimeToken } from "../runtime-tokens";
11
+ import { handoffRunnerTokenAsync, issueIntegrationRuntimeToken, issueInteractiveRunnerRuntimeToken, issueMcpRuntimeToken, reissueRunnerRuntimeToken, remintRunnerRuntimeToken, type RunnerTokenMintRefusal } from "../runtime-tokens";
12
12
  import { type SpawnProvider } from "../types";
13
13
 
14
14
  export const getTokens: Handler = () => json(listTokens());
15
15
 
16
+ // #3775 — a rate-limited runner token mint is a 429 with Retry-After; any other refusal stays 403.
17
+ function mintRefused(refusal: RunnerTokenMintRefusal): Response {
18
+ if (refusal.retryAfterSeconds === undefined) return error(refusal.error, 403);
19
+ return Response.json({ error: refusal.error, retryAfterSeconds: refusal.retryAfterSeconds }, { status: 429, headers: { "Retry-After": String(refusal.retryAfterSeconds) } });
20
+ }
21
+
16
22
  export const getTokenMe: Handler = (req) => {
17
23
  const component = getComponentAuth(req);
18
24
  if (component) {
@@ -103,11 +109,12 @@ export const postRuntimeTokenRenew: Handler = async (req) => {
103
109
  const auth = getComponentAuth(req);
104
110
  if (!auth?.jti) return error("scoped runtime token required", 403);
105
111
  if (auth.role !== "provider") return error("provider runtime token required", 403);
106
- const renewed = await handoffTokenAsync({
112
+ const renewed = await handoffRunnerTokenAsync(auth.sub, {
107
113
  jti: auth.jti,
108
114
  allowedProfileIds: ["provider-agent", "provider-interactive"],
109
115
  createdBy: `renew:${auth.jti}`,
110
116
  });
117
+ if (renewed && "retryAfterSeconds" in renewed) return mintRefused({ error: "runtime token mint rate limited", ...renewed });
111
118
  if (!renewed) return error("runtime token cannot be renewed", 403);
112
119
  await auditEvent({
113
120
  // Keyed by the successor, so a replayed handoff (#1245) records one renewal.
@@ -151,7 +158,7 @@ export const postRuntimeTokenRemint: Handler = async (req) => {
151
158
  throw e;
152
159
  }
153
160
  const result = await remintRunnerRuntimeToken(auth, `remint:${auth.jti}`);
154
- if ("error" in result) return error(result.error, 403);
161
+ if ("error" in result) return mintRefused(result);
155
162
  if ("unchanged" in result) return json(result);
156
163
  await auditEvent({
157
164
  clientId: "server-runtime-token-remint-" + result.record.jti,
@@ -180,7 +187,7 @@ export const postOrchestratorRunnerToken: Handler = async (req, params) => {
180
187
  orchestratorId: orch.id,
181
188
  createdBy: `orchestrator-remint:${orch.id}`,
182
189
  });
183
- if ("error" in result) return error(result.error, 403);
190
+ if ("error" in result) return mintRefused(result);
184
191
  await auditEvent({
185
192
  clientId: "server-runner-token-remint-" + result.record.jti,
186
193
  kind: "state",