- 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
9.8 KiB
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/storesas-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 BackendAdaptergetCliGroup()→ Tauri-specific CLI arg parsing, not in BackendAdapterregisterAgents()→ 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 CRUDsaveLayout,loadLayout→ layout persistenceupdateSessionGroup→ 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 persistencegetSetting('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 evaluationlogAuditEvent(...)→ 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— CLEANconflicts.svelte.ts— CLEANhealth.svelte.ts— CLEANsessions.svelte.ts— CLEAN
Ready After Settings-Bridge Replacement (3 stores)
theme.svelte.ts— settings-bridge onlysettings-scope.svelte.ts— settings-bridge onlyplugins.svelte.ts— settings-bridge + plugins-bridge
Requires BackendAdapter Extension (6 stores)
notifications.svelte.ts— 1 methodanchors.svelte.ts— 4 methodslayout.svelte.ts— 8 methodsworkspace.svelte.ts— groups ready, btmsg TBDmachines.svelte.ts— 10 methods + eventswake-scheduler.svelte.ts— bttask + audit