okengine 0.18.4 → 0.19.0

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 (512) hide show
  1. package/AGENTS.md +18 -10
  2. package/README.md +2 -2
  3. package/package.json +51 -50
  4. package/site/content/docs/ai/index.mdx +25 -6
  5. package/site/content/docs/ai/llms-txt.mdx +1 -1
  6. package/site/content/docs/ai/meta.json +1 -1
  7. package/site/content/docs/ai/skills.mdx +4 -1
  8. package/site/content/docs/ai/try-it.mdx +58 -0
  9. package/site/content/docs/client/auth.mdx +208 -0
  10. package/site/content/docs/client/calling.mdx +451 -0
  11. package/site/content/docs/client/index.mdx +209 -0
  12. package/site/content/docs/client/live.mdx +234 -0
  13. package/site/content/docs/client/meta.json +5 -0
  14. package/site/content/docs/client/react.mdx +249 -0
  15. package/site/content/docs/elements/ai/agents.mdx +232 -0
  16. package/site/content/docs/elements/ai/index.mdx +341 -0
  17. package/site/content/docs/elements/ai/mcp.mdx +275 -0
  18. package/site/content/docs/elements/ai/meta.json +5 -0
  19. package/site/content/docs/elements/ai/models.mdx +283 -0
  20. package/site/content/docs/elements/ai/prompts.mdx +256 -0
  21. package/site/content/docs/elements/channel/email.mdx +266 -0
  22. package/site/content/docs/elements/channel/index.mdx +344 -0
  23. package/site/content/docs/elements/channel/meta.json +5 -0
  24. package/site/content/docs/elements/channel/push.mdx +218 -0
  25. package/site/content/docs/elements/channel/receipts.mdx +206 -0
  26. package/site/content/docs/elements/channel/sms.mdx +264 -0
  27. package/site/content/docs/elements/channel/whatsapp.mdx +220 -0
  28. package/site/content/docs/elements/clock/index.mdx +300 -0
  29. package/site/content/docs/elements/clock/meta.json +5 -0
  30. package/site/content/docs/elements/clock/schedules.mdx +508 -0
  31. package/site/content/docs/elements/clock/sleep.mdx +445 -0
  32. package/site/content/docs/elements/flow/consumers.mdx +707 -0
  33. package/site/content/docs/elements/flow/http.mdx +1080 -0
  34. package/site/content/docs/elements/flow/index.mdx +618 -0
  35. package/site/content/docs/elements/flow/meta.json +5 -0
  36. package/site/content/docs/elements/flow/routing.mdx +559 -0
  37. package/site/content/docs/elements/flow/workflows.mdx +640 -0
  38. package/site/content/docs/elements/gate/auth.mdx +371 -0
  39. package/site/content/docs/elements/gate/authorization.mdx +298 -0
  40. package/site/content/docs/elements/gate/index.mdx +418 -0
  41. package/site/content/docs/elements/gate/meta.json +5 -0
  42. package/site/content/docs/elements/gate/rate-limits.mdx +365 -0
  43. package/site/content/docs/elements/gate/rls.mdx +303 -0
  44. package/site/content/docs/elements/gate/tenancy.mdx +372 -0
  45. package/site/content/docs/elements/index.mdx +52 -11
  46. package/site/content/docs/elements/signal/broadcast.mdx +517 -0
  47. package/site/content/docs/elements/signal/index.mdx +352 -0
  48. package/site/content/docs/elements/signal/live.mdx +590 -0
  49. package/site/content/docs/elements/signal/meta.json +5 -0
  50. package/site/content/docs/elements/signal/once.mdx +596 -0
  51. package/site/content/docs/elements/store/files.mdx +659 -0
  52. package/site/content/docs/elements/store/index.mdx +310 -0
  53. package/site/content/docs/elements/store/kv.mdx +629 -0
  54. package/site/content/docs/elements/store/meta.json +5 -0
  55. package/site/content/docs/elements/store/search.mdx +946 -0
  56. package/site/content/docs/elements/store/sql.mdx +937 -0
  57. package/site/content/docs/elements/vault/config.mdx +256 -0
  58. package/site/content/docs/elements/vault/index.mdx +356 -0
  59. package/site/content/docs/elements/vault/meta.json +5 -0
  60. package/site/content/docs/elements/vault/rotation.mdx +273 -0
  61. package/site/content/docs/elements/vault/secrets.mdx +285 -0
  62. package/site/content/docs/index.mdx +78 -30
  63. package/site/content/docs/meta.json +11 -8
  64. package/site/content/docs/plugins/cors.mdx +2 -1
  65. package/site/content/docs/plugins/csrf.mdx +4 -1
  66. package/site/content/docs/plugins/headers.mdx +2 -1
  67. package/site/content/docs/plugins/ip-allowlist.mdx +2 -1
  68. package/site/content/docs/plugins/magic-link.mdx +6 -0
  69. package/site/content/docs/plugins/maintenance-mode.mdx +2 -1
  70. package/site/content/docs/plugins/oauth.mdx +1 -1
  71. package/site/content/docs/plugins/otp.mdx +12 -1
  72. package/site/content/docs/plugins/passkey.mdx +39 -15
  73. package/site/content/docs/plugins/two-factor.mdx +91 -34
  74. package/site/content/docs/plugins/username.mdx +1 -1
  75. package/site/content/docs/recipes/caddy.mdx +3 -3
  76. package/site/content/docs/recipes/index.mdx +18 -28
  77. package/site/content/docs/recipes/mailpit.mdx +1 -1
  78. package/site/content/docs/recipes/meilisearch.mdx +3 -3
  79. package/site/content/docs/recipes/meta.json +1 -4
  80. package/site/content/docs/recipes/nginx.mdx +2 -2
  81. package/site/content/docs/recipes/openrouter.mdx +283 -0
  82. package/site/content/docs/recipes/pgdog.mdx +3 -3
  83. package/site/content/docs/recipes/postgres.mdx +1 -2
  84. package/site/content/docs/recipes/rustfs.mdx +2 -2
  85. package/site/content/docs/recipes/traefik.mdx +3 -3
  86. package/site/content/docs/reference/cli.mdx +231 -0
  87. package/site/content/docs/reference/configuration.mdx +30 -10
  88. package/site/content/docs/reference/environment-variables.mdx +93 -20
  89. package/site/content/docs/reference/errors.mdx +132 -29
  90. package/site/content/docs/reference/fx.mdx +137 -73
  91. package/site/content/docs/reference/index.mdx +13 -21
  92. package/site/content/docs/reference/meta.json +4 -5
  93. package/site/content/docs/reference/okid.mdx +42 -17
  94. package/site/content/docs/reference/plugins.mdx +4 -3
  95. package/site/content/docs/reference/security.mdx +197 -0
  96. package/site/content/docs/understand/meta.json +5 -0
  97. package/site/content/docs/understand/the-anatomy.mdx +132 -0
  98. package/site/content/docs/understand/the-model.mdx +32 -0
  99. package/site/content/docs/understand/the-problem.mdx +74 -0
  100. package/site/content/docs/understand/the-vocabulary.mdx +26 -0
  101. package/src/auth/api-keys.ts +2 -1
  102. package/src/auth/bindings.ts +64 -16
  103. package/src/auth/gate-auth.test.ts +6 -1
  104. package/src/auth/identity.ts +152 -5
  105. package/src/auth/index.ts +29 -0
  106. package/src/auth/invites.ts +2 -1
  107. package/src/auth/method-context.ts +41 -0
  108. package/src/auth/oauth-as/crypto.ts +2 -1
  109. package/src/auth/oauth-as/stores.ts +2 -1
  110. package/src/auth/operator.ts +2 -1
  111. package/src/auth/sessions-jwt.test.ts +77 -0
  112. package/src/auth/sessions.ts +20 -4
  113. package/src/auth/tenants.ts +3 -2
  114. package/src/auth/two-factor-challenge.test.ts +61 -0
  115. package/src/auth/two-factor-challenge.ts +284 -0
  116. package/src/auth/verification.ts +5 -0
  117. package/src/bench/REPORT.md +49 -0
  118. package/src/bench/g03-signal-once.bench.ts +1 -1
  119. package/src/bench/g10-observability-contention.bench.ts +1 -1
  120. package/src/bench/g17-hybrid-search.bench.ts +572 -0
  121. package/src/bench/load-app.ts +2 -10
  122. package/src/cli/ai-setup/ai-setup.test.ts +331 -42
  123. package/src/cli/ai-setup/apply.ts +294 -52
  124. package/src/cli/ai-setup/catalog.ts +238 -1342
  125. package/src/cli/ai-setup/index.ts +14 -99
  126. package/src/cli/ai-setup/prompts.ts +60 -443
  127. package/src/cli/ask-seed.test.ts +96 -0
  128. package/src/cli/ask-seed.ts +82 -0
  129. package/src/cli/ask-vault-gaps.test.ts +84 -0
  130. package/src/cli/ask-vault-gaps.ts +146 -0
  131. package/src/cli/build.ts +2 -2
  132. package/src/cli/client-add.test.ts +26 -1
  133. package/src/cli/client-add.ts +106 -27
  134. package/src/cli/competitor-mention-removal.test.ts +1 -1
  135. package/src/cli/db-seed.ts +2 -0
  136. package/src/cli/db.ts +150 -11
  137. package/src/cli/dev.ts +119 -211
  138. package/src/cli/docker-clean.ts +2 -2
  139. package/src/cli/docker-cli.test.ts +1 -1
  140. package/src/cli/doctor-diff.ts +4 -2
  141. package/src/cli/doctor-pii.test.ts +1 -1
  142. package/src/cli/doctor.ts +14 -1
  143. package/src/cli/hero-meta.test.ts +4 -2
  144. package/src/cli/load-config.images.test.ts +8 -10
  145. package/src/cli/load-config.ts +1 -1
  146. package/src/cli/registry.ts +22 -10
  147. package/src/cli/replay.ts +3 -1
  148. package/src/cli/start.ts +1 -1
  149. package/src/cli/tui/keys.ts +2 -3
  150. package/src/client/auth/cookies.ts +74 -0
  151. package/src/client/auth/create-auth-client.ts +636 -0
  152. package/src/client/auth/denials.ts +99 -0
  153. package/src/client/auth/session.ts +283 -0
  154. package/src/client/auth.test.ts +251 -0
  155. package/src/client/auth.ts +39 -114
  156. package/src/client/create-with-session.ts +245 -0
  157. package/src/client/create.ts +51 -5
  158. package/src/client/index.ts +11 -1
  159. package/src/client/live.ts +11 -79
  160. package/src/client/notes-contract.test.ts +5 -10
  161. package/src/client/sse.ts +137 -0
  162. package/src/client/stream.ts +147 -0
  163. package/src/client/transport.test.ts +32 -0
  164. package/src/client/transport.ts +123 -26
  165. package/src/client/types.ts +118 -14
  166. package/src/client-react/index.ts +185 -24
  167. package/src/client-react/use-live-query.ts +13 -3
  168. package/src/compiler/aot.test.ts +7 -4
  169. package/src/compiler/effects-embed.test.ts +56 -0
  170. package/src/compiler/effects-fetch.test.ts +43 -0
  171. package/src/compiler/effects-infer.ts +58 -2
  172. package/src/compiler/extract.test.ts +258 -44
  173. package/src/compiler/extract.ts +566 -48
  174. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -4
  175. package/src/compiler/fixtures/skyport/src/flows/bookings/signals.ts +2 -8
  176. package/src/compiler/fixtures/skyport.expected.json +4 -4
  177. package/src/compiler/fixtures/triggers/five-triggers.ts +14 -10
  178. package/src/compiler/response.ts +2 -2
  179. package/src/compiler/search-writer-isolation.test.ts +40 -0
  180. package/src/config/index.ts +11 -0
  181. package/src/console/server/app.ts +17 -23
  182. package/src/console/server/bind.ts +4 -0
  183. package/src/console/server/console.test.ts +2 -2
  184. package/src/console/server/flows-invoke.test.ts +50 -34
  185. package/src/console/server/flows.ts +436 -255
  186. package/src/console/server/runs-ingest.test.ts +6 -3
  187. package/src/console/server/serve.ts +1 -1
  188. package/src/console/server/signals.test.ts +1 -5
  189. package/src/console/server/signals.ts +8 -6
  190. package/src/console/server/state.ts +6 -1
  191. package/src/console/server/store.ts +1 -1
  192. package/src/console/ui-next/dist/assets/FileExportIcon-Ck-5od4R.js +1 -0
  193. package/src/console/ui-next/dist/assets/MoreHorizontalCircle01Icon-gMNGsE37.js +1 -0
  194. package/src/console/ui-next/dist/assets/PlusSignIcon-CwG3nxfu.js +1 -0
  195. package/src/console/ui-next/dist/assets/UnavailableIcon-D9cvHVPr.js +1 -0
  196. package/src/console/ui-next/dist/assets/UserIcon-DaE2PB5_.js +1 -0
  197. package/src/console/ui-next/dist/assets/access-page-DFeymU07.js +4 -0
  198. package/src/console/ui-next/dist/assets/agent-disclosure-U1rdfblp.js +1 -0
  199. package/src/console/ui-next/dist/assets/cache-glyph-BeFJeqBG.js +1 -0
  200. package/src/console/ui-next/dist/assets/call-pii-button-CVAONPii.js +1 -0
  201. package/src/console/ui-next/dist/assets/collapsible-D2A6NJ-3.js +1 -0
  202. package/src/console/ui-next/dist/assets/copy-inline-button-CAYD18cr.js +1 -0
  203. package/src/console/ui-next/dist/assets/dagre.esm-B1_XeuLP.js +1 -0
  204. package/src/console/ui-next/dist/assets/detail-header-DVWNjWjg.js +1 -0
  205. package/src/console/ui-next/dist/assets/dropdown-menu-4h2LOVXM.js +1 -0
  206. package/src/console/ui-next/dist/assets/duration-tone-Cgk_h5ja.js +9 -0
  207. package/src/console/ui-next/dist/assets/element-icons-BI8cJgdh.js +1 -0
  208. package/src/console/ui-next/dist/assets/explorer-empty-CJs5A-wm.js +1 -0
  209. package/src/console/ui-next/dist/assets/flows-page-Dss7941e.js +1 -0
  210. package/src/console/ui-next/dist/assets/highlighted-json-MYZQtRnw.js +154 -0
  211. package/src/console/ui-next/dist/assets/http-method-Jrh39p7A.js +1 -0
  212. package/src/console/ui-next/dist/assets/index-D0zS5rKO.css +2 -0
  213. package/src/console/ui-next/dist/assets/index-DXP2dBIF.js +63 -0
  214. package/src/console/ui-next/dist/assets/observability-page-HvolXxTI.js +4 -0
  215. package/src/console/ui-next/dist/assets/react-dom-Ddte4I-Q.js +9 -0
  216. package/src/console/ui-next/dist/assets/replica-lag-CSh2dzrb.js +18 -0
  217. package/src/console/ui-next/dist/assets/request-meta-BatF8KrK.js +1 -0
  218. package/src/console/ui-next/dist/assets/shortcut-keys-3ILd8oGn.js +1 -0
  219. package/src/console/ui-next/dist/assets/{sql-BskegiFM.js → sql-BsFa4tDR.js} +1 -1
  220. package/src/console/ui-next/dist/assets/store-page-eiKiHnNe.js +41 -0
  221. package/src/console/ui-next/dist/assets/trace-detail-sheet-CZkMeKS-.js +2 -0
  222. package/src/console/ui-next/dist/assets/tree-expand-toggle-CW8y5A2h.js +55 -0
  223. package/src/console/ui-next/dist/assets/units-page-B_RWJrEO.js +1 -0
  224. package/src/console/ui-next/dist/assets/{use-vault-list-uk4WVboC.js → use-vault-list-CT4-gajj.js} +1 -1
  225. package/src/console/ui-next/dist/assets/vault-page-CWrg-A68.js +2 -0
  226. package/src/console/ui-next/dist/assets/xyflow-CSyC6ryz.css +1 -0
  227. package/src/console/ui-next/dist/assets/xyflow-yApv7D4e.js +7 -0
  228. package/src/console/ui-next/dist/index.html +6 -13
  229. package/src/console/ui-next/seed-invoke-host.ts +21 -18
  230. package/src/console/ui-next/src/client.ts +7 -2
  231. package/src/console/ui-next/src/features/flows/graph/element-map.ts +2 -0
  232. package/src/console/ui-next/src/features/flows/traces/effect-kind.ts +12 -2
  233. package/src/console/ui-next/src/features/flows/traces/effect-summary.ts +4 -0
  234. package/src/console/ui-next/src/features/flows/traces/trace-detail-sheet.tsx +8 -0
  235. package/src/console/ui-next/src/features/flows/traces/waterfall-bars.ts +4 -0
  236. package/src/console/ui-next/src/features/flows/traces/waterfall-tooltip.ts +9 -3
  237. package/src/console/ui-next/src/features/store/detail/reveal-cell.tsx +7 -11
  238. package/src/console/ui-next/src/features/store/detail/store-row-detail-sheet.tsx +2 -2
  239. package/src/console/ui-next/src/features/store/lib/fields-from-table.ts +2 -0
  240. package/src/console/ui-next/src/features/store/lib/grid-model.test.ts +25 -1
  241. package/src/console/ui-next/src/features/store/lib/grid-model.ts +36 -1
  242. package/src/console/ui-next/src/features/store/query/query-results.tsx +3 -3
  243. package/src/console/ui-next/src/features/units/detail/effects-summary.tsx +2 -0
  244. package/src/console/ui-next/src/features/units/lib/call-read-safe.ts +3 -1
  245. package/src/console/ui-next/src/features/units/lib/fields-from-schema.ts +6 -0
  246. package/src/docker/ai-model-status.test.ts +1 -12
  247. package/src/docker/ai-model-status.ts +10 -38
  248. package/src/docker/compose-up.test.ts +100 -0
  249. package/src/docker/compose-up.ts +292 -0
  250. package/src/docker/compose.ts +4 -14
  251. package/src/docker/derive.ts +9 -34
  252. package/src/docker/docker.test.ts +16 -261
  253. package/src/docker/images-config.test.ts +13 -25
  254. package/src/docker/index.ts +1 -24
  255. package/src/docker/recipes/index.ts +0 -23
  256. package/src/docker/recipes/pgdog.ts +6 -4
  257. package/src/docker/stack-id.test.ts +2 -2
  258. package/src/docker/stack-id.ts +0 -1
  259. package/src/docker/types.ts +2 -2
  260. package/src/drivers/ai-anthropic.ts +10 -0
  261. package/src/drivers/ai-openai-compatible.ts +34 -7
  262. package/src/drivers/ai-providers.test.ts +0 -107
  263. package/src/drivers/ai-stream.test.ts +0 -34
  264. package/src/drivers/ai-types.ts +17 -8
  265. package/src/drivers/channel-fcm.ts +6 -1
  266. package/src/drivers/channel-msegat.ts +6 -1
  267. package/src/drivers/channel-resend.ts +5 -1
  268. package/src/drivers/channel-smtp.ts +5 -1
  269. package/src/drivers/channel-sndr.ts +10 -1
  270. package/src/drivers/channel-taqnyat-mail.ts +5 -1
  271. package/src/drivers/channel-taqnyat-whatsapp.ts +6 -1
  272. package/src/drivers/channel-taqnyat.ts +6 -1
  273. package/src/drivers/channel-types.ts +10 -0
  274. package/src/drivers/channel-unifonic.ts +6 -1
  275. package/src/drivers/channel-wa-cloud.ts +6 -1
  276. package/src/drivers/channel-webpush.ts +6 -1
  277. package/src/drivers/external.ts +33 -0
  278. package/src/drivers/index.ts +0 -10
  279. package/src/drivers/meilisearch.ts +6 -0
  280. package/src/drivers/oauth-types.ts +4 -0
  281. package/src/drivers/postgres.test.ts +74 -3
  282. package/src/drivers/postgres.ts +175 -6
  283. package/src/drivers/signal-types.ts +5 -5
  284. package/src/drivers/types.ts +7 -0
  285. package/src/drivers/vault-types.ts +5 -0
  286. package/src/elements/ai/declare.ts +17 -4
  287. package/src/elements/ai/eval.ts +1 -1
  288. package/src/elements/ai/mcp-http.ts +1 -1
  289. package/src/elements/ai/pii.ts +1 -1
  290. package/src/elements/ai/providers.test.ts +289 -0
  291. package/src/elements/ai/providers.ts +169 -0
  292. package/src/elements/ai/runtime.ts +68 -5
  293. package/src/elements/ai/schema.ts +2 -2
  294. package/src/elements/ai.test.ts +7 -7
  295. package/src/elements/ai.ts +17 -1
  296. package/src/elements/channel/runtime.ts +105 -12
  297. package/src/elements/clock/cron-fields.test.ts +144 -0
  298. package/src/elements/clock/cron-fields.ts +185 -0
  299. package/src/elements/clock/declare.ts +247 -3
  300. package/src/elements/clock.ts +21 -1
  301. package/src/elements/index.ts +15 -0
  302. package/src/elements/signal/chaos-child.ts +1 -2
  303. package/src/elements/signal/declare.ts +65 -37
  304. package/src/elements/signal/delivery-modes.test.ts +11 -31
  305. package/src/elements/signal/dry-run-replay.test.ts +1 -7
  306. package/src/elements/signal/dry-run-write-isolation.test.ts +1 -7
  307. package/src/elements/signal/key-ordering.test.ts +6 -26
  308. package/src/elements/signal/lease-reclaim.test.ts +2 -6
  309. package/src/elements/signal/optional-emit.test.ts +6 -9
  310. package/src/elements/signal/order-lifecycle.test.ts +4 -17
  311. package/src/elements/signal/orphan-messages.test.ts +4 -15
  312. package/src/elements/signal/reconcile.test.ts +2 -2
  313. package/src/elements/signal/runtime.ts +1 -1
  314. package/src/elements/signal/schema-emit.test.ts +4 -8
  315. package/src/elements/signal.test.ts +24 -49
  316. package/src/elements/signal.ts +9 -2
  317. package/src/elements/store/domain-ddl.test.ts +1 -1
  318. package/src/elements/store/live-http.test.ts +9 -4
  319. package/src/elements/store/prepare-row.test.ts +123 -0
  320. package/src/elements/store/resource.ts +43 -12
  321. package/src/elements/store/schema-decl.ts +117 -0
  322. package/src/elements/store/search-backfill.ts +205 -0
  323. package/src/elements/store/search-bind.ts +66 -0
  324. package/src/elements/store/search-bm25.ts +78 -0
  325. package/src/elements/store/search-ddl.ts +156 -0
  326. package/src/elements/store/search-embed-flow.ts +141 -0
  327. package/src/elements/store/search-errors.ts +34 -0
  328. package/src/elements/store/search-fusion.ts +112 -0
  329. package/src/elements/store/search-lsh.ts +179 -0
  330. package/src/elements/store/search-runtime.ts +300 -0
  331. package/src/elements/store/search.test.ts +144 -0
  332. package/src/elements/store/sql-session.test.ts +1 -0
  333. package/src/elements/store/sql-session.ts +83 -3
  334. package/src/elements/store/table.ts +23 -2
  335. package/src/elements/store/upsert-app.test.ts +1 -3
  336. package/src/elements/store.ts +50 -0
  337. package/src/full.ts +4 -2
  338. package/src/http.ts +4 -1
  339. package/src/i18n/catalogs/ar.ts +14 -6
  340. package/src/i18n/catalogs/en.ts +14 -6
  341. package/src/index.ts +6 -1
  342. package/src/kernel/adopt-barrel-fresh.test.ts +7 -7
  343. package/src/kernel/adopt-routes.ts +9 -1
  344. package/src/kernel/app-auth.ts +5 -0
  345. package/src/kernel/app.ts +102 -9
  346. package/src/kernel/auto-cache.test.ts +6 -12
  347. package/src/kernel/auto-registry.test.ts +3 -3
  348. package/src/kernel/boot-bind/ai.test.ts +22 -19
  349. package/src/kernel/boot-bind/ai.ts +5 -43
  350. package/src/kernel/boot-bind/clock.ts +23 -5
  351. package/src/kernel/boot-bind/honor-config.test.ts +4 -4
  352. package/src/kernel/boot.test.ts +11 -6
  353. package/src/kernel/boot.ts +66 -16
  354. package/src/kernel/boundary-contract.ts +93 -0
  355. package/src/kernel/budget.test.ts +1 -1
  356. package/src/kernel/call.ts +89 -0
  357. package/src/kernel/capability.ts +6 -0
  358. package/src/kernel/client-descriptor.ts +123 -0
  359. package/src/kernel/clock-timezone.test.ts +80 -0
  360. package/src/kernel/correlation.test.ts +1 -1
  361. package/src/kernel/dry-run.ts +11 -8
  362. package/src/kernel/effects-stamping.test.ts +42 -9
  363. package/src/kernel/effects.test.ts +4 -2
  364. package/src/kernel/effects.ts +51 -9
  365. package/src/kernel/errors-channel.ts +17 -0
  366. package/src/kernel/errors-live-resume.ts +3 -2
  367. package/src/kernel/errors-tenant.ts +7 -4
  368. package/src/kernel/errors.registry-helpers.ts +96 -0
  369. package/src/kernel/errors.registry.test.ts +139 -25
  370. package/src/kernel/errors.ts +102 -23
  371. package/src/kernel/external-effects.test.ts +196 -0
  372. package/src/kernel/flow.test.ts +13 -4
  373. package/src/kernel/flow.ts +69 -71
  374. package/src/kernel/fx-ask-telemetry.test.ts +2 -2
  375. package/src/kernel/fx-dead-letters.test.ts +3 -3
  376. package/src/kernel/fx-fetch.ts +55 -0
  377. package/src/kernel/fx-live-stream.ts +2 -2
  378. package/src/kernel/fx-live.test.ts +8 -8
  379. package/src/kernel/fx.test.ts +17 -11
  380. package/src/kernel/fx.ts +180 -57
  381. package/src/kernel/horizontal-child.ts +1 -1
  382. package/src/kernel/http-query.test.ts +3 -6
  383. package/src/kernel/index.ts +13 -3
  384. package/src/kernel/instance-id.ts +1 -1
  385. package/src/kernel/instances.test.ts +40 -0
  386. package/src/kernel/instances.ts +47 -9
  387. package/src/kernel/live-http.test.ts +6 -7
  388. package/src/kernel/live-http.ts +6 -2
  389. package/src/kernel/live-resume.test.ts +1 -1
  390. package/src/kernel/mcp-tool.test.ts +3 -3
  391. package/src/kernel/on.ts +98 -4
  392. package/src/kernel/pipeline.test.ts +12 -15
  393. package/src/kernel/plugin-elements.test.ts +1 -1
  394. package/src/kernel/stamp-http.test.ts +3 -3
  395. package/src/kernel/triggers.ts +210 -95
  396. package/src/kernel-entry.ts +0 -1
  397. package/src/manifest/diff.ts +11 -1
  398. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  399. package/src/manifest/types.ts +46 -2
  400. package/src/mcp/docs-index.ts +3 -3
  401. package/src/mcp/docs-mcp.test.ts +2 -2
  402. package/src/mcp/docs-tools.ts +1 -1
  403. package/src/okid.test.ts +56 -0
  404. package/src/okid.ts +55 -11
  405. package/src/plugins/anonymous.ts +8 -4
  406. package/src/plugins/auth/shared.ts +27 -3
  407. package/src/plugins/auth-delivery.mailpit.integration.test.ts +1 -1
  408. package/src/plugins/auth-methods.security.test.ts +561 -23
  409. package/src/plugins/config-source.ts +1 -1
  410. package/src/plugins/csrf.test.ts +65 -0
  411. package/src/plugins/index.ts +2 -0
  412. package/src/plugins/magic-link.ts +36 -16
  413. package/src/plugins/oauth/shared.ts +3 -1
  414. package/src/plugins/oauth.ts +22 -14
  415. package/src/plugins/otp.ts +37 -21
  416. package/src/plugins/passkey-webauthn.ts +9 -6
  417. package/src/plugins/passkey.ts +98 -26
  418. package/src/plugins/pre-account-hijack.test.ts +223 -0
  419. package/src/plugins/two-factor.ts +466 -37
  420. package/src/plugins/username.ts +19 -7
  421. package/src/release/build-lib.ts +1 -0
  422. package/src/release/limits.ts +2 -2
  423. package/src/release/measure.ts +1 -1
  424. package/src/runs/collect.test.ts +0 -2
  425. package/src/runtime/json-code-block.test.ts +250 -20
  426. package/src/runtime/json-code-block.ts +1261 -41
  427. package/src/term.test.ts +1 -1
  428. package/src/test/create-test-app.test.ts +12 -12
  429. package/src/test/live-signals.test.ts +6 -6
  430. package/src/test/provisions.integration.test.ts +10 -14
  431. package/src/test/reset-element-registries.ts +1 -1
  432. package/src/test/tenant-isolation.test.ts +12 -6
  433. package/site/content/docs/deployment/docker-swarm.mdx +0 -164
  434. package/site/content/docs/deployment/docker.mdx +0 -227
  435. package/site/content/docs/deployment/index.mdx +0 -83
  436. package/site/content/docs/deployment/kubernetes.mdx +0 -176
  437. package/site/content/docs/deployment/meta.json +0 -5
  438. package/site/content/docs/deployment/reverse-proxy.mdx +0 -234
  439. package/site/content/docs/elements/ai.mdx +0 -385
  440. package/site/content/docs/elements/channel.mdx +0 -346
  441. package/site/content/docs/elements/clock.mdx +0 -244
  442. package/site/content/docs/elements/flow.mdx +0 -420
  443. package/site/content/docs/elements/gate.mdx +0 -436
  444. package/site/content/docs/elements/signal.mdx +0 -380
  445. package/site/content/docs/elements/store.mdx +0 -1099
  446. package/site/content/docs/elements/vault.mdx +0 -405
  447. package/site/content/docs/get-started/basic-usage.mdx +0 -173
  448. package/site/content/docs/get-started/index.mdx +0 -43
  449. package/site/content/docs/get-started/installation.mdx +0 -220
  450. package/site/content/docs/get-started/introduction.mdx +0 -132
  451. package/site/content/docs/get-started/meta.json +0 -13
  452. package/site/content/docs/get-started/project-structure.mdx +0 -925
  453. package/site/content/docs/get-started/testing.mdx +0 -328
  454. package/site/content/docs/get-started/why.mdx +0 -162
  455. package/site/content/docs/recipes/llama-cpp.mdx +0 -151
  456. package/site/content/docs/recipes/ollama.mdx +0 -142
  457. package/site/content/docs/recipes/sglang.mdx +0 -105
  458. package/site/content/docs/recipes/vllm.mdx +0 -106
  459. package/site/content/docs/reference/cli.md +0 -232
  460. package/site/content/docs/reference/client.mdx +0 -469
  461. package/site/content/docs/reference/security.md +0 -74
  462. package/src/cli/ai-setup/detect-ollama.ts +0 -213
  463. package/src/cli/ai-setup/recommend.test.ts +0 -225
  464. package/src/cli/ai-setup/recommend.ts +0 -225
  465. package/src/cli/dev-controls.test.ts +0 -122
  466. package/src/cli/dev-controls.ts +0 -164
  467. package/src/cli/tui/DevLive.tsx +0 -126
  468. package/src/console/ui-next/dist/assets/access-page-De7Lc2JC.js +0 -4
  469. package/src/console/ui-next/dist/assets/agent-disclosure-BP0Y0Sux.js +0 -1
  470. package/src/console/ui-next/dist/assets/cache-glyph-B5X-NM0-.js +0 -1
  471. package/src/console/ui-next/dist/assets/call-pii-button-ChAUiLo9.js +0 -1
  472. package/src/console/ui-next/dist/assets/collapsible-DGnOM2ph.js +0 -1
  473. package/src/console/ui-next/dist/assets/copy-inline-button-DBHhgHKP.js +0 -1
  474. package/src/console/ui-next/dist/assets/dagre.esm-ZwcdTuZZ.js +0 -1
  475. package/src/console/ui-next/dist/assets/detail-header-DhHM1iaZ.js +0 -1
  476. package/src/console/ui-next/dist/assets/dropdown-menu-_NjTEo5_.js +0 -1
  477. package/src/console/ui-next/dist/assets/duration-tone-sC3lGABz.js +0 -9
  478. package/src/console/ui-next/dist/assets/element-icons-BVXtRyd3.js +0 -1
  479. package/src/console/ui-next/dist/assets/explorer-empty-2uIhBu0_.js +0 -1
  480. package/src/console/ui-next/dist/assets/flows-page-RGy7VEA_.js +0 -1
  481. package/src/console/ui-next/dist/assets/highlighted-json-Awq7gYdu.js +0 -154
  482. package/src/console/ui-next/dist/assets/http-method-_UHM2ODJ.js +0 -1
  483. package/src/console/ui-next/dist/assets/index-Ck88Jmv8.css +0 -2
  484. package/src/console/ui-next/dist/assets/index-_rgpdVzo.js +0 -66
  485. package/src/console/ui-next/dist/assets/link-BX6Vqztd.js +0 -1
  486. package/src/console/ui-next/dist/assets/observability-page-Ds6pcnh-.js +0 -4
  487. package/src/console/ui-next/dist/assets/preload-helper-oH4irX4C.js +0 -1
  488. package/src/console/ui-next/dist/assets/react-D8E3mtu1.js +0 -1
  489. package/src/console/ui-next/dist/assets/react-dom-Bph1y7z7.js +0 -9
  490. package/src/console/ui-next/dist/assets/replica-lag-DKRrbvdo.js +0 -18
  491. package/src/console/ui-next/dist/assets/request-meta-DV0ywz7t.js +0 -1
  492. package/src/console/ui-next/dist/assets/shortcut-JQIZlWfm.js +0 -1
  493. package/src/console/ui-next/dist/assets/shortcut-keys-DKxNTe_m.js +0 -1
  494. package/src/console/ui-next/dist/assets/skeleton-D-czQJT6.js +0 -1
  495. package/src/console/ui-next/dist/assets/store-page-02xOiqIK.js +0 -41
  496. package/src/console/ui-next/dist/assets/trace-detail-sheet-B09O8rA6.js +0 -2
  497. package/src/console/ui-next/dist/assets/tree-expand-toggle-BtyhmWb4.js +0 -55
  498. package/src/console/ui-next/dist/assets/units-page-4rHOePuE.js +0 -1
  499. package/src/console/ui-next/dist/assets/useMutation-B8EO02Ej.js +0 -1
  500. package/src/console/ui-next/dist/assets/useRender-BE2A9BWC.js +0 -1
  501. package/src/console/ui-next/dist/assets/vault-page-DISPgxLM.js +0 -2
  502. package/src/console/ui-next/dist/assets/xyflow-D7n4g6go.js +0 -7
  503. package/src/console/ui-next/dist/assets/xyflow-DZ0Ws1xk.css +0 -1
  504. package/src/docker/ollama-pull.ts +0 -232
  505. package/src/docker/recipes/llama-cpp.ts +0 -298
  506. package/src/docker/recipes/ollama.ts +0 -44
  507. package/src/docker/recipes/sglang.ts +0 -55
  508. package/src/docker/recipes/vllm.ts +0 -44
  509. package/src/drivers/ai-ollama-tools.integration.test.ts +0 -109
  510. package/src/drivers/ai-ollama.integration.test.ts +0 -184
  511. package/src/drivers/ai-ollama.ts +0 -389
  512. package/src/drivers/ollama.ts +0 -14
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Live HTTP exposure uniqueness (OKE1013) and GET-only synthesis.
2
+ * Live HTTP exposure uniqueness (OKE1050) and GET-only synthesis.
3
3
  */
