Vault password prompt is now the first thing shown when opening
uncloseai. No chat, no greeting, no data written until the user
creates or unlocks their vault. Each site has its own vault with
AES-256 encryption using password + device-specific salt.
- Add vault gate overlay blocking modal until password entered
- Remove plaintext conversation fallback from storage.js
- Route TTS mode, selected voice, language through vault
- Route custom API config reads through vault in models.js
- Add vault gate i18n strings (26 languages) explaining per-site
encryption of chat history, API keys, and settings
- Add missing keys to migration (voice, TTS mode)
- Re-show vault gate on lock from settings
- Permacomputer headers across all source files
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add vault.js: encrypted settings with AES-256 + 7-day session persistence
- Integrate vault UI in settings modal with friendly messaging
- Update config.js and un.js to use vault for credentials
- Add translation strings for vault UI (en.js)
- Show "Logged in" status with Lock button instead of session info
- Vault password only asked when opening settings
- Add system prompt as last assistant message in chat history
- Support UNCLOSEAI_SYSTEM_PROMPT_REPLACE flag for custom prompts
- Use configured voice preference in page-reader TTS
- Disable code execution button (sandbox not running)
Integrated code.ai.unturf.com code execution service into uncloseai.js modal:
- Added CODE_EXEC_URL to config.js
- Created code-execution.js module with executeCode() and result display
- Modified addCodeBlockCopyButtons() to add ▶ Run button next to 📋 Copy
- Auto-detects language from code block class (defaults to Python)
- Uses async job polling with exponential backoff
- Shows execution output, errors, and allows cancellation for long-running jobs
- Results displayed inline below code blocks with monospace formatting
Code blocks in AI responses now have both Copy and Run buttons.