Commit Graph
180 Commits
Author SHA1 Message Date
DorianandClaude Opus 4.6 fa3c446baf fix(app): add 1MB body size limit to Claude proxy
Track accumulated body size during req.on('data') and abort with 413
if it exceeds 1MB, preventing unbounded memory allocation from
oversized payloads.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:38:39 +00:00
DorianandClaude Opus 4.6 6d6408e2a4 fix(app): bind Vite dev server to localhost only
Remove --host flag from dev.sh that was overriding vite.config.ts to
bind on 0.0.0.0. Server now defaults to localhost; use VITE_HOST env
var to opt-in to LAN access for mobile testing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:38:01 +00:00
DorianandClaude Opus 4.6 6720711302 fix(app): remove plaintext fallback from key vault when crypto unavailable
storeApiKey() now throws when encryption is not available instead of
storing keys in plaintext. ApiKeyManager.vue catches the error and
displays a warning message.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:35:48 +00:00
DorianandClaude Opus 4.6 5c4afe00e5 fix(app): add rate limiting to all API endpoints
Add sliding-window rate limiter in server/dev-auth.ts (60 req/min reads,
10 req/min writes per IP). Apply checkRateLimit() in all Vite plugins
and claude-proxy.ts after auth validation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:34:41 +00:00
DorianandClaude Opus 4.6 6425b2f53b fix(app): restrict postMessage origin in archyBridge
Change default allowedOrigin from '*' to null. Derive from
window.location.origin when init() is called without explicit origin.
Always validate event.origin — reject messages when origin is not set.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:31:45 +00:00
DorianandClaude Opus 4.6 4053eb46af fix(app): replace custom HTML sanitizer with DOMPurify
Install dompurify and replace the hand-rolled DOM walker sanitizer
with DOMPurify.sanitize() configured with the same allowed tags.
Handles mutation XSS edge cases the custom version couldn't.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:30:58 +00:00
DorianandClaude Opus 4.6 f7f8c140c3 fix(app): store NWC wallet secret in encrypted vault instead of plaintext localStorage
Replace localStorage.getItem/setItem with storeApiKey/getApiKey/deleteApiKey
from key-vault. Make loadConnection(), connect(), and disconnect() async.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:28:29 +00:00
DorianandClaude Opus 4.6 c3e58fdab8 fix(app): add body size limit to dev-chats write endpoint
Track accumulated body length during PUT /api/dev-chats and abort
with 413 if payload exceeds 5MB.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:27:35 +00:00
DorianandClaude Opus 4.6 956e98b041 fix(app): add SSRF protection to RSS fetcher
Add post-DNS SSRF validation using dns.lookup() to verify resolved IPs
are not in private ranges. Block non-http(s) schemes (file://, ftp://)
in discoverFeedUrl(). Extract isPrivateIp() helper for reuse.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:27:08 +00:00
DorianandClaude Opus 4.6 c21939b1f8 fix(app): block sensitive file reads in filesystem API
Add SENSITIVE_PATTERNS denylist to handleRead() in vite-fs.ts.
Blocks access to .env*, .git/, credentials, secrets, .pem, .key,
and SSH key files. Returns 403 for matched paths.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:26:01 +00:00
DorianandClaude Opus 4.6 4dc9588c8a fix(app): replace CORS Access-Control-Allow-Origin * with explicit localhost origin
Add setCorsHeaders() and handleCorsOptions() helpers in server/dev-auth.ts.
Replace wildcard CORS origin with http://localhost:5173 in all Vite plugins
and claude-proxy.ts. Include Authorization in allowed CORS headers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:25:10 +00:00
DorianandClaude Opus 4.6 cc7d9fc19e fix(app): add dev server auth token to all API endpoints
Generate random VITE_DEV_API_TOKEN in dev.sh, validate Bearer token
in shared server/dev-auth.ts middleware. Applied to all Vite plugins
(fs, dev-chats, rss, web-search, tmdb, music-search) and claude-proxy.
Client-side uses apiFetch() wrapper to attach the token automatically.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:23:17 +00:00
DorianandClaude Opus 4.6 b77c93607a feat(app): video player, guide page, free films, PWA cache fix
- Add VideoPlayerOverlay component for free film playback
- Add GuidePage with interactive node setup walkthrough
- Add freeFilms data catalog with public domain films
- Enhance PlayerBar with video support and queue management
- Add video player store for overlay state management
- Refactor music search plugin (Jamendo integration cleanup)
- Add PWA cache version purge mechanism in main.ts
- Add PWA icon cache fix skill for Brave/Chrome
- Improve content grids: loading states, image fallbacks
- Enhance useArchy composable with node context
- Update useNostr with relay pool management
- Expand chat store with guide conversation support
- Add test fixtures for guide and node demo prompts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 00:56:39 +00:00
DorianandClaude Opus 4.6 c84c0fb424 fix(app): passphrase dialog — remove CSP meta, check crypto.subtle availability
- Remove CSP meta tag from index.html (breaks Vite HMR, should be
  set via HTTP headers in production nginx instead)
- isCryptoEnabled() now checks crypto.subtle is available (undefined
  over HTTP on non-localhost origins)
- Add try/catch + error feedback to passphrase submit flow
- PassphraseDialog accepts error prop, focuses input on visible

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 06:58:55 +00:00
DorianandClaude Opus 4.6 290aa047d7 perf(app): add file size guard and loading state to code file reader
Handles 413 status for files > 1MB with user-friendly error message.
Adds fileLoading and fileError state for loading indicator support.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:51:10 +00:00
DorianandClaude Opus 4.6 04db18c35a perf(app): add 30s cache TTL to Bitcoin price fetcher
Skips redundant API calls when price was fetched within the last 30
seconds, reducing network requests while keeping data fresh.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:49:19 +00:00
DorianandClaude Opus 4.6 9032e8cd60 perf(app): lazy load PdfViewer and MapRenderer with loading skeletons
Uses defineAsyncComponent to lazy load heavy renderers, reducing
initial bundle size. Shows loading text while components load.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:48:39 +00:00
DorianandClaude Opus 4.6 31241d8d12 fix(a11y): improve img alt text with artist/director/author context
Updates alt attributes to include contextual info: songs include artist,
films include year and director, books include author, TV series include
type label.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:47:35 +00:00
DorianandClaude Opus 4.6 91dbaee38c fix(a11y): color contrast audit — document ratios, fix critical text
Documents WCAG AA contrast ratios in main.css. Increases text-white/40
to /50 for settings labels, section headers, and loading states to
meet 4.5:1 minimum contrast ratio.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:46:27 +00:00
DorianandClaude Opus 4.6 3258c047d9 fix(a11y): add focus management and ARIA attributes to dialogs
Adds role="dialog", aria-modal, focus trap, auto-focus close button,
and Escape key handling to ZapDialog and SettingsModal.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:44:11 +00:00
DorianandClaude Opus 4.6 3c709c143f fix(a11y): add aria-labels to all content grid card buttons
Adds descriptive aria-label to card buttons in SongGrid, FilmGrid,
TVSeriesGrid, PlaceGrid, BookGrid, PodcastGrid, NewsGrid, ImageGrid,
and AppsGrid for screen reader accessibility.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:41:43 +00:00
DorianandClaude Opus 4.6 2011fdcae0 fix(a11y): add aria-labels to chat message action buttons
Adds aria-label to all 6 icon-only buttons in ChatMessage.vue:
edit, regenerate, reply, branch, upvote, downvote.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:39:00 +00:00
DorianandClaude Opus 4.6 b4b1f8faf5 docs(app): add Archy local search guide and HelpSection component
Documents how file types map to content surfaces, how ContextBroker
filtering works, and adds a reusable HelpSection UI component.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:37:51 +00:00
DorianandClaude Opus 4.6 a60faedc48 feat(app): allow .claude folder in file browser tree
Updates vite-fs tree walker to include .claude directories so users
can browse CLAUDE.md, settings, hooks, and memory files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:36:14 +00:00
DorianandClaude Opus 4.6 e33cb359a0 feat(app): add file browser page with tree navigation and preview
Adds /browse route with project listing, recursive file tree with
expand/collapse, and file preview sidebar (desktop) / overlay (mobile).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:35:15 +00:00
DorianandClaude Opus 4.6 cfec1dcc13 fix(test): use type assertions for partial test data in useContentPanel tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:27:35 +00:00
DorianandClaude Opus 4.6 5d8ce56b1b test(app): add seed conversation regression tests
Validates extraction pipeline against all seed prompts. 15 tests
covering films, songs, books, TV, places, podcasts, images, code,
recipes, events. Verifies tag stripping completeness.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:25:07 +00:00
DorianandClaude Opus 4.6 5c82a09e65 test(app): add content extraction edge case tests
Tests empty input, interleaved tags, malformed tags, unicode content,
duplicate deduplication, place/TV extraction, tag stripping, magazine
sections. 11 test cases.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:23:49 +00:00
DorianandClaude Opus 4.6 c6e384a288 test(app): add unit tests for useVisualViewport composable
Tests keyboard detection, viewport height tracking, debounce behavior.
Includes withSetup test helper for composables with lifecycle hooks.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:22:02 +00:00
DorianandClaude Opus 4.6 1a9b769e45 test(app): add unit tests for useContentPanel composable
Tests tab switching, detail open/close, panel state management,
design system mode. 9 test cases.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:21:12 +00:00
DorianandClaude Opus 4.6 7c8315f362 test(app): add unit tests for usePlayer composable
Tests queue management, state transitions, progress computation,
deduplication, and API shape. 9 test cases.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:20:27 +00:00
DorianandClaude Opus 4.6 ece4540388 feat(app): add Content-Security-Policy meta tag
Restricts script, style, img, connect, media, and frame sources to
known-safe origins. Blocks object embeds and enforces base-uri self.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:18:58 +00:00
DorianandClaude Opus 4.6 e7496883c4 fix(app): replace innerHTML='' with textContent='' in usePlayer
Safer DOM clearing that avoids innerHTML for content sanitization.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:18:29 +00:00
DorianandClaude Opus 4.6 2581f20ebf fix(app): add URL length limit (2048 chars) to extractUrlFromText
Prevents processing excessively long URLs in content extraction.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:18:00 +00:00
DorianandClaude Opus 4.6 2ced4830f6 fix(app): add postMessage origin validation to archyBridge
Configurable origin replaces wildcard '*' for both sending and receiving.
Origin check filters incoming messages when a specific origin is set.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:17:24 +00:00
DorianandClaude Opus 4.6 f84e68ad06 fix(app): add error handling to PdfViewer renderPage and VideoPlayer initHls
Prevents unhandled promise rejections from async watchers and lifecycle hooks.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:16:34 +00:00
DorianandClaude Opus 4.6 9b3fd5d973 fix(app): add catch block to SSE readSSE for stream read errors
Reports stream errors to onError callback instead of silently failing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:14:31 +00:00
DorianandClaude Opus 4.6 82f1e99324 fix(app): wrap unprotected JSON.parse calls in try/catch
SSE stream callbacks and AI response parsing now handle malformed data
gracefully instead of throwing unhandled exceptions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:11:18 +00:00
DorianandClaude Opus 4.6 9ba4854024 fix(app): debounce viewport change handler, overflow hidden when keyboard open
50ms debounce prevents jittery resizing on mobile keyboard open/close.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:08:30 +00:00
DorianandClaude Opus 4.6 378b60820a fix(content): add .catch() to cover fetch promise chains in grids
Prevents unhandled promise rejections if fetch throws unexpectedly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:07:32 +00:00
DorianandClaude Opus 4.6 6e671faa3c fix(app): brighten SVG fallback covers — increase lightness by +10%
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:06:04 +00:00
DorianandClaude Opus 4.6 9dbc9c24a6 chore: overnight plan 2026-03-04 + /overnight command
- Rewrote loop/plan.md with 34 checkbox tasks across 8 phases
- Updated loop/prompt.md for new overnight scope
- Added .claude/commands/overnight.md skill
- Self-destructing dev SW from previous session

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 21:34:33 +00:00
DorianandClaude Opus 4.6 8a1c3135dd fix(app): disable PWA service worker in dev, fix deprecated meta tag
Dev mode SW was caching stale responses and breaking page loads.
Disabled devOptions.enabled to prevent SW registration during development.
Added mobile-web-app-capable meta tag (the modern replacement for
apple-mobile-web-app-capable).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 21:06:41 +00:00
DorianandClaude Opus 4.6 e21d13ab3f revert(app): remove basicSsl — breaks HTTP dev access on LAN
The always-on HTTPS plugin prevented HTTP access at the LAN IP.
PWA install requires HTTPS but that should be handled at deploy time,
not in dev config.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 21:04:37 +00:00
DorianandClaude Opus 4.6 0fa78cbf1d fix(app): keyboard resizes container, tab bar margin, HTTPS for PWA install
- Root container height now bound to visualViewport.height when keyboard
  is open — the whole layout shrinks instead of being pushed offscreen
- Tab bar gets 24px vertical margin (12px top + 12px bottom + safe area)
- Added @vitejs/plugin-basic-ssl for HTTPS dev server — required for PWA
  install on non-localhost origins (LAN IP access)
- Improved useVisualViewport to track fullHeight for accurate keyboard
  offset calculation across orientation changes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 21:01:07 +00:00
DorianandClaude Opus 4.6 a0a9cf8e54 feat(app): mobile improvements — native-feel viewport, keyboard, HIG tabs, PWA fix
- Lock viewport: position:fixed on html/body prevents iOS bounce scroll
- No zoom on input focus: maximum-scale=1, user-scalable=no
- Keyboard-responsive chat: visualViewport API detects keyboard, hides
  tab bar, scrolls chat to bottom, scrollIntoView on input focus
- iOS HIG tab bar: 49pt height, vertical icon+label, safe-area-inset-bottom
- PWA fix: manifest start_url/scope/id changed from '/' to './' for
  subpath deployment compatibility
- PlayerBar: variant prop (fixed/inline), inline on mobile above tab bar,
  fixed on desktop. No more overlap with tab bar.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 20:50:06 +00:00
DorianandClaude Opus 4.6 799ca131d9 fix(app): only show gradient overlay on real images, not SVG fallbacks
The from-black/60 gradient overlay was making SVG text fallbacks appear
completely black. Now the gradient only renders when there's an actual
image, letting the designed SVG fallbacks show through properly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 20:31:11 +00:00
DorianandClaude Opus 4.6 6a1ce2e185 fix(app): brighten SVG text fallbacks so they're visible over dark overlays
All 8 SVG generators (song, podcast, news, image, film, TV, book, place)
had backgrounds at 9-10% lightness which appeared black under grid gradient
overlays. Bumped to 18% with proportionally brighter text and icons.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 20:21:13 +00:00
DorianandClaude Opus 4.6 c88e837cc9 feat(app): add real images to all seed content + universal SVG text fallbacks
- Songs: 19/21 now have iTunes album art URLs (2 niche Bitcoin artists use fallback)
- Podcasts: 21/21 now have iTunes artwork URLs
- News: 21/21 now have Unsplash topic images
- Books: Fixed The Network State cover URL
- Places: 21/21 now have photos (Unsplash + Wikimedia)
- Added generateNewsFallback() and generateImageFallback() SVG generators
- Updated NewsCard, NewsGrid, ImageCard to use SVG text fallback instead of emoji
- Added error handling to PlaceCard and PlaceGrid for failed photo loads

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 20:11:15 +00:00
DorianandClaude Opus 4.6 982a0c6aa6 fix(app): news tab shows eagerly for news queries, populates async
The news tab was missing because hasNews evaluated to false when web
search results hadn't arrived yet. Now shows the tab eagerly for news
queries — results populate when they arrive via the deep watcher.
Also fixes RSS late-insertion to place before the Prompt tab.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 18:14:27 +00:00