Skip to main content

Component-Database Relations

Understanding how MonoTerm’s components interact with databases.
╔══════════════════════════════════════════════════════════════════════╗
β•‘                    COMPONENT-DATABASE OVERVIEW                       β•‘
╠══════════════════════════════════════════════════════════════════════╣
β•‘                                                                      β•‘
β•‘  DAEMON LAYER                     DATABASE LAYER                     β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β•‘
β•‘  β”‚ PTY Daemon      │────Unix─────▢│ No direct DB    β”‚                β•‘
β•‘  β”‚ (pty-daemon-    β”‚   Socket     β”‚ Pure I/O only   β”‚                β•‘
β•‘  β”‚  rust)          β”‚              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                 β•‘
β•‘                                                                      β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β•‘
β•‘  β”‚ File Watcher    │──rusqlite───▢│ niia-watcher.db β”‚                β•‘
β•‘  β”‚ (niia-watcher)  β”‚   direct     β”‚ File events     β”‚                β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β•‘
β•‘                                                                      β•‘
β•‘  RUST BACKEND                                                        β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β•‘
β•‘  β”‚ SessionActor    │──rusqlite───▢│ session.db      β”‚                β•‘
β•‘  β”‚ (lib.rs)        β”‚              β”‚ Terminal state  β”‚                β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β•‘
β•‘                                                                      β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β•‘
β•‘  β”‚ PTY Log         │──rusqlite───▢│ atomic-term.db  β”‚                β•‘
β•‘  β”‚ (VTE Parser)    β”‚              β”‚ Activity logs   β”‚                β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β•‘
β•‘                                                                      β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Write Access Matrix

Which components can write to which databases.
╔═════════════════════════════════════════════════════════════════════╗
β•‘                    WRITE ACCESS MATRIX                              β•‘
╠═════════════════════════════════════════════════════════════════════╣
β•‘                                                                     β•‘
β•‘                  β”‚ atomic- β”‚ session β”‚ onit  β”‚ niia-   β”‚ work-wiki  β•‘
β•‘  COMPONENT       β”‚ term.db β”‚ .db     β”‚ .db   β”‚ watcher β”‚ -diff.db   β•‘
β•‘  ════════════════│═════════│═════════│═══════│═════════│═══════════ β•‘
β•‘  PTY Daemon      β”‚    -    β”‚    -    β”‚   -   β”‚    -    β”‚     -      β•‘
β•‘  (No DB access)  β”‚         β”‚         β”‚       β”‚         β”‚            β•‘
β•‘  ────────────────│─────────│─────────│───────│─────────│─────────── β•‘
β•‘  Rust Backend    β”‚   Yes   β”‚   Yes   β”‚  Yes  β”‚    -    β”‚    Yes     β•‘
β•‘  (SessionActor)  β”‚         β”‚         β”‚       β”‚         β”‚            β•‘
β•‘  ────────────────│─────────│─────────│───────│─────────│─────────── β•‘
β•‘  File Watcher    β”‚    -    β”‚    -    β”‚   -   β”‚   Yes   β”‚     -      β•‘
β•‘  (Daemon)        β”‚         β”‚         β”‚       β”‚ direct  β”‚            β•‘
β•‘                                                                     β•‘
β•‘  Legend: Yes = Write access, - = No access                          β•‘
β•‘                                                                     β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Terminal Input to Activity Log

How user input becomes a logged activity.
╔══════════════════════════════════════════════════════════════════════╗
β•‘                TERMINAL INPUT ──▢ ACTIVITY LOG                       β•‘
╠══════════════════════════════════════════════════════════════════════╣
β•‘                                                                      β•‘
β•‘   You Type Command                                                   β•‘
β•‘        β”‚                                                             β•‘
β•‘        β–Ό                                                             β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                β•‘
β•‘   β”‚   xterm.js      β”‚  Frontend terminal display                     β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                β•‘
β•‘        β”‚                                                             β•‘
β•‘        β”‚ Tauri IPC                                                   β•‘
β•‘        β–Ό                                                             β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                β•‘
β•‘   β”‚ SessionActor    β”‚  Rust backend                                  β•‘
β•‘   β”‚ (lib.rs)        β”‚  Routes to PTY                                 β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                β•‘
β•‘        β”‚                                                             β•‘
β•‘        β”‚ Unix Socket                                                 β•‘
β•‘        β–Ό                                                             β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                β•‘
β•‘   β”‚ PTY Daemon      β”‚  Sends to shell                                β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                β•‘
β•‘        β”‚                                                             β•‘
β•‘        β”‚ Shell executes, returns output                              β•‘
β•‘        β–Ό                                                             β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                        β•‘
β•‘   β”‚ VTE Parser      │────▢│ Activity Log    β”‚                        β•‘
β•‘   β”‚ (Alacritty)     β”‚     β”‚ (atomic-term.db)β”‚                        β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                        β•‘
β•‘        β”‚                                                             β•‘
β•‘        β”‚ ACK Handshake                                               β•‘
β•‘        β–Ό                                                             β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                β•‘
β•‘   β”‚   xterm.js      β”‚  Display updated                               β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                β•‘
β•‘                                                                      β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

