121 lines
5.0 KiB
Markdown
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`
|