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
package/AGENTS.md CHANGED
@@ -32,11 +32,13 @@ An element earns its place only if it has irreducible physics. New infrastructur
32
32
  ## Core programming vocabulary
33
33
 
34
34
  ```typescript
35
- import { on, flow, signal, store, clock, gate, vault, channel, ai, plugin } from "okengine";
35
+ import { on, flow, call, signal, store, clock, gate, vault, channel, ai, plugin } from "okengine";
36
36
  ```
37
37
 
38
38
  That is the core programming vocabulary. Everything else is derived.
39
39
 
40
+ **Invoke contracts** (`in` / `out` / `errors`) are authored on the exposure — `http.*(path?, { … })`, `call(name, { … })`, or `mcp.tool(name, { … })` — not on `flow()`. **Emit schemas** live on Signal / Channel templates. Flow is behavior (`do` + runtime options) only.
41
+
40
42
  ## Governing rule
41
43
 
42
44
  > **Adopt, don't reinvent; bind natively; name drivers after protocols.**
@@ -68,13 +70,15 @@ Mnemonic: O·K·E = 6·5·3.
68
70
 
69
71
  | Budget | Limit |
70
72
  | --------------------- | ------- |
71
- | Kernel (edge profile) | < 15 kB |
72
- | Client runtime | < 3 kB |
73
+ | Kernel (edge profile) | < 17 kB |
74
+ | Client runtime | < 5 kB |
73
75
  | Cold start on Bun | < 75 ms |
74
76
  | p99 routing overhead | < 1 ms |
75
77
 
76
78
  A regression fails the build. Claims we cannot measure, we do not make.
77
79
 
80
+ After changing `src/kernel/`, `src/client/`, `src/compiler/`, `src/validation/`, or `src/release/limits.ts` / `measure.ts`, run `bun run budgets:core` (kernel edge + client gzip) before claiming done. Do not raise the published 17 kB / 5 kB caps without a measured before/after and an Unreleased changelog note; prefer lazy-loading off the edge graph.
81
+
78
82
  ## Package shape
79
83
 
80
84
  Published packages:
@@ -82,16 +86,18 @@ Published packages:
82
86
  - `okengine` — framework. Subpath exports: `.`, `./client`, `./test`, `./config`, `./auth`, `./plugins`, `./drivers/*`. `"sideEffects": false`. CLI binary: `oke`.
83
87
  - `create-oke` — scaffold CLI (`bunx create-oke@latest <name>`). Lives in `packages/create-oke` and ships Notes starters from `packages/create-oke/templates/{standard,advanced}`.
84
88
 
85
- Engine: Bun `>=1.4.0`.
89
+ Engine: Bun `>=1.4.2`.
86
90
 
87
91
  ## Documentation authority
88
92
 
89
- | Surface | Path |
90
- | -------- | ------------------------------------ |
91
- | Theory | `site/content/docs/elements/` |
92
- | Console | `site/content/docs/console/` |
93
- | CLI | `site/content/docs/reference/cli.md` |
94
- | Manifest | `manifest.v1.schema.json` |
93
+ | Surface | Path |
94
+ | ------------ | ------------------------------- |
95
+ | Understand | `site/content/docs/understand/` |
96
+ | Elements | `site/content/docs/elements/` |
97
+ | Client | `site/content/docs/client/` |
98
+ | Reference | `site/content/docs/reference/` |
99
+ | AI Resources | `site/content/docs/ai/` |
100
+ | Manifest | `manifest.v1.schema.json` |
95
101
 
96
102
  **If the documentation is silent, stop and ask.**
97
103
 
@@ -99,4 +105,6 @@ Engine: Bun `>=1.4.0`.
99
105
 
100
106
  Before claiming work done: run [`.agents/skills/oke-ship`](.agents/skills/oke-ship/SKILL.md) — append notes to `changelog.md` under `## Unreleased` (never under a shipped `## v…` section), and update site docs via [`.agents/skills/oke-docs`](.agents/skills/oke-docs/SKILL.md) for any user-facing surface. Version bump is separate: `bun run bump` promotes Unreleased into the next `## vX.Y.Z`.
101
107
 
