okengine 0.18.5 → 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 (510) 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/llms-txt.mdx +1 -1
  5. package/site/content/docs/ai/meta.json +1 -1
  6. package/site/content/docs/ai/skills.mdx +4 -1
  7. package/site/content/docs/ai/try-it.mdx +58 -0
  8. package/site/content/docs/client/auth.mdx +208 -0
  9. package/site/content/docs/client/calling.mdx +451 -0
  10. package/site/content/docs/client/index.mdx +209 -0
  11. package/site/content/docs/client/live.mdx +234 -0
  12. package/site/content/docs/client/meta.json +5 -0
  13. package/site/content/docs/client/react.mdx +249 -0
  14. package/site/content/docs/elements/ai/agents.mdx +232 -0
  15. package/site/content/docs/elements/ai/index.mdx +341 -0
  16. package/site/content/docs/elements/ai/mcp.mdx +275 -0
  17. package/site/content/docs/elements/ai/meta.json +5 -0
  18. package/site/content/docs/elements/ai/models.mdx +283 -0
  19. package/site/content/docs/elements/ai/prompts.mdx +256 -0
  20. package/site/content/docs/elements/channel/email.mdx +266 -0
  21. package/site/content/docs/elements/channel/index.mdx +344 -0
  22. package/site/content/docs/elements/channel/meta.json +5 -0
  23. package/site/content/docs/elements/channel/push.mdx +218 -0
  24. package/site/content/docs/elements/channel/receipts.mdx +206 -0
  25. package/site/content/docs/elements/channel/sms.mdx +264 -0
  26. package/site/content/docs/elements/channel/whatsapp.mdx +220 -0
  27. package/site/content/docs/elements/clock/index.mdx +300 -0
  28. package/site/content/docs/elements/clock/meta.json +5 -0
  29. package/site/content/docs/elements/clock/schedules.mdx +508 -0
  30. package/site/content/docs/elements/clock/sleep.mdx +445 -0
  31. package/site/content/docs/elements/flow/consumers.mdx +707 -0
  32. package/site/content/docs/elements/flow/http.mdx +1080 -0
  33. package/site/content/docs/elements/flow/index.mdx +618 -0
  34. package/site/content/docs/elements/flow/meta.json +5 -0
  35. package/site/content/docs/elements/flow/routing.mdx +559 -0
  36. package/site/content/docs/elements/flow/workflows.mdx +640 -0
  37. package/site/content/docs/elements/gate/auth.mdx +371 -0
  38. package/site/content/docs/elements/gate/authorization.mdx +298 -0
  39. package/site/content/docs/elements/gate/index.mdx +418 -0
  40. package/site/content/docs/elements/gate/meta.json +5 -0
  41. package/site/content/docs/elements/gate/rate-limits.mdx +365 -0
  42. package/site/content/docs/elements/gate/rls.mdx +303 -0
  43. package/site/content/docs/elements/gate/tenancy.mdx +372 -0
  44. package/site/content/docs/elements/index.mdx +20 -10
  45. package/site/content/docs/elements/signal/broadcast.mdx +517 -0
  46. package/site/content/docs/elements/signal/index.mdx +352 -0
  47. package/site/content/docs/elements/signal/live.mdx +590 -0
  48. package/site/content/docs/elements/signal/meta.json +5 -0
  49. package/site/content/docs/elements/signal/once.mdx +596 -0
  50. package/site/content/docs/elements/store/files.mdx +659 -0
  51. package/site/content/docs/elements/store/index.mdx +310 -0
  52. package/site/content/docs/elements/store/kv.mdx +629 -0
  53. package/site/content/docs/elements/store/meta.json +5 -0
  54. package/site/content/docs/elements/store/search.mdx +946 -0
  55. package/site/content/docs/elements/store/sql.mdx +937 -0
  56. package/site/content/docs/elements/vault/config.mdx +256 -0
  57. package/site/content/docs/elements/vault/index.mdx +356 -0
  58. package/site/content/docs/elements/vault/meta.json +5 -0
  59. package/site/content/docs/elements/vault/rotation.mdx +273 -0
  60. package/site/content/docs/elements/vault/secrets.mdx +285 -0
  61. package/site/content/docs/index.mdx +63 -36
  62. package/site/content/docs/meta.json +8 -7
  63. package/site/content/docs/plugins/cors.mdx +2 -1
  64. package/site/content/docs/plugins/csrf.mdx +4 -1
  65. package/site/content/docs/plugins/headers.mdx +2 -1
  66. package/site/content/docs/plugins/ip-allowlist.mdx +2 -1
  67. package/site/content/docs/plugins/magic-link.mdx +6 -0
  68. package/site/content/docs/plugins/maintenance-mode.mdx +2 -1
  69. package/site/content/docs/plugins/oauth.mdx +1 -1
  70. package/site/content/docs/plugins/otp.mdx +12 -1
  71. package/site/content/docs/plugins/passkey.mdx +39 -15
  72. package/site/content/docs/plugins/two-factor.mdx +91 -34
  73. package/site/content/docs/plugins/username.mdx +1 -1
  74. package/site/content/docs/recipes/caddy.mdx +3 -3
  75. package/site/content/docs/recipes/index.mdx +18 -28
  76. package/site/content/docs/recipes/mailpit.mdx +1 -1
  77. package/site/content/docs/recipes/meilisearch.mdx +3 -3
  78. package/site/content/docs/recipes/meta.json +1 -4
  79. package/site/content/docs/recipes/nginx.mdx +2 -2
  80. package/site/content/docs/recipes/openrouter.mdx +283 -0
  81. package/site/content/docs/recipes/pgdog.mdx +3 -3
  82. package/site/content/docs/recipes/postgres.mdx +1 -2
  83. package/site/content/docs/recipes/rustfs.mdx +2 -2
  84. package/site/content/docs/recipes/traefik.mdx +3 -3
  85. package/site/content/docs/reference/cli.mdx +231 -0
  86. package/site/content/docs/reference/configuration.mdx +30 -10
  87. package/site/content/docs/reference/environment-variables.mdx +93 -20
  88. package/site/content/docs/reference/errors.mdx +132 -29
  89. package/site/content/docs/reference/fx.mdx +137 -73
  90. package/site/content/docs/reference/index.mdx +13 -21
  91. package/site/content/docs/reference/meta.json +4 -5
  92. package/site/content/docs/reference/okid.mdx +42 -17
  93. package/site/content/docs/reference/plugins.mdx +4 -3
  94. package/site/content/docs/reference/security.mdx +197 -0
  95. package/site/content/docs/understand/meta.json +5 -0
  96. package/site/content/docs/understand/the-anatomy.mdx +132 -0
  97. package/site/content/docs/understand/the-model.mdx +32 -0
  98. package/site/content/docs/understand/the-problem.mdx +74 -0
  99. package/site/content/docs/understand/the-vocabulary.mdx +26 -0
  100. package/src/auth/api-keys.ts +2 -1
  101. package/src/auth/bindings.ts +64 -16
  102. package/src/auth/gate-auth.test.ts +6 -1
  103. package/src/auth/identity.ts +152 -5
  104. package/src/auth/index.ts +29 -0
  105. package/src/auth/invites.ts +2 -1
  106. package/src/auth/method-context.ts +41 -0
  107. package/src/auth/oauth-as/crypto.ts +2 -1
  108. package/src/auth/oauth-as/stores.ts +2 -1
  109. package/src/auth/operator.ts +2 -1
  110. package/src/auth/sessions-jwt.test.ts +77 -0
  111. package/src/auth/sessions.ts +20 -4
  112. package/src/auth/tenants.ts +3 -2
  113. package/src/auth/two-factor-challenge.test.ts +61 -0
  114. package/src/auth/two-factor-challenge.ts +284 -0
  115. package/src/auth/verification.ts +5 -0
  116. package/src/bench/REPORT.md +49 -0
  117. package/src/bench/g03-signal-once.bench.ts +1 -1
  118. package/src/bench/g10-observability-contention.bench.ts +1 -1
  119. package/src/bench/g17-hybrid-search.bench.ts +572 -0
  120. package/src/bench/load-app.ts +2 -10
  121. package/src/cli/ai-setup/ai-setup.test.ts +331 -42
  122. package/src/cli/ai-setup/apply.ts +294 -52
  123. package/src/cli/ai-setup/catalog.ts +238 -1342
  124. package/src/cli/ai-setup/index.ts +14 -99
  125. package/src/cli/ai-setup/prompts.ts +60 -443
  126. package/src/cli/ask-seed.test.ts +96 -0
  127. package/src/cli/ask-seed.ts +82 -0
  128. package/src/cli/ask-vault-gaps.test.ts +84 -0
  129. package/src/cli/ask-vault-gaps.ts +146 -0
  130. package/src/cli/build.ts +2 -2
  131. package/src/cli/client-add.test.ts +26 -1
  132. package/src/cli/client-add.ts +106 -27
  133. package/src/cli/db-seed.ts +2 -0
  134. package/src/cli/db.ts +150 -11
  135. package/src/cli/dev.ts +119 -211
  136. package/src/cli/docker-clean.ts +2 -2
  137. package/src/cli/docker-cli.test.ts +1 -1
  138. package/src/cli/doctor-diff.ts +4 -2
  139. package/src/cli/doctor-pii.test.ts +1 -1
  140. package/src/cli/doctor.ts +14 -1
  141. package/src/cli/hero-meta.test.ts +4 -2
  142. package/src/cli/load-config.images.test.ts +8 -10
  143. package/src/cli/load-config.ts +1 -1
  144. package/src/cli/registry.ts +22 -10
  145. package/src/cli/replay.ts +3 -1
  146. package/src/cli/start.ts +1 -1
  147. package/src/cli/tui/keys.ts +2 -3
  148. package/src/client/auth/cookies.ts +74 -0
  149. package/src/client/auth/create-auth-client.ts +636 -0
  150. package/src/client/auth/denials.ts +99 -0
  151. package/src/client/auth/session.ts +283 -0
  152. package/src/client/auth.test.ts +251 -0
  153. package/src/client/auth.ts +39 -114
  154. package/src/client/create-with-session.ts +245 -0
  155. package/src/client/create.ts +51 -5
  156. package/src/client/index.ts +11 -1
  157. package/src/client/live.ts +11 -79
  158. package/src/client/notes-contract.test.ts +5 -10
  159. package/src/client/sse.ts +137 -0
  160. package/src/client/stream.ts +147 -0
  161. package/src/client/transport.test.ts +32 -0
  162. package/src/client/transport.ts +123 -26
  163. package/src/client/types.ts +118 -14
  164. package/src/client-react/index.ts +185 -24
  165. package/src/client-react/use-live-query.ts +13 -3
  166. package/src/compiler/aot.test.ts +7 -4
  167. package/src/compiler/effects-embed.test.ts +56 -0
  168. package/src/compiler/effects-fetch.test.ts +43 -0
  169. package/src/compiler/effects-infer.ts +58 -2
  170. package/src/compiler/extract.test.ts +257 -43
  171. package/src/compiler/extract.ts +566 -48
  172. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -4
  173. package/src/compiler/fixtures/skyport/src/flows/bookings/signals.ts +2 -8
  174. package/src/compiler/fixtures/skyport.expected.json +4 -4
  175. package/src/compiler/fixtures/triggers/five-triggers.ts +14 -10
  176. package/src/compiler/response.ts +2 -2
  177. package/src/compiler/search-writer-isolation.test.ts +40 -0
  178. package/src/config/index.ts +11 -0
  179. package/src/console/server/app.ts +17 -23
  180. package/src/console/server/bind.ts +4 -0
  181. package/src/console/server/console.test.ts +2 -2
  182. package/src/console/server/flows-invoke.test.ts +50 -34
  183. package/src/console/server/flows.ts +436 -255
  184. package/src/console/server/runs-ingest.test.ts +6 -3
  185. package/src/console/server/serve.ts +1 -1
  186. package/src/console/server/signals.test.ts +1 -5
  187. package/src/console/server/signals.ts +8 -6
  188. package/src/console/server/state.ts +6 -1
  189. package/src/console/server/store.ts +1 -1
  190. package/src/console/ui-next/dist/assets/FileExportIcon-Ck-5od4R.js +1 -0
  191. package/src/console/ui-next/dist/assets/MoreHorizontalCircle01Icon-gMNGsE37.js +1 -0
  192. package/src/console/ui-next/dist/assets/PlusSignIcon-CwG3nxfu.js +1 -0
  193. package/src/console/ui-next/dist/assets/UnavailableIcon-D9cvHVPr.js +1 -0
  194. package/src/console/ui-next/dist/assets/UserIcon-DaE2PB5_.js +1 -0
  195. package/src/console/ui-next/dist/assets/access-page-DFeymU07.js +4 -0
  196. package/src/console/ui-next/dist/assets/agent-disclosure-U1rdfblp.js +1 -0
  197. package/src/console/ui-next/dist/assets/cache-glyph-BeFJeqBG.js +1 -0
  198. package/src/console/ui-next/dist/assets/call-pii-button-CVAONPii.js +1 -0
  199. package/src/console/ui-next/dist/assets/collapsible-D2A6NJ-3.js +1 -0
  200. package/src/console/ui-next/dist/assets/copy-inline-button-CAYD18cr.js +1 -0
  201. package/src/console/ui-next/dist/assets/dagre.esm-B1_XeuLP.js +1 -0
  202. package/src/console/ui-next/dist/assets/detail-header-DVWNjWjg.js +1 -0
  203. package/src/console/ui-next/dist/assets/dropdown-menu-4h2LOVXM.js +1 -0
  204. package/src/console/ui-next/dist/assets/duration-tone-Cgk_h5ja.js +9 -0
  205. package/src/console/ui-next/dist/assets/element-icons-BI8cJgdh.js +1 -0
  206. package/src/console/ui-next/dist/assets/explorer-empty-CJs5A-wm.js +1 -0
  207. package/src/console/ui-next/dist/assets/flows-page-Dss7941e.js +1 -0
  208. package/src/console/ui-next/dist/assets/highlighted-json-MYZQtRnw.js +154 -0
  209. package/src/console/ui-next/dist/assets/http-method-Jrh39p7A.js +1 -0
  210. package/src/console/ui-next/dist/assets/index-D0zS5rKO.css +2 -0
  211. package/src/console/ui-next/dist/assets/index-DXP2dBIF.js +63 -0
  212. package/src/console/ui-next/dist/assets/observability-page-HvolXxTI.js +4 -0
  213. package/src/console/ui-next/dist/assets/react-dom-Ddte4I-Q.js +9 -0
  214. package/src/console/ui-next/dist/assets/replica-lag-CSh2dzrb.js +18 -0
  215. package/src/console/ui-next/dist/assets/request-meta-BatF8KrK.js +1 -0
  216. package/src/console/ui-next/dist/assets/shortcut-keys-3ILd8oGn.js +1 -0
  217. package/src/console/ui-next/dist/assets/{sql-BskegiFM.js → sql-BsFa4tDR.js} +1 -1
  218. package/src/console/ui-next/dist/assets/store-page-eiKiHnNe.js +41 -0
  219. package/src/console/ui-next/dist/assets/trace-detail-sheet-CZkMeKS-.js +2 -0
  220. package/src/console/ui-next/dist/assets/tree-expand-toggle-CW8y5A2h.js +55 -0
  221. package/src/console/ui-next/dist/assets/units-page-B_RWJrEO.js +1 -0
  222. package/src/console/ui-next/dist/assets/{use-vault-list-uk4WVboC.js → use-vault-list-CT4-gajj.js} +1 -1
  223. package/src/console/ui-next/dist/assets/vault-page-CWrg-A68.js +2 -0
  224. package/src/console/ui-next/dist/assets/xyflow-CSyC6ryz.css +1 -0
  225. package/src/console/ui-next/dist/assets/xyflow-yApv7D4e.js +7 -0
  226. package/src/console/ui-next/dist/index.html +6 -13
  227. package/src/console/ui-next/seed-invoke-host.ts +21 -18
  228. package/src/console/ui-next/src/client.ts +7 -2
  229. package/src/console/ui-next/src/features/flows/graph/element-map.ts +2 -0
  230. package/src/console/ui-next/src/features/flows/traces/effect-kind.ts +12 -2
  231. package/src/console/ui-next/src/features/flows/traces/effect-summary.ts +4 -0
  232. package/src/console/ui-next/src/features/flows/traces/trace-detail-sheet.tsx +8 -0
  233. package/src/console/ui-next/src/features/flows/traces/waterfall-bars.ts +4 -0
  234. package/src/console/ui-next/src/features/flows/traces/waterfall-tooltip.ts +9 -3
  235. package/src/console/ui-next/src/features/store/detail/reveal-cell.tsx +7 -11
  236. package/src/console/ui-next/src/features/store/detail/store-row-detail-sheet.tsx +2 -2
  237. package/src/console/ui-next/src/features/store/lib/fields-from-table.ts +2 -0
  238. package/src/console/ui-next/src/features/store/lib/grid-model.test.ts +25 -1
  239. package/src/console/ui-next/src/features/store/lib/grid-model.ts +36 -1
  240. package/src/console/ui-next/src/features/store/query/query-results.tsx +3 -3
  241. package/src/console/ui-next/src/features/units/detail/effects-summary.tsx +2 -0
  242. package/src/console/ui-next/src/features/units/lib/call-read-safe.ts +3 -1
  243. package/src/console/ui-next/src/features/units/lib/fields-from-schema.ts +6 -0
  244. package/src/docker/ai-model-status.test.ts +1 -12
  245. package/src/docker/ai-model-status.ts +10 -38
  246. package/src/docker/compose-up.test.ts +100 -0
  247. package/src/docker/compose-up.ts +292 -0
  248. package/src/docker/compose.ts +4 -14
  249. package/src/docker/derive.ts +9 -34
  250. package/src/docker/docker.test.ts +16 -261
  251. package/src/docker/images-config.test.ts +13 -25
  252. package/src/docker/index.ts +1 -24
  253. package/src/docker/recipes/index.ts +0 -23
  254. package/src/docker/recipes/pgdog.ts +6 -4
  255. package/src/docker/stack-id.test.ts +2 -2
  256. package/src/docker/stack-id.ts +0 -1
  257. package/src/docker/types.ts +2 -2
  258. package/src/drivers/ai-anthropic.ts +10 -0
  259. package/src/drivers/ai-openai-compatible.ts +34 -7
  260. package/src/drivers/ai-providers.test.ts +0 -107
  261. package/src/drivers/ai-stream.test.ts +0 -34
  262. package/src/drivers/ai-types.ts +17 -8
  263. package/src/drivers/channel-fcm.ts +6 -1
  264. package/src/drivers/channel-msegat.ts +6 -1
  265. package/src/drivers/channel-resend.ts +5 -1
  266. package/src/drivers/channel-smtp.ts +5 -1
  267. package/src/drivers/channel-sndr.ts +10 -1
  268. package/src/drivers/channel-taqnyat-mail.ts +5 -1
  269. package/src/drivers/channel-taqnyat-whatsapp.ts +6 -1
  270. package/src/drivers/channel-taqnyat.ts +6 -1
  271. package/src/drivers/channel-types.ts +10 -0
  272. package/src/drivers/channel-unifonic.ts +6 -1
  273. package/src/drivers/channel-wa-cloud.ts +6 -1
  274. package/src/drivers/channel-webpush.ts +6 -1
  275. package/src/drivers/external.ts +33 -0
  276. package/src/drivers/index.ts +0 -10
  277. package/src/drivers/meilisearch.ts +6 -0
  278. package/src/drivers/oauth-types.ts +4 -0
  279. package/src/drivers/postgres.test.ts +74 -3
  280. package/src/drivers/postgres.ts +175 -6
  281. package/src/drivers/signal-types.ts +5 -5
  282. package/src/drivers/types.ts +7 -0
  283. package/src/drivers/vault-types.ts +5 -0
  284. package/src/elements/ai/declare.ts +17 -4
  285. package/src/elements/ai/eval.ts +1 -1
  286. package/src/elements/ai/mcp-http.ts +1 -1
  287. package/src/elements/ai/pii.ts +1 -1
  288. package/src/elements/ai/providers.test.ts +289 -0
  289. package/src/elements/ai/providers.ts +169 -0
  290. package/src/elements/ai/runtime.ts +68 -5
  291. package/src/elements/ai/schema.ts +2 -2
  292. package/src/elements/ai.test.ts +7 -7
  293. package/src/elements/ai.ts +17 -1
  294. package/src/elements/channel/runtime.ts +105 -12
  295. package/src/elements/clock/cron-fields.test.ts +144 -0
  296. package/src/elements/clock/cron-fields.ts +185 -0
  297. package/src/elements/clock/declare.ts +247 -3
  298. package/src/elements/clock.ts +21 -1
  299. package/src/elements/index.ts +15 -0
  300. package/src/elements/signal/chaos-child.ts +1 -2
  301. package/src/elements/signal/declare.ts +65 -37
  302. package/src/elements/signal/delivery-modes.test.ts +11 -31
  303. package/src/elements/signal/dry-run-replay.test.ts +1 -7
  304. package/src/elements/signal/dry-run-write-isolation.test.ts +1 -7
  305. package/src/elements/signal/key-ordering.test.ts +6 -26
  306. package/src/elements/signal/lease-reclaim.test.ts +2 -6
  307. package/src/elements/signal/optional-emit.test.ts +6 -9
  308. package/src/elements/signal/order-lifecycle.test.ts +4 -17
  309. package/src/elements/signal/orphan-messages.test.ts +4 -15
  310. package/src/elements/signal/reconcile.test.ts +2 -2
  311. package/src/elements/signal/runtime.ts +1 -1
  312. package/src/elements/signal/schema-emit.test.ts +4 -8
  313. package/src/elements/signal.test.ts +24 -49
  314. package/src/elements/signal.ts +9 -2
  315. package/src/elements/store/domain-ddl.test.ts +1 -1
  316. package/src/elements/store/live-http.test.ts +9 -4
  317. package/src/elements/store/prepare-row.test.ts +123 -0
  318. package/src/elements/store/resource.ts +43 -12
  319. package/src/elements/store/schema-decl.ts +117 -0
  320. package/src/elements/store/search-backfill.ts +205 -0
  321. package/src/elements/store/search-bind.ts +66 -0
  322. package/src/elements/store/search-bm25.ts +78 -0
  323. package/src/elements/store/search-ddl.ts +156 -0
  324. package/src/elements/store/search-embed-flow.ts +141 -0
  325. package/src/elements/store/search-errors.ts +34 -0
  326. package/src/elements/store/search-fusion.ts +112 -0
  327. package/src/elements/store/search-lsh.ts +179 -0
  328. package/src/elements/store/search-runtime.ts +300 -0
  329. package/src/elements/store/search.test.ts +144 -0
  330. package/src/elements/store/sql-session.test.ts +1 -0
  331. package/src/elements/store/sql-session.ts +83 -3
  332. package/src/elements/store/table.ts +23 -2
  333. package/src/elements/store/upsert-app.test.ts +1 -3
  334. package/src/elements/store.ts +50 -0
  335. package/src/full.ts +4 -2
  336. package/src/http.ts +4 -1
  337. package/src/i18n/catalogs/ar.ts +14 -6
  338. package/src/i18n/catalogs/en.ts +14 -6
  339. package/src/index.ts +6 -1
  340. package/src/kernel/adopt-barrel-fresh.test.ts +7 -7
  341. package/src/kernel/adopt-routes.ts +9 -1
  342. package/src/kernel/app-auth.ts +5 -0
  343. package/src/kernel/app.ts +102 -9
  344. package/src/kernel/auto-cache.test.ts +6 -12
  345. package/src/kernel/auto-registry.test.ts +3 -3
  346. package/src/kernel/boot-bind/ai.test.ts +22 -19
  347. package/src/kernel/boot-bind/ai.ts +5 -43
  348. package/src/kernel/boot-bind/clock.ts +23 -5
  349. package/src/kernel/boot-bind/honor-config.test.ts +4 -4
  350. package/src/kernel/boot.test.ts +11 -6
  351. package/src/kernel/boot.ts +66 -16
  352. package/src/kernel/boundary-contract.ts +93 -0
  353. package/src/kernel/budget.test.ts +1 -1
  354. package/src/kernel/call.ts +89 -0
  355. package/src/kernel/capability.ts +6 -0
  356. package/src/kernel/client-descriptor.ts +123 -0
  357. package/src/kernel/clock-timezone.test.ts +80 -0
  358. package/src/kernel/correlation.test.ts +1 -1
  359. package/src/kernel/dry-run.ts +11 -8
  360. package/src/kernel/effects-stamping.test.ts +42 -9
  361. package/src/kernel/effects.test.ts +4 -2
  362. package/src/kernel/effects.ts +51 -9
  363. package/src/kernel/errors-channel.ts +17 -0
  364. package/src/kernel/errors-live-resume.ts +3 -2
  365. package/src/kernel/errors-tenant.ts +7 -4
  366. package/src/kernel/errors.registry-helpers.ts +96 -0
  367. package/src/kernel/errors.registry.test.ts +139 -25
  368. package/src/kernel/errors.ts +102 -23
  369. package/src/kernel/external-effects.test.ts +196 -0
  370. package/src/kernel/flow.test.ts +13 -4
  371. package/src/kernel/flow.ts +69 -71
  372. package/src/kernel/fx-ask-telemetry.test.ts +2 -2
  373. package/src/kernel/fx-dead-letters.test.ts +3 -3
  374. package/src/kernel/fx-fetch.ts +55 -0
  375. package/src/kernel/fx-live-stream.ts +2 -2
  376. package/src/kernel/fx-live.test.ts +8 -8
  377. package/src/kernel/fx.test.ts +17 -11
  378. package/src/kernel/fx.ts +180 -57
  379. package/src/kernel/horizontal-child.ts +1 -1
  380. package/src/kernel/http-query.test.ts +3 -6
  381. package/src/kernel/index.ts +13 -3
  382. package/src/kernel/instance-id.ts +1 -1
  383. package/src/kernel/instances.test.ts +40 -0
  384. package/src/kernel/instances.ts +47 -9
  385. package/src/kernel/live-http.test.ts +6 -7
  386. package/src/kernel/live-http.ts +6 -2
  387. package/src/kernel/live-resume.test.ts +1 -1
  388. package/src/kernel/mcp-tool.test.ts +3 -3
  389. package/src/kernel/on.ts +98 -4
  390. package/src/kernel/pipeline.test.ts +12 -15
  391. package/src/kernel/plugin-elements.test.ts +1 -1
  392. package/src/kernel/stamp-http.test.ts +3 -3
  393. package/src/kernel/triggers.ts +210 -95
  394. package/src/kernel-entry.ts +0 -1
  395. package/src/manifest/diff.ts +11 -1
  396. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  397. package/src/manifest/types.ts +46 -2
  398. package/src/mcp/docs-index.ts +3 -3
  399. package/src/mcp/docs-mcp.test.ts +2 -2
  400. package/src/mcp/docs-tools.ts +1 -1
  401. package/src/okid.test.ts +56 -0
  402. package/src/okid.ts +55 -11
  403. package/src/plugins/anonymous.ts +8 -4
  404. package/src/plugins/auth/shared.ts +27 -3
  405. package/src/plugins/auth-delivery.mailpit.integration.test.ts +1 -1
  406. package/src/plugins/auth-methods.security.test.ts +561 -23
  407. package/src/plugins/config-source.ts +1 -1
  408. package/src/plugins/csrf.test.ts +65 -0
  409. package/src/plugins/index.ts +2 -0
  410. package/src/plugins/magic-link.ts +36 -16
  411. package/src/plugins/oauth/shared.ts +3 -1
  412. package/src/plugins/oauth.ts +22 -14
  413. package/src/plugins/otp.ts +37 -21
  414. package/src/plugins/passkey-webauthn.ts +9 -6
  415. package/src/plugins/passkey.ts +98 -26
  416. package/src/plugins/pre-account-hijack.test.ts +223 -0
  417. package/src/plugins/two-factor.ts +466 -37
  418. package/src/plugins/username.ts +19 -7
  419. package/src/release/build-lib.ts +1 -0
  420. package/src/release/limits.ts +2 -2
  421. package/src/release/measure.ts +1 -1
  422. package/src/runs/collect.test.ts +0 -2
  423. package/src/runtime/json-code-block.test.ts +250 -20
  424. package/src/runtime/json-code-block.ts +1261 -41
  425. package/src/term.test.ts +1 -1
  426. package/src/test/create-test-app.test.ts +12 -12
  427. package/src/test/live-signals.test.ts +6 -6
  428. package/src/test/provisions.integration.test.ts +10 -14
  429. package/src/test/reset-element-registries.ts +1 -1
  430. package/src/test/tenant-isolation.test.ts +12 -6
  431. package/site/content/docs/deployment/docker-swarm.mdx +0 -164
  432. package/site/content/docs/deployment/docker.mdx +0 -227
  433. package/site/content/docs/deployment/index.mdx +0 -83
  434. package/site/content/docs/deployment/kubernetes.mdx +0 -176
  435. package/site/content/docs/deployment/meta.json +0 -5
  436. package/site/content/docs/deployment/reverse-proxy.mdx +0 -234
  437. package/site/content/docs/elements/ai.mdx +0 -385
  438. package/site/content/docs/elements/channel.mdx +0 -346
  439. package/site/content/docs/elements/clock.mdx +0 -244
  440. package/site/content/docs/elements/flow.mdx +0 -420
  441. package/site/content/docs/elements/gate.mdx +0 -436
  442. package/site/content/docs/elements/signal.mdx +0 -380
  443. package/site/content/docs/elements/store.mdx +0 -1099
  444. package/site/content/docs/elements/vault.mdx +0 -405
  445. package/site/content/docs/get-started/basic-usage.mdx +0 -173
  446. package/site/content/docs/get-started/index.mdx +0 -43
  447. package/site/content/docs/get-started/installation.mdx +0 -220
  448. package/site/content/docs/get-started/introduction.mdx +0 -144
  449. package/site/content/docs/get-started/meta.json +0 -13
  450. package/site/content/docs/get-started/project-structure.mdx +0 -925
  451. package/site/content/docs/get-started/testing.mdx +0 -328
  452. package/site/content/docs/get-started/why.mdx +0 -114
  453. package/site/content/docs/recipes/llama-cpp.mdx +0 -151
  454. package/site/content/docs/recipes/ollama.mdx +0 -142
  455. package/site/content/docs/recipes/sglang.mdx +0 -105
  456. package/site/content/docs/recipes/vllm.mdx +0 -106
  457. package/site/content/docs/reference/cli.md +0 -232
  458. package/site/content/docs/reference/client.mdx +0 -469
  459. package/site/content/docs/reference/security.md +0 -74
  460. package/src/cli/ai-setup/detect-ollama.ts +0 -213
  461. package/src/cli/ai-setup/recommend.test.ts +0 -225
  462. package/src/cli/ai-setup/recommend.ts +0 -225
  463. package/src/cli/dev-controls.test.ts +0 -122
  464. package/src/cli/dev-controls.ts +0 -164
  465. package/src/cli/tui/DevLive.tsx +0 -126
  466. package/src/console/ui-next/dist/assets/access-page-3-EFj-2G.js +0 -4
  467. package/src/console/ui-next/dist/assets/agent-disclosure-BP0Y0Sux.js +0 -1
  468. package/src/console/ui-next/dist/assets/cache-glyph-B5X-NM0-.js +0 -1
  469. package/src/console/ui-next/dist/assets/call-pii-button-ChAUiLo9.js +0 -1
  470. package/src/console/ui-next/dist/assets/collapsible-DGnOM2ph.js +0 -1
  471. package/src/console/ui-next/dist/assets/copy-inline-button-DBHhgHKP.js +0 -1
  472. package/src/console/ui-next/dist/assets/dagre.esm-ZwcdTuZZ.js +0 -1
  473. package/src/console/ui-next/dist/assets/detail-header-DhHM1iaZ.js +0 -1
  474. package/src/console/ui-next/dist/assets/dropdown-menu-_NjTEo5_.js +0 -1
  475. package/src/console/ui-next/dist/assets/duration-tone-sC3lGABz.js +0 -9
  476. package/src/console/ui-next/dist/assets/element-icons-BVXtRyd3.js +0 -1
  477. package/src/console/ui-next/dist/assets/explorer-empty-2uIhBu0_.js +0 -1
  478. package/src/console/ui-next/dist/assets/flows-page-cVFnA4HH.js +0 -1
  479. package/src/console/ui-next/dist/assets/highlighted-json-Awq7gYdu.js +0 -154
  480. package/src/console/ui-next/dist/assets/http-method-_UHM2ODJ.js +0 -1
  481. package/src/console/ui-next/dist/assets/index-CMIgUbD0.js +0 -66
  482. package/src/console/ui-next/dist/assets/index-Ck88Jmv8.css +0 -2
  483. package/src/console/ui-next/dist/assets/link-BX6Vqztd.js +0 -1
  484. package/src/console/ui-next/dist/assets/observability-page-CQ3p34ip.js +0 -4
  485. package/src/console/ui-next/dist/assets/preload-helper-oH4irX4C.js +0 -1
  486. package/src/console/ui-next/dist/assets/react-D8E3mtu1.js +0 -1
  487. package/src/console/ui-next/dist/assets/react-dom-Bph1y7z7.js +0 -9
  488. package/src/console/ui-next/dist/assets/replica-lag-DKRrbvdo.js +0 -18
  489. package/src/console/ui-next/dist/assets/request-meta-DV0ywz7t.js +0 -1
  490. package/src/console/ui-next/dist/assets/shortcut-JQIZlWfm.js +0 -1
  491. package/src/console/ui-next/dist/assets/shortcut-keys-DKxNTe_m.js +0 -1
  492. package/src/console/ui-next/dist/assets/skeleton-D-czQJT6.js +0 -1
  493. package/src/console/ui-next/dist/assets/store-page-02xOiqIK.js +0 -41
  494. package/src/console/ui-next/dist/assets/trace-detail-sheet-B09O8rA6.js +0 -2
  495. package/src/console/ui-next/dist/assets/tree-expand-toggle-BtyhmWb4.js +0 -55
  496. package/src/console/ui-next/dist/assets/units-page-l8FeKfnP.js +0 -1
  497. package/src/console/ui-next/dist/assets/useMutation-B8EO02Ej.js +0 -1
  498. package/src/console/ui-next/dist/assets/useRender-BE2A9BWC.js +0 -1
  499. package/src/console/ui-next/dist/assets/vault-page-CL-d_mLE.js +0 -2
  500. package/src/console/ui-next/dist/assets/xyflow-D7n4g6go.js +0 -7
  501. package/src/console/ui-next/dist/assets/xyflow-DZ0Ws1xk.css +0 -1
  502. package/src/docker/ollama-pull.ts +0 -232
  503. package/src/docker/recipes/llama-cpp.ts +0 -298
  504. package/src/docker/recipes/ollama.ts +0 -44
  505. package/src/docker/recipes/sglang.ts +0 -55
  506. package/src/docker/recipes/vllm.ts +0 -44
  507. package/src/drivers/ai-ollama-tools.integration.test.ts +0 -109
  508. package/src/drivers/ai-ollama.integration.test.ts +0 -184
  509. package/src/drivers/ai-ollama.ts +0 -389
  510. package/src/drivers/ollama.ts +0 -14
