okengine 0.18.5 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/AGENTS.md +18 -10
  2. package/README.md +2 -2
  3. package/package.json +51 -50
  4. package/site/content/docs/ai/llms-txt.mdx +1 -1
  5. package/site/content/docs/ai/meta.json +1 -1
  6. package/site/content/docs/ai/skills.mdx +4 -1
  7. package/site/content/docs/ai/try-it.mdx +58 -0
  8. package/site/content/docs/client/auth.mdx +208 -0
  9. package/site/content/docs/client/calling.mdx +451 -0
  10. package/site/content/docs/client/index.mdx +209 -0
  11. package/site/content/docs/client/live.mdx +234 -0
  12. package/site/content/docs/client/meta.json +5 -0
  13. package/site/content/docs/client/react.mdx +249 -0
  14. package/site/content/docs/elements/ai/agents.mdx +232 -0
  15. package/site/content/docs/elements/ai/index.mdx +341 -0
  16. package/site/content/docs/elements/ai/mcp.mdx +275 -0
  17. package/site/content/docs/elements/ai/meta.json +5 -0
  18. package/site/content/docs/elements/ai/models.mdx +283 -0
  19. package/site/content/docs/elements/ai/prompts.mdx +256 -0
  20. package/site/content/docs/elements/channel/email.mdx +266 -0
  21. package/site/content/docs/elements/channel/index.mdx +344 -0
  22. package/site/content/docs/elements/channel/meta.json +5 -0
  23. package/site/content/docs/elements/channel/push.mdx +218 -0
  24. package/site/content/docs/elements/channel/receipts.mdx +206 -0
  25. package/site/content/docs/elements/channel/sms.mdx +264 -0
  26. package/site/content/docs/elements/channel/whatsapp.mdx +220 -0
  27. package/site/content/docs/elements/clock/index.mdx +300 -0
  28. package/site/content/docs/elements/clock/meta.json +5 -0
  29. package/site/content/docs/elements/clock/schedules.mdx +508 -0
  30. package/site/content/docs/elements/clock/sleep.mdx +445 -0
  31. package/site/content/docs/elements/flow/consumers.mdx +707 -0
  32. package/site/content/docs/elements/flow/http.mdx +1080 -0
  33. package/site/content/docs/elements/flow/index.mdx +618 -0
  34. package/site/content/docs/elements/flow/meta.json +5 -0
  35. package/site/content/docs/elements/flow/routing.mdx +559 -0
  36. package/site/content/docs/elements/flow/workflows.mdx +640 -0
  37. package/site/content/docs/elements/gate/auth.mdx +371 -0
  38. package/site/content/docs/elements/gate/authorization.mdx +298 -0
  39. package/site/content/docs/elements/gate/index.mdx +418 -0
  40. package/site/content/docs/elements/gate/meta.json +5 -0
  41. package/site/content/docs/elements/gate/rate-limits.mdx +365 -0
  42. package/site/content/docs/elements/gate/rls.mdx +303 -0
  43. package/site/content/docs/elements/gate/tenancy.mdx +372 -0
  44. package/site/content/docs/elements/index.mdx +20 -10
  45. package/site/content/docs/elements/signal/broadcast.mdx +517 -0
  46. package/site/content/docs/elements/signal/index.mdx +352 -0
  47. package/site/content/docs/elements/signal/live.mdx +590 -0
  48. package/site/content/docs/elements/signal/meta.json +5 -0
  49. package/site/content/docs/elements/signal/once.mdx +596 -0
  50. package/site/content/docs/elements/store/files.mdx +659 -0
  51. package/site/content/docs/elements/store/index.mdx +310 -0
  52. package/site/content/docs/elements/store/kv.mdx +629 -0
  53. package/site/content/docs/elements/store/meta.json +5 -0
  54. package/site/content/docs/elements/store/search.mdx +946 -0
  55. package/site/content/docs/elements/store/sql.mdx +937 -0
  56. package/site/content/docs/elements/vault/config.mdx +256 -0
  57. package/site/content/docs/elements/vault/index.mdx +356 -0
  58. package/site/content/docs/elements/vault/meta.json +5 -0
  59. package/site/content/docs/elements/vault/rotation.mdx +273 -0
  60. package/site/content/docs/elements/vault/secrets.mdx +285 -0
  61. package/site/content/docs/index.mdx +63 -36
  62. package/site/content/docs/meta.json +8 -7
  63. package/site/content/docs/plugins/cors.mdx +2 -1
  64. package/site/content/docs/plugins/csrf.mdx +4 -1
  65. package/site/content/docs/plugins/headers.mdx +2 -1
  66. package/site/content/docs/plugins/ip-allowlist.mdx +2 -1
  67. package/site/content/docs/plugins/magic-link.mdx +6 -0
  68. package/site/content/docs/plugins/maintenance-mode.mdx +2 -1
  69. package/site/content/docs/plugins/oauth.mdx +1 -1
  70. package/site/content/docs/plugins/otp.mdx +12 -1
  71. package/site/content/docs/plugins/passkey.mdx +39 -15
  72. package/site/content/docs/plugins/two-factor.mdx +91 -34
  73. package/site/content/docs/plugins/username.mdx +1 -1
  74. package/site/content/docs/recipes/caddy.mdx +3 -3
  75. package/site/content/docs/recipes/index.mdx +18 -28
  76. package/site/content/docs/recipes/mailpit.mdx +1 -1
  77. package/site/content/docs/recipes/meilisearch.mdx +3 -3
  78. package/site/content/docs/recipes/meta.json +1 -4
  79. package/site/content/docs/recipes/nginx.mdx +2 -2
  80. package/site/content/docs/recipes/openrouter.mdx +283 -0
  81. package/site/content/docs/recipes/pgdog.mdx +3 -3
  82. package/site/content/docs/recipes/postgres.mdx +1 -2
  83. package/site/content/docs/recipes/rustfs.mdx +2 -2
  84. package/site/content/docs/recipes/traefik.mdx +3 -3
  85. package/site/content/docs/reference/cli.mdx +231 -0
  86. package/site/content/docs/reference/configuration.mdx +30 -10
  87. package/site/content/docs/reference/environment-variables.mdx +93 -20
  88. package/site/content/docs/reference/errors.mdx +132 -29
  89. package/site/content/docs/reference/fx.mdx +137 -73
  90. package/site/content/docs/reference/index.mdx +13 -21
  91. package/site/content/docs/reference/meta.json +4 -5
  92. package/site/content/docs/reference/okid.mdx +42 -17
  93. package/site/content/docs/reference/plugins.mdx +4 -3
  94. package/site/content/docs/reference/security.mdx +197 -0
  95. package/site/content/docs/understand/meta.json +5 -0
  96. package/site/content/docs/understand/the-anatomy.mdx +132 -0
  97. package/site/content/docs/understand/the-model.mdx +32 -0
  98. package/site/content/docs/understand/the-problem.mdx +74 -0
  99. package/site/content/docs/understand/the-vocabulary.mdx +26 -0
  100. package/src/auth/api-keys.ts +2 -1
  101. package/src/auth/bindings.ts +64 -16
  102. package/src/auth/gate-auth.test.ts +6 -1
  103. package/src/auth/identity.ts +152 -5
  104. package/src/auth/index.ts +29 -0
  105. package/src/auth/invites.ts +2 -1
  106. package/src/auth/method-context.ts +41 -0
  107. package/src/auth/oauth-as/crypto.ts +2 -1
  108. package/src/auth/oauth-as/stores.ts +2 -1
  109. package/src/auth/operator.ts +2 -1
  110. package/src/auth/sessions-jwt.test.ts +77 -0
  111. package/src/auth/sessions.ts +20 -4
  112. package/src/auth/tenants.ts +3 -2
  113. package/src/auth/two-factor-challenge.test.ts +61 -0
  114. package/src/auth/two-factor-challenge.ts +284 -0
  115. package/src/auth/verification.ts +5 -0
  116. package/src/bench/REPORT.md +49 -0
  117. package/src/bench/g03-signal-once.bench.ts +1 -1
  118. package/src/bench/g10-observability-contention.bench.ts +1 -1
  119. package/src/bench/g17-hybrid-search.bench.ts +572 -0
  120. package/src/bench/load-app.ts +2 -10
  121. package/src/cli/ai-setup/ai-setup.test.ts +331 -42
  122. package/src/cli/ai-setup/apply.ts +294 -52
  123. package/src/cli/ai-setup/catalog.ts +238 -1342
  124. package/src/cli/ai-setup/index.ts +14 -99
  125. package/src/cli/ai-setup/prompts.ts +60 -443
  126. package/src/cli/ask-seed.test.ts +96 -0
  127. package/src/cli/ask-seed.ts +82 -0
  128. package/src/cli/ask-vault-gaps.test.ts +84 -0
  129. package/src/cli/ask-vault-gaps.ts +146 -0
  130. package/src/cli/build.ts +2 -2
  131. package/src/cli/client-add.test.ts +26 -1
  132. package/src/cli/client-add.ts +106 -27
  133. package/src/cli/db-seed.ts +2 -0
  134. package/src/cli/db.ts +150 -11
  135. package/src/cli/dev.ts +119 -211
  136. package/src/cli/docker-clean.ts +2 -2
  137. package/src/cli/docker-cli.test.ts +1 -1
  138. package/src/cli/doctor-diff.ts +4 -2
  139. package/src/cli/doctor-pii.test.ts +1 -1
  140. package/src/cli/doctor.ts +14 -1
  141. package/src/cli/hero-meta.test.ts +4 -2
  142. package/src/cli/load-config.images.test.ts +8 -10
  143. package/src/cli/load-config.ts +1 -1
  144. package/src/cli/registry.ts +22 -10
  145. package/src/cli/replay.ts +3 -1
  146. package/src/cli/start.ts +1 -1
  147. package/src/cli/tui/keys.ts +2 -3
  148. package/src/client/auth/cookies.ts +74 -0
  149. package/src/client/auth/create-auth-client.ts +636 -0
  150. package/src/client/auth/denials.ts +99 -0
  151. package/src/client/auth/session.ts +283 -0
  152. package/src/client/auth.test.ts +251 -0
  153. package/src/client/auth.ts +39 -114
  154. package/src/client/create-with-session.ts +245 -0
  155. package/src/client/create.ts +51 -5
  156. package/src/client/index.ts +11 -1
  157. package/src/client/live.ts +11 -79
  158. package/src/client/notes-contract.test.ts +5 -10
  159. package/src/client/sse.ts +137 -0
  160. package/src/client/stream.ts +147 -0
  161. package/src/client/transport.test.ts +32 -0
  162. package/src/client/transport.ts +123 -26
  163. package/src/client/types.ts +118 -14
  164. package/src/client-react/index.ts +185 -24
  165. package/src/client-react/use-live-query.ts +13 -3
  166. package/src/compiler/aot.test.ts +7 -4
  167. package/src/compiler/effects-embed.test.ts +56 -0
  168. package/src/compiler/effects-fetch.test.ts +43 -0
  169. package/src/compiler/effects-infer.ts +58 -2
  170. package/src/compiler/extract.test.ts +257 -43
  171. package/src/compiler/extract.ts +566 -48
  172. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -4
  173. package/src/compiler/fixtures/skyport/src/flows/bookings/signals.ts +2 -8
  174. package/src/compiler/fixtures/skyport.expected.json +4 -4
  175. package/src/compiler/fixtures/triggers/five-triggers.ts +14 -10
  176. package/src/compiler/response.ts +2 -2
  177. package/src/compiler/search-writer-isolation.test.ts +40 -0
  178. package/src/config/index.ts +11 -0
  179. package/src/console/server/app.ts +17 -23
  180. package/src/console/server/bind.ts +4 -0
  181. package/src/console/server/console.test.ts +2 -2
  182. package/src/console/server/flows-invoke.test.ts +50 -34
  183. package/src/console/server/flows.ts +436 -255
  184. package/src/console/server/runs-ingest.test.ts +6 -3
  185. package/src/console/server/serve.ts +1 -1
  186. package/src/console/server/signals.test.ts +1 -5
  187. package/src/console/server/signals.ts +8 -6
  188. package/src/console/server/state.ts +6 -1
  189. package/src/console/server/store.ts +1 -1
  190. package/src/console/ui-next/dist/assets/FileExportIcon-Ck-5od4R.js +1 -0
  191. package/src/console/ui-next/dist/assets/MoreHorizontalCircle01Icon-gMNGsE37.js +1 -0
  192. package/src/console/ui-next/dist/assets/PlusSignIcon-CwG3nxfu.js +1 -0
  193. package/src/console/ui-next/dist/assets/UnavailableIcon-D9cvHVPr.js +1 -0
  194. package/src/console/ui-next/dist/assets/UserIcon-DaE2PB5_.js +1 -0
  195. package/src/console/ui-next/dist/assets/access-page-DFeymU07.js +4 -0
  196. package/src/console/ui-next/dist/assets/agent-disclosure-U1rdfblp.js +1 -0
  197. package/src/console/ui-next/dist/assets/cache-glyph-BeFJeqBG.js +1 -0
  198. package/src/console/ui-next/dist/assets/call-pii-button-CVAONPii.js +1 -0
  199. package/src/console/ui-next/dist/assets/collapsible-D2A6NJ-3.js +1 -0
  200. package/src/console/ui-next/dist/assets/copy-inline-button-CAYD18cr.js +1 -0
  201. package/src/console/ui-next/dist/assets/dagre.esm-B1_XeuLP.js +1 -0
  202. package/src/console/ui-next/dist/assets/detail-header-DVWNjWjg.js +1 -0
  203. package/src/console/ui-next/dist/assets/dropdown-menu-4h2LOVXM.js +1 -0
  204. package/src/console/ui-next/dist/assets/duration-tone-Cgk_h5ja.js +9 -0
  205. package/src/console/ui-next/dist/assets/element-icons-BI8cJgdh.js +1 -0
  206. package/src/console/ui-next/dist/assets/explorer-empty-CJs5A-wm.js +1 -0
  207. package/src/console/ui-next/dist/assets/flows-page-Dss7941e.js +1 -0
  208. package/src/console/ui-next/dist/assets/highlighted-json-MYZQtRnw.js +154 -0
  209. package/src/console/ui-next/dist/assets/http-method-Jrh39p7A.js +1 -0
  210. package/src/console/ui-next/dist/assets/index-D0zS5rKO.css +2 -0
  211. package/src/console/ui-next/dist/assets/index-DXP2dBIF.js +63 -0
  212. package/src/console/ui-next/dist/assets/observability-page-HvolXxTI.js +4 -0
  213. package/src/console/ui-next/dist/assets/react-dom-Ddte4I-Q.js +9 -0
  214. package/src/console/ui-next/dist/assets/replica-lag-CSh2dzrb.js +18 -0
  215. package/src/console/ui-next/dist/assets/request-meta-BatF8KrK.js +1 -0
  216. package/src/console/ui-next/dist/assets/shortcut-keys-3ILd8oGn.js +1 -0
  217. package/src/console/ui-next/dist/assets/{sql-BskegiFM.js → sql-BsFa4tDR.js} +1 -1
  218. package/src/console/ui-next/dist/assets/store-page-eiKiHnNe.js +41 -0
  219. package/src/console/ui-next/dist/assets/trace-detail-sheet-CZkMeKS-.js +2 -0
  220. package/src/console/ui-next/dist/assets/tree-expand-toggle-CW8y5A2h.js +55 -0
  221. package/src/console/ui-next/dist/assets/units-page-B_RWJrEO.js +1 -0
  222. package/src/console/ui-next/dist/assets/{use-vault-list-uk4WVboC.js → use-vault-list-CT4-gajj.js} +1 -1
  223. package/src/console/ui-next/dist/assets/vault-page-CWrg-A68.js +2 -0
  224. package/src/console/ui-next/dist/assets/xyflow-CSyC6ryz.css +1 -0
  225. package/src/console/ui-next/dist/assets/xyflow-yApv7D4e.js +7 -0
  226. package/src/console/ui-next/dist/index.html +6 -13
  227. package/src/console/ui-next/seed-invoke-host.ts +21 -18
  228. package/src/console/ui-next/src/client.ts +7 -2
  229. package/src/console/ui-next/src/features/flows/graph/element-map.ts +2 -0
  230. package/src/console/ui-next/src/features/flows/traces/effect-kind.ts +12 -2
  231. package/src/console/ui-next/src/features/flows/traces/effect-summary.ts +4 -0
  232. package/src/console/ui-next/src/features/flows/traces/trace-detail-sheet.tsx +8 -0
  233. package/src/console/ui-next/src/features/flows/traces/waterfall-bars.ts +4 -0
  234. package/src/console/ui-next/src/features/flows/traces/waterfall-tooltip.ts +9 -3
  235. package/src/console/ui-next/src/features/store/detail/reveal-cell.tsx +7 -11
  236. package/src/console/ui-next/src/features/store/detail/store-row-detail-sheet.tsx +2 -2
  237. package/src/console/ui-next/src/features/store/lib/fields-from-table.ts +2 -0
  238. package/src/console/ui-next/src/features/store/lib/grid-model.test.ts +25 -1
  239. package/src/console/ui-next/src/features/store/lib/grid-model.ts +36 -1
  240. package/src/console/ui-next/src/features/store/query/query-results.tsx +3 -3
  241. package/src/console/ui-next/src/features/units/detail/effects-summary.tsx +2 -0
  242. package/src/console/ui-next/src/features/units/lib/call-read-safe.ts +3 -1
  243. package/src/console/ui-next/src/features/units/lib/fields-from-schema.ts +6 -0
  244. package/src/docker/ai-model-status.test.ts +1 -12
  245. package/src/docker/ai-model-status.ts +10 -38
  246. package/src/docker/compose-up.test.ts +100 -0
  247. package/src/docker/compose-up.ts +292 -0
  248. package/src/docker/compose.ts +4 -14
  249. package/src/docker/derive.ts +9 -34
  250. package/src/docker/docker.test.ts +16 -261
  251. package/src/docker/images-config.test.ts +13 -25
  252. package/src/docker/index.ts +1 -24
  253. package/src/docker/recipes/index.ts +0 -23
  254. package/src/docker/recipes/pgdog.ts +6 -4
  255. package/src/docker/stack-id.test.ts +2 -2
  256. package/src/docker/stack-id.ts +0 -1
  257. package/src/docker/types.ts +2 -2
  258. package/src/drivers/ai-anthropic.ts +10 -0
  259. package/src/drivers/ai-openai-compatible.ts +34 -7
  260. package/src/drivers/ai-providers.test.ts +0 -107
  261. package/src/drivers/ai-stream.test.ts +0 -34
  262. package/src/drivers/ai-types.ts +17 -8
  263. package/src/drivers/channel-fcm.ts +6 -1
  264. package/src/drivers/channel-msegat.ts +6 -1
  265. package/src/drivers/channel-resend.ts +5 -1
  266. package/src/drivers/channel-smtp.ts +5 -1
  267. package/src/drivers/channel-sndr.ts +10 -1
  268. package/src/drivers/channel-taqnyat-mail.ts +5 -1
  269. package/src/drivers/channel-taqnyat-whatsapp.ts +6 -1
  270. package/src/drivers/channel-taqnyat.ts +6 -1
  271. package/src/drivers/channel-types.ts +10 -0
  272. package/src/drivers/channel-unifonic.ts +6 -1
  273. package/src/drivers/channel-wa-cloud.ts +6 -1
  274. package/src/drivers/channel-webpush.ts +6 -1
  275. package/src/drivers/external.ts +33 -0
  276. package/src/drivers/index.ts +0 -10
  277. package/src/drivers/meilisearch.ts +6 -0
  278. package/src/drivers/oauth-types.ts +4 -0
  279. package/src/drivers/postgres.test.ts +74 -3
  280. package/src/drivers/postgres.ts +175 -6
  281. package/src/drivers/signal-types.ts +5 -5
  282. package/src/drivers/types.ts +7 -0
  283. package/src/drivers/vault-types.ts +5 -0
  284. package/src/elements/ai/declare.ts +17 -4
  285. package/src/elements/ai/eval.ts +1 -1
  286. package/src/elements/ai/mcp-http.ts +1 -1
  287. package/src/elements/ai/pii.ts +1 -1
  288. package/src/elements/ai/providers.test.ts +289 -0
  289. package/src/elements/ai/providers.ts +169 -0
  290. package/src/elements/ai/runtime.ts +68 -5
  291. package/src/elements/ai/schema.ts +2 -2
  292. package/src/elements/ai.test.ts +7 -7
  293. package/src/elements/ai.ts +17 -1
  294. package/src/elements/channel/runtime.ts +105 -12
  295. package/src/elements/clock/cron-fields.test.ts +144 -0
  296. package/src/elements/clock/cron-fields.ts +185 -0
  297. package/src/elements/clock/declare.ts +247 -3
  298. package/src/elements/clock.ts +21 -1
  299. package/src/elements/index.ts +15 -0
  300. package/src/elements/signal/chaos-child.ts +1 -2
  301. package/src/elements/signal/declare.ts +65 -37
  302. package/src/elements/signal/delivery-modes.test.ts +11 -31
  303. package/src/elements/signal/dry-run-replay.test.ts +1 -7
  304. package/src/elements/signal/dry-run-write-isolation.test.ts +1 -7
  305. package/src/elements/signal/key-ordering.test.ts +6 -26
  306. package/src/elements/signal/lease-reclaim.test.ts +2 -6
  307. package/src/elements/signal/optional-emit.test.ts +6 -9
  308. package/src/elements/signal/order-lifecycle.test.ts +4 -17
  309. package/src/elements/signal/orphan-messages.test.ts +4 -15
  310. package/src/elements/signal/reconcile.test.ts +2 -2
  311. package/src/elements/signal/runtime.ts +1 -1
  312. package/src/elements/signal/schema-emit.test.ts +4 -8
  313. package/src/elements/signal.test.ts +24 -49
  314. package/src/elements/signal.ts +9 -2
  315. package/src/elements/store/domain-ddl.test.ts +1 -1
  316. package/src/elements/store/live-http.test.ts +9 -4
  317. package/src/elements/store/prepare-row.test.ts +123 -0
  318. package/src/elements/store/resource.ts +43 -12
  319. package/src/elements/store/schema-decl.ts +117 -0
  320. package/src/elements/store/search-backfill.ts +205 -0
  321. package/src/elements/store/search-bind.ts +66 -0
  322. package/src/elements/store/search-bm25.ts +78 -0
  323. package/src/elements/store/search-ddl.ts +156 -0
  324. package/src/elements/store/search-embed-flow.ts +141 -0
  325. package/src/elements/store/search-errors.ts +34 -0
  326. package/src/elements/store/search-fusion.ts +112 -0
  327. package/src/elements/store/search-lsh.ts +179 -0
  328. package/src/elements/store/search-runtime.ts +300 -0
  329. package/src/elements/store/search.test.ts +144 -0
  330. package/src/elements/store/sql-session.test.ts +1 -0
  331. package/src/elements/store/sql-session.ts +83 -3
  332. package/src/elements/store/table.ts +23 -2
  333. package/src/elements/store/upsert-app.test.ts +1 -3
  334. package/src/elements/store.ts +50 -0
  335. package/src/full.ts +4 -2
  336. package/src/http.ts +4 -1
  337. package/src/i18n/catalogs/ar.ts +14 -6
  338. package/src/i18n/catalogs/en.ts +14 -6
  339. package/src/index.ts +6 -1
  340. package/src/kernel/adopt-barrel-fresh.test.ts +7 -7
  341. package/src/kernel/adopt-routes.ts +9 -1
  342. package/src/kernel/app-auth.ts +5 -0
  343. package/src/kernel/app.ts +102 -9
  344. package/src/kernel/auto-cache.test.ts +6 -12
  345. package/src/kernel/auto-registry.test.ts +3 -3
  346. package/src/kernel/boot-bind/ai.test.ts +22 -19
  347. package/src/kernel/boot-bind/ai.ts +5 -43
  348. package/src/kernel/boot-bind/clock.ts +23 -5
  349. package/src/kernel/boot-bind/honor-config.test.ts +4 -4
  350. package/src/kernel/boot.test.ts +11 -6
  351. package/src/kernel/boot.ts +66 -16
  352. package/src/kernel/boundary-contract.ts +93 -0
  353. package/src/kernel/budget.test.ts +1 -1
  354. package/src/kernel/call.ts +89 -0
  355. package/src/kernel/capability.ts +6 -0
  356. package/src/kernel/client-descriptor.ts +123 -0
  357. package/src/kernel/clock-timezone.test.ts +80 -0
  358. package/src/kernel/correlation.test.ts +1 -1
  359. package/src/kernel/dry-run.ts +11 -8
  360. package/src/kernel/effects-stamping.test.ts +42 -9
  361. package/src/kernel/effects.test.ts +4 -2
  362. package/src/kernel/effects.ts +51 -9
  363. package/src/kernel/errors-channel.ts +17 -0
  364. package/src/kernel/errors-live-resume.ts +3 -2
  365. package/src/kernel/errors-tenant.ts +7 -4
  366. package/src/kernel/errors.registry-helpers.ts +96 -0
  367. package/src/kernel/errors.registry.test.ts +139 -25
  368. package/src/kernel/errors.ts +102 -23
  369. package/src/kernel/external-effects.test.ts +196 -0
  370. package/src/kernel/flow.test.ts +13 -4
  371. package/src/kernel/flow.ts +69 -71
  372. package/src/kernel/fx-ask-telemetry.test.ts +2 -2
  373. package/src/kernel/fx-dead-letters.test.ts +3 -3
  374. package/src/kernel/fx-fetch.ts +55 -0
  375. package/src/kernel/fx-live-stream.ts +2 -2
  376. package/src/kernel/fx-live.test.ts +8 -8
  377. package/src/kernel/fx.test.ts +17 -11
  378. package/src/kernel/fx.ts +180 -57
  379. package/src/kernel/horizontal-child.ts +1 -1
  380. package/src/kernel/http-query.test.ts +3 -6
  381. package/src/kernel/index.ts +13 -3
  382. package/src/kernel/instance-id.ts +1 -1
  383. package/src/kernel/instances.test.ts +40 -0
  384. package/src/kernel/instances.ts +47 -9
  385. package/src/kernel/live-http.test.ts +6 -7
  386. package/src/kernel/live-http.ts +6 -2
  387. package/src/kernel/live-resume.test.ts +1 -1
  388. package/src/kernel/mcp-tool.test.ts +3 -3
  389. package/src/kernel/on.ts +98 -4
  390. package/src/kernel/pipeline.test.ts +12 -15
  391. package/src/kernel/plugin-elements.test.ts +1 -1
  392. package/src/kernel/stamp-http.test.ts +3 -3
  393. package/src/kernel/triggers.ts +210 -95
  394. package/src/kernel-entry.ts +0 -1
  395. package/src/manifest/diff.ts +11 -1
  396. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  397. package/src/manifest/types.ts +46 -2
  398. package/src/mcp/docs-index.ts +3 -3
  399. package/src/mcp/docs-mcp.test.ts +2 -2
  400. package/src/mcp/docs-tools.ts +1 -1
  401. package/src/okid.test.ts +56 -0
  402. package/src/okid.ts +55 -11
  403. package/src/plugins/anonymous.ts +8 -4
  404. package/src/plugins/auth/shared.ts +27 -3
  405. package/src/plugins/auth-delivery.mailpit.integration.test.ts +1 -1
  406. package/src/plugins/auth-methods.security.test.ts +561 -23
  407. package/src/plugins/config-source.ts +1 -1
  408. package/src/plugins/csrf.test.ts +65 -0
  409. package/src/plugins/index.ts +2 -0
  410. package/src/plugins/magic-link.ts +36 -16
  411. package/src/plugins/oauth/shared.ts +3 -1
  412. package/src/plugins/oauth.ts +22 -14
  413. package/src/plugins/otp.ts +37 -21
  414. package/src/plugins/passkey-webauthn.ts +9 -6
  415. package/src/plugins/passkey.ts +98 -26
  416. package/src/plugins/pre-account-hijack.test.ts +223 -0
  417. package/src/plugins/two-factor.ts +466 -37
  418. package/src/plugins/username.ts +19 -7
  419. package/src/release/build-lib.ts +1 -0
  420. package/src/release/limits.ts +2 -2
  421. package/src/release/measure.ts +1 -1
  422. package/src/runs/collect.test.ts +0 -2
  423. package/src/runtime/json-code-block.test.ts +250 -20
  424. package/src/runtime/json-code-block.ts +1261 -41
  425. package/src/term.test.ts +1 -1
  426. package/src/test/create-test-app.test.ts +12 -12
  427. package/src/test/live-signals.test.ts +6 -6
  428. package/src/test/provisions.integration.test.ts +10 -14
  429. package/src/test/reset-element-registries.ts +1 -1
  430. package/src/test/tenant-isolation.test.ts +12 -6
  431. package/site/content/docs/deployment/docker-swarm.mdx +0 -164
  432. package/site/content/docs/deployment/docker.mdx +0 -227
  433. package/site/content/docs/deployment/index.mdx +0 -83
  434. package/site/content/docs/deployment/kubernetes.mdx +0 -176
  435. package/site/content/docs/deployment/meta.json +0 -5
  436. package/site/content/docs/deployment/reverse-proxy.mdx +0 -234
  437. package/site/content/docs/elements/ai.mdx +0 -385
  438. package/site/content/docs/elements/channel.mdx +0 -346
  439. package/site/content/docs/elements/clock.mdx +0 -244
  440. package/site/content/docs/elements/flow.mdx +0 -420
  441. package/site/content/docs/elements/gate.mdx +0 -436
  442. package/site/content/docs/elements/signal.mdx +0 -380
  443. package/site/content/docs/elements/store.mdx +0 -1099
  444. package/site/content/docs/elements/vault.mdx +0 -405
  445. package/site/content/docs/get-started/basic-usage.mdx +0 -173
  446. package/site/content/docs/get-started/index.mdx +0 -43
  447. package/site/content/docs/get-started/installation.mdx +0 -220
  448. package/site/content/docs/get-started/introduction.mdx +0 -144
  449. package/site/content/docs/get-started/meta.json +0 -13
  450. package/site/content/docs/get-started/project-structure.mdx +0 -925
  451. package/site/content/docs/get-started/testing.mdx +0 -328
  452. package/site/content/docs/get-started/why.mdx +0 -114
  453. package/site/content/docs/recipes/llama-cpp.mdx +0 -151
  454. package/site/content/docs/recipes/ollama.mdx +0 -142
  455. package/site/content/docs/recipes/sglang.mdx +0 -105
  456. package/site/content/docs/recipes/vllm.mdx +0 -106
  457. package/site/content/docs/reference/cli.md +0 -232
  458. package/site/content/docs/reference/client.mdx +0 -469
  459. package/site/content/docs/reference/security.md +0 -74
  460. package/src/cli/ai-setup/detect-ollama.ts +0 -213
  461. package/src/cli/ai-setup/recommend.test.ts +0 -225
  462. package/src/cli/ai-setup/recommend.ts +0 -225
  463. package/src/cli/dev-controls.test.ts +0 -122
  464. package/src/cli/dev-controls.ts +0 -164
  465. package/src/cli/tui/DevLive.tsx +0 -126
  466. package/src/console/ui-next/dist/assets/access-page-3-EFj-2G.js +0 -4
  467. package/src/console/ui-next/dist/assets/agent-disclosure-BP0Y0Sux.js +0 -1
  468. package/src/console/ui-next/dist/assets/cache-glyph-B5X-NM0-.js +0 -1
  469. package/src/console/ui-next/dist/assets/call-pii-button-ChAUiLo9.js +0 -1
  470. package/src/console/ui-next/dist/assets/collapsible-DGnOM2ph.js +0 -1
  471. package/src/console/ui-next/dist/assets/copy-inline-button-DBHhgHKP.js +0 -1
  472. package/src/console/ui-next/dist/assets/dagre.esm-ZwcdTuZZ.js +0 -1
  473. package/src/console/ui-next/dist/assets/detail-header-DhHM1iaZ.js +0 -1
  474. package/src/console/ui-next/dist/assets/dropdown-menu-_NjTEo5_.js +0 -1
  475. package/src/console/ui-next/dist/assets/duration-tone-sC3lGABz.js +0 -9
  476. package/src/console/ui-next/dist/assets/element-icons-BVXtRyd3.js +0 -1
  477. package/src/console/ui-next/dist/assets/explorer-empty-2uIhBu0_.js +0 -1
  478. package/src/console/ui-next/dist/assets/flows-page-cVFnA4HH.js +0 -1
  479. package/src/console/ui-next/dist/assets/highlighted-json-Awq7gYdu.js +0 -154
  480. package/src/console/ui-next/dist/assets/http-method-_UHM2ODJ.js +0 -1
  481. package/src/console/ui-next/dist/assets/index-CMIgUbD0.js +0 -66
  482. package/src/console/ui-next/dist/assets/index-Ck88Jmv8.css +0 -2
  483. package/src/console/ui-next/dist/assets/link-BX6Vqztd.js +0 -1
  484. package/src/console/ui-next/dist/assets/observability-page-CQ3p34ip.js +0 -4
  485. package/src/console/ui-next/dist/assets/preload-helper-oH4irX4C.js +0 -1
  486. package/src/console/ui-next/dist/assets/react-D8E3mtu1.js +0 -1
  487. package/src/console/ui-next/dist/assets/react-dom-Bph1y7z7.js +0 -9
  488. package/src/console/ui-next/dist/assets/replica-lag-DKRrbvdo.js +0 -18
  489. package/src/console/ui-next/dist/assets/request-meta-DV0ywz7t.js +0 -1
  490. package/src/console/ui-next/dist/assets/shortcut-JQIZlWfm.js +0 -1
  491. package/src/console/ui-next/dist/assets/shortcut-keys-DKxNTe_m.js +0 -1
  492. package/src/console/ui-next/dist/assets/skeleton-D-czQJT6.js +0 -1
  493. package/src/console/ui-next/dist/assets/store-page-02xOiqIK.js +0 -41
  494. package/src/console/ui-next/dist/assets/trace-detail-sheet-B09O8rA6.js +0 -2
  495. package/src/console/ui-next/dist/assets/tree-expand-toggle-BtyhmWb4.js +0 -55
  496. package/src/console/ui-next/dist/assets/units-page-l8FeKfnP.js +0 -1
  497. package/src/console/ui-next/dist/assets/useMutation-B8EO02Ej.js +0 -1
  498. package/src/console/ui-next/dist/assets/useRender-BE2A9BWC.js +0 -1
  499. package/src/console/ui-next/dist/assets/vault-page-CL-d_mLE.js +0 -2
  500. package/src/console/ui-next/dist/assets/xyflow-D7n4g6go.js +0 -7
  501. package/src/console/ui-next/dist/assets/xyflow-DZ0Ws1xk.css +0 -1
  502. package/src/docker/ollama-pull.ts +0 -232
  503. package/src/docker/recipes/llama-cpp.ts +0 -298
  504. package/src/docker/recipes/ollama.ts +0 -44
  505. package/src/docker/recipes/sglang.ts +0 -55
  506. package/src/docker/recipes/vllm.ts +0 -44
  507. package/src/drivers/ai-ollama-tools.integration.test.ts +0 -109
  508. package/src/drivers/ai-ollama.integration.test.ts +0 -184
  509. package/src/drivers/ai-ollama.ts +0 -389
  510. package/src/drivers/ollama.ts +0 -14