108
+ Do **NOT** run `bun run ci` automatically after finishing an implementation. Only run `bun run ci` when the user explicitly requests it.
109
+
102
110
  Dependency bumps (one package, one `package.json`, or all): [`.agents/skills/oke-deps`](.agents/skills/oke-deps/SKILL.md).
package/README.md CHANGED
@@ -16,7 +16,7 @@
16
16
  <a href="https://www.npmjs.com/package/okengine"><img alt="npm" src="https://shieldcn.dev/npm/okengine.svg?size=sm&variant=outline" /></a>
17
17
  <a href="https://jsr.io/@omqkhafi/okengine"><img alt="JSR" src="https://shieldcn.dev/jsr/@omqkhafi/okengine.svg?size=sm&variant=outline" /></a>
18
18
  <a href="https://opensource.org/licenses/MIT"><img alt="MIT" src="https://shieldcn.dev/npm/license/okengine.svg?size=sm&variant=outline" /></a>
19
- <a href="https://bun.sh"><img alt="Bun >=1.4.0" src="https://shieldcn.dev/badge/Bun-%3E%3D1.4.0.svg?logo=bun&size=sm&variant=outline" /></a>
19
+ <a href="https://bun.sh"><img alt="Bun >=1.4.2" src="https://shieldcn.dev/badge/Bun-%3E%3D1.4.2.svg?logo=bun&size=sm&variant=outline" /></a>
20
20
  <a href="https://github.com/omqkhafi/okengine/actions"><img alt="CI" src="https://shieldcn.dev/github/ci/omqkhafi/okengine.svg?size=sm&variant=outline" /></a>
21
21
  <a href="https://github.com/omqkhafi/okengine/commits"><img alt="last commit" src="https://shieldcn.dev/github/last-commit/omqkhafi/okengine.svg?size=sm&variant=outline" /></a>
22
22
  </p>
@@ -39,7 +39,7 @@
39
39
 
40
40
  ## Install
41
41
 