@@ -1,18 +1,66 @@
1
1
  ---
2
2
  title: "Errors"
3
- description: "Every error OKE produces — permanent OKE codes with fixes, gate denials, and subsystem errors, with what to do about each."
3
+ description: "OKE codes, gate denials, and subsystem errors stable numeric codes with causes and fixes."
4
4
  icon: "OctagonAlert"
5
+ source: "docs/spec/unified-theory.md"
5
6
  ---
6
7
 
7
- OKE has two error families, and confusing them is the most common mistake: **failures are values** a flow returns (`{ data: null, error: { code, data } }` — clients switch on `error.code`), while **framework errors are thrown** for invariant violations and carry a permanent numeric code, a cause, and a fix.
8
+ OKE has two error families: **failures are values** a Flow returns
9
+ (`{ data: null, error: { code, data } }`), while **framework errors are thrown**
10
+ for invariant violations (permanent numeric code + cause + fix).
8
11
 
9
12
  ```text
10
- OKE1101 domain table not found — migrations have not been applied.
13
+ OKE1110 domain table not found — migrations have not been applied.
11
14
  → run `oke db migrate` against this environment.
12
- https://oke.omqkhafi.dev/e/1101
15
+ https://oke.omqkhafi.dev/e/1110
13
16
  ```
14
17
 
