go-ai/docs/tools.md

1448 lines
44 KiB
Markdown
Raw Normal View History

# go-ai MCP Tool Reference
**Module**: `forge.lthn.ai/core/go-ai`
This document is the authoritative reference for every MCP tool exposed by the go-ai hub. It is generated from the source definitions in `mcp/` and `mcp/ide/`.
---
## Overview
go-ai exposes **49 tools** across 13 functional groups via the [Model Context Protocol](https://modelcontextprotocol.io/). The server can be started in two modes:
- **Stdio** (default): `core mcp serve` — standard MCP transport for use with Claude, Cursor, and other MCP clients.
- **TCP**: `MCP_ADDR=:9000 core mcp serve` — listens on a TCP socket for programmatic access.
### Registration model
Tools are registered in two tiers:
1. **Built-in tools** (registered unconditionally in `mcp.New()`): file operations, directory operations, language detection, RAG, metrics, and webview tools. These are always present regardless of configuration.
2. **Subsystem tools** (registered via `WithSubsystem()`): ML, process management, WebSocket, and IDE tools. These require the corresponding backend service to be provided via an `Option` at construction time. Process and WebSocket tools are silently omitted if their respective services are not supplied. IDE tools are provided by the `ide.Subsystem` subsystem.
### Workspace sandboxing
All file and directory tools operate within a sandboxed filesystem medium. By default the sandbox root is the current working directory at the time `mcp.New()` is called. The root can be changed with `WithWorkspaceRoot(path)`. All paths supplied to file tools are validated to remain within this root — path traversal attempts are rejected.
### Audit logging
Every tool execution is logged. Tools that perform writes, process control, or browser automation are logged at `Security` level. Read-only tools are logged at `Info` level.
---
## Tool Groups
| Group | Tools | File |
|---|---|---|
| File Operations | 6 | `mcp/mcp.go` |
| Directory Operations | 2 | `mcp/mcp.go` |
| Language Detection | 2 | `mcp/mcp.go` |
| RAG — Vector Search | 3 | `mcp/tools_rag.go` |
| ML — Inference & Scoring | 5 | `mcp/tools_ml.go` |
| Metrics | 2 | `mcp/tools_metrics.go` |
| Process Management | 6 | `mcp/tools_process.go` |
| WebSocket | 2 | `mcp/tools_ws.go` |
| Browser Automation | 10 | `mcp/tools_webview.go` |
| IDE Chat | 5 | `mcp/ide/tools_chat.go` |
| IDE Build | 3 | `mcp/ide/tools_build.go` |
| IDE Dashboard | 3 | `mcp/ide/tools_dashboard.go` |
---
## File Operations
Six tools for reading, writing, editing, renaming, deleting, and checking files. All paths are resolved relative to the configured workspace root and must not escape it.
---
### `file_read`
Read the contents of a file.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | `string` | `path` | Yes | Path to the file, relative to workspace root |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Content | `string` | `content` | Full file contents |
| Language | `string` | `language` | Detected language ID (see `lang_detect`) |
| Path | `string` | `path` | Echoed input path |
**Notes**
The language field is populated by extension-based detection and will be `"plaintext"` for unrecognised extensions. The call fails if the path does not exist or points outside the workspace root.
---
### `file_write`
Write content to a file, creating it and any intermediate directories if they do not exist.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | `string` | `path` | Yes | Destination path, relative to workspace root |
| Content | `string` | `content` | Yes | Content to write |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | `bool` | `success` | Whether the write succeeded |
| Path | `string` | `path` | Echoed input path |
**Notes**
Overwrites any existing file at the given path without warning. Parent directories are created automatically. Logged at `Security` level.
---
### `file_edit`
Edit a file by replacing one occurrence (or all occurrences) of `old_string` with `new_string`. The file must already exist.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | `string` | `path` | Yes | Path to the file |
| OldString | `string` | `old_string` | Yes | Exact string to find; must not be empty |
| NewString | `string` | `new_string` | Yes | Replacement string (may be empty to delete) |
| ReplaceAll | `bool` | `replace_all` | No | Replace every occurrence; default is first only |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Path | `string` | `path` | Echoed input path |
| Success | `bool` | `success` | Whether the edit succeeded |
| Replacements | `int` | `replacements` | Number of occurrences replaced |
**Notes**
Returns an error if `old_string` is empty or is not found in the file. With `replace_all=false` (default) only the first occurrence is replaced and `replacements` will be `1`. With `replace_all=true` all occurrences are replaced and `replacements` reflects the total count.
---
### `file_delete`
Delete a file or empty directory.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | `string` | `path` | Yes | Path to delete |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | `bool` | `success` | Whether the deletion succeeded |
| Path | `string` | `path` | Echoed input path |
**Notes**
Non-empty directories are not deleted; use multiple calls or a process tool to remove them recursively. Logged at `Security` level.
---
### `file_rename`
Rename or move a file within the workspace.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| OldPath | `string` | `oldPath` | Yes | Current path |
| NewPath | `string` | `newPath` | Yes | Destination path |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | `bool` | `success` | Whether the rename succeeded |
| OldPath | `string` | `oldPath` | Echoed source path |
| NewPath | `string` | `newPath` | Echoed destination path |
**Notes**
Both paths must remain within the workspace root. Can be used to move files between subdirectories. Logged at `Security` level.
---
### `file_exists`
Check whether a path exists and whether it is a file or directory.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | `string` | `path` | Yes | Path to check |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Exists | `bool` | `exists` | Whether the path exists |
| IsDir | `bool` | `isDir` | Whether the path is a directory |
| Path | `string` | `path` | Echoed input path |
**Notes**
Returns `exists=false` for paths that do not exist or are inaccessible. Does not distinguish between a missing path and a permission error.
---
## Directory Operations
Two tools for listing and creating directories within the workspace.
---
### `dir_list`
List the contents of a directory.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | `string` | `path` | Yes | Directory path, relative to workspace root |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Entries | `[]DirectoryEntry` | `entries` | List of entries |
| Path | `string` | `path` | Echoed input path |
**DirectoryEntry fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Name | `string` | `name` | Entry name (filename only) |
| Path | `string` | `path` | Entry path (joined with input path) |
| IsDir | `bool` | `isDir` | Whether the entry is a directory |
| Size | `int64` | `size` | File size in bytes; 0 for directories |
**Notes**
Lists only the immediate children; not recursive. The `path` field in each entry preserves the relative form of the input path.
---
### `dir_create`
Create a new directory, including any necessary parent directories.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | `string` | `path` | Yes | Directory path to create |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | `bool` | `success` | Whether the directory was created |
| Path | `string` | `path` | Echoed input path |
**Notes**
Behaves like `mkdir -p`; does not fail if the directory already exists.
---
## Language Detection
Two tools for working with the built-in language registry.
---
### `lang_detect`
Detect the programming language of a file based on its extension or name.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | `string` | `path` | Yes | File path (the file need not exist; only the name is inspected) |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Language | `string` | `language` | Detected language ID |
| Path | `string` | `path` | Echoed input path |
**Notes**
Detection is purely extension-based. `Dockerfile` (exact name, no extension) is detected as `"dockerfile"`. Unknown extensions return `"plaintext"`.
---
### `lang_list`
Get the list of all supported programming languages.
**Parameters**
None.
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Languages | `[]LanguageInfo` | `languages` | All supported language entries |
**LanguageInfo fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | `string` | `id` | Language identifier used throughout the API |
| Name | `string` | `name` | Human-readable display name |
| Extensions | `[]string` | `extensions` | File extensions that map to this language |
**Supported languages**
`typescript`, `javascript`, `go`, `python`, `rust`, `java`, `php`, `ruby`, `html`, `css`, `json`, `yaml`, `markdown`, `sql`, `shell`
The full detection set (including `c`, `cpp`, `csharp`, `scss`, `xml`, `swift`, `kotlin`, `dockerfile`) is available via `lang_detect` but is not enumerated by `lang_list`.
---
## RAG — Vector Search
Three tools for semantic document retrieval and ingestion. These tools require:
- **Qdrant** running at `localhost:6334` (default gRPC port)
- **Ollama** running at `localhost:11434` for embedding generation
The default collection name is `hostuk-docs`.
---
### `rag_query`
Query the RAG vector database for relevant documentation. Returns semantically similar content based on the query.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Question | `string` | `question` | Yes | The natural-language query |
| Collection | `string` | `collection` | No | Collection name; default `hostuk-docs` |
| TopK | `int` | `topK` | No | Number of results to return; default `5` |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Results | `[]RAGQueryResult` | `results` | Ordered list of matching chunks |
| Query | `string` | `query` | Echoed question |
| Collection | `string` | `collection` | Collection used |
| Context | `string` | `context` | Pre-formatted context string suitable for injection into a prompt |
**RAGQueryResult fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Content | `string` | `content` | The chunk text |
| Source | `string` | `source` | Original source file or URL |
| Section | `string` | `section` | Section heading within the source (if available) |
| Category | `string` | `category` | Category tag (if available) |
| ChunkIndex | `int` | `chunkIndex` | Chunk position within the source document |
| Score | `float32` | `score` | Cosine similarity score |
**Notes**
Returns an error if `question` is empty. Results are ordered by descending similarity score. The `context` field is ready for direct use in a system prompt.
---
### `rag_ingest`
Ingest documents into the RAG vector database. Supports both single files and entire directories.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | `string` | `path` | Yes | File or directory path to ingest |
| Collection | `string` | `collection` | No | Target collection; default `hostuk-docs` |
| Recreate | `bool` | `recreate` | No | Drop and recreate the collection before ingestion |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | `bool` | `success` | Whether ingestion succeeded |
| Path | `string` | `path` | Echoed input path |
| Collection | `string` | `collection` | Collection used |
| Chunks | `int` | `chunks` | Number of chunks indexed (file only; `0` for directory) |
| Message | `string` | `message` | Human-readable summary |
**Notes**
The path is validated against the workspace medium (sandboxed). For directory ingestion the chunk count is not returned. Setting `recreate=true` destroys all existing vectors in the collection before ingesting. Logged at `Security` level.
---
### `rag_collections`
List all available collections in the Qdrant vector database.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| ShowStats | `bool` | `show_stats` | No | Include point count and status for each collection |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Collections | `[]CollectionInfo` | `collections` | List of collections |
**CollectionInfo fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Name | `string` | `name` | Collection name |
| PointsCount | `uint64` | `points_count` | Total vectors stored (only present when `show_stats=true`) |
| Status | `string` | `status` | Qdrant collection status (only present when `show_stats=true`) |
**Notes**
Opens a short-lived Qdrant client connection per call. Stats are fetched per-collection and failures for individual collections are logged and skipped rather than aborting the entire response.
---
## ML — Inference & Scoring
Five tools for text generation, response scoring, capability probing, pipeline status, and backend enumeration. These tools are provided by the `MLSubsystem` and require a configured `go-ml` service instance (`ml.Service`).
The generation path is: `go-ai``go-ml.Service.Generate``InferenceAdapter``inference.TextModel` (from `go-inference`).
---
### `ml_generate`
Generate text via a configured ML inference backend.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Prompt | `string` | `prompt` | Yes | The input prompt |
| Backend | `string` | `backend` | No | Backend name; uses service default if omitted |
| Model | `string` | `model` | No | Model override for backends that support multiple models |
| Temperature | `float64` | `temperature` | No | Sampling temperature |
| MaxTokens | `int` | `max_tokens` | No | Maximum tokens to generate |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Response | `string` | `response` | Generated text |
| Backend | `string` | `backend` | Backend used |
| Model | `string` | `model` | Model used (if applicable) |
**Notes**
Returns an error if `prompt` is empty. Backend selection falls through to the service default when `backend` is not specified. Available backends can be queried with `ml_backends`.
---
### `ml_score`
Score a prompt/response pair using one or more scoring suites.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Prompt | `string` | `prompt` | Yes | The original prompt |
| Response | `string` | `response` | Yes | The model response to evaluate |
| Suites | `string` | `suites` | No | Comma-separated suite names; default `heuristic` |
Available suites: `heuristic`, `semantic`
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Heuristic | `*ml.HeuristicScores` | `heuristic` | Length, structure, and format heuristics (present when requested) |
| Semantic | `*ml.SemanticScores` | `semantic` | LLM judge scores (present when requested) |
| Content | `*ml.ContentScores` | `content` | Content scores (not available via this tool; use `ml_probe`) |
**Notes**
`heuristic` scoring requires no backend. `semantic` scoring requires a judge backend to be configured in the ML service; the call returns an error if none is present. The `content` suite is not supported by this tool — use `ml_probe` instead. Both `prompt` and `response` must be non-empty.
---
### `ml_probe`
Run capability probes against an inference backend. Each probe sends a structured prompt to the backend and records the response.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Backend | `string` | `backend` | No | Backend name; uses service default if omitted |
| Categories | `string` | `categories` | No | Comma-separated category names to filter probes; all categories run if omitted |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Total | `int` | `total` | Number of probes executed |
| Results | `[]MLProbeResultItem` | `results` | Per-probe results |
**MLProbeResultItem fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | `string` | `id` | Probe identifier |
| Category | `string` | `category` | Probe category |
| Response | `string` | `response` | Backend response, or an error string prefixed with `"error: "` |
**Notes**
Probes are drawn from `ml.CapabilityProbes` defined in `go-ml`. Individual probe failures are captured as error strings in the response rather than aborting the entire run. Temperature is fixed at `0.7` and `MaxTokens` at `2048` for all probes.
---
### `ml_status`
Show training and generation progress from InfluxDB.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| InfluxURL | `string` | `influx_url` | No | InfluxDB URL; default `http://localhost:8086` |
| InfluxDB | `string` | `influx_db` | No | Database name; default `lem` |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Status | `string` | `status` | Formatted status report as a multi-line string |
**Notes**
Connects to InfluxDB on each call. Returns an error if the InfluxDB instance is unreachable.
---
### `ml_backends`
List available inference backends and their status.
**Parameters**
None.
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Backends | `[]MLBackendInfo` | `backends` | All registered backends |
| Default | `string` | `default` | Name of the default backend |
**MLBackendInfo fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Name | `string` | `name` | Backend identifier |
| Available | `bool` | `available` | Whether the backend is currently available |
**Notes**
Queries the `go-inference` global registry directly, bypassing `go-ml.Service`. This is the canonical source of truth for which backends are compiled in and available at runtime.
---
## Metrics
Two tools for recording and querying agent activity events. Events are stored in daily JSONL files on the local filesystem via the `go-ai/ai` package.
---
### `metrics_record`
Record a metrics event for AI or security tracking.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Type | `string` | `type` | Yes | Event type identifier |
| AgentID | `string` | `agent_id` | No | Agent identifier |
| Repo | `string` | `repo` | No | Repository name associated with the event |
| Data | `map[string]any` | `data` | No | Arbitrary additional event data |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | `bool` | `success` | Whether the event was recorded |
| Timestamp | `time.Time` | `timestamp` | Server-assigned event timestamp |
**Notes**
The timestamp is assigned by the server at the moment of recording; any timestamp in `data` is treated as user data only. Returns an error if `type` is empty.
---
### `metrics_query`
Query metrics events and get aggregated statistics by type, repository, and agent.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Since | `string` | `since` | No | Lookback window; default `7d` |
Supported duration formats: `Nd` (days), `Nh` (hours), `Nm` (minutes). Examples: `"7d"`, `"24h"`, `"30m"`.
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Total | `int` | `total` | Total events in window |
| ByType | `[]MetricCount` | `by_type` | Event counts grouped by type |
| ByRepo | `[]MetricCount` | `by_repo` | Event counts grouped by repository |
| ByAgent | `[]MetricCount` | `by_agent` | Event counts grouped by agent ID |
| Events | `[]MetricEventBrief` | `events` | The 10 most recent events, newest first |
**MetricCount fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Key | `string` | `key` | Group key (type name, repo name, or agent ID) |
| Count | `int` | `count` | Number of events in this group |
**MetricEventBrief fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Type | `string` | `type` | Event type |
| Timestamp | `time.Time` | `timestamp` | Event timestamp |
| AgentID | `string` | `agent_id` | Agent identifier (if set) |
| Repo | `string` | `repo` | Repository name (if set) |
**Notes**
Returns an error if the `since` value cannot be parsed. The duration unit must be a single character: `d`, `h`, or `m`. Durations must be positive integers.
---
## Process Management
Six tools for starting, stopping, and interacting with external processes. These tools are only registered when a `process.Service` instance is provided via `WithProcessService()` at construction time.
All process-control operations (`process_start`, `process_stop`, `process_kill`, `process_input`) are logged at `Security` level.
---
### `process_start`
Start a new external process. Returns a process ID for tracking.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Command | `string` | `command` | Yes | The executable to run |
| Args | `[]string` | `args` | No | Command-line arguments |
| Dir | `string` | `dir` | No | Working directory for the process |
| Env | `[]string` | `env` | No | Additional environment variables in `KEY=VALUE` format |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | `string` | `id` | Unique process identifier used in subsequent calls |
| PID | `int` | `pid` | Operating system process ID |
| Command | `string` | `command` | Echoed command |
| Args | `[]string` | `args` | Echoed arguments |
| StartedAt | `time.Time` | `startedAt` | Process start time |
**Notes**
Returns an error if `command` is empty. The process is managed by the `process.Service`; its output is captured and available via `process_output`.
---
### `process_stop`
Gracefully stop a running process by ID.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| ID | `string` | `id` | Yes | Process ID returned by `process_start` |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | `string` | `id` | Echoed process ID |
| Success | `bool` | `success` | Whether the stop signal was sent |
| Message | `string` | `message` | Status message |
**Notes**
The current implementation sends `SIGKILL`. A SIGTERM-first approach may be introduced in a future version. If the process does not respond, use `process_kill`.
---
### `process_kill`
Force kill a process by ID.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| ID | `string` | `id` | Yes | Process ID returned by `process_start` |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | `string` | `id` | Echoed process ID |
| Success | `bool` | `success` | Whether the kill succeeded |
| Message | `string` | `message` | Status message |
**Notes**
Sends an unconditional kill signal via `process.Service.Kill()`. Use when `process_stop` does not succeed within an acceptable time.
---
### `process_list`
List all managed processes.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| RunningOnly | `bool` | `running_only` | No | Return only actively running processes; default `false` |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Processes | `[]ProcessInfo` | `processes` | List of process records |
| Total | `int` | `total` | Number of records returned |
**ProcessInfo fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | `string` | `id` | Process identifier |
| Command | `string` | `command` | Executable name |
| Args | `[]string` | `args` | Arguments |
| Dir | `string` | `dir` | Working directory |
| Status | `string` | `status` | Process status string |
| PID | `int` | `pid` | OS process ID |
| ExitCode | `int` | `exitCode` | Exit code (meaningful only after termination) |
| StartedAt | `time.Time` | `startedAt` | Process start time |
| Duration | `time.Duration` | `duration` | Elapsed or total runtime |
---
### `process_output`
Get the captured stdout/stderr output of a process by ID.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| ID | `string` | `id` | Yes | Process ID |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | `string` | `id` | Echoed process ID |
| Output | `string` | `output` | Captured output as a single string |
**Notes**
Output is buffered by `process.Service`. For streaming output in real time, connect a WebSocket subscriber via `ws_start` and subscribe to the process channel.
---
### `process_input`
Send text to the stdin of a running process.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| ID | `string` | `id` | Yes | Process ID |
| Input | `string` | `input` | Yes | Text to write to stdin |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | `string` | `id` | Echoed process ID |
| Success | `bool` | `success` | Whether the input was delivered |
| Message | `string` | `message` | Status message |
**Notes**
Returns an error if the process is not found or if `input` is empty. Does not append a newline automatically; include `"\n"` in `input` if required.
---
## WebSocket
Two tools for starting and inspecting the WebSocket hub used for real-time process output streaming. These tools are only registered when a `ws.Hub` instance is provided via `WithWSHub()` at construction time.
The WebSocket endpoint is served at `/ws` on the configured address.
---
### `ws_start`
Start the WebSocket server for real-time process output streaming.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Addr | `string` | `addr` | No | Listen address in `host:port` format; default `":8080"` |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | `bool` | `success` | Whether the server started (or was already running) |
| Addr | `string` | `addr` | Actual address the server is bound to |
| Message | `string` | `message` | Status message including the full WebSocket URL |
**Notes**
If the server is already running, returns the existing address without error. The WebSocket URL takes the form `ws://<addr>/ws`. Logged at `Security` level because it opens a network listener.
---
### `ws_info`
Get WebSocket hub statistics.
**Parameters**
None.
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Clients | `int` | `clients` | Number of currently connected WebSocket clients |
| Channels | `int` | `channels` | Number of active subscription channels |
---
## Browser Automation
Ten tools for controlling a Chrome browser via the Chrome DevTools Protocol (CDP). All browser tools share a single global `webview.Webview` instance; `webview_connect` must be called before any other browser tool in a session.
**Prerequisite**: start Chrome with remote debugging enabled:
```
google-chrome --remote-debugging-port=9222
```
`webview_connect`, `webview_eval`, and `webview_navigate` are logged at `Security` level due to their capability to exfiltrate data or execute arbitrary code.
---
### `webview_connect`
Connect to a running Chrome instance via the Chrome DevTools Protocol.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| DebugURL | `string` | `debug_url` | Yes | Chrome DevTools URL, e.g. `http://localhost:9222` |
| Timeout | `int` | `timeout` | No | Default operation timeout in seconds; default `30` |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | `bool` | `success` | Whether the connection was established |
| Message | `string` | `message` | Status message |
**Notes**
Closes any existing connection before establishing a new one. Returns an error if `debug_url` is empty or if Chrome is not reachable at the given address.
---
### `webview_disconnect`
Disconnect from Chrome DevTools and release the connection.
**Parameters**
None.
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | `bool` | `success` | Whether the disconnection succeeded |
| Message | `string` | `message` | Status message |
**Notes**
Returns `success=true` with message `"No active connection"` if no connection was open. Safe to call multiple times.
---
### `webview_navigate`
Navigate the browser to a URL.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| URL | `string` | `url` | Yes | Fully qualified URL to navigate to |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | `bool` | `success` | Whether navigation was initiated |
| URL | `string` | `url` | Echoed URL |
**Notes**
Returns an error if not connected. Navigation is initiated but this tool does not wait for the page to finish loading; use `webview_wait` to synchronise on a page element after navigation.
---
### `webview_click`
Click on an element identified by a CSS selector.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Selector | `string` | `selector` | Yes | CSS selector for the target element |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | `bool` | `success` | Whether the click was performed |
**Notes**
Returns an error if not connected or if `selector` is empty. The selector must match at least one element; the first match is clicked.
---
### `webview_type`
Type text into an element identified by a CSS selector.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Selector | `string` | `selector` | Yes | CSS selector for the target element |
| Text | `string` | `text` | Yes | Text to type into the element |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | `bool` | `success` | Whether the text was typed |
**Notes**
Returns an error if not connected or if `selector` is empty. Appends to any existing content in the element rather than replacing it; clear the field first if a fresh value is required.
---
### `webview_query`
Query DOM elements by CSS selector.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Selector | `string` | `selector` | Yes | CSS selector |
| All | `bool` | `all` | No | Return all matching elements; default returns first match only |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Found | `bool` | `found` | Whether any elements matched |
| Count | `int` | `count` | Number of elements matched |
| Elements | `[]WebviewElementInfo` | `elements` | Element details |
**WebviewElementInfo fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| NodeID | `int` | `nodeId` | CDP node identifier |
| TagName | `string` | `tagName` | HTML tag name |
| Attributes | `map[string]string` | `attributes` | Element attributes |
| BoundingBox | `*webview.BoundingBox` | `boundingBox` | Element position and dimensions |
**Notes**
With `all=false` (default), returns at most one element and `found=false` when no match exists. With `all=true`, returns all matches. A zero-result `all=true` query returns `found=false` and an empty slice rather than an error.
---
### `webview_console`
Get browser console messages captured since the last call.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Clear | `bool` | `clear` | No | Clear the console buffer after reading; default `false` |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Messages | `[]WebviewConsoleMessage` | `messages` | Captured console messages |
| Count | `int` | `count` | Number of messages |
**WebviewConsoleMessage fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Type | `string` | `type` | Message level: `log`, `warn`, `error`, etc. |
| Text | `string` | `text` | Message content |
| Timestamp | `string` | `timestamp` | RFC 3339 timestamp |
| URL | `string` | `url` | Source URL (if available) |
| Line | `int` | `line` | Source line number (if available) |
**Notes**
Returns an error if not connected. Messages accumulate in a buffer; use `clear=true` to reset the buffer after reading to avoid receiving duplicate messages on subsequent calls.
---
### `webview_eval`
Evaluate a JavaScript expression in the browser context.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Script | `string` | `script` | Yes | JavaScript expression or statement to evaluate |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | `bool` | `success` | Whether evaluation succeeded |
| Result | `any` | `result` | Return value of the expression (JSON-serialisable) |
| Error | `string` | `error` | Error message if evaluation failed |
**Notes**
Returns an error if not connected or if `script` is empty. JavaScript errors are captured in the `error` field with `success=false` rather than being returned as tool-level errors. Logged at `Security` level.
---
### `webview_screenshot`
Capture a screenshot of the current browser viewport.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Format | `string` | `format` | No | Image format: `"png"` or `"jpeg"`; default `"png"` |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | `bool` | `success` | Whether the screenshot was captured |
| Data | `string` | `data` | Base64-encoded image data |
| Format | `string` | `format` | Format used |
**Notes**
Returns an error if not connected. The `data` field is standard base64 (not URL-safe); decode with standard base64 to obtain the raw image bytes.
---
### `webview_wait`
Wait for an element matching a CSS selector to appear in the DOM.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Selector | `string` | `selector` | Yes | CSS selector to wait for |
| Timeout | `int` | `timeout` | No | Maximum wait time in seconds |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | `bool` | `success` | Whether the element appeared within the timeout |
| Message | `string` | `message` | Status message including the matched selector |
**Notes**
Returns an error if not connected or if `selector` is empty. If the element does not appear before the timeout, an error is returned. The default timeout is inherited from the connection timeout set during `webview_connect`.
---
## IDE Chat
Five tools for interacting with agent chat sessions via the Laravel WebSocket bridge. These tools are provided by the `ide.Subsystem` and require a `ws.Hub` instance for real-time forwarding.
**Implementation status**: The Laravel backend integration is currently a stub. Tool calls emit bridge messages and return placeholder responses. Live data is delivered asynchronously via WebSocket subscriptions.
---
### `ide_chat_send`
Send a message to an agent chat session.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| SessionID | `string` | `sessionId` | Yes | Target session identifier |
| Message | `string` | `message` | Yes | Message content to send |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Sent | `bool` | `sent` | Whether the message was forwarded to the bridge |
| SessionID | `string` | `sessionId` | Echoed session ID |
| Timestamp | `time.Time` | `timestamp` | Server-assigned send timestamp |
**Notes**
The bridge forwards the message on the `chat:<sessionId>` channel. The agent's reply arrives asynchronously via the WebSocket connection. Returns an error if the bridge is not available.
---
### `ide_chat_history`
Retrieve message history for a chat session.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| SessionID | `string` | `sessionId` | Yes | Session identifier |
| Limit | `int` | `limit` | No | Maximum number of messages to return |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| SessionID | `string` | `sessionId` | Echoed session ID |
| Messages | `[]ChatMessage` | `messages` | Message list (currently empty; data arrives via WebSocket) |
**ChatMessage fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Role | `string` | `role` | `"user"` or `"assistant"` |
| Content | `string` | `content` | Message text |
| Timestamp | `time.Time` | `timestamp` | Message timestamp |
**Notes**
Currently returns an empty `messages` array. The history request is forwarded to the Laravel backend via the bridge; data is returned asynchronously.
---
### `ide_session_list`
List active agent sessions.
**Parameters**
None.
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Sessions | `[]Session` | `sessions` | Active sessions (currently empty; data arrives via WebSocket) |
**Session fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | `string` | `id` | Session identifier |
| Name | `string` | `name` | Human-readable session name |
| Status | `string` | `status` | Session status string |
| CreatedAt | `time.Time` | `createdAt` | Session creation time |
---
### `ide_session_create`
Create a new agent session.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Name | `string` | `name` | Yes | Human-readable name for the new session |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Session | `Session` | `session` | The new session record |
**Notes**
Currently returns a placeholder session with `status="creating"` and no `id`. The actual session is created asynchronously by the Laravel backend; the final record arrives via WebSocket.
---
### `ide_plan_status`
Get the current plan status for an agent session.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| SessionID | `string` | `sessionId` | Yes | Session identifier |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| SessionID | `string` | `sessionId` | Echoed session ID |
| Status | `string` | `status` | Plan status; currently `"unknown"` |
| Steps | `[]PlanStep` | `steps` | Plan steps (currently empty) |
**PlanStep fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Name | `string` | `name` | Step name |
| Status | `string` | `status` | Step status |
---
## IDE Build
Three tools for querying CI build status and logs. Provided by `ide.Subsystem`; data is sourced from the Laravel backend via the WebSocket bridge.
**Implementation status**: Stub. Tool calls emit bridge messages and return placeholder responses.
---
### `ide_build_status`
Get the status of a specific build.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| BuildID | `string` | `buildId` | Yes | Build identifier |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Build | `BuildInfo` | `build` | Build record |
**BuildInfo fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | `string` | `id` | Build identifier |
| Repo | `string` | `repo` | Repository name |
| Branch | `string` | `branch` | Git branch |
| Status | `string` | `status` | Build status; currently `"unknown"` |
| Duration | `string` | `duration` | Build duration (if complete) |
| StartedAt | `time.Time` | `startedAt` | Build start time |
---
### `ide_build_list`
List recent builds, optionally filtered by repository.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Repo | `string` | `repo` | No | Filter by repository name |
| Limit | `int` | `limit` | No | Maximum number of builds to return |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Builds | `[]BuildInfo` | `builds` | Build records (currently empty) |
---
### `ide_build_logs`
Retrieve log output for a build.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| BuildID | `string` | `buildId` | Yes | Build identifier |
| Tail | `int` | `tail` | No | Return only the last N lines |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| BuildID | `string` | `buildId` | Echoed build identifier |
| Lines | `[]string` | `lines` | Log lines (currently empty) |
---
## IDE Dashboard
Three tools for querying platform-wide overview, activity, and aggregate metrics. Provided by `ide.Subsystem`; data is sourced from the Laravel backend via the WebSocket bridge.
**Implementation status**: `ide_dashboard_overview` returns live bridge connectivity status. The other two tools are stubs that forward requests and return placeholder responses.
---
### `ide_dashboard_overview`
Get a high-level overview of the platform.
**Parameters**
None.
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Overview | `DashboardOverview` | `overview` | Platform summary |
**DashboardOverview fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Repos | `int` | `repos` | Number of repositories (stub; currently `0`) |
| Services | `int` | `services` | Number of services (stub; currently `0`) |
| ActiveSessions | `int` | `activeSessions` | Active agent sessions (stub; currently `0`) |
| RecentBuilds | `int` | `recentBuilds` | Recent build count (stub; currently `0`) |
| BridgeOnline | `bool` | `bridgeOnline` | Whether the Laravel WebSocket bridge is currently connected |
**Notes**
`BridgeOnline` is the only live field. All other fields return `0` until the Laravel backend integration is complete.
---
### `ide_dashboard_activity`
Get the recent activity feed.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Limit | `int` | `limit` | No | Maximum number of events to return |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Events | `[]ActivityEvent` | `events` | Activity events (currently empty) |
**ActivityEvent fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Type | `string` | `type` | Event category |
| Message | `string` | `message` | Human-readable description |
| Timestamp | `time.Time` | `timestamp` | Event timestamp |
---
### `ide_dashboard_metrics`
Get aggregate build and agent metrics for a time period.
**Parameters**
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Period | `string` | `period` | No | Time period: `"1h"`, `"24h"`, or `"7d"`; default `"24h"` |
**Response**
| Field | Type | JSON key | Description |
|---|---|---|---|
| Period | `string` | `period` | Echoed period |
| Metrics | `DashboardMetrics` | `metrics` | Aggregate metrics |
**DashboardMetrics fields**
| Field | Type | JSON key | Description |
|---|---|---|---|
| BuildsTotal | `int` | `buildsTotal` | Total builds in period |
| BuildsSuccess | `int` | `buildsSuccess` | Successful builds |
| BuildsFailed | `int` | `buildsFailed` | Failed builds |
| AvgBuildTime | `string` | `avgBuildTime` | Average build duration |
| AgentSessions | `int` | `agentSessions` | Agent sessions created |
| MessagesTotal | `int` | `messagesTotal` | Total chat messages |
| SuccessRate | `float64` | `successRate` | Build success ratio (0.01.0) |
**Notes**
All fields currently return zero values. Data will be populated once the Laravel backend integration is complete.