File Change to UI Update

How file system changes appear in the UI.
╔══════════════════════════════════════════════════════════════════════╗
β•‘                  FILE CHANGE ──▢ UI UPDATE                           β•‘
╠══════════════════════════════════════════════════════════════════════╣
β•‘                                                                      β•‘
β•‘   File Created/Modified/Deleted                                      β•‘
β•‘        β”‚                                                             β•‘
β•‘        β”‚ OS Event (FSEvents/inotify)                                 β•‘
β•‘        β–Ό                                                             β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β•‘
β•‘   β”‚              File Watcher Daemon (Sidecar)                  β”‚    β•‘
β•‘   β”‚                                                             β”‚    β•‘
β•‘   β”‚   Rust notify crate                                         β”‚    β•‘
β•‘   β”‚        β”‚                                                    β”‚    β•‘
β•‘   β”‚        β”‚ Debounce (100ms)                                   β”‚    β•‘
β•‘   β”‚        β–Ό                                                    β”‚    β•‘
β•‘   β”‚   Direct rusqlite write (NO IPC overhead)                   β”‚    β•‘
β•‘   β”‚        β”‚                                                    β”‚    β•‘
β•‘   β”‚        β–Ό                                                    β”‚    β•‘
β•‘   β”‚   niia-watcher.db                                           β”‚    β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β•‘
β•‘                                                                      β•‘
β•‘   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─      β•‘
β•‘                      Async Polling (every 3-5s)                      β•‘
β•‘   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─      β•‘
β•‘                                                                      β•‘
β•‘   Frontend polls for new events                                      β•‘
β•‘        β”‚                                                             β•‘
β•‘        β”‚ Tauri invoke()                                              β•‘
β•‘        β–Ό                                                             β•‘
β•‘   SELECT * FROM file_events WHERE timestamp > last_check             β•‘
β•‘        β”‚                                                             β•‘
β•‘        β–Ό                                                             β•‘
β•‘   UI Updates with new file events                                    β•‘
β•‘                                                                      β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Session Lifecycle

Four phases of a terminal session.
╔══════════════════════════════════════════════════════════════════════╗
β•‘                      SESSION LIFECYCLE                               β•‘
╠══════════════════════════════════════════════════════════════════════╣
β•‘                                                                      β•‘
β•‘   PHASE 1: APP LAUNCH                                                β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β•‘
β•‘   β”‚ 1. Read saved state from session.db                           β”‚  β•‘
β•‘   β”‚ 2. Start PTY Daemon (3-retry pattern)                         β”‚  β•‘
β•‘   β”‚ 3. Recover orphaned sessions (reconnect to alive PTYs)        β”‚  β•‘
β•‘   β”‚ 4. Restore document tabs                                      β”‚  β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β•‘
β•‘                                                                      β•‘
β•‘   PHASE 2: ACTIVE SESSION                                            β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β•‘
β•‘   β”‚ - Terminal Activity: User Input ──▢ PTY ──▢ Activity Log      β”‚  β•‘
β•‘   β”‚ - Heartbeat (every 10s): UPDATE terminal_heartbeats           β”‚  β•‘
β•‘   β”‚ - Project Switch: Track project associations                  β”‚  β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β•‘
β•‘                                                                      β•‘
β•‘   PHASE 3: TAB CLOSE                                                 β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β•‘
β•‘   β”‚ - Terminal: Mark session inactive (is_active=0)               β”‚  β•‘
β•‘   β”‚ - Clean up resources                                          β”‚  β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β•‘
β•‘                                                                      β•‘
β•‘   PHASE 4: APP CLOSE                                                 β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β•‘
β•‘   β”‚ - Save state to session.db                                    β”‚  β•‘
β•‘   β”‚ - PTY Daemon: Stays running (detached, crash-resilient)       β”‚  β•‘
β•‘   β”‚ - File Watcher: Stays running (detached)                      β”‚  β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β•‘
β•‘                                                                      β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Cross-Database Sync Points

