Files
loki/docs/implementation/PHASE-1-STEP-8i-NOTES.md
2026-04-15 12:56:00 -06:00

103 lines
3.6 KiB
Markdown

# Phase 1 Step 8i — Implementation Notes
## Status
Done.
## Plan reference
- Plan: `docs/PHASE-1-IMPLEMENTATION-PLAN.md`
- Section: "Step 8i: Migrate `Rag` module away from `GlobalConfig`"
## Summary
Migrated the `Rag` module's public API from `&GlobalConfig` to
`&AppConfig` + `&[ClientConfig]`. The `Rag` struct now holds
`app_config: Arc<AppConfig>` and `clients_config: Vec<ClientConfig>`
instead of `config: GlobalConfig`. A private `build_temp_global_config`
bridge method remains for `init_client` calls (client module still
takes `&GlobalConfig` — Step 8j scope).
`RequestContext::use_rag`, `edit_rag_docs`, and `rebuild_rag` were
rewritten to call Rag methods directly with `&AppConfig`, eliminating
3 `to_global_config()` escape hatches.
## What was changed
### Files modified
- **`src/rag/mod.rs`** — struct field change + all method signatures:
- `Rag` struct: `config: GlobalConfig``app_config: Arc<AppConfig>`
+ `clients_config: Vec<ClientConfig>`
- `Rag::init`, `load`, `create`: `&GlobalConfig``&AppConfig` + `&[ClientConfig]`
- `Rag::create_config`: `&GlobalConfig``&AppConfig`
- `Rag::refresh_document_paths`: `&GlobalConfig``&AppConfig`
- Added `build_temp_global_config()` private bridge for `init_client`
- Updated `Clone` and `Debug` impls
- **`src/config/request_context.rs`** — rewrote `use_rag`,
`edit_rag_docs`, `rebuild_rag` to call Rag methods directly with
`&AppConfig` instead of bridging through `to_global_config()`
- **`src/config/mod.rs`** — updated `Config::use_rag`,
`Config::edit_rag_docs`, `Config::rebuild_rag` to extract
`AppConfig` and `clients` before calling Rag methods
- **`src/config/agent.rs`** — updated `Agent::init`'s Rag loading
to pass `&AppConfig` + `&clients`
- **`src/config/app_config.rs`** — added `clients: Vec<ClientConfig>`
field (was missing; needed by Rag callers)
- **`src/config/bridge.rs`** — added `clients` to `to_app_config()`
and `from_parts()` conversions
## Key decisions
### 1. `clients_config` captured at construction time
`init_client` reads `config.read().clients` to find the right client
implementation. Rather than holding a `GlobalConfig`, the Rag struct
captures `clients_config: Vec<ClientConfig>` at construction time.
This is safe because client configs don't change during a Rag's
lifetime.
### 2. `build_temp_global_config` bridge for init_client
`init_client` and each client's `init` method still take `&GlobalConfig`
(Step 8j scope). The bridge builds a minimal `Config::default()` with
just the `clients` field populated. This is sufficient because
`init_client` only reads `config.read().clients` and
`config.read().model`.
### 3. `AppConfig` gained a `clients` field
`AppConfig` was missing `clients: Vec<ClientConfig>`. This field is
needed by any code that calls Rag methods (and eventually by
`init_client` when it's migrated in Step 8j). Added to `AppConfig`,
`to_app_config()`, and `from_parts()`.
## Verification
- `cargo check` — clean, zero warnings
- `cargo clippy` — clean
- `cargo test` — 63 passed, 0 failed
## GlobalConfig reference count
| Module | Before 8i | After 8i | Delta |
|---|---|---|---|
| `rag/mod.rs` | 6 | 1 (bridge only) | -5 |
| `request_context.rs` `to_global_config()` calls | 5 | 2 | -3 |
## Handoff to next step
Step 8j (Input + eval_tool_calls migration) can proceed. It can
now use `AppConfig.clients` for client initialization.
## References
- Phase 1 plan: `docs/PHASE-1-IMPLEMENTATION-PLAN.md` — Step 8i
- Step 8h notes: `docs/implementation/PHASE-1-STEP-8h-NOTES.md`
- QA checklist: `docs/QA-CHECKLIST.md` — items 13 (RAG)