15
- Codes are permanent once published you can match on them safely across upgrades.
18
+ Codes are stable after the domain-range renumber match them safely across upgrades
19
+ (see the Unreleased Breaking Changes mapping if you still have a pre-renumber note).
20
+
21
+ <Callout title="The one rule">
22
+ Switch on `error.code` for Flow failures. Catch / match `OKE####` only for thrown framework
23
+ invariants. Do not treat a typed `NotFound` as an unhandled exception.
24
+ </Callout>
25
+
26
+ ## Smallest Example
27
+
28
+ <Steps>
29
+
30
+ <Step>
31
+ ### Return a typed failure
32
+
33
+ ```typescript
34
+ on(
35
+ http.get({
36
+ in: z.object({ id: z.string() }),
37
+ errors: { NotFound: z.object({ id: z.string() }) },
38
+ }),
39
+ flow({
40
+ do: async ({ id }, fx) => {
41
+ const [row] = await fx.store(db).select().from(notes).where(eq(notes.id, id));
42
+ if (!row) return fx.fail("NotFound", { id });
43
+ return row;
44
+ },
45
+ }),
46
+ );
47
+ ```
48
+
49
+ </Step>
50
+
51
+ <Step>
52
+ ### Handle it on the client
53
+
54
+ ```typescript
55
+ const { data, error } = await api.notes.get({ id });
56
+ if (error?.code === "NotFound") {
57
+ // value — not a throw
58
+ }
59
+ ```
60
+
61
+ </Step>
62
+
63
+ </Steps>
16
64
 
