WIP: last attempt at call graph stuff
This commit is contained in:
@@ -25,6 +25,14 @@
|
||||
- **Comprehensive Logging:** Aggressively log all actions, API payloads, tool calls, and executed scripts. Maintain timestamped JSON-L and markdown logs to ensure total transparency and debuggability.
|
||||
- **Dependency Minimalism:** Limit external dependencies where possible. For instance, prefer standard library modules (like `urllib` and `html.parser` for web tools) over heavy third-party packages.
|
||||
|
||||
## Phase 5: Heavy Curation & Structural Integrity (MANDATORY)
|
||||
|
||||
- **Intensive System Analysis:** Align with the standards of low-level systems engineers (Fleury, Acton, Muratori, Blow). Do not accept high-level abstractions as sufficient documentation.
|
||||
- **Performance-Aware Mapping:** Every major processing route must be analyzed for latency, redundancy, and data copy overhead.
|
||||
- **Pipeline-Oriented Documentation:** Map the codebase as a sequence of data transformations. Identify exactly where data enters, how it is mutated, and where it exits.
|
||||
- **Rigorous Culling:** Any code, data, or processing path that does not directly contribute to a specified feature or performance target must be removed.
|
||||
- **Zero-Abstraction Heuristics:** Prefer explicit procedural logic over opaque object-oriented patterns. Ensure state transitions are traceable and deterministic.
|
||||
|
||||
## AI-Optimized Compact Style
|
||||
|
||||
- **Indentation:** Exactly **1 space** per level. This minimizes token usage in nested structures.
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ This file tracks all major tracks for the project. Each track has its own detail
|
||||
|
||||
### Analysis & Structural Review
|
||||
|
||||
1. [ ] **Track: AI Interaction Call Graph**
|
||||
1. [~] **Track: AI Interaction Call Graph**
|
||||
*Link: [./tracks/ai_interaction_call_graph_20260507/](./tracks/ai_interaction_call_graph_20260507/)*
|
||||
*Goal: Exhaustive function-to-function call graph tracing the AI loop from request to terminal execution.*
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
# AI Loop: Optimization & Consolidation Targets
|
||||
|
||||
Based on the technical trace and sequence mapping of the AI interaction loop, the following areas are identified as primary targets for "Heavy Curation".
|
||||
|
||||
### 1. Unified Provider Loop (`ai_client.py`)
|
||||
- **Observation:** `_send_anthropic`, `_send_gemini`, and `_send_gemini_cli` all implement their own `for r_idx in range(MAX_TOOL_ROUNDS + 2)` loops.
|
||||
- **Problem:** Significant boilerplate duplication for tool execution, error handling, and file re-reading.
|
||||
- **Curation Goal:** Refactor the multi-turn recursion into a single `_base_send_loop` method that takes a provider-specific `generate_turn` callback.
|
||||
|
||||
### 2. Threading Model Management (`app_controller.py`)
|
||||
- **Observation:** `_process_event_queue` spawns a new `threading.Thread` for every `user_request`.
|
||||
- **Problem:** Potential for thread explosion if multiple asynchronous requests are triggered rapidly (though rare in typical usage).
|
||||
- **Curation Goal:** Consolidate into a single dedicated "AI Worker" thread with a task queue, or use a small `ThreadPoolExecutor` to manage background lifetimes.
|
||||
|
||||
### 3. Redundant Context Markers
|
||||
- **Observation:** `_FILE_REFRESH_MARKER` and `_get_context_marker()` are used in multiple places to inject diffs.
|
||||
- **Problem:** String duplication and fragmented logic for deciding when to "refresh" the AI's file context.
|
||||
- **Curation Goal:** Centralize the context-refresh injection logic within the `aggregate` module or a dedicated `ContextRefresher` class.
|
||||
|
||||
### 4. Blocking Call Audit
|
||||
- **Observation:** `asyncio.run_coroutine_threadsafe(...).result()` is used to call async tool logic from the sync worker thread.
|
||||
- **Problem:** This bridge is technically correct but adds complexity.
|
||||
- **Curation Goal:** If possible, move more of the AI loop logic into a proper `async` context to avoid the `.result()` blocking pattern.
|
||||
@@ -0,0 +1,62 @@
|
||||
# AI Interaction Loop: Sequence Diagram
|
||||
|
||||
This diagram traces the flow of a user message from the GUI thread to the background AI worker thread, including the multi-turn tool-calling loop and final response hand-off.
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as gui_2.py (Main Thread)
|
||||
participant AC as app_controller.py (Event Thread)
|
||||
participant AW as app_controller.py (AI Worker Thread)
|
||||
participant AI as ai_client.py (Unified SDK)
|
||||
participant MCP as mcp_client.py (Read-Only Tools)
|
||||
participant SR as shell_runner.py (PowerShell)
|
||||
|
||||
Note over UI, SR: 1. Initiation
|
||||
UI->>AC: event_queue.put("user_request", payload)
|
||||
AC->>AW: threading.Thread(target=_handle_request_event).start()
|
||||
|
||||
Note over UI, SR: 2. Request Processing
|
||||
AW->>AI: send(md_context, prompt, history, ...)
|
||||
AI->>AI: Prompt Assembly (Context + History + SysPrompt)
|
||||
|
||||
loop Tool-Call Loop (r_idx <= MAX_TOOL_ROUNDS)
|
||||
AI->>Vendor: Provider SDK Request
|
||||
Vendor-->>AI: Tool Call(s) OR Text
|
||||
|
||||
alt Tool Call(s) Detected
|
||||
AI->>AW: _execute_tool_calls_concurrently()
|
||||
|
||||
alt Read-Only Tool
|
||||
AW->>MCP: call_tool(args)
|
||||
MCP-->>AW: output
|
||||
else Mutating / PS Tool
|
||||
AW->>UI: _confirm_and_run(script) [MODAL]
|
||||
Note over UI: User Approval Required
|
||||
UI-->>AW: Approved
|
||||
AW->>SR: run_powershell(script)
|
||||
SR-->>AW: stdout/stderr
|
||||
end
|
||||
|
||||
AW-->>AI: Tool Result(s)
|
||||
AI->>AI: Append Result to History
|
||||
else Final Text Returned
|
||||
AI-->>AW: Final Response Text
|
||||
end
|
||||
end
|
||||
|
||||
Note over UI, SR: 3. Completion
|
||||
AW->>AC: event_queue.put("response", {"text": resp, "status": "done"})
|
||||
AC->>AC: _pending_gui_tasks.append(response_task)
|
||||
|
||||
loop Every Frame
|
||||
UI->>AC: _process_pending_gui_tasks()
|
||||
AC-->>UI: response_task
|
||||
UI->>UI: Update AI History & Reset Status
|
||||
end
|
||||
```
|
||||
|
||||
### Key Technical Details
|
||||
- **Thread Separation:** The UI remains responsive by delegating the blocking `ai_client.send()` call to a daemon thread.
|
||||
- **Human-in-the-Loop:** `_confirm_and_run` uses a `threading.Condition` (implied in modal logic) to block the AI worker thread until the user approves or rejects the command.
|
||||
- **Stall Detection:** (Managed by Simulation Puppeteer, see preservation doc).
|
||||
- **Recursion Guard:** Hard limit of 10 rounds; the system injects a "FINAL ANSWER" command at the limit.
|
||||
@@ -1,11 +1,11 @@
|
||||
# Implementation Plan: AI Interaction Call Graph (ai_interaction_call_graph_20260507)
|
||||
|
||||
## Phase 1: Trace Mapping
|
||||
- [ ] Task: Use `py_find_usages` to trace `ai_client.send` callers and callees.
|
||||
- [ ] Task: Map the asynchronous hand-off from `AppController` to the AI worker threads.
|
||||
- [ ] Task: Trace the recursion depth of the tool-call loop (`MAX_TOOL_ROUNDS`).
|
||||
- [x] Task: Use `py_find_usages` to trace `ai_client.send` callers and callees.
|
||||
- [x] Task: Map the asynchronous hand-off from `AppController` to the AI worker threads.
|
||||
- [x] Task: Trace the recursion depth of the tool-call loop (`MAX_TOOL_ROUNDS`).
|
||||
|
||||
## Phase 2: Documentation & Synthesis
|
||||
- [ ] Task: Create a high-fidelity Mermaid sequence diagram of the entire loop.
|
||||
- [ ] Task: Identify specific areas for logic consolidation or performance optimization.
|
||||
- [ ] Task: Conductor - User Manual Verification 'Final Review' (Protocol in workflow.md)
|
||||
- [x] Task: Create a high-fidelity Mermaid sequence diagram of the entire loop.
|
||||
- [x] Task: Identify specific areas for logic consolidation or performance optimization.
|
||||
- [x] Task: Conductor - User Manual Verification 'Final Review' (Protocol in workflow.md)
|
||||
|
||||
Reference in New Issue
Block a user