返回 CodeWhale
agent_suggest.tools.golden.json
根目录 / crates / tui / tests / fixtures / conformance / prompt / agent_suggest.tools.golden.json
1 [
2 {
3 "name": "bash",
4 "description": "Execute a shell command in the workspace and return stdout and stderr. Output keeps the last 2000 lines or 50KB. An optional timeout is expressed in seconds; when omitted the command is killed after 120 seconds, so pass an explicit timeout for work expected to take longer. In Ask, after a sandbox denial, retry the exact command once with sandbox_permissions (the narrowest wider mode that suffices) and a one-sentence justification; the approval prompt asks the user.",
5 "input_schema": {
6 "additionalProperties": false,
7 "properties": {
8 "command": {
9 "description": "The command to execute. Actual execution shell: `/bin/bash`. Use Bash syntax: pipelines, redirections, $(command), and && / || are supported. Quote paths and variable expansions, such as \"$path\"; use single quotes for literal text. For literal multiline input, use a quoted heredoc delimiter (<<'EOF') with its closing delimiter on a separate line. Use only installed programs; do not assume GNU-specific flags on macOS/BSD. Example: printf '%s\\n' 'sample'.",
10 "type": "string"
11 },
12 "justification": {
13 "description": "Required with sandbox_permissions: one sentence explaining why this exact command needs wider access.",
14 "type": "string"
15 },
16 "read_only": {
17 "description": "Set true to run analysis code (including Python/SQLite) with mandatory native filesystem read-only isolation and no network. Available during peer writes. Refused when native enforcement is unavailable; no background, stdin, external backend, or sandbox escalation.",
18 "type": "boolean"
19 },
20 "sandbox_permissions": {
21 "description": "The wider sandbox mode this exact command needs. Use only as a one-shot retry after a sandbox denial; requires justification and user approval in Ask.",
22 "enum": [
23 "workspace-write",
24 "danger-full-access"
25 ],
26 "type": "string"
27 },
28 "timeout": {
29 "description": "Optional timeout in seconds; when omitted the command is killed after 120 seconds.",
30 "type": "number"
31 }
32 },
33 "required": [
34 "command"
35 ],
36 "type": "object"
37 },
38 "allowed_callers": [
39 "direct"
40 ],
41 "defer_loading": false
42 },
43 {
44 "name": "create_goal",
45 "description": "Create the session's one persistent goal: a completion objective Codewhale keeps working toward across turns until it is verified complete, blocked, or the user stops it. You decide when a request is a durable objective worth carrying across turns — a multi-step outcome the user will want continued and verified. Do not create a goal for a question, a greeting, a one-shot edit, or a conversational probe; those are ordinary turns. When the user explicitly asks to use `/goal` or asks you to make something the goal, call `create_goal` before doing the rest of the work; acknowledging it in prose is not sufficient. Keep the user's full objective, not a shortened one-turn version. Set token_budget only when the user explicitly provides one. Creating a goal shows the user a one-line receipt (they can /goal pause or /goal clear); do not also ask for confirmation. Only one unfinished goal exists at a time: complete or clear it before creating another.",
46 "input_schema": {
47 "additionalProperties": false,
48 "properties": {
49 "objective": {
50 "description": "The full objective to pursue. Keep the complete user goal, not a shortened one-turn version.",
51 "type": "string"
52 },
53 "token_budget": {
54 "description": "Optional soft token budget for the goal.",
55 "minimum": 0,
56 "type": "integer"
57 }
58 },
59 "required": [
60 "objective"
61 ],
62 "type": "object"
63 },
64 "allowed_callers": [
65 "direct"
66 ],
67 "defer_loading": false
68 },
69 {
70 "name": "edit",
71 "description": "Edit one file with targeted text replacements. Every edits[].oldText must identify a unique, non-overlapping region of the original file. Merge nearby or overlapping changes into one edit.",
72 "input_schema": {
73 "additionalProperties": false,
74 "properties": {
75 "edits": {
76 "description": "One or more disjoint replacements, all matched against the original file.",
77 "items": {
78 "additionalProperties": false,
79 "properties": {
80 "newText": {
81 "description": "Replacement text; may be empty to delete the matched span.",
82 "type": "string"
83 },
84 "oldText": {
85 "description": "Text identifying one unique region to replace.",
86 "type": "string"
87 }
88 },
89 "required": [
90 "newText",
91 "oldText"
92 ],
93 "type": "object"
94 },
95 "type": "array"
96 },
97 "path": {
98 "description": "Path to the file to edit (relative or absolute).",
99 "type": "string"
100 }
101 },
102 "required": [
103 "edits",
104 "path"
105 ],
106 "type": "object"
107 },
108 "allowed_callers": [
109 "direct"
110 ],
111 "defer_loading": false
112 },
113 {
114 "name": "get_goal",
115 "description": "Inspect the current runtime goal state, including objective, status, token budget, elapsed time, evidence, and blocker.",
116 "input_schema": {
117 "additionalProperties": false,
118 "properties": {},
119 "type": "object"
120 },
121 "allowed_callers": [
122 "direct"
123 ],
124 "defer_loading": false
125 },
126 {
127 "name": "load_skill",
128 "description": "Load a named skill's SKILL.md body and companion file list into this turn. Use when the user names a skill, or when an entry in the system prompt's `## Skills` index matches the task -- load it before starting the work, not after. Pass query=\"...\" to search names and descriptions, or name=\"list\" for the whole catalogue. Resolves global and plugin skills that `read` cannot reach.",
129 "input_schema": {
130 "additionalProperties": false,
131 "properties": {
132 "name": {
133 "description": "Skill id to load. Omit or pass \"list\" to see all available skills.",
134 "type": "string"
135 },
136 "query": {
137 "description": "Search term matched against skill names and descriptions. Use when the index was truncated or no name is known.",
138 "type": "string"
139 }
140 },
141 "type": "object"
142 },
143 "allowed_callers": [
144 "direct"
145 ],
146 "defer_loading": false
147 },
148 {
149 "name": "read",
150 "description": "Read a text file. The whole file comes back in one call when it fits this call's output budget — 100000 bytes by default, raisable to 500000 with max_bytes. There is no line cap. Use offset and limit for an exact line range; when output is budget-limited the footer names the exact offset to continue from. Every response reports the file's byte size, line count, and whether output was truncated.",
151 "input_schema": {
152 "additionalProperties": false,
153 "properties": {
154 "limit": {
155 "description": "Maximum number of lines to read.",
156 "type": "number"
157 },
158 "max_bytes": {
159 "description": "Output budget in bytes for this one call. Defaults to 100000; values above the 500000 maximum are clamped down rather than rejected, and a value below the active default leaves the default in place.",
160 "type": "number"
161 },
162 "offset": {
163 "description": "Line number to start reading from (1-indexed).",
164 "type": "number"
165 },
166 "path": {
167 "description": "Path to the file to read (relative or absolute).",
168 "type": "string"
169 }
170 },
171 "required": [
172 "path"
173 ],
174 "type": "object"
175 },
176 "allowed_callers": [
177 "direct"
178 ],
179 "defer_loading": false
180 },
181 {
182 "name": "todo_write",
183 "description": "Replace the To-do list shown to the user. Optional: use it when a visible plan helps; at most one item may be in_progress at a time.",
184 "input_schema": {
185 "properties": {
186 "todos": {
187 "description": "The complete list of To-do items. This replaces the existing list.",
188 "items": {
189 "properties": {
190 "content": {
191 "description": "The task description",
192 "type": "string"
193 },
194 "status": {
195 "description": "Task status",
196 "enum": [
197 "pending",
198 "in_progress",
199 "completed",
200 "cancelled"
201 ],
202 "type": "string"
203 }
204 },
205 "required": [
206 "content",
207 "status"
208 ],
209 "type": "object"
210 },
211 "type": "array"
212 }
213 },
214 "required": [
215 "todos"
216 ],
217 "type": "object"
218 },
219 "allowed_callers": [
220 "direct"
221 ],
222 "defer_loading": false
223 },
224 {
225 "name": "update_goal",
226 "description": "Update the runtime goal completion gate by calling this tool; a prose status in your answer does not change the goal or stop continuation. Critical verification may seal one immutable completion contract. Advisory review is append-only context and never completes, blocks, or pauses the goal. Mark blocked when progress requires user input.",
227 "input_schema": {
228 "additionalProperties": false,
229 "properties": {
230 "advisory": {
231 "description": "Required when status is advisory. Appended separately from the judged completion contract.",
232 "type": "string"
233 },
234 "blocker": {
235 "description": "Required when status is blocked. Explain the condition preventing progress.",
236 "type": "string"
237 },
238 "evidence": {
239 "description": "Required when status is complete. Briefly cite the proof that the goal is done.",
240 "type": "string"
241 },
242 "progress": {
243 "additionalProperties": false,
244 "description": "Optional with not_achieved or advisory: your current best estimate of overall completion, shown to the user as reported progress. Keep percent honest — it is an estimate, never a verified fraction.",
245 "properties": {
246 "next": {
247 "description": "One short line: what comes next.",
248 "type": "string"
249 },
250 "now": {
251 "description": "One short line: what is being worked on right now.",
252 "type": "string"
253 },
254 "percent": {
255 "description": "Estimated percent complete, 0-100.",
256 "maximum": 100,
257 "minimum": 0,
258 "type": "integer"
259 }
260 },
261 "required": [
262 "percent"
263 ],
264 "type": "object"
265 },
266 "status": {
267 "description": "Use complete only when a critical verifier proves the goal; not_achieved to record verifier gaps; blocked when meaningful progress cannot continue; advisory to append best-effort context without changing lifecycle state.",
268 "enum": [
269 "complete",
270 "blocked",
271 "not_achieved",
272 "advisory"
273 ],
274 "type": "string"
275 },
276 "verification": {
277 "additionalProperties": false,
278 "description": "Required when status is complete or not_achieved. A verifier-as-judge receipt from a concrete check, such as Run action=\"verifiers\" or an equivalent project-specific gate.",
279 "properties": {
280 "check": {
281 "description": "The verifier/check that passed.",
282 "type": "string"
283 },
284 "gaps": {
285 "description": "Concrete remaining gaps. Required for critical not_achieved reviews; order and duplicate wording do not affect the stall fingerprint.",
286 "items": {
287 "type": "string"
288 },
289 "type": "array"
290 },
291 "role": {
292 "description": "Critical reviews may satisfy the judged completion contract. Advisory reviews are fail-open and cannot complete it. Defaults to critical for compatibility.",
293 "enum": [
294 "critical",
295 "advisory"
296 ],
297 "type": "string"
298 },
299 "status": {
300 "description": "Use passed when a concrete verifier/check succeeded; not_applicable when no automated verifier applies; not_achieved when the verifier found concrete remaining gaps.",
301 "enum": [
302 "passed",
303 "not_applicable",
304 "not_achieved"
305 ],
306 "type": "string"
307 },
308 "summary": {
309 "description": "Brief result summary from the verifier/check.",
310 "type": "string"
311 }
312 },
313 "required": [
314 "check",
315 "status",
316 "summary"
317 ],
318 "type": "object"
319 }
320 },
321 "required": [
322 "status"
323 ],
324 "type": "object"
325 },
326 "allowed_callers": [
327 "direct"
328 ],
329 "defer_loading": false
330 },
331 {
332 "name": "write",
333 "description": "Write content to a file. Creates the file if it does not exist, overwrites it if it does, and creates parent directories automatically.",
334 "input_schema": {
335 "additionalProperties": false,
336 "properties": {
337 "content": {
338 "description": "Content to write to the file.",
339 "type": "string"
340 },
341 "path": {
342 "description": "Path to the file to write (relative or absolute).",
343 "type": "string"
344 }
345 },
346 "required": [
347 "content",
348 "path"
349 ],
350 "type": "object"
351 },
352 "allowed_callers": [
353 "direct"
354 ],
355 "defer_loading": false,
356 "cache_control": {
357 "type": "ephemeral"
358 }
359 },
360 {
361 "type": "execute_tools_20260918",
362 "name": "execute_tools",
363 "description": "Run a JavaScript program that composes tool calls with `await tools.call(name, args)` and returns a bounded JSON result. Prefer it whenever you would make several dependent or repetitive calls, MCP and plugin tools included: intermediate results stay in the program and only what you return reaches the conversation. Every nested call passes the same permission checks as a direct call; a call that needs approval pauses the program until the user decides, and a denied or refused call throws inside the program (catch it to continue). Inside a program, tools.call('tool_search', {query}) returns matching tool names with their input schemas without loading them into the conversation. Each result is {content, metadata, truncated}. When a result is cut, truncated names its full size and saved copy and content is the leading text of the raw output instead of parsed JSON, so check truncated before reading fields. Not available inside programs: agent, workflow, request_user_input, nested execute_tools, interactive shells, sandbox escalation, Computer Use consent or scripts, and MCP sign-in. At most 50 nested calls, 4 concurrent; the return value is capped at 16 KiB.",
364 "input_schema": {
365 "type": "object",
366 "properties": {
367 "code": {
368 "type": "string",
369 "description": "JavaScript program. The return value (or thrown error) becomes the result; use tools.call(name, argsObject) for tool calls."
370 }
371 },
372 "required": [
373 "code"
374 ]
375 },
376 "allowed_callers": [
377 "direct"
378 ],
379 "defer_loading": false
380 },
381 {
382 "type": "tool_search_20251119",
383 "name": "tool_search",
384 "description": "Search deferred tool definitions and return matching tool references.",
385 "input_schema": {
386 "type": "object",
387 "properties": {
388 "query": {
389 "type": "string",
390 "description": "Search query for tool discovery."
391 },
392 "match": {
393 "type": "string",
394 "enum": [
395 "bm25",
396 "regex"
397 ],
398 "default": "bm25",
399 "description": "Matching algorithm: bm25 for natural-language matching, regex for a regular expression over tool names/descriptions/schema."
400 },
401 "max_results": {
402 "type": "integer",
403 "minimum": 1,
404 "maximum": 8,
405 "default": 8,
406 "description": "Maximum number of matching tool references to return."
407 }
408 },
409 "required": [
410 "query"
411 ]
412 },
413 "allowed_callers": [
414 "direct"
415 ],
416 "defer_loading": false
417 }
418 ]
419
419 lines JSON