17
65
  ## Localized messages
18
66
 
@@ -25,34 +73,42 @@ from `Accept-Language` (matched to `i18n.locales`); fallback is `i18n.default`.
25
73
  | Thrown `OkeError` | `oke.{code}.cause` · `oke.{code}.fix` | Cause + fix lines in the thrown message |
26
74
 
27
75
  Override via `defineLocale`. Pass `fail(code, data, { message })` for a custom
28
- string. Custom app codes stay message-less until registered.
76
+ string. Custom app codes stay message-less until registered. Full catalogs:
77
+ [i18n](/docs/reference/i18n).
29
78
 
30
79
  ## OKE numeric codes
31
80
 
32
- | Code | Name | Cause | Fix |
33
- | ------ | -------------------- | ------------------------------------------------- | ---------------------------------------------------- |
34
- | `1001` | undeclared read | Flow reads a resource not in `effects.reads` | Add it to the flow's `effects.reads` |
35
- | `1002` | undeclared write | Flow writes a resource not in `effects.writes` | Add it to the flow's `effects.writes` |
36
- | `1003` | undeclared emit | Flow emits a signal not in `effects.emits` | Add it to the flow's `effects.emits` |
37
- | `1004` | undeclared send | Flow sends a template not in `effects.sends` | Add it to the flow's `effects.sends` |
38
- | `1005` | undeclared ask | Flow asks a prompt not in `effects.asks` | Add it to the flow's `effects.asks` |
39
- | `1006` | undeclared secret | Flow reads a secret not in `effects.secrets` | Add it to the flow's `effects.secrets` |
40
- | `1007` | undeclared call | Flow calls a flow not in `effects.calls` | Add it to the flow's `effects.calls` |
41
- | `1011` | HTTP route clash | Two HTTP flows share the same method + path | Give each flow a unique method + path |
42
- | `1012` | HTTP flow unnamed | Adopted HTTP flow still has no `unit.export` | Export from `flows/<unit>/` or pass a named `flow` |
43
- | `1013` | live exposure dup | Same signal, gates, and match on two GET routes | Change the gate or path-param filter |
44
- | `1014` | live resume gap | `Last-Event-ID` is not on the retained tape | Reconnect without the cursor; remaining tape replays |
45
- | `1015` | tenant required | Tenant-scoped op with no `fx.tenant.id` | `switchTenant`, signed `tid`, or tenant header |
46
- | `1016` | tenant not member | Client-supplied tenant id is not a membership | Pick from `listTenants` or add the user as a member |
47
- | `1017` | tenant unknown scope | Tenant role used an invented or `console:*` scope | Use a declared application scope |
48
- | `1042` | orphan emit | Emit with zero subscribers and `optional` false | Add `on(signal, …)` or declare `optional: true` |
49
- | `1043` | signal schema | Emit payload failed the signal's `schema` | Pass a payload that matches `schema`, or remove it |
50
- | `1101` | schema missing | Domain table absent in `prod` — no auto-DDL | Run `oke db migrate` against this environment |
81
+ | Code | Name | Cause | Fix |
82
+ | ------ | -------------------- | ------------------------------------------------------ | --------------------------------------------------------- |
83
+ | `1001` | undeclared read | Flow reads a resource not in `effects.reads` | Add it to the flow's `effects.reads` |
84
+ | `1002` | undeclared write | Flow writes a resource not in `effects.writes` | Add it to the flow's `effects.writes` |
85
+ | `1003` | undeclared emit | Flow emits a signal not in `effects.emits` | Add it to the flow's `effects.emits` |
86
+ | `1004` | undeclared send | Flow sends a template not in `effects.sends` | Add it to the flow's `effects.sends` |
87
+ | `1005` | undeclared ask | Flow asks a prompt not in `effects.asks` | Add it to the flow's `effects.asks` |
88
+ | `1006` | undeclared secret | Flow reads a secret not in `effects.secrets` | Add it to the flow's `effects.secrets` |
89
+ | `1007` | undeclared call | Flow calls a flow not in `effects.calls` | Add it to the flow's `effects.calls` |
90
+ | `1008` | undeclared fetch | Flow fetches a host not in `effects.fetches` | Add the hostname to the flow's `effects.fetches` |
91
+ | `1009` | undeclared embed | Flow embeds with a model not in `effects.embeds` | Add it to the flow's `effects.embeds` |
92
+ | `1020` | no effects declared | Flow has no `effects` and no Manifest to infer from | Run `oke build` / `oke dev`, or declare effects |
93
+ | `1030` | adopt barrel stale | A `src/flows/<unit>` folder was not adopted | Run `oke dev` or `oke build` to regenerate `generated.ts` |
94
+ | `1040` | HTTP path unresolved | Pathless `http.get()` never received a file-tree stamp | Import `@/flows/generated`, or pass `http.get("/…")` |
95
+ | `1041` | HTTP route clash | Two HTTP flows share the same method + path | Give each flow a unique method + path |
96
+ | `1045` | HTTP flow unnamed | Adopted HTTP flow still has no `unit.export` | Export from `flows/<unit>/` or pass a named `flow` |
97
+ | `1050` | live exposure dup | Same signal, gates, and match on two GET routes | Change the gate or path-param filter |
98
+ | `1060` | MCP tool duplicate | Two MCP tool bindings share the same tool name | Give each MCP tool exposure a unique name |
99
+ | `1110` | schema missing | Domain table absent in `prod` — no auto-DDL | Run `oke db migrate` against this environment |
100
+ | `1210` | live resume gap | `Last-Event-ID` is not on the retained tape | Reconnect without the cursor; remaining tape replays |
101
+ | `1240` | orphan emit | Emit with zero subscribers and `optional` false | Add `on(signal, …)` or declare `optional: true` |
102
+ | `1250` | signal schema | Emit payload failed the signal's `schema` | Pass a payload that matches `schema`, or remove it |
103
+ | `1605` | channel schema | Send payload failed the template's `schema` | Fix template `data` payload or the template `schema` |
104
+ | `1810` | tenant required | Tenant-scoped op with no `fx.tenant.id` | `switchTenant`, signed `tid`, or tenant header |
105
+ | `1820` | tenant not member | Client-supplied tenant id is not a membership | Pick from `listTenants` or add the user as a member |
106
+ | `1830` | tenant unknown scope | Tenant role used an invented or `console:*` scope | Use a declared application scope |
51
107
 
