@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,645 +0,0 @@
1
- // Ensure zod carries `.openapi()` before {@link jsonValueSchema} is built below — a named component
2
- // ref is what stops the recursive schema from stack-overflowing OpenAPI generation (see that schema).
3
- // Idempotent (module-cached); `index.ts` also imports it first, this covers a direct `./control` import.
4
- import "./openapi-init";
5
- import { z } from "zod";
6
- import {
7
- type Grant,
8
- type JsonValue,
9
- type ModuleCtx,
10
- type ModuleDefinition,
11
- type Scope,
12
- type WorkflowStatusName,
13
- OpError,
14
- defineModule,
15
- } from "./contract";
16
- import type {
17
- ListInstancesOptions,
18
- WorkflowInstancePage,
19
- WorkflowInstanceRow,
20
- WorkflowStepJournalRow,
21
- } from "./workflow-journal";
22
- import type { EmittedEvent, EventReplaySlice } from "./event-log";
23
- import { WorkflowHistoryExpiredError } from "./workflow-journal";
24
- import type { EntityRawListOptions, EntityRawPage, EntityRawRow } from "./persistence";
25
-
26
- /**
27
- * KAPI-1 Wave 2 — the kernel **Control** module (`id: "control"`): merged read ops (K1-3) + control
28
- * ops (K1-5) over the Kernel's generic `workflow_instances` / `kernel_events` / `kernel_entity__*`
29
- * tables (KAPI-0 design `docs/kernel-control-api.md`; epic #1415). It is the authz + projection
30
- * layer: the raw accessors it wraps (Wave 1) and the control primitives it maps onto (base) are
31
- * deliberately ungated — G-M1 owner-scoping and G-M5 fail-closed redaction live HERE.
32
- *
33
- * Because a module's `ctx` only ever sees its OWN entities/events, the cross-module reader/controller
34
- * capabilities are INJECTED (via {@link createControlModule}), not reached through `ctx` — see
35
- * {@link ControlModuleDeps} and `ModuleHost.kernelControlDeps`.
36
- *
37
- * ── Security posture (the crux of the review) ──────────────────────────────────────────────────
38
- * G-M1 (grant model): the single in-handler `.has(CONTROL_ADMIN_GRANT)` check ({@link isControlAdmin})
39
- * is the cross-creator flag. A non-admin `control:read`/`control:write` principal sees/controls only
40
- * rows whose `created_by` equals its own actor ({@link canSeeInstance} / the keyed `createdBy` list
41
- * filter); an admin crosses creators. The `*System` twins are the reconciler seam — grant
42
- * `control:admin`, `expose:{http:false,mcp:false,cli:false}`, cross-creator by construction, never
43
- * surfaced to a normal caller (the `cancelMirror` precedent generalized).
44
- * G-M5 (fail-closed): every default is deny/redact. A NULL/unresolvable owner NEVER matches a
45
- * non-admin (SQL equality + {@link canSeeInstance}), so an unknown owner hides the row rather than
46
- * exposing it (#1410 R1). Sensitive DTO fields (`input`/`state`/`output`/`error`/`owner`/entity
47
- * `fields`/event `payload`/lease token) are OMITTED unless admin ({@link project*} builders).
48
- * `listEvents`/`listEntities`/`getEntity` read tables with NO generic owner column, so per-creator
49
- * scoping is impossible — they are admin-only in-handler (a non-admin is denied), the strict
50
- * fail-closed reading pending the deferred per-module allowlist (KAPI-0 decision 5).
51
- */
52
-
53
- // ── Grant vocabulary (KAPI-0 §3.1) ────────────────────────────────────────────────────────────────
54
- export const CONTROL_MODULE_ID = "control";
55
- /** Read the observability surface (metadata; own instances only for a non-admin). */
56
- export const CONTROL_READ_GRANT = "control:read" satisfies Grant;
57
- /** Cancel / pause / resume / retry OWN instances. */
58
- export const CONTROL_WRITE_GRANT = "control:write" satisfies Grant;
59
- /** Module-matched admin: cross-creator read + control, the ungated (payload/state/fields) view, and
60
- * the OP-LEVEL grant the `*System` twins require. */
61
- export const CONTROL_ADMIN_GRANT = "control:admin" satisfies Grant;
62
- /** The GLOBAL admin grant. Mirrors the timers `canAdministerTimers` seam (`TIMERS_ADMIN_GRANT =
63
- * "system:admin"`): a global admin crosses creators on the exposed read/control ops (KAPI-0 §3.1
64
- * "control:admin (or system:admin)"). It does NOT reach the `*System` twins — those require the
65
- * module-matched {@link CONTROL_ADMIN_GRANT} exactly, so a global admin can observe/control across
66
- * creators through the normal surface but cannot invoke the narrow reconciler seam without the
67
- * module-scoped grant. */
68
- export const SYSTEM_ADMIN_GRANT = "system:admin" satisfies Grant;
69
-
70
- // ── Injected kernel-wide capabilities (a module's ctx cannot reach cross-module state) ─────────────
71
-
72
- /** Read side of the workflow journal the control module needs (Wave-1 G-A accessor + base reads). */
73
- export interface InstanceReader {
74
- listInstances(options?: ListInstancesOptions): Promise<WorkflowInstancePage>;
75
- getInstance(id: string): Promise<WorkflowInstanceRow | undefined>;
76
- listSteps(instanceId: string): Promise<WorkflowStepJournalRow[]>;
77
- }
78
-
79
- /** Control-primitive side (base T912): the module maps cancel/pause/resume/retry onto these — it
80
- * does NOT re-implement them. Every primitive is OPEN-guarded, idempotent, and authz-free (the
81
- * owner check is the module's job), mirroring the timers `cancel`/`cancelMirror` split. */
82
- export interface InstanceController {
83
- cancelInstance(id: string): Promise<boolean>;
84
- pauseInstance(id: string): Promise<boolean>;
85
- resumeInstance(id: string): Promise<boolean>;
86
- reopenInstance(id: string): Promise<boolean>;
87
- }
88
-
89
- /** Read side of the event log (Wave-1 G-D `moduleId` replay filter). */
90
- export interface EventReader {
91
- replay(scope: Scope, since: number, limit?: number, moduleId?: string): Promise<EventReplaySlice>;
92
- }
93
-
94
- /** Generic `(module, entity)` entity reads (Wave-1 G-C accessors). */
95
- export interface EntityReader {
96
- readEntity(moduleId: string, entityName: string, scope: Scope, key: unknown): Promise<EntityRawRow | undefined>;
97
- listEntity(moduleId: string, entityName: string, scope: Scope, options?: EntityRawListOptions): Promise<EntityRawPage>;
98
- }
99
-
100
- /** The capabilities {@link createControlModule} closes over. The concrete kernel persistence classes
101
- * (`WorkflowJournalPersistence`, `EventLogPersistence`, `EntityPersistence`) satisfy these
102
- * structurally, so `ModuleHost.kernelControlDeps()` hands them straight through. */
103
- export interface ControlModuleDeps {
104
- readonly journal: InstanceReader & InstanceController;
105
- readonly events: EventReader;
106
- readonly entities: EntityReader;
107
- }
108
-
109
- // ── DTO schemas (metadata-first; gated fields `.optional()` and populated only for admin) ──────────
110
-
111
- const statusSchema = z.enum([
112
- "pending", "running", "sleeping", "waiting", "done", "failed", "canceled",
113
- ]);
114
-
115
- const waitKindSchema = z.object({ kind: z.enum(["event", "command"]) });
116
-
117
- // A recursive JSON value. The `.openapi("JsonValue")` refId is load-bearing, NOT cosmetic: OpenAPI
118
- // generation expands schemas inline, and a bare `z.lazy` self-reference recurses without bound —
119
- // `GET /openapi.json` on a registered control module stack-overflows (RangeError) → 500. Naming the
120
- // component makes each self-reference emit a `$ref: "#/components/schemas/JsonValue"` instead of
121
- // re-expanding, so doc generation terminates while the runtime parse behaviour is unchanged.
122
- const jsonValueSchema: z.ZodType<JsonValue> = z.lazy(() =>
123
- z.union([
124
- z.string(), z.number(), z.boolean(), z.null(),
125
- z.array(jsonValueSchema),
126
- z.record(z.string(), jsonValueSchema),
127
- ]),
128
- ).openapi("JsonValue") as z.ZodType<JsonValue>;
129
-
130
- const instanceSummarySchema = z.object({
131
- id: z.string(),
132
- module: z.string(),
133
- workflow: z.string(),
134
- status: statusSchema,
135
- pausedAt: z.number().optional(),
136
- owner: z.string().optional(), // GATED (admin)
137
- createdAt: z.number(),
138
- updatedAt: z.number(),
139
- closedAt: z.number().optional(),
140
- sleepUntil: z.number().optional(),
141
- waiting: waitKindSchema.optional(),
142
- hasError: z.boolean(),
143
- });
144
-
145
- const instanceDetailSchema = instanceSummarySchema.extend({
146
- idempotencyKey: z.string(),
147
- attempts: z.number(),
148
- input: jsonValueSchema.optional(), // GATED
149
- currentState: jsonValueSchema.optional(), // GATED
150
- output: jsonValueSchema.optional(), // GATED
151
- error: z.string().optional(), // GATED
152
- lease: z.object({ held: z.boolean(), expiresAt: z.number().optional() }).optional(),
153
- });
154
-
155
- const journalEntrySchema = z.object({
156
- seq: z.number(),
157
- stepIndex: z.number(),
158
- stepName: z.string(),
159
- attempt: z.number(),
160
- outcome: z.enum(["completed", "failed"]),
161
- startedAt: z.number(),
162
- completedAt: z.number(),
163
- sleepUntil: z.number().optional(),
164
- waitFor: waitKindSchema.optional(),
165
- state: jsonValueSchema.optional(), // GATED
166
- result: jsonValueSchema.optional(), // GATED
167
- });
168
-
169
- const eventSchema = z.object({
170
- seq: z.number(),
171
- module: z.string(),
172
- name: z.string(),
173
- createdAt: z.number(),
174
- payload: jsonValueSchema.optional(), // GATED
175
- });
176
-
177
- const entityRowSchema = z.object({
178
- module: z.string(),
179
- entity: z.string(),
180
- key: z.string(),
181
- scope: z.string(),
182
- version: z.number(),
183
- createdAt: z.number(),
184
- updatedAt: z.number(),
185
- fields: jsonValueSchema.optional(), // GATED
186
- });
187
-
188
- const changedSchema = z.object({ changed: z.boolean() });
189
-
190
- export type KernelInstanceSummary = z.output<typeof instanceSummarySchema>;
191
- export type KernelInstanceDetail = z.output<typeof instanceDetailSchema>;
192
- export type KernelJournalEntry = z.output<typeof journalEntrySchema>;
193
- export type KernelEvent = z.output<typeof eventSchema>;
194
- export type KernelEntityRow = z.output<typeof entityRowSchema>;
195
-
196
- // ── Authz + projection helpers (G-M1 / G-M5) ──────────────────────────────────────────────────────
197
-
198
- /** G-M1: the cross-creator flag. Holding the module-matched `control:admin` OR the global
199
- * `system:admin` is the ONLY way to cross creators (read or control) or to see gated fields. This is
200
- * the in-handler `.has()` check the threat model mandates — default-deny: absent the flag, a
201
- * principal is pinned to its own `created_by`. */
202
- function isControlAdmin(ctx: ModuleCtx): boolean {
203
- return ctx.principal.grants.has(CONTROL_ADMIN_GRANT) || ctx.principal.grants.has(SYSTEM_ADMIN_GRANT);
204
- }
205
-
206
- /** G-M1 / G-M5: may this principal SEE this instance row at all? An admin sees every row; a non-admin
207
- * sees only its own `created_by`. Fail-closed: a NULL/absent owner never matches a non-admin, so an
208
- * unresolvable owner HIDES the row (never falls open — the #1410 R1 lesson). */
209
- function canSeeInstance(ctx: ModuleCtx, row: WorkflowInstanceRow): boolean {
210
- if (isControlAdmin(ctx)) return true;
211
- return row.created_by !== null && row.created_by === ctx.principal.actor;
212
- }
213
-
214
- /** The 404 a non-owner / missing id both yield — no existence oracle (mirrors `timers.get`). */
215
- function notFound(id: string): OpError {
216
- return new OpError("not_found", 404, `instance '${id}' was not found`);
217
- }
218
-
219
- /** The 403 the generic (owner-less) entity/event surface returns to a non-admin: those tables carry
220
- * no owner column, so per-creator scoping is impossible → admin-only until the allowlist lands. */
221
- function adminOnly(op: string): OpError {
222
- return new OpError("forbidden", 403, `'${op}' requires the '${CONTROL_ADMIN_GRANT}' grant`);
223
- }
224
-
225
- /** Parse the JSON `wait_for` blob into its KIND ONLY — never the correlationId/commandId (K-C3). */
226
- function projectWaitKind(waitFor: string | null): { kind: "event" | "command" } | undefined {
227
- if (waitFor === null) return undefined;
228
- try {
229
- const parsed = JSON.parse(waitFor) as { kind?: unknown };
230
- if (parsed.kind === "event" || parsed.kind === "command") return { kind: parsed.kind };
231
- } catch {
232
- // Fail-closed: an unparseable wait blob discloses nothing (shape omitted, never the raw string).
233
- }
234
- return undefined;
235
- }
236
-
237
- /** Best-effort JSON decode of a stored column; returns undefined on null/parse failure (never the
238
- * raw string, so a malformed blob cannot leak). */
239
- function decodeJson(raw: string | null): JsonValue | undefined {
240
- if (raw === null) return undefined;
241
- try {
242
- return JSON.parse(raw) as JsonValue;
243
- } catch {
244
- return undefined;
245
- }
246
- }
247
-
248
- function toStatus(raw: string): WorkflowStatusName {
249
- return raw as WorkflowStatusName;
250
- }
251
-
252
- /** Metadata-first instance summary. `owner` is GATED — populated only for an admin (G-M5). */
253
- function projectSummary(row: WorkflowInstanceRow, admin: boolean): KernelInstanceSummary {
254
- return {
255
- id: row.id,
256
- module: row.module_name,
257
- workflow: row.workflow_name,
258
- status: toStatus(row.status),
259
- ...(row.paused_at !== null ? { pausedAt: row.paused_at } : {}),
260
- ...(admin && row.created_by !== null ? { owner: row.created_by } : {}),
261
- createdAt: row.created_at,
262
- updatedAt: row.updated_at,
263
- ...(row.closed_at !== null ? { closedAt: row.closed_at } : {}),
264
- ...(row.sleep_until !== null ? { sleepUntil: row.sleep_until } : {}),
265
- ...(projectWaitKind(row.wait_for) ? { waiting: projectWaitKind(row.wait_for) } : {}),
266
- hasError: row.failure !== null,
267
- };
268
- }
269
-
270
- /** Instance detail. `input`/`currentState`/`output`/`error` are GATED (admin only, G-M5); the lease
271
- * is liveness-only and NEVER carries the token (K-C3). */
272
- function projectDetail(row: WorkflowInstanceRow, steps: readonly WorkflowStepJournalRow[], admin: boolean): KernelInstanceDetail {
273
- const latest = steps.at(-1);
274
- const held = row.executor_lease_token !== null;
275
- return {
276
- ...projectSummary(row, admin),
277
- idempotencyKey: row.idempotency_key,
278
- attempts: row.journal_cursor,
279
- ...(admin && decodeJson(row.input) !== undefined ? { input: decodeJson(row.input) } : {}),
280
- ...(admin && latest && decodeJson(latest.state_snapshot) !== undefined
281
- ? { currentState: decodeJson(latest.state_snapshot) } : {}),
282
- ...(admin && decodeJson(row.output) !== undefined ? { output: decodeJson(row.output) } : {}),
283
- ...(admin && row.failure !== null ? { error: failureMessage(row.failure) } : {}),
284
- lease: {
285
- held,
286
- ...(row.executor_lease_expires_at !== null ? { expiresAt: row.executor_lease_expires_at } : {}),
287
- },
288
- };
289
- }
290
-
291
- /** A human-ish message from the JSON failure blob without leaking the whole structure to a non-admin
292
- * (this is only ever called under an admin guard, but stays defensive). */
293
- function failureMessage(failure: string): string {
294
- const decoded = decodeJson(failure);
295
- if (decoded !== null && typeof decoded === "object" && !Array.isArray(decoded)) {
296
- const message = (decoded as Record<string, JsonValue>).message;
297
- if (typeof message === "string") return message;
298
- }
299
- return typeof decoded === "string" ? decoded : failure;
300
- }
301
-
302
- /** Journal entry. `state`/`result` are GATED (admin only); `waitFor` is shape-only (K-C3). */
303
- function projectJournalEntry(row: WorkflowStepJournalRow, admin: boolean): KernelJournalEntry {
304
- return {
305
- seq: row.seq,
306
- stepIndex: row.step_index,
307
- stepName: row.step_name,
308
- attempt: row.attempt,
309
- outcome: row.outcome === "failed" ? "failed" : "completed",
310
- startedAt: row.started_at,
311
- completedAt: row.completed_at,
312
- ...(row.sleep_until !== null ? { sleepUntil: row.sleep_until } : {}),
313
- ...(projectWaitKind(row.wait_for) ? { waitFor: projectWaitKind(row.wait_for) } : {}),
314
- ...(admin && decodeJson(row.state_snapshot) !== undefined ? { state: decodeJson(row.state_snapshot) } : {}),
315
- ...(admin && decodeJson(row.result) !== undefined ? { result: decodeJson(row.result) } : {}),
316
- };
317
- }
318
-
319
- /** Event DTO. `payload` is GATED (admin only, K-C3). Reached only under an admin guard today. */
320
- function projectEvent(event: EmittedEvent, admin: boolean): KernelEvent {
321
- return {
322
- seq: event.seq,
323
- module: event.moduleId,
324
- name: event.name,
325
- createdAt: event.createdAt,
326
- ...(admin && event.payload !== undefined ? { payload: event.payload as JsonValue } : {}),
327
- };
328
- }
329
-
330
- /** Entity DTO. `fields` is GATED (admin only, K-C3 — the timers `relaySend` outbox holds the frozen
331
- * create-time identity, so its columns are NEVER returned to a non-admin). Reached only under an
332
- * admin guard today. */
333
- function projectEntity(row: EntityRawRow, admin: boolean): KernelEntityRow {
334
- return {
335
- module: row.module,
336
- entity: row.entity,
337
- key: String(row.key),
338
- scope: row.scope,
339
- version: row.version,
340
- createdAt: row.createdAt,
341
- updatedAt: row.updatedAt,
342
- ...(admin && row.fields !== undefined ? { fields: row.fields as JsonValue } : {}),
343
- };
344
- }
345
-
346
- // ── Control-op body (shared by the creator-facing op and its `*System` twin) ───────────────────────
347
-
348
- /** Run one control PRIMITIVE against an instance after the owner gate. The creator-facing path passes
349
- * `enforceOwner: true` (a non-admin may act only on its own instance; a non-owner/absent id yields the
350
- * same 404 → no existence oracle, K-C2). The `*System` twin passes `enforceOwner: false` — it crosses
351
- * creators by construction and is `control:admin`-gated at the op level, so it never reaches a
352
- * non-admin. The primitive itself is idempotent + terminal-safe, so a repeat/no-op cannot corrupt
353
- * state. Returns whether the primitive changed anything. */
354
- async function runControl(
355
- ctx: ModuleCtx,
356
- deps: ControlModuleDeps,
357
- id: string,
358
- primitive: (id: string) => Promise<boolean>,
359
- enforceOwner: boolean,
360
- ): Promise<boolean> {
361
- if (enforceOwner) {
362
- const row = await deps.journal.getInstance(id);
363
- if (!row || !canSeeInstance(ctx, row)) throw notFound(id);
364
- }
365
- try {
366
- return await primitive(id);
367
- } catch (error) {
368
- // A retry whose journal retention already pruned is a 409, not a silent "pending" (#3018).
369
- if (error instanceof WorkflowHistoryExpiredError) throw new OpError("history_expired", 409, error.message);
370
- throw error;
371
- }
372
- }
373
-
374
- /** Re-fetch and project the post-control summary for a creator-facing op (the row is guaranteed to
375
- * exist — the owner gate already read it). */
376
- async function controlResult(ctx: ModuleCtx, deps: ControlModuleDeps, id: string): Promise<KernelInstanceSummary> {
377
- const row = await deps.journal.getInstance(id);
378
- if (!row) throw notFound(id);
379
- return projectSummary(row, isControlAdmin(ctx));
380
- }
381
-
382
- const idInput = z.object({ id: z.string().min(1) });
383
- const listInstancesInput = z.object({
384
- module: z.string().optional(),
385
- workflow: z.string().optional(),
386
- status: statusSchema.optional(),
387
- cursor: z.string().optional(),
388
- limit: z.coerce.number().int().min(1).max(200).optional(),
389
- });
390
- const pageOutput = <T extends z.ZodType>(item: T) => z.object({ items: z.array(item), cursor: z.string().optional() });
391
-
392
- /**
393
- * Build the `control` module bound to the injected kernel-wide capabilities. A FACTORY (not a static
394
- * `defineModule` const) because the op handlers must close over `deps` — a module's `ctx` cannot reach
395
- * cross-module journal/event/entity state. The returned manifest is a normal validated
396
- * {@link ModuleDefinition}; `ModuleHost.register` installs it and serves its ops through the same
397
- * default-deny invoker every other module uses.
398
- */
399
- export function createControlModule(deps: ControlModuleDeps) {
400
- return defineModule({
401
- id: CONTROL_MODULE_ID,
402
- title: "Kernel control & observability",
403
- description: "Module-agnostic read + control surface over the Kernel's generic instance/event/entity tables (KAPI-1).",
404
- ops: {
405
- // ── 6 read ops (K1-3) ──────────────────────────────────────────────────────────────────────
406
- // Instance reads ARE creator-scoped via the landed `created_by` column (G-M1).
407
- listInstances: {
408
- kind: "query",
409
- grant: CONTROL_READ_GRANT,
410
- summary: "List workflow instances (own only for a non-admin), filtered by module/workflow/status.",
411
- http: { method: "GET", path: "/instances" },
412
- input: listInstancesInput,
413
- output: pageOutput(instanceSummarySchema),
414
- handler: async (ctx, input) => {
415
- const admin = isControlAdmin(ctx);
416
- // G-M1: a non-admin is pinned to its own actor via the keyed `createdBy` filter (which also
417
- // excludes NULL-owner rows); an admin omits it and crosses creators.
418
- const page = await deps.journal.listInstances({
419
- ...(input.module !== undefined ? { module: input.module } : {}),
420
- ...(input.workflow !== undefined ? { workflow: input.workflow } : {}),
421
- ...(input.status !== undefined ? { status: input.status } : {}),
422
- ...(admin ? {} : { createdBy: ctx.principal.actor }),
423
- ...(input.cursor !== undefined ? { cursor: input.cursor } : {}),
424
- ...(input.limit !== undefined ? { limit: input.limit } : {}),
425
- });
426
- return {
427
- items: page.items.map((row) => projectSummary(row, admin)),
428
- ...(page.cursor !== undefined ? { cursor: page.cursor } : {}),
429
- };
430
- },
431
- },
432
- getInstance: {
433
- kind: "query",
434
- grant: CONTROL_READ_GRANT,
435
- summary: "Fetch one workflow instance's detail (own only for a non-admin).",
436
- http: { method: "GET", path: "/instances/{id}" },
437
- input: idInput,
438
- output: instanceDetailSchema,
439
- handler: async (ctx, input) => {
440
- const row = await deps.journal.getInstance(input.id);
441
- // G-M1 / G-M5: a non-owner gets the SAME 404 a missing id yields (no existence oracle).
442
- if (!row || !canSeeInstance(ctx, row)) throw notFound(input.id);
443
- const admin = isControlAdmin(ctx);
444
- const steps = admin ? await deps.journal.listSteps(input.id) : [];
445
- return projectDetail(row, steps, admin);
446
- },
447
- },
448
- getJournal: {
449
- kind: "query",
450
- grant: CONTROL_READ_GRANT,
451
- summary: "The step-journal ledger for one instance (own only for a non-admin).",
452
- http: { method: "GET", path: "/instances/{id}/journal" },
453
- input: idInput,
454
- output: pageOutput(journalEntrySchema),
455
- handler: async (ctx, input) => {
456
- // Fail-closed: prove instance ownership BEFORE returning any journal row.
457
- const row = await deps.journal.getInstance(input.id);
458
- if (!row || !canSeeInstance(ctx, row)) throw notFound(input.id);
459
- const admin = isControlAdmin(ctx);
460
- const steps = await deps.journal.listSteps(input.id);
461
- return { items: steps.map((s) => projectJournalEntry(s, admin)) };
462
- },
463
- },
464
- // Event + entity reads have NO generic owner column → admin-only (fail-closed, G-M5).
465
- listEvents: {
466
- kind: "query",
467
- grant: CONTROL_READ_GRANT,
468
- // O3: entry-gated on control:read, but admin-only in-handler (owner-less table). Advertise the
469
- // REAL requirement so the derived MCP/OpenAPI surface never names a scope that always 403s.
470
- advertiseScopes: [CONTROL_ADMIN_GRANT],
471
- summary: "List kernel events for a module (admin-only: events carry no creator column).",
472
- http: { method: "GET", path: "/events" },
473
- input: z.object({
474
- module: z.string().optional(),
475
- since: z.coerce.number().int().min(0).optional(),
476
- limit: z.coerce.number().int().min(1).max(200).optional(),
477
- }),
478
- output: z.object({ items: z.array(eventSchema), lastSeq: z.number(), truncated: z.boolean() }),
479
- handler: async (ctx, input) => {
480
- if (!isControlAdmin(ctx)) throw adminOnly("listEvents");
481
- const slice = await deps.events.replay(
482
- ctx.principal.scope,
483
- input.since ?? 0,
484
- input.limit ?? 50,
485
- input.module,
486
- );
487
- return {
488
- items: slice.events.map((e) => projectEvent(e, true)),
489
- lastSeq: slice.lastSeq,
490
- truncated: slice.truncated,
491
- };
492
- },
493
- },
494
- listEntities: {
495
- kind: "query",
496
- grant: CONTROL_READ_GRANT,
497
- advertiseScopes: [CONTROL_ADMIN_GRANT], // O3: admin-only in-handler — advertise admin, not control:read.
498
- summary: "List a module entity's rows (admin-only: entity rows carry no generic creator column).",
499
- http: { method: "GET", path: "/entities/{module}/{entity}" },
500
- input: z.object({
501
- module: z.string().min(1),
502
- entity: z.string().min(1),
503
- cursor: z.string().optional(),
504
- limit: z.coerce.number().int().min(1).max(200).optional(),
505
- }),
506
- output: pageOutput(entityRowSchema),
507
- handler: async (ctx, input) => {
508
- if (!isControlAdmin(ctx)) throw adminOnly("listEntities");
509
- const page = await deps.entities.listEntity(input.module, input.entity, ctx.principal.scope, {
510
- ...(input.cursor !== undefined ? { cursor: input.cursor } : {}),
511
- ...(input.limit !== undefined ? { limit: input.limit } : {}),
512
- });
513
- return {
514
- items: page.items.map((row) => projectEntity(row, true)),
515
- ...(page.cursor !== undefined ? { cursor: page.cursor } : {}),
516
- };
517
- },
518
- },
519
- getEntity: {
520
- kind: "query",
521
- grant: CONTROL_READ_GRANT,
522
- advertiseScopes: [CONTROL_ADMIN_GRANT], // O3: admin-only in-handler — advertise admin, not control:read.
523
- summary: "Fetch one module entity row by key (admin-only).",
524
- http: { method: "GET", path: "/entities/{module}/{entity}/{key}" },
525
- input: z.object({ module: z.string().min(1), entity: z.string().min(1), key: z.string() }),
526
- output: entityRowSchema,
527
- handler: async (ctx, input) => {
528
- if (!isControlAdmin(ctx)) throw adminOnly("getEntity");
529
- const row = await deps.entities.readEntity(input.module, input.entity, ctx.principal.scope, input.key);
530
- if (!row) throw new OpError("not_found", 404, `entity '${input.module}/${input.entity}/${input.key}' was not found`);
531
- return projectEntity(row, true);
532
- },
533
- },
534
-
535
- // ── Control ops (K1-5) — creator-facing (control:write, owner-scoped) ────────────────────────
536
- cancel: {
537
- kind: "mutation",
538
- idempotent: true,
539
- grant: CONTROL_WRITE_GRANT,
540
- summary: "Cancel an OPEN instance you own (terminal-safe, idempotent).",
541
- http: { method: "POST", path: "/instances/{id}/cancel" },
542
- input: idInput,
543
- output: instanceSummarySchema,
544
- handler: async (ctx, input) => {
545
- await runControl(ctx, deps, input.id, (id) => deps.journal.cancelInstance(id), true);
546
- return controlResult(ctx, deps, input.id);
547
- },
548
- },
549
- pause: {
550
- kind: "mutation",
551
- idempotent: true,
552
- grant: CONTROL_WRITE_GRANT,
553
- summary: "Pause an OPEN instance you own (gates the driver work-lists; deadline-preserving).",
554
- http: { method: "POST", path: "/instances/{id}/pause" },
555
- input: idInput,
556
- output: instanceSummarySchema,
557
- handler: async (ctx, input) => {
558
- await runControl(ctx, deps, input.id, (id) => deps.journal.pauseInstance(id), true);
559
- return controlResult(ctx, deps, input.id);
560
- },
561
- },
562
- resume: {
563
- kind: "mutation",
564
- idempotent: true,
565
- grant: CONTROL_WRITE_GRANT,
566
- summary: "Resume a paused instance you own.",
567
- http: { method: "POST", path: "/instances/{id}/resume" },
568
- input: idInput,
569
- output: instanceSummarySchema,
570
- handler: async (ctx, input) => {
571
- await runControl(ctx, deps, input.id, (id) => deps.journal.resumeInstance(id), true);
572
- return controlResult(ctx, deps, input.id);
573
- },
574
- },
575
- retry: {
576
- kind: "mutation",
577
- idempotent: true,
578
- grant: CONTROL_WRITE_GRANT,
579
- summary: "Re-open a failed instance you own so the runtime re-drives it (idempotent no-op otherwise).",
580
- http: { method: "POST", path: "/instances/{id}/retry" },
581
- input: idInput,
582
- output: instanceSummarySchema,
583
- handler: async (ctx, input) => {
584
- await runControl(ctx, deps, input.id, (id) => deps.journal.reopenInstance(id), true);
585
- return controlResult(ctx, deps, input.id);
586
- },
587
- },
588
-
589
- // ── `*System` twins (control:admin, expose:false) — the reconciler seam (K1-5 / K-C2) ────────
590
- // Cross-creator by construction; never surfaced over HTTP/MCP/CLI. K-C2 requires that no
591
- // transport authors a tool/command for these AND that `deriveHttpRoutes` excludes them (the
592
- // explicit `expose.http:false` below). Best-effort: they return `{changed}` and never 404 on an
593
- // absent id (a reconciler may sweep ids that were already reaped) — the `cancelMirror` posture.
594
- cancelSystem: {
595
- kind: "mutation",
596
- idempotent: true,
597
- grant: CONTROL_ADMIN_GRANT,
598
- summary: "System twin of cancel: cancel ANY instance (reconciler-only; unexposed).",
599
- expose: { http: false, mcp: false, cli: false },
600
- input: idInput,
601
- output: changedSchema,
602
- handler: async (ctx, input) => ({ changed: await runControl(ctx, deps, input.id, (id) => deps.journal.cancelInstance(id), false) }),
603
- },
604
- pauseSystem: {
605
- kind: "mutation",
606
- idempotent: true,
607
- grant: CONTROL_ADMIN_GRANT,
608
- summary: "System twin of pause: pause ANY instance (reconciler-only; unexposed).",
609
- expose: { http: false, mcp: false, cli: false },
610
- input: idInput,
611
- output: changedSchema,
612
- handler: async (ctx, input) => ({ changed: await runControl(ctx, deps, input.id, (id) => deps.journal.pauseInstance(id), false) }),
613
- },
614
- resumeSystem: {
615
- kind: "mutation",
616
- idempotent: true,
617
- grant: CONTROL_ADMIN_GRANT,
618
- summary: "System twin of resume: resume ANY instance (reconciler-only; unexposed).",
619
- expose: { http: false, mcp: false, cli: false },
620
- input: idInput,
621
- output: changedSchema,
622
- handler: async (ctx, input) => ({ changed: await runControl(ctx, deps, input.id, (id) => deps.journal.resumeInstance(id), false) }),
623
- },
624
- retrySystem: {
625
- kind: "mutation",
626
- idempotent: true,
627
- grant: CONTROL_ADMIN_GRANT,
628
- summary: "System twin of retry: re-open ANY failed instance (reconciler-only; unexposed).",
629
- expose: { http: false, mcp: false, cli: false },
630
- input: idInput,
631
- output: changedSchema,
632
- handler: async (ctx, input) => ({ changed: await runControl(ctx, deps, input.id, (id) => deps.journal.reopenInstance(id), false) }),
633
- },
634
- },
635
- });
636
- }
637
-
638
- /** The set of op names that are `*System` twins — never exposed over any transport (K-C2). Wave 3's
639
- * MCP/CLI binding MUST exclude these; the HTTP surface excludes them via `expose.http:false`. */
640
- export const CONTROL_SYSTEM_OPS = Object.freeze([
641
- "cancelSystem", "pauseSystem", "resumeSystem", "retrySystem",
642
- ] as const);
643
-
644
- /** The concrete module definition type {@link createControlModule} returns. */
645
- export type ControlModule = ReturnType<typeof createControlModule>;