4
4
 
5
5
  import { describe, expect, test, beforeEach } from "bun:test";
@@ -17,8 +17,7 @@ const admin = gate.policy("admin", ({ auth }) => !!auth.verified);
17
17
  const partner = gate.policy("partner", ({ auth }) => !!auth.verified);
18
18
 
19
19
  const orderStatus = () =>
20
- signal("order-status", {
21
- delivery: "live",
20
+ signal.live("order-status", {
22
21
  optional: true,
23
22
  schema: z.object({
24
23
  orderId: z.string(),
@@ -51,22 +50,22 @@ describe("live HTTP uniqueness", () => {
51
50
  expect(() => oke({ name: "t", autoBoot: false })).not.toThrow();
52
51
  });
53
52
 
54
- test("two member firehoses on different paths fail OKE1013", () => {
53
+ test("two member firehoses on different paths fail OKE1050", () => {
55
54
  const sig = orderStatus();
56
55
  const a = on(http.get("/feed-a").gate(member).live(sig));
57
56
  const b = on(http.get("/feed-b").gate(member).live(sig));
58
57
  stampFlowName(a, "orders.feedA");
59
58
  stampFlowName(b, "orders.feedB");
60
- expect(() => oke({ name: "t", autoBoot: false })).toThrow(/OKE1013/);
59
+ expect(() => oke({ name: "t", autoBoot: false })).toThrow(/OKE1050/);
61
60
  });
62
61
 
63
- test("duplicate GET path still OKE1011", () => {
62
+ test("duplicate GET path still OKE1041", () => {
64
63
  const sig = orderStatus();
65
64
  const a = on(http.get("/orders/:orderId/events").gate(member).live(sig));
66
65
  const b = on(http.get("/orders/:orderId/events").gate(admin).live(sig));
67
66
  stampFlowName(a, "orders.events");
68
67
  stampFlowName(b, "admin.events");
69
- expect(() => oke({ name: "t", autoBoot: false })).toThrow(/OKE1011/);
68
+ expect(() => oke({ name: "t", autoBoot: false })).toThrow(/OKE1041/);
70
69
  });
71
70
 
72
71
  test("POST .live(signal) is rejected", () => {
@@ -4,6 +4,7 @@
4
4
 
5
5
  import type { SignalDecl } from "../elements/signal/declare.ts";
6
6
  import type { SignalResourceRef } from "../manifest/types.ts";
7
+ import { applyBoundaryContract, stampBoundaryContract } from "./boundary-contract.ts";
7
8
  import type { Fx } from "./fx.ts";
8
9
  import { flow, type AnyFlowDef } from "./flow.ts";
9
10
  import type { GateRef, SignalSource } from "./triggers.ts";
@@ -103,12 +104,15 @@ export function synthesizeLiveFlow(signal: SignalSource, path: string): AnyFlowD
103
104
  const fields = httpPathParams(path);
104
105
  const name = signal.name;
105
106
  const schema = "schema" in signal ? (signal as SignalDecl).schema : undefined;
106
- return flow({
107
+ const def = flow({
107
108
  effects: { reads: [`signal:${name}` as SignalResourceRef] },
108
- ...(schema !== undefined ? { out: schema } : {}),
109
109
  do: (input, fx: Fx) =>
110
110
  fx.live(signal, {
111
111
  match: (payload) => payloadAutoMatch(payload, input, fields),
112
112
  }),
113
113
  });
114
+ if (schema !== undefined) {
115
+ applyBoundaryContract(def, stampBoundaryContract({ out: schema as never }));
116
+ }
117
+ return def;
114
118
  }
@@ -24,7 +24,7 @@ describe("live Last-Event-ID resume", () => {
24
24
  });
25
25
 
26
26
  test("skips through Last-Event-ID and 410s a pruned cursor", async () => {
27
- const orderStatus = signal("order-status", { delivery: "live", optional: true });
27
+ const orderStatus = signal.live("order-status", { optional: true });
28
28
  const feed = on(http.get("/feed").public().live(orderStatus));
29
29
  stampFlowName(feed, "orders.feed");
30
30
  on(
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * MCP tool trigger — name validation, gated registration lookup,
3
- * duplicate-name boot failure (OKE1018), gate posture, and Manifest stamping.
3
+ * duplicate-name boot failure (OKE1060), gate posture, and Manifest stamping.
4
4
  */
5
5
 
6
6
  import { describe, expect, test, beforeEach } from "bun:test";
@@ -47,7 +47,7 @@ describe("mcp.tool(name)", () => {
47
47
  expect(app.resolveMcpTool("other.action")).toBeUndefined();
48
48
  });
49
49
 
50
- test("duplicate tool name fails OKE1018 at construction", () => {
50
+ test("duplicate tool name fails OKE1060 at construction", () => {
51
51
  on(
52
52
  mcp.tool("bookings.create").gate(member),
53
53
  flow("bookings.create", { plane: "user", do: () => ({ ok: true }) }),
@@ -56,7 +56,7 @@ describe("mcp.tool(name)", () => {
56
56
  mcp.tool("bookings.create").gate(member),
57
57
  flow("bookings.also", { plane: "user", do: () => ({ ok: true }) }),
58
58
  );
59
- expect(() => oke({ name: "t", autoBoot: false })).toThrow(/OKE1018/);
59
+ expect(() => oke({ name: "t", autoBoot: false })).toThrow(/OKE1060/);
60
60
  });
61
61
 
62
62
  test("ungated mcp.tool passes on() but fails gate posture at boot", async () => {
package/src/kernel/on.ts CHANGED
@@ -6,6 +6,8 @@
6
6
  * The return type carries the bound trigger so `typeof app` can derive REST.
7
7
  */
8
8
 
9
+ import type { ClockDecl } from "../elements/clock/declare.ts";
10
+ import type { InferBoundaryIn, InferBoundaryOut } from "./boundary-contract.ts";
9
11
  import { isFlow, type AnyFlowDef, type FlowDef, type FlowErrorMap } from "./flow.ts";
10
12
  import { lazyRequire } from "./lazy-require.ts";
11
13
  import {
@@ -15,8 +17,10 @@ import {
15
17
  type HttpMethod,
16
18
  type HttpTrigger,
17
19
  type LiveHttpTrigger,
20
+ type McpToolTrigger,
18
21
  type ResourceFlowBag,
19
22
  type ResourceMount,
23
+ type SignalAsTrigger,
20
24
  type SignalSource,
21
25
  type Trigger,
22
26
  } from "./triggers.ts";
@@ -38,15 +42,65 @@ export interface Binding {
38
42
 
39
43
  const bindings: Binding[] = [];
40
44
 
45
+ /**
46
+ * Invoke-contract bag on an HTTP / MCP exposure (type parameter), if any.
47
+ *
48
+ * @typeParam T - Bound trigger
49
+ */
50
+ type ExposureContractOf<T> =
51
+ BoundTriggerOf<T> extends HttpTrigger<HttpMethod, string, infer C>
52
+ ? C
53
+ : BoundTriggerOf<T> extends McpToolTrigger<infer C>
54
+ ? C
55
+ : undefined;
56
+
57
+ /**
58
+ * Input type for `on(trigger, flow)` — exposure `in` wins over the handler.
59
+ *
60
+ * @typeParam T - Trigger argument
61
+ * @typeParam Fallback - FlowDef input from `flow()`
62
+ */
63
+ type InferOnIn<T, Fallback> =
64
+ ExposureContractOf<T> extends { readonly in: unknown }
65
+ ? InferBoundaryIn<ExposureContractOf<T>>
66
+ : Fallback;
67
+
68
+ /**
69
+ * Output type for `on(trigger, flow)` — exposure `out` wins over the handler.
70
+ *
71
+ * @typeParam T - Trigger argument
72
+ * @typeParam Fallback - FlowDef output from `flow()`
73
+ */
74
+ type InferOnOut<T, Fallback> =
75
+ ExposureContractOf<T> extends { readonly out: unknown }
76
+ ? InferBoundaryOut<ExposureContractOf<T>>
77
+ : Fallback;
78
+
79
+ /**
80
+ * Error map for `on(trigger, flow)` — exposure `errors` wins over Flow defaults.
81
+ *
82
+ * @typeParam T - Trigger argument
83
+ * @typeParam Fallback - FlowDef error map from `flow()`
84
+ */
85
+ type InferOnErrors<T, Fallback extends FlowErrorMap> =
86
+ ExposureContractOf<T> extends {
87
+ readonly errors: infer E extends FlowErrorMap;
88
+ }
89
+ ? E
90
+ : Fallback;
91
+
41
92
  /**
42
93
  * Bind a trigger to a Flow. Returns the same Flow (one species) with the
43
94
  * trigger stamped into the type parameter for client route derivation.
95
+ * When the trigger carries an invoke contract (`http.*` / `mcp.tool` bag),
96
+ * `in` / `out` / `errors` are projected onto the returned {@link FlowDef}
97
+ * (same as {@link import("./call.ts").call}).
44
98
  *
45
- * @param trigger - HTTP, every, signal handle, CDC, or internal
99
+ * @param trigger - HTTP, named clock, signal handle, CDC, or internal
46
100
  * @param flowDef - Flow definition
47
101
  */
48
102
  export function on<
49
- T extends Trigger | SignalSource,
103
+ T extends Trigger | SignalSource | ClockDecl,
50
104
  I = unknown,
51
105
  O = unknown,
52
106
  E extends FlowErrorMap = FlowErrorMap,
@@ -54,7 +108,7 @@ export function on<
54
108
  >(
55
109
  trigger: T,
56
110
  flowDef: FlowDef<I, O, E, D, Trigger | undefined>,
57
- ): FlowDef<I, O, E, D, BoundTriggerOf<T>>;
111
+ ): FlowDef<InferOnIn<T, I>, InferOnOut<T, O>, InferOnErrors<T, E>, D, BoundTriggerOf<T>>;
58
112
  /**
59
113
  * Expose a live signal: `on(http.get(path).gate(g).live(signal))`.
60
114
  * Synthesizes the stream Flow (name stamped by `.adopt`).
@@ -73,7 +127,7 @@ export function on<T extends LiveHttpTrigger<HttpMethod, string>>(
73
127
  */
74
128
  export function on(mount: ResourceMount): ResourceFlowBag;
75
129
  export function on(
76
- triggerOrMount: Trigger | SignalSource | ResourceMount,
130
+ triggerOrMount: Trigger | SignalSource | ClockDecl | ResourceMount,
77
131
  flowDef?: FlowDef<any, any, any, any, Trigger | undefined>,
78
132
  ): unknown {
79
133
  if (isResourceMount(triggerOrMount)) {
@@ -149,10 +203,50 @@ export function on(
149
203
  list.push(normalized);
150
204
  // Stamp runtime carrier for the first bound trigger (type follows BoundTriggerOf).
151
205
  (flowDef as { $trigger: Trigger }).$trigger = normalized;
206
+ stampExposureContract(flowDef as AnyFlowDef, normalized, triggerOrMount);
152
207
  bindings.push({ trigger: normalized, flow: flowDef as AnyFlowDef });
153
208
  return flowDef;
154
209
  }
155
210
 
211
+ /**
212
+ * Project invoke / emit contract from the exposure onto the FlowDef for
213
+ * Manifest, validation, and typed client (flat `flows.*.in/out/errors`).
214
+ *
215
+ * Inlined so the edge profile does not pull `boundary-contract` helpers
216
+ * (`call()` / live-http / store.resource still import those from their graphs).
217
+ */
218
+ function stampExposureContract(
219
+ flowDef: AnyFlowDef,
220
+ normalized: Trigger,
221
+ raw: Trigger | SignalSource | ClockDecl,
222
+ ): void {
223
+ if (normalized.kind === "http" || normalized.kind === "mcp") {
224
+ const bag = (normalized as HttpTrigger | McpToolTrigger).contract;
225
+ if (bag === undefined) return;
226
+ flowDef.in = bag.in as AnyFlowDef["in"];
227
+ flowDef.out = bag.out as AnyFlowDef["out"];
228
+ flowDef.errors = bag.errors as AnyFlowDef["errors"];
229
+ if (bag.breaking) flowDef.breaking = true;
230
+ return;
231
+ }
232
+ if (normalized.kind !== "signal") return;
233
+ const handle =
234
+ (normalized as SignalAsTrigger).signal ?? (isSignalSourceWithSchema(raw) ? raw : undefined);
235
+ const schema =
236
+ handle && typeof handle === "object" && "schema" in handle
237
+ ? (handle as { schema?: unknown }).schema
238
+ : undefined;
239
+ if (schema !== undefined && flowDef.in === undefined) {
240
+ flowDef.in = schema as AnyFlowDef["in"];
241
+ flowDef.out = undefined;
242
+ flowDef.errors = undefined;
243
+ }
244
+ }
245
+
246
+ function isSignalSourceWithSchema(value: unknown): value is SignalSource & { schema?: unknown } {
247
+ return typeof value === "object" && value !== null && "name" in value;
248
+ }
249
+
156
250
  /**
157
251
  * Snapshot of all bindings registered since the last reset.
158
252
  */
@@ -79,10 +79,13 @@ describe("pipeline — Unauthorized for anonymous", () => {
79
79
  resetFlowSeq();
80
80
 
81
81
  on(
82
- http.post("/orders").gate(member),
82
+ http
83
+ .post("/orders", {
84
+ in: z.object({ sku: z.string() }),
85
+ out: z.object({ id: z.string() }),
86
+ })
87
+ .gate(member),
83
88
  flow("orders.create", {
84
- in: z.object({ sku: z.string() }),
85
- out: z.object({ id: z.string() }),
86
89
  do: (_input, fx) => ({ id: fx.id() }),
87
90
  }),
88
91
  );
@@ -117,9 +120,8 @@ describe("pipeline — Unauthorized for anonymous", () => {
117
120
  resetFlowSeq();
118
121
 
119
122
  on(
120
- http.post("/orders").gate(member, canOrder),
123
+ http.post("/orders", { in: z.object({ sku: z.string() }) }).gate(member, canOrder),
121
124
  flow("orders.create2", {
122
- in: z.object({ sku: z.string() }),
123
125
  do: () => ({ ok: true }),
124
126
  }),
125
127
  );
@@ -154,9 +156,8 @@ describe("pipeline — Unauthorized for anonymous", () => {
154
156
 
155
157
  const write = gate.all(member, canOrder);
156
158
  on(
157
- http.post("/orders").gate(write),
159
+ http.post("/orders", { in: z.object({ sku: z.string() }) }).gate(write),
158
160
  flow("orders.createAll", {
159
- in: z.object({ sku: z.string() }),
160
161
  do: () => ({ ok: true }),
161
162
  }),
162
163
  );
@@ -201,9 +202,8 @@ describe("pipeline — evaluated gates on the run", () => {
201
202
  resetFlowSeq();
202
203
 
203
204
  on(
204
- http.post("/orders").gate(member, canOrder),
205
+ http.post("/orders", { in: z.object({ sku: z.string() }) }).gate(member, canOrder),
205
206
  flow("orders.create3", {
206
- in: z.object({ sku: z.string() }),
207
207
  do: () => ({ ok: true }),
208
208
  }),
209
209
  );
@@ -361,9 +361,8 @@ describe("pipeline — Bearer cryptographic verification", () => {
361
361
  resetFlowSeq();
362
362
 
363
363
  on(
364
- http.post("/orders").gate(member),
364
+ http.post("/orders", { in: z.object({ sku: z.string() }) }).gate(member),
365
365
  flow("orders.inject", {
366
- in: z.object({ sku: z.string() }),
367
366
  do: () => ({ ok: true }),
368
367
  }),
369
368
  );
@@ -413,9 +412,8 @@ describe("pipeline — Bearer cryptographic verification", () => {
413
412
  resetFlowSeq();
414
413
 
415
414
  on(
416
- http.post("/orders").gate(member),
415
+ http.post("/orders", { in: z.object({ sku: z.string() }) }).gate(member),
417
416
  flow("orders.trusted", {
418
- in: z.object({ sku: z.string() }),
419
417
  do: (_input, fx) => ({ userId: fx.auth.userId }),
420
418
  }),
421
419
  );
@@ -467,9 +465,8 @@ describe("pipeline — Bearer cryptographic verification", () => {
467
465
  resetFlowSeq();
468
466
 
469
467
  on(
470
- http.post("/orders").gate(member),
468
+ http.post("/orders", { in: z.object({ sku: z.string() }) }).gate(member),
471
469
  flow("orders.bypass", {
472
- in: z.object({ sku: z.string() }),
473
470
  do: (_input, fx) => ({ userId: fx.auth.userId }),
474
471
  }),
475
472
  );
@@ -21,7 +21,7 @@ describe("plugin element contributions", () => {
21
21
  dev: "test-otp-signing-key",
22
22
  });
23
23
  const expire = clock("expire-otp", { every: "1m" });
24
- const bus = signal("otp.events", { delivery: "once" });
24
+ const bus = signal.once("otp.events");
25
25
  const member = gate.policy("plugin-member", ({ auth }) => !!auth.verified);
26
26
 
27
27
  const twoFactor = plugin("twoFactor-scaffold", { version: "0.0.1" })
@@ -54,18 +54,18 @@ describe("stampFlowName", () => {
54
54
  describe("oke — unresolved sentinel and duplicate routes", () => {
55
55
  test("unresolved http.get() fails construction", () => {
56
56
  on(http.get().public(), flow("notes.get", { do: () => 1 }));
57
- expect(() => oke({ name: "t", autoBoot: false })).toThrow(/OKE1010/);
57
+ expect(() => oke({ name: "t", autoBoot: false })).toThrow(/OKE1040/);
58
58
  });
59
59
 
60
60
  test("duplicate GET /notes fails construction", () => {
61
61
  on(http.get("/notes").public(), flow("notes.list", { do: () => 1 }));
62
62
  on(http.get("/notes").public(), flow("notes.also", { do: () => 1 }));
63
- expect(() => oke({ name: "t", autoBoot: false })).toThrow(/OKE1011/);
63
+ expect(() => oke({ name: "t", autoBoot: false })).toThrow(/OKE1041/);
64
64
  });
65
65
 
66
66
  test("nameless HTTP flow fails construction", () => {
67
67
  on(http.get("/notes").public(), flow({ do: () => 1 }));
68
- expect(() => oke({ name: "t", autoBoot: false })).toThrow(/OKE1012/);
68
+ expect(() => oke({ name: "t", autoBoot: false })).toThrow(/OKE1045/);
69
69
  });
70
70
 
71
71
  test("registerFlowUnits drains into $routes; registry ignore does not", () => {