Files
loki/docs/implementation/PHASE-1-STEP-8k-NOTES.md
2026-04-16 10:17:03 -06:00

102 lines
3.6 KiB
Markdown

# Phase 1 Step 8k — Implementation Notes
## Status
Done.
## Plan reference
- Plan: `docs/PHASE-1-IMPLEMENTATION-PLAN.md`
- Section: "Step 8k: Migrate `Agent::init` and agent lifecycle"
## Summary
Changed `Agent::init` from taking `&GlobalConfig` to taking
`&AppConfig` + `&AppState` + `&Model` + `info_flag`. Removed
MCP registry lifecycle code from `Agent::init` (moved to caller
`Config::use_agent`). Changed `AgentConfig::load_envs` to take
`&AppConfig`. Zero `GlobalConfig` references remain in
`config/agent.rs`.
## What was changed
### Files modified (3 files)
- **`src/config/agent.rs`**:
- `Agent::init` signature: `(config: &GlobalConfig, name, abort_signal)`
`(app: &AppConfig, app_state: &AppState, current_model: &Model,
info_flag: bool, name, abort_signal)`
- Removed MCP registry take/reinit from Agent::init (lines 107-135
in original). MCP lifecycle is now the caller's responsibility.
- `config.read().document_loaders``app.document_loaders`
- `config.read().mcp_server_support``app.mcp_server_support`
- Model resolution uses `app` directly instead of
`config.read().to_app_config()`
- RAG loading uses `app` + `app.clients` directly
- `config.read().vault``app_state.vault.clone()`
- `AgentConfig::load_envs(&Config)``load_envs(&AppConfig)`
- Added `Agent::append_mcp_meta_functions(names)` and
`Agent::mcp_server_names()` accessors
- **`src/config/mod.rs`**:
- `Config::use_agent` now constructs `AppConfig`, `AppState`
(temporary), `current_model`, `info_flag` from the GlobalConfig
and passes them to the new `Agent::init`
- MCP registry take/reinit code moved here from Agent::init
- After Agent::init, appends MCP meta functions to the agent's
function list
- **`src/main.rs`**:
- Updated the direct `Agent::init` call (build-tools path) to use
the new signature
## Key decisions
### 1. MCP lifecycle moved from Agent::init to caller
The plan said "Replace McpRegistry::reinit call with McpFactory::acquire()
pattern." Instead, I moved the MCP lifecycle entirely out of Agent::init
and into the caller. This is cleaner because:
- Agent::init becomes pure spec-loading (no side effects on shared state)
- Different callers can use different MCP strategies (McpRegistry::reinit
for GlobalConfig path, McpFactory::acquire for RequestContext path)
- The MCP meta function names are appended by the caller after init
### 2. Temporary AppState in Config::use_agent
`Config::use_agent` constructs a temporary `AppState` from the GlobalConfig
to pass to Agent::init. The MCP config and log path are extracted from
the GlobalConfig's McpRegistry. The MCP factory is a fresh empty one
(Agent::init doesn't call acquire — it's just for API compatibility).
### 3. No REPL or main.rs changes needed
Both call `Config::use_agent` which adapts internally. The REPL's
`.agent` handler and main.rs agent path are unchanged.
## GlobalConfig reference count
| Module | Before 8k | After 8k |
|---|---|---|
| `config/agent.rs` | ~15 | 0 |
## Verification
- `cargo check` — clean, zero warnings
- `cargo clippy` — clean
- `cargo test` — 63 passed, 0 failed
## Handoff
Step 8l (supervisor migration) can now proceed. `Agent::init` no
longer needs `GlobalConfig`, which means sub-agent spawning in
`supervisor.rs` can construct agents using `&AppConfig` + `&AppState`
without needing to create child GlobalConfigs.
## References
- Phase 1 plan: `docs/PHASE-1-IMPLEMENTATION-PLAN.md` — Step 8k
- Step 8i notes: `docs/implementation/PHASE-1-STEP-8i-NOTES.md`
- Step 8j notes: `docs/implementation/PHASE-1-STEP-8j-NOTES.md`
- QA checklist: `docs/QA-CHECKLIST.md` — items 4, 11, 12