52
108
  <Callout title="Effects are usually inferred">
53
- The 1001–1007 family exists for flows that declare effects explicitly. Most apps never write an
54
- `effects` block — inference covers them — so seeing one of these means an explicit declaration
55
- drifted from the code.
109
+ The 1001–1007 · 1008 · 1009 family exists for flows that declare effects explicitly. Most apps
110
+ never write an `effects` block — inference covers them — so seeing one of these means an explicit
111
+ declaration drifted from the code.
56
112
  </Callout>
57
113
 
58
114
  ## Gate denials (typed failures)
@@ -98,9 +154,56 @@ Thrown by specific subsystems — each names its own cause:
98
154
  | `AccessGrantError` | Console access grant rejected | Re-request access with a valid grant |
99
155
  | `UnsupportedPathError` | A route path shape the router can't compile | Simplify the path pattern |
100
156
 
157
+ ## Troubleshooting
158
+
159
+ <Accordions>
160
+
161
+ <Accordion title="I hit OKE1001–1009">
162
+ Explicit `effects` drifted from `do`. Add the missing ledger entry or remove the hand-written
163
+ `effects` block so inference covers the Flow.
164
+ </Accordion>
165
+
166
+ <Accordion title="OKE1040 pathless HTTP never stamped">
167
+ Import `@/flows/generated`, or pass an explicit path: `http.get("/users/:id")`.
168
+ </Accordion>
169
+
170
+ <Accordion title="OKE1041 method + path bound twice">
171
+ A resource mount and a handwritten route share the same method + path. Drop one binding.
172
+ </Accordion>
173
+
174
+ <Accordion title="OKE1110 in production">
175
+ Domain tables missing — prod has no auto-DDL. Run `oke db migrate` against that environment
176
+ ([CLI](/docs/reference/cli)).
177
+ </Accordion>
178
+
179
+ <Accordion title="Unauthorized / Forbidden / RateLimited">
180
+ These are gate denials returned as values before `do` runs — not thrown OKE codes. Fix the policy,
181
+ membership, or rate budget. See [Gate](/docs/elements/gate).
182
+ </Accordion>
183
+
184
+ <Accordion title="VaultBootError at startup">
185
+ A vault contract has no value in any resolution layer. The error lists every gap — set the missing
186
+ names ([Vault](/docs/elements/vault)).
187
+ </Accordion>
188
+
189
+ </Accordions>
190
+
101
191
  ## Learn more
