okengine 0.18.4 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. package/AGENTS.md +18 -10
  2. package/README.md +2 -2
  3. package/package.json +51 -50
  4. package/site/content/docs/ai/index.mdx +25 -6
  5. package/site/content/docs/ai/llms-txt.mdx +1 -1
  6. package/site/content/docs/ai/meta.json +1 -1
  7. package/site/content/docs/ai/skills.mdx +4 -1
  8. package/site/content/docs/ai/try-it.mdx +58 -0
  9. package/site/content/docs/client/auth.mdx +208 -0
  10. package/site/content/docs/client/calling.mdx +451 -0
  11. package/site/content/docs/client/index.mdx +209 -0
  12. package/site/content/docs/client/live.mdx +234 -0
  13. package/site/content/docs/client/meta.json +5 -0
  14. package/site/content/docs/client/react.mdx +249 -0
  15. package/site/content/docs/elements/ai/agents.mdx +232 -0
  16. package/site/content/docs/elements/ai/index.mdx +341 -0
  17. package/site/content/docs/elements/ai/mcp.mdx +275 -0
  18. package/site/content/docs/elements/ai/meta.json +5 -0
  19. package/site/content/docs/elements/ai/models.mdx +283 -0
  20. package/site/content/docs/elements/ai/prompts.mdx +256 -0
  21. package/site/content/docs/elements/channel/email.mdx +266 -0
  22. package/site/content/docs/elements/channel/index.mdx +344 -0
  23. package/site/content/docs/elements/channel/meta.json +5 -0
  24. package/site/content/docs/elements/channel/push.mdx +218 -0
  25. package/site/content/docs/elements/channel/receipts.mdx +206 -0
  26. package/site/content/docs/elements/channel/sms.mdx +264 -0
  27. package/site/content/docs/elements/channel/whatsapp.mdx +220 -0
  28. package/site/content/docs/elements/clock/index.mdx +300 -0
  29. package/site/content/docs/elements/clock/meta.json +5 -0
  30. package/site/content/docs/elements/clock/schedules.mdx +508 -0
  31. package/site/content/docs/elements/clock/sleep.mdx +445 -0
  32. package/site/content/docs/elements/flow/consumers.mdx +707 -0
  33. package/site/content/docs/elements/flow/http.mdx +1080 -0
  34. package/site/content/docs/elements/flow/index.mdx +618 -0
  35. package/site/content/docs/elements/flow/meta.json +5 -0
  36. package/site/content/docs/elements/flow/routing.mdx +559 -0
  37. package/site/content/docs/elements/flow/workflows.mdx +640 -0
  38. package/site/content/docs/elements/gate/auth.mdx +371 -0
  39. package/site/content/docs/elements/gate/authorization.mdx +298 -0
  40. package/site/content/docs/elements/gate/index.mdx +418 -0
  41. package/site/content/docs/elements/gate/meta.json +5 -0
  42. package/site/content/docs/elements/gate/rate-limits.mdx +365 -0
  43. package/site/content/docs/elements/gate/rls.mdx +303 -0
  44. package/site/content/docs/elements/gate/tenancy.mdx +372 -0
  45. package/site/content/docs/elements/index.mdx +52 -11
  46. package/site/content/docs/elements/signal/broadcast.mdx +517 -0
  47. package/site/content/docs/elements/signal/index.mdx +352 -0
  48. package/site/content/docs/elements/signal/live.mdx +590 -0
  49. package/site/content/docs/elements/signal/meta.json +5 -0
  50. package/site/content/docs/elements/signal/once.mdx +596 -0
  51. package/site/content/docs/elements/store/files.mdx +659 -0
  52. package/site/content/docs/elements/store/index.mdx +310 -0
  53. package/site/content/docs/elements/store/kv.mdx +629 -0
  54. package/site/content/docs/elements/store/meta.json +5 -0
  55. package/site/content/docs/elements/store/search.mdx +946 -0
  56. package/site/content/docs/elements/store/sql.mdx +937 -0
  57. package/site/content/docs/elements/vault/config.mdx +256 -0
  58. package/site/content/docs/elements/vault/index.mdx +356 -0
  59. package/site/content/docs/elements/vault/meta.json +5 -0
  60. package/site/content/docs/elements/vault/rotation.mdx +273 -0
  61. package/site/content/docs/elements/vault/secrets.mdx +285 -0
  62. package/site/content/docs/index.mdx +78 -30
  63. package/site/content/docs/meta.json +11 -8
  64. package/site/content/docs/plugins/cors.mdx +2 -1
  65. package/site/content/docs/plugins/csrf.mdx +4 -1
  66. package/site/content/docs/plugins/headers.mdx +2 -1
  67. package/site/content/docs/plugins/ip-allowlist.mdx +2 -1
  68. package/site/content/docs/plugins/magic-link.mdx +6 -0
  69. package/site/content/docs/plugins/maintenance-mode.mdx +2 -1
  70. package/site/content/docs/plugins/oauth.mdx +1 -1
  71. package/site/content/docs/plugins/otp.mdx +12 -1
  72. package/site/content/docs/plugins/passkey.mdx +39 -15
  73. package/site/content/docs/plugins/two-factor.mdx +91 -34
  74. package/site/content/docs/plugins/username.mdx +1 -1
  75. package/site/content/docs/recipes/caddy.mdx +3 -3
  76. package/site/content/docs/recipes/index.mdx +18 -28
  77. package/site/content/docs/recipes/mailpit.mdx +1 -1
  78. package/site/content/docs/recipes/meilisearch.mdx +3 -3
  79. package/site/content/docs/recipes/meta.json +1 -4
  80. package/site/content/docs/recipes/nginx.mdx +2 -2
  81. package/site/content/docs/recipes/openrouter.mdx +283 -0
  82. package/site/content/docs/recipes/pgdog.mdx +3 -3
  83. package/site/content/docs/recipes/postgres.mdx +1 -2
  84. package/site/content/docs/recipes/rustfs.mdx +2 -2
  85. package/site/content/docs/recipes/traefik.mdx +3 -3
  86. package/site/content/docs/reference/cli.mdx +231 -0
  87. package/site/content/docs/reference/configuration.mdx +30 -10
  88. package/site/content/docs/reference/environment-variables.mdx +93 -20
  89. package/site/content/docs/reference/errors.mdx +132 -29
  90. package/site/content/docs/reference/fx.mdx +137 -73
  91. package/site/content/docs/reference/index.mdx +13 -21
  92. package/site/content/docs/reference/meta.json +4 -5
  93. package/site/content/docs/reference/okid.mdx +42 -17
  94. package/site/content/docs/reference/plugins.mdx +4 -3
  95. package/site/content/docs/reference/security.mdx +197 -0
  96. package/site/content/docs/understand/meta.json +5 -0
  97. package/site/content/docs/understand/the-anatomy.mdx +132 -0
  98. package/site/content/docs/understand/the-model.mdx +32 -0
  99. package/site/content/docs/understand/the-problem.mdx +74 -0
  100. package/site/content/docs/understand/the-vocabulary.mdx +26 -0
  101. package/src/auth/api-keys.ts +2 -1
  102. package/src/auth/bindings.ts +64 -16
  103. package/src/auth/gate-auth.test.ts +6 -1
  104. package/src/auth/identity.ts +152 -5
  105. package/src/auth/index.ts +29 -0
  106. package/src/auth/invites.ts +2 -1
  107. package/src/auth/method-context.ts +41 -0
  108. package/src/auth/oauth-as/crypto.ts +2 -1
  109. package/src/auth/oauth-as/stores.ts +2 -1
  110. package/src/auth/operator.ts +2 -1
  111. package/src/auth/sessions-jwt.test.ts +77 -0
  112. package/src/auth/sessions.ts +20 -4
  113. package/src/auth/tenants.ts +3 -2
  114. package/src/auth/two-factor-challenge.test.ts +61 -0
  115. package/src/auth/two-factor-challenge.ts +284 -0
  116. package/src/auth/verification.ts +5 -0
  117. package/src/bench/REPORT.md +49 -0
  118. package/src/bench/g03-signal-once.bench.ts +1 -1
  119. package/src/bench/g10-observability-contention.bench.ts +1 -1
  120. package/src/bench/g17-hybrid-search.bench.ts +572 -0
  121. package/src/bench/load-app.ts +2 -10
  122. package/src/cli/ai-setup/ai-setup.test.ts +331 -42
  123. package/src/cli/ai-setup/apply.ts +294 -52
  124. package/src/cli/ai-setup/catalog.ts +238 -1342
  125. package/src/cli/ai-setup/index.ts +14 -99
  126. package/src/cli/ai-setup/prompts.ts +60 -443
  127. package/src/cli/ask-seed.test.ts +96 -0
  128. package/src/cli/ask-seed.ts +82 -0
  129. package/src/cli/ask-vault-gaps.test.ts +84 -0
  130. package/src/cli/ask-vault-gaps.ts +146 -0
  131. package/src/cli/build.ts +2 -2
  132. package/src/cli/client-add.test.ts +26 -1
  133. package/src/cli/client-add.ts +106 -27
  134. package/src/cli/competitor-mention-removal.test.ts +1 -1
  135. package/src/cli/db-seed.ts +2 -0
  136. package/src/cli/db.ts +150 -11
  137. package/src/cli/dev.ts +119 -211
  138. package/src/cli/docker-clean.ts +2 -2
  139. package/src/cli/docker-cli.test.ts +1 -1
  140. package/src/cli/doctor-diff.ts +4 -2
  141. package/src/cli/doctor-pii.test.ts +1 -1
  142. package/src/cli/doctor.ts +14 -1
  143. package/src/cli/hero-meta.test.ts +4 -2
  144. package/src/cli/load-config.images.test.ts +8 -10
  145. package/src/cli/load-config.ts +1 -1
  146. package/src/cli/registry.ts +22 -10
  147. package/src/cli/replay.ts +3 -1
  148. package/src/cli/start.ts +1 -1
  149. package/src/cli/tui/keys.ts +2 -3
  150. package/src/client/auth/cookies.ts +74 -0
  151. package/src/client/auth/create-auth-client.ts +636 -0
  152. package/src/client/auth/denials.ts +99 -0
  153. package/src/client/auth/session.ts +283 -0
  154. package/src/client/auth.test.ts +251 -0
  155. package/src/client/auth.ts +39 -114
  156. package/src/client/create-with-session.ts +245 -0
  157. package/src/client/create.ts +51 -5
  158. package/src/client/index.ts +11 -1
  159. package/src/client/live.ts +11 -79
  160. package/src/client/notes-contract.test.ts +5 -10
  161. package/src/client/sse.ts +137 -0
  162. package/src/client/stream.ts +147 -0
  163. package/src/client/transport.test.ts +32 -0
  164. package/src/client/transport.ts +123 -26
  165. package/src/client/types.ts +118 -14
  166. package/src/client-react/index.ts +185 -24
  167. package/src/client-react/use-live-query.ts +13 -3
  168. package/src/compiler/aot.test.ts +7 -4
  169. package/src/compiler/effects-embed.test.ts +56 -0
  170. package/src/compiler/effects-fetch.test.ts +43 -0
  171. package/src/compiler/effects-infer.ts +58 -2
  172. package/src/compiler/extract.test.ts +258 -44
  173. package/src/compiler/extract.ts +566 -48
  174. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -4
  175. package/src/compiler/fixtures/skyport/src/flows/bookings/signals.ts +2 -8
  176. package/src/compiler/fixtures/skyport.expected.json +4 -4
  177. package/src/compiler/fixtures/triggers/five-triggers.ts +14 -10
  178. package/src/compiler/response.ts +2 -2
  179. package/src/compiler/search-writer-isolation.test.ts +40 -0
  180. package/src/config/index.ts +11 -0
  181. package/src/console/server/app.ts +17 -23
  182. package/src/console/server/bind.ts +4 -0
  183. package/src/console/server/console.test.ts +2 -2
  184. package/src/console/server/flows-invoke.test.ts +50 -34
  185. package/src/console/server/flows.ts +436 -255
  186. package/src/console/server/runs-ingest.test.ts +6 -3
  187. package/src/console/server/serve.ts +1 -1
  188. package/src/console/server/signals.test.ts +1 -5
  189. package/src/console/server/signals.ts +8 -6
  190. package/src/console/server/state.ts +6 -1
  191. package/src/console/server/store.ts +1 -1
  192. package/src/console/ui-next/dist/assets/FileExportIcon-Ck-5od4R.js +1 -0
  193. package/src/console/ui-next/dist/assets/MoreHorizontalCircle01Icon-gMNGsE37.js +1 -0
  194. package/src/console/ui-next/dist/assets/PlusSignIcon-CwG3nxfu.js +1 -0
  195. package/src/console/ui-next/dist/assets/UnavailableIcon-D9cvHVPr.js +1 -0
  196. package/src/console/ui-next/dist/assets/UserIcon-DaE2PB5_.js +1 -0
  197. package/src/console/ui-next/dist/assets/access-page-DFeymU07.js +4 -0
  198. package/src/console/ui-next/dist/assets/agent-disclosure-U1rdfblp.js +1 -0
  199. package/src/console/ui-next/dist/assets/cache-glyph-BeFJeqBG.js +1 -0
  200. package/src/console/ui-next/dist/assets/call-pii-button-CVAONPii.js +1 -0
  201. package/src/console/ui-next/dist/assets/collapsible-D2A6NJ-3.js +1 -0
  202. package/src/console/ui-next/dist/assets/copy-inline-button-CAYD18cr.js +1 -0
  203. package/src/console/ui-next/dist/assets/dagre.esm-B1_XeuLP.js +1 -0
  204. package/src/console/ui-next/dist/assets/detail-header-DVWNjWjg.js +1 -0
  205. package/src/console/ui-next/dist/assets/dropdown-menu-4h2LOVXM.js +1 -0
  206. package/src/console/ui-next/dist/assets/duration-tone-Cgk_h5ja.js +9 -0
  207. package/src/console/ui-next/dist/assets/element-icons-BI8cJgdh.js +1 -0
  208. package/src/console/ui-next/dist/assets/explorer-empty-CJs5A-wm.js +1 -0
  209. package/src/console/ui-next/dist/assets/flows-page-Dss7941e.js +1 -0
  210. package/src/console/ui-next/dist/assets/highlighted-json-MYZQtRnw.js +154 -0
  211. package/src/console/ui-next/dist/assets/http-method-Jrh39p7A.js +1 -0
  212. package/src/console/ui-next/dist/assets/index-D0zS5rKO.css +2 -0
  213. package/src/console/ui-next/dist/assets/index-DXP2dBIF.js +63 -0
  214. package/src/console/ui-next/dist/assets/observability-page-HvolXxTI.js +4 -0
  215. package/src/console/ui-next/dist/assets/react-dom-Ddte4I-Q.js +9 -0
  216. package/src/console/ui-next/dist/assets/replica-lag-CSh2dzrb.js +18 -0
  217. package/src/console/ui-next/dist/assets/request-meta-BatF8KrK.js +1 -0
  218. package/src/console/ui-next/dist/assets/shortcut-keys-3ILd8oGn.js +1 -0
  219. package/src/console/ui-next/dist/assets/{sql-BskegiFM.js → sql-BsFa4tDR.js} +1 -1
  220. package/src/console/ui-next/dist/assets/store-page-eiKiHnNe.js +41 -0
  221. package/src/console/ui-next/dist/assets/trace-detail-sheet-CZkMeKS-.js +2 -0
  222. package/src/console/ui-next/dist/assets/tree-expand-toggle-CW8y5A2h.js +55 -0
  223. package/src/console/ui-next/dist/assets/units-page-B_RWJrEO.js +1 -0
  224. package/src/console/ui-next/dist/assets/{use-vault-list-uk4WVboC.js → use-vault-list-CT4-gajj.js} +1 -1
  225. package/src/console/ui-next/dist/assets/vault-page-CWrg-A68.js +2 -0
  226. package/src/console/ui-next/dist/assets/xyflow-CSyC6ryz.css +1 -0
  227. package/src/console/ui-next/dist/assets/xyflow-yApv7D4e.js +7 -0
  228. package/src/console/ui-next/dist/index.html +6 -13
  229. package/src/console/ui-next/seed-invoke-host.ts +21 -18
  230. package/src/console/ui-next/src/client.ts +7 -2
  231. package/src/console/ui-next/src/features/flows/graph/element-map.ts +2 -0
  232. package/src/console/ui-next/src/features/flows/traces/effect-kind.ts +12 -2
  233. package/src/console/ui-next/src/features/flows/traces/effect-summary.ts +4 -0
  234. package/src/console/ui-next/src/features/flows/traces/trace-detail-sheet.tsx +8 -0
  235. package/src/console/ui-next/src/features/flows/traces/waterfall-bars.ts +4 -0
  236. package/src/console/ui-next/src/features/flows/traces/waterfall-tooltip.ts +9 -3
  237. package/src/console/ui-next/src/features/store/detail/reveal-cell.tsx +7 -11
  238. package/src/console/ui-next/src/features/store/detail/store-row-detail-sheet.tsx +2 -2
  239. package/src/console/ui-next/src/features/store/lib/fields-from-table.ts +2 -0
  240. package/src/console/ui-next/src/features/store/lib/grid-model.test.ts +25 -1
  241. package/src/console/ui-next/src/features/store/lib/grid-model.ts +36 -1
  242. package/src/console/ui-next/src/features/store/query/query-results.tsx +3 -3
  243. package/src/console/ui-next/src/features/units/detail/effects-summary.tsx +2 -0
  244. package/src/console/ui-next/src/features/units/lib/call-read-safe.ts +3 -1
  245. package/src/console/ui-next/src/features/units/lib/fields-from-schema.ts +6 -0
  246. package/src/docker/ai-model-status.test.ts +1 -12
  247. package/src/docker/ai-model-status.ts +10 -38
  248. package/src/docker/compose-up.test.ts +100 -0
  249. package/src/docker/compose-up.ts +292 -0
  250. package/src/docker/compose.ts +4 -14
  251. package/src/docker/derive.ts +9 -34
  252. package/src/docker/docker.test.ts +16 -261
  253. package/src/docker/images-config.test.ts +13 -25
  254. package/src/docker/index.ts +1 -24
  255. package/src/docker/recipes/index.ts +0 -23
  256. package/src/docker/recipes/pgdog.ts +6 -4
  257. package/src/docker/stack-id.test.ts +2 -2
  258. package/src/docker/stack-id.ts +0 -1
  259. package/src/docker/types.ts +2 -2
  260. package/src/drivers/ai-anthropic.ts +10 -0
  261. package/src/drivers/ai-openai-compatible.ts +34 -7
  262. package/src/drivers/ai-providers.test.ts +0 -107
  263. package/src/drivers/ai-stream.test.ts +0 -34
  264. package/src/drivers/ai-types.ts +17 -8
  265. package/src/drivers/channel-fcm.ts +6 -1
  266. package/src/drivers/channel-msegat.ts +6 -1
  267. package/src/drivers/channel-resend.ts +5 -1
  268. package/src/drivers/channel-smtp.ts +5 -1
  269. package/src/drivers/channel-sndr.ts +10 -1
  270. package/src/drivers/channel-taqnyat-mail.ts +5 -1
  271. package/src/drivers/channel-taqnyat-whatsapp.ts +6 -1
  272. package/src/drivers/channel-taqnyat.ts +6 -1
  273. package/src/drivers/channel-types.ts +10 -0
  274. package/src/drivers/channel-unifonic.ts +6 -1
  275. package/src/drivers/channel-wa-cloud.ts +6 -1
  276. package/src/drivers/channel-webpush.ts +6 -1
  277. package/src/drivers/external.ts +33 -0
  278. package/src/drivers/index.ts +0 -10
  279. package/src/drivers/meilisearch.ts +6 -0
  280. package/src/drivers/oauth-types.ts +4 -0
  281. package/src/drivers/postgres.test.ts +74 -3
  282. package/src/drivers/postgres.ts +175 -6
  283. package/src/drivers/signal-types.ts +5 -5
  284. package/src/drivers/types.ts +7 -0
  285. package/src/drivers/vault-types.ts +5 -0
  286. package/src/elements/ai/declare.ts +17 -4
  287. package/src/elements/ai/eval.ts +1 -1
  288. package/src/elements/ai/mcp-http.ts +1 -1
  289. package/src/elements/ai/pii.ts +1 -1
  290. package/src/elements/ai/providers.test.ts +289 -0
  291. package/src/elements/ai/providers.ts +169 -0
  292. package/src/elements/ai/runtime.ts +68 -5
  293. package/src/elements/ai/schema.ts +2 -2
  294. package/src/elements/ai.test.ts +7 -7
  295. package/src/elements/ai.ts +17 -1
  296. package/src/elements/channel/runtime.ts +105 -12
  297. package/src/elements/clock/cron-fields.test.ts +144 -0
  298. package/src/elements/clock/cron-fields.ts +185 -0
  299. package/src/elements/clock/declare.ts +247 -3
  300. package/src/elements/clock.ts +21 -1
  301. package/src/elements/index.ts +15 -0
  302. package/src/elements/signal/chaos-child.ts +1 -2
  303. package/src/elements/signal/declare.ts +65 -37
  304. package/src/elements/signal/delivery-modes.test.ts +11 -31
  305. package/src/elements/signal/dry-run-replay.test.ts +1 -7
  306. package/src/elements/signal/dry-run-write-isolation.test.ts +1 -7
  307. package/src/elements/signal/key-ordering.test.ts +6 -26
  308. package/src/elements/signal/lease-reclaim.test.ts +2 -6
  309. package/src/elements/signal/optional-emit.test.ts +6 -9
  310. package/src/elements/signal/order-lifecycle.test.ts +4 -17
  311. package/src/elements/signal/orphan-messages.test.ts +4 -15
  312. package/src/elements/signal/reconcile.test.ts +2 -2
  313. package/src/elements/signal/runtime.ts +1 -1
  314. package/src/elements/signal/schema-emit.test.ts +4 -8
  315. package/src/elements/signal.test.ts +24 -49
  316. package/src/elements/signal.ts +9 -2
  317. package/src/elements/store/domain-ddl.test.ts +1 -1
  318. package/src/elements/store/live-http.test.ts +9 -4
  319. package/src/elements/store/prepare-row.test.ts +123 -0
  320. package/src/elements/store/resource.ts +43 -12
  321. package/src/elements/store/schema-decl.ts +117 -0
  322. package/src/elements/store/search-backfill.ts +205 -0
  323. package/src/elements/store/search-bind.ts +66 -0
  324. package/src/elements/store/search-bm25.ts +78 -0
  325. package/src/elements/store/search-ddl.ts +156 -0
  326. package/src/elements/store/search-embed-flow.ts +141 -0
  327. package/src/elements/store/search-errors.ts +34 -0
  328. package/src/elements/store/search-fusion.ts +112 -0
  329. package/src/elements/store/search-lsh.ts +179 -0
  330. package/src/elements/store/search-runtime.ts +300 -0
  331. package/src/elements/store/search.test.ts +144 -0
  332. package/src/elements/store/sql-session.test.ts +1 -0
  333. package/src/elements/store/sql-session.ts +83 -3
  334. package/src/elements/store/table.ts +23 -2
  335. package/src/elements/store/upsert-app.test.ts +1 -3
  336. package/src/elements/store.ts +50 -0
  337. package/src/full.ts +4 -2
  338. package/src/http.ts +4 -1
  339. package/src/i18n/catalogs/ar.ts +14 -6
  340. package/src/i18n/catalogs/en.ts +14 -6
  341. package/src/index.ts +6 -1
  342. package/src/kernel/adopt-barrel-fresh.test.ts +7 -7
  343. package/src/kernel/adopt-routes.ts +9 -1
  344. package/src/kernel/app-auth.ts +5 -0
  345. package/src/kernel/app.ts +102 -9
  346. package/src/kernel/auto-cache.test.ts +6 -12
  347. package/src/kernel/auto-registry.test.ts +3 -3
  348. package/src/kernel/boot-bind/ai.test.ts +22 -19
  349. package/src/kernel/boot-bind/ai.ts +5 -43
  350. package/src/kernel/boot-bind/clock.ts +23 -5
  351. package/src/kernel/boot-bind/honor-config.test.ts +4 -4
  352. package/src/kernel/boot.test.ts +11 -6
  353. package/src/kernel/boot.ts +66 -16
  354. package/src/kernel/boundary-contract.ts +93 -0
  355. package/src/kernel/budget.test.ts +1 -1
  356. package/src/kernel/call.ts +89 -0
  357. package/src/kernel/capability.ts +6 -0
  358. package/src/kernel/client-descriptor.ts +123 -0
  359. package/src/kernel/clock-timezone.test.ts +80 -0
  360. package/src/kernel/correlation.test.ts +1 -1
  361. package/src/kernel/dry-run.ts +11 -8
  362. package/src/kernel/effects-stamping.test.ts +42 -9
  363. package/src/kernel/effects.test.ts +4 -2
  364. package/src/kernel/effects.ts +51 -9
  365. package/src/kernel/errors-channel.ts +17 -0
  366. package/src/kernel/errors-live-resume.ts +3 -2
  367. package/src/kernel/errors-tenant.ts +7 -4
  368. package/src/kernel/errors.registry-helpers.ts +96 -0
  369. package/src/kernel/errors.registry.test.ts +139 -25
  370. package/src/kernel/errors.ts +102 -23
  371. package/src/kernel/external-effects.test.ts +196 -0
  372. package/src/kernel/flow.test.ts +13 -4
  373. package/src/kernel/flow.ts +69 -71
  374. package/src/kernel/fx-ask-telemetry.test.ts +2 -2
  375. package/src/kernel/fx-dead-letters.test.ts +3 -3
  376. package/src/kernel/fx-fetch.ts +55 -0
  377. package/src/kernel/fx-live-stream.ts +2 -2
  378. package/src/kernel/fx-live.test.ts +8 -8
  379. package/src/kernel/fx.test.ts +17 -11
  380. package/src/kernel/fx.ts +180 -57
  381. package/src/kernel/horizontal-child.ts +1 -1
  382. package/src/kernel/http-query.test.ts +3 -6
  383. package/src/kernel/index.ts +13 -3
  384. package/src/kernel/instance-id.ts +1 -1
  385. package/src/kernel/instances.test.ts +40 -0
  386. package/src/kernel/instances.ts +47 -9
  387. package/src/kernel/live-http.test.ts +6 -7
  388. package/src/kernel/live-http.ts +6 -2
  389. package/src/kernel/live-resume.test.ts +1 -1
  390. package/src/kernel/mcp-tool.test.ts +3 -3
  391. package/src/kernel/on.ts +98 -4
  392. package/src/kernel/pipeline.test.ts +12 -15
  393. package/src/kernel/plugin-elements.test.ts +1 -1
  394. package/src/kernel/stamp-http.test.ts +3 -3
  395. package/src/kernel/triggers.ts +210 -95
  396. package/src/kernel-entry.ts +0 -1
  397. package/src/manifest/diff.ts +11 -1
  398. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  399. package/src/manifest/types.ts +46 -2
  400. package/src/mcp/docs-index.ts +3 -3
  401. package/src/mcp/docs-mcp.test.ts +2 -2
  402. package/src/mcp/docs-tools.ts +1 -1
  403. package/src/okid.test.ts +56 -0
  404. package/src/okid.ts +55 -11
  405. package/src/plugins/anonymous.ts +8 -4
  406. package/src/plugins/auth/shared.ts +27 -3
  407. package/src/plugins/auth-delivery.mailpit.integration.test.ts +1 -1
  408. package/src/plugins/auth-methods.security.test.ts +561 -23
  409. package/src/plugins/config-source.ts +1 -1
  410. package/src/plugins/csrf.test.ts +65 -0
  411. package/src/plugins/index.ts +2 -0
  412. package/src/plugins/magic-link.ts +36 -16
  413. package/src/plugins/oauth/shared.ts +3 -1
  414. package/src/plugins/oauth.ts +22 -14
  415. package/src/plugins/otp.ts +37 -21
  416. package/src/plugins/passkey-webauthn.ts +9 -6
  417. package/src/plugins/passkey.ts +98 -26
  418. package/src/plugins/pre-account-hijack.test.ts +223 -0
  419. package/src/plugins/two-factor.ts +466 -37
  420. package/src/plugins/username.ts +19 -7
  421. package/src/release/build-lib.ts +1 -0
  422. package/src/release/limits.ts +2 -2
  423. package/src/release/measure.ts +1 -1
  424. package/src/runs/collect.test.ts +0 -2
  425. package/src/runtime/json-code-block.test.ts +250 -20
  426. package/src/runtime/json-code-block.ts +1261 -41
  427. package/src/term.test.ts +1 -1
  428. package/src/test/create-test-app.test.ts +12 -12
  429. package/src/test/live-signals.test.ts +6 -6
  430. package/src/test/provisions.integration.test.ts +10 -14
  431. package/src/test/reset-element-registries.ts +1 -1
  432. package/src/test/tenant-isolation.test.ts +12 -6
  433. package/site/content/docs/deployment/docker-swarm.mdx +0 -164
  434. package/site/content/docs/deployment/docker.mdx +0 -227
  435. package/site/content/docs/deployment/index.mdx +0 -83
  436. package/site/content/docs/deployment/kubernetes.mdx +0 -176
  437. package/site/content/docs/deployment/meta.json +0 -5
  438. package/site/content/docs/deployment/reverse-proxy.mdx +0 -234
  439. package/site/content/docs/elements/ai.mdx +0 -385
  440. package/site/content/docs/elements/channel.mdx +0 -346
  441. package/site/content/docs/elements/clock.mdx +0 -244
  442. package/site/content/docs/elements/flow.mdx +0 -420
  443. package/site/content/docs/elements/gate.mdx +0 -436
  444. package/site/content/docs/elements/signal.mdx +0 -380
  445. package/site/content/docs/elements/store.mdx +0 -1099
  446. package/site/content/docs/elements/vault.mdx +0 -405
  447. package/site/content/docs/get-started/basic-usage.mdx +0 -173
  448. package/site/content/docs/get-started/index.mdx +0 -43
  449. package/site/content/docs/get-started/installation.mdx +0 -220
  450. package/site/content/docs/get-started/introduction.mdx +0 -132
  451. package/site/content/docs/get-started/meta.json +0 -13
  452. package/site/content/docs/get-started/project-structure.mdx +0 -925
  453. package/site/content/docs/get-started/testing.mdx +0 -328
  454. package/site/content/docs/get-started/why.mdx +0 -162
  455. package/site/content/docs/recipes/llama-cpp.mdx +0 -151
  456. package/site/content/docs/recipes/ollama.mdx +0 -142
  457. package/site/content/docs/recipes/sglang.mdx +0 -105
  458. package/site/content/docs/recipes/vllm.mdx +0 -106
  459. package/site/content/docs/reference/cli.md +0 -232
  460. package/site/content/docs/reference/client.mdx +0 -469
  461. package/site/content/docs/reference/security.md +0 -74
  462. package/src/cli/ai-setup/detect-ollama.ts +0 -213
  463. package/src/cli/ai-setup/recommend.test.ts +0 -225
  464. package/src/cli/ai-setup/recommend.ts +0 -225
  465. package/src/cli/dev-controls.test.ts +0 -122
  466. package/src/cli/dev-controls.ts +0 -164
  467. package/src/cli/tui/DevLive.tsx +0 -126
  468. package/src/console/ui-next/dist/assets/access-page-De7Lc2JC.js +0 -4
  469. package/src/console/ui-next/dist/assets/agent-disclosure-BP0Y0Sux.js +0 -1
  470. package/src/console/ui-next/dist/assets/cache-glyph-B5X-NM0-.js +0 -1
  471. package/src/console/ui-next/dist/assets/call-pii-button-ChAUiLo9.js +0 -1
  472. package/src/console/ui-next/dist/assets/collapsible-DGnOM2ph.js +0 -1
  473. package/src/console/ui-next/dist/assets/copy-inline-button-DBHhgHKP.js +0 -1
  474. package/src/console/ui-next/dist/assets/dagre.esm-ZwcdTuZZ.js +0 -1
  475. package/src/console/ui-next/dist/assets/detail-header-DhHM1iaZ.js +0 -1
  476. package/src/console/ui-next/dist/assets/dropdown-menu-_NjTEo5_.js +0 -1
  477. package/src/console/ui-next/dist/assets/duration-tone-sC3lGABz.js +0 -9
  478. package/src/console/ui-next/dist/assets/element-icons-BVXtRyd3.js +0 -1
  479. package/src/console/ui-next/dist/assets/explorer-empty-2uIhBu0_.js +0 -1
  480. package/src/console/ui-next/dist/assets/flows-page-RGy7VEA_.js +0 -1
  481. package/src/console/ui-next/dist/assets/highlighted-json-Awq7gYdu.js +0 -154
  482. package/src/console/ui-next/dist/assets/http-method-_UHM2ODJ.js +0 -1
  483. package/src/console/ui-next/dist/assets/index-Ck88Jmv8.css +0 -2
  484. package/src/console/ui-next/dist/assets/index-_rgpdVzo.js +0 -66
  485. package/src/console/ui-next/dist/assets/link-BX6Vqztd.js +0 -1
  486. package/src/console/ui-next/dist/assets/observability-page-Ds6pcnh-.js +0 -4
  487. package/src/console/ui-next/dist/assets/preload-helper-oH4irX4C.js +0 -1
  488. package/src/console/ui-next/dist/assets/react-D8E3mtu1.js +0 -1
  489. package/src/console/ui-next/dist/assets/react-dom-Bph1y7z7.js +0 -9
  490. package/src/console/ui-next/dist/assets/replica-lag-DKRrbvdo.js +0 -18
  491. package/src/console/ui-next/dist/assets/request-meta-DV0ywz7t.js +0 -1
  492. package/src/console/ui-next/dist/assets/shortcut-JQIZlWfm.js +0 -1
  493. package/src/console/ui-next/dist/assets/shortcut-keys-DKxNTe_m.js +0 -1
  494. package/src/console/ui-next/dist/assets/skeleton-D-czQJT6.js +0 -1
  495. package/src/console/ui-next/dist/assets/store-page-02xOiqIK.js +0 -41
  496. package/src/console/ui-next/dist/assets/trace-detail-sheet-B09O8rA6.js +0 -2
  497. package/src/console/ui-next/dist/assets/tree-expand-toggle-BtyhmWb4.js +0 -55
  498. package/src/console/ui-next/dist/assets/units-page-4rHOePuE.js +0 -1
  499. package/src/console/ui-next/dist/assets/useMutation-B8EO02Ej.js +0 -1
  500. package/src/console/ui-next/dist/assets/useRender-BE2A9BWC.js +0 -1
  501. package/src/console/ui-next/dist/assets/vault-page-DISPgxLM.js +0 -2
  502. package/src/console/ui-next/dist/assets/xyflow-D7n4g6go.js +0 -7
  503. package/src/console/ui-next/dist/assets/xyflow-DZ0Ws1xk.css +0 -1
  504. package/src/docker/ollama-pull.ts +0 -232
  505. package/src/docker/recipes/llama-cpp.ts +0 -298
  506. package/src/docker/recipes/ollama.ts +0 -44
  507. package/src/docker/recipes/sglang.ts +0 -55
  508. package/src/docker/recipes/vllm.ts +0 -44
  509. package/src/drivers/ai-ollama-tools.integration.test.ts +0 -109
  510. package/src/drivers/ai-ollama.integration.test.ts +0 -184
  511. package/src/drivers/ai-ollama.ts +0 -389
  512. package/src/drivers/ollama.ts +0 -14
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.4",
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
  }