When data moves between databases.
╔═══════════════════════════════════════════════════════════════════════╗
β•‘                   CROSS-DATABASE SYNC                                 β•‘
╠═══════════════════════════════════════════════════════════════════════╣
β•‘                                                                       β•‘
β•‘   SYNC POINT              SOURCE ──▢ TARGET             TRIGGER       β•‘
β•‘   ═══════════════════════════════════════════════════════════════     β•‘
β•‘                                                                       β•‘
β•‘   Terminal State          Rust Backend                  Session       β•‘
β•‘                           ──▢                           create/destroyβ•‘
β•‘                           session.db                                  β•‘
β•‘                                                                       β•‘
β•‘   Activity Logs           atomic-term.db                Activity      β•‘
β•‘                           ──▢                           detected      β•‘
β•‘                           onit.db                                     β•‘
β•‘                                                                       β•‘
β•‘   File Events             niia-watcher.db               Periodic      β•‘
β•‘                           ──▢                           (30s)         β•‘
β•‘                           onit.db                                     β•‘
β•‘                                                                       β•‘
β•‘   Path Resolution         niia-watcher.db               Relative      β•‘
β•‘                           ──▢                           path lookup   β•‘
β•‘                           atomic-term.db                              β•‘
β•‘                                                                       β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Write Optimization Patterns

How writes are optimized for performance.
╔══════════════════════════════════════════════════════════════════════╗
β•‘                  WRITE OPTIMIZATION PATTERNS                         β•‘
╠══════════════════════════════════════════════════════════════════════╣
β•‘                                                                      β•‘
β•‘   PATTERN A: Direct Write (Highest Performance)                      β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β•‘
β•‘   β”‚  Use Case: High-frequency events (file watcher)               β”‚  β•‘
β•‘   β”‚  Method: rusqlite direct connection                           β”‚  β•‘
β•‘   β”‚  Example: File Watcher ──▢ niia-watcher.db                    β”‚  β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β•‘
β•‘                                                                      β•‘
β•‘   PATTERN B: Batched Write (Balanced)                                β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β•‘
β•‘   β”‚  Use Case: Medium-frequency events (PTY log)                  β”‚  β•‘
β•‘   β”‚  Method: Batch 10 items OR flush every 100ms                  β”‚  β•‘
β•‘   β”‚  Example: PTY Log ──▢ atomic-term.db                          β”‚  β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β•‘
β•‘                                                                      β•‘
β•‘   PATTERN C: Deferred Write (Debounced)                              β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β•‘
β•‘   β”‚  Use Case: Low-frequency events (window state)                β”‚  β•‘
β•‘   β”‚  Method: Debounce 500ms before write                          β”‚  β•‘
β•‘   β”‚  Example: Window resize ──▢ session.db                        β”‚  β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β•‘
β•‘                                                                      β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Design Principles Applied

╔══════════════════════════════════════════════════════════════════════╗
β•‘                      DESIGN PRINCIPLES                               β•‘
╠══════════════════════════════════════════════════════════════════════╣
β•‘                                                                      β•‘
β•‘   SIMPLICITY (SMPC)                                                  β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β•‘
β•‘   β”‚ [x] PTY Daemon = No DB access (pure I/O passthrough)          β”‚  β•‘
β•‘   β”‚ [x] VTE Parser = Transform only (no persistence logic)        β”‚  β•‘
β•‘   β”‚ [x] Direct path: Event ──▢ Daemon ──▢ DB                      β”‚  β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β•‘
β•‘                                                                      β•‘
β•‘   ORDER FROM CHAOS (OFAC)                                            β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β•‘
β•‘   β”‚ [x] Daemons survive app crash (detached processes)            β”‚  β•‘
β•‘   β”‚ [x] 3-retry pattern for daemon startup                        β”‚  β•‘
β•‘   β”‚ [x] WAL mode for concurrent access                            β”‚  β•‘
β•‘   β”‚ [x] Separate DBs per domain (isolation)                       β”‚  β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β•‘
β•‘                                                                      β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Quick Reference

ComponentDB AccessKey Pattern
PTY DaemonNonePure I/O passthrough
VTE ParserNoneTransform only
PTY Log1 DB Writeatomic-term.db
File Watcher1 DB WriteDetached daemon
OnIt Sidebar4 DBs ReadAggregation view