okengine 0.9.0 → 0.10.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 (175) hide show
  1. package/AGENTS.md +1 -1
  2. package/manifest.v1.schema.json +9 -1
  3. package/package.json +3 -3
  4. package/site/content/docs/console/runs.mdx +10 -0
  5. package/site/content/docs/console/traces.mdx +4 -0
  6. package/site/content/docs/elements/ai.mdx +54 -32
  7. package/site/content/docs/elements/channel.mdx +105 -14
  8. package/site/content/docs/elements/clock.mdx +1 -0
  9. package/site/content/docs/elements/flow.mdx +42 -8
  10. package/site/content/docs/get-started/basic-usage.mdx +5 -1
  11. package/site/content/docs/get-started/installation.mdx +9 -5
  12. package/site/content/docs/meta.json +2 -0
  13. package/site/content/docs/plugins/otp.mdx +58 -46
  14. package/site/content/docs/providers/azure-redis.mdx +85 -0
  15. package/site/content/docs/providers/cockroachdb.mdx +86 -0
  16. package/site/content/docs/providers/digitalocean-caching.mdx +88 -0
  17. package/site/content/docs/providers/dragonfly-cloud.mdx +82 -0
  18. package/site/content/docs/providers/elasticache.mdx +92 -0
  19. package/site/content/docs/providers/index.mdx +101 -0
  20. package/site/content/docs/providers/memorystore.mdx +89 -0
  21. package/site/content/docs/providers/meta.json +20 -0
  22. package/site/content/docs/providers/neon.mdx +115 -0
  23. package/site/content/docs/providers/redis-cloud.mdx +93 -0
  24. package/site/content/docs/providers/supabase.mdx +117 -0
  25. package/site/content/docs/providers/upstash.mdx +91 -0
  26. package/site/content/docs/providers/yugabytedb.mdx +95 -0
  27. package/site/content/docs/recipes/caddy.mdx +128 -0
  28. package/site/content/docs/recipes/cockroachdb.mdx +127 -0
  29. package/site/content/docs/recipes/dragonfly.mdx +125 -0
  30. package/site/content/docs/recipes/index.mdx +146 -0
  31. package/site/content/docs/recipes/llama-cpp.mdx +153 -0
  32. package/site/content/docs/recipes/mailpit.mdx +136 -0
  33. package/site/content/docs/recipes/meilisearch.mdx +139 -0
  34. package/site/content/docs/recipes/meta.json +31 -0
  35. package/site/content/docs/recipes/ollama.mdx +142 -0
  36. package/site/content/docs/recipes/openbao.mdx +141 -0
  37. package/site/content/docs/recipes/pgdog.mdx +137 -0
  38. package/site/content/docs/recipes/postgres.mdx +136 -0
  39. package/site/content/docs/recipes/redis.mdx +130 -0
  40. package/site/content/docs/recipes/rustfs.mdx +148 -0
  41. package/site/content/docs/recipes/sglang.mdx +105 -0
  42. package/site/content/docs/recipes/supabase-docker.mdx +145 -0
  43. package/site/content/docs/recipes/timescale.mdx +129 -0
  44. package/site/content/docs/recipes/traefik.mdx +136 -0
  45. package/site/content/docs/recipes/valkey.mdx +121 -0
  46. package/site/content/docs/recipes/vllm.mdx +106 -0
  47. package/site/content/docs/recipes/yugabytedb.mdx +135 -0
  48. package/site/content/docs/reference/cli.md +42 -6
  49. package/site/content/docs/reference/configuration.mdx +5 -3
  50. package/site/content/docs/reference/environment-variables.mdx +12 -12
  51. package/site/content/docs/reference/fx.mdx +38 -4
  52. package/src/auth/otp-capability.ts +14 -14
  53. package/src/cli/ai-setup/ai-setup.test.ts +32 -12
  54. package/src/cli/ai-setup/apply.ts +65 -23
  55. package/src/cli/ai-setup/catalog.ts +1316 -35
  56. package/src/cli/ai-setup/detect-ollama.ts +47 -0
  57. package/src/cli/ai-setup/index.ts +44 -7
  58. package/src/cli/ai-setup/prompts.ts +430 -486
  59. package/src/cli/ai-setup/recommend.test.ts +150 -50
  60. package/src/cli/ai-setup/recommend.ts +118 -101
  61. package/src/cli/ask-seed.test.ts +68 -0
  62. package/src/cli/ask-seed.ts +79 -0
  63. package/src/cli/db-seed-redact.test.ts +25 -0
  64. package/src/cli/db-seed.ts +36 -7
  65. package/src/cli/db.test.ts +1 -1
  66. package/src/cli/db.ts +2 -2
  67. package/src/cli/dev-controls.test.ts +107 -0
  68. package/src/cli/dev-controls.ts +354 -0
  69. package/src/cli/dev-schema-sync.ts +12 -4
  70. package/src/cli/dev.test.ts +50 -30
  71. package/src/cli/dev.ts +607 -66
  72. package/src/cli/drizzle-env.test.ts +40 -6
  73. package/src/cli/drizzle-env.ts +22 -1
  74. package/src/cli/ensure-drizzle-config.ts +6 -4
  75. package/src/cli/hero-meta.test.ts +13 -1
  76. package/src/cli/hero-meta.ts +28 -6
  77. package/src/cli/index.ts +5 -0
  78. package/src/cli/registry.ts +24 -0
  79. package/src/cli/replay.test.ts +105 -0
  80. package/src/cli/replay.ts +206 -0
  81. package/src/compiler/extract.ts +3 -3
  82. package/src/config/index.ts +3 -3
  83. package/src/console/server/claim.ts +3 -1
  84. package/src/console/ui/dist/assets/{index-ClX0ZCe5.js → index-D-9KFce5.js} +2 -2
  85. package/src/console/ui/dist/assets/panel-overview-CW0CQEc2.js +1 -0
  86. package/src/console/ui/dist/assets/panel-runs-BxuyDI3x.js +1 -0
  87. package/src/console/ui/dist/assets/{panel-signals-Dsxdu_AR.js → panel-signals-BXofbj7v.js} +1 -1
  88. package/src/console/ui/dist/assets/{panel-store-hy7O8HOs.js → panel-store-B8mH-arU.js} +1 -1
  89. package/src/console/ui/dist/assets/{panel-traces-CBiAe5go.js → panel-traces-DSA-ZWnf.js} +1 -1
  90. package/src/console/ui/dist/index.html +1 -1
  91. package/src/console/ui/overview/slo.ts +31 -3
  92. package/src/console/ui/overview/types.ts +6 -0
  93. package/src/console/ui/runs/errors.test.ts +53 -0
  94. package/src/console/ui/runs/errors.ts +88 -0
  95. package/src/console/ui/runs/index.ts +8 -0
  96. package/src/console/ui/runs/search.ts +16 -0
  97. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +72 -1
  98. package/src/docker/ai-model-status.test.ts +101 -0
  99. package/src/docker/ai-model-status.ts +276 -0
  100. package/src/docker/compose-health.test.ts +115 -0
  101. package/src/docker/compose-health.ts +234 -0
  102. package/src/docker/compose.ts +24 -8
  103. package/src/docker/derive.ts +35 -9
  104. package/src/docker/docker.test.ts +304 -12
  105. package/src/docker/helpers.ts +56 -0
  106. package/src/docker/index.ts +52 -0
  107. package/src/docker/ollama-pull.ts +232 -0
  108. package/src/docker/recipes/cockroach.ts +24 -0
  109. package/src/docker/recipes/index.ts +32 -0
  110. package/src/docker/recipes/llama-cpp.ts +273 -0
  111. package/src/docker/recipes/ollama.ts +19 -23
  112. package/src/docker/recipes/pgdog.ts +4 -1
  113. package/src/docker/recipes/postgres.ts +5 -18
  114. package/src/docker/recipes/sglang.ts +55 -0
  115. package/src/docker/recipes/supabase.ts +21 -0
  116. package/src/docker/recipes/timescale.ts +18 -0
  117. package/src/docker/recipes/vllm.ts +44 -0
  118. package/src/docker/recipes/yugabyte.ts +23 -0
  119. package/src/docker/stack-id.test.ts +22 -0
  120. package/src/docker/stack-id.ts +38 -4
  121. package/src/docker/types.ts +15 -0
  122. package/src/drivers/ai-ollama.integration.test.ts +7 -4
  123. package/src/drivers/signal-engine.ts +10 -0
  124. package/src/drivers/signal-postgres.ts +24 -2
  125. package/src/drivers/signal-types.ts +10 -0
  126. package/src/elements/channel/fallback.test.ts +91 -0
  127. package/src/elements/channel/hard-bounce.test.ts +82 -0
  128. package/src/elements/channel/injection.test.ts +153 -0
  129. package/src/elements/channel/locale-ar.test.ts +102 -0
  130. package/src/elements/channel/otp-delivery.ts +5 -2
  131. package/src/elements/channel/receipts-ledger.test.ts +100 -0
  132. package/src/elements/channel/runtime.ts +24 -1
  133. package/src/elements/channel/test-helpers.ts +60 -0
  134. package/src/elements/channel/whatsapp-compliance.test.ts +124 -0
  135. package/src/elements/store/cache.ts +1 -1
  136. package/src/elements/store/emit-drizzle.ts +43 -9
  137. package/src/elements/store/runtime.ts +1 -1
  138. package/src/elements/store/schema-decl.test.ts +2 -0
  139. package/src/elements/store/schema-decl.ts +15 -0
  140. package/src/elements/store/seed.ts +1 -1
  141. package/src/index.ts +1 -0
  142. package/src/kernel/app.ts +118 -11
  143. package/src/kernel/boot-bind/signal.ts +6 -2
  144. package/src/kernel/boot-bind/store.ts +2 -1
  145. package/src/kernel/boot.test.ts +6 -5
  146. package/src/kernel/boot.ts +8 -3
  147. package/src/kernel/compensate.test.ts +131 -0
  148. package/src/kernel/correlation.test.ts +108 -0
  149. package/src/kernel/effect-timing.test.ts +82 -0
  150. package/src/kernel/flow.ts +38 -0
  151. package/src/kernel/fx-runs.test.ts +49 -0
  152. package/src/kernel/fx.test.ts +14 -0
  153. package/src/kernel/fx.ts +111 -1
  154. package/src/manifest/types.ts +8 -2
  155. package/src/plugins/auth-delivery.mailpit.integration.test.ts +1 -1
  156. package/src/plugins/auth-methods.security.test.ts +3 -3
  157. package/src/plugins/auth-methods.test.ts +1 -1
  158. package/src/plugins/index.ts +2 -2
  159. package/src/plugins/otp.test.ts +21 -19
  160. package/src/plugins/otp.ts +36 -34
  161. package/src/plugins/taqnyat.live.test.ts +3 -3
  162. package/src/runs/collect.ts +3 -0
  163. package/src/runs/export-otlp.ts +64 -0
  164. package/src/runs/index.ts +16 -0
  165. package/src/runs/parquet.ts +9 -0
  166. package/src/runs/types.ts +5 -0
  167. package/src/runs/window.test.ts +68 -0
  168. package/src/runs/window.ts +148 -0
  169. package/src/runtime/boot-warn.test.ts +45 -0
  170. package/src/runtime/boot-warn.ts +17 -0
  171. package/src/runtime/dev-request-log.ts +5 -5
  172. package/src/term.test.ts +95 -10
  173. package/src/term.ts +369 -14
  174. package/src/console/ui/dist/assets/panel-overview-DONDzBd2.js +0 -1
  175. package/src/console/ui/dist/assets/panel-runs-D5zf-D9c.js +0 -1
