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.
- package/AGENTS.md +1 -1
- package/manifest.v1.schema.json +9 -1
- package/package.json +3 -3
- package/site/content/docs/console/runs.mdx +10 -0
- package/site/content/docs/console/traces.mdx +4 -0
- package/site/content/docs/elements/ai.mdx +54 -32
- package/site/content/docs/elements/channel.mdx +105 -14
- package/site/content/docs/elements/clock.mdx +1 -0
- package/site/content/docs/elements/flow.mdx +42 -8
- package/site/content/docs/get-started/basic-usage.mdx +5 -1
- package/site/content/docs/get-started/installation.mdx +9 -5
- package/site/content/docs/meta.json +2 -0
- package/site/content/docs/plugins/otp.mdx +58 -46
- package/site/content/docs/providers/azure-redis.mdx +85 -0
- package/site/content/docs/providers/cockroachdb.mdx +86 -0
- package/site/content/docs/providers/digitalocean-caching.mdx +88 -0
- package/site/content/docs/providers/dragonfly-cloud.mdx +82 -0
- package/site/content/docs/providers/elasticache.mdx +92 -0
- package/site/content/docs/providers/index.mdx +101 -0
- package/site/content/docs/providers/memorystore.mdx +89 -0
- package/site/content/docs/providers/meta.json +20 -0
- package/site/content/docs/providers/neon.mdx +115 -0
- package/site/content/docs/providers/redis-cloud.mdx +93 -0
- package/site/content/docs/providers/supabase.mdx +117 -0
- package/site/content/docs/providers/upstash.mdx +91 -0
- package/site/content/docs/providers/yugabytedb.mdx +95 -0
- package/site/content/docs/recipes/caddy.mdx +128 -0
- package/site/content/docs/recipes/cockroachdb.mdx +127 -0
- package/site/content/docs/recipes/dragonfly.mdx +125 -0
- package/site/content/docs/recipes/index.mdx +146 -0
- package/site/content/docs/recipes/llama-cpp.mdx +153 -0
- package/site/content/docs/recipes/mailpit.mdx +136 -0
- package/site/content/docs/recipes/meilisearch.mdx +139 -0
- package/site/content/docs/recipes/meta.json +31 -0
- package/site/content/docs/recipes/ollama.mdx +142 -0
- package/site/content/docs/recipes/openbao.mdx +141 -0
- package/site/content/docs/recipes/pgdog.mdx +137 -0
- package/site/content/docs/recipes/postgres.mdx +136 -0
- package/site/content/docs/recipes/redis.mdx +130 -0
- package/site/content/docs/recipes/rustfs.mdx +148 -0
- package/site/content/docs/recipes/sglang.mdx +105 -0
- package/site/content/docs/recipes/supabase-docker.mdx +145 -0
- package/site/content/docs/recipes/timescale.mdx +129 -0
- package/site/content/docs/recipes/traefik.mdx +136 -0
- package/site/content/docs/recipes/valkey.mdx +121 -0
- package/site/content/docs/recipes/vllm.mdx +106 -0
- package/site/content/docs/recipes/yugabytedb.mdx +135 -0
- package/site/content/docs/reference/cli.md +42 -6
- package/site/content/docs/reference/configuration.mdx +5 -3
- package/site/content/docs/reference/environment-variables.mdx +12 -12
- package/site/content/docs/reference/fx.mdx +38 -4
- package/src/auth/otp-capability.ts +14 -14
- package/src/cli/ai-setup/ai-setup.test.ts +32 -12
- package/src/cli/ai-setup/apply.ts +65 -23
- package/src/cli/ai-setup/catalog.ts +1316 -35
- package/src/cli/ai-setup/detect-ollama.ts +47 -0
- package/src/cli/ai-setup/index.ts +44 -7
- package/src/cli/ai-setup/prompts.ts +430 -486
- package/src/cli/ai-setup/recommend.test.ts +150 -50
- package/src/cli/ai-setup/recommend.ts +118 -101
- package/src/cli/ask-seed.test.ts +68 -0
- package/src/cli/ask-seed.ts +79 -0
- package/src/cli/db-seed-redact.test.ts +25 -0
- package/src/cli/db-seed.ts +36 -7
- package/src/cli/db.test.ts +1 -1
- package/src/cli/db.ts +2 -2
- package/src/cli/dev-controls.test.ts +107 -0
- package/src/cli/dev-controls.ts +354 -0
- package/src/cli/dev-schema-sync.ts +12 -4
- package/src/cli/dev.test.ts +50 -30
- package/src/cli/dev.ts +607 -66
- package/src/cli/drizzle-env.test.ts +40 -6
- package/src/cli/drizzle-env.ts +22 -1
- package/src/cli/ensure-drizzle-config.ts +6 -4
- package/src/cli/hero-meta.test.ts +13 -1
- package/src/cli/hero-meta.ts +28 -6
- package/src/cli/index.ts +5 -0
- package/src/cli/registry.ts +24 -0
- package/src/cli/replay.test.ts +105 -0
- package/src/cli/replay.ts +206 -0
- package/src/compiler/extract.ts +3 -3
- package/src/config/index.ts +3 -3
- package/src/console/server/claim.ts +3 -1
- package/src/console/ui/dist/assets/{index-ClX0ZCe5.js → index-D-9KFce5.js} +2 -2
- package/src/console/ui/dist/assets/panel-overview-CW0CQEc2.js +1 -0
- package/src/console/ui/dist/assets/panel-runs-BxuyDI3x.js +1 -0
- package/src/console/ui/dist/assets/{panel-signals-Dsxdu_AR.js → panel-signals-BXofbj7v.js} +1 -1
- package/src/console/ui/dist/assets/{panel-store-hy7O8HOs.js → panel-store-B8mH-arU.js} +1 -1
- package/src/console/ui/dist/assets/{panel-traces-CBiAe5go.js → panel-traces-DSA-ZWnf.js} +1 -1
- package/src/console/ui/dist/index.html +1 -1
- package/src/console/ui/overview/slo.ts +31 -3
- package/src/console/ui/overview/types.ts +6 -0
- package/src/console/ui/runs/errors.test.ts +53 -0
- package/src/console/ui/runs/errors.ts +88 -0
- package/src/console/ui/runs/index.ts +8 -0
- package/src/console/ui/runs/search.ts +16 -0
- package/src/console/ui/shell/panels/runs/RunsPanel.tsx +72 -1
- package/src/docker/ai-model-status.test.ts +101 -0
- package/src/docker/ai-model-status.ts +276 -0
- package/src/docker/compose-health.test.ts +115 -0
- package/src/docker/compose-health.ts +234 -0
- package/src/docker/compose.ts +24 -8
- package/src/docker/derive.ts +35 -9
- package/src/docker/docker.test.ts +304 -12
- package/src/docker/helpers.ts +56 -0
- package/src/docker/index.ts +52 -0
- package/src/docker/ollama-pull.ts +232 -0
- package/src/docker/recipes/cockroach.ts +24 -0
- package/src/docker/recipes/index.ts +32 -0
- package/src/docker/recipes/llama-cpp.ts +273 -0
- package/src/docker/recipes/ollama.ts +19 -23
- package/src/docker/recipes/pgdog.ts +4 -1
- package/src/docker/recipes/postgres.ts +5 -18
- package/src/docker/recipes/sglang.ts +55 -0
- package/src/docker/recipes/supabase.ts +21 -0
- package/src/docker/recipes/timescale.ts +18 -0
- package/src/docker/recipes/vllm.ts +44 -0
- package/src/docker/recipes/yugabyte.ts +23 -0
- package/src/docker/stack-id.test.ts +22 -0
- package/src/docker/stack-id.ts +38 -4
- package/src/docker/types.ts +15 -0
- package/src/drivers/ai-ollama.integration.test.ts +7 -4
- package/src/drivers/signal-engine.ts +10 -0
- package/src/drivers/signal-postgres.ts +24 -2
- package/src/drivers/signal-types.ts +10 -0
- package/src/elements/channel/fallback.test.ts +91 -0
- package/src/elements/channel/hard-bounce.test.ts +82 -0
- package/src/elements/channel/injection.test.ts +153 -0
- package/src/elements/channel/locale-ar.test.ts +102 -0
- package/src/elements/channel/otp-delivery.ts +5 -2
- package/src/elements/channel/receipts-ledger.test.ts +100 -0
- package/src/elements/channel/runtime.ts +24 -1
- package/src/elements/channel/test-helpers.ts +60 -0
- package/src/elements/channel/whatsapp-compliance.test.ts +124 -0
- package/src/elements/store/cache.ts +1 -1
- package/src/elements/store/emit-drizzle.ts +43 -9
- package/src/elements/store/runtime.ts +1 -1
- package/src/elements/store/schema-decl.test.ts +2 -0
- package/src/elements/store/schema-decl.ts +15 -0
- package/src/elements/store/seed.ts +1 -1
- package/src/index.ts +1 -0
- package/src/kernel/app.ts +118 -11
- package/src/kernel/boot-bind/signal.ts +6 -2
- package/src/kernel/boot-bind/store.ts +2 -1
- package/src/kernel/boot.test.ts +6 -5
- package/src/kernel/boot.ts +8 -3
- package/src/kernel/compensate.test.ts +131 -0
- package/src/kernel/correlation.test.ts +108 -0
- package/src/kernel/effect-timing.test.ts +82 -0
- package/src/kernel/flow.ts +38 -0
- package/src/kernel/fx-runs.test.ts +49 -0
- package/src/kernel/fx.test.ts +14 -0
- package/src/kernel/fx.ts +111 -1
- package/src/manifest/types.ts +8 -2
- package/src/plugins/auth-delivery.mailpit.integration.test.ts +1 -1
- package/src/plugins/auth-methods.security.test.ts +3 -3
- package/src/plugins/auth-methods.test.ts +1 -1
- package/src/plugins/index.ts +2 -2
- package/src/plugins/otp.test.ts +21 -19
- package/src/plugins/otp.ts +36 -34
- package/src/plugins/taqnyat.live.test.ts +3 -3
- package/src/runs/collect.ts +3 -0
- package/src/runs/export-otlp.ts +64 -0
- package/src/runs/index.ts +16 -0
- package/src/runs/parquet.ts +9 -0
- package/src/runs/types.ts +5 -0
- package/src/runs/window.test.ts +68 -0
- package/src/runs/window.ts +148 -0
- package/src/runtime/boot-warn.test.ts +45 -0
- package/src/runtime/boot-warn.ts +17 -0
- package/src/runtime/dev-request-log.ts +5 -5
- package/src/term.test.ts +95 -10
- package/src/term.ts +369 -14
- package/src/console/ui/dist/assets/panel-overview-DONDzBd2.js +0 -1
- 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
|
|
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
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
})
|
|
163
|
-
|
|
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") {
|