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

121 lines
5.0 KiB
Markdown

# Phase 1 Step 8m — Implementation Notes
## Status
Done (partial — reduced GlobalConfig usage by 33%, cannot fully
eliminate due to Input/eval_tool_calls/client chain dependency).
## Plan reference
- Plan: `docs/PHASE-1-IMPLEMENTATION-PLAN.md`
- Section: "Step 8m: REPL cleanup — eliminate `GlobalConfig` from REPL"
## Summary
Migrated 49 `config` references in `src/repl/mod.rs` to use
`RequestContext` or `AppConfig` equivalents. The REPL's `config`
reference count dropped from 148 to 99. Key changes: vault
operations via `ctx.app.vault`, `.exit role/session/agent` via
`ctx.*` methods + `ctx.bootstrap_tools`, session/agent info via
`ctx.*`, authentication via `ctx.app.config.*`, and various
`config.read()``ctx.*` replacements.
Also marked 7 additional `Config` methods as `#[allow(dead_code)]`
that became dead after the REPL stopped calling them.
## What was changed
### Files modified (2 files)
- **`src/repl/mod.rs`** — bulk migration of command handlers:
- Vault: `config.read().vault.*``ctx.app.vault.*` (5 operations)
- `.exit role`: MCP registry reinit → `ctx.exit_role()` + `ctx.bootstrap_tools()`
- `.exit session` (standalone and within agent): → `ctx.exit_session()`
- `.exit agent`: MCP registry reinit → `ctx.exit_agent(&app)` + `ctx.bootstrap_tools()`
- `.info session`: `config.read().session_info()``ctx.session_info()`
- `.info agent` / `.starter` / `.edit agent-config`: `config.read().agent_*``ctx.*`
- `.authenticate`: `config.read().current_model()``ctx.current_model()`
- `.edit role`: via `ctx.edit_role()`
- `.edit macro` guard: `config.read().macro_flag``ctx.macro_flag`
- Compression checks: `config.read().is_compressing_session()``ctx.is_compressing_session()`
- Light theme: `config.read().light_theme()``ctx.app.config.light_theme()`
- Various sync call reductions
- **`src/config/mod.rs`** — 7 methods marked `#[allow(dead_code)]`:
`exit_role`, `session_info`, `exit_session`, `is_compressing_session`,
`agent_banner`, `exit_agent`, `exit_agent_session`
## Remaining GlobalConfig usage in REPL (99 references)
These CANNOT be migrated until the client chain is migrated:
| Category | Count (approx) | Why |
|---|---|---|
| `Input::from_str(config, ...)` | ~10 | Input holds GlobalConfig for create_client |
| `ask(config, ctx, ...)` | ~10 | Passes config to Input construction |
| `Config::compress_session(config)` | 2 | Creates Input internally |
| `Config::maybe_compress_session` | 2 | Spawns task with GlobalConfig |
| `Config::maybe_autoname_session` | 2 | Spawns task with GlobalConfig |
| `Config::update(config, ...)` | 1 | Complex dispatcher, reads/writes config |
| `Config::delete(config, ...)` | 1 | Reads/writes config |
| `macro_execute(config, ...)` | 1 | Calls run_repl_command |
| `init_client(config, ...)` | 1 | Client needs GlobalConfig |
| `sync_ctx_to_config` / `sync_config_to_ctx` | ~15 | Bridge sync helpers |
| Reedline init (`ReplCompleter`, `ReplPrompt`) | ~5 | Trait objects hold GlobalConfig |
| `config.write().save_role/new_role/new_macro` | ~5 | Config file mutations |
| `config.write().edit_session/edit_config` | ~3 | Editor operations |
| Struct field + constructor | ~5 | `Repl { config }` |
## Key decisions
### 1. `.exit *` handlers use ctx methods + bootstrap_tools
Instead of the MCP registry take/reinit pattern, the exit handlers
now call `ctx.exit_role()` / `ctx.exit_session()` / `ctx.exit_agent(&app)`
followed by `ctx.bootstrap_tools(&app, true).await?` to rebuild the
tool scope with the global MCP server set. Then `sync_ctx_to_config`
updates the GlobalConfig for reedline/Input.
### 2. Cannot remove Repl's config field
The `config: GlobalConfig` field stays because `ask`, `Input::from_str`,
`init_client`, `Config::compress_session`, `Config::maybe_*`, and
reedline components all need it. Full removal requires migrating the
client chain.
## Verification
- `cargo check` — clean, zero warnings
- `cargo clippy` — clean
- `cargo test` — 63 passed, 0 failed
## Phase 1 completion assessment
With Step 8m done, Phase 1's Step 8 sub-steps (8a through 8m) are
all complete. The GlobalConfig is significantly reduced but not
eliminated. The remaining dependency is the **client chain**:
```
Input.config: GlobalConfig
→ create_client() → init_client(&GlobalConfig)
→ Client.global_config: GlobalConfig
→ eval_tool_calls(&GlobalConfig)
→ ToolCall::eval(&GlobalConfig)
→ all tool handlers take &GlobalConfig
```
Eliminating this chain requires:
1. Migrating `init_client` to `&AppConfig` + `&[ClientConfig]`
2. Changing every client struct from `GlobalConfig` to `AppConfig`
3. Migrating `eval_tool_calls` to `&AppConfig` + `&mut RequestContext`
4. Migrating all tool handlers similarly
This is a Phase 2 concern or a dedicated "client chain migration"
effort.
## References
- Phase 1 plan: `docs/PHASE-1-IMPLEMENTATION-PLAN.md` — Step 8m
- Step 8l notes: `docs/implementation/PHASE-1-STEP-8l-NOTES.md`
- QA checklist: `docs/QA-CHECKLIST.md`