@@ -138,6 +138,13 @@ export async function detectOllama(
138
138
  };
139
139
  }
140
140
 
141
+ /** Detected host hardware for the Ollama banner. */
142
+ export type MachineInfo = {
143
+ readonly osName: string;
144
+ readonly cpuCount: number | null;
145
+ readonly ramGb: number | null;
146
+ };
147
+
141
148
  /**
142
149
  * Best-effort total system RAM in GB.
143
150
  */
@@ -164,3 +171,43 @@ export function detectTotalRamGb(): number | null {
164
171
  }
165
172
  return null;
166
173
  }
174
+
175
+ /**
176
+ * Best-effort OS name · CPU count · RAM for the Ollama banner.
177
+ */
178
+ export function detectMachineInfo(): MachineInfo {
179
+ const osName =
180
+ process.platform === "darwin"
181
+ ? "macOS"
182
+ : process.platform === "linux"
183
+ ? "Linux"
184
+ : process.platform === "win32"
185
+ ? "Windows"
186
+ : process.platform;
187
+
188
+ let cpuCount: number | null = null;
189
+ try {
190
+ if (process.platform === "darwin") {
191
+ const proc = Bun.spawnSync(["sysctl", "-n", "hw.ncpu"], { stdout: "pipe" });
192
+ if (proc.exitCode === 0) {
193
+ const n = Number(proc.stdout.toString().trim());
194
+ if (Number.isFinite(n) && n > 0) cpuCount = n;
195
+ }
196
+ } else if (typeof navigator !== "undefined" && "hardwareConcurrency" in navigator) {
197
+ const n = Number(navigator.hardwareConcurrency);
198
+ if (Number.isFinite(n) && n > 0) cpuCount = n;
199
+ }
200
+ } catch {
201
+ // ignore
202
+ }
203
+ if (cpuCount === null) {
204
+ try {
205
+ const n = (process as { availableParallelism?: () => number }).availableParallelism?.();
206
+ if (typeof n === "number" && Number.isFinite(n) && n > 0) cpuCount = n;
207
+ } catch {
208
+ // ignore
209
+ }
210
+ }
211
+
212
+ return { osName, cpuCount, ramGb: detectTotalRamGb() };
213
+ }
@@ -100,11 +100,12 @@ export function aiSetupHelp(): string {
100
100
 
101
101
  Usage:
102
102
  oke ai setup
103
+ oke ai setup --provider llama-cpp --yes
103
104
  oke ai setup --provider ollama --yes
104
105
  oke ai setup --provider anthropic --chat claude-sonnet-4-20250514 --yes
105
106
 
106
107
  Options:
107
- --provider <id> ollama | openai | anthropic | gemini | lmstudio | openrouter | custom
108
+ --provider <id> llama-cpp | ollama | vllm | sglang | openai | anthropic | gemini | lmstudio | openrouter | custom
108
109
  --chat <model> Chat model id
109
110
  --vision <model> Vision model id (ollama)
110
111
  --embed <model> Embedding model id (ollama)
@@ -151,16 +152,21 @@ export async function runAiSetup(args: AiSetupCliArgs): Promise<number> {
151
152
  if (input === null) return 1;
152
153
 
153
154
  if (args.pull && input.driver === "ollama" && (args.yes || !tty) && args.chat) {
154
- // Non-interactive pull of requested models
155
+ // Non-interactive pull via the server HTTP API (never a host `ollama` CLI).
156
+ const { ensureOllamaModel } = await import("../../docker/ollama-pull.ts");
157
+ const baseUrl =
158
+ input.baseUrl?.trim() || process.env.OKE_AI_URL?.trim() || "http://127.0.0.1:11434";
155
159
  const toPull = [input.chatModel, input.visionModel, input.embedModel].filter(
156
160
  (m): m is string => typeof m === "string" && m.length > 0,
157
161
  );
158
162
  for (const id of toPull) {
159
- const proc = Bun.spawn(["ollama", "pull", id], {
160
- stdout: "inherit",
161
- stderr: "inherit",
162
- });
163
- await proc.exited;
163
+ console.log(`oke ai setup: pulling ${id} via ${baseUrl}/api/pull…`);
164
+ try {
165
+ await ensureOllamaModel({ url: baseUrl, model: id });
166
+ } catch (err) {
167
+ const msg = err instanceof Error ? err.message : String(err);
168
+ console.error(`oke ai setup: pull ${id} failed (continuing) — ${msg}`);
169
+ }
164
170
  }
165
171
  }
166
172
 
@@ -192,6 +198,16 @@ export async function runAiSetup(args: AiSetupCliArgs): Promise<number> {
192
198
  */
193
199
  function nonInteractiveInput(args: AiSetupCliArgs): AiSetupApplyInput {
194
200
  const provider = args.provider!;
201
+ if (provider === "llama-cpp") {
202
+ return {
203
+ driver: "openai-compatible",
204
+ baseUrl: process.env.OKE_AI_URL ?? "http://127.0.0.1:8080/v1",
205
+ chatModel: args.chat ?? "smollm2",
206
+ visionModel: null,
207
+ embedModel: null,
208
+ image: "ghcr.io/ggml-org/llama.cpp:server-b10290",
209
+ };
210
+ }
195
211
  if (provider === "ollama") {
196
212
  return {
197
213
  driver: "ollama",
@@ -199,6 +215,27 @@ function nonInteractiveInput(args: AiSetupCliArgs): AiSetupApplyInput {
199
215
  chatModel: args.chat ?? "gemma4:e4b",
200
216
  visionModel: args.vision === undefined ? "qwen3-vl:4b" : args.vision || null,
201
217
  embedModel: args.embed ?? "nomic-embed-text",
218
+ image: "ollama/ollama:0.32.6",
219
+ };
220
+ }
221
+ if (provider === "vllm") {
222
+ return {
223
+ driver: "openai-compatible",
224
+ baseUrl: process.env.OKE_AI_URL ?? "http://127.0.0.1:8000/v1",
225
+ chatModel: args.chat ?? "Qwen/Qwen3-0.6B",
226
+ visionModel: null,
227
+ embedModel: null,
228
+ image: "vllm/vllm-openai:v0.26.0",
229
+ };
230
+ }
231
+ if (provider === "sglang") {
232
+ return {
233
+ driver: "openai-compatible",
234
+ baseUrl: process.env.OKE_AI_URL ?? "http://127.0.0.1:30000/v1",
235
+ chatModel: args.chat ?? "Qwen/Qwen3-0.6B",
236
+ visionModel: null,
237
+ embedModel: null,
238
+ image: "lmsysorg/sglang:v0.5.16-runtime",
202
239
  };
203
240
  }
204
241
  if (provider === "anthropic") {