Phase 1a: Crate scaffold. Add crates/opake-appview to workspace. Includes: config.rs (TOML config with jetstream_url, listen addr, db_path, auth_token, tilde expansion), error.rs (thiserror enum), db/ module (SQLite init, schema creation, grant CRUD, keyring member CRUD, cursor ops). Schema: grants table (uri PK, owner_did, recipient_did, document_uri, permissions, note, created_at, indexed_at), keyring_members table (keyring_uri+member_did composite PK, owner_did, keyring_name, indexed_at), cursor singleton table. Keyring updates use delete-and-reinsert. All queries parameterized. Tests use in-memory SQLite.
Phase 1a: Crate scaffold. Add crates/opake-appview to workspace. Includes: config.rs (TOML config with jetstream_url, listen addr, db_path, auth_token, tilde expansion), error.rs (thiserror enum), db/ module (SQLite init, schema creation, grant CRUD, keyring member CRUD, cursor ops). Schema: grants table (uri PK, owner_did, recipient_did, document_uri, permissions, note, created_at, indexed_at), keyring_members table (keyring_uri+member_did composite PK, owner_did, keyring_name, indexed_at), cursor singleton table. Keyring updates use delete-and-reinsert. All queries parameterized. Tests use in-memory SQLite.