- MIGRATION_CLUSTERS.md: reactive dependency graph across 20 bridges/stores - PHASE1_STORE_AUDIT.md: 11 stores audited (3 clean, 5 bridge-dependent, 3 platform-specific) - ADR-001: dual-stack binding strategy (accepted, S-1+S-3 hybrid) - Settings domain migration: all 6 settings components + App.svelte + FilesTab migrated from settings-bridge to getBackend() calls
267 lines
9.8 KiB
Markdown
267 lines
9.8 KiB
Markdown
# Phase 1 Store Audit: Platform Dependency Analysis
|
|
|
|
Categorization of each store for migration readiness to `@agor/stores`.
|
|
|
|
## Category Definitions
|
|
|
|
- **CLEAN:** No platform dependencies. Can move to `@agor/stores` as-is.
|
|
- **BRIDGE-DEPENDENT:** Uses bridge adapters (Tauri invoke/listen). Needs BackendAdapter migration first.
|
|
- **PLATFORM-SPECIFIC:** Contains platform-specific logic (paths, APIs). Stays in app-specific layer.
|
|
|
|
---
|
|
|
|
## Store Analysis
|
|
|
|
### 1. agents.svelte.ts
|
|
**Category: CLEAN**
|
|
|
|
| Check | Result |
|
|
|-------|--------|
|
|
| Platform-specific paths | None |
|
|
| Persistence paths | None (pure in-memory) |
|
|
| Capability-conditioned defaults | None |
|
|
| Tauri/Bun imports | None |
|
|
|
|
**Notes:** Only import is `type AgentMessage` from `claude-messages` (type-only, already in `@agor/types` as `AgentMessage`). Pure reactive state with no I/O. Ready to move immediately.
|
|
|
|
---
|
|
|
|
### 2. workspace.svelte.ts
|
|
**Category: BRIDGE-DEPENDENT**
|
|
|
|
| Check | Result |
|
|
|-------|--------|
|
|
| Platform-specific paths | None directly (groups.json path resolved in Rust backend) |
|
|
| Persistence paths | `groups-bridge.ts` → Tauri `invoke('groups_load')` / `invoke('groups_save')` |
|
|
| Capability-conditioned defaults | None |
|
|
| Tauri/Bun imports | `groups-bridge` (Tauri invoke), `btmsg-bridge` (Tauri invoke) |
|
|
|
|
**Bridge dependencies:**
|
|
- `loadGroups()` / `saveGroups()` → already in BackendAdapter
|
|
- `getCliGroup()` → Tauri-specific CLI arg parsing, not in BackendAdapter
|
|
- `registerAgents()` → btmsg-bridge, not in BackendAdapter
|
|
|
|
**Notes:** `loadGroups`/`saveGroups` can migrate to `getBackend()`. `getCliGroup` and `registerAgents` need new BackendAdapter methods or remain as separate bridges. Cross-store imports (agents, health, conflicts, wake-scheduler) are all clean function calls.
|
|
|
|
---
|
|
|
|
### 3. layout.svelte.ts
|
|
**Category: BRIDGE-DEPENDENT**
|
|
|
|
| Check | Result |
|
|
|-------|--------|
|
|
| Platform-specific paths | None (SQLite path resolved in Rust) |
|
|
| Persistence paths | `session-bridge.ts` → 8 Tauri invoke commands |
|
|
| Capability-conditioned defaults | None |
|
|
| Tauri/Bun imports | `session-bridge` (Tauri invoke) |
|
|
|
|
**Bridge dependencies:**
|
|
- `listSessions`, `saveSession`, `deleteSession`, `updateSessionTitle`, `touchSession` → session CRUD
|
|
- `saveLayout`, `loadLayout` → layout persistence
|
|
- `updateSessionGroup` → group assignment
|
|
|
|
**Notes:** V2 legacy store. V3 uses workspace.svelte.ts. Session persistence commands not yet in BackendAdapter. Could be deferred or added as BackendAdapter extension.
|
|
|
|
---
|
|
|
|
### 4. health.svelte.ts
|
|
**Category: CLEAN**
|
|
|
|
| Check | Result |
|
|
|-------|--------|
|
|
| Platform-specific paths | None |
|
|
| Persistence paths | None (pure in-memory with timer) |
|
|
| Capability-conditioned defaults | None |
|
|
| Tauri/Bun imports | None |
|
|
|
|
**Notes:** Imports from stores only (agents, conflicts) and utils (attention-scorer). Pure computation + timers. Ready to move.
|
|
|
|
---
|
|
|
|
### 5. conflicts.svelte.ts
|
|
**Category: CLEAN**
|
|
|
|
| Check | Result |
|
|
|-------|--------|
|
|
| Platform-specific paths | None |
|
|
| Persistence paths | None (session-scoped, no persistence) |
|
|
| Capability-conditioned defaults | None |
|
|
| Tauri/Bun imports | None |
|
|
|
|
**Notes:** Only imports `types/ids`. Pure in-memory conflict tracking. Ready to move.
|
|
|
|
---
|
|
|
|
### 6. anchors.svelte.ts
|
|
**Category: BRIDGE-DEPENDENT**
|
|
|
|
| Check | Result |
|
|
|-------|--------|
|
|
| Platform-specific paths | None (SQLite path resolved in Rust) |
|
|
| Persistence paths | `anchors-bridge.ts` → 4 Tauri invoke commands |
|
|
| Capability-conditioned defaults | None |
|
|
| Tauri/Bun imports | `anchors-bridge` (Tauri invoke) |
|
|
|
|
**Bridge dependencies:**
|
|
- `saveSessionAnchors`, `loadSessionAnchors`, `deleteSessionAnchor`, `updateAnchorType`
|
|
|
|
**Notes:** Small, well-defined bridge surface. Could add anchor CRUD to BackendAdapter or keep as separate bridge temporarily.
|
|
|
|
---
|
|
|
|
### 7. theme.svelte.ts
|
|
**Category: BRIDGE-DEPENDENT**
|
|
|
|
| Check | Result |
|
|
|-------|--------|
|
|
| Platform-specific paths | None |
|
|
| Persistence paths | `settings-bridge.ts` → `getSetting`/`setSetting` (Tauri invoke) |
|
|
| Capability-conditioned defaults | None |
|
|
| Tauri/Bun imports | `settings-bridge` (Tauri invoke) |
|
|
|
|
**Bridge dependencies:**
|
|
- `getSetting('theme')`, `setSetting('theme', ...)` — theme persistence
|
|
- `getSetting('ui_font_family')` etc. — 4 font settings on init
|
|
|
|
**Platform-specific behavior:**
|
|
- `document.documentElement.style.setProperty()` — browser API, works on both Tauri and Electrobun webviews. Not platform-specific.
|
|
|
|
**Notes:** Simple migration — replace `getSetting`/`setSetting` with `getBackend().getSetting()`/`getBackend().setSetting()`.
|
|
|
|
---
|
|
|
|
### 8. plugins.svelte.ts
|
|
**Category: BRIDGE-DEPENDENT**
|
|
|
|
| Check | Result |
|
|
|-------|--------|
|
|
| Platform-specific paths | None (plugin config dir resolved in Rust) |
|
|
| Persistence paths | `settings-bridge.ts` → plugin enabled state; `plugins-bridge.ts` → plugin discovery |
|
|
| Capability-conditioned defaults | `supportsPluginSandbox` could gate plugin loading |
|
|
| Tauri/Bun imports | `plugins-bridge` (Tauri invoke), `settings-bridge` (Tauri invoke) |
|
|
|
|
**Bridge dependencies:**
|
|
- `discoverPlugins()` → plugins-bridge (not in BackendAdapter)
|
|
- `getSetting`/`setSetting` → plugin enabled state
|
|
|
|
**Notes:** Plugin discovery is not in BackendAdapter. Settings part can migrate. Plugin host (`plugin-host.ts`) is pure Web Worker logic — platform-independent.
|
|
|
|
---
|
|
|
|
### 9. machines.svelte.ts
|
|
**Category: BRIDGE-DEPENDENT**
|
|
|
|
| Check | Result |
|
|
|-------|--------|
|
|
| Platform-specific paths | None |
|
|
| Persistence paths | `remote-bridge.ts` → 5 invoke commands + 5 listen events |
|
|
| Capability-conditioned defaults | None |
|
|
| Tauri/Bun imports | `remote-bridge` (Tauri invoke + listen) |
|
|
|
|
**Bridge dependencies:**
|
|
- `listRemoteMachines`, `addRemoteMachine`, `removeRemoteMachine`, `connectRemoteMachine`, `disconnectRemoteMachine`
|
|
- 5 event listeners: `onRemoteMachineReady`, `onRemoteMachineDisconnected`, `onRemoteError`, `onRemoteMachineReconnecting`, `onRemoteMachineReconnectReady`
|
|
|
|
**Notes:** Heavy bridge dependency with event subscription lifecycle. Not in BackendAdapter. Defer migration.
|
|
|
|
---
|
|
|
|
### 10. wake-scheduler.svelte.ts
|
|
**Category: BRIDGE-DEPENDENT**
|
|
|
|
| Check | Result |
|
|
|-------|--------|
|
|
| Platform-specific paths | None |
|
|
| Persistence paths | `bttask-bridge.ts` → `listTasks`; `audit-bridge.ts` → `logAuditEvent` |
|
|
| Capability-conditioned defaults | None |
|
|
| Tauri/Bun imports | `bttask-bridge` (Tauri invoke), `audit-bridge` (Tauri invoke) |
|
|
|
|
**Bridge dependencies:**
|
|
- `listTasks(groupId)` → task listing for wake signal evaluation
|
|
- `logAuditEvent(...)` → audit logging
|
|
|
|
**Notes:** Neither bttask nor audit operations are in BackendAdapter. Cross-store reads (health, workspace, agents). Complex timer logic is pure JS — platform independent. Bridges are the only blockers.
|
|
|
|
---
|
|
|
|
### 11. notifications.svelte.ts
|
|
**Category: BRIDGE-DEPENDENT**
|
|
|
|
| Check | Result |
|
|
|-------|--------|
|
|
| Platform-specific paths | None |
|
|
| Persistence paths | None (ephemeral state) |
|
|
| Capability-conditioned defaults | `supportsDesktopNotifications` should gate `sendDesktopNotification` |
|
|
| Tauri/Bun imports | `notifications-bridge` (Tauri invoke) |
|
|
|
|
**Bridge dependencies:**
|
|
- `sendDesktopNotification(title, body, urgency)` — single function, fire-and-forget
|
|
|
|
**Notes:** Toast system is pure reactive state. Only the OS notification part needs the bridge. Easy to capability-gate: `if (getBackend().capabilities.supportsDesktopNotifications) sendDesktopNotification(...)`.
|
|
|
|
---
|
|
|
|
### BONUS: settings-scope.svelte.ts
|
|
**Category: BRIDGE-DEPENDENT**
|
|
|
|
| Check | Result |
|
|
|-------|--------|
|
|
| Platform-specific paths | None |
|
|
| Persistence paths | `settings-bridge.ts` → `getSetting`/`setSetting` |
|
|
| Capability-conditioned defaults | None |
|
|
| Tauri/Bun imports | `settings-bridge` (Tauri invoke) |
|
|
|
|
**Notes:** Thin scoping layer over settings-bridge. Migrates with Cluster 2 (Settings Domain).
|
|
|
|
---
|
|
|
|
### BONUS: sessions.svelte.ts
|
|
**Category: CLEAN**
|
|
|
|
| Check | Result |
|
|
|-------|--------|
|
|
| Platform-specific paths | None |
|
|
| Persistence paths | None |
|
|
| Capability-conditioned defaults | None |
|
|
| Tauri/Bun imports | None |
|
|
|
|
**Notes:** V2 legacy, minimal. Pure reactive state.
|
|
|
|
---
|
|
|
|
## Summary Table
|
|
|
|
| Store | Category | Bridge Deps | Migration Blocker |
|
|
|-------|----------|-------------|-------------------|
|
|
| agents | CLEAN | none | -- |
|
|
| conflicts | CLEAN | none | -- |
|
|
| sessions | CLEAN | none | -- |
|
|
| health | CLEAN | none | -- |
|
|
| theme | BRIDGE-DEPENDENT | settings-bridge | BackendAdapter.getSetting/setSetting (ready) |
|
|
| settings-scope | BRIDGE-DEPENDENT | settings-bridge | BackendAdapter.getSetting/setSetting (ready) |
|
|
| notifications | BRIDGE-DEPENDENT | notifications-bridge | Capability-gate sendDesktopNotification |
|
|
| anchors | BRIDGE-DEPENDENT | anchors-bridge | Need BackendAdapter anchor methods |
|
|
| plugins | BRIDGE-DEPENDENT | plugins-bridge, settings-bridge | Need BackendAdapter plugin discovery |
|
|
| layout | BRIDGE-DEPENDENT | session-bridge | Need BackendAdapter session methods |
|
|
| workspace | BRIDGE-DEPENDENT | groups-bridge, btmsg-bridge | BackendAdapter groups (ready), btmsg TBD |
|
|
| machines | BRIDGE-DEPENDENT | remote-bridge | Need BackendAdapter remote machine methods |
|
|
| wake-scheduler | BRIDGE-DEPENDENT | bttask-bridge, audit-bridge | Need BackendAdapter bttask/audit methods |
|
|
|
|
### Ready to Migrate Now (4 stores)
|
|
- `agents.svelte.ts` — CLEAN
|
|
- `conflicts.svelte.ts` — CLEAN
|
|
- `health.svelte.ts` — CLEAN
|
|
- `sessions.svelte.ts` — CLEAN
|
|
|
|
### Ready After Settings-Bridge Replacement (3 stores)
|
|
- `theme.svelte.ts` — settings-bridge only
|
|
- `settings-scope.svelte.ts` — settings-bridge only
|
|
- `plugins.svelte.ts` — settings-bridge + plugins-bridge
|
|
|
|
### Requires BackendAdapter Extension (6 stores)
|
|
- `notifications.svelte.ts` — 1 method
|
|
- `anchors.svelte.ts` — 4 methods
|
|
- `layout.svelte.ts` — 8 methods
|
|
- `workspace.svelte.ts` — groups ready, btmsg TBD
|
|
- `machines.svelte.ts` — 10 methods + events
|
|
- `wake-scheduler.svelte.ts` — bttask + audit
|