@humwick/server 0.130.1 → 0.130.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (811) hide show
  1. package/README.md +5 -0
  2. package/bundled/prompts/manifest.json +1 -0
  3. package/bundled/prompts/task.hydration.md +1 -1
  4. package/bundled/roles/builder.md +1 -1
  5. package/docs/guides/sub-coordinators.md +12 -5
  6. package/docs/guides/tools-administration.md +4 -0
  7. package/docs/guides/tools-coordination.md +2 -0
  8. package/docs/guides/tools-tasks.md +8 -0
  9. package/docs/guides/workflows.md +74 -0
  10. package/docs/openapi.json +486 -4
  11. package/package.json +10 -18
  12. package/public/assets/{MessageBubble-BWpoBjl4.js → MessageBubble-Bq9kr21N.js} +2 -2
  13. package/public/assets/{PlanGraphPanel-C0auck3n.js → PlanGraphPanel-Dqiroy06.js} +2 -2
  14. package/public/assets/{TraceView-DBnOx7AQ.js → TraceView-DYU962-H.js} +2 -2
  15. package/public/assets/{VaultDecisionCard-0kp2oNBC.js → VaultDecisionCard-DhPfzioE.js} +2 -2
  16. package/public/assets/{activity-yLztXEBt.js → activity-DzCcQTee.js} +2 -2
  17. package/public/assets/{agent-lineage-BbJDR1dW.js → agent-lineage-SgDt9i3T.js} +2 -2
  18. package/public/assets/agent-liveness-Bq-s73jW.js +2 -0
  19. package/public/assets/{agent-name-CTZBrSD9.js → agent-name-CcY3Aijy.js} +2 -2
  20. package/public/assets/agent-profiles-cxtRBn6O.js +2 -0
  21. package/public/assets/{agent-project-badge-9TqzUUYE.js → agent-project-badge-DGYbIhaI.js} +2 -2
  22. package/public/assets/{agent-tools-D4n40pn8.js → agent-tools-DHbftV0N.js} +2 -2
  23. package/public/assets/{agent-type-icon-D6FUarOf.js → agent-type-icon-CY113sp-.js} +2 -2
  24. package/public/assets/{agents-BYDslkJc.js → agents-BPzY7IlQ.js} +2 -2
  25. package/public/assets/{analytics-B-XSbEMC.js → analytics-DENFPv_a.js} +2 -2
  26. package/public/assets/{artifact-viewer-DdWIfV6M.js → artifact-viewer-KRvSc7sl.js} +2 -2
  27. package/public/assets/{artifacts-DPN1q4pA.js → artifacts-C9gSmL3s.js} +2 -2
  28. package/public/assets/{artifacts-oBOqks-2.js → artifacts-DT-HkI5O.js} +2 -2
  29. package/public/assets/{automation-4KcRFXEu.js → automation-BsmjQhKD.js} +2 -2
  30. package/public/assets/{backlog-Cw9xPTCF.js → backlog-8NYH_62t.js} +2 -2
  31. package/public/assets/{busy-health-CTu32MZt.js → busy-health-D3hwvYb4.js} +2 -2
  32. package/public/assets/{channels-BiXzg1G9.js → channels-DCJ5WL7O.js} +2 -2
  33. package/public/assets/{chat-Ctk2qwvA.js → chat-DAIl357U.js} +3 -3
  34. package/public/assets/{code-preview-Bm1wWqAp.js → code-preview-CzrZfr9U.js} +2 -2
  35. package/public/assets/{connectors-C36ax4Vw.js → connectors-xTxtlyou.js} +2 -2
  36. package/public/assets/{cosmos-Jj9LK2Wf.js → cosmos-BpebFLK2.js} +2 -2
  37. package/public/assets/{crate-agent-H6S7-B9T.js → crate-agent-BHvI5wXC.js} +2 -2
  38. package/public/assets/{dependency-graph-Cd1E23wa.js → dependency-graph-DGT0o3wJ.js} +2 -2
  39. package/public/assets/{deploys-Bwfq146q.js → deploys-hqWOHSHE.js} +2 -2
  40. package/public/assets/{display-CfO7rTuF.js → display-CDeH4I8T.js} +2 -2
  41. package/public/assets/{files-DhhZI2Ih.js → files-BTeGVmTg.js} +2 -2
  42. package/public/assets/{fleet-B_rFEbnL.js → fleet-DgXtNgCa.js} +2 -2
  43. package/public/assets/{fleet-metrics-BkHP-P3R.js → fleet-metrics-BHEt5yc_.js} +2 -2
  44. package/public/assets/{formatted-body-Cm1RrzmN.js → formatted-body-MLtodyPp.js} +3 -3
  45. package/public/assets/{formatted-body-impl-DQiOuOD1.js → formatted-body-impl-CAe664Z8.js} +2 -2
  46. package/public/assets/{host-providers-dialog-CHqwXTov.js → host-providers-dialog-mapF4Fj9.js} +2 -2
  47. package/public/assets/index-CqqgOI5R.js +15 -0
  48. package/public/assets/index-MYAIwYTX.css +2 -0
  49. package/public/assets/{insights-fH1EL-qZ.js → insights-DNyf7IzF.js} +2 -2
  50. package/public/assets/{integrations-C5Oix6ng.js → integrations-DlYOHq7T.js} +2 -2
  51. package/public/assets/{issue-ref-chip-ODyondIa.js → issue-ref-chip-CeWBNWn7.js} +2 -2
  52. package/public/assets/{log-viewer-Cvfy6PW7.js → log-viewer-Cib8nqdE.js} +2 -2
  53. package/public/assets/{maintenance-D8CDH5wZ.js → maintenance-DSn1cPm7.js} +2 -2
  54. package/public/assets/{managed-agents-egllbpij.js → managed-agents-C3CkM81m.js} +2 -2
  55. package/public/assets/{markdown-preview-CYSFgVgK.js → markdown-preview-W4VQQPAv.js} +3 -3
  56. package/public/assets/{markdown-preview-impl-BteVIjX4.js → markdown-preview-impl-CMsTdhjq.js} +2 -2
  57. package/public/assets/{memory-C8WmXsyr.js → memory-BV17qtO4.js} +2 -2
  58. package/public/assets/{messages-BzQdqlO6.js → messages-Bm_1AqSA.js} +2 -2
  59. package/public/assets/{orchestrators-B1HxzkNw.js → orchestrators-Dg-vfP09.js} +2 -2
  60. package/public/assets/{overview-DCUnI4Z7.js → overview-DcYCrvlr.js} +2 -2
  61. package/public/assets/{pairs-ftCd2XcD.js → pairs-8o9nuG3V.js} +2 -2
  62. package/public/assets/{profile-icon-B2zH8DMH.js → profile-icon-BsRyBMea.js} +2 -2
  63. package/public/assets/project-profile-instructions-DETKFn_E.js +2 -0
  64. package/public/assets/projects-M_m6AHws.js +2 -0
  65. package/public/assets/{prompt-settings-Bftq9czX.js → prompt-settings-C_mNCgeL.js} +2 -2
  66. package/public/assets/provider-display-BEeLXC_D.js +2 -0
  67. package/public/assets/{registry-DWCU5c8q.js → registry-DDHHHE5N.js} +2 -2
  68. package/public/assets/run-card-Dt4I4jaP.js +2 -0
  69. package/public/assets/scroll-text-BKXS1ahr.js +2 -0
  70. package/public/assets/{secrets-C7GIUATz.js → secrets-BkVwxI5O.js} +2 -2
  71. package/public/assets/{service-access-settings-C3aujqTG.js → service-access-settings-Crq-6a-B.js} +2 -2
  72. package/public/assets/{settings-C6sZ9eBa.js → settings-CYcavMFu.js} +2 -2
  73. package/public/assets/shipping-H6gzEeZB.js +2 -0
  74. package/public/assets/{stats-V9Z-GxUd.js → stats-BJVeWkpV.js} +2 -2
  75. package/public/assets/{status-dot-CVv0iGHL.js → status-dot-BcHyw1Vw.js} +2 -2
  76. package/public/assets/store-DKPDIZBe.js +9 -0
  77. package/public/assets/{tasks-CXU75HRF.js → tasks-qJjlQPpx.js} +2 -2
  78. package/public/assets/{teams-BPf976zb.js → teams-Cd5Sk1uX.js} +2 -2
  79. package/public/assets/{terminal-viewer-DE9BOe-8.js → terminal-viewer-CpY5_m7W.js} +3 -3
  80. package/public/assets/{terminal-viewer-impl-D04pjmGh.js → terminal-viewer-impl-DI_2llFR.js} +2 -2
  81. package/public/assets/token-estimate-Co-Jdphh.js +2 -0
  82. package/public/assets/{use-agent-terminal-B1yR456R.js → use-agent-terminal-0yJA_buM.js} +2 -2
  83. package/public/assets/{use-decisions-D-S4tpDf.js → use-decisions-uJXHf34W.js} +2 -2
  84. package/public/assets/use-project-list-CpWl6eHQ.js +2 -0
  85. package/public/assets/{use-selectors-CnrAk2YP.js → use-selectors-BdxBW8mL.js} +2 -2
  86. package/public/assets/{user-avatar-nBFIcR4M.js → user-avatar-3IndfpOc.js} +2 -2
  87. package/public/assets/versioned-prompt-editor-CIVg7XB1.js +8 -0
  88. package/public/assets/{work-queue-TCjJxeT-.js → work-queue-B9rnLwHZ.js} +2 -2
  89. package/public/assets/{workflow-marker-Cf3Hf2fN.js → workflow-marker-X8wxyhzC.js} +2 -2
  90. package/public/assets/{workflows-CXQX20Qj.js → workflows-o5YyMFW7.js} +2 -2
  91. package/public/assets/{workspaces-qSYzKYMA.js → workspaces-CzEGoAng.js} +2 -2
  92. package/public/cosmos.html +4 -4
  93. package/public/index.html +31 -29
  94. package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
  95. package/runner/plugins/claude/hooks/gate-run-guard.provisioned.mjs +31 -1
  96. package/runner/src/adapters/claude-effort.ts +2 -4
  97. package/runner/src/adapters/claude-headless.ts +1 -1
  98. package/runner/src/adapters/claude-launch-exit.ts +26 -0
  99. package/runner/src/adapters/claude-session-probe.ts +1 -1
  100. package/runner/src/adapters/claude-tmux.ts +38 -10
  101. package/runner/src/adapters/claude.ts +28 -75
  102. package/runner/src/adapters/codex-launch-config.ts +4 -5
  103. package/runner/src/adapters/codex.ts +1 -1
  104. package/runner/src/adapters/opencode-provider.ts +7 -22
  105. package/runner/src/adapters/opencode.ts +4 -4
  106. package/runner/src/adapters/provider-quota-harvest.ts +20 -71
  107. package/runner/src/agent-runner/credentials.ts +42 -12
  108. package/runner/src/agent-runner/inbox.ts +27 -0
  109. package/runner/src/agent-runner/lifecycle-milestones.ts +2 -4
  110. package/runner/src/agent-runner/liveness-exchange.ts +104 -0
  111. package/runner/src/bin/claude.ts +4 -0
  112. package/runner/src/bin/codex.ts +4 -0
  113. package/runner/src/bin/opencode.ts +4 -0
  114. package/runner/src/claude-system-prompt.ts +49 -0
  115. package/runner/src/index.ts +5 -2
  116. package/runner/src/launch-assembly.ts +14 -10
  117. package/runner/src/profile-home.ts +1 -1
  118. package/runner/src/project-instructions.ts +2 -2
  119. package/runner/src/provider-command.ts +18 -0
  120. package/runner/src/provider-setup.ts +35 -0
  121. package/runner/src/providers.ts +2 -1
  122. package/runner/src/runner-core.ts +32 -38
  123. package/runner/src/runner-helpers.ts +0 -8
  124. package/runner/src/session-scratch.ts +6 -2
  125. package/runner/src/spawn-input.ts +2 -1
  126. package/runner/src/test-run-dedup.ts +59 -56
  127. package/runner/test-support/provisioning-context.ts +4 -2
  128. package/runner/test-support/runner-harness.ts +2 -1
  129. package/scripts/cd-config.ts +8 -0
  130. package/scripts/gate-run-lease.ts +10 -7
  131. package/scripts/gate.sh +5 -1
  132. package/scripts/steward-policy-cleanup.ts +2 -2
  133. package/src/agent-authz.ts +2 -2
  134. package/src/agent-drive-arbiter.ts +3 -8
  135. package/src/agent-exit-cleanup-async.ts +2 -2
  136. package/src/agent-exit-cleanup.ts +23 -19
  137. package/src/agent-lifecycle-events.ts +112 -85
  138. package/src/agent-ref.ts +3 -2
  139. package/src/agent-status-events.ts +43 -14
  140. package/src/auth/password.ts +4 -3
  141. package/src/auth/session-refresh.ts +1 -1
  142. package/src/auth/session.test-fixture.ts +2 -2
  143. package/src/auth/session.ts +7 -7
  144. package/src/automations/crud.ts +8 -81
  145. package/src/automations/dispatch.ts +33 -58
  146. package/src/automations/index.ts +1 -1
  147. package/src/automations/persistence.ts +65 -0
  148. package/src/automations/precheck.ts +18 -16
  149. package/src/automations/read-async.ts +11 -0
  150. package/src/automations/reconcile.ts +30 -39
  151. package/src/automations/storage.ts +33 -10
  152. package/src/automations/write-async.ts +33 -0
  153. package/src/branch-land-notice.ts +93 -0
  154. package/src/branch-landed.ts +31 -98
  155. package/src/bus.ts +40 -39
  156. package/src/cd-deploy-notify.ts +32 -4
  157. package/src/cd-host-lag-notify.ts +7 -6
  158. package/src/ci/incidents.ts +2 -2
  159. package/src/ci/monitor.ts +5 -8
  160. package/src/ci/notifications.ts +4 -4
  161. package/src/ci/root-missing.ts +4 -9
  162. package/src/ci/transition-notify.ts +12 -44
  163. package/src/claude-app/oauth-http.ts +3 -3
  164. package/src/cli/cd-pauses.ts +19 -0
  165. package/src/cli/orchestrator.ts +1 -1
  166. package/src/cli/state.ts +2 -19
  167. package/src/cli/task-edit.ts +22 -0
  168. package/src/cli/task.ts +3 -1
  169. package/src/cli/workflow.ts +19 -4
  170. package/src/commands-db.ts +7 -7
  171. package/src/commands-write.ts +8 -0
  172. package/src/compaction-watch.ts +10 -8
  173. package/src/config-store-write.ts +13 -1
  174. package/src/config-store.ts +25 -14
  175. package/src/config.ts +4 -11
  176. package/src/connectors.ts +10 -8
  177. package/src/context-advisory.ts +22 -21
  178. package/src/db/activity-async.ts +6 -1
  179. package/src/db/activity-write-ops.ts +12 -1
  180. package/src/db/activity.ts +1 -14
  181. package/src/db/agent-action-write.ts +36 -0
  182. package/src/db/agent-control-async.ts +9 -0
  183. package/src/db/agent-control-write.ts +49 -0
  184. package/src/db/agent-effort-observe.ts +22 -0
  185. package/src/db/agent-meta.ts +14 -3
  186. package/src/db/agent-search.ts +1 -15
  187. package/src/db/agents-async.ts +59 -9
  188. package/src/db/agents-write-ops.ts +12 -3
  189. package/src/db/agents.ts +95 -65
  190. package/src/db/auth-identities.ts +2 -2
  191. package/src/db/automation-read-ops.ts +11 -0
  192. package/src/db/automation-write-ops.ts +46 -0
  193. package/src/db/blackboard.ts +2 -2
  194. package/src/db/browser-session-write.ts +32 -0
  195. package/src/db/bus-outbox-write-ops.ts +3 -1
  196. package/src/db/checkout-refresh-schema.ts +47 -0
  197. package/src/db/checkout-refresh.ts +5 -5
  198. package/src/db/ci-incidents-async.ts +5 -5
  199. package/src/db/ci-incidents-write-ops.ts +2 -2
  200. package/src/db/command-agent-profile-backfill.ts +39 -0
  201. package/src/db/command-agent-profiles.ts +5 -1
  202. package/src/db/command-retention.ts +126 -0
  203. package/src/db/command-row.ts +10 -2
  204. package/src/db/commands-list-query.ts +2 -0
  205. package/src/db/commands-planner-stats.test-fixture.ts +8 -0
  206. package/src/db/commands-read-ops.ts +16 -0
  207. package/src/db/commands-spawn-read.ts +1 -1
  208. package/src/db/config-store-write-ops.ts +7 -2
  209. package/src/db/connection.ts +1 -182
  210. package/src/db/context-carry-write.ts +74 -0
  211. package/src/db/continuation-archives-async.ts +5 -0
  212. package/src/db/continuation-archives-write-ops.ts +7 -0
  213. package/src/db/continuations.ts +6 -6
  214. package/src/db/db-error-registry.ts +12 -0
  215. package/src/db/db-writer-worker.ts +8 -1
  216. package/src/db/deploy-events-async.ts +1 -0
  217. package/src/db/deploy-events-read-ops.ts +2 -1
  218. package/src/db/deploy-events.ts +35 -4
  219. package/src/db/gateway.ts +26 -133
  220. package/src/db/history-retention-ops.ts +13 -0
  221. package/src/db/hosts-registration.ts +10 -2
  222. package/src/db/hosts.ts +9 -6
  223. package/src/db/inbox-async.ts +2 -2
  224. package/src/db/inbox-read-ops.ts +1 -1
  225. package/src/db/inbox.ts +9 -17
  226. package/src/db/index.ts +2 -0
  227. package/src/db/integrations-async.ts +8 -0
  228. package/src/db/integrations-ops.ts +15 -0
  229. package/src/db/integrations.ts +15 -21
  230. package/src/db/issue-associations.ts +2 -2
  231. package/src/db/issue-lifecycle.ts +3 -4
  232. package/src/db/issue-refs-async.ts +23 -0
  233. package/src/db/issue-refs-read-ops.ts +6 -0
  234. package/src/db/issue-refs-write-ops.ts +29 -0
  235. package/src/db/issue-refs.ts +15 -16
  236. package/src/db/kernel-event-log-schema.ts +2 -0
  237. package/src/db/land-boundaries.ts +51 -5
  238. package/src/db/land-gate-attestations.ts +2 -2
  239. package/src/db/landing-receipts.ts +2 -2
  240. package/src/db/lifecycle-context-write.ts +5 -0
  241. package/src/db/lifecycle-tail-async.ts +76 -0
  242. package/src/db/lifecycle-tail-write-ops.ts +62 -0
  243. package/src/db/lifecycle-write-window.ts +2 -1
  244. package/src/db/lineage-pair-dedupe-sql.ts +3 -3
  245. package/src/db/long-running-work.ts +2 -2
  246. package/src/db/main-connection-mode.ts +11 -0
  247. package/src/db/main-connection-writes.ts +41 -2
  248. package/src/db/maintenance-job-reconcile.ts +61 -0
  249. package/src/db/maintenance-job-runs-async.ts +14 -0
  250. package/src/db/maintenance-job-write-ops.ts +9 -0
  251. package/src/db/maintenance-pauses.ts +2 -2
  252. package/src/db/mappers.ts +2 -14
  253. package/src/db/merge-lease.ts +1 -15
  254. package/src/db/message-send.ts +4 -0
  255. package/src/db/messages.ts +31 -25
  256. package/src/db/migrations.ts +25 -16
  257. package/src/db/notification-write-ops.ts +19 -0
  258. package/src/db/operator-answer-write.ts +19 -0
  259. package/src/db/orchestrators.ts +14 -76
  260. package/src/db/pairs-async.ts +22 -1
  261. package/src/db/pairs-write-ops.ts +8 -3
  262. package/src/db/pairs.ts +42 -61
  263. package/src/db/plan-dispatch-schema.ts +5 -1
  264. package/src/db/plan-ready-notices.ts +43 -0
  265. package/src/db/plan-tools-include-migration.ts +36 -0
  266. package/src/db/plans-write-ops.ts +2 -0
  267. package/src/db/presence-buffer.ts +5 -0
  268. package/src/db/presence-loop.ts +18 -23
  269. package/src/db/presence-write.ts +0 -6
  270. package/src/db/project-entries-async.ts +14 -0
  271. package/src/db/project-entries-read-ops.ts +5 -1
  272. package/src/db/project-entries-write-ops.ts +8 -0
  273. package/src/db/project-entries.ts +15 -12
  274. package/src/db/project-journal.ts +2 -2
  275. package/src/db/project-profile-instructions.ts +50 -0
  276. package/src/db/project-trust-approvals.ts +2 -2
  277. package/src/db/prompt-templates.ts +4 -4
  278. package/src/db/prompt-versions.ts +9 -2
  279. package/src/db/provider-config-history.ts +8 -3
  280. package/src/db/provider-model-seed.ts +34 -0
  281. package/src/db/read-op-marshaling-fixtures.ts +23 -0
  282. package/src/db/read-ops.ts +8 -0
  283. package/src/db/retention.ts +13 -2
  284. package/src/db/review-publish-write.ts +8 -0
  285. package/src/db/routing-policy.ts +2 -3
  286. package/src/db/runtime-admin-async.ts +19 -0
  287. package/src/db/runtime-admin-write-ops.ts +36 -0
  288. package/src/db/runtime-tail-async.ts +288 -0
  289. package/src/db/runtime-tail-write-ops.ts +97 -0
  290. package/src/db/schema.ts +13 -4
  291. package/src/db/spawn-budget.ts +5 -0
  292. package/src/db/spawn-delegation-state.ts +11 -4
  293. package/src/db/spawn-delegation.ts +1 -11
  294. package/src/db/sql-audit-indexes.ts +3 -0
  295. package/src/db/stats-async.ts +9 -6
  296. package/src/db/task-entity.ts +28 -6
  297. package/src/db/task-list.ts +3 -1
  298. package/src/db/tasks.ts +1 -17
  299. package/src/db/team-claim-policy.ts +60 -0
  300. package/src/db/teams-async.ts +4 -0
  301. package/src/db/teams-write-ops.ts +4 -0
  302. package/src/db/terminal-events.ts +15 -0
  303. package/src/db/timer-cutover-bodies.ts +292 -0
  304. package/src/db/timer-cutover-core.ts +37 -278
  305. package/src/db/timer-cutover-state.ts +40 -0
  306. package/src/db/timer-cutover-write-ops.ts +1 -40
  307. package/src/db/timer-ingress.ts +7 -1
  308. package/src/db/token-db-write-ops.ts +19 -0
  309. package/src/db/token-standing-async.ts +12 -0
  310. package/src/db/token-standing.ts +21 -20
  311. package/src/db/token-usage-retention.ts +33 -0
  312. package/src/db/token-usage-write-ops.ts +1 -1
  313. package/src/db/token-usage.ts +4 -1
  314. package/src/db/user-invites-async.ts +13 -0
  315. package/src/db/user-invites.ts +3 -3
  316. package/src/db/users.ts +14 -6
  317. package/src/db/workflow-contact.ts +1 -1
  318. package/src/db/workflow-task-read-ops.ts +30 -0
  319. package/src/db/workspaces.ts +8 -5
  320. package/src/db/write-ops.ts +37 -12
  321. package/src/db/writer-fault-seam.ts +2 -9
  322. package/src/db/writer-fault-test-ops.ts +18 -0
  323. package/src/db/writer-gateway.ts +58 -56
  324. package/src/dev.ts +8 -3
  325. package/src/dispatch-availability.ts +10 -6
  326. package/src/ephemeral/{landing-ingress-proof-worker.ts → landing-ingress-proof.test-fixture.ts} +4 -2
  327. package/src/event-loop-lag.ts +4 -2
  328. package/src/event-loop-yield.ts +2 -2
  329. package/src/events.ts +10 -8
  330. package/src/host/disk-alert.ts +121 -0
  331. package/src/host-provider-store.ts +5 -4
  332. package/src/hub-metrics-report.ts +5 -1
  333. package/src/hub-metrics.ts +38 -18
  334. package/src/injection-sweep-pacing.ts +6 -8
  335. package/src/land-gate-notifications.ts +11 -10
  336. package/src/land-gate-queue-progress.ts +3 -3
  337. package/src/land-settle-dispatch.ts +52 -92
  338. package/src/lifecycle-context-pressure.ts +11 -10
  339. package/src/lifecycle-manager.ts +107 -100
  340. package/src/maintenance/breaker.ts +18 -16
  341. package/src/maintenance/cd-watcher.ts +3 -3
  342. package/src/maintenance/checkout-refresh.ts +18 -1
  343. package/src/maintenance/critical-job-watchdog.ts +19 -20
  344. package/src/maintenance/events.ts +3 -3
  345. package/src/maintenance/history-retention-job.ts +30 -0
  346. package/src/maintenance/index.ts +1 -0
  347. package/src/maintenance/jobs.ts +32 -69
  348. package/src/maintenance/long-running-work.ts +3 -1
  349. package/src/maintenance/offline-agent-prune-job.ts +28 -0
  350. package/src/maintenance/orphaned-sessions.ts +5 -4
  351. package/src/maintenance/pauses.ts +4 -10
  352. package/src/maintenance/plan-ready-notice-job.ts +71 -0
  353. package/src/maintenance/scheduler.ts +98 -137
  354. package/src/maintenance/stalled-delivery-pager.ts +10 -9
  355. package/src/maintenance/teams.ts +19 -30
  356. package/src/maintenance/workspaces.ts +18 -28
  357. package/src/managed-policy-escalation.ts +7 -7
  358. package/src/managed-policy.ts +32 -28
  359. package/src/managed-provider-gate.ts +5 -4
  360. package/src/managed-spawn-reservation.ts +5 -4
  361. package/src/mcp/index.ts +12 -9
  362. package/src/mcp/output-descriptions.ts +8 -8
  363. package/src/mcp/presentation.ts +6 -5
  364. package/src/mcp/project-profile-instructions.ts +32 -0
  365. package/src/mcp/runtime-output.ts +6 -1
  366. package/src/mcp/self-care-visibility.ts +2 -2
  367. package/src/mcp/spawn-targets-matrix.ts +10 -1
  368. package/src/mcp/tool-groups.ts +4 -3
  369. package/src/mcp/tool-roles.ts +81 -0
  370. package/src/mcp/tools-spawn.ts +4 -3
  371. package/src/mcp/tools-workspace.ts +1 -1
  372. package/src/mcp-agent-action.ts +1 -2
  373. package/src/mcp-blackboard-tools.ts +6 -5
  374. package/src/mcp-decision-tools.ts +7 -7
  375. package/src/mcp-egress-tools.ts +10 -9
  376. package/src/mcp-issue-activity-tools.ts +2 -2
  377. package/src/mcp-issue-association-tools.ts +4 -4
  378. package/src/mcp-issue-ref-tools.ts +13 -12
  379. package/src/mcp-maintenance-tools.ts +2 -2
  380. package/src/mcp-merge-tools.ts +5 -5
  381. package/src/mcp-notification-subscription-tools.ts +14 -15
  382. package/src/mcp-output-levels.test-fixture.ts +1 -1
  383. package/src/mcp-profile-trust-tools.ts +5 -5
  384. package/src/mcp-project-journal-tools.ts +4 -12
  385. package/src/mcp-project-tools.ts +17 -18
  386. package/src/mcp-provider-catalog.ts +2 -2
  387. package/src/mcp-routing-policy-tools.ts +3 -2
  388. package/src/mcp-task-tools.ts +11 -5
  389. package/src/mcp-team-template-tools.ts +3 -3
  390. package/src/mcp-team-tools.ts +6 -6
  391. package/src/mcp-workflow-tools.ts +13 -4
  392. package/src/memory-area-injection.ts +13 -12
  393. package/src/memory-boundary-capture.ts +6 -6
  394. package/src/memory-injection.ts +45 -43
  395. package/src/merge-pause-maintenance.ts +5 -4
  396. package/src/notification-router.ts +44 -17
  397. package/src/notification-types.ts +2 -1
  398. package/src/notify.ts +5 -5
  399. package/src/observed-reset-refresh.ts +4 -4
  400. package/src/operator-alarm.ts +23 -11
  401. package/src/project-ingest.ts +6 -6
  402. package/src/project-instructions.ts +12 -1
  403. package/src/project-profile-instruction-text.ts +6 -0
  404. package/src/project-profile-instructions.ts +20 -0
  405. package/src/project-trust.ts +12 -11
  406. package/src/prompt-resolver.ts +3 -3
  407. package/src/provider-catalog-store.ts +3 -49
  408. package/src/provider-config-store.ts +12 -11
  409. package/src/provider-model-seed.ts +1 -18
  410. package/src/provider-quota-async.ts +5 -7
  411. package/src/provider-quota-config-store.ts +5 -4
  412. package/src/provider-secrets.test-fixture.ts +3 -3
  413. package/src/provider-timeline-event.ts +4 -7
  414. package/src/quota-band-delivery.ts +2 -2
  415. package/src/recipe-runner.ts +6 -5
  416. package/src/repo-config-source.ts +10 -4
  417. package/src/retention-config-store.ts +4 -3
  418. package/src/reviewer-pipeline.ts +11 -10
  419. package/src/routes/_route.ts +4 -4
  420. package/src/routes/_shared.ts +13 -12
  421. package/src/routes/agent-effort.ts +5 -5
  422. package/src/routes/agent-heartbeat-quota.ts +23 -0
  423. package/src/routes/agent-keep.ts +1 -1
  424. package/src/routes/agent-profiles.ts +6 -6
  425. package/src/routes/agent-reporting.ts +1 -1
  426. package/src/routes/agent-self-effort.ts +5 -5
  427. package/src/routes/agent-sessions.ts +24 -24
  428. package/src/routes/agents-spawn.ts +2 -2
  429. package/src/routes/agents.ts +19 -121
  430. package/src/routes/auth.ts +14 -15
  431. package/src/routes/authority-audit.ts +2 -2
  432. package/src/routes/automations.ts +6 -5
  433. package/src/routes/channel-binding-delete.ts +1 -1
  434. package/src/routes/channel-output.ts +3 -3
  435. package/src/routes/claude-api-budget.ts +5 -5
  436. package/src/routes/commands-listing.ts +5 -1
  437. package/src/routes/commands.ts +31 -29
  438. package/src/routes/context-resets.ts +2 -2
  439. package/src/routes/continuation-archives.ts +2 -2
  440. package/src/routes/coordinator-teams.ts +1 -1
  441. package/src/routes/decisions.ts +2 -2
  442. package/src/routes/host-secret-files.ts +1 -1
  443. package/src/routes/hosts.ts +11 -11
  444. package/src/routes/inbox.ts +3 -2
  445. package/src/routes/index.ts +12 -2
  446. package/src/routes/integrations.ts +32 -56
  447. package/src/routes/issue-activity.ts +2 -2
  448. package/src/routes/issue-associations.ts +4 -4
  449. package/src/routes/issue-refs.ts +9 -9
  450. package/src/routes/kernel-timers-operator.ts +1 -1
  451. package/src/routes/memory.ts +1 -1
  452. package/src/routes/merges.ts +11 -11
  453. package/src/routes/messages.ts +23 -17
  454. package/src/routes/orchestrator-bootstrap.ts +2 -2
  455. package/src/routes/orchestrator-host-registration.ts +4 -2
  456. package/src/routes/orchestrator-host-utilization.ts +5 -3
  457. package/src/routes/orchestrator-proxy.ts +4 -4
  458. package/src/routes/orchestrator.ts +28 -19
  459. package/src/routes/pairs.ts +8 -8
  460. package/src/routes/project-profile-instructions.ts +27 -0
  461. package/src/routes/project-trust.ts +3 -3
  462. package/src/routes/projects.ts +16 -16
  463. package/src/routes/prompt-templates.ts +12 -12
  464. package/src/routes/provider-config.ts +6 -6
  465. package/src/routes/provider-quota-config.ts +2 -2
  466. package/src/routes/provider-quotas.ts +10 -10
  467. package/src/routes/run-command.ts +1 -1
  468. package/src/routes/secrets-backup.ts +2 -2
  469. package/src/routes/secrets-import.ts +1 -1
  470. package/src/routes/secrets-vault.ts +7 -7
  471. package/src/routes/settings.ts +6 -6
  472. package/src/routes/shipping.ts +9 -1
  473. package/src/routes/spawn-policy.ts +8 -7
  474. package/src/routes/sse.ts +2 -2
  475. package/src/routes/stats.ts +6 -6
  476. package/src/routes/task-http.ts +15 -1
  477. package/src/routes/task-issues.ts +11 -26
  478. package/src/routes/tasks.ts +22 -53
  479. package/src/routes/team-templates.ts +12 -12
  480. package/src/routes/teams-config.ts +2 -2
  481. package/src/routes/teams.ts +10 -10
  482. package/src/routes/tokens.ts +30 -22
  483. package/src/routes/users.ts +24 -24
  484. package/src/routes/viewer-read.ts +3 -3
  485. package/src/routes/web-tool-calls.ts +4 -4
  486. package/src/routes/workflows.ts +22 -7
  487. package/src/routes/workspaces.ts +17 -16
  488. package/src/routing-policy-normalize.ts +1 -2
  489. package/src/routing-policy-push.ts +6 -6
  490. package/src/routing-step-defaults.ts +0 -2
  491. package/src/runner-token-mint-limit.ts +63 -0
  492. package/src/runtime-grant.ts +21 -13
  493. package/src/runtime-tokens.ts +59 -35
  494. package/src/secrets-broker/config.ts +1 -1
  495. package/src/secrets-broker/service.ts +2 -2
  496. package/src/security.ts +16 -21
  497. package/src/self-resume-carry.ts +21 -110
  498. package/src/self-resume-supersede.ts +4 -3
  499. package/src/self-resume.ts +54 -66
  500. package/src/server-background.ts +2 -2
  501. package/src/server.ts +26 -24
  502. package/src/services/agent-action.ts +12 -31
  503. package/src/services/agent-effort.ts +7 -32
  504. package/src/services/agent-hang-watchdog-job.ts +2 -2
  505. package/src/services/agent-heartbeat.ts +166 -0
  506. package/src/services/agent-reporting.ts +1 -1
  507. package/src/services/browser-inventory.ts +3 -3
  508. package/src/services/browser-session-state.ts +3 -2
  509. package/src/services/browser-session.ts +21 -27
  510. package/src/services/bus-command-update.ts +9 -9
  511. package/src/services/checkout-refresh-state.ts +1 -0
  512. package/src/services/checkout-refresh.test-fixture.ts +3 -2
  513. package/src/services/command-host.ts +7 -2
  514. package/src/services/coordinator-digest.ts +3 -2
  515. package/src/services/dispatch-command.ts +12 -13
  516. package/src/services/effective-launch-driver.ts +14 -9
  517. package/src/services/host-changed-paths.test-fixture.ts +5 -6
  518. package/src/services/host-project-readiness.ts +2 -2
  519. package/src/services/host-providers.ts +1 -1
  520. package/src/services/host-utilization.ts +27 -4
  521. package/src/services/idle-agent-digest.ts +17 -12
  522. package/src/services/idle-epics.ts +9 -10
  523. package/src/services/interrupt-agent.ts +12 -9
  524. package/src/services/issue-activity.ts +3 -3
  525. package/src/services/issue-associations.ts +15 -18
  526. package/src/services/issue-lifecycle-comments.ts +3 -2
  527. package/src/services/issue-lifecycle.ts +69 -72
  528. package/src/services/issue-refs.ts +10 -15
  529. package/src/services/kernel-timers-cutover-chaos-worker.ts +11 -8
  530. package/src/services/kernel-timers-ingress-chaos-worker.ts +6 -1
  531. package/src/services/kernel-timers-ingress.ts +4 -4
  532. package/src/services/kernel-timers-message-authority-chaos-worker.ts +3 -10
  533. package/src/services/kernel-timers-operator-chaos-worker.ts +3 -2
  534. package/src/services/kernel-timers-outbox.ts +1 -1
  535. package/src/services/kernel-timers-stage10-operator.ts +1 -1
  536. package/src/services/kernel-timers.ts +4 -3
  537. package/src/services/land-gate-placement.ts +11 -2
  538. package/src/services/land-issue-relations.ts +5 -4
  539. package/src/services/land-restart-retry.ts +7 -6
  540. package/src/services/landed-ancestry.ts +25 -8
  541. package/src/services/legacy-landing-host.ts +4 -1
  542. package/src/services/legacy-landing-recovery.ts +8 -6
  543. package/src/services/managed-running.ts +17 -17
  544. package/src/services/memory-areas.ts +17 -53
  545. package/src/services/merge-pause.ts +9 -15
  546. package/src/services/operator-decisions.ts +37 -41
  547. package/src/services/orchestrator-registration-recovery.ts +6 -2
  548. package/src/services/orchestrator-upgrade.ts +14 -12
  549. package/src/services/permission-decision.ts +4 -3
  550. package/src/services/plan-ci-notice.ts +57 -0
  551. package/src/services/plan-ci-recovery.ts +2 -55
  552. package/src/services/plan-conformance.ts +4 -4
  553. package/src/services/plan-dispatch-policy.ts +10 -3
  554. package/src/services/plan-dispatch.ts +35 -14
  555. package/src/services/plan-graph.ts +39 -261
  556. package/src/services/plan-import.ts +1 -1
  557. package/src/services/plan-live-bindings.ts +8 -37
  558. package/src/services/plan-task-create.ts +1 -1
  559. package/src/services/plan-terminal-refs.ts +2 -12
  560. package/src/services/plan-wake-digest.ts +9 -3
  561. package/src/services/profile-trust.ts +6 -5
  562. package/src/services/project-config-read.ts +70 -0
  563. package/src/services/project-profile-instructions.ts +54 -0
  564. package/src/services/project.ts +11 -10
  565. package/src/services/prompt-templates.ts +6 -5
  566. package/src/services/provider-hold-nudge.ts +9 -9
  567. package/src/services/provider-hold-record.ts +13 -12
  568. package/src/services/provider-state-audit.ts +19 -18
  569. package/src/services/provisioning-harness/budget-baseline.json +4 -4
  570. package/src/services/provisioning-harness/driver.ts +1 -1
  571. package/src/services/provisioning-harness/fixture-matrix.ts +3 -3
  572. package/src/services/provisioning-harness/lifecycle.ts +24 -22
  573. package/src/services/provisioning-harness/prepare.ts +16 -17
  574. package/src/services/rate-limit-resume.ts +10 -9
  575. package/src/services/red-main-auto-revert.ts +7 -5
  576. package/src/services/red-main-controller-deps.ts +20 -3
  577. package/src/services/red-main-incident.ts +3 -1
  578. package/src/services/red-main-quarantine.ts +2 -3
  579. package/src/services/register-agent.ts +22 -22
  580. package/src/services/restart-project-role.ts +1 -1
  581. package/src/services/restart-spawn.ts +74 -61
  582. package/src/services/review-publish.ts +7 -24
  583. package/src/services/review-ref-reconcile.ts +29 -38
  584. package/src/services/runtime-dependency-alert.ts +27 -0
  585. package/src/services/scheduler-command.ts +11 -9
  586. package/src/services/scheduler.ts +5 -5
  587. package/src/services/self-care-state.ts +2 -1
  588. package/src/services/self-effort-grant.ts +5 -25
  589. package/src/services/self-effort.ts +5 -5
  590. package/src/services/send-message.ts +21 -34
  591. package/src/services/shutdown-agent.ts +17 -14
  592. package/src/services/spawn-agent.ts +25 -43
  593. package/src/services/spawn-chain-inspector.ts +7 -14
  594. package/src/services/spawn-cwd-placement.ts +21 -5
  595. package/src/services/spawn-issue-activity.ts +8 -6
  596. package/src/services/spawn-launch.ts +17 -1
  597. package/src/services/spawn-loss-escalation.ts +1 -1
  598. package/src/services/spawn-policy.ts +68 -0
  599. package/src/services/spawn-registration-watchdog.ts +2 -2
  600. package/src/services/spawn-repo-probe.ts +7 -5
  601. package/src/services/spawn-tree-cleanup.ts +8 -9
  602. package/src/services/steward-reaper.ts +4 -4
  603. package/src/services/task-context-hydration.ts +25 -1
  604. package/src/services/task-delivery.ts +20 -34
  605. package/src/services/task-dispatch.ts +3 -0
  606. package/src/services/task-entity.ts +40 -203
  607. package/src/services/task-issue-link.ts +13 -20
  608. package/src/services/task-issue-weave.ts +12 -11
  609. package/src/services/task-lifecycle.ts +27 -31
  610. package/src/services/task-repo-cwd.ts +37 -0
  611. package/src/services/task-review-hold.ts +4 -17
  612. package/src/services/task-semantic-events.ts +13 -11
  613. package/src/services/task-state-reconcile.ts +8 -17
  614. package/src/services/task-validation.ts +2 -2
  615. package/src/services/team-templates.ts +12 -11
  616. package/src/services/team.ts +31 -98
  617. package/src/services/terminal-provider-exit.ts +6 -5
  618. package/src/services/timer-message-fire-chaos-worker.ts +7 -3
  619. package/src/services/timer-message-fire-outbox.ts +1 -1
  620. package/src/services/transient-agent-reaper.ts +25 -20
  621. package/src/services/turn-reconcile-audit.ts +9 -9
  622. package/src/services/user-onboarding.ts +8 -6
  623. package/src/services/user-profile.ts +6 -9
  624. package/src/services/work-finality.ts +16 -4
  625. package/src/services/workflow-auto-start.ts +26 -13
  626. package/src/services/workflow-caller.ts +61 -4
  627. package/src/services/workflow-child-proof-worker.ts +1 -1
  628. package/src/services/workflow-ci-main.ts +1 -1
  629. package/src/services/workflow-control-proof-worker.ts +1 -1
  630. package/src/services/workflow-coordinator.ts +8 -2
  631. package/src/services/workflow-decisions.ts +5 -5
  632. package/src/services/workflow-deferred-cleanup.ts +5 -3
  633. package/src/services/workflow-effect-driver.ts +42 -17
  634. package/src/services/workflow-effects.ts +58 -37
  635. package/src/services/workflow-land-notice.ts +10 -0
  636. package/src/services/workflow-pause-text.ts +43 -0
  637. package/src/services/workflow-pins.ts +7 -4
  638. package/src/services/workflow-reconcile.ts +14 -11
  639. package/src/services/workflow-resume-pins.ts +3 -3
  640. package/src/services/workflow-routing-defaults.ts +18 -0
  641. package/src/services/workflow-run-view.ts +6 -3
  642. package/src/services/workflow-run.test-fixture.ts +1 -1
  643. package/src/services/workflow-runs.ts +61 -33
  644. package/src/services/workflow-supervisor-state.ts +26 -1
  645. package/src/services/workflow-supervisor.ts +11 -6
  646. package/src/services/workspace-recovery.ts +4 -3
  647. package/src/settings/registry.ts +1 -2
  648. package/src/spawn-admission.ts +10 -2
  649. package/src/spawn-command.ts +4 -4
  650. package/src/spawn-models.ts +10 -12
  651. package/src/spawn-placement.ts +28 -10
  652. package/src/spawn-targets.ts +9 -9
  653. package/src/sse-agent-status.ts +15 -6
  654. package/src/sse.ts +49 -24
  655. package/src/startup-context-injection.ts +62 -57
  656. package/src/state-adoption/cd-cutover.ts +53 -7
  657. package/src/state-adoption/fleet-cutover.ts +35 -0
  658. package/src/state-adoption/fleet-plan.ts +36 -0
  659. package/src/state-adoption/index.ts +2 -2
  660. package/src/state-adoption/linux-plan.ts +2 -2
  661. package/src/state-adoption/linux.ts +2 -2
  662. package/src/state-adoption/macos-plan.ts +2 -2
  663. package/src/state-adoption/macos.ts +1 -1
  664. package/src/steward-handoff.ts +4 -3
  665. package/src/steward-policy-cleanup.ts +9 -8
  666. package/src/steward.ts +9 -8
  667. package/src/task-dispatch-live.ts +6 -3
  668. package/src/task-dispatcher.ts +3 -3
  669. package/src/teams-config-store.ts +4 -3
  670. package/src/token-db-write.ts +10 -0
  671. package/src/token-db.ts +2 -2
  672. package/src/token-usage-async.ts +2 -4
  673. package/src/user-awaiting-reply.ts +5 -5
  674. package/src/workspace-actions.ts +24 -29
  675. package/src/workspace-auto-merge.ts +14 -12
  676. package/src/workspace-changed-paths-client.ts +16 -5
  677. package/src/workspace-cleanup-stale.ts +30 -7
  678. package/src/workspace-command-settle.ts +26 -17
  679. package/src/workspace-config.ts +1 -1
  680. package/src/workspace-conflict-resolver.ts +9 -7
  681. package/src/workspace-dead-owner-recovery.ts +5 -4
  682. package/src/workspace-escalation.ts +12 -11
  683. package/src/workspace-human-escalation.ts +3 -3
  684. package/src/workspace-land-gate-watchdog.ts +3 -3
  685. package/src/workspace-land-refusal.ts +20 -0
  686. package/src/workspace-land-stopped.ts +1 -0
  687. package/src/workspace-merge.ts +10 -26
  688. package/src/workspace-nothing-to-land-notice.ts +2 -2
  689. package/src/workspace-orphans.ts +18 -37
  690. package/src/workspace-pr-completion.ts +10 -8
  691. package/src/workspace-rekey.ts +3 -3
  692. package/src/workspace-steward-failure.ts +2 -2
  693. package/src/workspace-steward-wake.ts +4 -4
  694. package/node_modules/@humwick/kernel/LICENSE +0 -167
  695. package/node_modules/@humwick/kernel/async-entity-persistence.ts +0 -344
  696. package/node_modules/@humwick/kernel/async-event-log.ts +0 -107
  697. package/node_modules/@humwick/kernel/automations.pilot.ts +0 -147
  698. package/node_modules/@humwick/kernel/config.ts +0 -111
  699. package/node_modules/@humwick/kernel/contract.ts +0 -572
  700. package/node_modules/@humwick/kernel/control-authz.ts +0 -281
  701. package/node_modules/@humwick/kernel/control.ts +0 -645
  702. package/node_modules/@humwick/kernel/effects.ts +0 -493
  703. package/node_modules/@humwick/kernel/event-log.ts +0 -319
  704. package/node_modules/@humwick/kernel/http-transport.ts +0 -384
  705. package/node_modules/@humwick/kernel/identity-grammar.ts +0 -20
  706. package/node_modules/@humwick/kernel/identity.ts +0 -248
  707. package/node_modules/@humwick/kernel/index.ts +0 -28
  708. package/node_modules/@humwick/kernel/kernel-persistence.ts +0 -181
  709. package/node_modules/@humwick/kernel/landing-incident.ts +0 -306
  710. package/node_modules/@humwick/kernel/landing.ts +0 -953
  711. package/node_modules/@humwick/kernel/manifest-validation.ts +0 -460
  712. package/node_modules/@humwick/kernel/mcp-transport.ts +0 -109
  713. package/node_modules/@humwick/kernel/message-authority-chaos-worker.ts +0 -200
  714. package/node_modules/@humwick/kernel/message-authority.ts +0 -281
  715. package/node_modules/@humwick/kernel/module-host.ts +0 -722
  716. package/node_modules/@humwick/kernel/openapi-init.ts +0 -14
  717. package/node_modules/@humwick/kernel/package.json +0 -39
  718. package/node_modules/@humwick/kernel/persistence-schema.ts +0 -248
  719. package/node_modules/@humwick/kernel/persistence.ts +0 -510
  720. package/node_modules/@humwick/kernel/registry.ts +0 -60
  721. package/node_modules/@humwick/kernel/sqlite-kernel-persistence.ts +0 -499
  722. package/node_modules/@humwick/kernel/sqlite-module-host.ts +0 -87
  723. package/node_modules/@humwick/kernel/timers-chaos-worker.ts +0 -186
  724. package/node_modules/@humwick/kernel/timers.pilot.ts +0 -1411
  725. package/node_modules/@humwick/kernel/workflow-activation.ts +0 -25
  726. package/node_modules/@humwick/kernel/workflow-backstop.ts +0 -40
  727. package/node_modules/@humwick/kernel/workflow-cancel-tree.ts +0 -20
  728. package/node_modules/@humwick/kernel/workflow-chaos-worker.ts +0 -213
  729. package/node_modules/@humwick/kernel/workflow-composition.ts +0 -231
  730. package/node_modules/@humwick/kernel/workflow-container.ts +0 -72
  731. package/node_modules/@humwick/kernel/workflow-control.test-fixture.ts +0 -42
  732. package/node_modules/@humwick/kernel/workflow-control.ts +0 -178
  733. package/node_modules/@humwick/kernel/workflow-definition.ts +0 -507
  734. package/node_modules/@humwick/kernel/workflow-dispatch.ts +0 -60
  735. package/node_modules/@humwick/kernel/workflow-foreach.ts +0 -167
  736. package/node_modules/@humwick/kernel/workflow-journal-codec.ts +0 -339
  737. package/node_modules/@humwick/kernel/workflow-journal.ts +0 -922
  738. package/node_modules/@humwick/kernel/workflow-lane.ts +0 -48
  739. package/node_modules/@humwick/kernel/workflow-lease-owner.ts +0 -60
  740. package/node_modules/@humwick/kernel/workflow-recovery.test-fixture.ts +0 -19
  741. package/node_modules/@humwick/kernel/workflow-runtime.ts +0 -938
  742. package/node_modules/@humwick/kernel/workflow-script.ts +0 -11
  743. package/node_modules/@humwick/kernel/workflow-state.ts +0 -299
  744. package/node_modules/@humwick/kernel/workflow-step-commit.ts +0 -195
  745. package/node_modules/@humwick/kernel/workflow-transitions.ts +0 -317
  746. package/node_modules/@humwick/kernel/workflow-values.ts +0 -153
  747. package/node_modules/@humwick/kernel/workflow.pilot.ts +0 -376
  748. package/node_modules/@humwick/offload/LICENSE +0 -167
  749. package/node_modules/@humwick/offload/README.md +0 -57
  750. package/node_modules/@humwick/offload/dist/async-runner.d.ts +0 -18
  751. package/node_modules/@humwick/offload/dist/async-runner.d.ts.map +0 -1
  752. package/node_modules/@humwick/offload/dist/async-runner.js +0 -158
  753. package/node_modules/@humwick/offload/dist/async-runner.js.map +0 -1
  754. package/node_modules/@humwick/offload/dist/envelope.d.ts +0 -25
  755. package/node_modules/@humwick/offload/dist/envelope.d.ts.map +0 -1
  756. package/node_modules/@humwick/offload/dist/envelope.js +0 -80
  757. package/node_modules/@humwick/offload/dist/envelope.js.map +0 -1
  758. package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts +0 -10
  759. package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts.map +0 -1
  760. package/node_modules/@humwick/offload/dist/fixtures/worker-task.js +0 -59
  761. package/node_modules/@humwick/offload/dist/fixtures/worker-task.js.map +0 -1
  762. package/node_modules/@humwick/offload/dist/index.d.ts +0 -5
  763. package/node_modules/@humwick/offload/dist/index.d.ts.map +0 -1
  764. package/node_modules/@humwick/offload/dist/index.js +0 -5
  765. package/node_modules/@humwick/offload/dist/index.js.map +0 -1
  766. package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts +0 -62
  767. package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts.map +0 -1
  768. package/node_modules/@humwick/offload/dist/subprocess-runner.js +0 -295
  769. package/node_modules/@humwick/offload/dist/subprocess-runner.js.map +0 -1
  770. package/node_modules/@humwick/offload/dist/types.d.ts +0 -111
  771. package/node_modules/@humwick/offload/dist/types.d.ts.map +0 -1
  772. package/node_modules/@humwick/offload/dist/types.js +0 -176
  773. package/node_modules/@humwick/offload/dist/types.js.map +0 -1
  774. package/node_modules/@humwick/offload/dist/worker-pool.d.ts +0 -23
  775. package/node_modules/@humwick/offload/dist/worker-pool.d.ts.map +0 -1
  776. package/node_modules/@humwick/offload/dist/worker-pool.js +0 -435
  777. package/node_modules/@humwick/offload/dist/worker-pool.js.map +0 -1
  778. package/node_modules/@humwick/offload/dist/worker-runtime.d.ts +0 -2
  779. package/node_modules/@humwick/offload/dist/worker-runtime.d.ts.map +0 -1
  780. package/node_modules/@humwick/offload/dist/worker-runtime.js +0 -27
  781. package/node_modules/@humwick/offload/dist/worker-runtime.js.map +0 -1
  782. package/node_modules/@humwick/offload/dist/worker.d.ts +0 -5
  783. package/node_modules/@humwick/offload/dist/worker.d.ts.map +0 -1
  784. package/node_modules/@humwick/offload/dist/worker.js +0 -1
  785. package/node_modules/@humwick/offload/dist/worker.js.map +0 -1
  786. package/node_modules/@humwick/offload/package.json +0 -42
  787. package/node_modules/@humwick/offload/src/async-runner.ts +0 -170
  788. package/node_modules/@humwick/offload/src/envelope.ts +0 -92
  789. package/node_modules/@humwick/offload/src/fixtures/worker-task.ts +0 -49
  790. package/node_modules/@humwick/offload/src/index.ts +0 -4
  791. package/node_modules/@humwick/offload/src/subprocess-runner.ts +0 -334
  792. package/node_modules/@humwick/offload/src/types.ts +0 -235
  793. package/node_modules/@humwick/offload/src/worker-pool.ts +0 -463
  794. package/node_modules/@humwick/offload/src/worker-runtime.ts +0 -32
  795. package/node_modules/@humwick/offload/src/worker.ts +0 -5
  796. package/public/assets/agent-liveness-DyqxfB-t.js +0 -2
  797. package/public/assets/agent-profiles-BpI_jTxq.js +0 -2
  798. package/public/assets/index-B7ZerHLY.css +0 -2
  799. package/public/assets/index-BU3uWo2t.js +0 -15
  800. package/public/assets/projects-B_lmcqfO.js +0 -2
  801. package/public/assets/provider-display-DbLWpP3j.js +0 -2
  802. package/public/assets/run-card-CO_bguQf.js +0 -2
  803. package/public/assets/shipping-Bu8p1gEw.js +0 -2
  804. package/public/assets/store-BvtFdlGX.js +0 -9
  805. package/public/assets/use-project-list-B-T2Bnnn.js +0 -2
  806. package/public/assets/versioned-prompt-editor-Diu8BIaM.js +0 -8
  807. package/runner/src/agent-runner/http-liveness.ts +0 -85
  808. package/runner/src/gate-run-lease-probe.ts +0 -38
  809. package/src/db/claude-catalog-reconcile.ts +0 -27
  810. package/src/db/on-loop-write-transaction.ts +0 -34
  811. package/src/routing-model-aliases.ts +0 -21
