v0.7.0
✨ Added
oke docker clean— discover leftoveroke-dev-*compose stacks and remove containers, networks, and volumes (down -v). Inside a project: current stack (+ optional other stacks); outside: pick any. Non-TTY:--yes/--all --yes.- Signal
emit(…, { key })— optional per-key serialization foronce: same(signal, key)is never claimed by two consumers at once; the in-flight message's visibility lease is the lock (no second timeout). Omitkeyfor unchanged competing-consumer behavior. - Signal
schemaenforced at emit via Standard Schema (validate(), same path as Flowin) — invalid payloads throw **OKE1043** before stage / commit; valid payloads succeed. create-okeTTY wizard: template (standard|advanced) · recommended defaults · customize (local|docker first, then optional other side + AI; saved to~/.oke/create-defaults.json) · reuse when saved for that template. Non-TTY /--yesstay zero-prompt.oke ai setup— interactive AI provider + curated Ollama catalog (detect / recommend / pull chat·vision·embed); thin paths for OpenAI-compatible and Anthropic. Writesdrivers.ai,.env.local, andsrc/ai.ts.- Native Ollama
embedviaPOST /api/embeddings(no openai-compatible shim required for local RAG). create-oke --ai/--no-ai— force or skip the AI model wizard (models selected before install).fx.store(files).image(key\|bytes)— Bun.Image pipeline (resize / rotate / flip / modulate → jpeg/png/webp, plus heic/avif with WebP fallback) withmetadata/bytes/blob/placeholder/putterminals; andputImage(key, data, { variants, placeholder })that writes the original plus{stem}.{variant}.{ext}derivatives and optional ThumbHash LQIP. Requires Bun>=1.3.14. Image decode defaults to a **16 MP** (4096×4096)maxPixelsceiling (raise or passfalseto opt out).- Signal
oncevisibility leases (leaseExpiresAt, default 30s) with **lazy reclaim at claim time** — expiredinflightrows are taken by the next consumer query (memory + postgres); no background sweeper. Chaos proof: SIGKILL after claim still redelivers after the lease expires. createFileCronStore— file-backed CronStore with process-safe lease CAS for multi-instance Clock leader election (chaos-proven with two OS processes).- Clock chaos harness: two processes share one store and fire a schedule once; SIGKILL mid-lease takeover measured (~120ms at
leaseMs=120); SIGKILL mid durable step resumes without re-running completed steps (file-backed journal in the chaos harness — not the in-process memory journal used by a booted app).
♻️ Changed
- Install docs list
bun install -g okenginefor a globalokeon PATH (package name isokengine; there is no separateokenpm package). create-okeships two Notes starters undertemplates/{standard,advanced}(named flows — noflow_1). TTY: pick template first; customize asks **local|docker** once, walks facets for that side, then optionally the other (defaults if no). Reuse only when savedtemplatematches..oke/modefollows primary (recommended: standard → local, advanced → docker).create-okeTTY menu offers **reuse previous settings** only when~/.oke/create-defaults.jsonalready exists for the selected template; customize always saves there (user-global) so the next matching project can inherit the same picks.create-okerejects a non-empty target directory at the **project name** step (TTY) or before scaffold (flags /--yes), with a clear"name" already existsmessage — not after the full wizard.create-okecustomize wizard offers **← Back** on each driver / yes-no step (first-step Back returns to the recommended / reuse / customize question).create-okecustomize asks AI after both env passes; when both sides are in play, **AI Provider — local** and **AI Provider — docker** stay available.oke ai setupOllama path: short needs quiz (use case · speed/quality · vision) → panel that separates **machine RAM** from **≈GB-class model tier** (comfortable / tight / too large, ~4GB OS/IDE headroom) → recommended / installed / manual picks with **← Back** between steps. CatalogramGbis machine tier, not download size — a 24GB laptop is never offered a “24GB model.” create-oke passes--provider ollamawhen either env uses Ollama (even if local is mock).oke ai setupcloud providers (OpenAI, Anthropic, Gemini, OpenRouter, …) offer short curated **Select Chat Model** lists with ⭐ Recommended, plus **Other…** to type any model id (also on Ollama manual picks).- AI docs visuals match Flow/Signal/Store quality:
AiBlocks(model / prompt / embed / agent ambient demos), upgradedAiGuardrailswith per-card mini physics, andAiPiiEgress(anthropic build-fail vs ollama on-premise) under the PII heading. - Channel docs visual
ChannelPhysicsrebuilt as a Gate/Vault-quality chain demo: onefx.sendwalks consent → locale → same-mediumviadrivers → receipt, cycling clean send / opted-out suppression / catalog body miss /smtp→resendfailover (status: "fallback"). Page prose corrected to match runtime (viais driver ids, not SMS→WhatsApp; locale then catalog fallback; dry-run is would-have-fired, not a receipt). - Clock docs visuals match Flow/Signal quality:
ClockSchedules(every + named clock → one Flow),ClockCatchUp(missedRuns counted, fire once),ClockSleep(durable sleep journals wakeAt across restart). - Signal docs visuals raised to the Store/Flow quality bar:
SignalDeliverymode-spotlight (competing claim / every-subscriber copy / latebus.live()history), plusSignalOnceLease(claim → 30s lease → reclaim) andSignalLiveReplay(retain then full-history replay) under the headings that teach those claims. - Flow docs visuals:
FlowTriggersupgraded (fan-in packet, contract chips, real CDC syntax) and newFlowDurablecontrast demo — kill mid-run withdurable: trueresumes without re-running completedfx.steps. - Gate docs visual
GatePipelinerebuilt as a Vault-quality chain demo:.gate(member, canBook, fair)evaluates left to right, later gates skip after the first denial, and the outcome cyclesdo runs/Unauthorized/Forbidden/RateLimitedfrom real principal states. - Vault docs visuals:
VaultRedacted(hold Redacted vs.reveal()at the provider boundary) plus polishedVaultResolutionusing realVaultResolutionSourceids; mask placeholder corrected to[redacted]/[redacted:secret]. - Store docs reorganized around **four facets, one handle** (
sql·kv·files·index) with separate Advanced sections for cross-facet and cross-element composition; KV + basic Files CRUD examples added from the real runtime API; meilisearch and image pipeline re-homed under Index and Files. - Store docs visuals match Flow/Signal quality: ambient physics demos per facet (SQL op cycle, KV TTL expire, Files put→get, Index search fan-out) on
StoreFacetsand each sectionStoreFacetMark. - Store docs: KV / Files / Index sections expanded to SQL-level depth (Quick start Steps, handle tables, drivers/env, examples, image options, meilisearch search opts, AI cross-link, facet Troubleshooting).
- Store docs physics visuals:
StoreKvTtl(redis vs memory TTL),StoreFilesVariants(putImage fan-out),StoreIndexModes(vector vs meilisearch) — ambient demos for claims tables under-teach. - Agent skill
oke-docs-visuals— element-docs micro-interaction standard (FlowTriggers/SignalDelivery quality bar, wire checklist, RevealItemasconstraints); linked fromoke-docs. - Engine requirement bumped to Bun
>=1.3.14(root +create-oke) forBun.Imageonstore.files. - Homepage Store card blurb mentions image transforms on the files facet.
- Signal docs and delivery cards state real physics: **at-least-once** (not exactly-once),
retriesmeans dead-letter whenattempts > retries,livereplays full retained history (unbounded), and slow handlers that outliveleaseMscan double-deliver without a crash (no heartbeat yet). - Signal docs: one coherent order-lifecycle example covering
once/broadcast/livetogether (fulfillment + fan-out + status feed), with an explicit note thatcreateClientdoes not yet subscribe tolive. - Orphan signal config stays recoverable by re-declaring; pending/DLQ rows are not deleted when a signal disappears from code.
- Root
README.mdredesigned for scan + first success: sently-styleoutlinebadges, starter health Flow + typed client (matches create-oke / Basic usage), ten-export vocabulary, eight-element table, Next links into the handbook; Charts and broken/duplicate shields removed. - Clock docs match proven physics: catch-up
"one"(health counts gaps, runtime fires once), DST is Console warn-only (not doctor / not rewritten), leader election requires a shared CronStore,overridablegates **edit** only, and boot clock drivers arememory·file·frozen(postgresrejected — no CronStore impl). - Standard template / config docs: signal docker/prod →
redis, clock docker/prod →file, vault local labelenv(was mislabeleddotenv). - Hero banner shows Gate’s kv backend (
drivers.store.kv); compose image planning no longer pulls SQL solely for fictional signal/clock postgres. create-okeruns AI **model** selection in the customize wizard (and--ai) **before**bun install— writes.env.local+src/ai.tswithout spawningoke ai setupafter install. Per-envdrivers.aipins from customize are preserved. Standaloneoke ai setupremains for existing apps.oke dev --dockerstops Compose containers on SIGINT / SIGTERM / SIGHUP / session stop (docker compose … stop) — volumes stay; nextoke devbrings them back up.
🐛 Fixed
oke devparses again when linked to a localokenginecheckout — a JSDoc glob (templates/*/drizzle…) closed the block comment early and brokeensure-drizzle-config.ts.- Ollama docker recipe escapes shell
$pid/$ias$$so Compose no longer warnsThe "i"/"pid" variable is not setonoke dev --docker. - OpenBao missing-keys error names the usual cause (orphaned vault volume after project recreate) and prints the exact
docker compose … down -vrecovery for local docker. create-oke/oke ai setupno longer nestdrivers.aiinsidechannel— the banner showedai: —even after picking Ollama. AI pins are written as a sibling ofchannelunderdrivers.- Console first-admin claim no longer returns an opaque **500 /**
TransportErrorfor weak passwords. The form requires ≥ 12 characters (letter + number), policy failures returnClaimFailedwith a clear message, the wizard shows that message (not the bare code), structured 5xx envelopes survive the client transport, andoke devrequest logs print the failure detail under the status line. create-okeseeds project.oke/modefrom the wizard profile (local-only/ recommended →local,docker-ready→docker) sooke devdoes not re-ask “Run against” after scaffold.create-okecustomize no longer poisonsimageswith driver pins (e.g.libsql) leaked from comments / env maps — fixesoke docker: no image recipe matches "libsql"after picking store.index drivers that are not compose services.oke devautooke db pushno longer loops when emit rewritesschema.generated.ts— the watcher triggers only on declaration inputs (schema.decl.ts/schema.ts/app.ts/ drizzle config), never the generated output.- Emitting a non-
optionalsignal with zero subscribers now throws **OKE1042** (previously silent success despite docs claiming a loud fail). - Surfaces strip and install docs now include docs MCP on **:6536** alongside app / Console / MCP (the fourth
oke devport was missing from the cards). - Docs site
next devno longer 500s on unknown/docs/...paths underoutput: "export"— export is production-only so missing pages hitnotFound()instead of "missing param in generateStaticParams". - App boot binders now honour
drivers.*instead of silently ignoring config: **Vault** resolvesenv/openbao/memory/managedvia the shared chain builder (same as Console); **Signal** bindsmemory/redisand fails loud forpostgres/nats; **Clock** bindsmemory/file/frozenand rejectspostgres; **Gate** rate KV usesdrivers.store.kv(oke:gatesnamespace) instead of a private memory bag.