Some checks failed
CI — Test & Build / Test & Build (push) Has been cancelled
- Implemented a status bar item for LexAI with dynamic status updates (ready, processing, notReady). - Created a suggestion panel for displaying and interacting with AI-generated suggestions. - Added functionality for accepting, regenerating, and discarding suggestions within the suggestion zone. - Introduced configuration options for writing style, prompt patterns, personas, and formats. - Integrated progress indicators for long-running tasks and improved user feedback. - Established TypeScript configuration for the vscode package.
3.4 KiB
3.4 KiB
Architecture
The current system and its important boundaries. Describe what is, not aspirations.
System at a glance
- Shape: dual client surfaces (Chrome MV3 extension + VS Code extension) sharing portable LLM core; no LexAI backend
- Stack: TypeScript; Chrome via WXT ^0.20 + React 18; VS Code via
packages/vscode(esbuild bundle); Node 22 - Data stores: Chrome
chrome.storage.local(encrypted key + prefs); VS Code Secret Storage (API key) +lexai.*settings - Hosting / deploy target: Chrome Web Store (Gitea CI); VS Code Marketplace not wired yet (local VSIX / extension host)
- Build / release: Chrome
npm run build→.output/chrome-mv3/; VS Codenpm run vscode:build→packages/vscode/out/extension.js
Component map
shared: src/lib/{providers,actions,types} (+ crypto/messaging Chrome-only)
Chrome:
content.ts ──ANALYZE_TEXT──> background.ts ──fetch──> provider API
options/popup (React) ──storage──> chrome.storage.local
VS Code:
extension.ts (commands/menus) ──callProvider──> provider API
│ ▲
└── secrets / settings ────────┘
| Component | Responsibility | Owns (paths) | Talks to | Notes |
|---|---|---|---|---|
| Shared core | Actions, prompts, provider adapters | src/lib/providers.ts, actions.ts, types.ts |
Provider HTTPS APIs | No Chrome/VS Code imports |
| Chrome content | Selection, toolbar/modal, replace | entrypoints/content.ts |
Background via messaging | DOM timing; data-lexai |
| Chrome background | Decrypt key, call providers, menus | entrypoints/background.ts |
chrome.storage, providers |
CORS + key isolation |
| Chrome Options/Popup | Settings + standalone analyze | entrypoints/options, popup |
Storage + background | React; inline styles |
| VS Code extension | Commands, context menu, replace | packages/vscode/src/** |
SecretStorage, settings, providers | Bundles @lib via esbuild |
| Chrome crypto/messaging | tweetnacl key path; safe chrome wrappers | src/lib/crypto.ts, messaging.ts |
chrome.* |
Not used by VS Code |
Boundaries and contracts
- Trust boundaries: page DOM (Chrome) and editor buffer (VS Code) are untrusted text; API key never logged; only user’s chosen provider receives text/key
- Message contract (Chrome):
ANALYZE_TEXT(payload + flat),COPY_AS,LIST_MODELS— seesrc/lib/types.ts - VS Code commands:
lexai.{fix,rephrase,shorten,expand,explain,prompt,setApiKey,clearApiKey,showStatus} - Internal imports: VS Code may import
@lib/providers|actions|typesonly — notcrypto/messaging - External dependencies: OpenAI, Anthropic, Groq, OpenRouter chat + models endpoints
Data model (essentials)
- Config: provider, model, writing style, keyProvider
- Sensitive: API key — Chrome encrypted blob + encKey; VS Code Secret Storage
- Legacy: Chrome plaintext
apiKeyfallback until migrated
Cross-cutting concerns
- Authn/z: none (BYO key)
- Observability: console debug in Chrome replace path (pre-release); VS Code notifications
- Feature flags: none
- Config: Chrome storage schema; VS Code
contributes.configurationlexai.*
Open architectural risks
- Chrome and VS Code settings are not synced
- VS Code v1 has no Prompt Builder / Copy As / floating toolbar
- Relocating Chrome into
packages/chromedeferred — root remains the WXT app