@@ -5,20 +5,39 @@ icon: "Bot"
5
5
  source: "docs/spec/unified-theory.md"
6
6
  ---
7
7
 
8
- Resources for AI agents that read or operate an OKE app — not the `ai` element itself. In OKE, **MCP is a surface of the model, not the model itself**. Gate governs agents calling in; the AI element governs apps calling out.
8
+ Resources for AI agents that inspect, understand, or operate an OKEngine application.
9
9
 
10
- ## Pages
10
+ <Callout title="Two directions, one model">
11
+ **MCP is a surface of the model, not the model itself.** Gate governs agents calling in; the AI
12
+ element governs applications calling out to models.
13
+ </Callout>
14
+
15
+ ```text
16
+ External Agents → MCP (:6535) → Gate Check → Flow (inbound)
17
+ Flow → fx.ask / fx.stream → AI Runtime → Models & External Tools (outbound)
18
+ ```
19
+
20
+ ## AI & Agent Surfaces
11
21
 
12
22
  <Cards>
13
- <Card title="MCP" description="Runtime MCP on :6535; docs MCP on :6536." href="/docs/ai/mcp" />
14
23
  <Card
15
- title="Skills"
16
- description="AGENTS.md contract and installable skills."
24
+ title="MCP"
25
+ description="Runtime MCP on :6535 for running apps; Docs MCP on :6536 for handbook search."
26
+ href="/docs/ai/mcp"
27
+ />
28
+ <Card
29
+ title="Agent Skills"
30
+ description="AGENTS.md contract and autonomous maintenance skills."
17
31
  href="/docs/ai/skills"
18
32
  />
19
33
  <Card
20
34
  title="llms.txt"
21
- description="Index, JSON catalogue, full dump, per-page markdown."
35
+ description="Standardized machine-readable feeds: /llms.txt, /llms.json, /llms-full.txt, and markdown twins."
22
36
  href="/docs/ai/llms-txt"
23
37
  />
38
+ <Card
39
+ title="AI Element"
40
+ description="Calling out: models, prompts, agents, and RAG inside your application."
41
+ href="/docs/elements/ai"
42
+ />
24
43
  </Cards>
@@ -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>