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
@@ -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 {