fix(csp): allow loopback HTTP for the local AI provider; enable AI Assistant by default
Real end-to-end verification (Playwright-driven real Electron app on this Mac, against the actual local Ollama instance, not a mock) found the actual blocker: production's connect-src CSP (`'self' https: wss:`) rejects plain http:// entirely, so lib/ai/local-client.ts's loopback fetch to Ollama never even attempted the network in a production build - Electron or browser alike. This is almost certainly what looked like a browser-sandbox network issue in the earlier (non-Electron) QA pass tonight too. Fix is narrow, not a blanket http: relaxation: connect-src now additionally allows `http://127.0.0.1:*` and `http://localhost:*` specifically. Loopback has no network hop, so it doesn't reopen the mixed-content-style downgrade risk the existing https-only production policy guards against - unlike dev's blanket `http:` allowance, which stays dev-only. Confirmed fixed: rebuilt (build:standalone + build:electron), launched the real Electron app via Playwright's _electron, and got a genuine answer back from the real local Ollama - "Test connection" showed Reachable (the real success state, not the CORS-diagnostic fallback text), and asking "Reply with exactly the words: LOCAL AI WORKS" returned exactly that, with the correct "no local mail index in this session" banner alongside it (accurate for a fresh Electron session with nothing synced yet). Also flips FeatureGates.aiAssistantEnabled's default false->true: local now genuinely works and ships free/unmetered (see lib/ai/types.ts), so there is a real feature behind the tab, not an empty preview - matches tonight's explicit "I want AI visible" instruction. An admin can still turn it off. Verified: typecheck clean, lint clean (0 errors, pre-existing warnings only), translations pass (48/48), full production build succeeds.
This commit is contained in:
@@ -28,7 +28,7 @@ const FEATURE_GATE_LABELS: Partial<Record<keyof FeatureGates, { label: string; d
|
||||
crossStarredViewEnabled: { label: 'Unified Mailbox: Starred', description: 'Allow a "Starred" entry in the Unified Mailbox section that lists flagged/starred mail across the account and its shared folders (or every account when the cross-account sub-option is on). Honors the user\'s folder selection. Requires the matching per-user toggle in Settings → Appearance.' },
|
||||
crossAllViewEnabled: { label: 'Unified Mailbox: All Mail', description: 'Allow an "All mail" entry in the Unified Mailbox section that lists all mail across the account and its shared folders (or every account when the cross-account sub-option is on). Honors the user\'s folder selection. Requires the matching per-user toggle in Settings → Appearance.' },
|
||||
unifiedCrossAccountEnabled: { label: 'Unified Mailbox: Cross-account', description: 'Allow users to expand the Unified Mailbox beyond the active account boundary so its lists merge across every logged-in account. When off, the Unified Mailbox stays within the active account and its shared folders.' },
|
||||
aiAssistantEnabled: { label: 'AI Assistant (preview)', description: 'Show the AI Assistant settings tab. No provider is wired up yet (see docs/AI-ASSISTANT-CONCEPT.md) — enabling this only proves the settings pane and policy fetch, it does not grant access to any model.' },
|
||||
aiAssistantEnabled: { label: 'AI Assistant (preview)', description: 'Show the AI Assistant settings tab. Local (Ollama on the user\'s own machine or this desktop app) is free and unmetered; public (bring-your-own-key) is available too but not yet monitored or metered — see docs/AI-ASSISTANT-CONCEPT.md.' },
|
||||
};
|
||||
|
||||
const RESTRICTABLE_SETTINGS = [
|
||||
|
||||
Reference in New Issue
Block a user