@humwick/server 0.130.0 → 0.130.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/README.md +5 -0
  2. package/docs/guides/tools-administration.md +6 -1
  3. package/docs/guides/tools-coordination.md +1 -0
  4. package/docs/guides/tools-tasks.md +8 -0
  5. package/docs/guides/workflows.md +58 -0
  6. package/docs/openapi.json +414 -1
  7. package/package.json +8 -17
  8. package/public/assets/{MessageBubble-BWpoBjl4.js → MessageBubble-BWLqMGKG.js} +2 -2
  9. package/public/assets/{PlanGraphPanel-C0auck3n.js → PlanGraphPanel-3TlIQpjk.js} +2 -2
  10. package/public/assets/{TraceView-DBnOx7AQ.js → TraceView-Wimm0Czv.js} +2 -2
  11. package/public/assets/{VaultDecisionCard-0kp2oNBC.js → VaultDecisionCard-Bau_vNax.js} +2 -2
  12. package/public/assets/{activity-yLztXEBt.js → activity-CrSurn-r.js} +2 -2
  13. package/public/assets/{agent-lineage-BbJDR1dW.js → agent-lineage-CknAJKcb.js} +2 -2
  14. package/public/assets/agent-liveness-CaNwK0Zf.js +2 -0
  15. package/public/assets/{agent-name-CTZBrSD9.js → agent-name-DKbiIhBo.js} +2 -2
  16. package/public/assets/agent-profiles-DwF6EQ4R.js +2 -0
  17. package/public/assets/{agent-project-badge-9TqzUUYE.js → agent-project-badge-Diz4Sjjb.js} +2 -2
  18. package/public/assets/{agent-tools-D4n40pn8.js → agent-tools-CRhpRQza.js} +2 -2
  19. package/public/assets/{agent-type-icon-D6FUarOf.js → agent-type-icon-LrUEU3lB.js} +2 -2
  20. package/public/assets/{agents-BYDslkJc.js → agents-B-v66C-4.js} +2 -2
  21. package/public/assets/{analytics-B-XSbEMC.js → analytics-BqCb-LKi.js} +2 -2
  22. package/public/assets/{artifact-viewer-DdWIfV6M.js → artifact-viewer-kf4pGuAR.js} +2 -2
  23. package/public/assets/{artifacts-oBOqks-2.js → artifacts-D32zyw4Y.js} +2 -2
  24. package/public/assets/{artifacts-DPN1q4pA.js → artifacts-DJevXcvg.js} +2 -2
  25. package/public/assets/{automation-4KcRFXEu.js → automation-BpRajx_5.js} +2 -2
  26. package/public/assets/{backlog-Cw9xPTCF.js → backlog-D_UjTdzX.js} +2 -2
  27. package/public/assets/{busy-health-CTu32MZt.js → busy-health-N3VEh4ao.js} +2 -2
  28. package/public/assets/{channels-BiXzg1G9.js → channels-9jopungq.js} +2 -2
  29. package/public/assets/{chat-Ctk2qwvA.js → chat-CSXrTB3C.js} +2 -2
  30. package/public/assets/{code-preview-Bm1wWqAp.js → code-preview-p1NnmqK0.js} +2 -2
  31. package/public/assets/{connectors-C36ax4Vw.js → connectors-CZdqlDNL.js} +2 -2
  32. package/public/assets/{cosmos-Jj9LK2Wf.js → cosmos-BgdsE4dG.js} +2 -2
  33. package/public/assets/{crate-agent-H6S7-B9T.js → crate-agent-30aXTKva.js} +2 -2
  34. package/public/assets/{dependency-graph-Cd1E23wa.js → dependency-graph-B_jvw2GE.js} +2 -2
  35. package/public/assets/{deploys-Bwfq146q.js → deploys-DoN6bAb5.js} +2 -2
  36. package/public/assets/{display-CfO7rTuF.js → display-BrKWFGJz.js} +2 -2
  37. package/public/assets/{files-DhhZI2Ih.js → files-D6XEu8Ng.js} +2 -2
  38. package/public/assets/fleet-C7jQWbw2.js +2 -0
  39. package/public/assets/{fleet-metrics-BkHP-P3R.js → fleet-metrics-BiDs3MLx.js} +2 -2
  40. package/public/assets/{formatted-body-Cm1RrzmN.js → formatted-body-CQBwc1fb.js} +3 -3
  41. package/public/assets/{formatted-body-impl-DQiOuOD1.js → formatted-body-impl-DyG0WsQS.js} +2 -2
  42. package/public/assets/{host-providers-dialog-CHqwXTov.js → host-providers-dialog-DKaW31dN.js} +2 -2
  43. package/public/assets/index-CRHep3M9.js +15 -0
  44. package/public/assets/index-MYAIwYTX.css +2 -0
  45. package/public/assets/{insights-fH1EL-qZ.js → insights-CzrtkpOE.js} +2 -2
  46. package/public/assets/{integrations-C5Oix6ng.js → integrations-aVsUmigt.js} +2 -2
  47. package/public/assets/{issue-ref-chip-ODyondIa.js → issue-ref-chip-BnSlM_95.js} +2 -2
  48. package/public/assets/{log-viewer-Cvfy6PW7.js → log-viewer-qe7Ee47Z.js} +2 -2
  49. package/public/assets/{maintenance-D8CDH5wZ.js → maintenance-NfjqFZAk.js} +2 -2
  50. package/public/assets/{managed-agents-egllbpij.js → managed-agents-BiH0HgaE.js} +2 -2
  51. package/public/assets/{markdown-preview-CYSFgVgK.js → markdown-preview-BixaT3Xr.js} +3 -3
  52. package/public/assets/{markdown-preview-impl-BteVIjX4.js → markdown-preview-impl-DNGlWIS3.js} +2 -2
  53. package/public/assets/{memory-C8WmXsyr.js → memory-DNsCl6UX.js} +2 -2
  54. package/public/assets/{messages-BzQdqlO6.js → messages-DopU1L1X.js} +2 -2
  55. package/public/assets/{orchestrators-B1HxzkNw.js → orchestrators-Cq7ckLQT.js} +2 -2
  56. package/public/assets/{overview-DCUnI4Z7.js → overview-C1DCTzzV.js} +2 -2
  57. package/public/assets/{pairs-ftCd2XcD.js → pairs-DE_m6rrE.js} +2 -2
  58. package/public/assets/{profile-icon-B2zH8DMH.js → profile-icon-B3rfh77F.js} +2 -2
  59. package/public/assets/project-profile-instructions-DQWZE0kA.js +2 -0
  60. package/public/assets/projects-Br2Bd2h1.js +2 -0
  61. package/public/assets/{prompt-settings-Bftq9czX.js → prompt-settings-BKvFsvGD.js} +2 -2
  62. package/public/assets/provider-display-DsuWMvVL.js +2 -0
  63. package/public/assets/{registry-DWCU5c8q.js → registry-Cw38_6gW.js} +2 -2
  64. package/public/assets/run-card-CpKqRbhg.js +2 -0
  65. package/public/assets/scroll-text-BKXS1ahr.js +2 -0
  66. package/public/assets/{secrets-C7GIUATz.js → secrets-DxI-vzSq.js} +2 -2
  67. package/public/assets/{service-access-settings-C3aujqTG.js → service-access-settings-D9s_VJbd.js} +2 -2
  68. package/public/assets/{settings-C6sZ9eBa.js → settings-CKZTVGIx.js} +2 -2
  69. package/public/assets/{shipping-Bu8p1gEw.js → shipping-B9YtnwtG.js} +2 -2
  70. package/public/assets/{stats-V9Z-GxUd.js → stats-DyUBKyWI.js} +2 -2
  71. package/public/assets/{status-dot-CVv0iGHL.js → status-dot-DYqlEUhJ.js} +2 -2
  72. package/public/assets/{store-BvtFdlGX.js → store-DcClXLH0.js} +3 -3
  73. package/public/assets/{tasks-CXU75HRF.js → tasks-Bh7Chr4-.js} +2 -2
  74. package/public/assets/{teams-BPf976zb.js → teams-bowI7qVY.js} +2 -2
  75. package/public/assets/{terminal-viewer-DE9BOe-8.js → terminal-viewer-BgVLHdsU.js} +3 -3
  76. package/public/assets/{terminal-viewer-impl-D04pjmGh.js → terminal-viewer-impl-Dz22UPy6.js} +2 -2
  77. package/public/assets/token-estimate-Co-Jdphh.js +2 -0
  78. package/public/assets/{use-agent-terminal-B1yR456R.js → use-agent-terminal-DSQQ-iY7.js} +2 -2
  79. package/public/assets/{use-decisions-D-S4tpDf.js → use-decisions-samMQhQf.js} +2 -2
  80. package/public/assets/use-project-list-59LheVP7.js +2 -0
  81. package/public/assets/{use-selectors-CnrAk2YP.js → use-selectors-BZa25xEB.js} +2 -2
  82. package/public/assets/{user-avatar-nBFIcR4M.js → user-avatar-DHxlvUvV.js} +2 -2
  83. package/public/assets/versioned-prompt-editor-BmED5DnJ.js +8 -0
  84. package/public/assets/{work-queue-TCjJxeT-.js → work-queue-CSvpuNLz.js} +2 -2
  85. package/public/assets/{workflow-marker-Cf3Hf2fN.js → workflow-marker-DAZcj5qt.js} +2 -2
  86. package/public/assets/{workflows-CXQX20Qj.js → workflows-DdmxRSyg.js} +2 -2
  87. package/public/assets/{workspaces-qSYzKYMA.js → workspaces-BxeKfVuF.js} +2 -2
  88. package/public/cosmos.html +4 -4
  89. package/public/index.html +31 -29
  90. package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
  91. package/runner/plugins/claude/hooks/gate-run-guard.provisioned.mjs +31 -1
  92. package/runner/src/adapters/claude-effort.ts +2 -4
  93. package/runner/src/adapters/codex-launch-config.ts +4 -5
  94. package/runner/src/adapters/codex.ts +1 -1
  95. package/runner/src/adapters/opencode-provider.ts +7 -22
  96. package/runner/src/adapters/opencode.ts +4 -4
  97. package/runner/src/agent-runner/credentials.ts +42 -12
  98. package/runner/src/agent-runner/inbox.ts +27 -0
  99. package/runner/src/agent-runner/lifecycle-milestones.ts +0 -2
  100. package/runner/src/bin/claude.ts +4 -0
  101. package/runner/src/bin/codex.ts +4 -0
  102. package/runner/src/bin/opencode.ts +4 -0
  103. package/runner/src/index.ts +5 -2
  104. package/runner/src/provider-setup.ts +34 -0
  105. package/runner/src/providers.ts +2 -1
  106. package/runner/src/runner-core.ts +18 -23
  107. package/runner/src/spawn-input.ts +2 -1
  108. package/runner/src/test-run-dedup.ts +59 -56
  109. package/scripts/cd-config.ts +24 -3
  110. package/scripts/gate-run-lease.ts +10 -7
  111. package/scripts/gate.sh +5 -1
  112. package/src/branch-land-notice.ts +93 -0
  113. package/src/branch-landed.ts +7 -76
  114. package/src/bus.ts +19 -20
  115. package/src/cd-deploy-notify.ts +30 -2
  116. package/src/cd-host-lag-notify.ts +7 -6
  117. package/src/ci/incidents.ts +2 -2
  118. package/src/ci/monitor.ts +5 -8
  119. package/src/ci/root-missing.ts +2 -7
  120. package/src/ci/transition-notify.ts +7 -39
  121. package/src/cli/cd-pauses.ts +19 -0
  122. package/src/cli/orchestrator.ts +1 -1
  123. package/src/cli/state.ts +2 -19
  124. package/src/cli/task-edit.ts +22 -0
  125. package/src/cli/task.ts +3 -1
  126. package/src/cli/workflow.ts +8 -2
  127. package/src/commands-db.ts +10 -6
  128. package/src/commands-write.ts +8 -0
  129. package/src/config-store-write.ts +13 -1
  130. package/src/config-store.ts +25 -14
  131. package/src/db/activity-async.ts +6 -1
  132. package/src/db/activity-write-ops.ts +13 -1
  133. package/src/db/activity.ts +1 -14
  134. package/src/db/agent-lifecycle-write-ops.ts +1 -0
  135. package/src/db/agent-meta.ts +2 -2
  136. package/src/db/agent-ownership-write-ops.ts +4 -0
  137. package/src/db/agent-search.ts +1 -15
  138. package/src/db/agents-async.ts +58 -7
  139. package/src/db/agents-write-ops.ts +28 -5
  140. package/src/db/agents.ts +81 -54
  141. package/src/db/artifacts-write-ops.ts +8 -3
  142. package/src/db/bus-outbox-write-ops.ts +1 -0
  143. package/src/db/channels-write-ops.ts +4 -0
  144. package/src/db/ci-incidents-async.ts +5 -5
  145. package/src/db/ci-incidents-write-ops.ts +2 -2
  146. package/src/db/claude-api-budget-ops.ts +5 -5
  147. package/src/db/claude-app-oauth.ts +4 -4
  148. package/src/db/codex-reset-consumes-write-ops.ts +3 -0
  149. package/src/db/command-row.ts +10 -2
  150. package/src/db/commands-list-query.ts +2 -0
  151. package/src/db/commands-spawn-read.ts +1 -1
  152. package/src/db/commands-write-ops.ts +21 -0
  153. package/src/db/config-store-write-ops.ts +9 -2
  154. package/src/db/continuation-archives-async.ts +5 -0
  155. package/src/db/continuation-archives-write-ops.ts +9 -0
  156. package/src/db/continuations.ts +2 -2
  157. package/src/db/db-writer-worker.ts +8 -1
  158. package/src/db/delivery-write-ops.ts +5 -0
  159. package/src/db/deploy-events-async.ts +1 -0
  160. package/src/db/deploy-events-read-ops.ts +2 -1
  161. package/src/db/deploy-events.ts +35 -4
  162. package/src/db/hosts-registration.ts +10 -2
  163. package/src/db/hosts-write-ops.ts +14 -0
  164. package/src/db/hosts.ts +9 -6
  165. package/src/db/inbox-write-ops.ts +4 -0
  166. package/src/db/inbox.ts +0 -14
  167. package/src/db/index.ts +2 -0
  168. package/src/db/insights-write-ops.ts +1 -0
  169. package/src/db/integrations-async.ts +8 -0
  170. package/src/db/integrations-ops.ts +15 -0
  171. package/src/db/integrations.ts +15 -21
  172. package/src/db/issue-lifecycle.ts +3 -4
  173. package/src/db/issue-refs-async.ts +20 -0
  174. package/src/db/issue-refs-write-ops.ts +29 -0
  175. package/src/db/issue-refs.ts +7 -8
  176. package/src/db/long-running-work.ts +2 -2
  177. package/src/db/macos-privacy.ts +1 -1
  178. package/src/db/main-connection-writes.ts +23 -2
  179. package/src/db/maintenance-job-reconcile.ts +61 -0
  180. package/src/db/maintenance-job-runs-async.ts +14 -0
  181. package/src/db/maintenance-job-write-ops.ts +9 -0
  182. package/src/db/mappers.ts +2 -14
  183. package/src/db/merge-lease.ts +1 -15
  184. package/src/db/message-reads-write-ops.ts +3 -0
  185. package/src/db/message-write-ops.ts +4 -0
  186. package/src/db/migrations.ts +7 -15
  187. package/src/db/orchestrators-async.ts +7 -3
  188. package/src/db/orchestrators-write-ops.ts +7 -1
  189. package/src/db/orchestrators.ts +21 -77
  190. package/src/db/pairs.ts +1 -13
  191. package/src/db/project-profile-instructions.ts +50 -0
  192. package/src/db/prompt-versions-ops.ts +1 -0
  193. package/src/db/prompt-versions.ts +9 -2
  194. package/src/db/provider-catalog-write-ops.ts +4 -4
  195. package/src/db/provider-config-history.ts +8 -3
  196. package/src/db/provider-flap-messages-write-ops.ts +1 -0
  197. package/src/db/provider-model-seed.ts +34 -0
  198. package/src/db/provider-quota-lease-write-ops.ts +1 -0
  199. package/src/db/provider-quota-write-ops.ts +2 -0
  200. package/src/db/provisioning-write-ops.ts +9 -8
  201. package/src/db/read-op-marshaling-fixtures.ts +5 -0
  202. package/src/db/read-ops.ts +4 -0
  203. package/src/db/routing-policy.ts +3 -4
  204. package/src/db/schema.ts +9 -3
  205. package/src/db/secrets-broker-write-ops.ts +5 -5
  206. package/src/db/secrets-vault-write.ts +7 -7
  207. package/src/db/services-write-ops.ts +3 -0
  208. package/src/db/spawn-delegation-state.ts +11 -4
  209. package/src/db/spawn-tree-cleanup.ts +3 -0
  210. package/src/db/stats-async.ts +4 -3
  211. package/src/db/task-entity.ts +23 -2
  212. package/src/db/task-list.ts +3 -1
  213. package/src/db/tasks.ts +1 -17
  214. package/src/db/team-spawn-delegation.ts +1 -1
  215. package/src/db/teams-write-ops.ts +4 -4
  216. package/src/db/timer-cutover-write-ops.ts +7 -0
  217. package/src/db/timer-ingress-write-ops.ts +9 -0
  218. package/src/db/timer-ingress.ts +7 -1
  219. package/src/db/timer-operator-write-ops.ts +14 -0
  220. package/src/db/timer-transfer-write-ops.ts +4 -0
  221. package/src/db/timer-write-ops.ts +14 -0
  222. package/src/db/token-db-write-ops.ts +21 -0
  223. package/src/db/token-standing.ts +15 -11
  224. package/src/db/user-settings-write-ops.ts +1 -0
  225. package/src/db/vault-backup.ts +2 -2
  226. package/src/db/vault-expiry.ts +2 -2
  227. package/src/db/vault-health.ts +3 -3
  228. package/src/db/vault-token-ops.ts +8 -8
  229. package/src/db/web-tool-call-ops.ts +3 -3
  230. package/src/db/workflow-contact.ts +1 -1
  231. package/src/db/workflow-task-read-ops.ts +30 -0
  232. package/src/db/write-ops.ts +15 -1
  233. package/src/db/writer-fault-seam.ts +5 -2
  234. package/src/db/writer-gateway.ts +21 -12
  235. package/src/dispatch-availability.ts +10 -6
  236. package/src/ephemeral/{landing-ingress-proof-worker.ts → landing-ingress-proof.test-fixture.ts} +4 -2
  237. package/src/host/disk-alert.ts +121 -0
  238. package/src/lifecycle-manager.ts +3 -2
  239. package/src/maintenance/cd-watcher.ts +3 -3
  240. package/src/maintenance/critical-job-watchdog.ts +16 -17
  241. package/src/maintenance/index.ts +1 -0
  242. package/src/maintenance/jobs.ts +3 -2
  243. package/src/maintenance/scheduler.ts +84 -128
  244. package/src/maintenance/stalled-delivery-pager.ts +6 -5
  245. package/src/maintenance/workspaces.ts +1 -1
  246. package/src/managed-policy.ts +31 -27
  247. package/src/mcp/index.ts +5 -2
  248. package/src/mcp/output-descriptions.ts +8 -8
  249. package/src/mcp/presentation.ts +4 -4
  250. package/src/mcp/project-profile-instructions.ts +32 -0
  251. package/src/mcp/tool-groups.ts +1 -1
  252. package/src/mcp/tools-spawn.ts +4 -3
  253. package/src/mcp-agent-action.ts +1 -2
  254. package/src/mcp-host-tools.ts +1 -1
  255. package/src/mcp-issue-ref-tools.ts +12 -11
  256. package/src/mcp-maintenance-tools.ts +2 -2
  257. package/src/mcp-profile-trust-tools.ts +4 -4
  258. package/src/mcp-provider-catalog.ts +2 -2
  259. package/src/mcp-task-tools.ts +11 -5
  260. package/src/mcp-team-template-tools.ts +3 -3
  261. package/src/mcp-workflow-tools.ts +10 -3
  262. package/src/notification-types.ts +2 -1
  263. package/src/operator-alarm.ts +26 -11
  264. package/src/package-pack.ts +42 -39
  265. package/src/project-instructions.ts +4 -0
  266. package/src/project-profile-instruction-text.ts +6 -0
  267. package/src/project-profile-instructions.ts +20 -0
  268. package/src/provider-catalog-store.ts +3 -49
  269. package/src/provider-config-store.ts +12 -11
  270. package/src/provider-model-seed.ts +1 -18
  271. package/src/provider-quota-config-store.ts +5 -4
  272. package/src/provider-secrets.test-fixture.ts +3 -3
  273. package/src/recipe-runner.ts +2 -2
  274. package/src/repo-config-source.ts +10 -4
  275. package/src/routes/agent-profiles.ts +6 -6
  276. package/src/routes/agents-spawn.ts +1 -1
  277. package/src/routes/agents.ts +6 -6
  278. package/src/routes/commands-listing.ts +4 -0
  279. package/src/routes/commands.ts +2 -2
  280. package/src/routes/continuation-archives.ts +2 -2
  281. package/src/routes/host-resource-control.ts +4 -1
  282. package/src/routes/index.ts +10 -1
  283. package/src/routes/integrations.ts +24 -50
  284. package/src/routes/issue-refs.ts +7 -7
  285. package/src/routes/orchestrator-bootstrap.ts +3 -3
  286. package/src/routes/orchestrator-host-registration.ts +2 -2
  287. package/src/routes/orchestrator-host-utilization.ts +3 -1
  288. package/src/routes/orchestrator-proxy.ts +2 -2
  289. package/src/routes/orchestrator.ts +4 -4
  290. package/src/routes/project-profile-instructions.ts +27 -0
  291. package/src/routes/project-trust.ts +2 -2
  292. package/src/routes/provider-config.ts +9 -8
  293. package/src/routes/provider-quota-config.ts +2 -2
  294. package/src/routes/settings.ts +5 -5
  295. package/src/routes/stats.ts +6 -6
  296. package/src/routes/task-http.ts +15 -1
  297. package/src/routes/task-issues.ts +11 -26
  298. package/src/routes/tasks.ts +22 -53
  299. package/src/routes/team-templates.ts +5 -5
  300. package/src/routes/teams-config.ts +2 -2
  301. package/src/routes/tokens.ts +12 -5
  302. package/src/routes/workflows.ts +20 -5
  303. package/src/routing-policy-normalize.ts +1 -2
  304. package/src/routing-step-defaults.ts +0 -2
  305. package/src/runner-token-mint-limit.ts +63 -0
  306. package/src/runtime-grant.ts +4 -2
  307. package/src/runtime-tokens.ts +50 -9
  308. package/src/security.ts +13 -20
  309. package/src/server-background.ts +1 -1
  310. package/src/server.ts +5 -2
  311. package/src/services/host-utilization.ts +23 -0
  312. package/src/services/idle-epics.ts +5 -6
  313. package/src/services/issue-lifecycle.ts +57 -61
  314. package/src/services/issue-refs.ts +9 -13
  315. package/src/services/kernel-timers-cutover-chaos-worker.ts +12 -7
  316. package/src/services/kernel-timers-ingress.ts +1 -1
  317. package/src/services/kernel-timers-request-key-migration-chaos-worker.ts +4 -1
  318. package/src/services/landed-ancestry.ts +19 -3
  319. package/src/services/memory-areas.ts +15 -51
  320. package/src/services/plan-ci-notice.ts +57 -0
  321. package/src/services/plan-ci-recovery.ts +2 -55
  322. package/src/services/plan-wake-digest.ts +1 -0
  323. package/src/services/profile-trust.ts +4 -3
  324. package/src/services/project-config-read.ts +70 -0
  325. package/src/services/project-profile-instructions.ts +54 -0
  326. package/src/services/provisioning-harness/budget-baseline.json +4 -4
  327. package/src/services/restart-spawn.ts +61 -49
  328. package/src/services/self-care-state.ts +2 -1
  329. package/src/services/self-effort.ts +5 -5
  330. package/src/services/send-message.ts +5 -1
  331. package/src/services/spawn-agent.ts +13 -2
  332. package/src/services/spawn-chain-inspector.ts +6 -13
  333. package/src/services/spawn-policy.ts +68 -0
  334. package/src/services/spawn-tree-cleanup.ts +2 -2
  335. package/src/services/task-dispatch.ts +3 -0
  336. package/src/services/task-state-reconcile.ts +6 -14
  337. package/src/services/team-templates.ts +9 -8
  338. package/src/services/transient-agent-reaper.ts +3 -1
  339. package/src/services/workflow-auto-start.ts +25 -13
  340. package/src/services/workflow-ci-main.ts +1 -1
  341. package/src/services/workflow-deferred-cleanup.ts +4 -2
  342. package/src/services/workflow-effect-driver.ts +2 -0
  343. package/src/services/workflow-effects.ts +18 -11
  344. package/src/services/workflow-land-notice.ts +10 -0
  345. package/src/services/workflow-pause-text.ts +43 -0
  346. package/src/services/workflow-reconcile.ts +13 -11
  347. package/src/services/workflow-run-view.ts +2 -0
  348. package/src/services/workflow-runs.ts +29 -13
  349. package/src/services/workflow-supervisor-state.ts +5 -0
  350. package/src/services/workflow-supervisor.ts +7 -3
  351. package/src/settings/registry.ts +1 -2
  352. package/src/spawn-command.ts +4 -4
  353. package/src/spawn-models.ts +10 -12
  354. package/src/spawn-placement.ts +1 -1
  355. package/src/spawn-targets.ts +1 -1
  356. package/src/startup-context-injection.ts +1 -0
  357. package/src/state-adoption/cd-cutover.ts +53 -7
  358. package/src/state-adoption/fleet-cutover.ts +35 -0
  359. package/src/state-adoption/fleet-plan.ts +36 -0
  360. package/src/state-adoption/index.ts +2 -2
  361. package/src/state-adoption/linux-plan.ts +2 -2
  362. package/src/state-adoption/linux.ts +2 -2
  363. package/src/state-adoption/macos-plan.ts +2 -2
  364. package/src/state-adoption/macos.ts +1 -1
  365. package/src/steward.ts +7 -6
  366. package/src/task-dispatch-live.ts +1 -1
  367. package/src/task-dispatcher.ts +1 -1
  368. package/src/teams-config-store.ts +4 -3
  369. package/src/token-db-write.ts +10 -0
  370. package/src/workspace-command-settle.ts +2 -1
  371. package/src/workspace-steward-wake.ts +2 -2
  372. package/node_modules/@humwick/kernel/LICENSE +0 -167
  373. package/node_modules/@humwick/kernel/async-entity-persistence.ts +0 -344
  374. package/node_modules/@humwick/kernel/async-event-log.ts +0 -107
  375. package/node_modules/@humwick/kernel/automations.pilot.ts +0 -147
  376. package/node_modules/@humwick/kernel/config.ts +0 -111
  377. package/node_modules/@humwick/kernel/contract.ts +0 -572
  378. package/node_modules/@humwick/kernel/control-authz.ts +0 -281
  379. package/node_modules/@humwick/kernel/control.ts +0 -645
  380. package/node_modules/@humwick/kernel/effects.ts +0 -493
  381. package/node_modules/@humwick/kernel/event-log.ts +0 -319
  382. package/node_modules/@humwick/kernel/http-transport.ts +0 -384
  383. package/node_modules/@humwick/kernel/identity-grammar.ts +0 -20
  384. package/node_modules/@humwick/kernel/identity.ts +0 -248
  385. package/node_modules/@humwick/kernel/index.ts +0 -28
  386. package/node_modules/@humwick/kernel/kernel-persistence.ts +0 -181
  387. package/node_modules/@humwick/kernel/landing-incident.ts +0 -306
  388. package/node_modules/@humwick/kernel/landing.ts +0 -953
  389. package/node_modules/@humwick/kernel/manifest-validation.ts +0 -460
  390. package/node_modules/@humwick/kernel/mcp-transport.ts +0 -109
  391. package/node_modules/@humwick/kernel/message-authority-chaos-worker.ts +0 -200
  392. package/node_modules/@humwick/kernel/message-authority.ts +0 -281
  393. package/node_modules/@humwick/kernel/module-host.ts +0 -722
  394. package/node_modules/@humwick/kernel/openapi-init.ts +0 -14
  395. package/node_modules/@humwick/kernel/package.json +0 -47
  396. package/node_modules/@humwick/kernel/persistence-schema.ts +0 -248
  397. package/node_modules/@humwick/kernel/persistence.ts +0 -510
  398. package/node_modules/@humwick/kernel/registry.ts +0 -60
  399. package/node_modules/@humwick/kernel/sqlite-kernel-persistence.ts +0 -499
  400. package/node_modules/@humwick/kernel/sqlite-module-host.ts +0 -87
  401. package/node_modules/@humwick/kernel/timers-chaos-worker.ts +0 -186
  402. package/node_modules/@humwick/kernel/timers.pilot.ts +0 -1411
  403. package/node_modules/@humwick/kernel/workflow-activation.ts +0 -25
  404. package/node_modules/@humwick/kernel/workflow-backstop.ts +0 -40
  405. package/node_modules/@humwick/kernel/workflow-cancel-tree.ts +0 -20
  406. package/node_modules/@humwick/kernel/workflow-chaos-worker.ts +0 -213
  407. package/node_modules/@humwick/kernel/workflow-composition.ts +0 -231
  408. package/node_modules/@humwick/kernel/workflow-container.ts +0 -72
  409. package/node_modules/@humwick/kernel/workflow-control.test-fixture.ts +0 -42
  410. package/node_modules/@humwick/kernel/workflow-control.ts +0 -178
  411. package/node_modules/@humwick/kernel/workflow-definition.ts +0 -507
  412. package/node_modules/@humwick/kernel/workflow-dispatch.ts +0 -60
  413. package/node_modules/@humwick/kernel/workflow-foreach.ts +0 -167
  414. package/node_modules/@humwick/kernel/workflow-journal-codec.ts +0 -339
  415. package/node_modules/@humwick/kernel/workflow-journal.ts +0 -922
  416. package/node_modules/@humwick/kernel/workflow-lane.ts +0 -48
  417. package/node_modules/@humwick/kernel/workflow-lease-owner.ts +0 -60
  418. package/node_modules/@humwick/kernel/workflow-recovery.test-fixture.ts +0 -19
  419. package/node_modules/@humwick/kernel/workflow-runtime.ts +0 -938
  420. package/node_modules/@humwick/kernel/workflow-script.ts +0 -11
  421. package/node_modules/@humwick/kernel/workflow-state.ts +0 -299
  422. package/node_modules/@humwick/kernel/workflow-step-commit.ts +0 -195
  423. package/node_modules/@humwick/kernel/workflow-transitions.ts +0 -317
  424. package/node_modules/@humwick/kernel/workflow-values.ts +0 -153
  425. package/node_modules/@humwick/kernel/workflow.pilot.ts +0 -376
  426. package/node_modules/@humwick/offload/LICENSE +0 -167
  427. package/node_modules/@humwick/offload/README.md +0 -57
  428. package/node_modules/@humwick/offload/dist/async-runner.d.ts +0 -18
  429. package/node_modules/@humwick/offload/dist/async-runner.d.ts.map +0 -1
  430. package/node_modules/@humwick/offload/dist/async-runner.js +0 -158
  431. package/node_modules/@humwick/offload/dist/async-runner.js.map +0 -1
  432. package/node_modules/@humwick/offload/dist/envelope.d.ts +0 -25
  433. package/node_modules/@humwick/offload/dist/envelope.d.ts.map +0 -1
  434. package/node_modules/@humwick/offload/dist/envelope.js +0 -80
  435. package/node_modules/@humwick/offload/dist/envelope.js.map +0 -1
  436. package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts +0 -10
  437. package/node_modules/@humwick/offload/dist/fixtures/worker-task.d.ts.map +0 -1
  438. package/node_modules/@humwick/offload/dist/fixtures/worker-task.js +0 -59
  439. package/node_modules/@humwick/offload/dist/fixtures/worker-task.js.map +0 -1
  440. package/node_modules/@humwick/offload/dist/index.d.ts +0 -5
  441. package/node_modules/@humwick/offload/dist/index.d.ts.map +0 -1
  442. package/node_modules/@humwick/offload/dist/index.js +0 -5
  443. package/node_modules/@humwick/offload/dist/index.js.map +0 -1
  444. package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts +0 -62
  445. package/node_modules/@humwick/offload/dist/subprocess-runner.d.ts.map +0 -1
  446. package/node_modules/@humwick/offload/dist/subprocess-runner.js +0 -295
  447. package/node_modules/@humwick/offload/dist/subprocess-runner.js.map +0 -1
  448. package/node_modules/@humwick/offload/dist/types.d.ts +0 -111
  449. package/node_modules/@humwick/offload/dist/types.d.ts.map +0 -1
  450. package/node_modules/@humwick/offload/dist/types.js +0 -176
  451. package/node_modules/@humwick/offload/dist/types.js.map +0 -1
  452. package/node_modules/@humwick/offload/dist/worker-pool.d.ts +0 -23
  453. package/node_modules/@humwick/offload/dist/worker-pool.d.ts.map +0 -1
  454. package/node_modules/@humwick/offload/dist/worker-pool.js +0 -435
  455. package/node_modules/@humwick/offload/dist/worker-pool.js.map +0 -1
  456. package/node_modules/@humwick/offload/dist/worker-runtime.d.ts +0 -2
  457. package/node_modules/@humwick/offload/dist/worker-runtime.d.ts.map +0 -1
  458. package/node_modules/@humwick/offload/dist/worker-runtime.js +0 -27
  459. package/node_modules/@humwick/offload/dist/worker-runtime.js.map +0 -1
  460. package/node_modules/@humwick/offload/dist/worker.d.ts +0 -5
  461. package/node_modules/@humwick/offload/dist/worker.d.ts.map +0 -1
  462. package/node_modules/@humwick/offload/dist/worker.js +0 -1
  463. package/node_modules/@humwick/offload/dist/worker.js.map +0 -1
  464. package/node_modules/@humwick/offload/package.json +0 -46
  465. package/node_modules/@humwick/offload/src/async-runner.ts +0 -170
  466. package/node_modules/@humwick/offload/src/envelope.ts +0 -92
  467. package/node_modules/@humwick/offload/src/fixtures/worker-task.ts +0 -49
  468. package/node_modules/@humwick/offload/src/index.ts +0 -4
  469. package/node_modules/@humwick/offload/src/subprocess-runner.ts +0 -334
  470. package/node_modules/@humwick/offload/src/types.ts +0 -235
  471. package/node_modules/@humwick/offload/src/worker-pool.ts +0 -463
  472. package/node_modules/@humwick/offload/src/worker-runtime.ts +0 -32
  473. package/node_modules/@humwick/offload/src/worker.ts +0 -5
  474. package/public/assets/agent-liveness-DyqxfB-t.js +0 -2
  475. package/public/assets/agent-profiles-BpI_jTxq.js +0 -2
  476. package/public/assets/fleet-BL4UXS_k.js +0 -2
  477. package/public/assets/index-B7ZerHLY.css +0 -2
  478. package/public/assets/index-BK0WV6hF.js +0 -15
  479. package/public/assets/projects-B_lmcqfO.js +0 -2
  480. package/public/assets/provider-display-DbLWpP3j.js +0 -2
  481. package/public/assets/run-card-CO_bguQf.js +0 -2
  482. package/public/assets/use-project-list-B-T2Bnnn.js +0 -2
  483. package/public/assets/versioned-prompt-editor-Diu8BIaM.js +0 -8
  484. package/runner/src/gate-run-lease-probe.ts +0 -38
  485. package/src/db/claude-catalog-reconcile.ts +0 -27
  486. package/src/routing-model-aliases.ts +0 -21
