| 1 | [ |
| 2 | { |
| 3 | "Name": "ask", |
| 4 | "Description": "Ask the user one or more multiple-choice questions when you hit a decision that is genuinely theirs to make — one you can't resolve from the request, the code, or sensible defaults. The frontend shows the options for the user to pick; their choices are returned to you. Prefer this over asking in prose for any real fork (which approach, which library, scope). Don't use it for decisions with an obvious default — pick the sensible option and proceed. Tool-approval modes such as YOLO do not answer these questions for the user. Each question has a short `header` (a tab label), the `question` text, 2-4 `options` (each a `label` and optional `description`; put any recommended option first), and `multiSelect` when more than one may apply.", |
| 5 | "ReadOnly": true, |
| 6 | "Schema": { |
| 7 | "properties": { |
| 8 | "questions": { |
| 9 | "description": "1-4 questions to ask together.", |
| 10 | "items": { |
| 11 | "properties": { |
| 12 | "header": { |
| 13 | "description": "Very short label for the question (a tab title), e.g. \"Library\".", |
| 14 | "type": "string" |
| 15 | }, |
| 16 | "multiSelect": { |
| 17 | "description": "Allow selecting more than one option.", |
| 18 | "type": "boolean" |
| 19 | }, |
| 20 | "options": { |
| 21 | "description": "The choices. Put any recommended option first.", |
| 22 | "items": { |
| 23 | "properties": { |
| 24 | "description": { |
| 25 | "description": "Optional one-line explanation of the choice.", |
| 26 | "type": "string" |
| 27 | }, |
| 28 | "label": { |
| 29 | "description": "The choice text (concise).", |
| 30 | "type": "string" |
| 31 | } |
| 32 | }, |
| 33 | "required": [ |
| 34 | "label" |
| 35 | ], |
| 36 | "type": "object" |
| 37 | }, |
| 38 | "maxItems": 4, |
| 39 | "minItems": 2, |
| 40 | "type": "array" |
| 41 | }, |
| 42 | "question": { |
| 43 | "description": "The full question to ask.", |
| 44 | "type": "string" |
| 45 | } |
| 46 | }, |
| 47 | "required": [ |
| 48 | "header", |
| 49 | "options", |
| 50 | "question" |
| 51 | ], |
| 52 | "type": "object" |
| 53 | }, |
| 54 | "maxItems": 4, |
| 55 | "minItems": 1, |
| 56 | "type": "array" |
| 57 | } |
| 58 | }, |
| 59 | "required": [ |
| 60 | "questions" |
| 61 | ], |
| 62 | "type": "object" |
| 63 | } |
| 64 | }, |
| 65 | { |
| 66 | "Name": "bash", |
| 67 | "Description": "Execute a command in the shell and return combined stdout/stderr. Use for builds, tests, git, package managers, etc. To search/read/list/edit/move files, prefer the dedicated tools (grep, read_file, ls, glob, edit_file, move_file) over shell grep/cat/ls/find/sed/mv/Move-Item — they behave identically on every OS. For symbol search or architecture questions, prefer LSP/read tools and targeted grep before shell commands.", |
| 68 | "ReadOnly": false, |
| 69 | "Schema": { |
| 70 | "properties": { |
| 71 | "command": { |
| 72 | "description": "Shell command to execute", |
| 73 | "type": "string" |
| 74 | }, |
| 75 | "preserve_background_processes": { |
| 76 | "description": "After the shell command exits normally, keep any process-group members it intentionally left behind. Use only for deliberate daemonization, browser/GUI/session launchers such as playwright-cli open, or nohup/disown/setsid; cancellation and timeouts still kill the process group.", |
| 77 | "type": "boolean" |
| 78 | }, |
| 79 | "run_in_background": { |
| 80 | "description": "Run detached: returns a job id immediately and keeps running across turns (no foreground timeout). Read new output with bash_output, wait with wait, stop it with kill_shell. Use for long-running commands like servers, watchers, or builds you don't need to block on.", |
| 81 | "type": "boolean" |
| 82 | } |
| 83 | }, |
| 84 | "required": [ |
| 85 | "command" |
| 86 | ], |
| 87 | "type": "object" |
| 88 | } |
| 89 | }, |
| 90 | { |
| 91 | "Name": "bash_output", |
| 92 | "Description": "Read new output from a background job started with bash(run_in_background=true) or task(run_in_background=true). Returns the output produced since the last bash_output call for that job, plus its status (running/done/failed/killed). Does not block.", |
| 93 | "ReadOnly": true, |
| 94 | "Schema": { |
| 95 | "properties": { |
| 96 | "filter": { |
| 97 | "description": "Optional regular expression; only matching lines of the new output are returned.", |
| 98 | "type": "string" |
| 99 | }, |
| 100 | "job_id": { |
| 101 | "description": "The background job id (e.g. \"bash-1\") returned when it was started.", |
| 102 | "type": "string" |
| 103 | } |
| 104 | }, |
| 105 | "required": [ |
| 106 | "job_id" |
| 107 | ], |
| 108 | "type": "object" |
| 109 | } |
| 110 | }, |
| 111 | { |
| 112 | "Name": "code_index", |
| 113 | "Description": "Lightweight built-in code symbol index. Prefer lsp_* for language semantics and installed code graph MCP tools for call graph, impact, and architecture relationships; use this as the local fallback for file outlines and symbol definition candidates, then verify with read_file or grep.", |
| 114 | "ReadOnly": true, |
| 115 | "Schema": { |
| 116 | "properties": { |
| 117 | "action": { |
| 118 | "description": "outline lists symbols under path; search finds symbol definition candidates by name.", |
| 119 | "enum": [ |
| 120 | "outline", |
| 121 | "search" |
| 122 | ], |
| 123 | "type": "string" |
| 124 | }, |
| 125 | "kind": { |
| 126 | "description": "Optional symbol kind filter, such as func, method, class, type, interface, const, var, struct, enum, trait.", |
| 127 | "type": "string" |
| 128 | }, |
| 129 | "limit": { |
| 130 | "description": "Maximum symbols to return (default 100, max 200).", |
| 131 | "minimum": 1, |
| 132 | "type": "integer" |
| 133 | }, |
| 134 | "path": { |
| 135 | "description": "File or directory path to inspect (default \".\").", |
| 136 | "type": "string" |
| 137 | }, |
| 138 | "query": { |
| 139 | "description": "Symbol name or substring for action=search.", |
| 140 | "type": "string" |
| 141 | } |
| 142 | }, |
| 143 | "required": [ |
| 144 | "action" |
| 145 | ], |
| 146 | "type": "object" |
| 147 | } |
| 148 | }, |
| 149 | { |
| 150 | "Name": "complete_step", |
| 151 | "Description": "Record the evidence-backed completion of ONE step of an approved plan. Call it as you finish each step instead of silently moving on: it signs the step off with PROOF it is done — the verification you ran (command + result), a completed built-in review that is fresh for any later changes, the diff/files you changed, or a manual check. A completion with no evidence is REJECTED, so don't claim a step is done until you can show why. The host advances the task list for you when you sign off — it marks this step completed and moves the next to in_progress, so you don't need a separate todo_write to mark completions. Fields: `step` (which step — its title or number, matching the task list), `result` (what is now true/changed), `evidence` (≥1 item, each with `kind` = verification|review|diff|files|manual and a `summary`, plus optional `command`/`paths`), and optional `notes`.", |
| 152 | "ReadOnly": true, |
| 153 | "Schema": { |
| 154 | "properties": { |
| 155 | "evidence": { |
| 156 | "description": "Proof the step is done. At least one item is required.", |
| 157 | "items": { |
| 158 | "properties": { |
| 159 | "command": { |
| 160 | "description": "REQUIRED for verification evidence: the command as it actually ran (e.g. \"go test ./...\") — it is checked against this session's real command history.", |
| 161 | "type": "string" |
| 162 | }, |
| 163 | "kind": { |
| 164 | "description": "verification = a command/test was run (command REQUIRED); review = a built-in review run completed and, after changes, inspected the latest changed result (the verdict/findings still apply separately); diff = a concrete code change (paths REQUIRED); files = files created/edited/inspected (paths REQUIRED); manual = a manual check.", |
| 165 | "enum": [ |
| 166 | "verification", |
| 167 | "review", |
| 168 | "diff", |
| 169 | "files", |
| 170 | "manual" |
| 171 | ], |
| 172 | "type": "string" |
| 173 | }, |
| 174 | "paths": { |
| 175 | "description": "REQUIRED for diff/files evidence: the files this evidence refers to, as the paths were passed to the tools that touched them.", |
| 176 | "items": { |
| 177 | "type": "string" |
| 178 | }, |
| 179 | "type": "array" |
| 180 | }, |
| 181 | "summary": { |
| 182 | "description": "The evidence itself: the test result, what the diff does, or what was confirmed.", |
| 183 | "type": "string" |
| 184 | } |
| 185 | }, |
| 186 | "required": [ |
| 187 | "kind", |
| 188 | "summary" |
| 189 | ], |
| 190 | "type": "object" |
| 191 | }, |
| 192 | "minItems": 1, |
| 193 | "type": "array" |
| 194 | }, |
| 195 | "notes": { |
| 196 | "description": "Optional caveats, follow-ups, or anything deferred.", |
| 197 | "type": "string" |
| 198 | }, |
| 199 | "result": { |
| 200 | "description": "What is now true or changed as a result of finishing this step.", |
| 201 | "type": "string" |
| 202 | }, |
| 203 | "step": { |
| 204 | "description": "Which plan step this completes — its title or number, matching the task list.", |
| 205 | "type": "string" |
| 206 | }, |
| 207 | "step_index": { |
| 208 | "description": "Optional 1-based task-list item number. Prefer this when the step title is long or easy to mistype.", |
| 209 | "minimum": 1, |
| 210 | "type": "integer" |
| 211 | } |
| 212 | }, |
| 213 | "required": [ |
| 214 | "evidence", |
| 215 | "result" |
| 216 | ], |
| 217 | "type": "object" |
| 218 | } |
| 219 | }, |
| 220 | { |
| 221 | "Name": "delete_range", |
| 222 | "Description": "Delete a contiguous text range from a file using exact start/end text anchors. Each anchor must match exactly one line. Returns unified diff on success. Use for large deletions — smaller changes should use edit_file.", |
| 223 | "ReadOnly": false, |
| 224 | "Schema": { |
| 225 | "properties": { |
| 226 | "end_anchor": { |
| 227 | "description": "Exact text of the last line to delete (must be unique in the file)", |
| 228 | "type": "string" |
| 229 | }, |
| 230 | "inclusive": { |
| 231 | "description": "Whether to include the anchor lines in the deletion (default true)", |
| 232 | "type": "boolean" |
| 233 | }, |
| 234 | "path": { |
| 235 | "description": "File path", |
| 236 | "type": "string" |
| 237 | }, |
| 238 | "start_anchor": { |
| 239 | "description": "Exact text of the first line to delete (must be unique in the file)", |
| 240 | "type": "string" |
| 241 | } |
| 242 | }, |
| 243 | "required": [ |
| 244 | "end_anchor", |
| 245 | "path", |
| 246 | "start_anchor" |
| 247 | ], |
| 248 | "type": "object" |
| 249 | } |
| 250 | }, |
| 251 | { |
| 252 | "Name": "delete_symbol", |
| 253 | "Description": "Delete a named symbol (function, method, type, interface, const, var) from a Go source file using AST parsing. For non-Go files, use delete_range with manual anchors.", |
| 254 | "ReadOnly": false, |
| 255 | "Schema": { |
| 256 | "properties": { |
| 257 | "kind": { |
| 258 | "description": "Optional kind filter: func, method, type, interface, const, var", |
| 259 | "type": "string" |
| 260 | }, |
| 261 | "name": { |
| 262 | "description": "Name of the symbol to delete", |
| 263 | "type": "string" |
| 264 | }, |
| 265 | "parent": { |
| 266 | "description": "Optional parent struct name for method disambiguation", |
| 267 | "type": "string" |
| 268 | }, |
| 269 | "path": { |
| 270 | "description": "Path to the source file", |
| 271 | "type": "string" |
| 272 | } |
| 273 | }, |
| 274 | "required": [ |
| 275 | "name", |
| 276 | "path" |
| 277 | ], |
| 278 | "type": "object" |
| 279 | } |
| 280 | }, |
| 281 | { |
| 282 | "Name": "docs", |
| 283 | "Description": "Search and read the official documentation embedded in this exact Reasonix build. Use it before web search or assumptions for Reasonix setup, CLI, Desktop, configuration, permissions, MCP, memory, recovery, provider behavior, and maintainer workflows. Search first, then read the returned section_id when the full section is needed.", |
| 284 | "ReadOnly": true, |
| 285 | "Schema": { |
| 286 | "properties": { |
| 287 | "audience": { |
| 288 | "description": "Optional audience filter; defaults to all.", |
| 289 | "enum": [ |
| 290 | "all", |
| 291 | "user", |
| 292 | "developer", |
| 293 | "maintainer" |
| 294 | ], |
| 295 | "type": "string" |
| 296 | }, |
| 297 | "language": { |
| 298 | "description": "Language preference. search defaults to auto from the query; list defaults to all. Explicit en or zh-CN filters results.", |
| 299 | "enum": [ |
| 300 | "auto", |
| 301 | "all", |
| 302 | "en", |
| 303 | "zh-CN" |
| 304 | ], |
| 305 | "type": "string" |
| 306 | }, |
| 307 | "limit": { |
| 308 | "description": "Maximum search results, default 5, max 10.", |
| 309 | "maximum": 10, |
| 310 | "minimum": 1, |
| 311 | "type": "integer" |
| 312 | }, |
| 313 | "operation": { |
| 314 | "description": "search ranks relevant sections; read returns one section or lists a document's sections; list shows the embedded document catalog.", |
| 315 | "enum": [ |
| 316 | "search", |
| 317 | "read", |
| 318 | "list" |
| 319 | ], |
| 320 | "type": "string" |
| 321 | }, |
| 322 | "path": { |
| 323 | "description": "Exact docs/*.md path returned by search/list. With operation=read and no section_id, lists that document's sections.", |
| 324 | "type": "string" |
| 325 | }, |
| 326 | "query": { |
| 327 | "description": "Question, command, configuration key, error phrase, or topic for operation=search.", |
| 328 | "maxLength": 4096, |
| 329 | "type": "string" |
| 330 | }, |
| 331 | "section_id": { |
| 332 | "description": "Exact section_id returned by search or by a document section listing. Used by operation=read.", |
| 333 | "type": "string" |
| 334 | } |
| 335 | }, |
| 336 | "required": [ |
| 337 | "operation" |
| 338 | ], |
| 339 | "type": "object" |
| 340 | } |
| 341 | }, |
| 342 | { |
| 343 | "Name": "edit_file", |
| 344 | "Description": "Replace an exact string in a file with another. old_string must occur exactly once; add surrounding context to disambiguate. Use for targeted edits instead of rewriting the whole file.", |
| 345 | "ReadOnly": false, |
| 346 | "Schema": { |
| 347 | "properties": { |
| 348 | "new_string": { |
| 349 | "description": "Replacement text (may be empty to delete)", |
| 350 | "type": "string" |
| 351 | }, |
| 352 | "old_string": { |
| 353 | "description": "Exact text to replace (must be unique in the file)", |
| 354 | "type": "string" |
| 355 | }, |
| 356 | "path": { |
| 357 | "description": "File path", |
| 358 | "type": "string" |
| 359 | } |
| 360 | }, |
| 361 | "required": [ |
| 362 | "new_string", |
| 363 | "old_string", |
| 364 | "path" |
| 365 | ], |
| 366 | "type": "object" |
| 367 | } |
| 368 | }, |
| 369 | { |
| 370 | "Name": "explore", |
| 371 | "Description": "Run a focused read-only codebase investigation in an isolated subagent. Use for broad survey questions across many files — 'find all places that X', 'how does Y work across the project', 'audit Z'. Returns one distilled answer with file:line citations. Its reads + reasoning never enter your context, unlike chained read_file.", |
| 372 | "ReadOnly": false, |
| 373 | "Schema": { |
| 374 | "properties": { |
| 375 | "continue_from": { |
| 376 | "description": "Continue a prior compatible subagent transcript in the current conversation context. Pass only the 'sa_...' value from the prior result's 'Subagent reference: ...' line.", |
| 377 | "type": "string" |
| 378 | }, |
| 379 | "task": { |
| 380 | "description": "Concrete investigation question. The subagent has none of your context — write a self-contained prompt naming the symbol / pattern / behavior to survey.", |
| 381 | "type": "string" |
| 382 | } |
| 383 | }, |
| 384 | "required": [ |
| 385 | "task" |
| 386 | ], |
| 387 | "type": "object" |
| 388 | } |
| 389 | }, |
| 390 | { |
| 391 | "Name": "fleet", |
| 392 | "Description": "Dispatch 2–64 sub-agent tasks in parallel and return bounded previews plus stable Subagent references for full-result retrieval from completed persisted children with read_subagent_result. Each item may select a profile, model, effort, tools, write_paths, or read_only. Multiple writers must declare non-overlapping write_paths; omitted write_paths claim the whole workspace, so two or more writers without paths fail preflight before any task starts. Independent failure is the default: one failure does not cancel others. Background mode returns a fleet job id collectable with wait.", |
| 393 | "ReadOnly": false, |
| 394 | "Schema": { |
| 395 | "properties": { |
| 396 | "run_in_background": { |
| 397 | "description": "Run the whole fleet asynchronously and return a job id collectable with wait. Items queue for concurrency/write slots inside the job.", |
| 398 | "type": "boolean" |
| 399 | }, |
| 400 | "tasks": { |
| 401 | "description": "Array of 2–64 sub-tasks to run under the session scheduler.", |
| 402 | "items": { |
| 403 | "properties": { |
| 404 | "description": { |
| 405 | "description": "Optional short label shown in the job list.", |
| 406 | "type": "string" |
| 407 | }, |
| 408 | "effort": { |
| 409 | "description": "Optional reasoning effort override.", |
| 410 | "type": "string" |
| 411 | }, |
| 412 | "max_steps": { |
| 413 | "description": "Optional max tool-call rounds.", |
| 414 | "minimum": 1, |
| 415 | "type": "integer" |
| 416 | }, |
| 417 | "model": { |
| 418 | "description": "Optional model override.", |
| 419 | "type": "string" |
| 420 | }, |
| 421 | "profile": { |
| 422 | "description": "Optional runAs=subagent profile name.", |
| 423 | "type": "string" |
| 424 | }, |
| 425 | "prompt": { |
| 426 | "description": "Task prompt for the sub-agent.", |
| 427 | "type": "string" |
| 428 | }, |
| 429 | "read_only": { |
| 430 | "description": "Force the read-only registry even if the profile is writable.", |
| 431 | "type": "boolean" |
| 432 | }, |
| 433 | "tools": { |
| 434 | "description": "Optional tool whitelist (intersected with profile allowed-tools).", |
| 435 | "items": { |
| 436 | "type": "string" |
| 437 | }, |
| 438 | "type": "array" |
| 439 | }, |
| 440 | "write_paths": { |
| 441 | "description": "Write targets for this item. Parallel writers must declare non-overlapping paths. Omitting write_paths claims the whole workspace; multiple whole-workspace claims (or any path overlap) fail preflight and start nothing.", |
| 442 | "items": { |
| 443 | "type": "string" |
| 444 | }, |
| 445 | "type": "array" |
| 446 | } |
| 447 | }, |
| 448 | "required": [ |
| 449 | "prompt" |
| 450 | ], |
| 451 | "type": "object" |
| 452 | }, |
| 453 | "maxItems": 64, |
| 454 | "minItems": 2, |
| 455 | "type": "array" |
| 456 | } |
| 457 | }, |
| 458 | "required": [ |
| 459 | "tasks" |
| 460 | ], |
| 461 | "type": "object" |
| 462 | } |
| 463 | }, |
| 464 | { |
| 465 | "Name": "forget", |
| 466 | "Description": "Delete a saved memory by name when it is wrong, stale, or superseded, so it stops loading into future sessions. Use the stable project/\u003cname\u003e.md or global/\u003cname\u003e.md reference returned by memory search/read/list. Prefer updating a memory with `remember` (reuse its name) over forget-then-recreate; reach for forget only when the fact should no longer exist at all.", |
| 467 | "ReadOnly": false, |
| 468 | "Schema": { |
| 469 | "properties": { |
| 470 | "name": { |
| 471 | "description": "Stable memory id, project/\u003cname\u003e.md or global/\u003cname\u003e.md reference, or legacy slug of the memory to archive.", |
| 472 | "type": "string" |
| 473 | } |
| 474 | }, |
| 475 | "required": [ |
| 476 | "name" |
| 477 | ], |
| 478 | "type": "object" |
| 479 | } |
| 480 | }, |
| 481 | { |
| 482 | "Name": "glob", |
| 483 | "Description": "Find files matching a glob pattern (e.g. \"*.go\", \"internal/*/*.go\", \"**/*.test.ts\"). Supports shell metacharacters * ? [] and the recursive ** pattern.", |
| 484 | "ReadOnly": true, |
| 485 | "Schema": { |
| 486 | "properties": { |
| 487 | "pattern": { |
| 488 | "description": "Glob pattern (supports ** for recursive matching)", |
| 489 | "type": "string" |
| 490 | }, |
| 491 | "timeout_seconds": { |
| 492 | "description": "Walk timeout in seconds (default 30, max 300); partial results are returned when it expires", |
| 493 | "type": "integer" |
| 494 | } |
| 495 | }, |
| 496 | "required": [ |
| 497 | "pattern" |
| 498 | ], |
| 499 | "type": "object" |
| 500 | } |
| 501 | }, |
| 502 | { |
| 503 | "Name": "grep", |
| 504 | "Description": "Search for a regular expression in a file, or recursively under a directory (skips hidden files and files matched by .gitignore). Returns matching lines as path:line:text, capped at 200 matches.", |
| 505 | "ReadOnly": true, |
| 506 | "Schema": { |
| 507 | "properties": { |
| 508 | "path": { |
| 509 | "description": "File or directory to search (default \".\")", |
| 510 | "type": "string" |
| 511 | }, |
| 512 | "pattern": { |
| 513 | "description": "Regular expression (RE2 syntax)", |
| 514 | "type": "string" |
| 515 | }, |
| 516 | "timeout_seconds": { |
| 517 | "description": "Abort and return partial matches after this many seconds (default 30, max 300). Raise it for a large tree; lower it for a quick probe.", |
| 518 | "minimum": 1, |
| 519 | "type": "integer" |
| 520 | } |
| 521 | }, |
| 522 | "required": [ |
| 523 | "pattern" |
| 524 | ], |
| 525 | "type": "object" |
| 526 | } |
| 527 | }, |
| 528 | { |
| 529 | "Name": "history", |
| 530 | "Description": "Search saved local session history with lightweight BM25 retrieval, then read messages around a hit. Use search when past decisions, failed attempts, commands, or tool inputs may help the current task; use around with a returned session_path and message_index to inspect the nearby transcript. By default it searches user text, assistant text, tool inputs, and tool errors; normal tool outputs are excluded unless kind includes tool_output.", |
| 531 | "ReadOnly": true, |
| 532 | "Schema": { |
| 533 | "properties": { |
| 534 | "after": { |
| 535 | "description": "Messages after message_index for operation=around, default 3, max 10.", |
| 536 | "type": "integer" |
| 537 | }, |
| 538 | "before": { |
| 539 | "description": "Messages before message_index for operation=around, default 3, max 10.", |
| 540 | "type": "integer" |
| 541 | }, |
| 542 | "kind": { |
| 543 | "description": "History parts to search. Defaults to user_text, assistant_text, tool_input, and tool_error.", |
| 544 | "items": { |
| 545 | "enum": [ |
| 546 | "user_text", |
| 547 | "assistant_text", |
| 548 | "tool_input", |
| 549 | "tool_error", |
| 550 | "tool_output" |
| 551 | ], |
| 552 | "type": "string" |
| 553 | }, |
| 554 | "type": "array" |
| 555 | }, |
| 556 | "limit": { |
| 557 | "description": "Maximum search hits to return, default 8, max 20.", |
| 558 | "type": "integer" |
| 559 | }, |
| 560 | "message_index": { |
| 561 | "description": "Message index from a search hit. Required for operation=around.", |
| 562 | "type": "integer" |
| 563 | }, |
| 564 | "operation": { |
| 565 | "description": "search ranks saved history; around returns nearby messages for a search hit.", |
| 566 | "enum": [ |
| 567 | "search", |
| 568 | "around" |
| 569 | ], |
| 570 | "type": "string" |
| 571 | }, |
| 572 | "query": { |
| 573 | "description": "Search query for operation=search.", |
| 574 | "type": "string" |
| 575 | }, |
| 576 | "scope": { |
| 577 | "description": "project searches the current session directory; global also includes compacted-history archives.", |
| 578 | "enum": [ |
| 579 | "project", |
| 580 | "global" |
| 581 | ], |
| 582 | "type": "string" |
| 583 | }, |
| 584 | "session_path": { |
| 585 | "description": "Path from a search hit. Required for operation=around.", |
| 586 | "type": "string" |
| 587 | }, |
| 588 | "tool_name": { |
| 589 | "description": "Optional tool-name filter for tool_input, tool_error, or tool_output.", |
| 590 | "type": "string" |
| 591 | } |
| 592 | }, |
| 593 | "required": [ |
| 594 | "operation" |
| 595 | ], |
| 596 | "type": "object" |
| 597 | } |
| 598 | }, |
| 599 | { |
| 600 | "Name": "install_skill", |
| 601 | "Description": "Author and save a new skill — a reusable playbook future turns invoke via run_skill (or /\u003cname\u003e). Runnable immediately this turn; appears in the pinned Skills index on the next launch. 'project' (default) writes to \u003crepo\u003e/.reasonix/skills/ (this workspace only); 'global' writes to the Reasonix home skills directory (every project).", |
| 602 | "ReadOnly": false, |
| 603 | "Schema": { |
| 604 | "properties": { |
| 605 | "allowedTools": { |
| 606 | "description": "Optional tool allowlist for runAs=subagent (e.g. ['read_file','grep']).", |
| 607 | "items": { |
| 608 | "type": "string" |
| 609 | }, |
| 610 | "type": "array" |
| 611 | }, |
| 612 | "body": { |
| 613 | "description": "Markdown playbook. For subagent skills, write the subagent's persona/rules — it gets no context besides 'arguments' at runtime.", |
| 614 | "type": "string" |
| 615 | }, |
| 616 | "description": { |
| 617 | "description": "≤120-char one-liner shown in the pinned Skills index — future agents read it to decide whether to invoke.", |
| 618 | "type": "string" |
| 619 | }, |
| 620 | "effort": { |
| 621 | "description": "Optional effort for runAs=subagent (e.g. high, max). Ignored otherwise.", |
| 622 | "type": "string" |
| 623 | }, |
| 624 | "model": { |
| 625 | "description": "Optional model override for runAs=subagent (a configured provider/model name). Ignored otherwise.", |
| 626 | "type": "string" |
| 627 | }, |
| 628 | "name": { |
| 629 | "description": "Identifier — letters/digits/_/-/., 1-64 chars, starts alphanumeric. Becomes the skill folder name under the selected skills directory.", |
| 630 | "type": "string" |
| 631 | }, |
| 632 | "runAs": { |
| 633 | "description": "inline (default) folds the body into the parent turn; subagent spawns an isolated child loop returning only its final answer (use for context-heavy work).", |
| 634 | "enum": [ |
| 635 | "inline", |
| 636 | "subagent" |
| 637 | ], |
| 638 | "type": "string" |
| 639 | }, |
| 640 | "scope": { |
| 641 | "description": "Where to write. Defaults to project when a workspace exists, else global.", |
| 642 | "enum": [ |
| 643 | "project", |
| 644 | "global" |
| 645 | ], |
| 646 | "type": "string" |
| 647 | } |
| 648 | }, |
| 649 | "required": [ |
| 650 | "body", |
| 651 | "description", |
| 652 | "name" |
| 653 | ], |
| 654 | "type": "object" |
| 655 | } |
| 656 | }, |
| 657 | { |
| 658 | "Name": "install_source", |
| 659 | "Description": "Plan, install, or uninstall a Reasonix skill, MCP server, or plugin package from a URL, local file/folder, .mcp.json, executable, or package name. Two-phase: with apply=false (default) returns a deterministic plan with per-action risk level; with apply=true copies/registers skills, connects/persists MCP servers, or installs plugin packages after validation. op='uninstall' removes a previously installed skill, MCP server, or plugin package by name.", |
| 660 | "ReadOnly": false, |
| 661 | "Schema": { |
| 662 | "properties": { |
| 663 | "apply": { |
| 664 | "description": "false (default) only returns an install plan; true performs the planned writes/connects. Ignored for op=uninstall.", |
| 665 | "type": "boolean" |
| 666 | }, |
| 667 | "args": { |
| 668 | "description": "Optional stdio MCP args override.", |
| 669 | "items": { |
| 670 | "type": "string" |
| 671 | }, |
| 672 | "type": "array" |
| 673 | }, |
| 674 | "command": { |
| 675 | "description": "Optional stdio MCP command override for package/local executable installs.", |
| 676 | "type": "string" |
| 677 | }, |
| 678 | "env": { |
| 679 | "additionalProperties": { |
| 680 | "type": "string" |
| 681 | }, |
| 682 | "description": "Environment variables for stdio MCP servers.", |
| 683 | "type": "object" |
| 684 | }, |
| 685 | "headers": { |
| 686 | "additionalProperties": { |
| 687 | "type": "string" |
| 688 | }, |
| 689 | "description": "HTTP headers for remote MCP servers. Prefer ${VAR} placeholders for secrets.", |
| 690 | "type": "object" |
| 691 | }, |
| 692 | "kind": { |
| 693 | "description": "Capability kind. Defaults to auto.", |
| 694 | "enum": [ |
| 695 | "auto", |
| 696 | "skill", |
| 697 | "mcp", |
| 698 | "plugin" |
| 699 | ], |
| 700 | "type": "string" |
| 701 | }, |
| 702 | "mode": { |
| 703 | "description": "Skill install mode. auto registers multi-skill roots and copies single skills into the canonical \u003cskill-name\u003e/SKILL.md layout; copy copies skill files/folders; link creates symlinks; register adds a skill root to [skills].paths.", |
| 704 | "enum": [ |
| 705 | "auto", |
| 706 | "copy", |
| 707 | "link", |
| 708 | "register" |
| 709 | ], |
| 710 | "type": "string" |
| 711 | }, |
| 712 | "name": { |
| 713 | "description": "Optional override for the installed MCP server or single skill name. Required for op=uninstall when removing by name.", |
| 714 | "type": "string" |
| 715 | }, |
| 716 | "op": { |
| 717 | "description": "Whether to install (default) or uninstall.", |
| 718 | "enum": [ |
| 719 | "install", |
| 720 | "uninstall" |
| 721 | ], |
| 722 | "type": "string" |
| 723 | }, |
| 724 | "planId": { |
| 725 | "description": "Optional. Echoed from a previous planned response to confirm the host is approving the same plan.", |
| 726 | "type": "string" |
| 727 | }, |
| 728 | "replace": { |
| 729 | "description": "Allow replacing an existing MCP config entry with the same name. Skills still refuse to overwrite existing files.", |
| 730 | "type": "boolean" |
| 731 | }, |
| 732 | "scope": { |
| 733 | "description": "Where to persist config or copy skills. MCP installs default to global so every project can use them; project-root .mcp.json imports default to project; skills default to project when a workspace exists, otherwise global.", |
| 734 | "enum": [ |
| 735 | "project", |
| 736 | "global" |
| 737 | ], |
| 738 | "type": "string" |
| 739 | }, |
| 740 | "source": { |
| 741 | "description": "URL, local file/folder path, .mcp.json path, or package name to install from. Ignored when op=uninstall (use name instead).", |
| 742 | "type": "string" |
| 743 | }, |
| 744 | "strict": { |
| 745 | "description": "Skill install strictness. true (default) requires name+description frontmatter; false copies the file as-is (use only for files you trust).", |
| 746 | "type": "boolean" |
| 747 | }, |
| 748 | "tier": { |
| 749 | "description": "Persisted MCP startup tier. Defaults to background.", |
| 750 | "enum": [ |
| 751 | "background", |
| 752 | "eager" |
| 753 | ], |
| 754 | "type": "string" |
| 755 | }, |
| 756 | "transport": { |
| 757 | "description": "MCP transport override. URL sources default to http unless --sse-like; package sources default to stdio.", |
| 758 | "enum": [ |
| 759 | "auto", |
| 760 | "stdio", |
| 761 | "http", |
| 762 | "sse" |
| 763 | ], |
| 764 | "type": "string" |
| 765 | } |
| 766 | }, |
| 767 | "required": [], |
| 768 | "type": "object" |
| 769 | } |
| 770 | }, |
| 771 | { |
| 772 | "Name": "kill_shell", |
| 773 | "Description": "Terminate a running background job (bash or task) started with run_in_background. A no-op if the job has already finished or the id is unknown.", |
| 774 | "ReadOnly": false, |
| 775 | "Schema": { |
| 776 | "properties": { |
| 777 | "job_id": { |
| 778 | "description": "The background job id to terminate (e.g. \"bash-1\").", |
| 779 | "type": "string" |
| 780 | } |
| 781 | }, |
| 782 | "required": [ |
| 783 | "job_id" |
| 784 | ], |
| 785 | "type": "object" |
| 786 | } |
| 787 | }, |
| 788 | { |
| 789 | "Name": "list_sessions", |
| 790 | "Description": "List saved AI conversation sessions. Returns timestamp, model, turn count, preview, and file for each visible session, newest first. Uses session metadata (branch sidecar timestamps). Use read_session to view a session's conversation.", |
| 791 | "ReadOnly": true, |
| 792 | "Schema": { |
| 793 | "properties": {}, |
| 794 | "required": [], |
| 795 | "type": "object" |
| 796 | } |
| 797 | }, |
| 798 | { |
| 799 | "Name": "ls", |
| 800 | "Description": "List the entries of a directory. Directories are shown with a trailing slash; files show their byte size. Set recursive=true to list all nested files depth-first (skips .git/node_modules).", |
| 801 | "ReadOnly": true, |
| 802 | "Schema": { |
| 803 | "properties": { |
| 804 | "path": { |
| 805 | "description": "Directory path (default \".\")", |
| 806 | "type": "string" |
| 807 | }, |
| 808 | "recursive": { |
| 809 | "description": "When true, recursively list all nested files (default false)", |
| 810 | "type": "boolean" |
| 811 | } |
| 812 | }, |
| 813 | "type": "object" |
| 814 | } |
| 815 | }, |
| 816 | { |
| 817 | "Name": "lsp_definition", |
| 818 | "Description": "Jump to where a symbol is defined. Give the file, the 1-based line the symbol appears on, and the symbol text itself.", |
| 819 | "ReadOnly": true, |
| 820 | "Schema": { |
| 821 | "properties": { |
| 822 | "file": { |
| 823 | "description": "Path to the source file, relative to the workspace root or absolute.", |
| 824 | "type": "string" |
| 825 | }, |
| 826 | "line": { |
| 827 | "description": "1-based line number the symbol appears on.", |
| 828 | "type": "integer" |
| 829 | }, |
| 830 | "symbol": { |
| 831 | "description": "The exact symbol text on that line, e.g. \"executeBatch\". Used to locate the column.", |
| 832 | "type": "string" |
| 833 | } |
| 834 | }, |
| 835 | "required": [ |
| 836 | "file", |
| 837 | "line", |
| 838 | "symbol" |
| 839 | ], |
| 840 | "type": "object" |
| 841 | } |
| 842 | }, |
| 843 | { |
| 844 | "Name": "lsp_diagnostics", |
| 845 | "Description": "Report compiler/linter diagnostics (errors, warnings) for a file from its language server. Use after editing to check the change compiles.", |
| 846 | "ReadOnly": true, |
| 847 | "Schema": { |
| 848 | "properties": { |
| 849 | "file": { |
| 850 | "description": "Path to the source file, relative to the workspace root or absolute.", |
| 851 | "type": "string" |
| 852 | } |
| 853 | }, |
| 854 | "required": [ |
| 855 | "file" |
| 856 | ], |
| 857 | "type": "object" |
| 858 | } |
| 859 | }, |
| 860 | { |
| 861 | "Name": "lsp_hover", |
| 862 | "Description": "Show the type signature and documentation for a symbol. Give the file, the 1-based line, and the symbol text.", |
| 863 | "ReadOnly": true, |
| 864 | "Schema": { |
| 865 | "properties": { |
| 866 | "file": { |
| 867 | "description": "Path to the source file, relative to the workspace root or absolute.", |
| 868 | "type": "string" |
| 869 | }, |
| 870 | "line": { |
| 871 | "description": "1-based line number the symbol appears on.", |
| 872 | "type": "integer" |
| 873 | }, |
| 874 | "symbol": { |
| 875 | "description": "The exact symbol text on that line, e.g. \"executeBatch\". Used to locate the column.", |
| 876 | "type": "string" |
| 877 | } |
| 878 | }, |
| 879 | "required": [ |
| 880 | "file", |
| 881 | "line", |
| 882 | "symbol" |
| 883 | ], |
| 884 | "type": "object" |
| 885 | } |
| 886 | }, |
| 887 | { |
| 888 | "Name": "lsp_references", |
| 889 | "Description": "List every reference to a symbol across the workspace. Give the file, the 1-based line, and the symbol text.", |
| 890 | "ReadOnly": true, |
| 891 | "Schema": { |
| 892 | "properties": { |
| 893 | "file": { |
| 894 | "description": "Path to the source file, relative to the workspace root or absolute.", |
| 895 | "type": "string" |
| 896 | }, |
| 897 | "line": { |
| 898 | "description": "1-based line number the symbol appears on.", |
| 899 | "type": "integer" |
| 900 | }, |
| 901 | "symbol": { |
| 902 | "description": "The exact symbol text on that line, e.g. \"executeBatch\". Used to locate the column.", |
| 903 | "type": "string" |
| 904 | } |
| 905 | }, |
| 906 | "required": [ |
| 907 | "file", |
| 908 | "line", |
| 909 | "symbol" |
| 910 | ], |
| 911 | "type": "object" |
| 912 | } |
| 913 | }, |
| 914 | { |
| 915 | "Name": "memory", |
| 916 | "Description": "Search, list, and read saved background memories for this project, including explicitly global facts. Use this before saving a new memory to avoid duplicates, and when a saved memory from the index looks relevant but needs its full body. This tool is read-only; use remember to save or update a memory, and forget to archive one.", |
| 917 | "ReadOnly": true, |
| 918 | "Schema": { |
| 919 | "properties": { |
| 920 | "limit": { |
| 921 | "description": "Maximum search/list results to return, default 8, max 20.", |
| 922 | "type": "integer" |
| 923 | }, |
| 924 | "name": { |
| 925 | "description": "Stable memory id, project/\u003cname\u003e.md or global/\u003cname\u003e.md reference, or legacy slug for operation=read.", |
| 926 | "type": "string" |
| 927 | }, |
| 928 | "operation": { |
| 929 | "description": "search ranks saved memories; read returns one full memory by stable id or legacy name; list returns the saved-memory index.", |
| 930 | "enum": [ |
| 931 | "search", |
| 932 | "read", |
| 933 | "list" |
| 934 | ], |
| 935 | "type": "string" |
| 936 | }, |
| 937 | "query": { |
| 938 | "description": "Search query for operation=search.", |
| 939 | "type": "string" |
| 940 | }, |
| 941 | "scope": { |
| 942 | "description": "Optional scope filter for search or list.", |
| 943 | "enum": [ |
| 944 | "project", |
| 945 | "global" |
| 946 | ], |
| 947 | "type": "string" |
| 948 | }, |
| 949 | "type": { |
| 950 | "description": "Optional memory type filter for search or list.", |
| 951 | "enum": [ |
| 952 | "user", |
| 953 | "feedback", |
| 954 | "project", |
| 955 | "reference" |
| 956 | ], |
| 957 | "type": "string" |
| 958 | } |
| 959 | }, |
| 960 | "required": [ |
| 961 | "operation" |
| 962 | ], |
| 963 | "type": "object" |
| 964 | } |
| 965 | }, |
| 966 | { |
| 967 | "Name": "move_file", |
| 968 | "Description": "Move or rename a file from source_path to destination_path. Creates the destination parent directory as needed. Use instead of shell mv, Move-Item, or ren for file moves so workspace confinement and file-edit permissions apply.", |
| 969 | "ReadOnly": false, |
| 970 | "Schema": { |
| 971 | "properties": { |
| 972 | "destination_path": { |
| 973 | "description": "Destination file path; must not already exist", |
| 974 | "type": "string" |
| 975 | }, |
| 976 | "source_path": { |
| 977 | "description": "Existing file path to move", |
| 978 | "type": "string" |
| 979 | } |
| 980 | }, |
| 981 | "required": [ |
| 982 | "destination_path", |
| 983 | "source_path" |
| 984 | ], |
| 985 | "type": "object" |
| 986 | } |
| 987 | }, |
| 988 | { |
| 989 | "Name": "multi_edit", |
| 990 | "Description": "Apply a list of edits to a single file atomically: each edit runs against the result of the previous one, all in memory; the file is rewritten only if every edit succeeds. Cheaper and safer than chaining edit_file calls — a failure in step 3 leaves the file untouched instead of half-edited.", |
| 991 | "ReadOnly": false, |
| 992 | "Schema": { |
| 993 | "properties": { |
| 994 | "edits": { |
| 995 | "description": "Ordered edits. Each step sees the file as left by the previous step.", |
| 996 | "items": { |
| 997 | "properties": { |
| 998 | "new_string": { |
| 999 | "description": "Replacement text (empty deletes).", |
| 1000 | "type": "string" |
| 1001 | }, |
| 1002 | "old_string": { |
| 1003 | "description": "Exact text to find. Without replace_all, must match exactly once.", |
| 1004 | "type": "string" |
| 1005 | }, |
| 1006 | "replace_all": { |
| 1007 | "description": "Replace every occurrence instead of requiring uniqueness.", |
| 1008 | "type": "boolean" |
| 1009 | } |
| 1010 | }, |
| 1011 | "required": [ |
| 1012 | "new_string", |
| 1013 | "old_string" |
| 1014 | ], |
| 1015 | "type": "object" |
| 1016 | }, |
| 1017 | "minItems": 1, |
| 1018 | "type": "array" |
| 1019 | }, |
| 1020 | "path": { |
| 1021 | "description": "File path", |
| 1022 | "type": "string" |
| 1023 | } |
| 1024 | }, |
| 1025 | "required": [ |
| 1026 | "edits", |
| 1027 | "path" |
| 1028 | ], |
| 1029 | "type": "object" |
| 1030 | } |
| 1031 | }, |
| 1032 | { |
| 1033 | "Name": "notebook_edit", |
| 1034 | "Description": "Edit one cell of a Jupyter notebook (.ipynb). Target a cell by 0-based cell_number (or cell_id). edit_mode: \"replace\" (default) swaps the cell's source; \"insert\" adds a new cell after cell_number (use -1 to prepend at the top), taking cell_type and new_source; \"delete\" removes the cell. cell_type is \"code\" or \"markdown\" (required for insert). Editing a code cell clears its outputs. Prefer this over edit_file for notebooks — it keeps the JSON valid.", |
| 1035 | "ReadOnly": false, |
| 1036 | "Schema": { |
| 1037 | "properties": { |
| 1038 | "cell_id": { |
| 1039 | "description": "Target the cell by its id instead of cell_number (replace/delete).", |
| 1040 | "type": "string" |
| 1041 | }, |
| 1042 | "cell_number": { |
| 1043 | "description": "0-based index of the target cell. For insert, the new cell goes after this one (-1 prepends).", |
| 1044 | "type": "integer" |
| 1045 | }, |
| 1046 | "cell_type": { |
| 1047 | "description": "Cell type for insert (and optional retype on replace).", |
| 1048 | "enum": [ |
| 1049 | "code", |
| 1050 | "markdown" |
| 1051 | ], |
| 1052 | "type": "string" |
| 1053 | }, |
| 1054 | "edit_mode": { |
| 1055 | "description": "replace (default), insert, or delete.", |
| 1056 | "enum": [ |
| 1057 | "replace", |
| 1058 | "insert", |
| 1059 | "delete" |
| 1060 | ], |
| 1061 | "type": "string" |
| 1062 | }, |
| 1063 | "new_source": { |
| 1064 | "description": "The cell's new source text (replace/insert).", |
| 1065 | "type": "string" |
| 1066 | }, |
| 1067 | "path": { |
| 1068 | "description": "Path to the .ipynb notebook.", |
| 1069 | "type": "string" |
| 1070 | } |
| 1071 | }, |
| 1072 | "required": [ |
| 1073 | "path" |
| 1074 | ], |
| 1075 | "type": "object" |
| 1076 | } |
| 1077 | }, |
| 1078 | { |
| 1079 | "Name": "parallel_tasks", |
| 1080 | "Description": "Dispatch multiple read-only sub-agent tasks concurrently. Blocks until all complete, then returns a bounded preview and a stable Subagent reference for every completed persisted child; use read_subagent_result to page through any full answer without combined-result truncation.", |
| 1081 | "ReadOnly": true, |
| 1082 | "Schema": { |
| 1083 | "properties": { |
| 1084 | "tasks": { |
| 1085 | "description": "Array of sub-task descriptions to run in parallel.", |
| 1086 | "items": { |
| 1087 | "properties": { |
| 1088 | "description": { |
| 1089 | "description": "Optional short label shown in the job list.", |
| 1090 | "type": "string" |
| 1091 | }, |
| 1092 | "effort": { |
| 1093 | "description": "Optional reasoning effort override.", |
| 1094 | "type": "string" |
| 1095 | }, |
| 1096 | "max_steps": { |
| 1097 | "description": "Optional max tool-call rounds. Defaults to half the parent agent's step budget (minimum 5), same as task.", |
| 1098 | "minimum": 1, |
| 1099 | "type": "integer" |
| 1100 | }, |
| 1101 | "model": { |
| 1102 | "description": "Optional model override.", |
| 1103 | "type": "string" |
| 1104 | }, |
| 1105 | "prompt": { |
| 1106 | "description": "The task prompt for the sub-agent.", |
| 1107 | "type": "string" |
| 1108 | }, |
| 1109 | "tools": { |
| 1110 | "description": "Optional tool whitelist for the sub-agent.", |
| 1111 | "items": { |
| 1112 | "type": "string" |
| 1113 | }, |
| 1114 | "type": "array" |
| 1115 | } |
| 1116 | }, |
| 1117 | "required": [ |
| 1118 | "prompt" |
| 1119 | ], |
| 1120 | "type": "object" |
| 1121 | }, |
| 1122 | "type": "array" |
| 1123 | } |
| 1124 | }, |
| 1125 | "required": [ |
| 1126 | "tasks" |
| 1127 | ], |
| 1128 | "type": "object" |
| 1129 | } |
| 1130 | }, |
| 1131 | { |
| 1132 | "Name": "read_file", |
| 1133 | "Description": "Read a text file with optional line offset/limit. Output prefixes each line with its 1-based number (e.g. ` 42→...`) so subsequent edit_file calls can target exact lines. Use `offset` and `limit` to page through large files; the tool reports total length and pagination hints in a trailer.", |
| 1134 | "ReadOnly": true, |
| 1135 | "Schema": { |
| 1136 | "properties": { |
| 1137 | "limit": { |
| 1138 | "description": "Maximum lines to return (default 2000)", |
| 1139 | "minimum": 1, |
| 1140 | "type": "integer" |
| 1141 | }, |
| 1142 | "offset": { |
| 1143 | "description": "0-based line offset to start reading from (default 0)", |
| 1144 | "minimum": 0, |
| 1145 | "type": "integer" |
| 1146 | }, |
| 1147 | "path": { |
| 1148 | "description": "File path", |
| 1149 | "type": "string" |
| 1150 | } |
| 1151 | }, |
| 1152 | "required": [ |
| 1153 | "path" |
| 1154 | ], |
| 1155 | "type": "object" |
| 1156 | } |
| 1157 | }, |
| 1158 | { |
| 1159 | "Name": "read_only_skill", |
| 1160 | "Description": "Invoke a skill in read-only mode. Inline skills are loaded into context like read_skill. `[🧬 subagent]` skills run in an isolated ephemeral read-only subagent with only read-only research tools and safe foreground bash; no writes, installers, memory mutation, continuation/fork, background jobs, or writer-capable delegation are available. Read-only nested delegation may be available until max_subagent_depth is reached. Pass `name` as the bare skill identifier and `arguments` as the concrete task.", |
| 1161 | "ReadOnly": true, |
| 1162 | "Schema": { |
| 1163 | "properties": { |
| 1164 | "arguments": { |
| 1165 | "description": "Free-form arguments. For inline skills: appended as an 'Arguments:' line. For subagent skills: REQUIRED — becomes the read-only subagent's entire task.", |
| 1166 | "type": "string" |
| 1167 | }, |
| 1168 | "name": { |
| 1169 | "description": "Skill identifier as it appears in the pinned Skills index. Just the identifier, not the [🧬 subagent] tag.", |
| 1170 | "type": "string" |
| 1171 | } |
| 1172 | }, |
| 1173 | "required": [ |
| 1174 | "name" |
| 1175 | ], |
| 1176 | "type": "object" |
| 1177 | } |
| 1178 | }, |
| 1179 | { |
| 1180 | "Name": "read_only_task", |
| 1181 | "Description": "Spawn a read-only research sub-agent for a focused investigation. The sub-agent runs in an isolated, ephemeral session with read-only tools only; bash is wrapped to allow only permission-classified foreground read-only commands. It cannot write files, install capabilities, mutate memory, run background jobs, continue/fork transcripts, or delegate to writer-capable agents. Read-only nested delegation may be available until max_subagent_depth is reached. Only its final answer is returned.", |
| 1182 | "ReadOnly": true, |
| 1183 | "Schema": { |
| 1184 | "properties": { |
| 1185 | "description": { |
| 1186 | "description": "Short label for the read-only sub-task (3-7 words). Surfaced in the dispatch line so the user sees what's running.", |
| 1187 | "type": "string" |
| 1188 | }, |
| 1189 | "effort": { |
| 1190 | "description": "Optional reasoning effort for the sub-agent (e.g. high, max).", |
| 1191 | "type": "string" |
| 1192 | }, |
| 1193 | "max_steps": { |
| 1194 | "description": "Optional cap on tool-call rounds. Defaults to half the parent's cap (min 5).", |
| 1195 | "minimum": 1, |
| 1196 | "type": "integer" |
| 1197 | }, |
| 1198 | "model": { |
| 1199 | "description": "Optional model override for the sub-agent (a configured provider/model name).", |
| 1200 | "type": "string" |
| 1201 | }, |
| 1202 | "prompt": { |
| 1203 | "description": "What the read-only sub-agent should investigate. Be specific about the evidence or summary to return — the sub-agent does not see this conversation.", |
| 1204 | "type": "string" |
| 1205 | }, |
| 1206 | "tools": { |
| 1207 | "description": "Optional read-only tool whitelist. Writer, installer, memory mutation, background job, and delegation tools are never exposed.", |
| 1208 | "items": { |
| 1209 | "type": "string" |
| 1210 | }, |
| 1211 | "type": "array" |
| 1212 | } |
| 1213 | }, |
| 1214 | "required": [ |
| 1215 | "prompt" |
| 1216 | ], |
| 1217 | "type": "object" |
| 1218 | } |
| 1219 | }, |
| 1220 | { |
| 1221 | "Name": "read_session", |
| 1222 | "Description": "Read a saved AI conversation session by file name (e.g. \"20260618-231556.000000000-gpt-4.jsonl\"). Returns a bounded, privacy-safe view: each message truncated to 2000 runes, no reasoning content, no system prompts, no tool result content (opt-in via show_tool_results). Use list_sessions to discover available sessions.", |
| 1223 | "ReadOnly": true, |
| 1224 | "Schema": { |
| 1225 | "properties": { |
| 1226 | "max_turns": { |
| 1227 | "description": "Maximum user-assistant turns to return (default 50). 0 = no limit.", |
| 1228 | "type": "integer" |
| 1229 | }, |
| 1230 | "session": { |
| 1231 | "description": "Session file name (e.g. \"20260618-231556.000000000-gpt-4.jsonl\") or full path. Use list_sessions to see available sessions.", |
| 1232 | "type": "string" |
| 1233 | }, |
| 1234 | "show_tool_results": { |
| 1235 | "description": "When true, include tool result content (default false). Tool results may contain secrets, command output, environment data, or private file contents.", |
| 1236 | "type": "boolean" |
| 1237 | } |
| 1238 | }, |
| 1239 | "required": [ |
| 1240 | "session" |
| 1241 | ], |
| 1242 | "type": "object" |
| 1243 | } |
| 1244 | }, |
| 1245 | { |
| 1246 | "Name": "read_skill", |
| 1247 | "Description": "Load an inline playbook from the Skills index into your context WITHOUT running anything — the skill body returns as a tool result you read and follow. This is the read-only alternative when no subagent execution is needed. Pass `name` as the BARE identifier (e.g. 'commit'), NOT the `[🧬 subagent]` tag. Subagent-tagged skills are rejected: use run_skill (or the dedicated tool) for those, since they execute work.", |
| 1248 | "ReadOnly": true, |
| 1249 | "Schema": { |
| 1250 | "properties": { |
| 1251 | "arguments": { |
| 1252 | "description": "Optional free-form arguments, appended as an 'Arguments:' line; the skill's own instructions decide how to use them.", |
| 1253 | "type": "string" |
| 1254 | }, |
| 1255 | "name": { |
| 1256 | "description": "Inline skill identifier as it appears in the pinned Skills index. Just the identifier, not the [🧬 subagent] tag.", |
| 1257 | "type": "string" |
| 1258 | } |
| 1259 | }, |
| 1260 | "required": [ |
| 1261 | "name" |
| 1262 | ], |
| 1263 | "type": "object" |
| 1264 | } |
| 1265 | }, |
| 1266 | { |
| 1267 | "Name": "read_subagent_result", |
| 1268 | "Description": "Read a completed sub-agent's full final answer by the Subagent reference returned from task, parallel_tasks, or fleet. Results are scoped to the current conversation lineage and paged by UTF-8 byte offset so large answers remain lossless without overflowing one tool result.", |
| 1269 | "ReadOnly": true, |
| 1270 | "Schema": { |
| 1271 | "properties": { |
| 1272 | "limit_bytes": { |
| 1273 | "description": "Maximum UTF-8 bytes to return. Defaults to 12288 and is capped at 24576.", |
| 1274 | "maximum": 24576, |
| 1275 | "minimum": 1, |
| 1276 | "type": "integer" |
| 1277 | }, |
| 1278 | "offset_bytes": { |
| 1279 | "description": "UTF-8 byte offset to start reading from. Omit for the beginning; use next_offset_bytes from the previous page.", |
| 1280 | "minimum": 0, |
| 1281 | "type": "integer" |
| 1282 | }, |
| 1283 | "ref": { |
| 1284 | "description": "The sa_... value from a Subagent reference line.", |
| 1285 | "type": "string" |
| 1286 | } |
| 1287 | }, |
| 1288 | "required": [ |
| 1289 | "ref" |
| 1290 | ], |
| 1291 | "type": "object" |
| 1292 | } |
| 1293 | }, |
| 1294 | { |
| 1295 | "Name": "remember", |
| 1296 | "Description": "Save a durable background fact so it survives across sessions. Use for things worth remembering long-term: who the user is and their preferences (type \"user\"); guidance on how to work, including the why (type \"feedback\"); ongoing goals or constraints not derivable from the code (type \"project\"); or pointers to external resources (type \"reference\"). For feedback/project, structure the body with a \"**Why:**\" line and a \"**How to apply:**\" line so the fact is actionable later; link related memories inline with [[their-name]]. Do NOT save what the repo already records (code structure, git history) or facts that only matter to the current conversation; if asked to remember one of those, save instead the non-obvious point behind it. Choose scope \"project\" for the current workspace (the safe default) or \"global\" only when the fact should affect every project. Standing rules that must always be followed belong in project or global REASONIX.md/AGENTS.md instructions, not background memory. Before saving, check the loaded memory index for an entry that already covers this — reuse that name to update it rather than create a near-duplicate, and use `forget` to drop one that is now wrong. The saved index loads into context at the start of each session.", |
| 1297 | "ReadOnly": false, |
| 1298 | "Schema": { |
| 1299 | "properties": { |
| 1300 | "body": { |
| 1301 | "description": "The fact itself (Markdown). For feedback/project, include a \"**Why:**\" line and a \"**How to apply:**\" line; link related memories with [[their-name]].", |
| 1302 | "type": "string" |
| 1303 | }, |
| 1304 | "description": { |
| 1305 | "description": "One-line hook shown in the index — the phrase a future session reads to decide whether to open this memory. Make it specific.", |
| 1306 | "type": "string" |
| 1307 | }, |
| 1308 | "expected_revision": { |
| 1309 | "description": "Revision returned by memory search/read. When set with id, the update fails instead of overwriting a newer change.", |
| 1310 | "minimum": 1, |
| 1311 | "type": "integer" |
| 1312 | }, |
| 1313 | "id": { |
| 1314 | "description": "Stable memory id for an update. Prefer this over name when supplied by memory search/read.", |
| 1315 | "type": "string" |
| 1316 | }, |
| 1317 | "name": { |
| 1318 | "description": "Stable project/\u003cname\u003e.md or global/\u003cname\u003e.md reference returned by memory search/read/list, or a short kebab-case slug for a new fact. Reusing a reference updates that exact memory. Omit to derive a new slug from the description.", |
| 1319 | "type": "string" |
| 1320 | }, |
| 1321 | "scope": { |
| 1322 | "description": "Where the fact applies. For a new fact, omit for the safe default, project. When updating an existing name, omit to preserve its current scope. Use global only when it should affect every workspace.", |
| 1323 | "enum": [ |
| 1324 | "project", |
| 1325 | "global" |
| 1326 | ], |
| 1327 | "type": "string" |
| 1328 | }, |
| 1329 | "title": { |
| 1330 | "description": "Short human-readable label shown in the memory index, e.g. \"Prefers tabs\". Omit to derive one from the name.", |
| 1331 | "type": "string" |
| 1332 | }, |
| 1333 | "type": { |
| 1334 | "description": "Category of the fact.", |
| 1335 | "enum": [ |
| 1336 | "user", |
| 1337 | "feedback", |
| 1338 | "project", |
| 1339 | "reference" |
| 1340 | ], |
| 1341 | "type": "string" |
| 1342 | } |
| 1343 | }, |
| 1344 | "required": [ |
| 1345 | "body", |
| 1346 | "description" |
| 1347 | ], |
| 1348 | "type": "object" |
| 1349 | } |
| 1350 | }, |
| 1351 | { |
| 1352 | "Name": "research", |
| 1353 | "Description": "Combine web_fetch + code reading in an isolated subagent. Use when the answer needs both an external reference and local verification — 'is X supported by lib Y', 'compare our impl against the spec'. Returns one synthesis citing code (file:line) and web (URL).", |
| 1354 | "ReadOnly": false, |
| 1355 | "Schema": { |
| 1356 | "properties": { |
| 1357 | "continue_from": { |
| 1358 | "description": "Continue a prior compatible subagent transcript in the current conversation context. Pass only the 'sa_...' value from the prior result's 'Subagent reference: ...' line.", |
| 1359 | "type": "string" |
| 1360 | }, |
| 1361 | "task": { |
| 1362 | "description": "Concrete research question. The subagent has none of your context — name the external thing to look up and the local code to compare against.", |
| 1363 | "type": "string" |
| 1364 | } |
| 1365 | }, |
| 1366 | "required": [ |
| 1367 | "task" |
| 1368 | ], |
| 1369 | "type": "object" |
| 1370 | } |
| 1371 | }, |
| 1372 | { |
| 1373 | "Name": "review", |
| 1374 | "Description": "Review the pending changes (current branch diff) in an isolated subagent — flags correctness / security / missing-tests / hidden behavior per file:line. Read-only; you decide what to act on. Use before suggesting a PR-shaped change or after finishing a multi-step edit.", |
| 1375 | "ReadOnly": false, |
| 1376 | "Schema": { |
| 1377 | "properties": { |
| 1378 | "continue_from": { |
| 1379 | "description": "Continue a prior compatible subagent transcript in the current conversation context. Pass only the 'sa_...' value from the prior result's 'Subagent reference: ...' line.", |
| 1380 | "type": "string" |
| 1381 | }, |
| 1382 | "task": { |
| 1383 | "description": "What to focus the review on (e.g. 'focus on the auth changes' or 'general'). The subagent reads the diff itself.", |
| 1384 | "type": "string" |
| 1385 | } |
| 1386 | }, |
| 1387 | "required": [ |
| 1388 | "task" |
| 1389 | ], |
| 1390 | "type": "object" |
| 1391 | } |
| 1392 | }, |
| 1393 | { |
| 1394 | "Name": "run_skill", |
| 1395 | "Description": "Invoke a playbook from the Skills index pinned in the system prompt. For the built-in subagent skills (explore / research / review / security_review), prefer the dedicated top-level tools of the same name — they're easier to pick and do the same thing. Pass `name` as the BARE identifier (e.g. 'explore'), NOT the `[🧬 subagent]` tag that follows it in the index. `[🧬 subagent]` skills spawn an isolated subagent — only the final distilled answer returns; supply `arguments` describing the concrete task since the subagent has no other context. Untagged skills are inlined: the body becomes a tool result you read and follow.", |
| 1396 | "ReadOnly": false, |
| 1397 | "Schema": { |
| 1398 | "properties": { |
| 1399 | "arguments": { |
| 1400 | "description": "Free-form arguments. For inline skills: appended as an 'Arguments:' line; the skill's own instructions decide how to use them. For subagent skills: REQUIRED — becomes the entire task the subagent receives.", |
| 1401 | "type": "string" |
| 1402 | }, |
| 1403 | "continue_from": { |
| 1404 | "description": "Continue a prior compatible subagent transcript in the current conversation context. Only valid for runAs=subagent skills. Pass only the 'sa_...' value from the prior result's 'Subagent reference: ...' line.", |
| 1405 | "type": "string" |
| 1406 | }, |
| 1407 | "name": { |
| 1408 | "description": "Skill identifier as it appears in the pinned Skills index (e.g. 'explore', 'review'). Case-sensitive. Just the identifier, not the [🧬 subagent] tag.", |
| 1409 | "type": "string" |
| 1410 | } |
| 1411 | }, |
| 1412 | "required": [ |
| 1413 | "name" |
| 1414 | ], |
| 1415 | "type": "object" |
| 1416 | } |
| 1417 | }, |
| 1418 | { |
| 1419 | "Name": "security_review", |
| 1420 | "Description": "Security-focused review of the current branch diff in an isolated subagent — injection / authz / secrets / deserialization / path-traversal / crypto, severity-tagged. Read-only. Use when shipping changes that touch auth, input parsing, file IO, or external requests.", |
| 1421 | "ReadOnly": false, |
| 1422 | "Schema": { |
| 1423 | "properties": { |
| 1424 | "continue_from": { |
| 1425 | "description": "Continue a prior compatible subagent transcript in the current conversation context. Pass only the 'sa_...' value from the prior result's 'Subagent reference: ...' line.", |
| 1426 | "type": "string" |
| 1427 | }, |
| 1428 | "task": { |
| 1429 | "description": "Optional scope hint (e.g. 'focus on token handling in internal/auth/') or 'full' for everything in the diff.", |
| 1430 | "type": "string" |
| 1431 | } |
| 1432 | }, |
| 1433 | "required": [ |
| 1434 | "task" |
| 1435 | ], |
| 1436 | "type": "object" |
| 1437 | } |
| 1438 | }, |
| 1439 | { |
| 1440 | "Name": "slash_command", |
| 1441 | "Description": "Invoke a project slash command (a reusable prompt template or skill) by name. Returns the command's expanded prompt text for you to act on in this turn — it does not run on its own. Call with an empty command (or \"list\") to see what's available. Available: explore, init, install-capability, reasonix-guide, research, review, security-review, test.", |
| 1442 | "ReadOnly": true, |
| 1443 | "Schema": { |
| 1444 | "properties": { |
| 1445 | "arguments": { |
| 1446 | "description": "Arguments passed to the command, as you'd type them after the name (space-separated).", |
| 1447 | "type": "string" |
| 1448 | }, |
| 1449 | "command": { |
| 1450 | "description": "Slash command name (with or without a leading slash). Empty or \"list\" returns the available commands.", |
| 1451 | "type": "string" |
| 1452 | } |
| 1453 | }, |
| 1454 | "type": "object" |
| 1455 | } |
| 1456 | }, |
| 1457 | { |
| 1458 | "Name": "task", |
| 1459 | "Description": "Spawn a sub-agent for a focused sub-task. Optional profile selects a runAs=subagent Skill whose body becomes the full system prompt (no implicit concise default). Optional write_paths declare non-overlapping write targets so background writers may run in parallel; omitting write_paths on a writer claims the whole workspace and serializes writers. The sub-agent runs in its own session with a filtered tool list (defaults to every parent tool, then applies the subagent boundary: Recursive agent/skill tools are exposed only while max_subagent_depth leaves another delegation layer; unsupported background job tools (parallel_tasks, wait, bash_output, kill_shell) are excluded; bash is exposed as foreground-only inside subagents.). Only its final answer is returned.", |
| 1460 | "ReadOnly": false, |
| 1461 | "Schema": { |
| 1462 | "properties": { |
| 1463 | "continue_from": { |
| 1464 | "description": "Continue a prior compatible subagent transcript in the current conversation context. Pass only the 'sa_...' value from the prior result's 'Subagent reference: ...' line. If the ref belongs to an ancestor conversation, the framework continues a current-conversation copy.", |
| 1465 | "type": "string" |
| 1466 | }, |
| 1467 | "description": { |
| 1468 | "description": "Short label for the sub-task (3-7 words). Surfaced in the dispatch line so the user sees what's running.", |
| 1469 | "type": "string" |
| 1470 | }, |
| 1471 | "effort": { |
| 1472 | "description": "Optional reasoning effort for the sub-agent (e.g. high, max). Same precedence as model.", |
| 1473 | "type": "string" |
| 1474 | }, |
| 1475 | "max_steps": { |
| 1476 | "description": "Optional cap on tool-call rounds. Defaults to half the parent's cap (min 5).", |
| 1477 | "minimum": 1, |
| 1478 | "type": "integer" |
| 1479 | }, |
| 1480 | "model": { |
| 1481 | "description": "Optional model override for the sub-agent (a configured provider/model name). Precedence: persistent profile config, this argument, profile frontmatter, global subagent default, parent model.", |
| 1482 | "type": "string" |
| 1483 | }, |
| 1484 | "profile": { |
| 1485 | "description": "Optional runAs=subagent profile name. Resolved at runtime from the Skill store; explicit names may invoke invocation=manual profiles. The profile body becomes the full system prompt.", |
| 1486 | "type": "string" |
| 1487 | }, |
| 1488 | "prompt": { |
| 1489 | "description": "What the sub-agent should accomplish. Be specific about the deliverable — the sub-agent does not see this conversation.", |
| 1490 | "type": "string" |
| 1491 | }, |
| 1492 | "run_in_background": { |
| 1493 | "description": "Run the sub-agent asynchronously: returns a job id immediately and keeps working across turns. Collect its final answer with wait, and you'll be notified when it finishes. Use for long, independent sub-tasks you don't need to block on right now.", |
| 1494 | "type": "boolean" |
| 1495 | }, |
| 1496 | "tools": { |
| 1497 | "description": "Optional tool whitelist. When profile sets allowed-tools, this list is intersected (call args cannot expand profile permissions). Recursive agent/skill tools are exposed only while max_subagent_depth leaves another delegation layer; unsupported background job tools (parallel_tasks, wait, bash_output, kill_shell) are excluded; bash is exposed as foreground-only inside subagents.", |
| 1498 | "items": { |
| 1499 | "type": "string" |
| 1500 | }, |
| 1501 | "type": "array" |
| 1502 | }, |
| 1503 | "write_paths": { |
| 1504 | "description": "Optional workspace-relative or absolute file/directory paths this writer may modify. Globs and workspace escapes are rejected. Writers without write_paths claim the whole workspace (serializing against every other writer claim). Non-overlapping paths allow parallel writers up to max_parallel_writers. In fleet, multiple whole-workspace claims fail preflight before any task starts.", |
| 1505 | "items": { |
| 1506 | "type": "string" |
| 1507 | }, |
| 1508 | "type": "array" |
| 1509 | } |
| 1510 | }, |
| 1511 | "required": [ |
| 1512 | "prompt" |
| 1513 | ], |
| 1514 | "type": "object" |
| 1515 | } |
| 1516 | }, |
| 1517 | { |
| 1518 | "Name": "todo_write", |
| 1519 | "Description": "Record and update a structured task list for the current work. Send the COMPLETE list every call — it replaces the previous one. Use it to plan multi-step work and show progress: keep exactly one item in_progress at a time, and flip an item to completed the moment it's done (don't batch completions). Skip it for trivial single-step tasks. The list is two-level: a `level` 0 item is a PHASE (a milestone) and the `level` 1 items after it are its concrete sub-steps; omit `level` (0) for a flat list. Each item has `content` (imperative, e.g. \"Add the parser\"), `status` (pending|in_progress|completed), `activeForm` (present-continuous shown while in progress, e.g. \"Adding the parser\"), and optional `level` (0 phase | 1 sub-step).", |
| 1520 | "ReadOnly": true, |
| 1521 | "Schema": { |
| 1522 | "properties": { |
| 1523 | "todos": { |
| 1524 | "description": "The complete task list, in order. Replaces any previous list.", |
| 1525 | "items": { |
| 1526 | "properties": { |
| 1527 | "activeForm": { |
| 1528 | "description": "Present-continuous form shown while the task is in progress (e.g. \"Running tests\").", |
| 1529 | "type": "string" |
| 1530 | }, |
| 1531 | "content": { |
| 1532 | "description": "Imperative description of the task.", |
| 1533 | "type": "string" |
| 1534 | }, |
| 1535 | "level": { |
| 1536 | "description": "Nesting level: 0 = phase/milestone, 1 = a sub-step of the phase above it. Omit for a flat list.", |
| 1537 | "enum": [ |
| 1538 | 0, |
| 1539 | 1 |
| 1540 | ], |
| 1541 | "type": "integer" |
| 1542 | }, |
| 1543 | "status": { |
| 1544 | "description": "Task state. Keep at most one in_progress.", |
| 1545 | "enum": [ |
| 1546 | "pending", |
| 1547 | "in_progress", |
| 1548 | "completed" |
| 1549 | ], |
| 1550 | "type": "string" |
| 1551 | } |
| 1552 | }, |
| 1553 | "required": [ |
| 1554 | "content", |
| 1555 | "status" |
| 1556 | ], |
| 1557 | "type": "object" |
| 1558 | }, |
| 1559 | "type": "array" |
| 1560 | } |
| 1561 | }, |
| 1562 | "required": [ |
| 1563 | "todos" |
| 1564 | ], |
| 1565 | "type": "object" |
| 1566 | } |
| 1567 | }, |
| 1568 | { |
| 1569 | "Name": "update_goal", |
| 1570 | "Description": "Report this turn's disposition for the active goal. Call it at the end of every goal turn instead of using prose markers: `continue` (work is ongoing — give a concrete next_action), `complete` (the request is fully done, output format and constraints satisfied, and verification was attempted or reported unavailable), or `blocked` (only the user can unblock: missing user-only information, an irreversible/externally visible operation, or changed scope). The host validates your claim against Delivery acceptance criteria and decides whether to continue automatically. Fields: `status` (required, one of continue|complete|blocked), `reason` (required for continue and blocked, optional for complete), `next_action` (optional concrete next step; recommended for continue).", |
| 1571 | "ReadOnly": true, |
| 1572 | "Schema": { |
| 1573 | "properties": { |
| 1574 | "next_action": { |
| 1575 | "description": "Optional concrete next step. Recommended for continue so the host can guide the next turn.", |
| 1576 | "type": "string" |
| 1577 | }, |
| 1578 | "reason": { |
| 1579 | "description": "Short explanation. REQUIRED for continue and blocked; optional for complete.", |
| 1580 | "type": "string" |
| 1581 | }, |
| 1582 | "status": { |
| 1583 | "description": "continue = keep working autonomously; complete = the goal is fully done and verified; blocked = only the user can unblock.", |
| 1584 | "enum": [ |
| 1585 | "continue", |
| 1586 | "complete", |
| 1587 | "blocked" |
| 1588 | ], |
| 1589 | "type": "string" |
| 1590 | } |
| 1591 | }, |
| 1592 | "required": [ |
| 1593 | "status" |
| 1594 | ], |
| 1595 | "type": "object" |
| 1596 | } |
| 1597 | }, |
| 1598 | { |
| 1599 | "Name": "wait", |
| 1600 | "Description": "Block until background jobs finish, then return each job's status and final output/answer. Use to collect the result of a task(run_in_background) or bash(run_in_background) before continuing. Omit job_ids to wait for every running job.", |
| 1601 | "ReadOnly": true, |
| 1602 | "Schema": { |
| 1603 | "properties": { |
| 1604 | "job_ids": { |
| 1605 | "description": "Background job ids to wait for. Omit to wait for every currently-running job.", |
| 1606 | "items": { |
| 1607 | "type": "string" |
| 1608 | }, |
| 1609 | "type": "array" |
| 1610 | }, |
| 1611 | "timeout_seconds": { |
| 1612 | "description": "Optional maximum seconds to block before returning current progress. Omit to wait until the jobs finish.", |
| 1613 | "minimum": 1, |
| 1614 | "type": "integer" |
| 1615 | } |
| 1616 | }, |
| 1617 | "type": "object" |
| 1618 | } |
| 1619 | }, |
| 1620 | { |
| 1621 | "Name": "web_fetch", |
| 1622 | "Description": "Fetch a URL over HTTPS/HTTP and return its text content. HTML pages are reduced to readable text (scripts, styles, tags stripped, whitespace collapsed); JSON / plain text / markdown bodies come back verbatim. Use to read documentation pages, API responses, or source files hosted somewhere the local filesystem can't reach.", |
| 1623 | "ReadOnly": true, |
| 1624 | "Schema": { |
| 1625 | "properties": { |
| 1626 | "url": { |
| 1627 | "description": "Absolute URL beginning with http:// or https://", |
| 1628 | "type": "string" |
| 1629 | } |
| 1630 | }, |
| 1631 | "required": [ |
| 1632 | "url" |
| 1633 | ], |
| 1634 | "type": "object" |
| 1635 | } |
| 1636 | }, |
| 1637 | { |
| 1638 | "Name": "write_file", |
| 1639 | "Description": "Write content to a file at the given path (overwriting existing content). Creates parent directories as needed.", |
| 1640 | "ReadOnly": false, |
| 1641 | "Schema": { |
| 1642 | "properties": { |
| 1643 | "content": { |
| 1644 | "description": "Full content to write", |
| 1645 | "type": "string" |
| 1646 | }, |
| 1647 | "path": { |
| 1648 | "description": "File path", |
| 1649 | "type": "string" |
| 1650 | } |
| 1651 | }, |
| 1652 | "required": [ |
| 1653 | "content", |
| 1654 | "path" |
| 1655 | ], |
| 1656 | "type": "object" |
| 1657 | } |
| 1658 | } |
| 1659 | ] |
| 1660 |