Changelog

Cartwright templates ship as tagged releases. npx create-cartwright pulls the template at the current DEFAULT_REF tag (managed in cartwright-app/apps/cli).

v0.3.0 — 2026-05-26

✨ New features

Voice Shop (Gemini Live)

Customers can now talk directly to your storefront via Google's Gemini Live voice model. Floating mic-FAB on storefront, server-side tool dispatch with the same audit-log + scope-guards as your text chat.

  • Opt-in per shop via brand.features.voiceShop = true
  • Activate in /admin/integrations → "Voice Shop" section
  • Requires Google Gemini API key (also activated in /admin/integrations)
  • Per-session minute cap + daily cap configurable in admin
  • BotID-protected token-mint in production
  • Default allowed tools: products.search, products.get, cart.add,

cart.get_summary, discounts.try_apply (orders.create opt-in)

See docs/voice-shop.md.

Local AI v2 (Ollama / Gemma 4)

Run your storefront and admin AI on a local Ollama instance — free, private, no cloud round-trip. Bring-your-own-model.

  • /admin/integrations → "AI provider" section: Cloud (Anthropic) / Local

(Ollama) / Auto (with on-error fallback)

  • Live Ollama discovery + Pull-this-model button (SSE-streaming progress)
  • Per-model capability tiers: read-only / low-risk-writes / all-37-tools
  • Apple Silicon -mlx variants auto-selected on Mac
  • Delete-with-confirm + total-disk-usage display
  • Status pill on /admin/* shows provider + model + live latency

See docs/local-ai.md.

Admin AI Status Pill

Fixed bottom-right badge on every /admin/* page showing which AI is currently driving (Cloud / Local / Auto / Degraded / Offline) with live latency from a 30s health-check endpoint.

Setup-wizard branching

The /admin/setup AI step now offers three paths instead of two:

  • Cloud AI — Claude Haiku 4.5 (recommended for shops)
  • Lokal AI — Ollama with live probe and auto model-detection
  • Spring over — configure later in /admin/integrations

Audit-log stamps

Every AI-driven tool call (text chat, voice, vibe-generation) is now stamped with provider, model, modality, sessionMinutes so /admin/audit can filter by modality (text vs voice) or provider (anthropic vs local vs google). Existing rows backfilled to provider="anthropic", modality="text".

🔧 Improved

  • chatModelResolved(intent) exposes provider/model/capabilities to callers

that need it (audit-stamping, tool filtering). Backwards-compatible — legacy chatModel() still works.

  • MODEL_CAPABILITIES matrix covers Claude 4.5/4.6/4.7, Gemma 4 (e2b/e4b/

e4b-mlx/26b/31b), Gemma 3, Llama 3.x, Qwen.

  • Vibe generators (theme + product-SEO + category-SEO) now force Anthropic

even when aiProvider="local" — structured JSON output needs reliability.

🐛 Fixed

  • lib/consent.ts split into shared + server-only so Client Components

can import the cookie parser without triggering Next.js's server-only guard. (Phase 10 introduced this; fixed in same release.)

📦 Schema

New columns on IntegrationSettings:

  • voiceShopEnabled, voiceShopModel, voiceShopVoice,

voiceShopAllowedToolsJson, voiceShopMaxMinutesPerSession, voiceShopMaxMinutesPerDay, voiceShopVisionEnabled, voiceShopLastDailyUsageJson

  • anthropicModel, localAiFallbackMode, lastDegradedAt,

lastModelDetectedAt, aiUsageJson

New columns on AuditLog:

  • provider, model, modality, sessionMinutes (+ index on provider)

All nullable with defaults — your existing data is untouched. Run npx prisma migrate dev after upgrade.

📦 Dependencies

  • @ai-sdk/openai-compatible@^2.0.48 — Ollama uses OpenAI-compatible API
  • @google/genai@^2.6.0 — Gemini Live WebSocket client
  • botid@^1.5.11 — voice-token abuse protection
  • zod-to-json-schema — converts Zod schemas to Gemini function declarations

💥 Migration notes

  • Voice shop is OFF by default — set brand.features.voiceShop = true

in your fork's brand.config.ts to opt in

  • Audit-log backfill runs automatically in the new migration —

existing rows get provider="anthropic", modality="text"

  • No breaking API changes — existing callers of chatModel() work

unchanged. New chatModelResolved() is opt-in for routes that want provider/model awareness

---

v0.2.0

Earlier releases — see git history.