@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
@@ -0,0 +1,36 @@
1
+ // #3812 — backfill relay_plan_start/import into stored per-tool allowlists (the lean coordinator
2
+ // from #3472 froze before they existed, so tools/list never carried them).
3
+ // Narrow: only an include list already holding relay_plan_get, and not excluding the tool.
4
+ // json_insert, not parse+reserialize (#1456); patches `$.relay.tools` and its `sources` mirror, and
5
+ // the -v1-backup namespace, whose bytes are served while the matrix flag is off.
6
+ import { getDb } from "./connection.ts";
7
+ import { runMigrationOnce } from "./migration-marker.ts";
8
+
9
+ const PROFILE_NAMESPACES = ["agent-profile", "agent-profile-override", "agent-profile-override-v1-backup"] as const;
10
+ const SELECTION_PATHS = ["$.relay.tools", "$.sources.agentRelay.mcp"] as const;
11
+ const BACKFILLED_TOOLS = ["relay_plan_start", "relay_plan_import"] as const;
12
+ const EVIDENCE_TOOL = "relay_plan_get";
13
+
14
+ export function backfillPlanToolsIntoToolIncludes(): void {
15
+ runMigrationOnce("plan-tools-include-backfill-v1", () => {
16
+ const db = getDb();
17
+ const namespaces = PROFILE_NAMESPACES.map(() => "?").join(", ");
18
+ // The outer table is aliased: inside the subqueries a bare `value` binds to json_each.value.
19
+ const holds = (path: string, field: "include" | "exclude", tool: string) =>
20
+ `EXISTS (SELECT 1 FROM json_each(c.value, '${path}.${field}') je WHERE je.value = '${tool}')`;
21
+ db.transaction(() => {
22
+ for (const path of SELECTION_PATHS) {
23
+ for (const tool of BACKFILLED_TOOLS) {
24
+ db.query(
25
+ `UPDATE config AS c SET value = json_insert(c.value, '${path}.include[#]', ?)
26
+ WHERE c.namespace IN (${namespaces}) AND json_valid(c.value)
27
+ AND json_type(c.value, '${path}.include') = 'array'
28
+ AND ${holds(path, "include", EVIDENCE_TOOL)}
29
+ AND NOT ${holds(path, "include", tool)}
30
+ AND NOT ${holds(path, "exclude", tool)}`,
31
+ ).run(tool, ...PROFILE_NAMESPACES);
32
+ }
33
+ }
34
+ })();
35
+ });
36
+ }
@@ -1,7 +1,9 @@
1
1
  import { createPlanRow, deletePlan, replacePlanIfVersion, setPlanArchived } from "./plans.ts";
2
+ import { PLAN_READY_NOTICE_WRITE_OPS } from "./plan-ready-notices.ts";
2
3
  import type { WriterOpContext, WriterOpSpec } from "./write-ops.ts";
3
4
 
