# Project memory > Curated long-term knowledge. **Hard cap: 60 lines of entries.** ## Verified facts - LexAI has two clients: Chrome MV3 (repo root / WXT) and VS Code (`packages/vscode`). - Portable core: `src/lib/providers.ts`, `actions.ts`, `types.ts`. Chrome-only: `crypto.ts`, `messaging.ts`. - Providers: OpenAI, Anthropic, Groq, OpenRouter — routed by `callProvider` / `PROVIDER_SPECS`. - VS Code v1: Command Palette + editor context submenu; API key in Secret Storage; prefs `lexai.provider|model|writingStyle`. - Selection minimum length for actions: `MIN_SELECTION_LENGTH` (10) in `src/lib/actions.ts`. - Chrome message listener must `return true` for async replies; snapshot selection before `await`. ## Conventions - Style Chrome UI with inline styles (Tailwind not wired). - Prefer encrypted Chrome key path; keep plaintext `apiKey` fallback until migration. - VS Code must not import `@lib/crypto` or `@lib/messaging`. - Root scripts: `vscode:install`, `vscode:build`, `vscode:typecheck`, `vscode:package`. ## Environment quirks - Node 22 pinned in CI; `npx wxt prepare` required before Chrome typecheck on fresh clone. - PowerShell may not accept `&&` — chain with `; if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }`. ## Key paths and entry points | What | Where | | --- | --- | | Chrome content / background / options / popup | `entrypoints/` | | Shared lib | `src/lib/` | | VS Code extension | `packages/vscode/src/extension.ts` | | VS Code bundle | `packages/vscode/out/extension.js` | | Model lanes | `docs/MODEL_ROUTING.md` | ## Expiring notes - _None yet._ ## Consolidation log | Date | Action | Reason | | --- | --- | --- | | 2026-08-13 | Seeded after VS Code v1 | `/project-init` stubs + port |