pub async fn run(workspace: &Path) -> Result<()>
Entry point. Opens terminal, polls SQLite every 500 ms, handles keys.