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
@@ -0,0 +1,292 @@
1
+ /**
2
+ * Stream `docker compose up -d` so `oke dev` can show pull / start progress.
3
+ */
4
+
5
+ /** Lifecycle phase inferred from a compose progress line. */
6
+ export type ComposeUpPhase =
7
+ | "pulling"
8
+ | "pulled"
9
+ | "creating"
10
+ | "created"
11
+ | "starting"
12
+ | "started"
13
+ | "waiting"
14
+ | "healthy"
15
+ | "downloading"
16
+ | "extracting"
17
+ | "error"
18
+ | "other";
19
+
20
+ /** One parsed compose progress event (may be activity-only). */
21
+ export type ComposeUpEvent = {
22
+ /** Raw line with ANSI / CR noise stripped. */
23
+ readonly raw: string;
24
+ /** Image / service / container / network name when known. */
25
+ readonly target?: string;
26
+ /** Compose resource kind when the line names one. */
27
+ readonly kind?: "container" | "image" | "network" | "volume" | "service";
28
+ /** Lifecycle phase when known. */
29
+ readonly phase?: ComposeUpPhase;
30
+ /** Extra detail (download bar, error text). */
31
+ readonly detail?: string;
32
+ };
33
+
34
+ /** Options for {@link runComposeUp}. */
35
+ export type RunComposeUpOptions = {
36
+ readonly files: readonly string[];
37
+ readonly cwd: string;
38
+ readonly env: Readonly<Record<string, string>>;
39
+ /** Called for each meaningful progress line (after parse). */
40
+ readonly onEvent?: (event: ComposeUpEvent) => void;
41
+ };
42
+
43
+ const ANSI_RE = /\x1b\[[0-9;]*[A-Za-z]/g;
44
+
45
+ /**
46
+ * Strip ANSI escapes and normalize whitespace for parsing / display.
47
+ *
48
+ * @param text - Raw chunk or line
49
+ */
50
+ export function stripAnsi(text: string): string {
51
+ return text.replace(ANSI_RE, "").replace(/\r/g, "");
52
+ }
53
+
54
+ /**
55
+ * Shorten a compose container / image name for status chrome.
56
+ *
57
+ * @param name - Full target from compose output
58
+ */
59
+ export function shortenComposeTarget(name: string): string {
60
+ const trimmed = name.trim();
61
+ if (!trimmed) return trimmed;
62
+ // Image refs: `postgres:16-alpine` / `library/redis:7` → repo leaf
63
+ if (trimmed.includes(":")) {
64
+ const repo = trimmed.slice(0, trimmed.indexOf(":"));
65
+ const slash = repo.lastIndexOf("/");
66
+ return slash >= 0 ? repo.slice(slash + 1) : repo;
67
+ }
68
+ // `oke-<slug>-postgres-1` → `postgres` (drop replica, take last segment)
69
+ if (/^oke-/i.test(trimmed)) {
70
+ const noReplica = trimmed.replace(/-\d+$/, "");
71
+ const parts = noReplica.split("-").filter(Boolean);
72
+ const leaf = parts[parts.length - 1];
73
+ if (leaf) return leaf;
74
+ }
75
+ return trimmed;
76
+ }
77
+
78
+ /**
79
+ * Human label for a compose phase (status line suffix).
80
+ *
81
+ * @param phase - Parsed phase
82
+ */
83
+ export function composeUpPhaseLabel(phase: ComposeUpPhase): string {
84
+ switch (phase) {
85
+ case "pulling":
86
+ return "pulling…";
87
+ case "pulled":
88
+ return "pulled";
89
+ case "creating":
90
+ return "creating…";
91
+ case "created":
92
+ return "created";
93
+ case "starting":
94
+ return "starting…";
95
+ case "started":
96
+ return "started";
97
+ case "waiting":
98
+ return "waiting…";
99
+ case "healthy":
100
+ return "healthy";
101
+ case "downloading":
102
+ return "downloading…";
103
+ case "extracting":
104
+ return "extracting…";
105
+ case "error":
106
+ return "error";
107
+ case "other":
108
+ return "";
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Map a phase to a boot ● status.
114
+ *
115
+ * @param phase - Parsed phase
116
+ */
117
+ export function composeUpPhaseStatus(phase: ComposeUpPhase): "ready" | "pending" | "error" {
118
+ if (phase === "error") return "error";
119
+ if (phase === "pulled" || phase === "created" || phase === "started" || phase === "healthy") {
120
+ return "ready";
121
+ }
122
+ return "pending";
123
+ }
124
+
125
+ const KIND_PHASE: Record<string, ComposeUpPhase> = {
126
+ pulling: "pulling",
127
+ pulled: "pulled",
128
+ creating: "creating",
129
+ created: "created",
130
+ starting: "starting",
131
+ started: "started",
132
+ waiting: "waiting",
133
+ healthy: "healthy",
134
+ error: "error",
135
+ errored: "error",
136
+ failed: "error",
137
+ };
138
+
139
+ /**
140
+ * Parse one docker compose progress line into a structured event.
141
+ *
142
+ * Handles Compose plain progress (`Image x Pulling`, `Container y Started`)
143
+ * and common layer download chatter.
144
+ *
145
+ * @param line - One logical line (already split on `\n` / `\r`)
146
+ */
147
+ export function parseComposeProgressLine(line: string): ComposeUpEvent | null {
148
+ const raw = stripAnsi(line).trim();
149
+ if (!raw) return null;
150
+ // Spinner / empty chrome
151
+ if (/^[.·…]+$/.test(raw)) return null;
152
+
153
+ const kinded =
154
+ /^(Container|Image|Network|Volume|Service)\s+(.+?)\s+(Pulling|Pulled|Creating|Created|Starting|Started|Waiting|Healthy|Error|Errored|Failed)\b/i.exec(
155
+ raw,
156
+ );
157
+ if (kinded?.[1] && kinded[2] && kinded[3]) {
158
+ const phase = KIND_PHASE[kinded[3].toLowerCase()] ?? "other";
159
+ const kind = kinded[1].toLowerCase() as ComposeUpEvent["kind"];
160
+ return { raw, target: kinded[2].trim(), kind, phase };
161
+ }
162
+
163
+ // `postgres Pulling` / `postgres Pulled` (service-keyed)
164
+ const bare =
165
+ /^([A-Za-z0-9][A-Za-z0-9._/-]*)\s+(Pulling|Pulled|Creating|Created|Starting|Started|Waiting|Healthy)\b/i.exec(
166
+ raw,
167
+ );
168
+ if (bare?.[1] && bare[2]) {
169
+ const phase = KIND_PHASE[bare[2].toLowerCase()] ?? "other";
170
+ return { raw, target: bare[1], phase };
171
+ }
172
+
173
+ if (/\bDownloading\b/i.test(raw) || /\bDownload complete\b/i.test(raw)) {
174
+ return { raw, phase: "downloading", detail: raw };
175
+ }
176
+ if (/\bExtracting\b/i.test(raw) || /\bPull complete\b/i.test(raw)) {
177
+ return { raw, phase: "extracting", detail: raw };
178
+ }
179
+ if (/\b(error|failed|fatal)\b/i.test(raw)) {
180
+ return { raw, phase: "error", detail: raw };
181
+ }
182
+
183
+ // Keep other non-empty lines as activity so pulls never look frozen.
184
+ return { raw, phase: "other", detail: raw };
185
+ }
186
+
187
+ /**
188
+ * Format a status message for one compose event.
189
+ *
190
+ * @param event - Parsed event
191
+ */
192
+ export function formatComposeUpEventMessage(event: ComposeUpEvent): string {
193
+ if (event.target && event.phase && event.phase !== "other") {
194
+ const label = composeUpPhaseLabel(event.phase);
195
+ const name = shortenComposeTarget(event.target);
196
+ return label ? `${name} ${label}` : name;
197
+ }
198
+ if (event.detail) {
199
+ // Cap long download bars for the status chrome.
200
+ const d = event.detail.length > 72 ? `${event.detail.slice(0, 69)}…` : event.detail;
201
+ return d;
202
+ }
203
+ return event.raw.length > 72 ? `${event.raw.slice(0, 69)}…` : event.raw;
204
+ }
205
+
206
+ /**
207
+ * Pump a byte stream into logical lines (`\n` and `\r`), invoking `onLine`.
208
+ *
209
+ * @param stream - Process stdout/stderr
210
+ * @param onLine - Per logical line
211
+ * @param collect - Append raw text for error reporting
212
+ */
213
+ async function pumpComposeStream(
214
+ stream: ReadableStream<Uint8Array> | null,
215
+ onLine: (line: string) => void,
216
+ collect: (chunk: string) => void,
217
+ ): Promise<void> {
218
+ if (!stream) return;
219
+ const reader = stream.getReader();
220
+ const dec = new TextDecoder();
221
+ let buf = "";
222
+ for (;;) {
223
+ const { done, value } = await reader.read();
224
+ if (done) break;
225
+ const chunk = dec.decode(value, { stream: true });
226
+ collect(chunk);
227
+ buf += chunk;
228
+ // Progress bars use `\r`; treat both as line breaks.
229
+ for (;;) {
230
+ const nl = buf.search(/[\r\n]/);
231
+ if (nl < 0) break;
232
+ const line = buf.slice(0, nl);
233
+ const sep = buf[nl];
234
+ buf = buf.slice(nl + 1);
235
+ // Swallow the LF of a CRLF pair.
236
+ if (sep === "\r" && buf.startsWith("\n")) buf = buf.slice(1);
237
+ if (line.length > 0) onLine(line);
238
+ }
239
+ }
240
+ if (buf.length > 0) onLine(buf);
241
+ }
242
+
243
+ /**
244
+ * Run `docker compose … up -d --remove-orphans --progress=plain`, streaming
245
+ * progress events. Throws when the process exits non-zero.
246
+ *
247
+ * @param options - Files, cwd, env, optional event sink
248
+ */
249
+ export async function runComposeUp(options: RunComposeUpOptions): Promise<void> {
250
+ const args = [
251
+ "compose",
252
+ "--progress",
253
+ "plain",
254
+ ...options.files.flatMap((f) => ["-f", f]),
255
+ "up",
256
+ "-d",
257
+ "--remove-orphans",
258
+ ];
259
+ const proc = Bun.spawn(["docker", ...args], {
260
+ cwd: options.cwd,
261
+ stdout: "pipe",
262
+ stderr: "pipe",
263
+ env: {
264
+ ...process.env,
265
+ ...options.env,
266
+ BUILDKIT_PROGRESS: "plain",
267
+ COMPOSE_ANSI: "never",
268
+ },
269
+ });
270
+
271
+ let stdout = "";
272
+ let stderr = "";
273
+ const emitLine = (line: string): void => {
274
+ const event = parseComposeProgressLine(line);
275
+ if (!event) return;
276
+ options.onEvent?.(event);
277
+ };
278
+
279
+ await Promise.all([
280
+ pumpComposeStream(proc.stdout, emitLine, (c) => {
281
+ stdout += c;
282
+ }),
283
+ pumpComposeStream(proc.stderr, emitLine, (c) => {
284
+ stderr += c;
285
+ }),
286
+ ]);
287
+ const code = await proc.exited;
288
+ if (code !== 0) {
289
+ const detail = [stdout.trim(), stderr.trim()].filter(Boolean).join("\n");
290
+ throw new Error(`oke dev: docker compose exited ${code}` + (detail ? `\n${detail}` : ""));
291
+ }
292
+ }
@@ -463,7 +463,7 @@ export function buildStackEnv(
463
463
  env.OKE_STORE_INDEX_URL = url;
464
464
  env.OKE_STORE_INDEX_KEY = spec.credentials.password;
465
465
  } else if (spec.role === "ai") {
466
- // Ollama: standalone HTTP URL; model is a stack control (OKE_AI_MODEL).
466
+ // Unsupported compose role prefer BYO `OKE_AI_URL` for cloud / local servers.
467
467
  env[`${prefix}_URL`] = url;
468
468
  env.OKE_AI_URL = url;
469
469
  } else if (spec.role === "proxy") {
@@ -508,7 +508,7 @@ const ROLE_SECTION_TITLE: Readonly<Record<string, string>> = {
508
508
  "store.index": "store.index — search index",
509
509
  "channel.email": "channel.email — Mailpit (SMTP + UI)",
510
510
  signal: "signal — message bus",
511
- ai: "ai — local inference (llama.cpp / Ollama / vLLM / SGLang)",
511
+ ai: "ai — (unsupported; use OKE_AI_URL)",
512
512
  proxy: "proxy — edge reverse proxy (Caddy / Traefik / nginx)",
513
513
  };
514
514
 
@@ -561,7 +561,7 @@ const ROLE_ALIASES: Readonly<Record<string, readonly string[]>> = {
561
561
  "MP_SMTP_AUTH_ALLOW_INSECURE",
562
562
  ],
563
563
  // OKE_AI_URL is already emitted as `${prefix}_URL` — do not alias it again.
564
- ai: ["OKE_AI_MODEL", "OKE_AI_CTX_SIZE"],
564
+ ai: [],
565
565
  proxy: ["OKE_PROXY_HOST", "OKE_PROXY_ACME_EMAIL"],
566
566
  "store.index": ["OKE_STORE_INDEX_KEY"],
567
567
  };
@@ -578,11 +578,6 @@ const ROLE_CONTROL_EXAMPLES: Readonly<Record<string, readonly string[]>> = {
578
578
  "MP_SMTP_AUTH_ACCEPT_ANY=1",
579
579
  "MP_SMTP_AUTH_ALLOW_INSECURE=1",
580
580
  ],
581
- // Curated Docker Hub `ai/` model id for llama.cpp; Ollama tags differ.
582
- // OKE_AI_CTX_SIZE bounds the KV cache llama-server allocates at load —
583
- // left at the model's full native context (often 32K-256K+), a small
584
- // model's KV cache alone can OOM the container regardless of host RAM.
585
- ai: ["OKE_AI_MODEL=granite3.3:2b", "OKE_AI_CTX_SIZE=4096"],
586
581
  proxy: ["OKE_PROXY_HOST=localhost", "OKE_PROXY_ACME_EMAIL=admin@example.com"],
587
582
  };
588
583
 
@@ -600,12 +595,7 @@ function roleFromEnvKey(key: string): string | undefined {
600
595
  }
601
596
  if (key === "PGDATA" || key === "POSTGRES_INITDB_ARGS") return "store.sql";
602
597
  if (key.startsWith("OKE_STORE_KV_MAXMEMORY")) return "store.kv";
603
- if (
604
- key === "OKE_AI_URL" ||
605
- key === "OKE_AI_MODEL" ||
606
- key === "OKE_AI_CTX_SIZE" ||
607
- key === "OLLAMA_HOST"
608
- ) {
598
+ if (key === "OKE_AI_URL" || key === "OKE_AI_MODEL") {
609
599
  return "ai";
610
600
  }
611
601
  if (key === "OKE_PROXY_URL" || key === "OKE_PROXY_HOST" || key === "OKE_PROXY_ACME_EMAIL") {
@@ -17,12 +17,6 @@ import {
17
17
  import { emitDockerfile } from "./dockerfile.ts";
18
18
  import { buildCaddyfile } from "./recipes/caddy.ts";
19
19
  import { buildNginxConf } from "./recipes/nginx.ts";
20
- import {
21
- buildLlamaCppEntrypoint,
22
- LLAMA_CPP_ENTRYPOINT_FILE,
23
- LLAMA_CPP_ENTRYPOINT_HOST_PATH,
24
- llamaCpp,
25
- } from "./recipes/llama-cpp.ts";
26
20
  import { buildPgDogToml, buildPgDogUsersToml, PGDOG_CONFIG_DIR } from "./recipes/pgdog.ts";
27
21
  import {
28
22
  emitPostgresAdvisorDockerfile,
@@ -33,6 +27,9 @@ import type { DeriveOptions, DeriveResult, GeneratedFile } from "./types.ts";
33
27
  import { DEFAULT_DOCKER_DIR } from "./types.ts";
34
28
  import { APP_PORT } from "../runtime/types.ts";
35
29
 
30
+ /** Legacy llama.cpp entrypoint path (relative to compose dir) — pruned once. */
31
+ const LEGACY_LLAMA_ENTRYPOINT_HOST_PATH = "../.oke/llama-entrypoint.py";
32
+
36
33
  /**
37
34
  * Derive infrastructure files from normalised image pins.
38
35
  *
@@ -76,7 +73,6 @@ export function deriveInfrastructure(options: DeriveOptions): DeriveResult {
76
73
  ...composeFilesContent,
77
74
  ...pgdogConfigFiles(specs),
78
75
  ...proxyConfigFiles(specs, normalised.appPort),
79
- ...llamaCppEntrypointFiles(specs),
80
76
  ...postgresAdvisorDockerfileFiles(specs),
81
77
  ];
82
78
 
@@ -112,25 +108,6 @@ function postgresAdvisorDockerfileFiles(specs: DeriveResult["specs"]): Generated
112
108
  ];
113
109
  }
114
110
 
115
- /**
116
- * Emit `.oke/llama-entrypoint.py` (path relative to compose dir) when the AI
117
- * role is llama.cpp so first boot can Hub-pull then serve single-model
118
- * (router `--docker-repo` hangs on b10290+). Kept out of `docker/` so app
119
- * trees stay TypeScript-only.
120
- *
121
- * @param specs - Normalised services
122
- */
123
- function llamaCppEntrypointFiles(specs: DeriveResult["specs"]): GeneratedFile[] {
124
- const ai = specs.find((s) => s.role === "ai");
125
- if (!ai || !llamaCpp.match(ai.image)) return [];
126
- return [
127
- {
128
- path: LLAMA_CPP_ENTRYPOINT_HOST_PATH,
129
- content: buildLlamaCppEntrypoint(),
130
- },
131
- ];
132
- }
133
-
134
111
  /**
135
112
  * Emit PgDog TOML configs when both `pgdog` and `store.sql` are in the stack.
136
113
  *
@@ -208,7 +185,7 @@ export async function writeDerivedFiles(
208
185
  mkdirSync(root, { recursive: true });
209
186
  const keep = new Set(result.files.map((f) => f.path));
210
187
  pruneStaleGenerated(root, keep);
211
- pruneLlamaEntrypoint(root, keep);
188
+ pruneLegacyLlamaEntrypoint(root);
212
189
  for (const file of result.files) {
213
190
  const path = join(root, file.path);
214
191
  mkdirSync(dirname(path), { recursive: true });
@@ -255,21 +232,19 @@ const PRUNE_ROOT_FILES = new Set([
255
232
  "compose.prod.yml",
256
233
  "Caddyfile",
257
234
  "nginx.conf",
258
- // Legacy: entrypoint used to land in `docker/`; now `.oke/` only.
259
- LLAMA_CPP_ENTRYPOINT_FILE,
235
+ // Legacy: llama.cpp entrypoint used to land in `docker/`.
236
+ "llama-entrypoint.py",
260
237
  "pgdog.toml",
261
238
  "users.toml",
262
239
  ]);
263
240
 
264
241
  /**
265
- * Drop `.oke/llama-entrypoint.py` when the stack no longer uses llama.cpp.
242
+ * Drop stale `.oke/llama-entrypoint.py` from older stacks (AI recipes removed).
266
243
  *
267
244
  * @param root - Compose directory (`docker/`)
268
- * @param keep - Relative paths that will be rewritten
269
245
  */
270
- function pruneLlamaEntrypoint(root: string, keep: ReadonlySet<string>): void {
271
- if (keep.has(LLAMA_CPP_ENTRYPOINT_HOST_PATH)) return;
272
- const abs = join(root, LLAMA_CPP_ENTRYPOINT_HOST_PATH);
246
+ function pruneLegacyLlamaEntrypoint(root: string): void {
247
+ const abs = join(root, LEGACY_LLAMA_ENTRYPOINT_HOST_PATH);
273
248
  try {
274
249
  unlinkSync(abs);
275
250
  } catch {