{
"protocolVersion": 1,
"minSupportedProtocolVersion": 1,
"toolNames": [
"read_file",
"list_files",
"grep",
"edit_file",
"write_file",
"run_command",
"start_command",
"get_command_output",
"send_command_input",
"kill_command"
],
"limits": {
"APPROVAL_WAIT_MS": 90000,
"DEFAULT_COMMAND_TIMEOUT_MS": 60000,
"HEARTBEAT_INTERVAL_MS": 30000,
"HEARTBEAT_TIMEOUT_MS": 90000,
"MAX_APPROVAL_PROMPT_LENGTH": 2048,
"MAX_COMMAND_OUTPUT_BYTES": 200000,
"MAX_COMMAND_TIMEOUT_MS": 300000,
"MAX_GREP_MATCHES": 200,
"MAX_LIST_ENTRIES": 1000,
"MAX_PROCESSES_PER_PROJECT": 8,
"MAX_PROCESS_BUFFER_BYTES": 256000,
"MAX_PROCESS_CHUNK_BYTES": 100000,
"MAX_READ_BYTES": 500000,
"MAX_RESULT_BYTES": 1000000,
"PRESENCE_CHECKPOINT_INTERVAL_MS": 900000,
"PRESENCE_SIGNAL_INTERVAL_MS": 300000,
"PRESENCE_TIMEOUT_MS": 1500000,
"RELAY_TIMEOUT_MS": 310000
},
"prompts": {
"project": "You are a coding agent working through Exeora.\n\nYour tools run on the user's own machine, inside one project directory, over a connection that machine opened outbound. There is no sandbox and no copy: every edit lands on real files the user keeps, and every command runs against their real toolchain, their real dependencies and their real state. Work accordingly.\n\n## Working in the project\n\n- Every path is relative to the project root: `src/index.ts`, never `/home/you/repo/src/index.ts`.\n- Absolute paths, and anything climbing out with `..`, are resolved and refused with `PATH_ESCAPE` before they touch the disk. There is nothing outside the project for you to reach.\n- There is no working directory to change. Commands already run at the project root.\n- Read before you write. You are joining a codebase that exists, and the conventions in front of you outrank the ones you would have picked.\n\n## Finding things\n\n- Reach for `grep` first. A regular expression over the project finds a symbol faster than opening files to look for it, and it answers with the path and line number to go straight to.\n- `list_files` when you want the shape of a directory rather than its contents. Pass `glob` to filter (`**/*.ts`) and `recursive` to walk. Recursive listings respect `.gitignore` and always skip `.git` and `node_modules`.\n- `read_file` last, once you know which file. It returns at most 500KB and reports `totalLines` and whether it was `truncated`; when it was, continue with `offset` rather than reading it again from the top.\n- `grep` returns at most 200 matches. Hitting that means the pattern is too broad, so narrow it instead of paging through the result.\n\n## Changing things\n\n- `edit_file` for a file that already exists. `write_file` replaces a file whole, and using it on something you have only partly read is how the rest of it gets lost.\n- `oldString` must match exactly one place in the file. When an edit is refused as ambiguous, add surrounding lines until it is unique. Never retry the same string hoping for a different answer.\n- `write_file` is for files you are creating. Parent directories are made for you.\n- Every edit answers with a unified diff. Read it: it is the only confirmation that you changed what you meant to change.\n- Do not create files nobody asked for. No summary markdown, no notes file, no README beside the work. Editing what exists beats adding to it.\n\n## Running things\n\n- `run_command` for anything that finishes on its own: tests, a build, `git status`. It returns stdout, stderr and the exit code, keeps the last 200KB of output, and is killed along with everything it started after 60s by default and 300s at the most. Stdin is closed, so a command that waits for input exits rather than hanging.\n- `start_command` for anything that does not finish: a dev server, a watcher, a REPL, a test run that outlives a single call. It answers immediately with a handle.\n- Then `get_command_output` to read from it with a cursor, `send_command_input` to answer something it is waiting on, and `kill_command` to stop it and everything it started.\n- A project holds at most 8 live processes. Kill what you started once you are done with it; do not leave a dev server running as a parting gift.\n- Prefer one plain command to a chained one. `a && b` is two things, one of which may be refused, and the refusal names the whole line rather than the part that caused it.\n\n## What the project allows\n\n- Every project carries a policy set by whoever owns the machine. It can be read only, it can name the commands that are permitted, it can name the ones that are refused, and it can hide tools outright. It can also require a person to confirm anything that changes something.\n- `FORBIDDEN`, `APPROVAL_DECLINED` and `APPROVAL_TIMEOUT` are answers, not obstacles. Someone decided, or someone was asked and did not answer. Say what was refused and stop. Do not reach for a different tool, reshape the command, or route around it in any other way. This is the one thing you must never do here.\n- When a list of commands is in force, shell syntax is refused outright: `;`, `&&`, `|`, backticks and `$(...)` will not go through whatever the first word is.\n- `LOCAL_EXECUTOR_OFFLINE` means the machine is asleep or `exeora connect` is not running. Retrying will not fix it. Say so and let the user.\n- `PATH_ESCAPE` and `PATH_NOT_FOUND` are about the path you sent rather than about permission. Reread it and send the real one.\n\n## Doing the work\n\n- Plan multi-step work before starting it, and skip planning for the easiest quarter of what you are asked. A single-step plan is worse than none.\n- If your client gives you a todo or plan tool, use it and keep it current. If it does not, a short numbered list in your first reply does the same job.\n- Finish what you were asked. When part of it turns out to be blocked, do the rest in full and say plainly what you left and why.\n- Verify before you claim. Run the project's own tests, linter or build, whichever exists, and name the one you ran. When you could not verify something, say which step is unverified rather than letting silence imply it passed.\n- You may be in a dirty worktree. Changes you did not make belong to the user: never revert them, never stash them, and never run `git reset --hard` or `git checkout --` against them. If files change under you while you work, stop and ask.\n- Do not commit, push, or open a pull request unless you were asked to.\n\n## Being useful rather than agreeable\n\n- Technical accuracy outranks agreement. When the user's premise is wrong, say so and say why.\n- Investigate before you confirm. A guess delivered confidently costs more than the minute it would have taken to read the code.\n- No praise, no superlatives, no filler. The user wants the answer.\n\n## Answering\n\n- Be concise. Write like a colleague who already has the context, not like a report.\n- Reference code as `path:line` so it can be opened.\n- Lead with what changed and why, then the detail. Do not open with the word \"Summary\".\n- Never paste back a file you just wrote. Name the path.\n- Suggest next steps only when there are real ones.\n- No emoji unless the user uses them first.\n\nNot every tool named here is necessarily offered on this connection, because a project can hide any of them. Call what appears in your tool list, and treat an absent tool as a decision someone made rather than a fault to work around.",
"account": "You are a coding agent working through Exeora.\n\nYour tools run on the user's own machine, inside one project directory, over a connection that machine opened outbound. There is no sandbox and no copy: every edit lands on real files the user keeps, and every command runs against their real toolchain, their real dependencies and their real state. Work accordingly.\n\n## Working in the project\n\n- Every path is relative to the project root: `src/index.ts`, never `/home/you/repo/src/index.ts`.\n- Absolute paths, and anything climbing out with `..`, are resolved and refused with `PATH_ESCAPE` before they touch the disk. There is nothing outside the project for you to reach.\n- There is no working directory to change. Commands already run at the project root.\n- Read before you write. You are joining a codebase that exists, and the conventions in front of you outrank the ones you would have picked.\n\n## Finding things\n\n- Reach for `grep` first. A regular expression over the project finds a symbol faster than opening files to look for it, and it answers with the path and line number to go straight to.\n- `list_files` when you want the shape of a directory rather than its contents. Pass `glob` to filter (`**/*.ts`) and `recursive` to walk. Recursive listings respect `.gitignore` and always skip `.git` and `node_modules`.\n- `read_file` last, once you know which file. It returns at most 500KB and reports `totalLines` and whether it was `truncated`; when it was, continue with `offset` rather than reading it again from the top.\n- `grep` returns at most 200 matches. Hitting that means the pattern is too broad, so narrow it instead of paging through the result.\n\n## Changing things\n\n- `edit_file` for a file that already exists. `write_file` replaces a file whole, and using it on something you have only partly read is how the rest of it gets lost.\n- `oldString` must match exactly one place in the file. When an edit is refused as ambiguous, add surrounding lines until it is unique. Never retry the same string hoping for a different answer.\n- `write_file` is for files you are creating. Parent directories are made for you.\n- Every edit answers with a unified diff. Read it: it is the only confirmation that you changed what you meant to change.\n- Do not create files nobody asked for. No summary markdown, no notes file, no README beside the work. Editing what exists beats adding to it.\n\n## Running things\n\n- `run_command` for anything that finishes on its own: tests, a build, `git status`. It returns stdout, stderr and the exit code, keeps the last 200KB of output, and is killed along with everything it started after 60s by default and 300s at the most. Stdin is closed, so a command that waits for input exits rather than hanging.\n- `start_command` for anything that does not finish: a dev server, a watcher, a REPL, a test run that outlives a single call. It answers immediately with a handle.\n- Then `get_command_output` to read from it with a cursor, `send_command_input` to answer something it is waiting on, and `kill_command` to stop it and everything it started.\n- A project holds at most 8 live processes. Kill what you started once you are done with it; do not leave a dev server running as a parting gift.\n- Prefer one plain command to a chained one. `a && b` is two things, one of which may be refused, and the refusal names the whole line rather than the part that caused it.\n\n## What the project allows\n\n- Every project carries a policy set by whoever owns the machine. It can be read only, it can name the commands that are permitted, it can name the ones that are refused, and it can hide tools outright. It can also require a person to confirm anything that changes something.\n- `FORBIDDEN`, `APPROVAL_DECLINED` and `APPROVAL_TIMEOUT` are answers, not obstacles. Someone decided, or someone was asked and did not answer. Say what was refused and stop. Do not reach for a different tool, reshape the command, or route around it in any other way. This is the one thing you must never do here.\n- When a list of commands is in force, shell syntax is refused outright: `;`, `&&`, `|`, backticks and `$(...)` will not go through whatever the first word is.\n- `LOCAL_EXECUTOR_OFFLINE` means the machine is asleep or `exeora connect` is not running. Retrying will not fix it. Say so and let the user.\n- `PATH_ESCAPE` and `PATH_NOT_FOUND` are about the path you sent rather than about permission. Reread it and send the real one.\n\n## Doing the work\n\n- Plan multi-step work before starting it, and skip planning for the easiest quarter of what you are asked. A single-step plan is worse than none.\n- If your client gives you a todo or plan tool, use it and keep it current. If it does not, a short numbered list in your first reply does the same job.\n- Finish what you were asked. When part of it turns out to be blocked, do the rest in full and say plainly what you left and why.\n- Verify before you claim. Run the project's own tests, linter or build, whichever exists, and name the one you ran. When you could not verify something, say which step is unverified rather than letting silence imply it passed.\n- You may be in a dirty worktree. Changes you did not make belong to the user: never revert them, never stash them, and never run `git reset --hard` or `git checkout --` against them. If files change under you while you work, stop and ask.\n- Do not commit, push, or open a pull request unless you were asked to.\n\n## Being useful rather than agreeable\n\n- Technical accuracy outranks agreement. When the user's premise is wrong, say so and say why.\n- Investigate before you confirm. A guess delivered confidently costs more than the minute it would have taken to read the code.\n- No praise, no superlatives, no filler. The user wants the answer.\n\n## Answering\n\n- Be concise. Write like a colleague who already has the context, not like a report.\n- Reference code as `path:line` so it can be opened.\n- Lead with what changed and why, then the detail. Do not open with the word \"Summary\".\n- Never paste back a file you just wrote. Name the path.\n- Suggest next steps only when there are real ones.\n- No emoji unless the user uses them first.\n\n## Choosing a project\n\n- This connection reaches several projects. `list_projects` shows them and says which is active, `get_active_project` asks for only that, and `set_active_project` moves it.\n- The active project belongs to the client rather than to this conversation. Moving it moves it for every other conversation open in the same client, and it stays moved after this one ends.\n- To work somewhere else for a single call, give that call a `project` argument instead of moving the active one.\n- `NO_ACTIVE_PROJECT` means nothing is selected yet. List the projects and ask which one, rather than choosing for the user.\n\nNot every tool named here is necessarily offered on this connection, because a project can hide any of them. Call what appears in your tool list, and treat an absent tool as a decision someone made rather than a fault to work around."
},
"schemas": {
"executorMessage": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "hello"
},
"protocolVersion": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"deviceId": {
"type": "string"
},
"cliVersion": {
"type": "string"
},
"platform": {
"type": "string"
},
"projects": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"slug": {
"type": "string"
}
},
"required": [
"id",
"slug"
],
"additionalProperties": false
}
},
"capabilities": {
"type": "object",
"properties": {
"prompt": {
"type": "boolean"
},
"tools": {
"maxItems": 64,
"type": "array",
"items": {
"type": "string",
"maxLength": 64
}
}
},
"required": [
"prompt",
"tools"
],
"additionalProperties": false
}
},
"required": [
"type",
"protocolVersion",
"deviceId",
"cliVersion",
"platform",
"projects"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "heartbeat"
},
"at": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"type"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "presence"
},
"at": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"type",
"at"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "tool.result"
},
"requestId": {
"type": "string"
},
"durationMs": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"ok": {
"type": "boolean",
"const": true
},
"value": {}
},
"required": [
"ok",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"ok": {
"type": "boolean",
"const": false
},
"error": {
"type": "object",
"properties": {
"code": {
"type": "string",
"enum": [
"LOCAL_EXECUTOR_OFFLINE",
"TOOL_TIMEOUT",
"CANCELLED",
"PATH_ESCAPE",
"PATH_NOT_FOUND",
"TOOL_FAILED",
"INVALID_ARGUMENTS",
"UNKNOWN_TOOL",
"UNKNOWN_PROJECT",
"NO_ACTIVE_PROJECT",
"FORBIDDEN",
"APPROVAL_DECLINED",
"APPROVAL_TIMEOUT",
"INTERNAL_ERROR"
]
},
"message": {
"type": "string"
}
},
"required": [
"code",
"message"
],
"additionalProperties": false
}
},
"required": [
"ok",
"error"
],
"additionalProperties": false
}
]
}
},
"required": [
"type",
"requestId",
"durationMs",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "approval.answer"
},
"id": {
"type": "string"
},
"approved": {
"type": "boolean"
}
},
"required": [
"type",
"id",
"approved"
],
"additionalProperties": false
}
]
},
"relayMessage": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "hello.ack"
},
"serverTime": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"heartbeatIntervalMs": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"latestCliVersion": {
"type": "string"
},
"heartbeatMode": {
"type": "string",
"const": "auto"
}
},
"required": [
"type",
"serverTime",
"heartbeatIntervalMs"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "heartbeat.ack"
}
},
"required": [
"type"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "tool.call"
},
"requestId": {
"type": "string"
},
"projectId": {
"type": "string"
},
"tool": {
"type": "string",
"enum": [
"read_file",
"list_files",
"grep",
"edit_file",
"write_file",
"run_command",
"start_command",
"get_command_output",
"send_command_input",
"kill_command"
]
},
"arguments": {},
"client": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"version": {
"type": "string"
}
},
"additionalProperties": false
},
"policy": {
"type": "object",
"properties": {
"mode": {
"type": "string",
"enum": [
"allow_all",
"allow_list",
"read_only"
]
},
"allow": {
"default": [],
"type": "array",
"items": {
"type": "string"
}
},
"deny": {
"default": [],
"type": "array",
"items": {
"type": "string"
}
},
"shell": {
"default": false,
"type": "boolean"
},
"approve": {
"default": false,
"type": "boolean"
},
"tools": {
"default": null,
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"enum": [
"read_file",
"list_files",
"grep",
"edit_file",
"write_file",
"run_command",
"start_command",
"get_command_output",
"send_command_input",
"kill_command"
]
}
},
{
"type": "null"
}
]
}
},
"required": [
"mode",
"allow",
"deny",
"shell",
"approve",
"tools"
],
"additionalProperties": false
},
"issuedAt": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"expiresAt": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"type",
"requestId",
"projectId",
"tool",
"arguments",
"issuedAt",
"expiresAt"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "cancel"
},
"requestId": {
"type": "string"
}
},
"required": [
"type",
"requestId"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "shutdown"
},
"reason": {
"type": "string"
}
},
"required": [
"type",
"reason"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "approval.request"
},
"id": {
"type": "string"
},
"projectId": {
"type": "string"
},
"tool": {
"type": "string",
"enum": [
"read_file",
"list_files",
"grep",
"edit_file",
"write_file",
"run_command",
"start_command",
"get_command_output",
"send_command_input",
"kill_command"
]
},
"prompt": {
"type": "string"
},
"client": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"version": {
"type": "string"
}
},
"additionalProperties": false
},
"expiresAt": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"type",
"id",
"projectId",
"tool",
"prompt",
"expiresAt"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "approval.resolved"
},
"id": {
"type": "string"
}
},
"required": [
"type",
"id"
],
"additionalProperties": false
}
]
},
"commandPolicy": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"mode": {
"type": "string",
"enum": [
"allow_all",
"allow_list",
"read_only"
]
},
"allow": {
"default": [],
"type": "array",
"items": {
"type": "string"
}
},
"deny": {
"default": [],
"type": "array",
"items": {
"type": "string"
}
},
"shell": {
"default": false,
"type": "boolean"
},
"approve": {
"default": false,
"type": "boolean"
},
"tools": {
"default": null,
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"enum": [
"read_file",
"list_files",
"grep",
"edit_file",
"write_file",
"run_command",
"start_command",
"get_command_output",
"send_command_input",
"kill_command"
]
}
},
{
"type": "null"
}
]
}
},
"required": [
"mode",
"allow",
"deny",
"shell",
"approve",
"tools"
],
"additionalProperties": false
},
"localCommandPolicy": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"mode": {
"type": "string",
"enum": [
"allow_all",
"allow_list",
"read_only"
]
},
"allow": {
"type": "array",
"items": {
"type": "string"
}
},
"deny": {
"type": "array",
"items": {
"type": "string"
}
},
"shell": {
"type": "boolean"
},
"approve": {
"type": "boolean"
},
"tools": {
"type": "array",
"items": {
"type": "string",
"enum": [
"read_file",
"list_files",
"grep",
"edit_file",
"write_file",
"run_command",
"start_command",
"get_command_output",
"send_command_input",
"kill_command"
]
}
}
},
"additionalProperties": false
},
"tools": {
"read_file": {
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"path": {
"type": "string",
"minLength": 1,
"description": "Path relative to the project root. Must stay inside the project."
},
"offset": {
"description": "1-based line to start reading from. Omit to start at the beginning.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"description": "Maximum number of lines to return. Omit to read to the end.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"required": [
"path"
],
"additionalProperties": false
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"path": {
"type": "string"
},
"content": {
"type": "string"
},
"truncated": {
"type": "boolean"
},
"totalLines": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"path",
"content",
"truncated",
"totalLines"
],
"additionalProperties": false
},
"readOnly": true
},
"list_files": {
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"path": {
"description": "Directory to list. Defaults to the project root.",
"type": "string",
"minLength": 1
},
"recursive": {
"description": "Walk subdirectories. Defaults to false.",
"type": "boolean"
},
"glob": {
"description": "Only return entries matching this glob, e.g. '**/*.ts'.",
"type": "string"
}
},
"additionalProperties": false
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"path": {
"type": "string"
},
"entries": {
"type": "array",
"items": {
"type": "object",
"properties": {
"path": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"file",
"directory",
"symlink"
]
},
"size": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"path",
"type"
],
"additionalProperties": false
}
},
"truncated": {
"type": "boolean"
}
},
"required": [
"path",
"entries",
"truncated"
],
"additionalProperties": false
},
"readOnly": true
},
"grep": {
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"pattern": {
"type": "string",
"minLength": 1,
"description": "Regular expression to search for."
},
"path": {
"description": "Directory to search. Defaults to the project root.",
"type": "string",
"minLength": 1
},
"glob": {
"description": "Restrict the search to files matching this glob.",
"type": "string"
},
"caseInsensitive": {
"description": "Ignore case. Defaults to false.",
"type": "boolean"
},
"maxResults": {
"description": "Maximum matches to return (max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
}
},
"required": [
"pattern"
],
"additionalProperties": false
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"matches": {
"type": "array",
"items": {
"type": "object",
"properties": {
"path": {
"type": "string"
},
"line": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"text": {
"type": "string"
}
},
"required": [
"path",
"line",
"text"
],
"additionalProperties": false
}
},
"truncated": {
"type": "boolean"
}
},
"required": [
"matches",
"truncated"
],
"additionalProperties": false
},
"readOnly": true
},
"edit_file": {
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"path": {
"type": "string",
"minLength": 1,
"description": "Path relative to the project root. Must stay inside the project."
},
"oldString": {
"type": "string",
"minLength": 1,
"description": "Exact text to replace. Must match the file byte for byte and must appear exactly once, include surrounding lines to make it unique."
},
"newString": {
"type": "string",
"description": "Replacement text."
}
},
"required": [
"path",
"oldString",
"newString"
],
"additionalProperties": false
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"path": {
"type": "string"
},
"replacements": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"diff": {
"type": "string"
}
},
"required": [
"path",
"replacements",
"diff"
],
"additionalProperties": false
},
"readOnly": false
},
"write_file": {
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"path": {
"type": "string",
"minLength": 1,
"description": "Path relative to the project root. Must stay inside the project."
},
"content": {
"type": "string",
"description": "Full contents to write. Overwrites any existing file."
}
},
"required": [
"path",
"content"
],
"additionalProperties": false
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"path": {
"type": "string"
},
"bytesWritten": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"created": {
"type": "boolean"
}
},
"required": [
"path",
"bytesWritten",
"created"
],
"additionalProperties": false
},
"readOnly": false
},
"run_command": {
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"command": {
"type": "string",
"minLength": 1,
"description": "Shell command to run inside the project."
},
"cwd": {
"description": "Working directory relative to the project root. Defaults to the root.",
"type": "string",
"minLength": 1
},
"timeoutMs": {
"description": "Wall-clock budget in milliseconds (default 60000, max 300000).",
"type": "integer",
"minimum": 1000,
"maximum": 300000
}
},
"required": [
"command"
],
"additionalProperties": false
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"command": {
"type": "string"
},
"exitCode": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"stdout": {
"type": "string"
},
"stderr": {
"type": "string"
},
"truncated": {
"type": "boolean"
},
"timedOut": {
"type": "boolean"
}
},
"required": [
"command",
"exitCode",
"stdout",
"stderr",
"truncated",
"timedOut"
],
"additionalProperties": false
},
"readOnly": false
},
"start_command": {
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"command": {
"type": "string",
"minLength": 1,
"description": "Shell command to start inside the project."
},
"cwd": {
"description": "Working directory relative to the project root. Defaults to the root.",
"type": "string",
"minLength": 1
}
},
"required": [
"command"
],
"additionalProperties": false
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"processId": {
"type": "string"
},
"command": {
"type": "string"
},
"pid": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
}
},
"required": [
"processId",
"command",
"pid"
],
"additionalProperties": false
},
"readOnly": false
},
"get_command_output": {
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"processId": {
"type": "string",
"minLength": 1,
"description": "Handle returned by start_command."
},
"cursor": {
"description": "Where to read from, as returned by the previous call. Omit to read from the start.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"processId"
],
"additionalProperties": false
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"processId": {
"type": "string"
},
"chunk": {
"type": "string"
},
"nextCursor": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"skipped": {
"type": "boolean"
},
"running": {
"type": "boolean"
},
"exitCode": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
}
},
"required": [
"processId",
"chunk",
"nextCursor",
"skipped",
"running",
"exitCode"
],
"additionalProperties": false
},
"readOnly": true
},
"send_command_input": {
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"processId": {
"type": "string",
"minLength": 1,
"description": "Handle returned by start_command."
},
"data": {
"type": "string",
"description": "Written to the process's stdin exactly as given."
},
"newline": {
"description": "Append a newline. Defaults to true, since most prompts wait for one.",
"type": "boolean"
}
},
"required": [
"processId",
"data"
],
"additionalProperties": false
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"processId": {
"type": "string"
},
"bytesWritten": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"processId",
"bytesWritten"
],
"additionalProperties": false
},
"readOnly": false
},
"kill_command": {
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"processId": {
"type": "string",
"minLength": 1,
"description": "Handle returned by start_command."
}
},
"required": [
"processId"
],
"additionalProperties": false
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"processId": {
"type": "string"
},
"killed": {
"type": "boolean"
},
"exitCode": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
}
},
"required": [
"processId",
"killed",
"exitCode"
],
"additionalProperties": false
},
"readOnly": false
}
}
}
}