feat(rbac): wire AccessGuard into HTTP server and retrieval pipeline

HTTP Layer Integration:
- Add access_guard to AppState with builtin_role_provider
- Add to_rbac_claims() to convert JwtClaims → RBAC Claims
- Add query_result_to_resource_meta() for result filtering

Query Handler (/memory/query):
- RBAC filter applied after M3.8 optimization
- Batch check_access for all results
- Log filtered count per request

Context Handler (/memory/context):
- Project-level access check before lookup
- Return 403 if user lacks project access

Code Cleanup:
- Move http_server from bin to lib module
- Use mem_cli::http_server in main.rs

All 660+ tests passing.
This commit is contained in:
2026-09-01 08:41:21 -07:00
parent 2448e5ebe2
commit 41cdff3676
3 changed files with 96 additions and 6 deletions
+2 -2
View File
@@ -1,5 +1,5 @@
mod lessons_cmd;
mod http_server;
// http_server is in lib.rs, use mem_cli::http_server
mod endpoints;
mod ingest_worker;
mod query_worker;
@@ -227,7 +227,7 @@ async fn main() -> anyhow::Result<()> {
Commands::Serve { port, api_key, database_url } => {
let api_key = api_key.unwrap_or_else(|| std::env::var("MEM_API_KEY").unwrap_or_else(|_| "test-key".to_string()));
let database_url = database_url.unwrap_or_else(|| std::env::var("DATABASE_URL").unwrap_or_else(|_| "postgresql://app:poimen@localhost:5432/memory".to_string()));
http_server::start_server(port, api_key, &database_url).await?
mem_cli::http_server::start_server(port, api_key, &database_url).await?
}
Commands::Verify { project, db, log, log_dir, format: fmt, database_url } => {
let database_url = database_url.unwrap_or_else(|| std::env::var("DATABASE_URL").unwrap_or_else(|_| "postgresql://app:poimen@localhost:5432/memory".to_string()));