@@ -1,176 +0,0 @@
1
- ---
2
- title: Kubernetes
3
- description: Run an OKE app as a plain Deployment — PgDog, readiness vs liveness probes, graceful SIGTERM, shared drivers, and honest multi-instance limits.
4
- icon: Container
5
- source: README.md
6
- ---
7
-
8
- OKE apps are safe to run as more than one replica when shared drivers back
9
- Clock, Journal, Gate, and Store. Kubernetes is full orchestration with the
10
- largest ecosystem — use a **Deployment**, never a StatefulSet.
11
-
12
- <Callout title="The one rule">
13
- Treat every replica as replaceable. Put durable state in Postgres / Redis / S3, probe `GET
14
- /_/ready` for readiness and app `GET /health` for liveness, and set
15
- `terminationGracePeriodSeconds` high enough for lease release on SIGTERM.
16
- </Callout>
17
-
18
- ## Quick start
19
-
20
- <Steps>
21
-
22
- <Step>
23
- ### Deploy as a Deployment
24
-
25
- Use a plain Kubernetes **Deployment** (or compatible replica set). Do **not**
26
- use a StatefulSet — there is no per-pod volume identity, ordered startup, or
27
- sticky network id to preserve. Scale with `replicas: N`.
28
-
29
- </Step>
30
-
31
- <Step>
32
- ### Share backing services
33
-
34
- Pin `dev`/`prod` drivers to shared stores:
35
-
36
- | Concern | Driver | Shared backend |
37
- | ----------------------------- | ---------------------------- | ------------------------------------------------- |
38
- | SQL / durable journal / clock | `postgres` | Postgres (optionally via PgDog) |
39
- | Gate rate counters | `redis` (`drivers.store.kv`) | Redis / Valkey / Dragonfly (`images["store.kv"]`) |
40
- | Files | `s3` | S3-compatible object store |
41
- | Signal | see known limits below | — |
42
-
43
- </Step>
44
-
45
- <Step>
46
- ### Probe readiness and liveness
47
-
48
- - **Readiness:** `GET /_/ready` — returns `200 { ready: true }` only after boot and the durable orphan scan finish. While booting or scanning orphans it returns `503 { ready: false, reason: "booting" | "orphan_scan" }`.
49
- - **Liveness:** app-authored `GET /health` (create-oke ships one) — cheap “process is alive,” not orphan-scan aware.
50
-
51
- Wire `readinessProbe` to `/_/ready` and `livenessProbe` to `/health`.
52
-
53
- </Step>
54
-
55
- </Steps>
56
-
57
- ## PgDog pooling
58
-
59
- Bun.SQL defaults to **10** connections per process — fine for one pod.
60
- Scale the Deployment and `N × pool` can exceed Postgres `max_connections`.
61
-
62
- When both `store.sql` and `pgdog` are pinned (`dev`/`prod` default in templates),
63
- `DATABASE_URL` points at PgDog on port `6432` — transaction pooling, wire-protocol
64
- transparent to Bun.SQL / Drizzle. Point the cluster Service at that pooler.
65
-
66
- **Why PgDog.** Transaction pooling fixes the connection math. Naive poolers can
67
- leak session state (`SET`, RLS vars, `LISTEN`/`NOTIFY`) across clients; PgDog
68
- re-applies those under transaction mode.
69
-
70
- Read-replica routing (`BEGIN READ ONLY` → replica) is documented readiness —
71
- not configured as a generated Kubernetes manifest this round.
72
-
73
- ## Redis-protocol images (Redis · Valkey · Dragonfly)
74
-
75
- `images["store.kv"]` defaults to Redis (most mature). Pin Valkey or Dragonfly
76
- the same way — driver id stays `redis`, same `REDIS_URL`. Image table + one-line
77
- licenses: [Store · KV](/docs/elements/store#kv).
78
-
79
- ## Readiness vs liveness
80
-
81
- | Endpoint | Role | Kubernetes |
82
- | -------------- | ------------------------------------------------------ | ------------------------------------------------ |
83
- | `GET /_/ready` | Kernel readiness (`booting` → `orphan_scan` → `ready`) | `readinessProbe` — no traffic until Ready |
84
- | `GET /health` | App liveness (create-oke) — cheap “process alive” | `livenessProbe` — restart if the process is dead |
85
-
86
- **Consequence:** orphan scan delays Ready (and traffic) on purpose so a new
87
- pod is not hit mid-takeover. Do not point liveness at `/_/ready` — a long orphan
88
- resume would kill the pod instead of waiting.
89
-
90
- ## Graceful shutdown
91
-
92
- On `SIGTERM` / `SIGINT`, `installGracefulShutdown` (wired by `oke dev`’s app
93
- runner; call it next to `createBunRuntime().serve` in custom entries):
94
-
95
- 1. Stops accepting new connections
96
- 2. Releases **Clock** cron leases and **Journal** run leases held by this instance
97
- 3. Closes element runtimes and exits
98
-
99
- Signal message leases have no proactive release today — survivors reclaim after
100
- the visibility TTL (default 30s). Set `terminationGracePeriodSeconds` ≥ your
101
- longest lease TTL (typically ≥ 30s) so release finishes before kubelet SIGKILL.
102
-
103
- ## Ingress (TLS / routing)
104
-
105
- Use cluster-native **Ingress** or Gateway API for HTTPS.
106
- Compose `images.proxy` recipes (Caddy / Traefik / nginx) target plain Docker and Swarm —
107
- see [Reverse proxy](/docs/deployment/reverse-proxy) when you are not on Kubernetes.
108
-
109
- Still set serve `allowedHosts` to the public hostname
110
- ([Security](/docs/reference/security)).
111
-
112
- ## Known multi-instance limits
113
-
114
- Be honest about what is still process-local:
115
-
116
- | Surface | Multi-instance today |
117
- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
118
- | Clock (`postgres` / shared `file`) | Shared leader election |
119
- | Journal (`postgres` / shared `file`) | Shared durable runs + orphan resume |
120
- | Gate rates (`drivers.store.kv: redis`) | Shared counters |
121
- | Store SQL / KV redis / files `s3` | Shared |
122
- | Store files `fs` | **Per-instance filesystem** — boot warns; use `s3` when scaled |
123
- | Signal `redis` | Emit relays to Redis; **consume / `live` / `drain` are process-local outbox** until Streams consume ships |
124
- | Channel suppression / consent / receipts | **Default stores are process-local** — opt-out on replica A is invisible to B until a durable driver ships |
125
-
126
- ## Troubleshooting
127
-
128
- <Accordions>
129
- <Accordion title="Pods pass liveness but get no traffic after deploy">
130
-
131
- Check readiness: `/_/ready` stays `503` with `reason: "orphan_scan"` until the
132
- durable orphan resume finishes. A long resume delays Ready; that is intentional
133
- so traffic does not hit a pod mid-takeover.
134
-
135
- </Accordion>
136
- <Accordion title="Rate limits look twice as high after scaling to 2">
137
-
138
- `drivers.store.kv` must be `redis` with `REDIS_URL` set. A missing URL now
139
- **fails boot** (no silent memory fallback). Declaring `memory` for local is fine;
140
- `dev`/`prod` should stay on redis.
141
-
142
- </Accordion>
143
- <Accordion title="Files uploaded on pod A are missing on pod B">
144
-
145
- `drivers.store.files: "fs"` is single-host. Switch `dev`/`prod` to `s3`
146
- (create-oke templates already do).
147
-
148
- </Accordion>
149
- <Accordion title="Pod killed during orphan scan">
150
-
151
- Liveness is pointed at `/_/ready`. Move liveness to `/health`; keep readiness
152
- on `/_/ready` so the pod stays Alive while Waiting for Ready.
153
-
154
- </Accordion>
155
- </Accordions>
156
-
157
- ## Learn more
158
-
159
- - [Deployment](/docs/deployment) — choose compose, Swarm, or Kubernetes
160
- - [Docker](/docs/deployment/docker) — plain compose
161
- - [Docker Swarm](/docs/deployment/docker-swarm) — `docker stack deploy`
162
- - [Reverse proxy](/docs/deployment/reverse-proxy) — Caddy / Traefik / nginx (non-K8s)
163
- - [Store](/docs/elements/store) — PgDog and facets
164
- - [Clock](/docs/elements/clock) — shared CronStore / leader election
165
- - [Flow](/docs/elements/flow) — durable journal
166
- - [Signal](/docs/elements/signal) — delivery modes and redis honesty
167
- - [Channel](/docs/elements/channel) — suppression process-local limit
168
- - [CLI](/docs/reference/cli) — `oke docker --prod`, `oke start`
169
-
170
- ## Next
171
-
172
- <Cards>
173
- <Card title="Deployment" href="/docs/deployment" />
174
- <Card title="Docker" href="/docs/deployment/docker" />
175
- <Card title="Docker Swarm" href="/docs/deployment/docker-swarm" />
176
- </Cards>
@@ -1,5 +0,0 @@
1
- {
2
- "title": "Deployment",
3
- "icon": "Server",
4
- "pages": ["index", "docker", "docker-swarm", "kubernetes", "reverse-proxy"]
5
- }
@@ -1,234 +0,0 @@
1
- ---
2
- title: Reverse proxy
3
- description: Opt-in Caddy, Traefik, or nginx for edge routing on plain Docker and Swarm — custom domains, Let's Encrypt, and the socket-proxy security model.
4
- icon: Globe
5
- source: README.md
6
- ---
7
-
8
- Pin `images.proxy` when you need an edge in front of the app on plain `docker compose` or
9
- Docker Swarm. Kubernetes uses cluster Ingress / Gateway API instead — this page
10
- is for the compose recipes.
11
-
12
- <Callout title="The one rule">
13
- Leave the no-proxy default until you need an edge on compose. Then pick **Caddy** (automatic
14
- HTTPS), **Traefik** (`--scale app=N`), or **nginx** (HTTP; TLS elsewhere). Never mount raw
15
- `docker.sock` into Traefik.
16
- </Callout>
17
-
18
- ## Quick start
19
-
20
- <Steps>
21
-
22
- <Step>
23
- ### Opt in (pick one)
24
-
25
- ```typescript title="oke.config.ts"
26
- images: {
27
- "store.sql": "postgres:18-alpine",
28
- // …
29
- proxy: "caddy:2-alpine", // or "traefik:v3.7" / "nginx:1.31-alpine"
30
- },
31
- ```
32
-
33
- Pin **one** proxy image — never two. `create-oke` asks **Add a reverse proxy…?** (or
34
- `--proxy`). Re-run `oke docker --prod`.
35
-
36
- </Step>
37
-
38
- <Step>
39
- ### Set the public host and ACME email
40
-
41
- ```bash title=".env.local"
42
- OKE_PROXY_HOST=app.example.com
43
- OKE_PROXY_ACME_EMAIL=admin@example.com
44
- ```
45
-
46
- `.env.local` is preserved across regeneration. Point DNS `A`/`AAAA` at the host.
47
-
48
- </Step>
49
-
50
- <Step>
51
- ### Bring the stack up
52
-
53
- ```bash
54
- cd docker
55
- docker compose -f compose.yml -f compose.store.sql.yml \
56
- -f compose.proxy.yml -f compose.prod.yml up -d
57
- ```
58
-
59
- Pass every `-f` file `oke docker` listed. The edge publishes `80`/`443`; `app`
60
- stays on the internal `oke` network (no host bind on `6530`).
61
-
62
- Add your public hostname to serve `allowedHosts`
63
- ([Security](/docs/reference/security)).
64
-
65
- </Step>
66
-
67
- </Steps>
68
-
69
- ## Which proxy?
70
-
71
- | Choice | Best for | How routing works |
72
- | ------------------------------- | ---------------------------------------------------------- | ------------------------------------------------------------------ |
73
- | **Caddy** (`caddy:2-alpine`) | hello / minimal / standard — single instance, simplest TLS | Generated `Caddyfile` → `reverse_proxy app:6530`; automatic HTTPS |
74
- | **Traefik** (`traefik:v3.7`) | Horizontally scaled plain compose | Docker labels on `app`; replicas auto-discovered and load-balanced |
75
- | **nginx** (`nginx:1.31-alpine`) | Static HTTP edge; TLS elsewhere | Generated `nginx.conf` → `proxy_pass` to `app:6530` on `:80` |
76
- | _(omit `images.proxy`)_ | Local / private networks | App publishes `6530` — **default, unchanged** |
77
-
78
- **Consequence:** Caddy is the recommended default when you just need a certificate.
79
- Choose Traefik when `docker compose up --scale app=N` is the deployment shape.
80
- Choose nginx when another edge already terminates TLS.
81
-
82
- ## Caddy
83
-
84
- Emits `docker/Caddyfile`:
85
-
86
- ```text
87
- {$OKE_PROXY_HOST:localhost} {
88
- reverse_proxy app:6530
89
- }
90
- ```
91
-
92
- | Setting | What it does |
93
- | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
94
- | `OKE_PROXY_HOST` | Site address. `localhost` → local TLS; a public DNS name → Let's Encrypt HTTP-01 |
95
- | `OKE_PROXY_ACME_EMAIL` | Written into `.env.local` for the proxy role. Traefik consumes it; for Caddy, add a global `email` block if you want a specific ACME contact |
96
-
97
- Custom domain:
98
-
99
- 1. DNS for `app.example.com` → this host
100
- 2. `OKE_PROXY_HOST=app.example.com` in `.env.local`
101
- 3. Ports `80`/`443` reachable from the public internet
102
- 4. `allowedHosts` includes `app.example.com`
103
-
104
- Override the file via `compose.override.yml` or replace `docker/Caddyfile` —
105
- `oke docker` regenerates the default on the next run.
106
-
107
- ## Traefik
108
-
109
- Generated `compose.proxy.yml` labels `app`:
110
-
111
- | Label | Meaning |
112
- | --------------------------------------------------------- | -------------------------------------------- |
113
- | `traefik.enable=true` | Advertise this service to Traefik |
114
- | `traefik.http.routers.app.rule=Host(…)` | Match `OKE_PROXY_HOST` (default `localhost`) |
115
- | `traefik.http.routers.app.entrypoints=websecure` | HTTPS entrypoint |
116
- | `traefik.http.routers.app.tls.certresolver=letsencrypt` | ACME via Let's Encrypt |
117
- | `traefik.http.services.app.loadbalancer.server.port=6530` | Upstream port on the compose network |
118
-
119
- HTTP (`:80`) redirects to HTTPS. ACME email comes from
120
- `OKE_PROXY_ACME_EMAIL` (default `admin@example.com`) on the Traefik command line.
121
-
122
- Scaled replicas need no label edits — `docker compose up --scale app=N` registers
123
- every replica through the Docker provider.
124
-
125
- ## nginx
126
-
127
- | Piece | Meaning |
128
- | -------------- | ----------------------------------------------------------------------- |
129
- | Generated file | `docker/nginx.conf` — `proxy_pass` to `app:6530` on `:80` |
130
- | TLS | None in-container — put Cloudflare / an ALB in front, or switch recipes |
131
- | Full recipe | [nginx](/docs/recipes/nginx) |
132
-
133
- ## Why docker-socket-proxy (Traefik)
134
-
135
- Traefik's Docker provider watches the Engine API for containers and labels.
136
- The naive setup mounts `/var/run/docker.sock` into Traefik itself.
137
-
138
- That socket is root-equivalent for the host Docker daemon. If the edge process
139
- is compromised (public `80`/`443`), an attacker with the raw socket can start
140
- privileged containers, mount the host filesystem, or escape the container.
141
-
142
- Traefik [documents this risk](https://doc.traefik.io/traefik/reference/install-configuration/providers/docker/)
143
- and recommends a filtered proxy. OKE **never** mounts `docker.sock` into Traefik —
144
- a companion `tecnativa/docker-socket-proxy` mounts it read-only and exposes only:
145
-
146
- | Flag | Why Traefik needs it |
147
- | ------------ | -------------------------- |
148
- | `CONTAINERS` | List / inspect for labels |
149
- | `EVENTS` | Watch start/stop for scale |
150
- | `PING` | Health of the Engine API |
151
- | `VERSION` | API negotiation |
152
- | `NETWORKS` | Network membership |
153
-
154
- Destructive Engine calls (`images`, `volumes`, exec, swarm admin, …) stay denied.
155
- Traefik uses `--providers.docker.endpoint=tcp://socket-proxy:2375` on the
156
- internal `oke` network only — do **not** publish `2375` on the host.
157
-
158
- **Consequence:** a compromised Traefik still talks to a narrow API surface, not
159
- the full Docker control plane.
160
-
161
- ## Environment
162
-
163
- | Variable | Default | Used by |
164
- | ---------------------- | ------------------- | ----------------------------------------- |
165
- | `OKE_PROXY_HOST` | `localhost` | Caddy site address; Traefik `Host()` rule |
166
- | `OKE_PROXY_ACME_EMAIL` | `admin@example.com` | Traefik ACME account email |
167
-
168
- ## Where this applies
169
-
170
- | Surface | Edge / ingress |
171
- | --------------------------------------------- | -------------------------------------------------------- |
172
- | [Docker](/docs/deployment/docker) | Opt-in Caddy / Traefik / nginx (`images.proxy`) |
173
- | [Docker Swarm](/docs/deployment/docker-swarm) | Same proxy recipes + Swarm routing mesh |
174
- | [Kubernetes](/docs/deployment/kubernetes) | Ingress / Gateway API (cluster-native — not this recipe) |
175
-
176
- ## Troubleshooting
177
-
178
- <Accordions>
179
- <Accordion title="compose up --scale app=N fails with port already allocated">
180
-
181
- You still have `6530:6530` on `app`. Confirm `images.proxy` is set and
182
- `compose.proxy.yml` is in the `-f` list so derivation omitted the host bind.
183
-
184
- </Accordion>
185
- <Accordion title="Let's Encrypt challenge fails">
186
-
187
- `OKE_PROXY_HOST` must be a public DNS name pointing at this host; ports `80`/`443`
188
- reachable. Set `OKE_PROXY_ACME_EMAIL` for Traefik. For localhost-only smoke tests, prefer Caddy.
189
-
190
- </Accordion>
191
- <Accordion title="Traefik starts but never routes to app">
192
-
193
- Confirm app labels are present (`traefik.enable=true`) in `compose.proxy.yml`,
194
- containers share the `oke` network, and `socket-proxy` is healthy. Traefik must
195
- not mount `docker.sock` itself.
196
-
197
- </Accordion>
198
- <Accordion title="oke dev: service app has neither an image nor a build context">
199
-
200
- `oke dev` starts infra only; the app stays on the host at `:6530`.
201
- Proxy recipes route to a Compose `app` service — use `oke docker` for that.
202
- Re-run `oke dev` after upgrading so compose drops the label-only `app`.
203
-
204
- </Accordion>
205
- <Accordion title="Host header rejected (403)">
206
-
207
- Serve validates `Host`. Add your public hostname to `allowedHosts`
208
- ([Security](/docs/reference/security)).
209
-
210
- </Accordion>
211
- <Accordion title="Caddy serves localhost certs on my public host">
212
-
213
- `OKE_PROXY_HOST` is still `localhost` (or unset). Set the public DNS name in
214
- `.env.local` and recreate the proxy container so it reloads the Caddyfile.
215
-
216
- </Accordion>
217
- </Accordions>
218
-
219
- ## Learn more
220
-
221
- - [Deployment](/docs/deployment) — pick compose, Swarm, or Kubernetes
222
- - [Docker](/docs/deployment/docker) — plain compose path (includes proxy opt-in)
223
- - [Docker Swarm](/docs/deployment/docker-swarm) — `docker stack deploy`
224
- - [CLI](/docs/reference/cli) — `oke docker`, `oke docker --prod`
225
- - [Configuration](/docs/reference/configuration) — `images` pins
226
- - [Security](/docs/reference/security) — `allowedHosts` behind a reverse proxy
227
-
228
- ## Next
229
-
230
- <Cards>
231
- <Card title="Deployment" href="/docs/deployment" />
232
- <Card title="Docker" href="/docs/deployment/docker" />
233
- <Card title="Docker Swarm" href="/docs/deployment/docker-swarm" />
234
- </Cards>