From 70c162b4e127381efdcfb9229c9c74100624f494 Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Sat, 11 Apr 2026 08:03:13 -0400 Subject: [PATCH] chore: add backlog tasks 142-143, fix task-120 filename encoding Co-Authored-By: Claude Opus 4.6 --- ...versal-Profiles-x-EncryptID-integration.md | 36 ----------- ...versal-Profiles-×-EncryptID-integration.md | 59 +++++++++++++++++++ ...-—-Voice-Conversation-Mode-for-MI-Agent.md | 25 ++++++++ ...ble-Dashboard-with-Persistent-Home-Icon.md | 45 ++++++++++++++ 4 files changed, 129 insertions(+), 36 deletions(-) delete mode 100644 backlog/tasks/task-120 - Universal-Profiles-x-EncryptID-integration.md create mode 100644 backlog/tasks/task-120 - Universal-Profiles-×-EncryptID-integration.md create mode 100644 backlog/tasks/task-142 - miC-—-Voice-Conversation-Mode-for-MI-Agent.md create mode 100644 backlog/tasks/task-143 - Customizable-Dashboard-with-Persistent-Home-Icon.md diff --git a/backlog/tasks/task-120 - Universal-Profiles-x-EncryptID-integration.md b/backlog/tasks/task-120 - Universal-Profiles-x-EncryptID-integration.md deleted file mode 100644 index f0d502e5..00000000 --- a/backlog/tasks/task-120 - Universal-Profiles-x-EncryptID-integration.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -id: 120 -title: Universal Profiles × EncryptID integration -status: In Progress -priority: high -created: 2026-03-16 ---- - -## Description -Give every EncryptID user a LUKSO Universal Profile (LSP0 + LSP6) on Base, controlled by their passkey-derived secp256k1 key. - -## Phase 1: Core (DONE) -- [x] EVM key derivation (`encryptid-sdk/src/client/evm-key.ts`) — HKDF secp256k1 from PRF -- [x] UP deployment service (`encryptid-up-service/`) — Hono API with CREATE2, LSP6 permissions, LSP25 relay -- [x] SDK types — `eid.up` in JWT claims, `LSP6Permission` enum, UP request/response types -- [x] Session UP helpers — `getUPAddress()`, `hasUniversalProfile()`, `setUniversalProfile()` -- [x] Recovery hooks — `onUPRecovery()` for on-chain controller rotation -- [x] Schema migration — UP columns on users table -- [x] Server endpoints — `GET/POST /api/profile/:id/up`, UP info in JWT claims - -## Phase 2: UP-Aware Sessions -- [ ] Map EncryptID AuthLevel → LSP6 BitArray permissions on-chain -- [ ] Guardian → LSP6 controller mapping with ADDPERMISSIONS - -## Phase 3: Payment-Infra Migration -- [ ] WalletAdapter abstraction (UP + Openfort) -- [ ] New users → UP by default - -## Phase 4: NLA Oracle Integration -- [ ] `getEncryptIDWallet()` for CLI -- [ ] Escrow parties identified by UP address - -## Notes -- encryptid-up-service repo: https://gitea.jeffemmett.com/jeffemmett/encryptid-up-service -- Chain: Base Sepolia (84532) for dev, Base mainnet for prod -- LSP contracts are EVM-compatible, deployed on Base diff --git a/backlog/tasks/task-120 - Universal-Profiles-×-EncryptID-integration.md b/backlog/tasks/task-120 - Universal-Profiles-×-EncryptID-integration.md new file mode 100644 index 00000000..b99b8f6e --- /dev/null +++ b/backlog/tasks/task-120 - Universal-Profiles-×-EncryptID-integration.md @@ -0,0 +1,59 @@ +--- +id: TASK-120 +title: Universal Profiles × EncryptID integration +status: In Progress +assignee: [] +created_date: '' +updated_date: '2026-04-10 23:25' +labels: [] +dependencies: [] +priority: high +--- + +## Description + + +Give every EncryptID user a LUKSO Universal Profile (LSP0 + LSP6) on Base, controlled by their passkey-derived secp256k1 key. + +## Phase 1: Core (DONE) +- [x] EVM key derivation (`encryptid-sdk/src/client/evm-key.ts`) — HKDF secp256k1 from PRF +- [x] UP deployment service (`encryptid-up-service/`) — Hono API with CREATE2, LSP6 permissions, LSP25 relay +- [x] SDK types — `eid.up` in JWT claims, `LSP6Permission` enum, UP request/response types +- [x] Session UP helpers — `getUPAddress()`, `hasUniversalProfile()`, `setUniversalProfile()` +- [x] Recovery hooks — `onUPRecovery()` for on-chain controller rotation +- [x] Schema migration — UP columns on users table +- [x] Server endpoints — `GET/POST /api/profile/:id/up`, UP info in JWT claims + +## Phase 2: UP-Aware Sessions +- [x] Map EncryptID AuthLevel → LSP6 BitArray permissions (scaffolding — `lsp6.ts` mapper) +- [ ] Guardian → LSP6 controller mapping with ADDPERMISSIONS +- [ ] On-chain permission write (requires LSP factory deployment) + +## Phase 3: Payment-Infra Migration +- [x] WalletAdapter abstraction (UP + Safe + EOA) — `wallet-adapter.ts` +- [ ] New users → UP by default + +## Phase 4: NLA Oracle Integration +- [x] `getEncryptIDWallet()` for CLI — `wallet-helper.ts` +- [ ] Escrow parties identified by UP address + + +## Notes +- encryptid-up-service repo: https://gitea.jeffemmett.com/jeffemmett/encryptid-up-service +- Chain: Base Sepolia (84532) for dev, Base mainnet for prod +- LSP contracts are EVM-compatible, deployed on Base + +## Implementation Notes + + +**2026-04-10 Architecture Decision — Chain-Parameterized WalletAdapter:** +Phase 3 WalletAdapter MUST be built with `chainId` parameter from day one, not Base-hardcoded. This enables adding Linea (59144/59141) or any EVM L2 as: add chain config → deploy LSP factory → done. Add Linea to CHAIN_MAP alongside the adapter work. CREATE2 determinism should work on Linea's zkEVM but LSP factory contracts need deployment there. Current state: wallet module reads 13+ chains but UP write operations are Base-only. + +## Phases 2-4 Implementation (2026-04-10) +- **Linea chain support**: Added Linea mainnet (59144) + Linea Sepolia (59141) to all 6 chain maps in rwallet/mod.ts, price-feed, defi-positions, wallet-viewer, and encryptid server CHAIN_PREFIXES. Popular tokens: USDC, WETH, USDT on Linea. +- **WalletAdapter** (`src/encryptid/wallet-adapter.ts`): Chain-parameterized abstraction over Safe/EOA/UP with `fromSafe()`, `fromEOA()`, `fromUP()` factories, immutable `withUniversalProfile()`, `getInfo()`, `toJSON()`. +- **LSP6 Permission Mapper** (`encryptid-sdk/src/types/lsp6.ts`): 23-bit `LSP6Permission` enum, `buildBitmap()`, `hasPermission()`, `mergePermissions()`, `AUTH_LEVEL_PERMISSIONS` mapping BASIC→CRITICAL, `GUARDIAN_PERMISSIONS`, `getPermissionsForAuthLevel()`. Removed duplicate inline enum from types/index.ts. +- **getEncryptIDWallet()** (`encryptid-sdk/src/client/wallet-helper.ts`): SDK helper returns read-only `EncryptIDWalletInfo` snapshot (EOA, DID, username, UP, auth level, compressed pubkey) for CLI/oracle. Never exposes private keys. +- **SDK exports**: All new types/functions re-exported from types/index.ts, client/index.ts, src/index.ts. +- Deployed to production. rspace.online returns 200. + diff --git a/backlog/tasks/task-142 - miC-—-Voice-Conversation-Mode-for-MI-Agent.md b/backlog/tasks/task-142 - miC-—-Voice-Conversation-Mode-for-MI-Agent.md new file mode 100644 index 00000000..7ff93a95 --- /dev/null +++ b/backlog/tasks/task-142 - miC-—-Voice-Conversation-Mode-for-MI-Agent.md @@ -0,0 +1,25 @@ +--- +id: TASK-142 +title: miC — Voice Conversation Mode for MI Agent +status: Done +assignee: [] +created_date: '2026-04-10 22:40' +labels: [] +dependencies: [] +priority: medium +--- + +## Description + + +Add a "miC" toggle button to the MI agent that enables a full voice conversation loop: speak → transcribe → auto-submit to MI → speak response aloud → listen again. + +## Implementation +- `lib/mi-voice-bridge.ts`: MiVoiceBridge class — Edge TTS via `claude-voice.jeffemmett.com` WebSocket + Web Speech Synthesis fallback +- `shared/components/rstack-mi.ts`: Voice mode state machine (IDLE → LISTENING → THINKING → SPEAKING → LISTENING), miC buttons in bar + panel header, voice status strip with waveform animation, auto-submit on 1.5s silence, TTS truncation (strips markdown/code, limits to ~4 sentences), echo prevention, interruption support + +## Key Decisions +- Separate SpeechDictation instance from bar dictation (browser only allows one SpeechRecognition) +- No server changes — uses existing #ask() flow and parseMiActions() +- Edge TTS primary, browser speechSynthesis fallback + diff --git a/backlog/tasks/task-143 - Customizable-Dashboard-with-Persistent-Home-Icon.md b/backlog/tasks/task-143 - Customizable-Dashboard-with-Persistent-Home-Icon.md new file mode 100644 index 00000000..d492fe9e --- /dev/null +++ b/backlog/tasks/task-143 - Customizable-Dashboard-with-Persistent-Home-Icon.md @@ -0,0 +1,45 @@ +--- +id: TASK-143 +title: Customizable Dashboard with Persistent Home Icon +status: Done +assignee: [] +created_date: '2026-04-11 03:18' +updated_date: '2026-04-11 03:18' +labels: + - dashboard + - ux + - tab-bar +dependencies: [] +references: + - shared/components/rstack-tab-bar.ts + - shared/components/rstack-user-dashboard.ts + - server/dashboard-routes.ts + - server/shell.ts + - shared/tab-cache.ts + - server/index.ts +priority: medium +--- + +## Description + + +Add always-visible home button in tab bar and customizable widget dashboard system. Persistent home icon toggles dashboard overlay even with tabs open. 8 widget cards (tasks, calendar, activity, members, tools, quick actions, wallet, flows) with toggle/reorder customization persisted to localStorage. Dashboard summary API aggregates data from multiple modules in a single endpoint. + + +## Acceptance Criteria + +- [x] #1 Home icon always visible in tab bar, even with tabs open +- [x] #2 Click home icon toggles dashboard overlay on/off +- [x] #3 Dashboard shows when all tabs closed (existing behavior preserved) +- [x] #4 8 widget cards: tasks, calendar, activity, members, tools, quick actions, wallet, flows +- [x] #5 Customize mode with toggle checkboxes and reorder arrows +- [x] #6 Widget config persisted to localStorage per space +- [x] #7 Dashboard summary API at /api/dashboard-summary/:space +- [x] #8 Auth-gated widgets (activity, wallet) show sign-in prompts when logged out + + +## Final Summary + + +Implemented persistent home icon in tab bar and full widget-based dashboard system.\n\nFiles modified:\n- `rstack-tab-bar.ts`: Permanent home button with home-click event and home-active observed attribute\n- `rstack-user-dashboard.ts`: Full refactor with widget registry, config persistence, customize mode, 8 widget cards with per-widget data loading\n- `server/shell.ts`: home-click listener for dashboard overlay toggle, home-active tracking on layer-switch and dashboard-navigate\n- `shared/tab-cache.ts`: Clear home-active on popstate back-to-tab\n- `server/dashboard-routes.ts` (NEW): GET /api/dashboard-summary/:space aggregation endpoint\n- `server/index.ts`: Mount dashboard routes\n\nCommit: e632858\nDeployed to rspace.online and verified API returns tasks/calendar/flows data. +