- UI rendering and user interaction
- Window/tray/menu behavior
- Local UX state only (view/model)
- Daemon connection management (HTTP + WS client)
- All business/domain logic
- Persistent state and migrations
- Background jobs/scheduling
- External I/O (files/network/devices)
- Activity workers (active-window polling + input-activity monitoring)
- Chat history persistence (session/message/tool-call CRUD)
- No business rules in
#[tauri::command] - No direct DB writes
- No long-running worker ownership
- No ownership of activity polling/input-monitor loops
- No ownership of chat persistence backends
- Localhost HTTP API (
/v1/*) with bearer token auth - WebSocket event stream (
/v1/events) with same auth - Future optional transport adapter: UDS/Named Pipe
- Shared protocol models live in
crates/skill-daemon-common - Client validates daemon protocol/version on connect
- App startup runs a daemon readiness state machine:
- ensure daemon is running
- protocol gate (
/v1/version) - restart daemon on mismatch
- fallback to rollback daemon snapshot when mismatch persists
- ensure OS background service is installed/running
- macOS: LaunchAgent (
RunAtLoad,KeepAlive) - Linux:
systemd --userservice (Restart=on-failure) - Windows:
sc.exeauto-start service with failure restart policy
Rollback snapshot location:
- macOS/Linux:
~/.config/skill/daemon/bin/skill-daemon.rollback - Windows:
%APPDATA%/skill/daemon/bin/skill-daemon.rollback.exe
- ✅ Activity worker ownership moved to daemon (
crates/skill-daemon/src/activity.rs) - ✅ Activity tracking/settings read-write moved to daemon API (
/v1/activity/*) - ✅ Chat history persistence moved to daemon API (
/v1/llm/chat/*) - ✅ Screenshot capture worker ownership moved to daemon (Tauri no longer spawns
screenshot-worker) - ✅ Tauri no longer spawns active-window/input monitor threads
- ✅ All daemon-owned commands (126) routed through
daemonInvoke()→ daemon HTTP - ✅ Only native/OS commands (101) remain on Tauri
invoke() - ✅ Tauri
generate_handler!pruned from 181 → 134 entries - ✅ Frontend daemon client layer: 10 files, ~860 lines (
src/lib/daemon/)