@@ -1,111 +0,0 @@
1
- import { relayEnv } from "@humwick/sdk/env";
2
- import { z } from "zod";
3
- import type { ConfigDecl, ConfigLayer, ResolvedConfig } from "./contract";
4
-
5
- /** Layers that may carry config values, in increasing order of precedence. `defaults` is the
6
- * implicit base every key is settable at; env-mapped values ride in the `host` band (§2.0). */
7
- const OVERRIDE_LAYERS: readonly ConfigLayer[] = ["instance", "host", "tenant", "user"];
8
-
9
- /** Explicit per-layer value sources handed to the resolver. `defaults` seeds the base; the
10
- * remaining layers may only carry keys the manifest marks `overridableAt` that layer. */
11
- export type ConfigLayerInputs = Partial<Record<ConfigLayer, Readonly<Record<string, unknown>>>>;
12
-
13
- export interface ConfigResolveOptions {
14
- /** Explicit per-layer overrides. */
15
- readonly layers?: ConfigLayerInputs;
16
- /** Environment source for `decl.env` mappings. Defaults to `process.env`. */
17
- readonly env?: Readonly<Record<string, string | undefined>>;
18
- }
19
-
20
- /** A layer tried to set a key it is not allowed to (default-deny) or a key the schema lacks. */
21
- export class ConfigResolutionError extends Error {
22
- constructor(
23
- readonly key: string,
24
- readonly layer: ConfigLayer,
25
- message: string,
26
- ) {
27
- super(message);
28
- this.name = "ConfigResolutionError";
29
- }
30
- }
31
-
32
- /** The merged config failed Zod validation against the manifest's schema. */
33
- export class ConfigValidationError extends Error {
34
- constructor(readonly error: z.ZodError) {
35
- super(`config failed validation:\n${error.issues.map((i) => `- ${i.path.join(".") || "(root)"}: ${i.message}`).join("\n")}`);
36
- this.name = "ConfigValidationError";
37
- }
38
-
39
- get issues(): z.ZodError["issues"] {
40
- return this.error.issues;
41
- }
42
- }
43
-
44
- function schemaKeys(decl: ConfigDecl): ReadonlySet<string> {
45
- return new Set(Object.keys(decl.schema.shape));
46
- }
47
-
48
- function overridableAt(decl: ConfigDecl, key: string, layer: ConfigLayer): boolean {
49
- const layers = (decl.overridableAt as Readonly<Record<string, readonly ConfigLayer[]>> | undefined)?.[key];
50
- return layers?.includes(layer) ?? false;
51
- }
52
-
53
- function applyLayer(
54
- merged: Record<string, unknown>,
55
- layer: ConfigLayer,
56
- input: Readonly<Record<string, unknown>> | undefined,
57
- decl: ConfigDecl,
58
- keys: ReadonlySet<string>,
59
- ): void {
60
- if (!input) return;
61
- for (const [key, value] of Object.entries(input)) {
62
- if (!keys.has(key)) {
63
- throw new ConfigResolutionError(key, layer, `config layer '${layer}' sets unknown key '${key}'`);
64
- }
65
- if (layer !== "defaults" && !overridableAt(decl, key, layer)) {
66
- throw new ConfigResolutionError(key, layer, `config key '${key}' is not overridable at layer '${layer}'`);
67
- }
68
- merged[key] = value;
69
- }
70
- }
71
-
72
- /**
73
- * Resolve a module's `ctx.config` from layered sources.
74
- *
75
- * Precedence, low to high: schema defaults < `defaults` layer < `instance` < env-mapped (host
76
- * band) < explicit `host` < `tenant` < `user`. `defaults` seeds the base with no restriction;
77
- * every higher layer is default-deny — a key it carries must be listed in the manifest's
78
- * `overridableAt[key]` for that layer, or resolution throws. Env values arrive as raw strings,
79
- * so env-backed keys should use coercible schemas (`z.coerce.*`). The merged object is then
80
- * validated against the manifest schema (filling schema defaults for absent keys) and frozen.
81
- */
82
- export function resolveConfig<D extends ConfigDecl | undefined>(
83
- decl: D,
84
- options: ConfigResolveOptions = {},
85
- ): D extends ConfigDecl ? Readonly<z.output<D["schema"]>> : ResolvedConfig<D> {
86
- if (!decl) return Object.freeze({}) as never;
87
- const keys = schemaKeys(decl);
88
- const merged: Record<string, unknown> = {};
89
-
90
- applyLayer(merged, "defaults", options.layers?.defaults, decl, keys);
91
- applyLayer(merged, "instance", options.layers?.instance, decl, keys);
92
-
93
- // Env-mapped values ride in the host band, but an explicit host layer input wins over them.
94
- const env = options.env ?? (globalThis.process?.env as Readonly<Record<string, string | undefined>> | undefined) ?? {};
95
- for (const [key, envName] of Object.entries(decl.env ?? {}) as Array<[string, string]>) {
96
- const value = relayEnv(env, envName);
97
- if (value === undefined) continue;
98
- if (!overridableAt(decl, key, "host")) {
99
- throw new ConfigResolutionError(key, "host", `config key '${key}' is env-mapped to '${envName}' but not overridable at layer 'host'`);
100
- }
101
- merged[key] = value;
102
- }
103
-
104
- applyLayer(merged, "host", options.layers?.host, decl, keys);
105
- applyLayer(merged, "tenant", options.layers?.tenant, decl, keys);
106
- applyLayer(merged, "user", options.layers?.user, decl, keys);
107
-
108
- const parsed = decl.schema.safeParse(merged);
109
- if (!parsed.success) throw new ConfigValidationError(parsed.error);
110
- return Object.freeze(parsed.data) as never;
111
- }
@@ -1,572 +0,0 @@
1
- // #2666: direct module imports must initialize schema extensions before defineModule callers run.
2
- import "./openapi-init";
3
- import type * as z from "zod";
4
- import { assertValidManifest } from "./manifest-validation";
5
- import type { MessageAuthorityParticipant } from "./message-authority";
6
-
7
- declare const ScopeBrand: unique symbol;
8
- declare const ModuleDefinitionBrand: unique symbol;
9
-
10
- /** Kernel-minted owning scope. Modules may carry it but cannot construct one. */
11
- export type Scope = string & { readonly [ScopeBrand]: true };
12
-
13
- /** Flat, transport-independent authorization vocabulary. */
14
- export type Grant = `${string}:${"read" | "write" | "admin"}` | `command:${string}`;
15
-
16
- /**
17
- * Server-resolved creator attributes the host attaches to a principal so a module can FREEZE a
18
- * durable effect's create-time identity snapshot (P2-7, #1409) under the authenticated creator's
19
- * REAL reach — never a client-named one. The kernel treats every field as OPAQUE: `scopes` are the
20
- * creator's transport-layer scopes (e.g. `message:send`, which the flat {@link Grant} grammar cannot
21
- * spell) and `constraints` is an untyped blob (cwdPrefixes etc.) the host later reconstructs into a
22
- * token. Because this rides the {@link InvocationIdentity} the TRUSTED host binding builds — not the
23
- * client-facing op input — a client cannot supply or widen it. Absent for callers that mint no
24
- * durable effects (the common case); modules must fall back to `grants`/defaults when it is missing.
25
- */
26
- export interface ResolvedIdentity {
27
- /** The creator's actor kind (e.g. `component`, `provider`, `system`) — cosmetic identity metadata. */
28
- readonly kind?: string;
29
- /** The creator's REAL transport scopes, carried verbatim so a durable send authorizes under
30
- * `message:send` (which is not a {@link Grant}). Frozen into `createdByScopes`. */
31
- readonly scopes?: readonly string[];
32
- /** The creator token's opaque constraint blob (cwd/agent axes). SERVER-resolved; frozen into
33
- * `createdByConstraints` so the fire-time authz gate binds to the creator's real constraint. */
34
- readonly constraints?: Readonly<Record<string, unknown>>;
35
- }
36
-
37
- /** The sole identity shape visible to modules. */
38
- export interface Principal {
39
- readonly actor: string;
40
- readonly scope: Scope;
41
- readonly grants: ReadonlySet<Grant>;
42
- /** Opaque server-resolved creator attributes for durable-effect identity freezing (P2-7). The
43
- * host attaches it from the authenticated token via the trusted invocation identity; absent for
44
- * ordinary callers. See {@link ResolvedIdentity}. */
45
- readonly resolvedIdentity?: ResolvedIdentity;
46
- }
47
-
48
- export type EventName = `${string}.${string}`;
49
- export type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS" | "HEAD";
50
- export type ConfigLayer = "defaults" | "instance" | "host" | "tenant" | "user";
51
- export type StepName = string;
52
- export type JsonPrimitive = string | number | boolean | null;
53
- export type JsonValue = JsonPrimitive | readonly JsonValue[] | { readonly [key: string]: JsonValue };
54
-
55
- type Schema = z.ZodType;
56
- type ObjectSchema = z.ZodObject<any>;
57
- type SchemaInput<S> = S extends z.ZodType ? z.input<S> : never;
58
- type SchemaOutput<S> = S extends z.ZodType ? z.output<S> : never;
59
- type RecordValue<R, K> = R extends Record<PropertyKey, unknown> ? R[K & keyof R] : never;
60
-
61
- export interface TraceContext {
62
- readonly traceId: string;
63
- readonly spanId: string;
64
- child(name: string): TraceContext;
65
- }
66
-
67
- export interface Disposable {
68
- dispose(): void;
69
- }
70
-
71
- export interface Clock {
72
- now(): number;
73
- sleep(ms: number): Promise<void>;
74
- every(ms: number, fn: () => void): Disposable;
75
- }
76
-
77
- export interface Rng {
78
- uuid(): string;
79
- random(): number;
80
- jitter(baseMs: number, spread: number): number;
81
- }
82
-
83
- /** Outbound HTTP is the only module-visible transport. */
84
- export interface Transport {
85
- fetch(url: string, init?: RequestInit): Promise<Response>;
86
- }
87
-
88
- export interface Logger {
89
- debug(message: string, fields?: Readonly<Record<string, unknown>>): void;
90
- info(message: string, fields?: Readonly<Record<string, unknown>>): void;
91
- warn(message: string, fields?: Readonly<Record<string, unknown>>): void;
92
- error(message: string, fields?: Readonly<Record<string, unknown>>): void;
93
- }
94
-
95
- export interface ConfigDecl<S extends ObjectSchema = ObjectSchema> {
96
- schema: S;
97
- env?: Partial<Record<keyof z.output<S>, string>>;
98
- overridableAt?: Partial<Record<keyof z.output<S>, readonly ConfigLayer[]>>;
99
- }
100
-
101
- export type ResolvedConfig<D> = D extends ConfigDecl<infer S>
102
- ? Readonly<z.output<S>>
103
- : Readonly<Record<never, never>>;
104
-
105
- export interface EntityRef {
106
- module: string;
107
- entity: string;
108
- }
109
-
110
- export interface EntityDecl<S extends ObjectSchema = ObjectSchema> {
111
- schema: S;
112
- key?: keyof z.output<S>;
113
- indexes?: ReadonlyArray<keyof z.output<S> | readonly (keyof z.output<S>)[]>;
114
- references?: Partial<Record<keyof z.output<S>, EntityRef>>;
115
- retention?: { ttlDays?: number; ttlField?: keyof z.output<S> };
116
- audit?: boolean;
117
- }
118
-
119
- type EntityValue<D> = D extends EntityDecl<infer S> ? z.output<S> : never;
120
- type EntityInput<D> = D extends EntityDecl<infer S> ? z.input<S> : never;
121
- type EntityKey<D> = D extends EntityDecl<infer S>
122
- ? D["key"] extends keyof z.output<S>
123
- ? z.output<S>[D["key"]]
124
- : "id" extends keyof z.output<S>
125
- ? z.output<S>["id"]
126
- : unknown
127
- : never;
128
-
129
- export interface EntityListOptions<V> {
130
- limit?: number;
131
- cursor?: string;
132
- where?: Partial<V>;
133
- }
134
-
135
- export interface EntityPage<V> {
136
- items: readonly V[];
137
- /** Opaque continuation token for the next page. Absent when this is the final page. */
138
- cursor?: string;
139
- }
140
-
141
- export interface EntityStore<D extends EntityDecl = EntityDecl> {
142
- get(key: EntityKey<D>): Promise<EntityValue<D> | undefined>;
143
- list(options?: EntityListOptions<EntityValue<D>>): Promise<EntityPage<EntityValue<D>>>;
144
- create(value: EntityInput<D>): Promise<EntityValue<D>>;
145
- update(key: EntityKey<D>, patch: Partial<EntityInput<D>>): Promise<EntityValue<D>>;
146
- delete(key: EntityKey<D>): Promise<boolean>;
147
- }
148
-
149
- export type EntityStores<E> = E extends Record<string, EntityDecl>
150
- ? { readonly [K in keyof E]: EntityStore<E[K]> }
151
- : Readonly<Record<never, never>>;
152
-
153
- export interface EventWriter<E> {
154
- emit<N extends keyof E & EventName>(name: N, payload: SchemaInput<RecordValue<E, N>>): Promise<void>;
155
- }
156
-
157
- export interface WorkflowStartOptions {
158
- idempotencyKey: string;
159
- /** How the instance SEED commits, relative to the caller's own commit scope.
160
- *
161
- * Omitted (the ratified default): the seed commits in its OWN transaction immediately and the
162
- * drive runs inline — `start` returns the driven run. A crash after `start` returns leaves a
163
- * durable instance regardless of what the caller does next.
164
- *
165
- * `"op-commit"` (T-0 hardening, #1409 finding 1): ONLY valid inside an op handler. The seed is
166
- * BUFFERED and executes INSIDE the op's atomic entity+event commit — after the entity flush, in
167
- * the same SQLite transaction — so an op that fails its optimistic-version CAS (or throws, or
168
- * fails output validation) rolls the instance seed back WITH its entities and events: no orphaned
169
- * workflow can survive an op that did not commit. The drive runs after the op commits (a drive
170
- * failure leaves a durable `pending` instance the recovery pass converges — the op itself has
171
- * already succeeded). The returned {@link WorkflowRun} is a PROVISIONAL projection: the live run
172
- * when the idempotency key already names an instance, else a `pending` stub whose id is the id
173
- * the commit will seed (a concurrent same-key seed between handler and commit may supersede it).
174
- * Outside an op invocation (a step body, a standalone client) this mode fails closed. */
175
- enlist?: "op-commit";
176
- }
177
-
178
- export type WorkflowStatusName = "pending" | "running" | "sleeping" | "waiting" | "done" | "failed" | "canceled";
179
-
180
- export interface WorkflowRun<Output = unknown> {
181
- readonly id: string;
182
- readonly status: WorkflowStatusName | `step:${string}`;
183
- readonly attempts: number;
184
- readonly createdAt: number;
185
- readonly updatedAt: number;
186
- readonly output?: Output;
187
- readonly error?: string;
188
- }
189
-
190
- type WorkflowInput<D> = D extends { input: infer In extends Schema } ? SchemaInput<In> : never;
191
-
192
- export interface WorkflowClient<W> {
193
- start<N extends keyof W & string>(name: N, input: WorkflowInput<RecordValue<W, N>>, options: WorkflowStartOptions): Promise<WorkflowRun>;
194
- status(id: string): Promise<WorkflowRun | undefined>;
195
- cancel(id: string): Promise<boolean>;
196
- /** Inside an op invocation this is enlisted in the op commit; elsewhere it commits immediately. */
197
- control?(operation: "cancel" | "fail" | "reopen", id: string, failure?: JsonValue): Promise<boolean>;
198
- }
199
-
200
- export type HostCommandStatus = "queued" | "sent" | "executing" | "done" | "failed";
201
-
202
- export interface HostCommandRun<Out = unknown> {
203
- readonly id: string;
204
- readonly status: HostCommandStatus;
205
- readonly result?: Out;
206
- readonly error?: string;
207
- }
208
-
209
- type CommandInput<D> = D extends { input: infer In extends Schema } ? SchemaInput<In> : never;
210
- type CommandOutput<D> = D extends { result: infer Out extends Schema } ? SchemaOutput<Out> : never;
211
-
212
- export interface CommandTarget {
213
- host: string;
214
- }
215
-
216
- export interface CommandClient<C> {
217
- issue<N extends keyof C & string>(
218
- name: N,
219
- input: CommandInput<RecordValue<C, N>>,
220
- target: CommandTarget,
221
- ): Promise<HostCommandRun<CommandOutput<RecordValue<C, N>>>>;
222
- status(id: string): Promise<HostCommandRun | undefined>;
223
- }
224
-
225
- export type ProbeResult =
226
- | { status: "ready" }
227
- | { status: "degraded"; reasons: Array<{ code: string; message: string }> };
228
-
229
- export type Capability = "spawn" | "execute-commands" | "land" | (string & {});
230
-
231
- export interface HealthReporter {
232
- report(probe: string, result: ProbeResult): void;
233
- capability(capability: Capability, host?: string): Promise<boolean>;
234
- }
235
-
236
- type SecretName<S> = S extends readonly (infer Name extends string)[] ? Name : never;
237
-
238
- export interface SecretsReader<S> {
239
- get(name: SecretName<S>): Promise<string>;
240
- }
241
-
242
- /**
243
- * An OPAQUE per-{@link ModuleHost} identity. It carries no capability and no data — a module can only
244
- * compare it or use it as a `WeakMap` key, to bind module-private state to the exact host instance that
245
- * is executing (#1506: the inbox binds its admission capability to the host whose gateway claimed it, so
246
- * a token minted against any other object is inert here). A look-alike literal is a DIFFERENT object and
247
- * therefore a different key, which is the whole point: identity is by reference, never by shape.
248
- */
249
- export interface HostIdentity {
250
- readonly hostIdentity: true;
251
- }
252
-
253
- export interface ModuleCtx<M extends AnyManifest = AnyManifest> {
254
- /** The opaque identity of the host executing this op — see {@link HostIdentity}. */
255
- readonly hostIdentity: HostIdentity;
256
- readonly principal: Principal;
257
- readonly trace: TraceContext;
258
- readonly config: ResolvedConfig<M["config"]>;
259
- readonly entities: EntityStores<M["entities"]>;
260
- readonly events: EventWriter<NonNullable<M["events"]>>;
261
- readonly workflows: WorkflowClient<NonNullable<M["workflows"]>>;
262
- readonly commands: CommandClient<NonNullable<M["commands"]>>;
263
- /** Dormant Stage-0 bridge for MESSAGE timer authority mutations. The participant is scoped to
264
- * this op/step attempt and commits only with its entity/event/journal transaction. */
265
- readonly messageAuthority: MessageAuthorityParticipant;
266
- readonly health: HealthReporter;
267
- readonly secrets: SecretsReader<NonNullable<M["secrets"]>>;
268
- readonly clock: Clock;
269
- readonly rng: Rng;
270
- readonly net: Transport;
271
- readonly log: Logger;
272
- }
273
-
274
- export interface OpExposure {
275
- http?: boolean;
276
- mcp?: boolean;
277
- cli?: boolean;
278
- }
279
-
280
- export interface OpDecl<In extends Schema = z.ZodType<any>, Out extends Schema = z.ZodType<any>> {
281
- kind: "query" | "mutation";
282
- input: In;
283
- output: Out;
284
- grant: Grant;
285
- /**
286
- * The scope requirement a transport ADVERTISES for this op (MCP `tools/list.requiredScopes`, the
287
- * OpenAPI security surface). Defaults to `[grant]`. Set this ONLY when the handler enforces a
288
- * STRICTER requirement than the entry `grant` — e.g. an op that declares `control:read` to gate
289
- * entry but is admin-only in-handler because it reads an owner-less table. Advertising `[grant]`
290
- * there would name a scope that ALWAYS 403s; advertising the real requirement keeps the published
291
- * surface honest. Purely advisory: the invoker still gates on `grant`, so this changes no
292
- * authorization decision — it only fixes what the derived tool/OpenAPI surface CLAIMS is required.
293
- */
294
- advertiseScopes?: readonly Grant[];
295
- summary: string;
296
- emits?: readonly EventName[];
297
- idempotent?: boolean;
298
- expose?: OpExposure;
299
- http?: { method: HttpMethod; path: string };
300
- handler(ctx: ModuleCtx, input: z.input<In>): Promise<z.output<Out>>;
301
- }
302
-
303
- export class OpError extends Error {
304
- constructor(
305
- readonly code: string,
306
- readonly status: number,
307
- message: string,
308
- readonly fields?: Readonly<Record<string, readonly string[]>>,
309
- ) {
310
- super(message);
311
- this.name = "OpError";
312
- }
313
- }
314
-
315
- export type RetryBackoff =
316
- | { kind: "fixed"; delayMs: number }
317
- | { kind: "exponential"; initialMs: number; maxMs: number; multiplier?: number };
318
-
319
- export interface RetryPolicy {
320
- maxAttempts: number;
321
- backoff: RetryBackoff;
322
- jitter?: number;
323
- }
324
-
325
- export type WaitCondition =
326
- | { kind: "event"; topic: EventName; correlationId?: string }
327
- | { kind: "command"; commandId: string };
328
-
329
- export interface WorkflowDecl<In = any, State extends JsonValue = any> {
330
- input: z.ZodType<In>;
331
- state: z.ZodType<State>;
332
- init(input: In): State;
333
- start: StepName;
334
- steps: Record<StepName, StepDecl<State>>;
335
- }
336
-
337
- export interface StepDecl<State extends JsonValue> {
338
- run(ctx: ModuleCtx, state: State): Promise<StepResult<State>>;
339
- retry?: RetryPolicy;
340
- timeoutMs?: number;
341
- }
342
-
343
- export type StepResult<State extends JsonValue> =
344
- | { state: State; next: StepName }
345
- | { state: State; next: "done"; output?: unknown }
346
- | { state: State; next: StepName; sleepUntil: number }
347
- | { state: State; next: StepName; waitFor: WaitCondition };
348
-
349
- export interface HostCommandDecl<In = any, Out = any> {
350
- input: z.ZodType<In>;
351
- result: z.ZodType<Out>;
352
- target: "host-agent" | "runner";
353
- grant: Grant;
354
- idempotencyKey(input: In): string;
355
- timeoutMs: number;
356
- retry?: RetryPolicy;
357
- whenDegraded?: "queue" | "reject";
358
- }
359
-
360
- export interface ProbeDecl {
361
- intervalMs?: number;
362
- check?(ctx: ModuleCtx): Promise<ProbeResult>;
363
- degrades: Capability[];
364
- }
365
-
366
- export interface HealthDecl {
367
- probes: Record<string, ProbeDecl>;
368
- }
369
-
370
- export interface EventTopicSelector {
371
- topics: readonly EventName[];
372
- cursor?: string;
373
- }
374
-
375
- export interface WsHandlerSlot {
376
- onMessage(data: string | Uint8Array): void | Promise<void>;
377
- onClose?(code: number, reason: string): void | Promise<void>;
378
- onError?(error: unknown): void | Promise<void>;
379
- }
380
-
381
- export type RawRouteDecl =
382
- | {
383
- method: HttpMethod;
384
- path: string;
385
- grant: Grant;
386
- handler(ctx: ModuleCtx, req: Request): Promise<Response>;
387
- }
388
- | {
389
- streaming: "sse";
390
- path: string;
391
- grant: Grant;
392
- subscribe(ctx: ModuleCtx, req: Request): EventTopicSelector;
393
- }
394
- | {
395
- streaming: "websocket";
396
- path: string;
397
- grant: Grant;
398
- accept(ctx: ModuleCtx, req: Request): WsHandlerSlot;
399
- };
400
-
401
- export type CellRenderer = unknown;
402
-
403
- export type UiSurface =
404
- | { kind: "table"; entity: string; columns?: string[]; rowActions?: string[]; customCells?: Record<string, CellRenderer> }
405
- | { kind: "detail"; entity: string; customCells?: Record<string, CellRenderer> }
406
- | { kind: "form"; op: string }
407
- | { kind: "settings" }
408
- | { kind: "runs"; entity: string; statusField: string }
409
- | { kind: "healthMatrix" };
410
-
411
- export interface UiDecl {
412
- nav?: { section: string; icon: string; order?: number };
413
- surfaces?: UiSurface[];
414
- custom?: () => Promise<{ default: unknown }>;
415
- }
416
-
417
- export interface AgentContextDecl {
418
- summary: string;
419
- examples?: Array<{ intent: string; call: string }>;
420
- caveats?: string[];
421
- }
422
-
423
- export interface MigrationHandle {
424
- select<T extends JsonValue = JsonValue>(sql: string, params?: readonly JsonValue[]): Promise<readonly T[]>;
425
- execute(sql: string, params?: readonly JsonValue[]): Promise<{ changes: number }>;
426
- }
427
-
428
- export interface DataMigration {
429
- id: string;
430
- run(handle: MigrationHandle): Promise<void>;
431
- }
432
-
433
- export interface ModuleManifest {
434
- id: string;
435
- title: string;
436
- description: string;
437
- config?: ConfigDecl;
438
- entities?: Record<string, EntityDecl>;
439
- events?: Record<EventName, Schema>;
440
- ops?: Record<string, OpDecl<any, any>>;
441
- routes?: readonly RawRouteDecl[];
442
- workflows?: Record<string, WorkflowDecl<any, any>>;
443
- commands?: Record<string, HostCommandDecl<any, any>>;
444
- health?: HealthDecl;
445
- secrets?: readonly string[];
446
- ui?: UiDecl;
447
- agentContext?: AgentContextDecl;
448
- data?: readonly DataMigration[];
449
- }
450
-
451
- export type AnyManifest = ModuleManifest;
452
-
453
- type InvalidEventNames<M extends ModuleManifest> = M["events"] extends Record<string, unknown>
454
- ? Exclude<keyof M["events"], `${M["id"]}.${string}`>
455
- : never;
456
-
457
- type InvalidEmittedNames<M extends ModuleManifest> = M["ops"] extends Record<string, OpDecl<any, any>>
458
- ? {
459
- // An op that omits the optional `emits` has nothing to check; only a concretely declared
460
- // list (no `undefined` in its type) is verified against the manifest's events. Without this
461
- // guard, an absent `emits` widens to `EventName[]` and every emit-less op false-positives.
462
- [K in keyof M["ops"]]: undefined extends M["ops"][K]["emits"]
463
- ? never
464
- : Exclude<NonNullable<M["ops"][K]["emits"]>[number], keyof NonNullable<M["events"]>>;
465
- }[keyof M["ops"]]
466
- : never;
467
-
468
- type InvalidWorkflowState<M extends ModuleManifest> = M["workflows"] extends Record<string, WorkflowDecl<any, any>>
469
- ? {
470
- [K in keyof M["workflows"]]: SchemaOutput<M["workflows"][K]["state"]> extends JsonValue ? never : K;
471
- }[keyof M["workflows"]]
472
- : never;
473
-
474
- type LowerAlpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m"
475
- | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z";
476
- type Digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
477
-
478
- type IsKebabSegment<S extends string> = S extends `${infer First}${infer Rest}`
479
- ? First extends LowerAlpha
480
- ? Rest extends ""
481
- ? true
482
- : Rest extends `${LowerAlpha | Digit}${infer Tail}`
483
- ? IsKebabRemainder<Tail>
484
- : false
485
- : false
486
- : false;
487
-
488
- type IsKebabRemainder<S extends string> = S extends ""
489
- ? true
490
- : S extends `${LowerAlpha | Digit}${infer Rest}`
491
- ? IsKebabRemainder<Rest>
492
- : false;
493
-
494
- type IsKebabId<S extends string> = S extends `${infer Head}-${infer Tail}`
495
- ? IsKebabSegment<Head> extends true
496
- ? IsKebabId<Tail>
497
- : false
498
- : IsKebabSegment<S>;
499
-
500
- type InvalidModuleId<M extends ModuleManifest> = string extends M["id"]
501
- ? never
502
- : IsKebabId<M["id"]> extends true ? never : M["id"];
503
-
504
- type ReservedModuleId<M extends ModuleManifest> = string extends M["id"]
505
- ? never
506
- : Extract<M["id"], "command">;
507
-
508
- type InvalidEntityFields<M extends ModuleManifest> = M["entities"] extends Record<string, EntityDecl>
509
- ? {
510
- [K in keyof M["entities"]]: Extract<
511
- keyof SchemaOutput<M["entities"][K]["schema"]>,
512
- "scope" | "version" | "created_at" | "updated_at"
513
- >;
514
- }[keyof M["entities"]]
515
- : never;
516
-
517
- type InvalidWorkflowStart<M extends ModuleManifest> = M["workflows"] extends Record<string, WorkflowDecl<any, any>>
518
- ? {
519
- [K in keyof M["workflows"]]: Exclude<M["workflows"][K]["start"], keyof M["workflows"][K]["steps"]>;
520
- }[keyof M["workflows"]]
521
- : never;
522
-
523
- type MissingMutationIdempotency<M extends ModuleManifest> = M["ops"] extends Record<string, OpDecl<any, any>>
524
- ? {
525
- [K in keyof M["ops"]]: M["ops"][K] extends { kind: "mutation" }
526
- ? M["ops"][K] extends { idempotent: boolean } ? never : K
527
- : never;
528
- }[keyof M["ops"]]
529
- : never;
530
-
531
- type ValidationFailure<Message extends string, Detail> = {
532
- readonly __manifestError__: Message;
533
- readonly __manifestErrorDetail__: Detail;
534
- };
535
-
536
- /** Compile-time cross-field checks that the individual declaration types cannot express. */
537
- export type ValidateManifest<M extends ModuleManifest> = M
538
- & ([InvalidModuleId<M>] extends [never]
539
- ? unknown
540
- : ValidationFailure<"module id must be kebab-case", InvalidModuleId<M>>)
541
- & ([ReservedModuleId<M>] extends [never]
542
- ? unknown
543
- : ValidationFailure<"module id is reserved", ReservedModuleId<M>>)
544
- & ([InvalidEventNames<M>] extends [never]
545
- ? unknown
546
- : ValidationFailure<"event names must begin with '<module-id>.'", InvalidEventNames<M>>)
547
- & ([InvalidEmittedNames<M>] extends [never]
548
- ? unknown
549
- : ValidationFailure<"ops may only emit events declared by this module", InvalidEmittedNames<M>>)
550
- & ([InvalidWorkflowState<M>] extends [never]
551
- ? unknown
552
- : ValidationFailure<"workflow state must be JSON-safe", InvalidWorkflowState<M>>)
553
- & ([InvalidEntityFields<M>] extends [never]
554
- ? unknown
555
- : ValidationFailure<"entity schemas may not declare kernel-owned fields", InvalidEntityFields<M>>)
556
- & ([InvalidWorkflowStart<M>] extends [never]
557
- ? unknown
558
- : ValidationFailure<"workflow start must name a declared step", InvalidWorkflowStart<M>>)
559
- & ([MissingMutationIdempotency<M>] extends [never]
560
- ? unknown
561
- : ValidationFailure<"mutations must declare idempotent", MissingMutationIdempotency<M>>);
562
-
563
- /** A validated manifest, preserving all literal and schema inference from its declaration. */
564
- export type ModuleDefinition<M extends ModuleManifest = ModuleManifest> = Readonly<M> & {
565
- readonly [ModuleDefinitionBrand]: true;
566
- };
567
-
568
- /** Validate once at the declaration boundary; no module runtime is started here. */
569
- export function defineModule<const M extends ModuleManifest>(manifest: ValidateManifest<M>): ModuleDefinition<M> {
570
- assertValidManifest(manifest);
571
- return manifest as unknown as ModuleDefinition<M>;
572
- }