102
192
 
103
193
  - [i18n](/docs/reference/i18n) — catalogs, `fx.t`, locale matching
104
194
  - [Flow](/docs/elements/flow) — `fx.fail` and the response envelope
105
195
  - [Gate](/docs/elements/gate) — where the three denials come from
106
- - [CLI Reference](/docs/reference/cli) — `oke db migrate` and friends
196
+ - [CLI](/docs/reference/cli) — `oke db migrate` and friends
197
+ - [fx](/docs/reference/fx) — how failures and effects surface
198
+
199
+ ## Next
200
+
201
+ <Cards>
202
+ <Card title="fx" description="The door that records effects." href="/docs/reference/fx" />
203
+ <Card
204
+ title="Gate"
205
+ description="Where Unauthorized and Forbidden come from."
206
+ href="/docs/elements/gate"
207
+ />
208
+ <Card title="Client" description="Switch on error.code in the browser." href="/docs/client" />
209
+ </Cards>
@@ -1,38 +1,89 @@
1
1
  ---
2
2
  title: "fx"
3
- description: "The complete fx surface — every call a flow can make, its signature, and the effect it records."
3
+ description: "The complete fx surface — every call a Flow can make, its signature, and the effect it records."
4
4
  icon: "Braces"
5
+ source: "docs/spec/unified-theory.md"
5
6
  ---
6
7
 
7
- `fx` is the second argument of every `do` — the single door to the world. This page is the whole surface; each entry notes the **effect it records**, which is what feeds the Manifest, caching, and capability checks.
8
+ `fx` is the second argument of every `do` — the single door to the world. This page is the
9
+ whole surface; each entry notes the **effect it records**, which feeds the Manifest, caching,
10
+ and capability checks.
11
+
12
+ <Callout title="The one rule">
13
+ All world access goes through `fx`. No `node:` I/O, no raw `fetch` for side effects (use
14
+ `fx.fetch` instead), no `Date.now()` — clocks, stores, channels, vault, AI, and outbound HTTP only
15
+ through this object.
16
+ </Callout>
17
+
18
+ ## Smallest Example
19
+
20
+ <Steps>
21
+
22
+ <Step>
23
+ ### Use `fx` inside `do`
24
+
25
+ ```typescript title="src/flows/notes/create.ts"
26
+ import { on, flow, http } from "okengine";
27
+ import { z } from "zod";
28
+ import { db, notes } from "@/schema";
29
+
30
+ export const create = on(
31
+ http.post(),
32
+ flow({
33
+ in: z.object({ title: z.string().min(1) }),
34
+ do: async ({ title }, fx) => {
35
+ const id = fx.id();
36
+ await fx.store(db).insert(notes).values({ id, title });
37
+ return fx.json.create({ id, title });
38
+ },
39
+ }),
40
+ );
41
+ ```
42
+
43
+ </Step>
44
+
45
+ <Step>
46
+ ### Type extracted helpers as `Fx`
8
47
 