42
- Requires [Bun](https://bun.sh) `>=1.4.0`.
42
+ Requires [Bun](https://bun.sh) `>=1.4.2`.
43
43
 
44
44
  ```bash
45
45
  bunx create-oke@latest my-app # scaffold (recommended)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "okengine",
3
- "version": "0.18.5",
3
+ "version": "0.19.0",
4
4
  "description": "One law. Eight elements. One contract. The backend model stays small; operational surfaces are derived from it instead of maintained separately.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -127,6 +127,7 @@
127
127
  "bench": "bun test ./src/runtime/cold-start.bench.ts src/client/budget.test.ts src/console/budget.test.ts src/kernel/budget.test.ts src/kernel/routing-budget.test.ts src/runs/bench.test.ts src/okid.bench.test.ts",
128
128
  "bench:load": "OKE_BENCH=1 bun test ./src/bench/*.bench.ts --timeout 600000 --pass-with-no-tests",
129
129
  "budgets": "bun src/release/publish.ts",
130
+ "budgets:core": "bun test src/kernel/budget.test.ts src/client/budget.test.ts",
130
131
  "gate": "PUBLISH_GATE=1 bun test src/cli/doc-staleness.test.ts src/cli/competitor-mention-removal.test.ts src/drivers/vault-driver-removal.test.ts src/kernel/errors.registry.test.ts src/upgrade/codemods.test.ts scripts/publish.gate.test.ts",
131
132
  "dev": "bun run --cwd site dev",
132
133
  "site:build": "bun run --cwd site build",
@@ -138,39 +139,40 @@
138
139
  "postinstall": "bun run --cwd examples/keel prepare"
139
140
  },
140
141
  "dependencies": {
141
- "@clack/prompts": "^1.7.0",
142
- "@tanstack/react-virtual": "^3.14.9",
143
- "intl-messageformat": "^11.2.13",
144
- "sently": "1.2.1"
142
+ "@clack/prompts": "^1.8.0",
143
+ "@tanstack/react-virtual": "^3.14.11",
144
+ "intl-messageformat": "^11.2.14",
145
+ "oxc-parser": "^0.149.0",
146
+ "sently": "1.2.2"
145
147
  },
146
148
  "devDependencies": {
147
- "@base-ui/react": "^1.6.0",
148
- "@codemirror/commands": "^6.10.4",
149
+ "@base-ui/react": "^1.8.0",
150
+ "@codemirror/commands": "^6.11.0",
149
151
  "@codemirror/lang-json": "^6.0.2",
150
- "@codemirror/state": "^6.7.1",
152
+ "@codemirror/state": "^6.7.4",
151
153
  "@codemirror/theme-one-dark": "^6.1.3",
152
- "@codemirror/view": "^6.43.7",
154
+ "@codemirror/view": "^6.43.11",
153
155
  "@dagrejs/dagre": "^3.1.1",
154
- "@duckdb/node-api": "^1.5.5-r.2",
155
- "@electric-sql/pglite": "^0.5.4",
156
- "@electric-sql/pglite-pgvector": "^0.0.5",
157
- "@hugeicons/core-free-icons": "^4.2.3",
158
- "@hugeicons/react": "^1.1.5",
156
+ "@duckdb/node-api": "^1.5.5-r.4",
157
+ "@electric-sql/pglite": "^0.5.8",
158
+ "@electric-sql/pglite-pgvector": "^0.0.9",
159
+ "@hugeicons/core-free-icons": "^4.3.2",
160
+ "@hugeicons/react": "^1.1.10",
159
161
  "@number-flow/react": "^0.6.2",
160
- "@oxc-project/types": "^0.142.0",
161
- "@playwright/test": "^1.62.1",
162
+ "@oxc-project/types": "^0.149.0",
163
+ "@playwright/test": "^1.63.0",
162
164
  "@sinclair/typebox": "^0.34.52",
163
165
  "@tailwindcss/vite": "^4.3.3",
164
- "@tanstack/react-form": "^1.28.0",
166
+ "@tanstack/react-form": "^1.33.5",
165
167
  "@tanstack/react-hotkeys": "^0.10.0",
166
- "@tanstack/react-query": "^5.101.4",
167
- "@tanstack/react-router": "^1.170.18",
168
- "@tanstack/react-table": "^8.21.3",
168
+ "@tanstack/react-query": "^5.102.8",
169
+ "@tanstack/react-router": "^1.170.34",
170
+ "@tanstack/react-table": "^9.2.4",
169
171
  "@types/bun": "latest",
170
172
  "@types/d3-array": "^3.2.2",
171
- "@types/d3-shape": "^3.1.8",
172
- "@types/react": "^19.2.18",
173
- "@types/react-dom": "^19.2.4",
173
+ "@types/d3-shape": "^3.2.0",
174
+ "@types/react": "^19.3.0",
175
+ "@types/react-dom": "^19.3.0",
174
176
  "@visx/curve": "4.0.1-alpha.0",
175
177
  "@visx/event": "4.0.1-alpha.0",
176
178
  "@visx/gradient": "4.0.1-alpha.0",
@@ -178,43 +180,42 @@
178
180
  "@visx/responsive": "4.0.1-alpha.0",
179
181
  "@visx/scale": "4.0.1-alpha.0",
180
182
  "@visx/shape": "4.0.1-alpha.0",
181
- "@vitejs/plugin-react": "^6.0.5",
182
- "@xyflow/react": "^12.10.0",
183
+ "@vitejs/plugin-react": "^6.1.1",
184
+ "@xyflow/react": "^12.11.6",
183
185
  "ajv": "^8.20.0",
184
186
  "ajv-formats": "^3.0.1",
185
187
  "arktype": "^2.2.3",
186
- "axe-core": "^4.12.1",
188
+ "axe-core": "^4.13.0",
187
189
  "class-variance-authority": "^0.7.1",
188
190
  "clsx": "^2.1.1",
189
191
  "d3-array": "^3.2.4",
190
192
  "d3-shape": "^3.2.0",
191
- "date-fns": "^4.1.0",
193
+ "date-fns": "^4.4.0",
192
194
  "drizzle-kit": "1.0.0-rc.5-ab785fc",
193
195
  "drizzle-orm": "1.0.0-rc.5-169397b",
194
196
  "drizzle-seed": "^0.3.1",
195
197
  "gflows": "^1.2.1",
196
- "happy-dom": "^20.11.1",
198
+ "happy-dom": "^20.14.3",
197
199
  "hast-util-to-jsx-runtime": "^2.3.6",
198
- "mermaid": "^11.16.0",
199
- "motion": "^13.1.0",
200
- "nuqs": "^2.8.0",
201
- "oxc-parser": "^0.142.0",
202
- "oxfmt": "^0.61.0",
203
- "oxlint": "^1.76.0",
200
+ "mermaid": "^11.17.2",
201
+ "motion": "^13.2.0",
202
+ "nuqs": "^2.10.1",
203
+ "oxfmt": "^0.67.0",
204
+ "oxlint": "^1.82.0",
204
205
  "oxlint-tsgolint": "^7.0.2001",
205
- "playwright": "^1.62.1",
206
- "react": "^19.2.8",
207
- "react-dom": "^19.2.8",
208
- "react-resizable-panels": "^4.12.2",
209
- "shadcn": "^3.8.0",
210
- "shiki": "^3.22.0",
211
- "tailwind-merge": "^3.5.0",
206
+ "playwright": "^1.63.0",
207
+ "react": "^19.3.0",
208
+ "react-dom": "^19.3.0",
209
+ "react-resizable-panels": "^4.12.4",
210
+ "shadcn": "^4.21.0",
211
+ "shiki": "^4.4.3",
212
+ "tailwind-merge": "^3.6.0",
212
213
  "tailwindcss": "^4.3.3",
213
214
  "tw-animate-css": "^1.4.0",
214
215
  "typescript": "^7.0.2",
215
- "valibot": "^1.4.2",
216
- "vite": "^8.2.0",
217
- "zod": "^4.4.3"
216
+ "valibot": "^1.5.0",
217
+ "vite": "^8.3.0",
218
+ "zod": "^4.6.1"
218
219
  },
219
220
  "peerDependencies": {
220
221
  "@aws-sdk/client-kms": ">=3.0.0",
@@ -230,7 +231,7 @@
230
231
  "drizzle-kit": ">=1.0.0-rc.0",
231
232
  "drizzle-orm": ">=1.0.0-rc.0",
232
233
  "drizzle-seed": ">=0.3.0",
233
- "oxc-parser": ">=0.140.0",
234
+ "react": ">=18.0.0",
234
235
  "zod": ">=3.23.0"
235
236
  },
236
237
  "peerDependenciesMeta": {
@@ -264,6 +265,9 @@
264
265
  "ajv-formats": {
265
266
  "optional": true
266
267
  },
268
+ "react": {
269
+ "optional": true
270
+ },
267
271
  "drizzle-kit": {
268
272
  "optional": true
269
273
  },
@@ -273,18 +277,15 @@
273
277
  "drizzle-seed": {
274
278
  "optional": true
275
279
  },
276
- "oxc-parser": {
277
- "optional": true
278
- },
279
280
  "zod": {
280
281
  "optional": true
281
282
  }
282
283
  },
283
284
  "optionalDependencies": {
284
285
  "ink": "^6.0.0",
285
- "react": "^19.2.8"
286
+ "react": "^19.3.0"
286
287
  },
287
288
  "engines": {
288
- "bun": ">=1.4.0"
289
+ "bun": ">=1.4.2"
289
290
  }
290
291
  }
@@ -40,7 +40,7 @@ The homepage **Onboard AI** button copies a one-line prompt that points an agent
40
40
  HTML docs pages advertise `rel="alternate"` `type="text/markdown"` to the twin.
41
41
  `Accept: text/markdown` on the same URL returns that twin and sets `Vary: Accept`.
42
42
 
43
- `/llms.txt` opens with **When to use this** — Introduction, Installation, AGENTS.md,
43
+ `/llms.txt` opens with **When to use this** — The Problem, The Model, AGENTS.md,
44
44
  MCP, CLI, errors, npm, GitHub — then the curated map.
45
45
 
46
46
  Crawlers that honor `robots.txt` are allowed; `/sitemap.xml` lists the handbook and the machine entry points.
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "title": "AI Resources",
3
3
  "icon": "Bot",
4
- "pages": ["index", "mcp", "skills", "llms-txt"]
4
+ "pages": ["try-it", "index", "mcp", "skills", "llms-txt"]
5
5
  }
@@ -18,6 +18,9 @@ Tools alone don't make a good operator — an agent also needs to know the _voca
18
18
  | **Deps skill** | `.agents/skills/oke-deps/` | Updating `package.json` dependencies | Scoped bumps, Bun install, pins (Drizzle RC, fumadocs alias, …) |
19
19
  | **Images skill** | `.agents/skills/oke-images/` | Updating Compose image pins | Registry probe, pin style, catalog + recipes + Keel + docs lockstep |
20
20
 
21
+ Contributor-only skills in the same tree (not required for app authors):
22
+ `oke-ci`, `oke-docs-update`, `oke-docs-visuals`, `oke-console-style`.
23
+
21
24
  ## AGENTS.md — the root contract
22
25
 
23
26
  Every OKE app's repo carries an `AGENTS.md` that agents (Cursor, Claude Code, and peers) read at session start. It is deliberately short and absolute: every backend behavior is a Flow (`on(Trigger) → Effects`), there are eight elements bound to one contract, all world access goes through `fx`, drivers are named after protocols, and the ports/budgets are fixed. Its closing rule is the one that keeps agents honest: **if the documentation is silent, stop and ask** — never invent the API.
@@ -43,7 +46,7 @@ Contracts teach the _vocabulary_; [MCP](/docs/ai/mcp) grants the _hands_. An age
43
46
  ## Learn more
44
47
 
45
48
  - [MCP](/docs/ai/mcp) — the runtime surface these contracts pair with
46
- - [Introduction](/docs/get-started/introduction) — the eight elements in human terms
49
+ - [The Model](/docs/understand/the-model) — the eight elements in human terms
47
50
  - [llms.txt](/docs/ai/llms-txt) — `/llms.txt`, `/llms.json`, `/llms/agents`, per-page markdown
48
51
 
49
52
  ## Next
@@ -0,0 +1,58 @@
1
+ ---
2
+ title: "Try It"
3
+ description: "From an empty folder to a Flow running in the Console — one sitting, minimal detour."
4
+ icon: "Terminal"
5
+ ---
6
+
7
+ ## What you need
8
+
9
+ Bun ≥ 1.4.2, and Docker running. `oke dev` starts everything else — Postgres, Redis, mail — for you.
10
+
11
+ ```bash
12
+ bun --version
13
+ docker info
14
+ ```
15
+
16
+ ## Scaffold and run
17
+
18
+ ```bash
19
+ bunx create-oke@latest my-app
20
+ cd my-app
21
+ oke dev
22
+ ```
23
+
24
+ Open the Console at the address printed in the terminal and claim it with the code shown there. The Flows listed weren't configured anywhere — they were derived from the code you just scaffolded.
25
+
26
+ ## Call it
27
+
28
+ The starter ships a health Flow. Call it from a typed client, the same way your frontend would:
29
+
30
+ ```typescript
31
+ import { createClient } from "okengine/client";
32
+ import type { App } from "./app";
33
+
34
+ const api = createClient<App>("http://localhost:6530");
35
+ const { data, error } = await api.main.health({});
36
+ ```
37
+
38
+ `data` and `error` are inferred straight from the Flow you just ran — not from a separate schema you maintain by hand.
39
+
40
+ ## Prove it, don't just believe it
41
+
42
+ ```typescript
43
+ test("boots — health flow", async () => {
44
+ const t = await createTestApp(app);
45
+ const { data } = await t.api.main.health({});
46
+ expect(data).toEqual({ ok: true });
47
+ });
48
+ ```
49
+
50
+ ```bash
51
+ bun test
52
+ ```
53
+
54
+ No mocked HTTP server, no real clock, no live mail provider. `createTestApp` swaps every driver behind `fx` for a deterministic one — because effects were never allowed to happen any other way.
55
+
56
+ ## Where this goes next
57
+
58
+ If this went smoothly, the next page is the honest one: what's solid today, what's still moving, and who this is actually ready for right now.
@@ -0,0 +1,208 @@
1
+ ---
2
+ title: "Auth"
3
+ description: "createClient({ auth }) → api.auth — cookie-first, authorize/Can UI-only, Gate remains real authz."
4
+ icon: "Lock"
5
+ source: "docs/spec/unified-theory.md"
6
+ ---
7
+
8
+ `createClient(url, { auth })` attaches `api.auth` — session orchestration over the same `/auth/*`
9
+ Flows. Prefer that one call. `createAuthClient` + `bind` stays as a compose escape hatch.
10
+
11
+ For storefronts and SPAs attaching identity to typed calls.
12
+
13
+ <Callout title="The one rule">
14
+ Gate on Flows is real authorization. `authorize` / `hasScope` / `Can` are **UI-only**. Cookie mode
15
+ needs the `csrf` plugin (server soft-requires it when `gate.auth.cookies.enabled`); never persist
16
+ tokens to Storage when cookies own the session.
17
+ </Callout>
18
+
19
+ ## Smallest Example
20
+
21
+ <Steps>
22
+
23
+ <Step>
24
+ ### One `createClient` with session auth
25
+
26
+ ```typescript title="web/src/api.ts"
27
+ import { createClient } from "okengine/client";
28
+ import { vault } from "okengine/vault";
29
+ import { app } from "../../src/app";
30
+
31
+ export const api = createClient(app, vault.env("PUBLIC_API_URL") ?? "", {
32
+ auth: { mode: "cookie", csrfConfigured: true },
33
+ });
34
+ ```
35
+
36
+ `api.auth` is an `AuthClient`. Unit Flows remain reachable (`api.auth.me`, …) under the same
37
+ namespace.
38
+
39
+ </Step>
40
+
41
+ <Step>
42
+ ### Sign in and authorize chrome
43
+
44
+ ```typescript
45
+ const result = await api.auth.signIn.email({ email: "alex@acme.co", password });
46
+ if (!result.ok) {
47
+ if (result.twoFactor) {
48
+ await api.auth.completeChallenge({
49
+ challengeId: result.twoFactor.challengeId,
50
+ code: totp,
51
+ });
52
+ }
53
+ return;
54
+ }
55
+
56
+ const gate = api.auth.authorize({ all: ["orders:write"] });
57
+ if (gate.status === "allowed") showFulfillment();
58
+ await api.auth.signOut();
59
+ ```
60
+
61
+ </Step>
62
+
63
+ </Steps>
64
+
65
+ ## Progressive Patterns
66
+
67
+ <Tabs items={["Authorize", "Cookie mode", "SSR", "Methods", "Escape hatch"]}>
68
+
69
+ <Tab value="Authorize">
70
+
71
+ ```typescript
72
+ const gate = api.auth.authorize({ all: ["orders:write"] });
73
+ // or: api.auth.authorize({ any: ["orders:write", "admin"] })
74
+
75
+ if (gate.status === "unauthenticated") redirectToSignIn();
76
+ if (gate.status === "loading") return;
77
+ if (gate.status === "denied") showMissing(gate.missing);
78
+ // gate.status === "allowed"
79
+ ```
80
+
81
+ React: `<Can auth={api.auth} all={["orders:write"]} fallback={<Denied />}>`. Prefer
82
+ `authorize` / `Can` over bare `hasScope`. On server `Forbidden`, use `isForbidden` /
83
+ `forbiddenScopes` and refresh `getSession()` if scopes look stale.
84
+
85
+ </Tab>
86
+
87
+ <Tab value="Cookie mode">
88
+
89
+ When `gate.auth.cookies.enabled`, prefer HttpOnly cookies:
90
+
91
+ ```typescript
92
+ export const api = createClient(app, base, {
93
+ auth: { mode: "cookie", csrfConfigured: true },
94
+ });
95
+ ```
96
+
97
+ Install `csrf({ allowNoHeader: false })`. Cross-origin also needs
98
+ `cors({ origin: [...], credentials: true })`. Prod boots **refuse** without `csrf` when cookies
99
+ are on; dev/test warn.
100
+
101
+ </Tab>
102
+
103
+ <Tab value="SSR">
104
+
105
+ ```typescript
106
+ import { createClient } from "okengine/client";
107
+ import { tokenFromRequestCookies, createServerClient } from "okengine/client/auth";
108
+
109
+ // Explicit
110
+ const api = createClient(base, {
111
+ credentials: "include",
112
+ auth: {
113
+ mode: "cookie",
114
+ getToken: () => tokenFromRequestCookies(req),
115
+ },
116
+ });
117
+
118
+ // Or the thin wrapper (same createClient)
119
+ const api2 = createServerClient(req, base, { $routes });
120
+ ```
121
+
122
+ </Tab>
123
+
124
+ <Tab value="Methods">
125
+
126
+ ```typescript
127
+ await api.auth.signIn.social({ provider: "google" });
128
+ await api.auth.signIn.passkey({ email });
129
+ await api.auth.signIn.magicLink.request({ email });
130
+ await api.auth.signIn.otp.verify({ email, code });
131
+ await api.auth.signIn.anonymous();
132
+ await api.auth.signUp.email({ email, password, name });
133
+ ```
134
+
135
+ Helpers call existing plugin Flows only — PKCE / WebAuthn UV stay server-side.
136
+
137
+ </Tab>
138
+
139
+ <Tab value="Escape hatch">
140
+
141
+ ```typescript
142
+ import { createClient } from "okengine/client";
143
+ import { createAuthClient } from "okengine/client/auth";
144
+
145
+ const shell = createClient(app, base);
146
+ const auth = createAuthClient(shell, { mode: "bearer", persist: "memory" });
147
+ const api = createClient(app, base, { ...auth.clientOptions });
148
+ auth.bind(api);
149
+ ```
150
+
151
+ </Tab>
152
+
153
+ </Tabs>
154
+
155
+ ## Helpers
156
+
157
+ | Helper | Package | Role |
158
+ | ------------------------------------------------ | ----------------------- | -------------------------------- |
159
+ | `createClient({ auth })` | `okengine/client` | Happy path — attaches `api.auth` |
160
+ | `createAuthClient` | `okengine/client/auth` | Compose / bind escape hatch |
161
+ | `tokenFromRequestCookies` / `createServerClient` | same | SSR cookie → token |
162
+ | `authorize` / `hasScope` / `can` | on `AuthClient` | UI-only chrome |
163
+ | `isUnauthorized` / `isCsrf` / `forbiddenScopes` | same | Envelope narrowers |
164
+ | `useSession` / `useAuthorize` / `Can` | `okengine/client-react` | React session + chrome |
165
+
166
+ ## Denial codes
167
+
168
+ | Code | HTTP | Typical fix |
169
+ | -------------- | ---- | ---------------------------------------------- |
170
+ | `Unauthorized` | 401 | Sign in or refresh; re-login if still denied |
171
+ | `Forbidden` | 403 | Wrong scopes / CSRF — read `error.data.reason` |
172
+ | `RateLimited` | 429 | Wait `retryAfterMs` |
173
+
174
+ Also see [CORS](/docs/plugins/cors) and [CSRF](/docs/plugins/csrf). Advanced create-oke starter
175
+ demos cookie + passkey + `<Can>`.
176
+
177
+ ## Troubleshooting
178
+
179
+ <Accordions>
180
+
181
+ <Accordion title="Cookie mode warns about CSRF / prod refuses boot">
182
+ Plug `csrf({ allowNoHeader: false })` when `gate.auth.cookies.enabled`. Set
183
+ `csrfConfigured: true` on the client only after the plugin is installed.
184
+ </Accordion>
185
+
186
+ <Accordion title="authorize allowed but Flow returns Forbidden">
187
+ Expected — client authorize is UI-only. Add `gate.scope` / `gate.policy` on the Flow.
188
+ </Accordion>
189
+
190
+ <Accordion title="localStorage warning">
191
+ Prefer cookie mode or memory / `sessionStorage`. XSS can read Storage until family revoke.
192
+ </Accordion>
193
+
194
+ </Accordions>
195
+
196
+ ## Learn more
197
+
198
+ - [Calling](/docs/client/calling) — envelopes, binary `{ response: "blob" }`, REST
199
+ - [React](/docs/client/react) — `useSession` / `Can` / `useAuthorize`
200
+ - [Gate · Auth](/docs/elements/gate/auth) — server cookies and scopes
201
+
202
+ ## Next
203
+
204
+ <Cards>
205
+ <Card title="Live" href="/docs/client/live" />
206
+ <Card title="React" href="/docs/client/react" />
207
+ <Card title="Gate Auth" href="/docs/elements/gate/auth" />
208
+ </Cards>