testing
This commit is contained in:
@@ -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 3–8e:
|
||||
|
||||
- **`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)
|
||||
Reference in New Issue
Block a user