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

6.5 KiB
Raw Blame History

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:

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.rsInput::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 test63 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)