You are hardening the AIUI content extraction pipeline, integrating Archy services, and completing incomplete features. Read these files first: 1. `loop/plan.md` — Your task checklist (mark items `- [x]` as you complete them) 2. `CLAUDE.md` — Project conventions, design system rules, and coding standards ## Key Context ### Content Extraction Pipeline - `packages/app/src/composables/contentExtraction.ts` — Extracts books, films, TV, songs, podcasts, places, images, code blocks, apps from AI response text - `packages/app/src/composables/contentFiltering.ts` — Query/response classifiers (isBookQuery, isTVQuery, etc.) and tab routing (filterTabsByContext) - `packages/app/src/composables/useContentPanel.ts` — Wires extraction functions to Vue reactive state and tab system - `packages/app/src/components/content/ContentPanel.vue` — Main content panel rendering grids and detail views - `packages/app/src/components/content/ContentGridView.vue` — Grid view (already has ImageGrid/PlaceGrid wired) - `packages/app/src/__tests__/extractionQuality.test.ts` — Extraction quality test suite (currently 64 tests) Content flows: AI response text → extraction functions → useContentPanel refs → filterTabsByContext → ContentPanel/ContentGridView rendering ### Archy Integration (CRITICAL — this is the main new work) - `packages/app/src/services/archyBridge.ts` — PostMessage client for AIUI ↔ Archipelago IPC (already implemented) - `packages/app/src/composables/useArchy.ts` — Reactive Vue wrapper (just created, needs extension) - `packages/app/src/composables/useAI.ts` — Already injects Archy context via `buildArchyContext()` in `buildSystemPrompt()` Archy is a self-hosted Linux node OS with 23+ apps. AIUI runs as an iframe inside Archy at `/aiui/`. Communication is via postMessage with 5 context categories: apps, system, network, wallet, files. The bridge is initialized when `?embedded=true` is in the URL. **Archy Services Available** (that AIUI should know about): - Bitcoin Core (blockchain data, UTXO, fee estimates) - LND / Core Lightning / Lightning Stack (channels, payments, invoices) - BTCPay Server (payment processing) - Mempool (blockchain explorer) - Nextcloud (files, notes, contacts, calendar via WebDAV) - Immich (photos, ML-tagging) - Nostr relays (nostr-rs-relay, strfry) - Home Assistant (smart home) - Grafana (monitoring) - SearXNG (privacy search) - Ollama (local LLM) - Penpot (design) - OnlyOffice (documents) - Fedimint (federated custody) - Meshtastic (mesh networking) - DID Wallet (Web5 identity) **Data Handshake**: AIUI requests context via `archyBridge.requestContext(category)`. Archy's contextBroker responds with sanitized data (no secrets, no IPs, no keys). Currently `wallet` and `files` categories are stubs in Archy — build the AIUI consumer side anyway so it's ready when Archy implements them. Use realistic mock shapes. **API Path Note**: All API paths use `import.meta.env.BASE_URL` prefix so they work at both `/` (dev) and `/aiui/` (production). This was just implemented — don't change it. ## Design System Rules (must follow for every file you touch) - **Glass morphism only** — use `.glass`, `.glass-card`, `.glass-button`, `.glass-button-sm` from `src/styles/main.css` - **No light-mode conditionals** — never use `isDark ?` pattern. The app is dark-only. Remove any existing light-mode code you encounter. - **No `bg-gray-*` or `bg-white`** — use `bg-white/5`, `bg-white/10`, `bg-black/35` etc. - **Text opacity scale** — `text-white/25` → `/40` → `/60` → `/70` → `/80` → `/90` → `/96` → `text-white` - **Accent colour** — `text-accent` (`#F7931A`), `bg-accent/15`, `border-accent/30` for Bitcoin-orange highlights - **Touch targets** — min 44×44px, 8px gaps between targets - **Font size** — min `16px` on all inputs (prevents iOS zoom) - **Animations** — `animate-scale-in`, `animate-fade-up`, `animate-fade-in` from design system only ## For each task in loop/plan.md: 1. Find the first unchecked `- [ ]` item 2. Read the task description carefully 3. Read the relevant source files before making changes 4. Implement the feature/fix following conventions and design system rules 5. Run `pnpm typecheck && pnpm lint` — fix all errors before committing 6. Run `pnpm test` — fix any failing tests 7. If the task involves tests, run `cd packages/app && npx vitest run` specifically 8. Commit: `type(scope): description` (conventional commits) 9. Mark it done `- [x]` in `loop/plan.md` 10. Move to the next unchecked task immediately ## Rules - Never skip a testing gate — if tests fail, fix them before moving on - If a task is proving difficult, keep trying different approaches. Make at least 30 genuine attempts before giving up and moving on. - Always run typecheck + lint after every code change - Keep initial bundle < 250 KB gzipped — lazy-load anything heavy - Bitcoin only — never altcoins, never fiat payment flows - Privacy first — no external analytics calls, no telemetry - Do not stop until all tasks are checked or you are rate limited - When adding tests, aim for realistic AI response patterns, not trivial examples - When wiring components into ContentPanel.vue, follow the exact same pattern used for existing content types (BookGrid/BookDetail, TVSeriesGrid/TVSeriesDetail, etc.) - When building Archy integration, the AIUI side should be resilient — always handle the case where Archy doesn't respond or data is empty - Commit and push after each completed phase (TEST: tasks)