Ctrl K
ComunidadGuías…

plans/2025-04-11-tool-call-context-implementation.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Tool Call Context Implementation

## Objective

Add a required `ToolCallContext` parameter to the `ExecutableTool` trait's `call` method. This will allow for additional context to be passed to tool implementations at runtime, maintaining an extensible structure for future needs while initially keeping the context empty.

## Implementation Plan


1. Define the `ToolCallContext` struct in the domain layer
   Priority: High
   Complexity: Low
   Dependencies: None

   Create a new struct in `forge_domain` (likely in a new file `tool_call_context.rs`) to represent the context passed to tool calls. Initially, this will be an empty struct with the infrastructure in place for future extension.
2. Create a helper function for test contexts
   Priority: High
   Complexity: Low
   Dependencies: Step 1

   Create a function to easily generate a default test context, such as `ToolCallContext::for_tests()`. This will make it simpler to update test code.
3. Update the `ExecutableTool` trait definition
   Priority: High
   Complexity: Low
   Dependencies: Step 1

   Modify the trait definition in `crates/forge_domain/src/tool_definition.rs` to add the `ToolCallContext` parameter to the `call` method.
4. Modify the `JsonTool` adapter in `forge_domain/src/tool.rs`
   Priority: High
   Complexity: Low
   Dependencies: Step 3

   Update the `JsonTool` adapter to pass the `ToolCallContext` to the wrapped tool's `call` method.
5. Modify the `ToolService` implementation
   Priority: High
   Complexity: Medium
   Dependencies: Step 3

   Update `crates/forge_services/src/tool_service.rs` to create and pass a `ToolCallContext` when calling tools.
6. Update all tool implementations
   Priority: High
   Complexity: High
   Dependencies: Step 3

   Update all implementations of `ExecutableTool` across the codebase to accept the new `ToolCallContext` parameter:
   * Shell tool (`crates/forge_services/src/tools/shell/shell_tool.rs`)
   * Show user tool (`crates/forge_services/src/tools/show_user.rs`)
   * File system tools (in `crates/forge_services/src/tools/fs/`)
   * Patch tools (in `crates/forge_services/src/tools/patch/`)
   * Fetch tool (`crates/forge_services/src/tools/fetch.rs`)
   * Other tools discovered during implementation
7. Update test implementations with a systematic approach
   Priority: High
   Complexity: High
   Dependencies: Steps 2, 6

   Based on the analysis, there are numerous tests that implement `ExecutableTool`. Adopt the following systematic approach:

   a. Create a test utility module with helper functions for creating test contexts
   b. Update mock tool implementations in test modules:
   * `SuccessTool` and `FailureTool` in `tool_service.rs`
   * Test tools in filesystem modules
   * Test tools in patch modules
   * Any other mock implementations in test code
     c. Update test invocations to pass the context parameter
     d. Add context parameters to all test function calls
8. Incremental compilation verification
   Priority: Medium
   Complexity: Medium
   Dependencies: Steps 3-7

   Periodically run cargo check after updating each major component or group of related files to catch compilation errors early.
9. Final verification and testing
   Priority: High
   Complexity: Low
   Dependencies: All previous steps

   Run full test suite to verify that all code compiles and tests pass:

   ```
   cargo insta test --accept --unreferenced=delete
   cargo +nightly fmt --all
   cargo +nightly clippy --fix --allow-staged --allow-dirty --workspace
   ```

## Verification Criteria

* The `ExecutableTool` trait includes `ToolCallContext` as a parameter in its `call` method
* All implementations of `ExecutableTool` accept and handle the new parameter
* All tests are updated and pass successfully
* The codebase compiles with no warnings or errors
* Existing functionality continues to work as expected

## Potential Risks and Mitigations

* Risk 1: Large number of implementations to update (13+ files identified)
  Mitigation: Use systematic approach with clear test helper functions and incremental verification
* Risk 2: Hidden implementations in macros or nested structures
  Mitigation: Careful grep searches and systematic compiler error resolution
* Risk 3: Breaking changes to API contract
  Mitigation: Since this is a required parameter, ensure thorough testing after updates
* Risk 4: Missing test implementations leading to test failures
  Mitigation: Develop helper functions for tests and use incremental compilation

## Alternative Approaches


1. Make `ToolCallContext` optional with a default: Could reduce the impact but wouldn't align with the requirement for it to be required.
2. Use a trait object approach: Pass context as a trait object to allow for different context types, but this adds complexity and doesn't match the requirement for a specific struct.
3. Thread-local context: Store context in a thread-local variable, but this approach is less explicit and could cause issues with async code.
4. Implement in stages with feature flags: Could help manage the transition but adds complexity and doesn't align with the requirement for a cohesive implementation.