9
48
  ```typescript
10
- flow("orders.example", {
11
- do: async (input, fx) => {
12
- // everything below, on this one object
13
- },
14
- });
49
+ import type { Fx } from "okengine";
50
+
51
+ async function loadNote(id: string, fx: Fx) {
52
+ return fx.store(db).findById(notes, id);
53
+ }
15
54
  ```
16
55
 
17
- <Callout title="Extracted helpers">
18
- Type a helper's `fx` parameter as `Fx` (`import type {Fx} from "okengine"`). A narrower structural
19
- type will not match `store()` overloads. See [Flow](/docs/elements/flow).
20
- </Callout>
56
+ A narrower structural type will not match `store()` overloads. See [Flow](/docs/elements/flow).
57
+
58
+ </Step>
59
+
60
+ </Steps>
61
+
62
+ ## What the effects ledger powers
63
+
64
+ | Derived behavior | From |
65
+ | ---------------------- | -------------------------------------- |
66
+ | Cache invalidation | Inferred / ledgered `reads` · `writes` |
67
+ | Live queries / CDC | Store `writes` observed as row events |
68
+ | Least-privilege tokens | Effect matrices on Flows |
69
+ | Deterministic tests | Injectable clock · store · channel |
70
+ | Runs observability | Wide events per invocation (`fx.runs`) |
21
71
 
22
72
  ## Stores
23
73
 
