# 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 |