@@ -1,4 +1,5 @@
1
1
  import { createActivityEventWithResult } from "./db";
2
+ import { createActivityEventByClientIdAsync } from "./db/activity-async";
2
3
  import { emitRelayEvent } from "./events";
3
4
 
4
5
  export interface OperatorAlarmInput {
@@ -20,22 +21,33 @@ export interface OperatorAlarmInput {
20
21
  // done. This raises a distinct `operator.alarm` relay event (dashboard banner) plus a
21
22
  // persisted `operator`-kind activity event, so a relay with no reachable escalation target
22
23
  // is observable instead of looping forever in the dark.
23
- export function raiseOperatorAlarm(input: OperatorAlarmInput): boolean {
24
- const { created } = createActivityEventWithResult({
25
- clientId: input.clientId,
26
- kind: "operator",
27
- title: input.subject,
28
- body: input.detail,
29
- icon: "ti-alert-octagon",
30
- view: input.view ?? "orchestrators",
31
- metadata: { source: input.source, operatorAlarm: true, ...(input.metadata ?? {}) },
32
- });
33
- if (input.dedupeEvent && !created) return false;
24
+ const alarmEvent = (input: OperatorAlarmInput) => ({
25
+ clientId: input.clientId,
26
+ kind: "operator" as const,
27
+ title: input.subject,
28
+ body: input.detail,
29
+ icon: "ti-alert-octagon",
30
+ view: input.view ?? "orchestrators",
31
+ metadata: { source: input.source, operatorAlarm: true, ...(input.metadata ?? {}) },
32
+ });
33
+
34
+ function emitAlarm(input: OperatorAlarmInput): void {
34
35
  emitRelayEvent({
35
36
  type: "operator.alarm",
36
37
  source: input.source,
37
38
  subject: input.subject,
38
39
  data: { subject: input.subject, detail: input.detail, ...(input.metadata ?? {}) },
39
40
  });
41
+ }
42
+
43
+ export async function raiseOperatorAlarm(input: OperatorAlarmInput): Promise<boolean> {
44
+ return raiseOperatorAlarmAsync(input);
45
+ }
46
+
47
+ /** Same as `raiseOperatorAlarm`, with the activity row written on the writer thread. */
48
+ export async function raiseOperatorAlarmAsync(input: OperatorAlarmInput): Promise<boolean> {
49
+ const { created } = await createActivityEventByClientIdAsync(alarmEvent(input));
50
+ if (input.dedupeEvent && !created) return false;
51
+ emitAlarm(input);
40
52
  return true;
41
53
  }
@@ -1,5 +1,5 @@
1
1
  import { join } from "node:path";
2
- import { listProjectEntries, rootsForProject, retractProjectEntry, writeProjectEntry } from "./db";
2
+ import { listProjectEntriesAsync, rootsForProjectAsync, retractProjectEntryAsync, writeProjectEntryAsync } from "./db";
3
3
  import { projectFileRoots, readProjectRootFile } from "./project-file-source";
4
4
  import type { ProjectEntry } from "./types";
5
5
 
@@ -117,7 +117,7 @@ export async function ingestClaudeMd(projectId: string, authorId: string): Promi
117
117
  // Index prior *ingested* entries by origin_ref (newest active wins). We only ever
118
118
  // read source:'ingested' here — manual/promoted are invisible to ingest by design.
119
119
  const byOrigin = new Map<string, ProjectEntry>();
120
- for (const entry of listProjectEntries(projectId)) {
120
+ for (const entry of await listProjectEntriesAsync(projectId)) {
121
121
  if (entry.source !== "ingested" || !entry.originRef) continue;
122
122
  if (!byOrigin.has(entry.originRef)) byOrigin.set(entry.originRef, entry);
123
123
  }
@@ -128,7 +128,7 @@ export async function ingestClaudeMd(projectId: string, authorId: string): Promi
128
128
  let updated = 0;
129
129
  let unchanged = 0;
130
130
 
131
- const registered = projectFileRoots(rootsForProject(projectId));
131
+ const registered = projectFileRoots(await rootsForProjectAsync(projectId));
132
132
  if (!registered.length && byOrigin.size) throw new Error(`no confirmed checkout host owns project ${projectId}`);
133
133
  for (const root of registered) {
134
134
  let filePath = join(root.rootPath, INGEST_FILENAME);
@@ -153,7 +153,7 @@ export async function ingestClaudeMd(projectId: string, authorId: string): Promi
153
153
  unchanged++;
154
154
  continue;
155
155
  }
156
- writeProjectEntry({
156
+ await writeProjectEntryAsync({
157
157
  projectId,
158
158
  authorId,
159
159
  kind: "rule",
@@ -166,7 +166,7 @@ export async function ingestClaudeMd(projectId: string, authorId: string): Promi
166
166
  });
167
167
  updated++;
168
168
  } else {
169
- writeProjectEntry({
169
+ await writeProjectEntryAsync({
170
170
  projectId,
171
171
  authorId,
172
172
  kind: "rule",
@@ -187,7 +187,7 @@ export async function ingestClaudeMd(projectId: string, authorId: string): Promi
187
187
  let retracted = 0;
188
188
  for (const [originRef, entry] of byOrigin) {
189
189
  if (seen.has(originRef)) continue;
190
- retractProjectEntry(entry.id);
190
+ await retractProjectEntryAsync(entry.id);
191
191
  retracted++;
192
192
  }
193
193
 
@@ -2,6 +2,7 @@ import { composeMemoryPreambleAsync } from "./memory-preamble-async";
2
2
  import { composeHostAwareness } from "./host-awareness";
3
3
  import { composeGuideIndex } from "./guides";
4
4
  import { profileInstructionBlocks } from "./profile-instruction-blocks";
5
+ import { projectProfileInstructionBlock } from "./project-profile-instructions";
5
6
  // Spawn-time instruction sources (#557) — the relay-owned composer that assembles what a spawned
6
7
  // agent's systemPromptAppend says, from declared sources only, never from host CLAUDE.md.
7
8
  //
@@ -261,6 +262,13 @@ export function stripHumwickIdentitySection(value: string): string {
261
262
  .replace(/\n\n+$/, "");
262
263
  }
263
264
 
265
+ /** The relay-owned marked sections a prompt carries on top of the startup blocks: identity, memory
266
+ * and journal. The ONE strip every reader of a launched prompt uses, so a block added here (#3782:
267
+ * the journal) cannot be forgotten by one of them. */
268
+ export function stripRelayOwnedSections(value: string): string {
269
+ return stripJournalPreamble(stripMemoryPreamble(stripHumwickIdentitySection(value)));
270
+ }
271
+
264
272
  export function composeSpawnInstructionsWithEvents(input: {
265
273
  /** Resolved fact from the selected profile's Project Instructions cell. Absent fails closed. */
266
274
  projectInstructionsEnabled?: boolean;
@@ -283,6 +291,7 @@ export function composeSpawnInstructionsWithEvents(input: {
283
291
  * host → project`, audience-filtered by `profile`). Absent → no memory block at all, so a
284
292
  * caller that does not know the identity produces a byte-identical pre-#1565 spawn. */
285
293
  memoryIdentity?: MemoryIdentity;
294
+ projectId?: string;
286
295
  profile?: Pick<AgentProfile, "instructions" | "maxSpawnedAgents" | "hostAwareness" | "roleAssets"> & { name?: string; relay?: AgentProfile["relay"] };
287
296
  spawnedBy?: string;
288
297
  /** #3045 — a workflow step agent: its step reporting block replaces the spawned-child report-up. */
@@ -475,6 +484,8 @@ export function composeSpawnInstructionsWithEvents(input: {
475
484
  const { system: profileSystem, append: profileAppend } = profileInstructionBlocks(input.profile, input.memoryIdentity?.provider);
476
485
  if (profileSystem) appendBlocks.push(profileSystem);
477
486
  appendBlocks.push(...profileAppend);
487
+ const projectProfile = projectProfileInstructionBlock(input.projectId ?? input.memoryIdentity?.projectId, input.profile?.name ?? input.memoryIdentity?.profile);
488
+ if (projectProfile) { appendBlocks.push(projectProfile.content); relayInjectionEvents.push(projectProfile.event); }
478
489
  // After the profile, so the step rule is the last word over a charter's report-to-spawner text.
479
490
  if (input.workflowRunId) {
480
491
  const instruction = renderTemplate("spawn.reportup.workflow-step", { runId: input.workflowRunId });
@@ -522,7 +533,7 @@ export function composeSpawnInstructionsWithEvents(input: {
522
533
  // strict about what it removes, so a brief that merely mentions a marker survives intact — and
523
534
  // neutralizing what survives keeps it from being read as this prompt's memory/journal block later.
524
535
  const callerSystemPromptAppend = input.callerSystemPromptAppend
525
- ? neutralizeJournalMarkers(neutralizeMemoryMarkers(stripJournalPreamble(stripMemoryPreamble(stripHumwickIdentitySection(input.callerSystemPromptAppend)))))
536
+ ? neutralizeJournalMarkers(neutralizeMemoryMarkers(stripRelayOwnedSections(input.callerSystemPromptAppend)))
526
537
  : undefined;
527
538
  if (callerSystemPromptAppend?.trim()) {
528
539
  appendBlocks.push(callerSystemPromptAppend);
@@ -0,0 +1,6 @@
1
+ import { assertNoControlBytes, ValidationError } from "@humwick/sdk";
2
+
3
+ export function validateProjectProfileInstructionText(value: unknown, source: string): asserts value is string {
4
+ if (typeof value !== "string" || value.length > 16_000) throw new ValidationError(`${source} must be a string up to 16000 characters`);
5
+ assertNoControlBytes(value, source);
6
+ }
@@ -0,0 +1,20 @@
1
+ import { errMessage } from "@humwick/sdk";
2
+ import { getProjectProfileInstructions } from "./db/project-profile-instructions";
3
+ import { validateProjectProfileInstructionText } from "./project-profile-instruction-text";
4
+
5
+ /** #3515 — one optional block at the charter seam, independent of project memory's switch. */
6
+ export function projectProfileInstructionBlock(projectId: string | undefined, profile: string | undefined) {
7
+ if (!projectId || !profile) return;
8
+ const source = `project ${projectId} profile ${profile} instructions`;
9
+ try {
10
+ const entry = getProjectProfileInstructions({ projectId, profile });
11
+ validateProjectProfileInstructionText(entry.template, source);
12
+ const content = entry.template.trim();
13
+ if (!content) return;
14
+ return { content, event: { category: "instructions" as const,
15
+ summary: `injected ${source} v${entry.version}`,
16
+ detail: { source: "project-profile-instructions", projectId, profile, version: entry.version, content } } };
17
+ } catch (error) {
18
+ console.warn(`[launch] skipped ${source}: ${errMessage(error)}`);
19
+ }
20
+ }
@@ -1,8 +1,9 @@
1
+ import { upsertProjectTrustApprovalAsync } from "./db/runtime-tail-async";
1
2
  import { createHash } from "node:crypto";
2
3
  import { resolve } from "node:path";
3
4
  import { shellEscape, ValidationError, type AgentProfile, type ProfileAssetCell, type ProfileProjectCells, type ProfileProjectGate, type ProfileProjectReviewMode, type ProfileProjectTrustScope, type Project } from "@humwick/sdk";
4
5
  import { rootsForProject, resolveProjectForCwd } from "./db/projects";
5
- import { getProjectTrustApproval, upsertProjectTrustApproval, type ProjectTrustApproval, type ProjectTrustCapability } from "./db/project-trust-approvals";
6
+ import { getProjectTrustApproval, type ProjectTrustApproval, type ProjectTrustCapability } from "./db/project-trust-approvals";
6
7
  import { observeCapabilityReview } from "./project-trust-fingerprint";
7
8
  import { canonicalRoot } from "./services/canonical-root";
8
9
  import { isPathWithinBase } from "./utils";
@@ -35,26 +36,26 @@ function repoKeyFor(cwd: string): string {
35
36
  /** Records `approvedValue` (a `sha256:<hex>` or `commit:<sha>`, matching `mode`) as trusted for
36
37
  * this (profile, repo, capability) — the dashboard/API one-click approve action. Format-validated
37
38
  * here so a malformed value can never be written through the trust store's only public writer. */
38
- export function approveProjectCapabilityReview(input: {
39
+ export async function approveProjectCapabilityReview(input: {
39
40
  profileName: string;
40
41
  repoKey: string;
41
42
  capability: ProjectCapability;
42
43
  mode: "fingerprint" | "commit";
43
44
  approvedValue: string;
44
45
  approvedBy: string;
45
- }): ProjectTrustApproval {
46
+ }): Promise<ProjectTrustApproval> {
46
47
  const prefix = input.mode === "commit" ? "commit:" : "sha256:";
47
48
  if (!input.approvedValue.startsWith(prefix)) {
48
49
  throw new ValidationError(`approved value must be prefixed "${prefix}" for ${input.mode} review`);
49
50
  }
50
- return upsertProjectTrustApproval({
51
+ return (await upsertProjectTrustApprovalAsync({
51
52
  profileName: input.profileName,
52
53
  repoKey: input.repoKey,
53
54
  capability: input.capability,
54
55
  reviewMode: input.mode,
55
56
  approvedValue: input.approvedValue,
56
57
  approvedBy: input.approvedBy,
57
- });
58
+ }));
58
59
  }
59
60
 
60
61
  /** Stable JSON is intentionally local to this small trust seam. The hash is an
@@ -142,13 +143,13 @@ export interface ProjectCapabilityGateOpts {
142
143
  pinnedMcpCommit?: string;
143
144
  }
144
145
 
145
- export function projectCapabilityGate(
146
+ export async function projectCapabilityGate(
146
147
  profile: AgentProfile,
147
148
  capability: ProjectCapability,
148
149
  cwd: string,
149
150
  registeredProject?: Project | null,
150
151
  opts?: ProjectCapabilityGateOpts,
151
- ): ProfileProjectGate {
152
+ ): Promise<ProfileProjectGate> {
152
153
  const project = profile.sources?.project;
153
154
  const cell = capabilityCell(profile, capability);
154
155
  if (!project || !cell?.enabled) {
@@ -238,7 +239,7 @@ export function projectCapabilityGate(
238
239
  // approved instead of failing closed, so shipping G3 does not instantly regress every
239
240
  // already-trusted profile. Only a SUBSEQUENT change (a different observed value) fails
240
241
  // closed from here on.
241
- upsertProjectTrustApproval({ profileName: profile.name, repoKey, capability, reviewMode: mode, approvedValue: observed, approvedBy: "system:grandfathered" });
242
+ (await upsertProjectTrustApprovalAsync({ profileName: profile.name, repoKey, capability, reviewMode: mode, approvedValue: observed, approvedBy: "system:grandfathered" }));
242
243
  return { allowed: true, reason: "allowed", detail: gateDetail(capability, `${scopeDetail} (grandfathered ${observed})`), observed, repoKey, reviewMode: mode };
243
244
  }
244
245
  // `commit` review has no grandfather: it is the stricter opt-in mode, so first encounter
@@ -254,9 +255,9 @@ export function projectCapabilityGate(
254
255
  /** Stamp the server's per-spawn decisions onto a cloned profile. The source cells
255
256
  * remain visible for truthful projection; the runner consumes only these decisions
256
257
  * for filesystem materialization. */
257
- export function applyProjectCapabilityGates(profile: AgentProfile, cwd: string, registeredProject?: Project | null, opts?: ProjectCapabilityGateOpts): AgentProfile {
258
+ export async function applyProjectCapabilityGates(profile: AgentProfile, cwd: string, registeredProject?: Project | null, opts?: ProjectCapabilityGateOpts): Promise<AgentProfile> {
258
259
  if (!profile.sources?.project) return profile;
259
- const hooks = projectCapabilityGate(profile, "hooks", cwd, registeredProject, opts);
260
- const mcp = projectCapabilityGate(profile, "mcp", cwd, registeredProject, opts);
260
+ const hooks = (await projectCapabilityGate(profile, "hooks", cwd, registeredProject, opts));
261
+ const mcp = (await projectCapabilityGate(profile, "mcp", cwd, registeredProject, opts));
261
262
  return { ...profile, projectGates: { hooks, mcp } };
262
263
  }
@@ -250,7 +250,7 @@ const DEFAULT_PROMPT_TEMPLATES = [
250
250
  "{{context}}",
251
251
  "Acceptance — done when:",
252
252
  "{{doneWhen}}",
253
- "",
253
+ "{{afterLand}}",
254
254
  "Linked issue spec (resolved server-side once — do NOT re-read GitHub):",
255
255
  "{{issues}}",
256
256
  "",
@@ -275,7 +275,7 @@ const DEFAULT_PROMPT_TEMPLATES = [
275
275
  "{{context}}",
276
276
  "Acceptance — done when:",
277
277
  "{{doneWhen}}",
278
- "",
278
+ "{{afterLand}}",
279
279
  "Linked issue spec (resolved server-side once — do NOT re-read GitHub):",
280
280
  "{{issues}}",
281
281
  "",
@@ -288,7 +288,7 @@ const DEFAULT_PROMPT_TEMPLATES = [
288
288
  "Latest steer (act on this now):",
289
289
  "{{steer}}",
290
290
  ),
291
- variables: ["taskId", "title", "status", "stage", "owner", "intent", "context", "doneWhen", "issues", "decisions", "history", "memory", "steer"],
291
+ variables: ["taskId", "title", "status", "stage", "owner", "intent", "context", "doneWhen", "afterLand", "issues", "decisions", "history", "memory", "steer"],
292
292
  },
293
293
  {
294
294
  slug: "context.advisory.warn",
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  deriveProviderDisabledState,
3
3
  disabledProviderSet,
4
- providerCatalogList,
4
+ providerMetadataList,
5
5
  type ProviderCatalogEntry,
6
6
  type ProviderContextThreshold,
7
7
  type ProviderEnablementSetting,
@@ -44,7 +44,7 @@ export interface ProviderModelOverrideInput {
44
44
 
45
45
  function listProviderModelOverrides(): ProviderModelOverride[] {
46
46
  const rows = getDb()
47
- .query("SELECT * FROM provider_model_overrides ORDER BY provider ASC, alias ASC")
47
+ .query("SELECT * FROM provider_model_overrides ORDER BY provider ASC, rowid ASC")
48
48
  .all() as ProviderModelOverrideRow[];
49
49
  return rows.map(rowToOverride).filter((entry): entry is ProviderModelOverride => Boolean(entry));
50
50
  }
@@ -120,7 +120,7 @@ export function setProviderDefaultModel(provider: SpawnProvider, alias: string,
120
120
  }
121
121
 
122
122
  export function effectiveProviderCatalogList(now = Date.now()): ProviderCatalogEntry[] {
123
- const catalog = mergeProviderCatalog(providerCatalogList(), listProviderModelOverrides());
123
+ const catalog = mergeProviderCatalog(providerMetadataList(), listProviderModelOverrides());
124
124
  const defaults = getDb().query("SELECT provider, alias FROM provider_model_defaults").all() as Array<{ provider: string; alias: string }>;
125
125
  for (const { provider, alias } of defaults) {
126
126
  const entry = catalog.find((item) => item.provider === provider);
@@ -215,9 +215,6 @@ function normalizeOverrideInput(input: ProviderModelOverrideInput): ProviderMode
215
215
  if (limits) entry.limits = limits;
216
216
  else delete entry.limits;
217
217
  delete entry.disabled;
218
- // #368 — unavailable is a static catalog fact (provider-side suspension), not an operator toggle;
219
- // strip it from DB overrides so an admin can't accidentally clear a catalog-level suspension.
220
- delete entry.unavailable;
221
218
  // #2598 — `deleted` is a row-level tombstone column, never part of a stored entry blob.
222
219
  delete (entry as unknown as Record<string, unknown>).deleted;
223
220
  return {
@@ -288,49 +285,6 @@ function allowlistedLimitConfidence(value: unknown): ProviderModelLimitWindow["c
288
285
  : "declared";
289
286
  }
290
287
 
291
- /**
292
- * #2598 — additive, idempotent backfill of every static-catalog model into `provider_model_overrides`,
293
- * so the whole catalogue is uniformly DB-backed and operator-editable. Rules:
294
- * - INSERT-ONLY-IF-ABSENT (`ON CONFLICT DO NOTHING`): an existing row — a prior seed OR an operator
295
- * edit OR an operator delete-tombstone — is never touched, so operator edits ALWAYS win and a
296
- * deleted static model is never resurrected. Re-runnable; a re-run inserts only genuinely NEW
297
- * static models (e.g. added by a later release).
298
- * - SKIP disabled/unavailable static models: materializing them would strip those flags at the
299
- * write chokepoint (#368/#643) and resurrect a suspended model as spawnable. They stay
300
- * static-only until an operator explicitly adds them.
301
- * Stamped `updated_by = <stamp>` (e.g. `seed:<version>`) purely for provenance; precedence is decided
302
- * by row EXISTENCE, not by parsing the stamp.
303
- */
304
- export function seedProviderModelOverrides(stamp: string, now = Date.now()): { inserted: number } {
305
- const db = getDb();
306
- const existing = new Map<string, Set<string>>();
307
- for (const row of db.query("SELECT provider, alias FROM provider_model_overrides").all() as Array<{ provider: string; alias: string }>) {
308
- let aliases = existing.get(row.provider);
309
- if (!aliases) existing.set(row.provider, (aliases = new Set()));
310
- aliases.add(row.alias);
311
- }
312
- let inserted = 0;
313
- const insert = db.query(`
314
- INSERT INTO provider_model_overrides (provider, alias, entry, deleted, disabled, updated_at, updated_by)
315
- VALUES (?, ?, ?, 0, 0, ?, ?)
316
- ON CONFLICT(provider, alias) DO NOTHING
317
- `);
318
- const seed = db.transaction(() => {
319
- for (const providerEntry of providerCatalogList()) {
320
- const seen = existing.get(providerEntry.provider);
321
- for (const model of providerEntry.models) {
322
- if (model.disabled || model.unavailable) continue;
323
- if (seen?.has(model.alias)) continue;
324
- const normalized = normalizeOverrideInput({ provider: providerEntry.provider, alias: model.alias, entry: model, updatedBy: stamp });
325
- const result = insert.run(normalized.provider, normalized.alias, JSON.stringify(normalized.entry), now, normalized.updatedBy ?? null);
326
- if (result.changes > 0) inserted++;
327
- }
328
- }
329
- });
330
- seed();
331
- return { inserted };
332
- }
333
-
334
288
  function rowToOverride(row: ProviderModelOverrideRow): ProviderModelOverride | undefined {
335
289
  const parsed = parseJson<ProviderModelCatalogEntry | undefined>(row.entry, undefined);
336
290
  if (!parsed || typeof parsed.alias !== "string") return undefined;
@@ -4,7 +4,8 @@ import { hostname } from "node:os";
4
4
  import { join } from "node:path";
5
5
  import { ValidationError, listOrchestrators } from "./db";
6
6
  import { isSecretEnvKey } from "./db/provider-config-secrets";
7
- import { getConfig, listConfig, setConfig } from "./config-store";
7
+ import { getConfig, listConfig } from "./config-store";
8
+ import { setConfigAsync } from "./config-store-write";
8
9
  import { localOrchestratorIdFromEnv, providerConfigHomeFromEnv } from "./config";
9
10
  import { cleanString, cleanStringArray, optionalEnum } from "./validation";
10
11
  import { emitConfigChanged } from "./sse";
@@ -90,11 +91,11 @@ export function listProviderConfigEntries(host = defaultProviderConfigHost()): R
90
91
  ) as Record<SpawnProvider, ProviderConfigEntry>;
91
92
  }
92
93
 
93
- export function setProviderConfig(
94
+ export async function setProviderConfigAsync(
94
95
  provider: string,
95
96
  value: unknown,
96
97
  opts: { host?: string; updatedBy?: string } = {},
97
- ): ProviderConfigEntry {
98
+ ): Promise<ProviderConfigEntry> {
98
99
  const cleanProvider = normalizeProviderConfigProvider(provider);
99
100
  const host = normalizeProviderConfigHost(opts.host ?? defaultProviderConfigHost());
100
101
  const normalized = cleanProviderConfig(cleanProvider, resolveMaskedEnvSentinels(value, host, cleanProvider));
@@ -102,7 +103,7 @@ export function setProviderConfig(
102
103
  ensureProviderConfigDescriptors([key]);
103
104
  const validation = validateSettingValue(PROVIDER_CONFIG_NAMESPACE, key, normalized);
104
105
  if (!validation.valid) throw new ValidationError(validation.errors.join("; "));
105
- return setConfig(PROVIDER_CONFIG_NAMESPACE, key, normalized, opts.updatedBy) as ProviderConfigEntry;
106
+ return await setConfigAsync(PROVIDER_CONFIG_NAMESPACE, key, normalized, opts.updatedBy) as ProviderConfigEntry;
106
107
  }
107
108
 
108
109
  export function providerConfigPublic(entry: ProviderConfigEntry, opts: { maskEnv?: boolean } = {}): Record<string, unknown> {
@@ -138,11 +139,11 @@ export function providerConfigPublic(entry: ProviderConfigEntry, opts: { maskEnv
138
139
  * This is the server-authority write path: callers are in-process (local migration
139
140
  * or the orchestrator command-bus result handler), so no HTTP scope is required.
140
141
  */
141
- export function seedProviderConfigs(
142
+ export async function seedProviderConfigsAsync(
142
143
  host: string,
143
144
  rawByProvider: Record<string, unknown>,
144
145
  opts: { legacyHost?: string } = {},
145
- ): ProviderConfigEntry[] {
146
+ ): Promise<ProviderConfigEntry[]> {
146
147
  const seeded: ProviderConfigEntry[] = [];
147
148
  const cleanHost = normalizeProviderConfigHost(host);
148
149
  const legacyHost = opts.legacyHost ? normalizeProviderConfigHost(opts.legacyHost) : undefined;
@@ -159,7 +160,7 @@ export function seedProviderConfigs(
159
160
  // still validates; the relay owns the schema, the reporter stays dumb.
160
161
  const value = legacy?.value ?? { ...providerConfigDefaults(provider), ...(isRecord(raw) ? raw : {}) };
161
162
  try {
162
- const entry = setProviderConfig(provider, value, { host: cleanHost, updatedBy: `migration:${cleanHost}` });
163
+ const entry = await setProviderConfigAsync(provider, value, { host: cleanHost, updatedBy: `migration:${cleanHost}` });
163
164
  emitConfigChanged(entry.namespace, entry.key, entry.version);
164
165
  seeded.push(entry);
165
166
  } catch {
@@ -174,16 +175,16 @@ export function seedProviderConfigs(
174
175
  * owns the stable-id/legacy-hostname resolution together so command routes do
175
176
  * not re-parse or accidentally bypass the migration authority rules.
176
177
  */
177
- export function seedMigratedProviderConfigs(result: unknown): { host: string; seeded: ProviderConfigEntry[] } | null {
178
+ export async function seedMigratedProviderConfigsAsync(result: unknown): Promise<{ host: string; seeded: ProviderConfigEntry[] } | null> {
178
179
  if (!isRecord(result)) return null;
179
180
  const host = cleanString(result.host, "result.host", { max: 120 });
180
181
  const hostname = cleanString(result.hostname, "result.hostname", { max: 120 });
181
182
  const configs = isRecord(result.configs) ? result.configs : undefined;
182
183
  if (!host || !configs) return null;
183
- return { host, seeded: seedProviderConfigs(host, configs, { legacyHost: hostname }) };
184
+ return { host, seeded: await seedProviderConfigsAsync(host, configs, { legacyHost: hostname }) };
184
185
  }
185
186
 
186
- export function migrateLocalProviderConfigs(home = humwickHome(), host = defaultProviderConfigHost()): ProviderConfigEntry[] {
187
+ export async function migrateLocalProviderConfigsAsync(home = humwickHome(), host = defaultProviderConfigHost()): Promise<ProviderConfigEntry[]> {
187
188
  const dir = join(home, "providers");
188
189
  if (!existsSync(dir)) return [];
189
190
  const raw: Record<string, unknown> = {};
@@ -192,7 +193,7 @@ export function migrateLocalProviderConfigs(home = humwickHome(), host = default
192
193
  if (!VALID_PROVIDER_CONFIGS.includes(provider as SpawnProvider)) continue;
193
194
  raw[provider] = loadLocalProviderConfig(provider, home);
194
195
  }
195
- return seedProviderConfigs(host, raw);
196
+ return seedProviderConfigsAsync(host, raw);
196
197
  }
197
198
 
198
199
  function normalizeProviderConfigHost(host: string): string {
@@ -1,18 +1 @@
1
- import { getConfig, setConfig } from "./config-store";
2
- import { seedProviderModelOverrides } from "./provider-catalog-store";
3
- import { reconcileClaudeCatalogSeeds } from "./db/claude-catalog-reconcile";
4
- import { VERSION } from "./config";
5
- import { errMessage } from "@humwick/sdk";
6
-
7
- // Stamp only after the transactional seed succeeds so a failure retries next boot.
8
- export function reconcileProviderModelSeed(): void {
9
- try {
10
- reconcileClaudeCatalogSeeds();
11
- const stamp = `seed:${VERSION}`;
12
- if (getConfig<string>("system", "provider-model-seed-version")?.value === stamp) return;
13
- seedProviderModelOverrides(stamp);
14
- setConfig("system", "provider-model-seed-version", stamp, "server-startup");
15
- } catch (err) {
16
- console.warn(`[provider-model-seed] skipped: ${errMessage(err)}`);
17
- }
18
- }
1
+ export { reconcileProviderModelSeed, seedProviderModelOverrides } from "./db/provider-model-seed";
@@ -51,27 +51,25 @@ export async function upsertProviderQuotaAsync(
51
51
  * Synchronous in-process compatibility wrapper for direct callers and existing tests. Runs the writer
52
52
  * body directly (no gateway hop) and fires the returned effects synchronously.
53
53
  */
54
- export function upsertProviderQuota(input: ProviderQuotaUpdateInput, now = Date.now()): ProviderQuotaRecord {
55
- const result = upsertProviderQuotaInTx(input, now);
56
- invalidateProviderQuotaMatrixCache();
54
+ export async function upsertProviderQuota(input: ProviderQuotaUpdateInput, now = Date.now()): Promise<ProviderQuotaRecord> {
55
+ const result = await upsertProviderQuotaAsync(input, { now });
57
56
  if (result.outcome.kind !== "stored") throw new Error("provider quota lease not held");
58
- deliverProviderQuotaEffects(result, { isolate: false });
59
57
  return result.outcome.record;
60
58
  }
61
59
 
62
60
  /** Fire each event+notification pair in production order; `isolate` logs (not throws) per-pair faults. */
63
- function deliverProviderQuotaEffects(result: ProviderQuotaUpsertOpResult, options: { isolate: boolean }): void {
61
+ async function deliverProviderQuotaEffects(result: ProviderQuotaUpsertOpResult, options: { isolate: boolean }): Promise<void> {
64
62
  for (const effect of result.advisory?.effects ?? []) {
65
63
  if (options.isolate) {
66
64
  try {
67
65
  emitRelayEvent(effect.event);
68
- if (effect.notification) routeNotification(effect.notification);
66
+ if (effect.notification) await routeNotification(effect.notification);
69
67
  } catch (error) {
70
68
  console.error("provider quota post-commit effect failed", error);
71
69
  }
72
70
  } else {
73
71
  emitRelayEvent(effect.event);
74
- if (effect.notification) routeNotification(effect.notification);
72
+ if (effect.notification) await routeNotification(effect.notification);
75
73
  }
76
74
  }
77
75
  }
@@ -9,7 +9,8 @@
9
9
  // provider *spawn* config (provider-config-store.ts) by design — different scope,
10
10
  // different cardinality.
11
11
  import { ValidationError } from "./db";
12
- import { getConfig, listConfig, setConfig } from "./config-store";
12
+ import { getConfig, listConfig } from "./config-store";
13
+ import { setConfigAsync } from "./config-store-write";
13
14
  import { emitConfigChanged } from "./sse";
14
15
  import {
15
16
  DEFAULT_PROVIDER_QUOTA_CONFIG,
@@ -47,14 +48,14 @@ export function listProviderQuotaConfigs(): ProviderQuotaConfigMap {
47
48
  * clamped to 5m–15m, unset fields defaulted), so a partial body still validates.
48
49
  * Emits `config.changed` so the orchestrator + dashboard pick it up live.
49
50
  */
50
- export function setProviderQuotaConfig(
51
+ export async function setProviderQuotaConfigAsync(
51
52
  provider: string,
52
53
  value: unknown,
53
54
  opts: { updatedBy?: string } = {},
54
- ): ProviderQuotaConfig {
55
+ ): Promise<ProviderQuotaConfig> {
55
56
  const clean = assertValidProvider(provider);
56
57
  const normalized = normalizeProviderQuotaConfig(value);
57
- const entry = setConfig(PROVIDER_QUOTA_CONFIG_NAMESPACE, clean, normalized, opts.updatedBy);
58
+ const entry = await setConfigAsync(PROVIDER_QUOTA_CONFIG_NAMESPACE, clean, normalized, opts.updatedBy);
58
59
  emitConfigChanged(entry.namespace, entry.key, entry.version);
59
60
  return normalized;
60
61
  }
@@ -1,5 +1,5 @@
1
1
  import { getDb } from "./db";
2
- import { setProviderConfig } from "./provider-config-store";
2
+ import { setProviderConfigAsync } from "./provider-config-store";
3
3
 
4
4
  // #3402 — fake values under every key name the hub's central provider config holds, plus one no masking
5
5
  // list knows, so a test proves masking follows the configured values rather than key names.
@@ -25,9 +25,9 @@ export function leakedProviderSecrets(text: string): string[] {
25
25
  }
26
26
 
27
27
  /** Seeds the central provider config of `host` and returns its rows the way `sqlite3 ... select` prints them. */
28
- export function seedProviderSecrets(host: string): string {
28
+ export async function seedProviderSecrets(host: string): Promise<string> {
29
29
  for (const [provider, env] of Object.entries(PROVIDER_SECRET_ENV)) {
30
- setProviderConfig(provider, { command: provider, env: { ...env, OPENCODE_CONFIG: "/srv/opencode.json" } }, { host });
30
+ await setProviderConfigAsync(provider, { command: provider, env: { ...env, OPENCODE_CONFIG: "/srv/opencode.json" } }, { host });
31
31
  }
32
32
  return (getDb().query("SELECT namespace, key, value FROM config WHERE namespace = 'provider-config'").all() as Array<Record<string, string>>)
33
33
  .map((row) => `${row.namespace}|${row.key}|${row.value}`).join("\n");
@@ -1,5 +1,5 @@
1
1
  import { isRecord, stringValue } from "@humwick/sdk";
2
- import { createActivityEventWithResult } from "./db";
2
+ import { createActivityEventByClientIdAsync } from "./db/activity-async";
3
3
  import { emitRelayEvent } from "./events";
4
4
 
5
5
  interface HasMeta {
@@ -28,7 +28,7 @@ function numberValue(value: unknown): number | undefined {
28
28
  return typeof value === "number" && Number.isFinite(value) ? value : undefined;
29
29
  }
30
30
 
31
- export function auditRunnerTimelineEvent(agentId: string, timelineEvent: ProviderTimelineEvent | null): void {
31
+ export async function auditRunnerTimelineEvent(agentId: string, timelineEvent: ProviderTimelineEvent | null): Promise<void> {
32
32
  if (!timelineEvent) return;
33
33
  const metadata = isRecord(timelineEvent.metadata) ? timelineEvent.metadata : {};
34
34
  if (metadata.source !== "runner") return;
@@ -41,10 +41,7 @@ export function auditRunnerTimelineEvent(agentId: string, timelineEvent: Provide
41
41
  const body = stringValue(timelineEvent.body);
42
42
  const icon = stringValue(timelineEvent.icon) ?? "ti-activity";
43
43
  try {
44
- // #1912 §4 retained: this runs inside the synchronous bus status-frame callback. Turning this
45
- // into an unawaited gateway write would reorder/drop the audit relative to the frame; moving
46
- // the whole hot status ingress is the later owner.
47
- const result = createActivityEventWithResult({
44
+ const result = (await createActivityEventByClientIdAsync({
48
45
  clientId: `runner-timeline-${agentId}-${id}`,
49
46
  kind: "state",
50
47
  title,
@@ -60,7 +57,7 @@ export function auditRunnerTimelineEvent(agentId: string, timelineEvent: Provide
60
57
  timelineId: id,
61
58
  timelineTimestamp: timestamp,
62
59
  },
63
- });
60
+ }));
64
61
  // A repeated frame may still carry the same event during reconnect/retry. The durable activity
65
62
  // clientId dedup is authoritative; only a newly inserted row owns an activity.created edge.
66
63
  if (!result.created) return;
@@ -6,8 +6,8 @@ import { getSpawnCapableAgentIds } from "./routing-policy-push";
6
6
  import { renderBandTransition } from "./quota-band-transition";
7
7
  import type { ProviderBandWindow, QuotaBand } from "./quota-band-projection";
8
8
 
9
- export function deliverBandTransition(input: { provider: string; window: ProviderBandWindow; previousBand: QuotaBand; recommendedAction: string; now: number }): void {
9
+ export async function deliverBandTransition(input: { provider: string; window: ProviderBandWindow; previousBand: QuotaBand; recommendedAction: string; now: number }): Promise<void> {
10
10
  const effect = renderBandTransition(input, getSpawnCapableAgentIds());
11
11
  emitRelayEvent(effect.event);
12
- if (effect.notification) routeNotification(effect.notification);
12
+ if (effect.notification) await routeNotification(effect.notification);
13
13
  }