You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Sidecar + launcher:
- AdForge.command waits up to 10s on the restart_stale path for the old sidecar to release the port (nc -z probe). sleep 1 was too short on macOS with open file handles. (#41)
- local-sync.cjs binds server with an error listener that explicitly surfaces EADDRINUSE — closes the resolve-ports.cjs TOCTOU window so the user gets a clear message instead of a silent fail. (#42)
- extractMetadata now handles unquoted HTML5 attribute values via a per-attribute multi-arm regex — covers older CMS templates. (#59)
UI/UX:
- UndoToast now queues multiple events. Rapid double-delete no longer drops the first undo. (#43)
- Dashboard (app/page.tsx) renders a tile-grid skeleton during load instead of returning null. (#54)
- ServiceWorkerRegister listens for controllerchange and reloads once on update — fixes stale shell after deploy. (#55)
- History delete adds confirm() to match the brand-delete safety pattern. (#56)
Prompts + AI:
- audience-targeting "IF AN IMAGE IS ATTACHED" block is now conditional on input.audience_screenshot — AI no longer hallucinates screenshot data when the image was stripped due to non-vision provider. (#45)
- brand-extract dlog() wrapper + url-ingest dbg() gated to NODE_ENV !== "production" so raw page content + AI responses don't leak to production user DevTools. (#52)
- Gap-fill pairs objections + objection_handling: if one is missing, both regenerate, and the merge trims the longer to match the shorter so indices line up. (#63)
- Industry template path no longer setActiveBrainId on skeleton save — activation now happens on the user's explicit form save. (#62)
LLM providers:
- openai-compat + anthropic readError surfaces 429 Retry-After as a "Rate limit — retry in Ns" prefix so free-tier users on Groq/Cerebras/OpenRouter get a useful message. (#61)
Security / safety:
- Markdown escape() now also escapes " and ' (defense-in-depth for future tags with attributes). (#47)
- url-ingest normalize() throws on non-http(s) schemes so javascript: URIs can't be saved into brain.website_url. (#53)
- vercel.json adds X-Frame-Options: DENY + CSP frame-ancestors 'none' against clickjacking. (#51)
- local-sync.ts SYNC_URL switched to 127.0.0.1 (IPv6 resolution parity with url-ingest.ts). (#49)
SEO:
- public/robots.txt + app/sitemap.ts added. Crawlers now get the public evergreen routes; gated app routes (generators/optimizers/settings) are disallowed. (#50)
Verification: typecheck + 43/43 tests + next build all pass.
0 commit comments