Files
kami 9734eec63c docs: add module documentation in AsciiDoc with PlantUML diagrams
Generated by per-group subagents covering all 52 modules across:
core (18), infrastructure (10), apps (5), interfaces (3),
plugins (7), testing (9)

Documentation format:
- AsciiDoc (.adoc) files in docs/modules/<group>/
- PlantUML (.puml) files in docs/diagrams/
- .adoc files reference diagrams via include:: directives

Each doc covers: purpose, responsibilities, non-responsibilities,
key types, event flow, integration points, invariants, PlantUML
diagram, known issues, and open questions.
2026-05-26 16:59:21 +04:00

99 lines
4.5 KiB
Plaintext

= infra-tools
== purpose
Provides the concrete tool execution infrastructure: a sandboxed executor that wraps tool calls with file backup/restore, diff computation, and event emission; a dispatching executor that routes tool requests to registered tools; a default tool registry; a shell command tool; and a tool configuration system that maps config to enabled tool instances.
== responsibilities
* Wrap tool execution with sandbox directory management and file backup/restore
* Compute unified diffs for file-affecting tool results
* Emit `ToolExecutionStartedEvent`, `ToolExecutionCompletedEvent`, and `ToolExecutionFailedEvent`
* Dispatch tool requests by name to registered tool implementations
* Register tools by name via `DefaultToolRegistry`
* Execute shell commands with timeout, stdout/stderr capture, and executable allowlisting
* Convert `ToolConfig` to a list of `Tool` implementations via `buildTools()`
== non-responsibilities
* Does not define tool contracts — that belongs to `core:tools`
* Does not implement filesystem tools — that belongs to `infra:tools:filesystem`
* Does not enforce approval gating — that belongs to `core:approvals`
* Does not perform workflow-level tool routing
== key types
=== SandboxedToolExecutor
* **kind**: class
* **purpose**: Decorator around a `ToolExecutor` that handles per-invocation working directories, file backup/restore for file-affecting tools, diff computation, and event emission. Operates on `Dispatchers.IO`.
* **fields**: `delegate` (inner executor), `registry`, `eventDispatcher`, `workDir` (default `/tmp/correx-sandbox`)
=== DispatchingToolExecutor
* **kind**: class
* **purpose**: Routes a `ToolRequest` to the appropriate `ToolExecutor` by resolving the tool name from a `ToolRegistry`.
=== DefaultToolRegistry
* **kind**: class
* **purpose**: Simple map-based `ToolRegistry` built from a vararg or list of `Tool` instances. Keyed by `tool.name`.
=== ShellTool
* **kind**: class
* **purpose**: Implements both `Tool` and `ToolExecutor` for shell command execution. Supports executable allowlisting, configurable timeout (default 30s), and working directory. Validates that `argv` is non-empty and the executable is allowed. Tier T2.
* **fields**: `allowedExecutables`, `timeoutMs` (default 30000), `workingDir`
=== DiffUtil
* **kind**: object
* **purpose**: Computes unified-diff strings from old and new file contents using LCS-based edit detection. Used by `SandboxedToolExecutor` to record changes in tool receipts.
=== ToolConfig
* **kind**: data class
* **purpose**: Configuration structure for enabling and parameterizing tools. Contains sub-configs for shell, file_read, file_write, and file_edit tools.
* **fields**: `shell`, `fileRead`, `fileWrite`, `fileEdit`
=== ToolConfig.buildTools()
* **kind**: extension function
* **purpose**: Converts a `ToolConfig` into a `List<Tool>` by creating instances for each enabled sub-config.
== event flow
*Inbound:* `ToolRequest` (from core tools layer)
*Outbound:*
* `ToolExecutionStartedEvent` — emitted before delegate execution begins
* `ToolExecutionCompletedEvent` — includes `ToolReceipt` with exit code, output, metadata, affected entities, duration, tier, and diff
* `ToolExecutionFailedEvent` — emitted on execution failure
== integration points
* `core:events` — `ToolExecutionStartedEvent`, `ToolExecutionCompletedEvent`, `ToolExecutionFailedEvent`, `ToolReceipt`, `ToolRequest`, `ToolInvocationId`, `SessionId`
* `core:tools` — `Tool`, `ToolExecutor`, `ToolResult`, `FileAffectingTool`, `ToolRegistry`, `ToolCapability`, `ValidationResult`
* `core:approvals` — `Tier`
* `infra:tools:filesystem` — `FileReadTool`, `FileWriteTool`, `FileEditTool`
== invariants
* `SandboxedToolExecutor` computes `affectedPaths` once (before delegate execution) to avoid double-invocation divergence
* File backup is performed before delegate execution; on failure, originals are restored; on success, backups are deleted
* `ShellTool` rejects executables not in the allowed set with `ValidationResult.Invalid`
* All tools default to `enabled = false` in configuration
== PlantUML diagram
[plantuml, infra-tools, "png"]
----
include::../../diagrams/infra-tools.puml[]
----
== known issues
* `SandboxedToolExecutor` cleanup (`cleanWorkingDir`, `restoreOrClean`) is best-effort and may leave files on IO errors
* `FileEditTool.patch()` spawns an external `patch` process — not a pure-Kotlin implementation
== open questions
* Should `SandboxedToolExecutor` support configurable sandbox root resolution?
* Should tool timeout be configurable per-tool-type rather than per-call?