This commit is contained in:
2026-04-15 12:56:00 -06:00
parent ff3419a714
commit 63b6678e73
82 changed files with 14800 additions and 3310 deletions
@@ -0,0 +1,175 @@
# Phase 1 Step 8e — Implementation Notes
## Status
Done (partial — 3 of 8 methods migrated, 5 deferred).
## Plan reference
- Plan: `docs/PHASE-1-IMPLEMENTATION-PLAN.md`
- Section: "Step 8e: RAG lifecycle + session compression +
`apply_prelude`"
## Summary
Migrated 3 of the 8 planned Category C deferrals from Step 6.
The other 5 methods are blocked on `Input::from_str` and/or
`Rag::init`/`Rag::load`/`Rag::refresh_document_paths` still
taking `&GlobalConfig`. Those are Step 8h migration targets.
## What was changed
### Files modified (1 file)
- **`src/config/request_context.rs`** — added 3 methods in a new
impl block:
- `apply_prelude(&mut self, app: &AppConfig, abort_signal) ->
Result<()>` — reads `app.repl_prelude` or `app.cmd_prelude`
based on `self.working_mode`, parses the `type:name` format,
calls `self.use_role(app, ...)` or `self.use_session(app, ...)`
from Step 8d. Verbatim logic from `Config::apply_prelude`
except it reads prelude from `app.*` instead of `self.*`.
- `maybe_compress_session(&mut self, app: &AppConfig) -> bool` —
checks `session.needs_compression(app.compression_threshold)`,
sets `session.set_compressing(true)`, returns `true` if
compression is needed. The caller is responsible for spawning
the actual compression task and printing the status message.
This is the semantic change from the plan: the original
`Config::maybe_compress_session(GlobalConfig)` spawned a
`tokio::spawn` internally; the new method returns a bool and
leaves task spawning to the caller.
- `maybe_autoname_session(&mut self) -> bool` — checks
`session.need_autoname()`, sets `session.set_autonaming(true)`,
returns `true`. Same caller-responsibility pattern as
`maybe_compress_session`.
## Key decisions
### 1. `maybe_*` methods return bool instead of spawning tasks
The plan explicitly called for this: "the new
`RequestContext::maybe_compress_session` returns a bool; callers
that want async compression spawn the task themselves." This makes
the methods pure state transitions with no side effects beyond
setting the compressing/autonaming flags.
The callers (Step 8f's `main.rs`, Step 8g's `repl/mod.rs`) will
compose the bool with task spawning:
```rust
if ctx.maybe_compress_session(app) {
let color = if app.light_theme() { LightGray } else { DarkGray };
print!("\n📢 {}\n", color.italic().paint("Compressing the session."));
tokio::spawn(async move { ... });
}
```
### 2. `maybe_autoname_session` takes no `app` parameter
Unlike `maybe_compress_session` which reads
`app.compression_threshold`, `maybe_autoname_session` only checks
`session.need_autoname()` which is a session-internal flag. No
`AppConfig` data needed.
### 3. Five methods deferred to Step 8h
| Method | Blocking dependency |
|---|---|
| `compress_session` | `Input::from_str(&GlobalConfig, ...)` |
| `autoname_session` | `Input::from_str(&GlobalConfig, ...)` + `Config::retrieve_role` |
| `use_rag` | `Rag::init(&GlobalConfig, ...)`, `Rag::load(&GlobalConfig, ...)` |
| `edit_rag_docs` | `rag.refresh_document_paths(..., &GlobalConfig, ...)` |
| `rebuild_rag` | `rag.refresh_document_paths(..., &GlobalConfig, ...)` |
All 5 are blocked on the same root cause: `Input` and `Rag` types
still take `&GlobalConfig`. These types are listed under Step 8h in
the plan's "Callsite Migration Summary" table:
- `config/input.rs` — `Input::from_str`, `from_files`,
`from_files_with_spinner` → Step 8h
- `rag/mod.rs` — RAG init, load, search → Step 8e (lifecycle) +
Step 8h (remaining)
The plan's Step 8e description assumed these would be migrated as
part of 8e, but the actual dependency chain makes them 8h work.
The `RagCache` scaffolding from Step 6.5 doesn't have a working
`load` method yet — it needs `Rag::load` to be migrated first.
### 4. `apply_prelude` calls Step 8d's `use_role`/`use_session`
This is the first method to call other `RequestContext` async
methods (Step 8d's scope transitions). It demonstrates that the
layering works: Step 8d methods are called by Step 8e methods,
which will be called by Step 8f/8g entry points.
## Deviations from plan
| Deviation | Rationale |
|---|---|
| 5 methods deferred to Step 8h | `Input`/`Rag` still take `&GlobalConfig` |
| `RagCache::load` not wired | `Rag::load(&GlobalConfig)` blocks it |
| No `compress_session` or `autoname_session` | Require `Input::from_str` migration |
The plan's description of Step 8e included all 8 methods. In
practice, the `Input`/`Rag` dependency chain means only the
"check + flag" methods (`maybe_*`) and the "compose existing
methods" method (`apply_prelude`) can migrate now. The actual
LLM-calling methods (`compress_session`, `autoname_session`) and
RAG lifecycle methods (`use_rag`, `edit_rag_docs`, `rebuild_rag`)
must wait for Step 8h.
## Verification
### Compilation
- `cargo check` — clean, zero warnings, zero errors
- `cargo clippy` — clean
### Tests
- `cargo test` — **63 passed, 0 failed** (unchanged)
## Handoff to next step
### What Step 8f can rely on
All methods accumulated through Steps 38e:
- **`AppConfig`**: 21 methods
- **`RequestContext`**: 56 methods (53 from 8d + 3 from 8e)
- **`Session`**: 2 ctx-compatible constructors
- **`AppState`**: `mcp_config`, `mcp_log_path`, `mcp_factory`,
`rag_cache`, `vault`
- **`McpFactory`**: `acquire()` working
- **`paths`**: 33 free functions
- **Step 6.5 types**: `ToolScope`, `McpRuntime`, `AgentRuntime`,
`RagCache`, `RagKey`, `McpServerKey`
### Step 8e deferred methods that Step 8h must handle
| Method | What 8h needs to do |
|---|---|
| `compress_session` | Migrate `Input::from_str` to take `&AppConfig` + `&RequestContext`, then port `compress_session` |
| `autoname_session` | Same + uses `retrieve_role(CREATE_TITLE_ROLE)` which already exists on ctx (8b) |
| `use_rag` | Migrate `Rag::init`/`Rag::load`/`Rag::create` to take `&AppConfig`, wire `RagCache::load` |
| `edit_rag_docs` | Migrate `Rag::refresh_document_paths` to take `&AppConfig` |
| `rebuild_rag` | Same as `edit_rag_docs` |
### Files to re-read at the start of Step 8f
- `docs/PHASE-1-IMPLEMENTATION-PLAN.md` — Step 8f section
- This notes file
- `src/main.rs` — full file (entry point to rewrite)
- Step 8d notes — `use_role`, `use_session` signatures
## References
- Phase 1 plan: `docs/PHASE-1-IMPLEMENTATION-PLAN.md`
- Step 8d notes: `docs/implementation/PHASE-1-STEP-8d-NOTES.md`
- Step 6 notes: `docs/implementation/PHASE-1-STEP-6-NOTES.md`
(Category C deferral list)
- Modified files:
- `src/config/request_context.rs` (3 new methods)