@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
@@ -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
 
@@ -16,14 +16,14 @@ function slugParam(params: Record<string, string | undefined>): string {
16
16
  return cleanString(params.slug, "slug", { required: true, max: 120 })!;
17
17
  }
18
18
 
19
- export const getTeamTemplatesRoute: Handler = (req) => {
20
- const denied = authorizeRoute(req, { scope: "system:admin" });
19
+ export const getTeamTemplatesRoute: Handler = async (req) => {
20
+ const denied = (await authorizeRoute(req, { scope: "system:admin" }));
21
21
  if (denied) return denied;
22
22
  return json({ templates: listTeamTemplates() });
23
23
  };
24
24
 
25
- export const getTeamTemplateRoute: Handler = (req, params) => {
26
- const denied = authorizeRoute(req, { scope: "system:admin" });
25
+ export const getTeamTemplateRoute: Handler = async (req, params) => {
26
+ const denied = (await authorizeRoute(req, { scope: "system:admin" }));
27
27
  if (denied) return denied;
28
28
  try {
29
29
  const template = getTeamTemplate(slugParam(params));
@@ -34,32 +34,32 @@ export const getTeamTemplateRoute: Handler = (req, params) => {
34
34
  };
35
35
 
36
36
  export const postTeamTemplateRoute: Handler = async (req) => {
37
- const denied = authorizeRoute(req, { scope: "system:admin" });
37
+ const denied = (await authorizeRoute(req, { scope: "system:admin" }));
38
38
  if (denied) return denied;
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
  }
46
46
  };
47
47
 
48
48
  export const putTeamTemplateRoute: Handler = async (req, params) => {
49
- const denied = authorizeRoute(req, { scope: "system:admin" });
49
+ const denied = (await authorizeRoute(req, { scope: "system:admin" }));
50
50
  if (denied) return denied;
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) => {
61
- const denied = authorizeRoute(req, { scope: "system:admin" });
60
+ export const deleteTeamTemplateRoute: Handler = async (req, params) => {
61
+ const denied = (await 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
  };
@@ -43,9 +43,9 @@ export const getMyTeamRoute: Handler = (req) => {
43
43
  };
44
44
 
45
45
  // #3725 — a signed-in member lists the teams their agent scope can see; machine callers stay admin-only.
46
- export const getTeamsRoute: Handler = (req) => {
46
+ export const getTeamsRoute: Handler = async (req) => {
47
47
  const viewer = viewerScopeForRequest(req);
48
- const denied = authorizeRoute(req, { scope: viewer ? "teams:read" : "system:admin" });
48
+ const denied = (await authorizeRoute(req, { scope: viewer ? "teams:read" : "system:admin" }));
49
49
  if (denied) return denied;
50
50
  try {
51
51
  const status = optionalEnum(new URL(req.url).searchParams.get("status") ?? undefined, "status", TEAM_STATUSES) as Team["status"] | undefined;
@@ -67,7 +67,7 @@ export const getTeamsRoute: Handler = (req) => {
67
67
  };
68
68
 
69
69
  export const getTeamOutcomesRoute: Handler = async (req) => {
70
- const denied = authorizeRoute(req, { scope: "system:admin" });
70
+ const denied = (await authorizeRoute(req, { scope: "system:admin" }));
71
71
  if (denied) return denied;
72
72
  try {
73
73
  const recentLimit = parseQueryInt(new URL(req.url).searchParams.get("recentLimit"), { min: 1, max: 50, clamp: true }) ?? undefined;
@@ -83,11 +83,11 @@ export const putMyTeamBriefRoute: Handler = async (req) => {
83
83
  if (!parsed.ok) return error(parsed.error, parsed.status);
84
84
  try {
85
85
  const body = parsed.body ?? {};
86
- return json(setCallerTeamBrief(authContextFromRequest(req), {
86
+ return json((await setCallerTeamBrief(authContextFromRequest(req), {
87
87
  title: cleanString(body.title, "title", { max: 240 }),
88
88
  brief: cleanString(body.brief, "brief", { max: 16_000 }),
89
89
  definitionOfDone: cleanString(body.definitionOfDone, "definitionOfDone", { max: 4000 }),
90
- }));
90
+ })));
91
91
  } catch (err) {
92
92
  return routeError(err);
93
93
  }
@@ -98,28 +98,28 @@ export const postMyTeamDissolveRoute: Handler = async (req) => {
98
98
  if (!parsed.ok) return error(parsed.error, parsed.status);
99
99
  try {
100
100
  const body = parsed.body ?? {};
101
- return json(dissolveCallerTeam(authContextFromRequest(req), cleanDissolveInput(body)));
101
+ return json(await dissolveCallerTeam(authContextFromRequest(req), cleanDissolveInput(body)));
102
102
  } catch (err) {
103
103
  return routeError(err);
104
104
  }
105
105
  };
106
106
 
107
107
  export const postTeamDissolveByIdRoute: Handler = async (req, params) => {
108
- const denied = authorizeRoute(req, { scope: "system:admin" });
108
+ const denied = (await authorizeRoute(req, { scope: "system:admin" }));
109
109
  if (denied) return denied;
110
110
  const parsed = await parseBody<Record<string, unknown>>(req);
111
111
  if (!parsed.ok) return error(parsed.error, parsed.status);
112
112
  try {
113
113
  const id = params.id!;
114
114
  if (!getTeam(id)) return error("team not found", 404);
115
- return json(dissolveTeamById(id, cleanDissolveInput(parsed.body ?? {})));
115
+ return json(await dissolveTeamById(id, cleanDissolveInput(parsed.body ?? {})));
116
116
  } catch (err) {
117
117
  return routeError(err);
118
118
  }
119
119
  };
120
120
 
121
121
  export const patchTeamSpawnDelegationRoute: Handler = async (req, params) => {
122
- const denied = authorizeRoute(req, { scope: "teams:write" });
122
+ const denied = (await authorizeRoute(req, { scope: "teams:write" }));
123
123
  if (denied) return denied;
124
124
  const parsed = await parseBody<Record<string, unknown>>(req);
125
125
  if (!parsed.ok) return error(parsed.error, parsed.status);
@@ -132,7 +132,7 @@ export const patchTeamSpawnDelegationRoute: Handler = async (req, params) => {
132
132
  export const getTeamSpawnDelegationRoute: Handler = async (req, params) => {
133
133
  // #3725 — the grant names projects and launches across the tree; a member's session may not read it.
134
134
  const viewer = viewerScopeForRequest(req);
135
- const denied = authorizeRoute(req, { scope: viewer && !viewer.seesAll ? "system:admin" : "teams:read" });
135
+ const denied = (await authorizeRoute(req, { scope: viewer && !viewer.seesAll ? "system:admin" : "teams:read" }));
136
136
  if (denied) return denied;
137
137
  try {
138
138
  const state = await getTeamSpawnDelegation(authContextFromRequest(req), params.id!);
@@ -1,18 +1,25 @@
1
+ import { upsertIntegrationRegistryAsync, upsertTokenProfileAsync, updateTokenProfileAsync, deleteTokenProfileAsync } from "../db/runtime-tail-async";
1
2
  // Auto-split from routes.ts (#299). Domain: tokens.
2
3
  import { revokeUserSession, sessionUserIdOf } from "../auth/session";
3
4
  import { withSessionCookie } from "../auth/session-cookie";
4
5
  import { APPROVAL_MODES, SPAWN_PROVIDERS, isRecord, userSinkId } from "@humwick/sdk";
5
- import { ValidationError, getOrchestrator, upsertIntegrationRegistry } from "../db";
6
+ import { ValidationError, getOrchestrator } from "../db";
6
7
  import { auditEvent, authAuditMetadata, authorizeRoute, error, isRootCredentialRequest, json, parseBody, resolveActingUser, type Handler } from "./_shared";
7
8
  import { cleanString, cleanStringArray, cleanTokenConstraints, optionalEnum } from "../validation";
8
- import { deleteTokenProfile, getToken, getTokenProfile, listTokenProfiles, listTokens, updateTokenProfile, upsertTokenProfile } from "../token-db";
9
- import { createTokenAsync, handoffTokenAsync, revokeTokenAsync } from "../token-db-write";
9
+ import { getToken, getTokenProfile, listTokenProfiles, listTokens } from "../token-db";
10
+ import { createTokenAsync, revokeTokenAsync } from "../token-db-write";
10
11
  import { getComponentAuth, getIntegrationAuth, isAuthorized } from "../security";
11
- import { issueIntegrationRuntimeToken, issueInteractiveRunnerRuntimeToken, issueMcpRuntimeToken, reissueRunnerRuntimeToken, remintRunnerRuntimeToken } from "../runtime-tokens";
12
+ import { handoffRunnerTokenAsync, issueIntegrationRuntimeToken, issueInteractiveRunnerRuntimeToken, issueMcpRuntimeToken, reissueRunnerRuntimeToken, remintRunnerRuntimeToken, type RunnerTokenMintRefusal } from "../runtime-tokens";
12
13
  import { type SpawnProvider } from "../types";
13
14
 
14
15
  export const getTokens: Handler = () => json(listTokens());
15
16
 
17
+ // #3775 — a rate-limited runner token mint is a 429 with Retry-After; any other refusal stays 403.
18
+ function mintRefused(refusal: RunnerTokenMintRefusal): Response {
19
+ if (refusal.retryAfterSeconds === undefined) return error(refusal.error, 403);
20
+ return Response.json({ error: refusal.error, retryAfterSeconds: refusal.retryAfterSeconds }, { status: 429, headers: { "Retry-After": String(refusal.retryAfterSeconds) } });
21
+ }
22
+
16
23
  export const getTokenMe: Handler = (req) => {
17
24
  const component = getComponentAuth(req);
18
25
  if (component) {
@@ -103,11 +110,12 @@ export const postRuntimeTokenRenew: Handler = async (req) => {
103
110
  const auth = getComponentAuth(req);
104
111
  if (!auth?.jti) return error("scoped runtime token required", 403);
105
112
  if (auth.role !== "provider") return error("provider runtime token required", 403);
106
- const renewed = await handoffTokenAsync({
113
+ const renewed = await handoffRunnerTokenAsync(auth.sub, {
107
114
  jti: auth.jti,
108
115
  allowedProfileIds: ["provider-agent", "provider-interactive"],
109
116
  createdBy: `renew:${auth.jti}`,
110
117
  });
118
+ if (renewed && "retryAfterSeconds" in renewed) return mintRefused({ error: "runtime token mint rate limited", ...renewed });
111
119
  if (!renewed) return error("runtime token cannot be renewed", 403);
112
120
  await auditEvent({
113
121
  // Keyed by the successor, so a replayed handoff (#1245) records one renewal.
@@ -151,7 +159,7 @@ export const postRuntimeTokenRemint: Handler = async (req) => {
151
159
  throw e;
152
160
  }
153
161
  const result = await remintRunnerRuntimeToken(auth, `remint:${auth.jti}`);
154
- if ("error" in result) return error(result.error, 403);
162
+ if ("error" in result) return mintRefused(result);
155
163
  if ("unchanged" in result) return json(result);
156
164
  await auditEvent({
157
165
  clientId: "server-runtime-token-remint-" + result.record.jti,
@@ -169,7 +177,7 @@ export const postRuntimeTokenRemint: Handler = async (req) => {
169
177
  export const postOrchestratorRunnerToken: Handler = async (req, params) => {
170
178
  const orch = getOrchestrator(params.id!);
171
179
  if (!orch) return error("orchestrator not found", 404);
172
- const denied = authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: orch.id } });
180
+ const denied = (await authorizeRoute(req, { scope: "command:write", resource: { orchestratorId: orch.id } }));
173
181
  if (denied) return denied;
174
182
  const parsed = await parseBody<unknown>(req);
175
183
  if (!parsed.ok) return error(parsed.error, parsed.status);
@@ -180,7 +188,7 @@ export const postOrchestratorRunnerToken: Handler = async (req, params) => {
180
188
  orchestratorId: orch.id,
181
189
  createdBy: `orchestrator-remint:${orch.id}`,
182
190
  });
183
- if ("error" in result) return error(result.error, 403);
191
+ if ("error" in result) return mintRefused(result);
184
192
  await auditEvent({
185
193
  clientId: "server-runner-token-remint-" + result.record.jti,
186
194
  kind: "state",
@@ -212,7 +220,7 @@ export const postInteractiveRunnerRuntimeToken: Handler = async (req) => {
212
220
  // (`isRootCredentialRequest` above), which can mint any token it likes anyway — the value is
213
221
  // pinned into the signature so every LATER, scoped read of it is unforgeable.
214
222
  const approvalMode = optionalEnum(parsed.body.approvalMode, "approvalMode", APPROVAL_MODES);
215
- const runtimeToken = issueInteractiveRunnerRuntimeToken({
223
+ const runtimeToken = (await issueInteractiveRunnerRuntimeToken({
216
224
  provider,
217
225
  cwd,
218
226
  runnerId,
@@ -221,7 +229,7 @@ export const postInteractiveRunnerRuntimeToken: Handler = async (req) => {
221
229
  host,
222
230
  ...(approvalMode ? { approvalMode } : {}),
223
231
  createdBy: `interactive:${runnerId}`,
224
- });
232
+ }));
225
233
  await auditEvent({
226
234
  clientId: "server-runtime-token-interactive-" + runnerId + "-" + Date.now(),
227
235
  kind: "state",
@@ -256,13 +264,13 @@ export const postMcpRuntimeToken: Handler = async (req) => {
256
264
  const agentId = cleanString(parsed.body.agentId, "agentId", { max: 240 });
257
265
  const targets = cleanStringArray(parsed.body.targets, "targets", { itemMax: 80, maxItems: 50 });
258
266
  const channels = cleanStringArray(parsed.body.channels, "channels", { itemMax: 80, maxItems: 50 });
259
- const runtimeToken = issueMcpRuntimeToken({
267
+ const runtimeToken = (await issueMcpRuntimeToken({
260
268
  sessionId,
261
269
  agentId,
262
270
  targets,
263
271
  channels,
264
272
  createdBy: `mcp:${sessionId}`,
265
- });
273
+ }));
266
274
  await auditEvent({
267
275
  clientId: "server-runtime-token-mcp-" + sessionId + "-" + Date.now(),
268
276
  kind: "state",
@@ -295,19 +303,19 @@ export const postIntegrationRuntimeToken: Handler = async (req) => {
295
303
  const name = cleanString(parsed.body.name, "name", { required: true, max: 120 })!;
296
304
  const targets = cleanStringArray(parsed.body.targets, "targets", { itemMax: 80, maxItems: 50 });
297
305
  const channels = cleanStringArray(parsed.body.channels, "channels", { itemMax: 80, maxItems: 50 });
298
- const runtimeToken = issueIntegrationRuntimeToken({
306
+ const runtimeToken = (await issueIntegrationRuntimeToken({
299
307
  name,
300
308
  targets,
301
309
  channels,
302
310
  createdBy: `integration:${name}`,
303
- });
304
- upsertIntegrationRegistry({
311
+ }));
312
+ (await upsertIntegrationRegistryAsync({
305
313
  name,
306
314
  scopes: runtimeToken.record.scope,
307
315
  targets,
308
316
  channels,
309
317
  source: "api",
310
- });
318
+ }));
311
319
  await auditEvent({
312
320
  clientId: "server-runtime-token-integration-" + name + "-" + Date.now(),
313
321
  kind: "state",
@@ -337,7 +345,7 @@ export const postTokenProfile: Handler = async (req) => {
337
345
  if (!parsed.ok) return error(parsed.error, parsed.status);
338
346
  try {
339
347
  const input = cleanTokenProfileInput(parsed.body);
340
- return json(upsertTokenProfile({
348
+ return json((await upsertTokenProfileAsync({
341
349
  id: input.id,
342
350
  name: input.name!,
343
351
  description: input.description,
@@ -346,7 +354,7 @@ export const postTokenProfile: Handler = async (req) => {
346
354
  constraints: input.constraints,
347
355
  ttlSeconds: input.ttlSeconds,
348
356
  createdBy: input.createdBy,
349
- }), 201);
357
+ })), 201);
350
358
  } catch (e) {
351
359
  if (e instanceof ValidationError) return error(e.message, 400);
352
360
  if (e instanceof Error) return error(e.message, 400);
@@ -359,7 +367,7 @@ export const patchTokenProfile: Handler = async (req, params) => {
359
367
  if (!parsed.ok) return error(parsed.error, parsed.status);
360
368
  try {
361
369
  const patch = cleanTokenProfileInput(parsed.body, true);
362
- const updated = updateTokenProfile(params.id!, {
370
+ const updated = (await updateTokenProfileAsync(params.id!, {
363
371
  name: patch.name,
364
372
  description: patch.description,
365
373
  role: patch.role,
@@ -367,7 +375,7 @@ export const patchTokenProfile: Handler = async (req, params) => {
367
375
  constraints: patch.constraints,
368
376
  ttlSeconds: patch.ttlSeconds,
369
377
  createdBy: patch.createdBy,
370
- });
378
+ }));
371
379
  return updated ? json(updated) : error("token profile not found", 404);
372
380
  } catch (e) {
373
381
  if (e instanceof ValidationError) return error(e.message, 400);
@@ -376,8 +384,8 @@ export const patchTokenProfile: Handler = async (req, params) => {
376
384
  }
377
385
  };
378
386
 
379
- export const deleteTokenProfileRoute: Handler = (_req, params) => {
380
- return deleteTokenProfile(params.id!) ? json({ ok: true }) : error("token profile not found or built-in", 404);
387
+ export const deleteTokenProfileRoute: Handler = async (_req, params) => {
388
+ return (await deleteTokenProfileAsync(params.id!)) ? json({ ok: true }) : error("token profile not found or built-in", 404);
381
389
  };
382
390
 
383
391
  export const postTokenRevoke: Handler = async (req, params) => {