Thumbs up/down buttons on assistant messages (hover action bar). Feedback
stored per message, persisted in IDB, included in conversation exports.
Toggle to clear feedback. Color-coded: green for up, red for down.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Collapsible memory panel below persona selector. Add/edit/delete
persistent facts (max 20) injected into every system prompt. Facts
stored in localStorage, shown as collapsed "Memory (N/20)" toggle.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Type / in chat input to open glass command palette with prompt templates.
Templates support {{variable}} substitution with a mini form. Built-in
templates for Explain, Compare, Summarise, Translate. Templates stored
in localStorage, importable/exportable as JSON. Arrow key navigation
and Enter to select.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Named personas with system prompt, model preference, and accent colour.
Persona pill selector above chat input, editor modal for create/edit/delete.
Default persona auto-applied to new conversations. Persona system prompt
prepended to AI context.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Drag-and-drop or paste images into chat input. Thumbnail preview above
input, max 4 images per message. Images encoded as base64 and sent in
Claude vision format (multimodal content arrays). Image attach button
in chat input toolbar.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Split-screen comparison of two AI models streaming simultaneously.
Toggle via header button. Desktop shows side-by-side panes, mobile
shows swipeable tabs. Uses streamWithModel() for provider-agnostic
parallel streaming.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Save scroll position when switching conversations, restore it when
returning. Uses a session-only Map<conversationId, scrollTop>.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reusable ContextMenu.vue glass-card component positioned at cursor.
Messages get Copy, Reply, Edit (user), Regenerate (assistant), and
Branch from here options. Closes on Escape or outside click.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Import AIUI JSON exports and Claude.ai export format via file picker.
Merges imported conversations into existing data without overwriting.
Shows import summary with count and format detected.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Export conversations as Markdown, JSON, or plain text via three-dot
menu in chat header. Uses File System Access API with <a download>
fallback. Also adds delete conversation option.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Slim progress bar showing estimated token usage (~4 chars/token).
Bitcoin-orange fill turns red when >80% of context window used.
Tooltip shows exact token estimate on hover.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
After the first AI response, sends a background request to generate
a 3-5 word title using Claude Haiku. Silently replaces the default
title derived from the first user message.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Glass search panel with real-time filtering, match counter,
up/down navigation to jump between matching messages.
Keyboard shortcuts: Cmd+F to open, Escape to close, Enter/arrows
to navigate between matches.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reply button on all messages shows quoted excerpt above input.
On send, quote is prepended as `> excerpt`. Clean up isDark
patterns in ChatInput (dark-only app).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wire up branch-from-message handler, add BranchSwitcher glass pill
component showing "Branch X of Y" with prev/next navigation.
Clean up isDark conditionals in chat components (dark-only app).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pencil icon on hover for user messages to edit inline. Regenerate
icon on assistant messages to re-send from the same prompt. Editing
clears all subsequent messages and triggers a fresh AI response.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add PLAN2.md with 116 tasks across M8–M20 with testing gates
- Populate loop/plan.md with all new tasks (30-attempt retry policy)
- Update loop/prompt.md to enforce glass design system and PLAN2.md
- Fix PassphraseDialog to use glass-card/gradient-button design system
- Fix crypto.randomUUID fallback for non-secure contexts
- Fix dev.sh to skip proxy startup if port 3141 already in use
- Fix PWA manifest for Android A2HS (purpose:any, display_override, id)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Check off E2E test expansion in PROGRESS.md and all M1 overview items
in PLAN.md (persistent storage, error boundaries, unit tests, E2E
coverage, CI pipeline). Zero unchecked items remain across all files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All tasks in loop/plan.md now checked. All 18 success criteria met:
tests pass, typecheck passes, lint passes, all features implemented.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add tests for: streaming response, film cards in panel, detail view
navigation, mobile full-screen overlay, stop button visibility, web
search toggle, new conversation clearing messages, and panel side
layout on desktop viewport.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update loop/plan.md with all tasks checked through M7.4. Update
PROGRESS.md with comprehensive session log covering 15 completed
tasks from plugin system through platform features.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create useOffline.ts with online/offline detection, sync queue for
pending actions, and auto-process on reconnect. Enhance vite PWA config
with CacheFirst for TMDB and Wikipedia images, StaleWhileRevalidate for
TMDB API responses, with size and TTL limits.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create src-tauri/ with tauri.conf.json (frameless transparent window,
1200x800 default, system tray), Cargo.toml with tauri v2 dependencies,
and main.rs with tray icon click-to-show and global shortcut
(Cmd+Shift+A) to toggle window visibility. Auto-updater plugin enabled.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create mcp-server.ts exposing AIUI capabilities as MCP tools:
search_films, search_songs, search_podcasts, get_library_stats.
Includes tool call parsing, routing, and result formatting for
Claude tool_use integration.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create useNostrIdentity.ts composable with NIP-07 window.nostr API
integration (getPublicKey, signEvent, extension detection). Add npub
bech32 encoding to bech32.ts. Create NostrLogin.vue settings component
with login/logout, npub display with copy, and extension install guidance.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create cashu.ts with token parser (cashuA... base64url decode), amount
extraction, and mint URL formatting. Add CashuToken.vue inline component
with copy-to-clipboard and open-in-wallet deep-link. Integrate detection
in ChatMessage.vue with automatic token stripping from display text.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create lightning.ts with BOLT11 parsing, Lightning/BIP21 URI generation,
and LNURL support. Add PaymentButton.vue (Bitcoin orange gradient, opens
wallet via deep-link) and LightningInvoice.vue (QR code, copy, expiry
countdown, open-in-wallet). AIUI is never a wallet — only deep-links.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create key-vault.ts with AES-256-GCM encrypted IndexedDB storage for
API keys (Claude, OpenRouter). Add ApiKeyManager.vue settings UI with
masked key display and add/remove functionality. Integrate vault lookups
into useAI.ts streaming functions with graceful fallback when IDB is
unavailable.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create PassphraseDialog.vue with create/enter passphrase flows, glass
morphism styling, and skip option. Wire into App.vue to prompt on
startup when crypto is enabled. Salt stored in localStorage, key
derived via PBKDF2 and held in memory for the session only.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create crypto.ts with Web Crypto API utilities: PBKDF2 key derivation
(100K iterations, SHA-256), AES-256-GCM encrypt/decrypt, session key
management. Modify idb-storage.ts to transparently encrypt/decrypt
conversations when a session key is set. Disabled in dev mode via
VITE_DISABLE_CRYPTO=true.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create favorites Pinia store with IndexedDB backend for persistent
favorites. Add FavoriteButton.vue heart toggle (accent-colored when
active). Create FavoritesGrid.vue with type filtering. Wire favorite
buttons into FilmCard and SongCard. Add Favorites tab to ContentPanel
that appears when items are saved.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create useFederatedSearch.ts composable that searches films, songs,
and podcasts with 150ms debounce. Add SearchResults.vue overlay with
grouped results and type icons. ChatInput.vue detects /search command
prefix and shows results above the input, inserting content reference
tags on selection.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create NostrEmbed.vue component that renders nostr:note1, nostr:npub1,
and nostr:nevent1 URIs as rich embedded cards. Add bech32 decoder
utility with NIP-19 TLV support for nevent/nprofile. Extend useNostr
with fetchNote() for single-note relay lookups. ChatMessage.vue now
detects and strips nostr URIs, rendering them as inline embed cards.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create film-renderer.ts and song-renderer.ts as RendererDefinition
plugins using defineAsyncComponent for lazy loading. ContentPanel.vue
now looks up film/song components via getRendererForContentType()
instead of direct imports, enabling future community renderer plugins.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create plugins/index.ts bootstrap and claude-provider.ts implementing
the AIProviderAdapter interface from @aiui/core. The Claude provider
wraps the existing proxy streaming logic as an async generator. Plugin
initialization is called in main.ts before app mount.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create useNostr composable with raw WebSocket connections to public
relays (relay.damus.io, nos.lol, relay.snort.social). Subscribe to
kind:1 notes with limit 50. Update NostrGrid to use real data instead
of mock notes. Lazy-load on tab activation, clean disconnect.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace v-for message loop with @tanstack/vue-virtual useVirtualizer.
Dynamic row measurement, estimated sizes (60px user / 200px assistant),
overscan 5 items. Scroll-to-bottom via scrollToIndex during streaming.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add queue (ShallowRef<Song[]>), currentIndex, playNext, playPrevious,
addToQueue, removeFromQueue to usePlayer. Auto-advance on song end.
Add prev/next buttons and queue count to PlayerBar.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Install markdown-it and render assistant messages through it with safe
defaults (html: false, linkify, breaks). Add CSS for code blocks,
lists, links, blockquotes, headings. Links open in new tab. User
messages remain plain text.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
16 tests covering provider selection, context injection, sendMessage
streaming, error handling, stop generation, and web search integration.
Mocks fetch/SSE and IDB for isolated testing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wrap mobile ContentGridView and DetailView with ErrorBoundary
components to prevent cascading failures on mobile. Fix prefer-const
lint error in chat store.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Wrap ChatMessage v-for loop in ChatWindow with ErrorBoundary
- Wrap ContentPanel grid/detail sections with ErrorBoundary
- Fix ESLint flat config: add vue-eslint-parser for TypeScript in SFCs
- Add browser globals to ESLint config
- Fix lint errors in contentExtraction.ts (useless escapes, prefer-const,
unicode flag for emoji regex)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>