4
5
  export const PLANS_WRITE_OPS: Readonly<Record<string, WriterOpSpec>> = Object.freeze({
6
+ ...PLAN_READY_NOTICE_WRITE_OPS,
5
7
  "plans.create": { offLoop: true, idempotent: false, fn: (args: { input: Parameters<typeof createPlanRow>[0] }, ctx: WriterOpContext) => createPlanRow(args.input, ctx.now) },
6
8
  "plans.replace": { offLoop: true, idempotent: false, fn: (args: { input: Parameters<typeof replacePlanIfVersion>[0]; changedBy?: string }, ctx: WriterOpContext) => replacePlanIfVersion(args.input, args.changedBy, ctx.now, false) },
7
9
  "plans.setArchived": { offLoop: true, idempotent: true, fn: (args: { id: string; archived: boolean }, ctx: WriterOpContext) => setPlanArchived(args.id, args.archived, ctx.now) },
@@ -104,6 +104,11 @@ export function snapshotBufferedPresence(): PresenceSnapshot {
104
104
  * current, and the caller's surrounding status/ready predicates constrain the match. */
105
105
  export function bufferedLiveAgentIds(cutoff: number): string[] {
106
106
  const ids: string[] = [];
107
+ const snapshot = writerPresenceSnapshot();
108
+ if (snapshot) {
109
+ for (const beat of snapshot) if (beat.lastSeen > cutoff) ids.push(beat.id);
110
+ return ids;
111
+ }
107
112
  for (const [id, pending] of pendingPresence) {
108
113
  if (pending.lastSeen > cutoff) ids.push(id);
109
114
  }
@@ -1,3 +1,4 @@
1
+ import { framed } from "../hub-metrics";
1
2
  import { assertMainThreadState } from "./main-thread-state";
2
3
  // Lifecycle glue for the coalesced presence buffer. Kept outside agents.ts so its writer-op body
3
4
  // never depends on the gateway-facing facade (ADR 0001 §3.1).
@@ -6,53 +7,47 @@ import { errMessage } from "@humwick/sdk";
6
7
  import { PRESENCE_FLUSH_MS } from "../config";
7
8
  import { drainPendingLandSettleSideEffects } from "../land-settle-dispatch";
8
9
  import { onShutdown } from "../shutdown";
9
- import { flushPresence } from "./agents.ts";
10
+ import { flushPresenceAsync } from "./presence-write.ts";
10
11
  import { pendingPresence } from "./presence-buffer.ts";
11
12
 
12
13
  let presenceFlushTimer: ReturnType<typeof setInterval> | undefined;
13
- let asyncPresenceFlusher: (() => Promise<{ flushed: number }>) | undefined;
14
14
  let removeShutdownHook: (() => void) | undefined;
15
15
 
16
- /** Attach the gateway-backed normal-tick flusher without importing the gateway into agents.ts. */
17
- export function setAsyncPresenceFlusher(flusher: () => Promise<{ flushed: number }>): void {
18
- assertMainThreadState("presence-loop.ts");
19
- asyncPresenceFlusher = flusher;
20
- }
21
-
22
16
  /** Start the periodic presence-buffer flush loop (server boot). */
23
17
  export function startPresenceFlushLoop(intervalMs: number = PRESENCE_FLUSH_MS): void {
24
18
  assertMainThreadState("presence-loop.ts");
25
19
  if (presenceFlushTimer) return;
26
- presenceFlushTimer = setInterval(() => {
27
- const flush = asyncPresenceFlusher;
28
- if (!flush) return flushPresenceQuietly(); // Bootstrap/isolated compatibility fallback.
29
- void flush().catch((err) => console.warn(`[presence] flush failed: ${errMessage(err)}`));
30
- }, intervalMs);
20
+ presenceFlushTimer = setInterval(framed("timer presence-flush", () =>
21
+ flushPresenceAsync().catch((err) => console.warn(`[presence] flush failed: ${errMessage(err)}`))), intervalMs);
31
22
  presenceFlushTimer.unref?.();
32
- process.once("beforeExit", flushPresenceQuietly);
33
- removeShutdownHook = onShutdown("presence", () => {
34
- drainPendingLandSettleSideEffects();
35
- stopPresenceFlushLoop();
23
+ process.once("beforeExit", flushPresenceBeforeExit);
24
+ removeShutdownHook = onShutdown("presence", async () => {
25
+ await drainPendingLandSettleSideEffects();
26
+ await stopPresenceFlushLoop();
36
27
  });
37
28
  }
38
29
 
39
30
  /** Stop the loop and persist whatever is buffered (graceful shutdown / test teardown). */
40
- export function stopPresenceFlushLoop(): void {
31
+ function detachPresenceLoop(): void {
41
32
  assertMainThreadState("presence-loop.ts");
42
33
  removeShutdownHook?.();
43
34
  removeShutdownHook = undefined;
44
- process.removeListener("beforeExit", flushPresenceQuietly);
35
+ process.removeListener("beforeExit", flushPresenceBeforeExit);
45
36
  if (presenceFlushTimer) clearInterval(presenceFlushTimer);
46
37
  presenceFlushTimer = undefined;
47
- flushPresenceQuietly();
48
38
  }
49
39
 
50
- function flushPresenceQuietly(): void {
51
- try { flushPresence(); } catch (err) { console.warn(`[presence] flush failed: ${errMessage(err)}`); }
40
+ export async function stopPresenceFlushLoop(): Promise<void> {
41
+ detachPresenceLoop();
42
+ await flushPresenceAsync();
43
+ }
44
+
45
+ function flushPresenceBeforeExit(): void {
46
+ void flushPresenceAsync().catch(err => console.warn(`[presence] flush failed: ${errMessage(err)}`));
52
47
  }
53
48
 
54
49
  /** Test-only: drop the buffered presence and stop the flush loop. */
55
50
  export function resetPresenceBufferForTests(): void {
56
51
  pendingPresence.clear();
57
- stopPresenceFlushLoop();
52
+ detachPresenceLoop();
58
53
  }
@@ -3,7 +3,6 @@ import { assertMainThreadState } from "./main-thread-state";
3
3
  // Kept outside agents.ts because the writer registry imports the op body from that module; importing
4
4
  // the gateway there would make the writer-stack cycle gateway → write-ops → agents → gateway.
5
5
 
6
- import { setAsyncPresenceFlusher } from "./presence-loop.ts";
7
6
  import { settlePendingPresenceFlush, snapshotPendingPresenceFlush, type PresenceFlushPayload } from "./presence-buffer.ts";
8
7
  import { getGateway } from "./gateway.ts";
9
8
 
@@ -31,8 +30,3 @@ export function flushPresenceAsync(now: number = Date.now()): Promise<{ flushed:
31
30
  .finally(() => { activeFlush = undefined; });
32
31
  return activeFlush;
33
32
  }
34
-
35
- // The timer remains owned by presence-loop.ts for its synchronous shutdown guarantee, while normal ticks
36
- // arrive here through an injected callback. This direction deliberately avoids a writer-op → gateway
37
- // dependency cycle; the callback carries no DB closure across the worker seam.
38
- setAsyncPresenceFlusher(flushPresenceAsync);
@@ -1,3 +1,5 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import type { writeProjectEntry, promoteBlackboardEntry } from "./project-entries";
1
3
  // Async project-entries facades (T4060 hub on-loop). Kept outside
2
4
  // project-entries.ts to avoid a gateway cycle.
3
5
  import { getGateway } from "./gateway.ts";
@@ -16,3 +18,15 @@ export const searchProjectEntriesAsync = (
16
18
  query: string,
17
19
  opts: ProjectEntrySearchOptions = {},
18
20
  ): Promise<ProjectEntrySearchResult[]> => read("projectEntries.search", { projectId, query, ...opts });
21
+
22
+ export const getProjectEntryAsync = (id: string): Promise<ProjectEntry | null> => read("projectEntries.get", { id });
23
+ export const getProjectEntryChainAsync = (id: string): Promise<ProjectEntry[]> => read("projectEntries.chain", { id });
24
+ export const listActiveEntriesInAreaAsync = (projectId: string, area: string): Promise<ProjectEntry[]> => read("projectEntries.inArea", { projectId, area });
25
+ export const countActivePinnedEntriesInAreaAsync = (projectId: string, area: string): Promise<number> => read("projectEntries.countPinnedInArea", { projectId, area });
26
+
27
+ export const writeProjectEntryAsync = (input: Parameters<typeof writeProjectEntry>[0], requestId: string = randomUUID()): Promise<ProjectEntry> =>
28
+ getGateway().write("projectEntries.write", input, { idempotencyKey: requestId }) as unknown as Promise<ProjectEntry>;
29
+ export const retractProjectEntryAsync = (id: string): Promise<ProjectEntry | null> =>
30
+ getGateway().write("projectEntries.retract", { id }) as unknown as Promise<ProjectEntry | null>;
31
+ export const promoteBlackboardEntryAsync = (input: Parameters<typeof promoteBlackboardEntry>[0], requestId: string = randomUUID()): Promise<ProjectEntry> =>
32
+ getGateway().write("projectEntries.promoteBlackboard", input, { idempotencyKey: requestId }) as unknown as Promise<ProjectEntry>;
@@ -1,10 +1,14 @@
1
1
  // Project-entries reader operations (T4060 hub on-loop). The MCP memory/project
2
2
  // read tools ran these scans synchronously on the event loop — including the
3
3
  // temp-B-TREE display ORDER BY over cells whose rows are ~95% retracted.
4
- import { listProjectEntries, searchProjectEntries } from "./project-entries.ts";
4
+ import { countActivePinnedEntriesInArea, getProjectEntry, getProjectEntryChain, listActiveEntriesInArea, listProjectEntries, searchProjectEntries } from "./project-entries.ts";
5
5
  import type { ProjectEntryKind, ProjectEntryStatus, ProjectEntrySearchOptions } from "../types";
6
6
 
7
7
  export const PROJECT_ENTRIES_READ_OPS = {
8
+ "projectEntries.get": (args: { id: string }) => getProjectEntry(args.id),
9
+ "projectEntries.chain": (args: { id: string }) => getProjectEntryChain(args.id),
10
+ "projectEntries.inArea": (args: { projectId: string; area: string }) => listActiveEntriesInArea(args.projectId, args.area),
11
+ "projectEntries.countPinnedInArea": (args: { projectId: string; area: string }) => countActivePinnedEntriesInArea(args.projectId, args.area),
8
12
  "projectEntries.list": (args: {
9
13
  projectId: string;
10
14
  kind?: ProjectEntryKind;
@@ -0,0 +1,8 @@
1
+ import { promoteBlackboardEntry, retractProjectEntry, writeProjectEntry } from "./project-entries";
2
+ import type { WriterOpSpec } from "./write-ops";
3
+
4
+ export const PROJECT_ENTRIES_WRITE_OPS: Readonly<Record<string, WriterOpSpec>> = {
5
+ "projectEntries.write": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof writeProjectEntry>[0], ctx) => writeProjectEntry(args, ctx.now) },
6
+ "projectEntries.retract": { offLoop: true, idempotent: true, fn: (args: { id: string }, ctx) => retractProjectEntry(args.id, ctx.now) },
7
+ "projectEntries.promoteBlackboard": { offLoop: true, idempotent: false, fn: (args: Parameters<typeof promoteBlackboardEntry>[0], ctx) => promoteBlackboardEntry(args, ctx.now) },
8
+ };
@@ -1,7 +1,7 @@
1
1
  import { isolateMemoryEntry } from "../memory-entry-safety";
2
2
  import { validateProjectEntryText } from "../validation";
3
3
  import { randomUUID } from "node:crypto";
4
- import { getDb, writeTransaction, ValidationError } from "./connection.ts";
4
+ import { getDb, inWriteTransaction, ValidationError } from "./connection.ts";
5
5
  import { getEntry as getBlackboardEntry, listEntries as listBlackboardEntries } from "./blackboard.ts";
6
6
  import { parseJson } from "../utils";
7
7
  import {
@@ -211,7 +211,7 @@ function assertProjectKnowledge(projectId: string): void {
211
211
  }
212
212
  }
213
213
 
214
- export function writeProjectEntry(input: WriteProjectEntryInput): ProjectEntry {
214
+ export function writeProjectEntry(input: WriteProjectEntryInput, now: number = Date.now()): ProjectEntry {
215
215
  validateProjectEntryText(input);
216
216
  assertProjectKnowledge(input.projectId);
217
217
  assertKind(input.kind);
@@ -234,8 +234,7 @@ export function writeProjectEntry(input: WriteProjectEntryInput): ProjectEntry {
234
234
  supersedes = latestEntryByTitle(input.projectId, input.kind, input.title)?.id;
235
235
  }
236
236
  const id = projectEntryId();
237
- const now = Date.now();
238
- writeTransaction(() => {
237
+ inWriteTransaction(() => {
239
238
  let inheritedAreas: string[] | null = null;
240
239
  if (supersedes) {
241
240
  const previous = getProjectEntry(supersedes);
@@ -404,21 +403,25 @@ export function countActivePinnedEntriesInArea(projectId: string, area: string):
404
403
  }
405
404
 
406
405
  /** #3410 — active entries of one cell that name `area`, newest first. Same index as the count above. */
407
- export function listActiveEntriesInArea(projectId: string, area: string): ProjectEntry[] {
408
- const rows = getDb().query(`
406
+ export function buildActiveEntriesInAreaQuery(projectId: string, area: string): { sql: string; params: string[] } {
407
+ return { sql: `
409
408
  SELECT * FROM project_entries
410
409
  WHERE project_id = ? AND status = 'active' AND areas LIKE ? ESCAPE '\\'
411
410
  ORDER BY updated_at DESC, created_at DESC, id DESC
412
- `).all(projectId, `%${escapeLike(JSON.stringify(area))}%`) as ProjectEntryRow[];
413
- return rows.map(rowToEntry);
411
+ `, params: [projectId, `%${escapeLike(JSON.stringify(area))}%`] };
414
412
  }
415
413
 
416
- export function retractProjectEntry(id: string): ProjectEntry | null {
414
+ export function listActiveEntriesInArea(projectId: string, area: string): ProjectEntry[] {
415
+ const { sql, params } = buildActiveEntriesInAreaQuery(projectId, area);
416
+ return (getDb().query(sql).all(...params) as ProjectEntryRow[]).map(rowToEntry);
417
+ }
418
+
419
+ export function retractProjectEntry(id: string, now: number = Date.now()): ProjectEntry | null {
417
420
  const existing = getProjectEntry(id);
418
421
  if (!existing) return null;
419
422
  assertStatus("retracted");
420
423
  getDb().query("UPDATE project_entries SET status = 'retracted', updated_at = ? WHERE id = ?")
421
- .run(Date.now(), id);
424
+ .run(now, id);
422
425
  return getProjectEntry(id);
423
426
  }
424
427
 
@@ -472,7 +475,7 @@ function activePromotedEntry(projectId: string, originRef: string): ProjectEntry
472
475
  * project supersedes the prior promoted copy rather than duplicating it, so the durable
473
476
  * ledger holds at most one active entry per promoted finding while keeping the full
474
477
  * supersede chain for audit. */
475
- export function promoteBlackboardEntry(input: PromoteBlackboardEntryInput): ProjectEntry {
478
+ export function promoteBlackboardEntry(input: PromoteBlackboardEntryInput, now: number = Date.now()): ProjectEntry {
476
479
  const source = getBlackboardEntry(input.blackboardEntryId);
477
480
  if (!source) throw new ValidationError(`blackboard entry ${input.blackboardEntryId} not found`);
478
481
  if (source.status !== "active") {
@@ -489,7 +492,7 @@ export function promoteBlackboardEntry(input: PromoteBlackboardEntryInput): Proj
489
492
  source: "promoted",
490
493
  originRef: source.id,
491
494
  ...(existing ? { supersedes: existing.id } : {}),
492
- });
495
+ }, now);
493
496
  }
494
497
 
495
498
  export interface UnpromotedBlackboardSummary {
@@ -203,7 +203,7 @@ export function setProjectJournalFields(input: {
203
203
  fields: Record<string, string | null>;
204
204
  changedBy: string;
205
205
  now?: number;
206
- }): ProjectJournalFieldChange[] {
206
+ }, submittedAt: number = Date.now()): ProjectJournalFieldChange[] {
207
207
  const entries = Object.entries(input.fields);
208
208
  if (!entries.length) throw new ValidationError("fields must name at least one journal field");
209
209
  const plan: Array<{ field: ProjectJournalField; value: string | null; previous: string | null }> = [];
@@ -222,7 +222,7 @@ export function setProjectJournalFields(input: {
222
222
  plan.push({ field, value: value === "" ? null : value, previous });
223
223
  }
224
224
 
225
- const now = input.now ?? Date.now();
225
+ const now = input.now ?? submittedAt;
226
226
  const changes: ProjectJournalFieldChange[] = [];
227
227
  writeTransaction(() => {
228
228
  for (const { field, value, previous } of plan) {
@@ -0,0 +1,50 @@
1
+ import type { ProjectProfileInstructions } from "../types";
2
+ import { getDb, ValidationError } from "./connection";
3
+ import { promptHistory, writePromptVersion } from "./prompt-versions";
4
+ import type { WriterOpContext, WriterOpSpec } from "./write-ops";
5
+
6
+ export const PROJECT_PROFILE_INSTRUCTIONS_SCHEMA_SQL = `
7
+ CREATE TABLE IF NOT EXISTS project_profile_instructions (
8
+ project_id TEXT NOT NULL REFERENCES projects(id), profile TEXT NOT NULL,
9
+ slug TEXT NOT NULL UNIQUE, PRIMARY KEY (project_id, profile)
10
+ );
11
+ CREATE INDEX IF NOT EXISTS project_profile_instructions_profile ON project_profile_instructions(profile);
12
+ `;
13
+
14
+ export interface ProjectProfileKey { projectId: string; profile: string }
15
+ const columns = `p.project_id AS projectId, p.profile, coalesce(h.template, '') AS template,
16
+ coalesce(h.version, 0) AS version, coalesce(h.updated_at, 0) AS updatedAt`;
17
+
18
+ export function getProjectProfileInstructions(key: ProjectProfileKey): ProjectProfileInstructions {
19
+ return getDb().query(`SELECT ${columns} FROM project_profile_instructions p
20
+ LEFT JOIN prompt_heads h ON h.slug = p.slug WHERE p.project_id = ? AND p.profile = ?`)
21
+ .get(key.projectId, key.profile) as ProjectProfileInstructions | null
22
+ ?? { ...key, template: "", version: 0, updatedAt: 0 };
23
+ }
24
+
25
+ function instructionSlug(key: ProjectProfileKey): string {
26
+ return `project-profile:${JSON.stringify([key.projectId, key.profile])}`;
27
+ }
28
+
29
+ export function writeProjectProfileInstructions(args: ProjectProfileKey & {
30
+ template?: string; expectedVersion: number; actor: string; reason?: string; restoreVersion?: number;
31
+ }, now: number): ProjectProfileInstructions {
32
+ if (!getDb().query("SELECT 1 FROM projects WHERE id = ?").get(args.projectId)) throw new ValidationError("project not found");
33
+ getDb().query("INSERT OR IGNORE INTO project_profile_instructions VALUES (?, ?, ?)").run(args.projectId, args.profile, instructionSlug(args));
34
+ writePromptVersion({ ...args, slug: instructionSlug(args), action: args.restoreVersion === undefined ? undefined : "restore" }, now);
35
+ return getProjectProfileInstructions(args);
36
+ }
37
+
38
+ export const PROJECT_PROFILE_INSTRUCTION_READ_OPS = {
39
+ "projectProfileInstructions.get": getProjectProfileInstructions,
40
+ "projectProfileInstructions.history": (key: ProjectProfileKey) => promptHistory(instructionSlug(key)),
41
+ "projectProfileInstructions.list": (key: { projectId?: string; profile?: string }) => getDb().query(`SELECT ${columns}
42
+ FROM project_profile_instructions p LEFT JOIN prompt_heads h ON h.slug = p.slug
43
+ WHERE (?1 IS NULL OR p.project_id = ?1) AND (?2 IS NULL OR p.profile = ?2)`)
44
+ .all(key.projectId ?? null, key.profile ?? null) as ProjectProfileInstructions[],
45
+ };
46
+
47
+ export const PROJECT_PROFILE_INSTRUCTION_WRITE_OPS: Readonly<Record<string, WriterOpSpec>> = {
48
+ "projectProfileInstructions.write": { offLoop: true, idempotent: false,
49
+ fn: (args: Parameters<typeof writeProjectProfileInstructions>[0], ctx: WriterOpContext) => writeProjectProfileInstructions(args, ctx.now) },
50
+ };
@@ -68,9 +68,9 @@ export interface UpsertProjectTrustApprovalInput {
68
68
  /** Records `approvedValue` as the trusted content for this (profile, repo, capability), replacing
69
69
  * any prior approval — used both by the operator-triggered dashboard approve action and by the
70
70
  * gate's own grandfather-on-first-encounter path (decision #4). */
71
- export function upsertProjectTrustApproval(input: UpsertProjectTrustApprovalInput): ProjectTrustApproval {
71
+ export function upsertProjectTrustApproval(input: UpsertProjectTrustApprovalInput, submittedAt: number = Date.now()): ProjectTrustApproval {
72
72
  return writeTransaction(() => {
73
- const now = Date.now();
73
+ const now = submittedAt;
74
74
  const existing = getDb().query(`
75
75
  SELECT id FROM project_trust_approvals WHERE profile_name = ? AND repo_key = ? AND capability = ?
76
76
  `).get(input.profileName, input.repoKey, input.capability) as { id: string } | null;
@@ -74,8 +74,8 @@ export function listTemplates(category?: string): PromptTemplateRecord[] {
74
74
  return templates;
75
75
  }
76
76
 
77
- export function upsertTemplate(slug: string, template: string): void {
78
- const now = Date.now();
77
+ export function upsertTemplate(slug: string, template: string, submittedAt: number = Date.now()): void {
78
+ const now = submittedAt;
79
79
  if (versionedPromptSlot(slug)) {
80
80
  throw new ValidationError("Use the versioned prompt writer with expectedVersion and actor");
81
81
  }
@@ -83,11 +83,11 @@ export function upsertTemplate(slug: string, template: string): void {
83
83
  if ((result.changes ?? 0) === 0) throw new ValidationError(`prompt template ${slug} not found`);
84
84
  }
85
85
 
86
- export function resetTemplate(slug: string): void {
86
+ export function resetTemplate(slug: string, submittedAt: number = Date.now()): void {
87
87
  if (versionedPromptSlot(slug)) {
88
88
  throw new ValidationError("Use the versioned prompt writer with expectedVersion and actor");
89
89
  }
90
- const now = Date.now();
90
+ const now = submittedAt;
91
91
  const result = getDb().query("UPDATE prompt_templates SET template = default_template, updated_at = ? WHERE slug = ?").run(now, slug);
92
92
  if ((result.changes ?? 0) === 0) throw new ValidationError(`prompt template ${slug} not found`);
93
93
  }
@@ -5,6 +5,7 @@ import { PROFILE_PROMPT_SCHEMA_SQL } from "./prompt-version-migration";
5
5
  export { migratePromptVersions, promptLegacyHistory } from "./prompt-version-migration";
6
6
  import { bundledPrompt, hasBundledPrompt, BUNDLED_PROMPT_MANIFEST, profilePromptSlug, versionedPromptsEnabled } from "../versioned-prompts";
7
7
  import { getDb, ValidationError } from "./connection";
8
+ import { validateProjectProfileInstructionText } from "../project-profile-instruction-text";
8
9
 
9
10
  export const PROMPT_VERSIONS_SCHEMA_SQL = PROFILE_PROMPT_SCHEMA_SQL + `
10
11
  CREATE TABLE IF NOT EXISTS prompt_heads (
@@ -32,7 +33,10 @@ export function promptVersionMetadata(slug: string): Partial<PromptTemplate> | u
32
33
  if (!versionedPromptsEnabled()) return;
33
34
  const current = head(slug);
34
35
  const bundle = hasBundledPrompt(slug) ? bundledPrompt(slug) : undefined;
35
- if (!current && !bundle) return;
36
+ if (!current && !bundle) {
37
+ if (getDb().query("SELECT 1 FROM project_profile_instructions WHERE slug = ?").get(slug)) return { template: "", version: 0, updatedAt: 0, source: "canonical" };
38
+ return;
39
+ }
36
40
  return {
37
41
  template: current?.template ?? bundle!.template,
38
42
  version: current?.version ?? 0, seedHash: current?.seed_hash ?? null,
@@ -50,7 +54,8 @@ export function promptHistory(slug: string): PromptRevision[] {
50
54
  function checkedPromptHead(args: Pick<PromptWrite, "slug" | "expectedVersion">, current = head(args.slug)): Head | null {
51
55
  if (!versionedPromptsEnabled()) throw new ValidationError("versioned prompt not found");
52
56
  const mapped = !current && !hasBundledPrompt(args.slug) ? getDb().query(`SELECT 1 FROM prompt_profile_slots
53
- WHERE system_slug = ?1 OR EXISTS (SELECT 1 FROM json_each(append_slugs) WHERE value = ?1) LIMIT 1`).get(args.slug) : true;
57
+ WHERE system_slug = ?1 OR EXISTS (SELECT 1 FROM json_each(append_slugs) WHERE value = ?1)
58
+ UNION ALL SELECT 1 FROM project_profile_instructions WHERE slug = ?1 LIMIT 1`).get(args.slug) : true;
54
59
  if (!mapped) throw new ValidationError("versioned prompt not found");
55
60
  if (!Number.isSafeInteger(args.expectedVersion) || args.expectedVersion! < 0) throw new ValidationError(`expectedVersion for ${args.slug} must be a non-negative integer`);
56
61
  if (args.expectedVersion !== (current?.version ?? 0)) throw new PromptVersionConflictError(JSON.stringify({ slug: args.slug, ...promptVersionMetadata(args.slug), version: current?.version ?? 0 }));
@@ -70,6 +75,8 @@ function appendPromptVersion(args: PromptWrite, current: Head | null, now: numbe
70
75
  if (args.action === "restore" && !restored) throw new ValidationError("prompt revision not found");
71
76
  const template = args.action === "adopt" ? bundle!.template : restored?.template ?? args.template;
72
77
  if (template === undefined) throw new ValidationError("template required");
78
+ const projectProfile = getDb().query("SELECT project_id, profile FROM project_profile_instructions WHERE slug = ?").get(args.slug) as { project_id: string; profile: string } | null;
79
+ if (projectProfile) validateProjectProfileInstructionText(template, `project ${projectProfile.project_id} profile ${projectProfile.profile} instructions`);
73
80
  const seedHash = args.action === "adopt" ? bundle!.hash : restored ? restored.seedHash ?? null : current?.seed_hash ?? null;
74
81
  const version = (current?.version ?? 0) + 1;
75
82
  getDb().query("INSERT INTO prompt_revisions VALUES (?, ?, ?, ?, ?, ?, ?)")
@@ -13,11 +13,16 @@ function redactionPatch(env: unknown, nextEnv?: Record<string, unknown>): Record
13
13
  ).map(([key]) => [key, SECRET_VALUE_MASK]));
14
14
  }
15
15
 
16
- /** Update and delete archive through the same seam so neither persists credentials (#3540). */
17
- export function recordConfigHistory(entry: ConfigEntry, changedAt: string, changedBy?: string, nextValue?: unknown): void {
18
- const value = entry.namespace === "provider-config" && isRecord(entry.value) && isRecord(entry.value.env)
16
+ /** A config value with its provider credentials masked: what any copy outside the live row stores (#3540). */
17
+ export function credentialFreeConfigValue(entry: ConfigEntry, nextValue?: unknown): unknown {
18
+ return entry.namespace === "provider-config" && isRecord(entry.value) && isRecord(entry.value.env)
19
19
  ? { ...entry.value, env: { ...entry.value.env, ...redactionPatch(entry.value.env, isRecord(nextValue) && isRecord(nextValue.env) ? nextValue.env : undefined) } }
20
20
  : entry.value;
21
+ }
22
+
23
+ /** Update and delete archive through the same seam so neither persists credentials (#3540). */
24
+ export function recordConfigHistory(entry: ConfigEntry, changedAt: string, changedBy?: string, nextValue?: unknown): void {
25
+ const value = credentialFreeConfigValue(entry, nextValue);
21
26
  getDb().query(`
22
27
  INSERT INTO config_history (namespace, key, value, version, changed_at, changed_by)
23
28
  VALUES (?, ?, ?, ?, ?, ?)
@@ -0,0 +1,34 @@
1
+ import { providerCatalogList } from "@humwick/sdk/provider-catalog";
2
+ import { getDb } from "./connection";
3
+
4
+ const SEED_KEY = "provider-model-db-catalog-v1";
5
+
6
+ /** One migration backfills missing rows; later boots and releases leave the database alone. */
7
+ export function reconcileProviderModelSeed(): void {
8
+ const db = getDb();
9
+ if (db.query("SELECT 1 FROM config WHERE namespace = 'system' AND key = ?").get(SEED_KEY)) return;
10
+ db.transaction(() => {
11
+ seedProviderModelOverrides("seed:db-catalog-v1");
12
+ db.query("INSERT INTO config (namespace, key, value, version, updated_at, updated_by) VALUES ('system', ?, 'true', 1, ?, 'server-startup')")
13
+ .run(SEED_KEY, Date.now());
14
+ })();
15
+ }
16
+
17
+ /** Insert-only migration: operator edits, disabled entries and tombstones always win. */
18
+ export function seedProviderModelOverrides(stamp: string, now = Date.now()): { inserted: number } {
19
+ const db = getDb();
20
+ const insert = db.query(`INSERT INTO provider_model_overrides (provider, alias, entry, deleted, disabled, updated_at, updated_by)
21
+ VALUES (?, ?, ?, 0, ?, ?, ?) ON CONFLICT(provider, alias) DO NOTHING`);
22
+ const defaultModel = db.query(`INSERT INTO provider_model_defaults (provider, alias, updated_at, updated_by)
23
+ VALUES (?, ?, ?, ?) ON CONFLICT(provider) DO NOTHING`);
24
+ return db.transaction(() => {
25
+ let inserted = 0;
26
+ for (const provider of providerCatalogList()) {
27
+ for (const model of provider.models) {
28
+ inserted += insert.run(provider.provider, model.alias, JSON.stringify(model), model.disabled ? 1 : 0, now, stamp).changes;
29
+ }
30
+ if (provider.defaultModel) defaultModel.run(provider.provider, provider.defaultModel, now, stamp);
31
+ }
32
+ return { inserted };
33
+ })();
34
+ }
@@ -101,6 +101,9 @@ export const KERNEL_ENTITY_CATALOG = {
101
101
  } as const;
102
102
 
103
103
  export const READ_OP_MARSHALING_FIXTURES: ReadOpFixtures = {
104
+ "projectProfileInstructions.get": { args: { projectId: "missing", profile: "worker" } },
105
+ "projectProfileInstructions.history": { args: { projectId: "missing", profile: "worker" } },
106
+ "projectProfileInstructions.list": { args: { projectId: "missing" } },
104
107
  "planGraph.import.preview": { args: { scope: "import-fixture", actor: "system", expectedVersion: 0, requestKey: "preview", documentHash: "h", requestHash: "h", newPlanId: "plan-fixture", executions: { a: { workflow: "build-review" } }, document: { version: 1, key: "fixture", revision: "r1", title: "Fixture", acceptance: [{ id: "works", text: "Works" }], tasks: [{ key: "a", title: "A", intent: "Build A" }] } } },
105
108
  "guides.search": { args: { query: "violet", guides: [{ id: "workflows", title: "Workflows", summary: "Build and review", tags: ["review"], body: "A violet checksum", revision: "fixture-revision" }] } },
106
109
  "commands.latestByCorrelation": { args: { type: "scheduler.cancel", correlationId: "fixture" } },
@@ -164,6 +167,7 @@ export const READ_OP_MARSHALING_FIXTURES: ReadOpFixtures = {
164
167
 
165
168
  // --- channels / projects / teams / hosts --------------------------------------------------------
166
169
  "channels.bindingOwner": { args: { id: "binding-t9" } },
170
+ "integrations.taskStats": { args: undefined },
167
171
  "channels.snapshot": { args: undefined },
168
172
  "channels.bindings": { args: {} },
169
173
  "channels.routes": { args: { channelId: "channel-t9" } },
@@ -187,6 +191,16 @@ export const READ_OP_MARSHALING_FIXTURES: ReadOpFixtures = {
187
191
  "projects.resolveEntries": { args: { projectId: SEED.projectId } },
188
192
  "projects.readMemoryEntriesByIds": { args: { identity: { projectId: SEED.projectId }, ids: ["pe_t9_alpha"] } },
189
193
  "projects.memoryPreamble": { args: { identity: { projectId: SEED.projectId }, options: {} } },
194
+ "issueRefs.list": { args: { limit: 10 } },
195
+ "automations.listRuns": { args: { limit: 10 } },
196
+ "automations.pendingPrecheckRuns": { args: undefined },
197
+ "automations.reconcilableRuns": { args: undefined },
198
+ "automations.dispatchableQueuedRuns": { args: undefined },
199
+ "automations.dueAutomations": { args: { now: 1_700_000_000_000 } },
200
+ "projectEntries.get": { args: { id: "pe_t9_alpha" } },
201
+ "projectEntries.chain": { args: { id: "pe_t9_alpha" } },
202
+ "projectEntries.inArea": { args: { projectId: SEED.projectId, area: "db" } },
203
+ "projectEntries.countPinnedInArea": { args: { projectId: SEED.projectId, area: "db" } },
190
204
  "projectEntries.list": { args: { projectId: SEED.projectId } },
191
205
  "projectEntries.search": { args: { projectId: SEED.projectId, query: "t9" } },
192
206
  "teams.spawnDelegation.get": { args: { teamId: SEED.teamId } },
@@ -216,6 +230,7 @@ export const READ_OP_MARSHALING_FIXTURES: ReadOpFixtures = {
216
230
  "ciIncidents.sha.hasExpired": { args: { now: FIXTURE_NOW } },
217
231
  "ciIncidents.lease.hasExpired": { args: { now: FIXTURE_NOW } },
218
232
  "deployEvents.get": { args: { id: "dep-t9" } },
233
+ "deployEvents.forCommit": { args: { commitSha: "a".repeat(40) } },
219
234
  // #2189 P7 — restart-epoch reads. Every one is a point/keyset read against ids that do not exist in
220
235
  // the fixture DB, which is the point: marshaling has to survive the empty answer too.
221
236
  "restartEpoch.openAll": { args: undefined },
@@ -237,6 +252,7 @@ export const READ_OP_MARSHALING_FIXTURES: ReadOpFixtures = {
237
252
  // --- commands / codex reset / inbox / insights --------------------------------------------------
238
253
  "commands.spawnOutcome": { args: { spawnRequestId: "spawn-t9" } },
239
254
  "commands.get": { args: { id: SEED.commandId } },
255
+ "commands.latestAttempt": { args: { baseId: SEED.commandId } },
240
256
  "commands.listLegacyLandingBackfillCandidates": { args: { afterId: "", limit: 10 } },
241
257
  // `observedAt` is the dispatcher's own `ctx.now`, so the in-process and worker runs legitimately
242
258
  // stamp different clock readings for the same DB state — normalize it out or the #1960 worker-seam
@@ -709,6 +725,12 @@ export function seedReadOpMarshalingData(): void {
709
725
  VALUES ('t9', 't9 claimed task', 't9', 'info', 'in_progress', 't9', 'claim', ?, ?, ?, ?, ?)`,
710
726
  ).run(SEED.agentId, t - 1, t, t, t);
711
727
 
728
+ // An open task-bound run so the automation scan ops marshal a NON-trivial run (meta/result JSON parsed worker-side).
729
+ db.query(
730
+ `INSERT INTO automation_runs (id, automation_id, status, scheduled_for, orchestrator_id, task_id, meta, created_at, updated_at)
731
+ VALUES ('run-t9', 'automation-t9', 'running', ?, 'orch-t9', 1, '{"k":"v"}', ?, ?)`,
732
+ ).run(t, t, t);
733
+
712
734
  // Project-entries rows so `projectEntries.list`/`search` marshal NON-trivial results:
713
735
  // two active rows the query term hits, plus a retracted row proving mixed-status parity.
714
736
  for (const [id, title, body, status, updatedAt] of [
@@ -720,5 +742,6 @@ export function seedReadOpMarshalingData(): void {
720
742
  `INSERT INTO project_entries (id, project_id, kind, title, body, status, tags, author_id, source, audience, inject, sensitivity, created_at, updated_at)
721
743
  VALUES (?, ?, 'rule', ?, ?, ?, '["t9"]', ?, 'manual', 'all', 'indexed', 'normal', ?, ?)`,
722
744
  ).run(id, SEED.projectId, title, body, status, SEED.agentId, updatedAt, updatedAt);
745
+ db.query("UPDATE project_entries SET areas = ?, inject = ? WHERE id = ?").run('["db"]', "pinned", id);
723
746
  }
724
747
  }
@@ -1,4 +1,6 @@
1
+ import { INTEGRATIONS_READ_OPS } from "./integrations-ops.ts";
1
2
  import { PROMPT_VERSION_READ_OPS } from "./prompt-versions-ops";
3
+ import { PROJECT_PROFILE_INSTRUCTION_READ_OPS } from "./project-profile-instructions";
2
4
  import { VAULT_READ_OPS } from "./secrets-vault";
3
5
  import { GUIDE_READ_OPS } from "./guides-search";
4
6
  import { ROUTING_POLICY_READ_OPS } from "./routing-policy";
@@ -61,6 +63,8 @@ import { ARTIFACTS_READ_OPS } from "./artifacts-read-ops.ts";
61
63
  import { PLANS_READ_OPS } from "./plans-read-ops.ts";
62
64
  import { CONTINUATION_ARCHIVES_READ_OPS } from "./continuation-archives-read-ops.ts";
63
65
  import { WORKFLOW_JOURNAL_READ_OPS } from "./workflow-journal-read-ops.ts";
66
+ import { AUTOMATION_READ_OPS } from "./automation-read-ops.ts";
67
+ import { ISSUE_REFS_READ_OPS } from "./issue-refs-read-ops.ts";
64
68
  import { PROJECTS_READ_OPS } from "./projects-read-ops.ts";
65
69
  import { PROJECT_ENTRIES_READ_OPS } from "./project-entries-read-ops.ts";
66
70
  import { CHANNELS_READ_OPS } from "./channels-read-ops.ts";
@@ -129,6 +133,7 @@ const SPIN_MAX_MS = 2_000;
129
133
  export const readOps = {
130
134
  ...GUIDE_READ_OPS,
131
135
  ...PROMPT_VERSION_READ_OPS,
136
+ ...PROJECT_PROFILE_INSTRUCTION_READ_OPS,
132
137
  ...SERVICE_ACCESS_READ_OPS,
133
138
  ...VAULT_TOKEN_READ_OPS,
134
139
  ...VAULT_HEALTH_READ_OPS,
@@ -253,7 +258,10 @@ export const readOps = {
253
258
  ...WORKFLOW_JOURNAL_READ_OPS,
254
259
  ...PROJECTS_READ_OPS,
255
260
  ...PROJECT_ENTRIES_READ_OPS,
261
+ ...AUTOMATION_READ_OPS,
262
+ ...ISSUE_REFS_READ_OPS,
256
263
  ...CHANNELS_READ_OPS,
264
+ ...INTEGRATIONS_READ_OPS,
257
265
  } satisfies Record<string, ReadOpFn>;
258
266
 
259
267
  /** The registered read-op names. */