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
-mlxvariants 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_CAPABILITIESmatrix 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.tssplit 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 onprovider)
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 clientbotid@^1.5.11— voice-token abuse protectionzod-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.