24
- | Signature | Records | Returns |
25
- | ------------------------------------------------------------------- | ------------ | ------------------------------------------------------------------------------------------- |
26
- | `fx.store(sqlDecl).select().from(t)…` | `read` | inferred rows (`where` · `orderBy` · `limit` · `offset` chainable) |
27
- | `fx.store(sqlDecl).insert(t).values(v)` | `write` | `Promise<void>` |
28
- | `fx.store(sqlDecl).update(t).set(v).where(…)` | `write` | `Promise<void>` |
29
- | `fx.store(sqlDecl).delete(t).where(…)` | `write` | `Promise<void>` |
30
- | `fx.store(sqlDecl).findById(t, id)` | `read` | row \| undefined |
31
- | `fx.store(kv).get / set(key, value, ttl?) / delete / list(prefix?)` | read / write | per op |
32
- | `fx.store(files).put / get / delete / list(prefix?)` | read / write | per op |
33
- | `fx.store(files).image(key\|bytes).…` | read / write | Bun.Image chain; terminals gate (see [Store](/docs/elements/store#images--image--putimage)) |
34
- | `fx.store(files).putImage(key, data, opts?)` | `write` | original + variants (+ optional LQIP) |
35
- | `fx.store(index).upsert / search(vector, topK?) / delete` | read / write | per op |
74
+ | Signature | Records | Returns |
75
+ | ------------------------------------------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------- |
76
+ | `fx.store(sqlDecl).select().from(t)…` | `read` | inferred rows (`where` · `orderBy` · `limit` · `offset` chainable) |
77
+ | `fx.store(sqlDecl).insert(t).values(v)` | `write` | `Promise<void>` |
78
+ | `fx.store(sqlDecl).update(t).set(v).where(…)` | `write` | `Promise<void>` |
79
+ | `fx.store(sqlDecl).delete(t).where(…)` | `write` | `Promise<void>` |
80
+ | `fx.store(sqlDecl).findById(t, id)` | `read` | row \| undefined |
81
+ | `fx.store(sqlDecl).search(table, { query, fuse?, rerank?, })` | `read` (+ `ask` if rerank) | `{ data, meta }` hybrid BM25 ± LSH — see [Search](/docs/elements/store/search) |
82
+ | `fx.store(kv).get / set(key, value, ttl?) / delete / list(prefix?)` | read / write | per op |
83
+ | `fx.store(files).put / get / delete / list(prefix?)` | read / write | per op |
84
+ | `fx.store(files).image(key\|bytes).…` | read / write | Bun.Image chain; terminals gate (see [Store](/docs/elements/store#images--image--putimage)) |
85
+ | `fx.store(files).putImage(key, data, opts?)` | `write` | original + variants (+ optional LQIP) |
86
+ | `fx.store(index).upsert / search(vector, topK?) / delete` | read / write | per op |
36
87
 
37
88
  See [Store](/docs/elements/store) for the query-builder surface.
38
89
 
@@ -40,7 +91,7 @@ See [Store](/docs/elements/store) for the query-builder surface.
40
91
 
41
92
  | Signature | Records | Notes |
42
93
  | ------------------------------------- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
43
- | `fx.emit(signal, payload?, { key? })` | `emit` | Commits the signal outbox when the call resolves; optional `key` serializes `once` per key; stamps producer run id as `parentRunId` for trace chains; throws **OKE1042** (orphan) or **OKE1043** (schema) |
94
+ | `fx.emit(signal, payload?, { key? })` | `emit` | Commits the signal outbox when the call resolves; optional `key` serializes `once` per key; stamps producer run id as `parentRunId` for trace chains; throws **OKE1240** (orphan) or **OKE1250** (schema) |
44
95
  | `fx.deadLetters(signal)` | `read` `signal:<name>` | Dead-lettered messages for that signal. Payload typed from `SignalDecl<T>`. Page with `fx.json.withQuery`. Cross-signal throws **OKE1001**. |
45
96
  | `fx.live(signal, { match? })` | `read` `signal:<name>` | Live tape as SSE. Returns `JsonStreamResult` (object chunks, `id:` on the wire). Cross-signal throws **OKE1001**. Do not wrap with `fx.json.stream`. |
46
97
 
@@ -56,8 +107,10 @@ Declare `effects: { reads: ["runs"] }`. Powers native SLO checkers (Clock + Chan
56
107
  | `fx.runs.checkSlo(flow, slo, windowMs?)` | `read` `runs` | Availability / latency breaches |
57
108
 
58
109
  ```typescript
110
+ const sloCheckClock = clock("ops.slo-check", { every: "5m" });
111
+
59
112
  on(
60
- every("5m"),
113
+ sloCheckClock,
61
114
  flow("ops.slo-check", {
62
115
  effects: { reads: ["runs"], sends: ["slo-alert"] },
63
116
  do: async (_, fx) => {
@@ -159,6 +212,18 @@ const rows = await fx.using(
159
212
  Omit locale opts and the send uses `fx.locale`. Dry runs record _would have fired_ and never
160
213
  contact a provider. Channel bodies use `{{field}}` catalogs — not ICU (see [Channel](/docs/elements/channel)).
161
214
 
215
+ ## Outbound HTTP
216
+
217
+ | Signature | Records | Notes |
218
+ | ---------------------- | --------------------------- | ------------------------------------------------------------------------- |
219
+ | `fx.fetch(url, init?)` | `fetch` on the URL hostname | Always stamps `EffectEntry.external` with `{ host, kind: "third-party" }` |
220
+
221
+ Declare hosts in `effects.fetches` (e.g. `["api.stripe.com"]`). Prefer `fx.step`; use
222
+ `fx.retry` only when the remote API is safe to repeat. Dry runs never hit the network.
223
+
224
+ Use this for third-party REST outside Channel / AI / Store — not as a substitute for those
225
+ elements.
226
+
162
227
  ## AI
163
228
 
164
229
  | Signature | Records | Returns |
@@ -170,6 +235,10 @@ contact a provider. Channel bodies use `{{field}}` catalogs — not ICU (see [Ch
170
235
 
171
236
  AI calls are nondeterministic: journaling is forced on and auto-cache disabled around them. `tools` are Flow refs — each model tool call goes through `fx.call` (same capability and Runs path).
172
237
 
238
+ Driver-reported `EffectEntry.external` marks cloud providers as `third-party` and
239
+ self-hosted / `provider: "local"` as `infrastructure` (Console waterfall dashed egress +
240
+ host tooltip).
241
+
173
242
  ## Vault
174
243
 
175
244
  | Signature | Records | Returns / notes |
@@ -232,54 +301,9 @@ Returning a plain value instead answers 200 with `{ data: value, error: null }`
232
301
  | `fx.locale` | Active locale (`Accept-Language` matched to `i18n.locales`) |
233
302
  | `fx.id()` | OKID — 21-char native id from `okengine/okid` |
234
303
 
235
- See [OKID](/docs/reference/okid) for generation options and the entropy model.
236
-
237
- `fx.t` uses [ICU MessageFormat](https://unicode-org.github.io/icu/userguide/format_parse/messages/)
238
- (FormatJS): `{name}`, plurals, `select` / `selectordinal`, rich-text tags.
239
- Full syntax and escaping: [i18n · ICU](/docs/reference/i18n#icu-messageformat).
240
-
241
- Register catalogs with `defineLocale` before boot (nested trees → dot keys). Augment
242
- `Register` so keys autocomplete and typos fail at compile time:
243
-
244
- ```typescript
245
- import { defineLocale, defineMessages, type MessagesFor } from "okengine/i18n";
246
-
247
- export const en = defineMessages({
248
- greeting: "Hello, {name}",
249
- items: "{count, plural, one {# item} other {# items}}",
250
- place: "You finished {place, selectordinal, one {#st} two {#nd} few {#rd} other {#th}}!",
251
- status: "{status, select, online {Online} offline {Offline} other {Unknown}}",
252
- cta: "Read <docs>the docs</docs>",
253
- });
254
- defineLocale("en", en);
255
-
256
- defineLocale("ar", {
257
- greeting: "مرحباً، {name}",
258
- items: "{count, plural, zero {لا عناصر} one {عنصر واحد} other {# عناصر}}",
259
- place: "أنهيت في المرتبة {place, selectordinal, other {#}}!",
260
- status: "{status, select, online {متصل} offline {غير متصل} other {غير معروف}}",
261
- cta: "اقرأ <docs>التوثيق</docs>",
262
- } satisfies MessagesFor<typeof en>);
263
-
264
- declare module "okengine" {
265
- interface Register {
266
- messages: typeof en;
267
- }
268
- }
269
- ```
270
-
271
- ```typescript
272
- fx.t("greeting", { name: input.name });
273
- fx.t("items", { count: 3 });
274
- fx.t("cta", { docs: (chunks) => `<a href="/docs">${chunks.join("")}</a>` });
275
- ```
276
-
277
- Supported locales and the fallback come from `oke.config.ts` `i18n`.
278
- `create-oke` scaffolds English and Arabic locale modules already wired this way.
279
-
280
- Built-in `errors.*` / `oke.*` catalogs localize `fx.fail` messages and thrown
281
- `OkeError` cause/fix the same way — full i18n guide:
282
- [i18n](/docs/reference/i18n), [Errors](/docs/reference/errors).
304
+ Catalogs, ICU syntax, and `Register` augmentation live on [i18n](/docs/reference/i18n).
305
+ Id options: [OKID](/docs/reference/okid). Localized `fx.fail` / `OkeError` catalogs:
306
+ [Errors](/docs/reference/errors).
283
307
 
284
308
  ## Principals
285
309
 
@@ -302,9 +326,49 @@ to the key — see [Gate](/docs/elements/gate#api-keys).
302
326
  export for existing Grafana/Datadog stacks is additive and never required.
303
327
  </Callout>
304
328
 
329
+ ## Troubleshooting
330
+
331
+ <Accordions>
332
+
333
+ <Accordion title="OKE1001–1007 / 1008 / 1009 undeclared effect">
334
+ An explicit `effects` block drifted from what `do` touches. Add the missing ledger entry (`reads`
335
+ · `writes` · `emits` · `sends` · `asks` · `embeds` · `secrets` · `calls` · `fetches`), or drop the
336
+ block so inference covers the Flow ([Errors](/docs/reference/errors)).
337
+ </Accordion>
338
+
339
+ <Accordion title="OKE1240 orphan emit">
340
+ `fx.emit` with zero subscribers and `optional: false`. Add `on(signal, …)` or declare the signal
341
+ `optional: true`.
342
+ </Accordion>
343
+
344
+ <Accordion title="OKE1250 signal schema">
345
+ Emit payload failed the signal's `schema`. Pass a matching payload or remove the schema.
346
+ </Accordion>
347
+
348
+ <Accordion title="Cross-signal fx.live / fx.deadLetters">
349
+ Reading another signal's tape throws **OKE1001**. Declare
350
+ `effects.reads: ["signal:<name>"]` for that name.
351
+ </Accordion>
352
+
353
+ <Accordion title="Helper fx type errors on store()">
354
+ Type the parameter as `Fx` from `okengine`, not a hand-rolled structural type.
355
+ </Accordion>
356
+
357
+ </Accordions>
358
+
305
359
  ## Learn more
306
360
 
307
361
  - [Flow](/docs/elements/flow) — why `fx` is the only door
308
362
  - [Channel](/docs/elements/channel) — `fx.send`, consent, locale chain, `{{field}}` catalogs
363
+ - [i18n](/docs/reference/i18n) — `fx.t`, catalogs, locale matching
309
364
  - [Errors](/docs/reference/errors) — what `fx.fail` produces
310
365
  - [Configuration](/docs/reference/configuration) — drivers and the `i18n` block
366
+ - [OKID](/docs/reference/okid) — `fx.id()` options
367
+
368
+ ## Next
369
+
370
+ <Cards>
371
+ <Card title="Flow" description="Triggers, effects, and durability." href="/docs/elements/flow" />
372
+ <Card title="Errors" description="OKE codes and failure values." href="/docs/reference/errors" />
373
+ <Card title="Client" description="Call Flows with the same envelope." href="/docs/client" />
374
+ </Cards>
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "Reference"
3
- description: "Lookup pages — config, fx, i18n, client, env vars, errors, plugins API, CLI, and Console security."
3
+ description: "Lookup pages — CLI, config, fx, errors, security, and plugins."
4
4
  icon: "BookMarked"
5
5
  source: "docs/spec/unified-theory.md"
6
6
  ---
@@ -10,41 +10,33 @@ Dense tables and command lists. Reach for these when you already know what you a
10
10
  ## Pages
11
11
 
12
12
  <Cards>
13
+ <Card title="CLI" description="oke and create-oke commands." href="/docs/reference/cli" />
13
14
  <Card
14
15
  title="Configuration"
15
16
  description="Every option in oke.config.ts."
16
17
  href="/docs/reference/configuration"
17
18
  />
18
- <Card title="fx" description="The complete fx surface and effects." href="/docs/reference/fx" />
19
- <Card
20
- title="i18n"
21
- description="ICU catalogs, fx.t, typed keys, locale matching."
22
- href="/docs/reference/i18n"
23
- />
24
- <Card
25
- title="Client"
26
- description="Typed createClient — REST, RPC, envelope helpers."
27
- href="/docs/reference/client"
28
- />
29
19
  <Card
30
20
  title="Environment Variables"
31
21
  description="Every variable OKE reads."
32
22
  href="/docs/reference/environment-variables"
33
23
  />
24
+ <Card title="fx" description="The complete fx surface and effects." href="/docs/reference/fx" />
34
25
  <Card title="Errors" description="OKE codes, denials, fixes." href="/docs/reference/errors" />
35
26
  <Card
36
- title="Plugins"
37
- description="Plugin API — hooks, schemas, identity."
38
- href="/docs/reference/plugins"
27
+ title="Security"
28
+ description="Host, Origin, planes, MCP posture."
29
+ href="/docs/reference/security"
39
30
  />
40
31
  <Card
41
- title="CLI Reference"
42
- description="oke and create-oke commands."
43
- href="/docs/reference/cli"
32
+ title="i18n"
33
+ description="ICU catalogs, fx.t, typed keys, locale matching."
34
+ href="/docs/reference/i18n"
44
35
  />
45
36
  <Card
46
- title="Security"
47
- description="Console Host, Origin, MCP posture."
48
- href="/docs/reference/security"
37
+ title="Plugins"
38
+ description="Plugin API — hooks, schemas, identity."
39
+ href="/docs/reference/plugins"
49
40
  />
41
+ <Card title="OKID" description="Native id generator." href="/docs/reference/okid" />
50
42
  </Cards>
@@ -3,15 +3,14 @@
3
3
  "icon": "BookMarked",
4
4
  "pages": [
5
5
  "index",
6
+ "cli",
6
7
  "configuration",
7
- "fx",
8
- "i18n",
9
- "client",
10
8
  "environment-variables",
9
+ "fx",
11
10
  "errors",
12
- "plugins",
13
- "cli",
14
11
  "security",
12
+ "i18n",
13
+ "plugins",
15
14
  "okid"
16
15
  ]
17
16
  }