// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: activate_skill 1`] = `
{
  "description": "Activates a specialized agent skill by name (Available: 'skill1', 'skill2'). Returns the skill's instructions wrapped in \`<activated_skill>\` tags. These provide specialized guidance for the current task. Use this when you identify a task that matches a skill's description. ONLY use names exactly as they appear in the \`<available_skills>\` section.",
  "name": "activate_skill",
  "parametersJsonSchema": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "additionalProperties": false,
    "properties": {
      "name": {
        "description": "The name of the skill to activate.",
        "enum": [
          "skill1",
          "skill2",
        ],
        "type": "string",
      },
    },
    "required": [
      "name",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: activate_skill_empty 1`] = `
{
  "description": "Activates a specialized agent skill by name. Returns the skill's instructions wrapped in \`<activated_skill>\` tags. These provide specialized guidance for the current task. Use this when you identify a task that matches a skill's description. ONLY use names exactly as they appear in the \`<available_skills>\` section.",
  "name": "activate_skill",
  "parametersJsonSchema": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "additionalProperties": false,
    "properties": {
      "name": {
        "description": "No skills are currently available.",
        "type": "string",
      },
    },
    "required": [
      "name",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: activate_skill_single 1`] = `
{
  "description": "Activates a specialized agent skill by name (Available: 'skill1'). Returns the skill's instructions wrapped in \`<activated_skill>\` tags. These provide specialized guidance for the current task. Use this when you identify a task that matches a skill's description. ONLY use names exactly as they appear in the \`<available_skills>\` section.",
  "name": "activate_skill",
  "parametersJsonSchema": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "additionalProperties": false,
    "properties": {
      "name": {
        "description": "The name of the skill to activate.",
        "enum": [
          "skill1",
        ],
        "type": "string",
      },
    },
    "required": [
      "name",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: ask_user 1`] = `
{
  "description": "Ask the user one or more questions to gather preferences, clarify requirements, or make decisions.",
  "name": "ask_user",
  "parametersJsonSchema": {
    "properties": {
      "questions": {
        "items": {
          "properties": {
            "header": {
              "description": "Very short label displayed as a chip/tag. Use abbreviations: "Auth" not "Authentication", "Config" not "Configuration". Examples: "Auth method", "Library", "Approach", "Database".",
              "type": "string",
            },
            "multiSelect": {
              "description": "Only applies when type='choice'. Set to true to allow selecting multiple options.",
              "type": "boolean",
            },
            "options": {
              "description": "The selectable choices for 'choice' type questions. Provide 2-4 options. An 'Other' option is automatically added. Not needed for 'text' or 'yesno' types.",
              "items": {
                "properties": {
                  "description": {
                    "description": "Brief explanation of this option. Example: "Industry standard, supports SSO"",
                    "type": "string",
                  },
                  "label": {
                    "description": "The display text for this option (1-5 words). Example: "OAuth 2.0"",
                    "type": "string",
                  },
                },
                "required": [
                  "label",
                  "description",
                ],
                "type": "object",
              },
              "type": "array",
            },
            "placeholder": {
              "description": "Hint text shown in the input field. For type='text', shown in the main input. For type='choice', shown in the 'Other' custom input.",
              "type": "string",
            },
            "question": {
              "description": "The complete question to ask the user. Should be clear, specific, and end with a question mark.",
              "type": "string",
            },
            "type": {
              "default": "choice",
              "description": "Question type: 'choice' (default) for multiple-choice with options, 'text' for free-form input, 'yesno' for Yes/No confirmation.",
              "enum": [
                "choice",
                "text",
                "yesno",
              ],
              "type": "string",
            },
          },
          "required": [
            "question",
            "header",
            "type",
          ],
          "type": "object",
        },
        "maxItems": 4,
        "minItems": 1,
        "type": "array",
      },
    },
    "required": [
      "questions",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: enter_plan_mode 1`] = `
{
  "description": "Switch to Plan Mode to safely research, design, and plan complex changes using read-only tools.",
  "name": "enter_plan_mode",
  "parametersJsonSchema": {
    "properties": {
      "reason": {
        "description": "Short reason explaining why you are entering plan mode.",
        "type": "string",
      },
    },
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: exit_plan_mode 1`] = `
{
  "description": "Finalizes the planning phase and transitions to implementation by presenting the plan for user approval. This tool MUST be used to exit Plan Mode before any source code edits can be performed. Call this whenever a plan is ready or the user requests implementation.",
  "name": "exit_plan_mode",
  "parametersJsonSchema": {
    "properties": {
      "plan_path": {
        "description": "The file path to the finalized plan (e.g., "/mock/plans/feature-x.md"). This path MUST be within the designated plans directory: /mock/plans/",
        "type": "string",
      },
    },
    "required": [
      "plan_path",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: get_internal_docs 1`] = `
{
  "description": "Returns the content of Gemini CLI internal documentation files. If no path is provided, returns a list of all available documentation paths.",
  "name": "get_internal_docs",
  "parametersJsonSchema": {
    "properties": {
      "path": {
        "description": "The relative path to the documentation file (e.g., 'cli/commands.md'). If omitted, lists all available documentation.",
        "type": "string",
      },
    },
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: glob 1`] = `
{
  "description": "Efficiently finds files matching specific glob patterns (e.g., \`src/**/*.ts\`, \`**/*.md\`), returning absolute paths sorted by modification time (newest first). Ideal for quickly locating files based on their name or path structure, especially in large codebases.",
  "name": "glob",
  "parametersJsonSchema": {
    "properties": {
      "case_sensitive": {
        "description": "Optional: Whether the search should be case-sensitive. Defaults to false.",
        "type": "boolean",
      },
      "dir_path": {
        "description": "Optional: The absolute path to the directory to search within. If omitted, searches the root directory.",
        "type": "string",
      },
      "pattern": {
        "description": "The glob pattern to match against (e.g., '**/*.py', 'docs/*.md').",
        "type": "string",
      },
      "respect_gemini_ignore": {
        "description": "Optional: Whether to respect .geminiignore patterns when finding files. Defaults to true.",
        "type": "boolean",
      },
      "respect_git_ignore": {
        "description": "Optional: Whether to respect .gitignore patterns when finding files. Only available in git repositories. Defaults to true.",
        "type": "boolean",
      },
    },
    "required": [
      "pattern",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: google_web_search 1`] = `
{
  "description": "Performs a web search using Google Search (via the Gemini API) and returns the results. This tool is useful for finding information on the internet based on a query.",
  "name": "google_web_search",
  "parametersJsonSchema": {
    "properties": {
      "query": {
        "description": "The search query to find information on the web.",
        "type": "string",
      },
    },
    "required": [
      "query",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: grep_search 1`] = `
{
  "description": "Searches for a regular expression pattern within file contents. Max 100 matches.",
  "name": "grep_search",
  "parametersJsonSchema": {
    "properties": {
      "dir_path": {
        "description": "Optional: The absolute path to the directory to search within. If omitted, searches the current working directory.",
        "type": "string",
      },
      "exclude_pattern": {
        "description": "Optional: A regular expression pattern to exclude from the search results. If a line matches both the pattern and the exclude_pattern, it will be omitted.",
        "type": "string",
      },
      "include_pattern": {
        "description": "Optional: A glob pattern to filter which files are searched (e.g., '*.js', '*.{ts,tsx}', 'src/**'). If omitted, searches all files (respecting potential global ignores).",
        "type": "string",
      },
      "max_matches_per_file": {
        "description": "Optional: Maximum number of matches to return per file. Use this to prevent being overwhelmed by repetitive matches in large files.",
        "minimum": 1,
        "type": "integer",
      },
      "names_only": {
        "description": "Optional: If true, only the file paths of the matches will be returned, without the line content or line numbers. This is useful for gathering a list of files.",
        "type": "boolean",
      },
      "pattern": {
        "description": "The regular expression (regex) pattern to search for within file contents (e.g., 'function\\s+myFunction', 'import\\s+\\{.*\\}\\s+from\\s+.*').",
        "type": "string",
      },
      "total_max_matches": {
        "description": "Optional: Maximum number of total matches to return. Use this to limit the overall size of the response. Defaults to 100 if omitted.",
        "minimum": 1,
        "type": "integer",
      },
    },
    "required": [
      "pattern",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: grep_search_ripgrep 1`] = `
{
  "description": "Searches for a regular expression pattern within file contents.",
  "name": "grep_search",
  "parametersJsonSchema": {
    "properties": {
      "after": {
        "description": "Show this many lines after each match (equivalent to grep -A). Defaults to 0 if omitted.",
        "minimum": 0,
        "type": "integer",
      },
      "before": {
        "description": "Show this many lines before each match (equivalent to grep -B). Defaults to 0 if omitted.",
        "minimum": 0,
        "type": "integer",
      },
      "case_sensitive": {
        "description": "If true, search is case-sensitive. Defaults to false (ignore case) if omitted.",
        "type": "boolean",
      },
      "context": {
        "description": "Show this many lines of context around each match (equivalent to grep -C). Defaults to 0 if omitted.",
        "type": "integer",
      },
      "dir_path": {
        "description": "Directory or file to search. Directories are searched recursively. Relative paths are resolved against current working directory. Defaults to current working directory ('.') if omitted.",
        "type": "string",
      },
      "exclude_pattern": {
        "description": "Optional: A regular expression pattern to exclude from the search results. If a line matches both the pattern and the exclude_pattern, it will be omitted.",
        "type": "string",
      },
      "fixed_strings": {
        "description": "If true, treats the \`pattern\` as a literal string instead of a regular expression. Defaults to false (basic regex) if omitted.",
        "type": "boolean",
      },
      "include_pattern": {
        "description": "Glob pattern to filter files (e.g., '*.ts', 'src/**'). Recommended for large repositories to reduce noise. Defaults to all files if omitted.",
        "type": "string",
      },
      "max_matches_per_file": {
        "description": "Optional: Maximum number of matches to return per file. Use this to prevent being overwhelmed by repetitive matches in large files.",
        "minimum": 1,
        "type": "integer",
      },
      "names_only": {
        "description": "Optional: If true, only the file paths of the matches will be returned, without the line content or line numbers. This is useful for gathering a list of files.",
        "type": "boolean",
      },
      "no_ignore": {
        "description": "If true, searches all files including those usually ignored (like in .gitignore, build/, dist/, etc). Defaults to false if omitted.",
        "type": "boolean",
      },
      "pattern": {
        "description": "The pattern to search for. By default, treated as a Rust-flavored regular expression. Use '\\b' for precise symbol matching (e.g., '\\bMatchMe\\b').",
        "type": "string",
      },
      "total_max_matches": {
        "description": "Optional: Maximum number of total matches to return. Use this to limit the overall size of the response. Defaults to 100 if omitted.",
        "minimum": 1,
        "type": "integer",
      },
    },
    "required": [
      "pattern",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: list_directory 1`] = `
{
  "description": "Lists the names of files and subdirectories directly within a specified directory path. Can optionally ignore entries matching provided glob patterns.",
  "name": "list_directory",
  "parametersJsonSchema": {
    "properties": {
      "dir_path": {
        "description": "The path to the directory to list",
        "type": "string",
      },
      "file_filtering_options": {
        "description": "Optional: Whether to respect ignore patterns from .gitignore or .geminiignore",
        "properties": {
          "respect_gemini_ignore": {
            "description": "Optional: Whether to respect .geminiignore patterns when listing files. Defaults to true.",
            "type": "boolean",
          },
          "respect_git_ignore": {
            "description": "Optional: Whether to respect .gitignore patterns when listing files. Only available in git repositories. Defaults to true.",
            "type": "boolean",
          },
        },
        "type": "object",
      },
      "ignore": {
        "description": "List of glob patterns to ignore",
        "items": {
          "type": "string",
        },
        "type": "array",
      },
    },
    "required": [
      "dir_path",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: read_file 1`] = `
{
  "description": "Reads and returns the content of a specified file. If the file is large, the content will be truncated. The tool's response will clearly indicate if truncation has occurred and will provide details on how to read more of the file using the 'start_line' and 'end_line' parameters. Handles text, images (PNG, JPG, GIF, WEBP, SVG, BMP), audio files (MP3, WAV, AIFF, AAC, OGG, FLAC), and PDF files. For text files, it can read specific line ranges.",
  "name": "read_file",
  "parametersJsonSchema": {
    "properties": {
      "end_line": {
        "description": "Optional: The 1-based line number to end reading at (inclusive).",
        "type": "number",
      },
      "file_path": {
        "description": "The path to the file to read.",
        "type": "string",
      },
      "start_line": {
        "description": "Optional: The 1-based line number to start reading from.",
        "type": "number",
      },
    },
    "required": [
      "file_path",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: read_many_files 1`] = `
{
  "description": "Reads content from multiple files specified by glob patterns within a configured target directory. For text files, it concatenates their content into a single string. It is primarily designed for text-based files. However, it can also process image (e.g., .png, .jpg), audio (e.g., .mp3, .wav), and PDF (.pdf) files if their file names or extensions are explicitly included in the 'include' argument. For these explicitly requested non-text files, their data is read and included in a format suitable for model consumption (e.g., base64 encoded).

This tool is useful when you need to understand or analyze a collection of files, such as:
- Getting an overview of a codebase or parts of it (e.g., all TypeScript files in the 'src' directory).
- Finding where specific functionality is implemented if the user asks broad questions about code.
- Reviewing documentation files (e.g., all Markdown files in the 'docs' directory).
- Gathering context from multiple configuration files.
- When the user asks to "read all files in X directory" or "show me the content of all Y files".

Use this tool when the user's query implies needing the content of several files simultaneously for context, analysis, or summarization. For text files, it uses default UTF-8 encoding and a '--- {filePath} ---' separator between file contents. The tool inserts a '--- End of content ---' after the last file. Ensure glob patterns are relative to the target directory. Glob patterns like 'src/**/*.js' are supported. Avoid using for single files if a more specific single-file reading tool is available, unless the user specifically requests to process a list containing just one file via this tool. Other binary files (not explicitly requested as image/audio/PDF) are generally skipped. Default excludes apply to common non-text files (except for explicitly requested images/audio/PDFs) and large dependency directories unless 'useDefaultExcludes' is false.",
  "name": "read_many_files",
  "parametersJsonSchema": {
    "properties": {
      "exclude": {
        "default": [],
        "description": "Optional. Glob patterns for files/directories to exclude. Added to default excludes if useDefaultExcludes is true. Example: "**/*.log", "temp/"",
        "items": {
          "minLength": 1,
          "type": "string",
        },
        "type": "array",
      },
      "file_filtering_options": {
        "description": "Whether to respect ignore patterns from .gitignore or .geminiignore",
        "properties": {
          "respect_gemini_ignore": {
            "description": "Optional: Whether to respect .geminiignore patterns when listing files. Defaults to true.",
            "type": "boolean",
          },
          "respect_git_ignore": {
            "description": "Optional: Whether to respect .gitignore patterns when listing files. Only available in git repositories. Defaults to true.",
            "type": "boolean",
          },
        },
        "type": "object",
      },
      "include": {
        "description": "An array of glob patterns or paths. Examples: ["src/**/*.ts"], ["README.md", "docs/"]",
        "items": {
          "minLength": 1,
          "type": "string",
        },
        "minItems": 1,
        "type": "array",
      },
      "recursive": {
        "default": true,
        "description": "Optional. Whether to search recursively (primarily controlled by \`**\` in glob patterns). Defaults to true.",
        "type": "boolean",
      },
      "useDefaultExcludes": {
        "default": true,
        "description": "Optional. Whether to apply a list of default exclusion patterns (e.g., node_modules, .git, binary files). Defaults to true.",
        "type": "boolean",
      },
    },
    "required": [
      "include",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: replace 1`] = `
{
  "description": "Replaces text within a file. By default, the tool expects to find and replace exactly ONE occurrence of \`old_string\`. If you want to replace multiple occurrences of the exact same string, set \`allow_multiple\` to true. This tool requires providing significant context around the change to ensure precise targeting. Always use the read_file tool to examine the file's current content before attempting a text replacement.
      
      The user has the ability to modify the \`new_string\` content. If modified, this will be stated in the response.
      
      Expectation for required parameters:
      1. \`old_string\` MUST be the exact literal text to replace (including all whitespace, indentation, newlines, and surrounding code etc.).
      2. \`new_string\` MUST be the exact literal text to replace \`old_string\` with (also including all whitespace, indentation, newlines, and surrounding code etc.). Ensure the resulting code is correct and idiomatic and that \`old_string\` and \`new_string\` are different.
      3. \`instruction\` is the detailed instruction of what needs to be changed. It is important to Make it specific and detailed so developers or large language models can understand what needs to be changed and perform the changes on their own if necessary. 
      4. NEVER escape \`old_string\` or \`new_string\`, that would break the exact literal text requirement.
      **Important:** If ANY of the above are not satisfied, the tool will fail. CRITICAL for \`old_string\`: Must uniquely identify the instance(s) to change. Include at least 3 lines of context BEFORE and AFTER the target text, matching whitespace and indentation precisely. If this string matches multiple locations and \`allow_multiple\` is not true, the tool will fail.
      5. Prefer to break down complex and long changes into multiple smaller atomic calls to this tool. Always check the content of the file after changes or not finding a string to match.
      **Multiple replacements:** Set \`allow_multiple\` to true if you want to replace ALL occurrences that match \`old_string\` exactly.",
  "name": "replace",
  "parametersJsonSchema": {
    "properties": {
      "allow_multiple": {
        "description": "If true, the tool will replace all occurrences of \`old_string\`. If false (default), it will only succeed if exactly one occurrence is found.",
        "type": "boolean",
      },
      "file_path": {
        "description": "The path to the file to modify.",
        "type": "string",
      },
      "instruction": {
        "description": "A clear, semantic instruction for the code change, acting as a high-quality prompt for an expert LLM assistant. It must be self-contained and explain the goal of the change.

A good instruction should concisely answer:
1.  WHY is the change needed? (e.g., "To fix a bug where users can be null...")
2.  WHERE should the change happen? (e.g., "...in the 'renderUserProfile' function...")
3.  WHAT is the high-level change? (e.g., "...add a null check for the 'user' object...")
4.  WHAT is the desired outcome? (e.g., "...so that it displays a loading spinner instead of crashing.")

**GOOD Example:** "In the 'calculateTotal' function, correct the sales tax calculation by updating the 'taxRate' constant from 0.05 to 0.075 to reflect the new regional tax laws."

**BAD Examples:**
- "Change the text." (Too vague)
- "Fix the bug." (Doesn't explain the bug or the fix)
- "Replace the line with this new line." (Brittle, just repeats the other parameters)
",
        "type": "string",
      },
      "new_string": {
        "description": "The exact literal text to replace \`old_string\` with, preferably unescaped. Provide the EXACT text. Ensure the resulting code is correct and idiomatic. Do not use omission placeholders like '(rest of methods ...)', '...', or 'unchanged code'; provide exact literal code.",
        "type": "string",
      },
      "old_string": {
        "description": "The exact literal text to replace, preferably unescaped. For single replacements (default), include at least 3 lines of context BEFORE and AFTER the target text, matching whitespace and indentation precisely. If this string is not the exact literal text (i.e. you escaped it) or does not match exactly, the tool will fail.",
        "type": "string",
      },
    },
    "required": [
      "file_path",
      "instruction",
      "old_string",
      "new_string",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: run_shell_command 1`] = `
{
  "description": "This tool executes a given shell command as \`bash -c <command>\`. To run a command in the background, set the \`is_background\` parameter to true. Do NOT use \`&\` to background commands. Command is executed as a subprocess that leads its own process group. Command process group can be terminated as \`kill -- -PGID\` or signaled as \`kill -s SIGNAL -- -PGID\`.

      Efficiency Guidelines:
      - Quiet Flags: Always prefer silent or quiet flags (e.g., \`npm install --silent\`, \`git --no-pager\`) to reduce output volume while still capturing necessary information.
      - Pagination: Always disable terminal pagination to ensure commands terminate (e.g., use \`git --no-pager\`, \`systemctl --no-pager\`, or set \`PAGER=cat\`).

      The following information is returned:

      Output: Combined stdout/stderr. Can be \`(empty)\` or partial on error and for any unwaited background processes.
      Exit Code: Only included if non-zero (command failed).
      Error: Only included if a process-level error occurred (e.g., spawn failure).
      Signal: Only included if process was terminated by a signal.
      Background PIDs: Only included if background processes were started.
      Process Group PGID: Only included if available.",
  "name": "run_shell_command",
  "parametersJsonSchema": {
    "properties": {
      "command": {
        "description": "Exact bash command to execute as \`bash -c <command>\`",
        "type": "string",
      },
      "description": {
        "description": "Brief description of the command for the user. Be specific and concise. Ideally a single sentence. Can be up to 3 sentences for clarity. No line breaks.",
        "type": "string",
      },
      "dir_path": {
        "description": "(OPTIONAL) The path of the directory to run the command in. If not provided, the project root directory is used. Must be a directory within the workspace and must already exist.",
        "type": "string",
      },
      "is_background": {
        "description": "Set to true if this command should be run in the background (e.g. for long-running servers or watchers). The command will be started, allowed to run for a brief moment to check for immediate errors, and then moved to the background.",
        "type": "boolean",
      },
    },
    "required": [
      "command",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: save_memory 1`] = `
{
  "description": "
Saves concise global user context (preferences, facts) for use across ALL workspaces.

### CRITICAL: GLOBAL CONTEXT ONLY
NEVER save workspace-specific context, local paths, or commands (e.g. "The entry point is src/index.js", "The test command is npm test"). These are local to the current workspace and must NOT be saved globally. EXCLUSIVELY for context relevant across ALL workspaces.

- Use for "Remember X" or clear personal facts.
- Do NOT use for session context.",
  "name": "save_memory",
  "parametersJsonSchema": {
    "additionalProperties": false,
    "properties": {
      "fact": {
        "description": "The specific fact or piece of information to remember. Should be a clear, self-contained statement.",
        "type": "string",
      },
    },
    "required": [
      "fact",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: web_fetch 1`] = `
{
  "description": "Processes content from URL(s), including local and private network addresses (e.g., localhost), embedded in a prompt. Include up to 20 URLs and instructions (e.g., summarize, extract specific data) directly in the 'prompt' parameter.",
  "name": "web_fetch",
  "parametersJsonSchema": {
    "properties": {
      "prompt": {
        "description": "A comprehensive prompt that includes the URL(s) (up to 20) to fetch and specific instructions on how to process their content (e.g., "Summarize https://example.com/article and extract key points from https://another.com/data"). All URLs to be fetched must be valid and complete, starting with "http://" or "https://", and be fully-formed with a valid hostname (e.g., a domain name like "example.com" or an IP address). For example, "https://example.com" is valid, but "example.com" is not.",
        "type": "string",
      },
    },
    "required": [
      "prompt",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: write_file 1`] = `
{
  "description": "Writes content to a specified file in the local filesystem.

      The user has the ability to modify \`content\`. If modified, this will be stated in the response.",
  "name": "write_file",
  "parametersJsonSchema": {
    "properties": {
      "content": {
        "description": "The content to write to the file. Do not use omission placeholders like '(rest of methods ...)', '...', or 'unchanged code'; provide complete literal content.",
        "type": "string",
      },
      "file_path": {
        "description": "The path to the file to write to.",
        "type": "string",
      },
    },
    "required": [
      "file_path",
      "content",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: write_todos 1`] = `
{
  "description": "This tool can help you list out the current subtasks that are required to be completed for a given user request. The list of subtasks helps you keep track of the current task, organize complex queries and help ensure that you don't miss any steps. With this list, the user can also see the current progress you are making in executing a given task.

Depending on the task complexity, you should first divide a given task into subtasks and then use this tool to list out the subtasks that are required to be completed for a given user request.
Each of the subtasks should be clear and distinct. 

Use this tool for complex queries that require multiple steps. If you find that the request is actually complex after you have started executing the user task, create a todo list and use it. If execution of the user task requires multiple steps, planning and generally is higher complexity than a simple Q&A, use this tool.

DO NOT use this tool for simple tasks that can be completed in less than 2 steps. If the user query is simple and straightforward, do not use the tool. If you can respond with an answer in a single turn then this tool is not required.

## Task state definitions

- pending: Work has not begun on a given subtask.
- in_progress: Marked just prior to beginning work on a given subtask. You should only have one subtask as in_progress at a time.
- completed: Subtask was successfully completed with no errors or issues. If the subtask required more steps to complete, update the todo list with the subtasks. All steps should be identified as completed only when they are completed.
- cancelled: As you update the todo list, some tasks are not required anymore due to the dynamic nature of the task. In this case, mark the subtasks as cancelled.


## Methodology for using this tool
1. Use this todo list as soon as you receive a user request based on the complexity of the task.
2. Keep track of every subtask that you update the list with.
3. Mark a subtask as in_progress before you begin working on it. You should only have one subtask as in_progress at a time.
4. Update the subtask list as you proceed in executing the task. The subtask list is not static and should reflect your progress and current plans, which may evolve as you acquire new information.
5. Mark a subtask as completed when you have completed it.
6. Mark a subtask as cancelled if the subtask is no longer needed.
7. You must update the todo list as soon as you start, stop or cancel a subtask. Don't batch or wait to update the todo list.


## Examples of When to Use the Todo List

<example>
User request: Create a website with a React for creating fancy logos using gemini-2.5-flash-image

ToDo list created by the agent:
1. Initialize a new React project environment (e.g., using Vite).
2. Design and build the core UI components: a text input (prompt field) for the logo description, selection controls for style parameters (if the API supports them), and an image preview area.
3. Implement state management (e.g., React Context or Zustand) to manage the user's input prompt, the API loading status (pending, success, error), and the resulting image data.
4. Create an API service module within the React app (using "fetch" or "axios") to securely format and send the prompt data via an HTTP POST request to the specified "gemini-2.5-flash-image" (Gemini model) endpoint.
5. Implement asynchronous logic to handle the API call: show a loading indicator while the request is pending, retrieve the generated image (e.g., as a URL or base64 string) upon success, and display any errors.
6. Display the returned "fancy logo" from the API response in the preview area component.
7. Add functionality (e.g., a "Download" button) to allow the user to save the generated image file.
8. Deploy the application to a web server or hosting platform.

<reasoning>
The agent used the todo list to break the task into distinct, manageable steps:
1. Building an entire interactive web application from scratch is a highly complex, multi-stage process involving setup, UI development, logic integration, and deployment.
2. The agent inferred the core functionality required for a "logo creator," such as UI controls for customization (Task 3) and an export feature (Task 7), which must be tracked as distinct goals.
3. The agent rightly inferred the requirement of an API service model for interacting with the image model endpoint.
</reasoning>
</example>


## Examples of When NOT to Use the Todo List

<example>
User request: Ensure that the test <test file> passes.

Agent:
<Goes into a loop of running the test, identifying errors, and updating the code until the test passes.>

<reasoning>
The agent did not use the todo list because this task could be completed by a tight loop of execute test->edit->execute test.
</reasoning>
</example>",
  "name": "write_todos",
  "parametersJsonSchema": {
    "additionalProperties": false,
    "properties": {
      "todos": {
        "description": "The complete list of todo items. This will replace the existing list.",
        "items": {
          "additionalProperties": false,
          "description": "A single todo item.",
          "properties": {
            "description": {
              "description": "The description of the task.",
              "type": "string",
            },
            "status": {
              "description": "The current status of the task.",
              "enum": [
                "pending",
                "in_progress",
                "completed",
                "cancelled",
              ],
              "type": "string",
            },
          },
          "required": [
            "description",
            "status",
          ],
          "type": "object",
        },
        "type": "array",
      },
    },
    "required": [
      "todos",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: activate_skill 1`] = `
{
  "description": "Activates a specialized agent skill by name (Available: 'skill1', 'skill2'). Returns the skill's instructions wrapped in \`<activated_skill>\` tags. These provide specialized guidance for the current task. Use this when you identify a task that matches a skill's description. ONLY use names exactly as they appear in the \`<available_skills>\` section.",
  "name": "activate_skill",
  "parametersJsonSchema": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "additionalProperties": false,
    "properties": {
      "name": {
        "description": "The name of the skill to activate.",
        "enum": [
          "skill1",
          "skill2",
        ],
        "type": "string",
      },
    },
    "required": [
      "name",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: activate_skill_empty 1`] = `
{
  "description": "Activates a specialized agent skill by name. Returns the skill's instructions wrapped in \`<activated_skill>\` tags. These provide specialized guidance for the current task. Use this when you identify a task that matches a skill's description. ONLY use names exactly as they appear in the \`<available_skills>\` section.",
  "name": "activate_skill",
  "parametersJsonSchema": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "additionalProperties": false,
    "properties": {
      "name": {
        "description": "No skills are currently available.",
        "type": "string",
      },
    },
    "required": [
      "name",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: activate_skill_single 1`] = `
{
  "description": "Activates a specialized agent skill by name (Available: 'skill1'). Returns the skill's instructions wrapped in \`<activated_skill>\` tags. These provide specialized guidance for the current task. Use this when you identify a task that matches a skill's description. ONLY use names exactly as they appear in the \`<available_skills>\` section.",
  "name": "activate_skill",
  "parametersJsonSchema": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "additionalProperties": false,
    "properties": {
      "name": {
        "description": "The name of the skill to activate.",
        "enum": [
          "skill1",
        ],
        "type": "string",
      },
    },
    "required": [
      "name",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: ask_user 1`] = `
{
  "description": "Ask the user one or more questions to gather preferences, clarify requirements, or make decisions. When using this tool, prefer providing multiple-choice options with detailed descriptions and enable multi-select where appropriate to provide maximum flexibility.",
  "name": "ask_user",
  "parametersJsonSchema": {
    "properties": {
      "questions": {
        "items": {
          "properties": {
            "header": {
              "description": "Very short label displayed as a chip/tag. Use abbreviations: "Auth" not "Authentication", "Config" not "Configuration". Examples: "Auth method", "Library", "Approach", "Database".",
              "type": "string",
            },
            "multiSelect": {
              "description": "Only applies when type='choice'. Set to true to allow selecting multiple options.",
              "type": "boolean",
            },
            "options": {
              "description": "The selectable choices for 'choice' type questions. Provide 2-4 options. An 'Other' option is automatically added. Not needed for 'text' or 'yesno' types.",
              "items": {
                "properties": {
                  "description": {
                    "description": "Brief explanation of this option. Example: "Industry standard, supports SSO"",
                    "type": "string",
                  },
                  "label": {
                    "description": "The display text for this option (1-5 words). Example: "OAuth 2.0"",
                    "type": "string",
                  },
                },
                "required": [
                  "label",
                  "description",
                ],
                "type": "object",
              },
              "type": "array",
            },
            "placeholder": {
              "description": "Hint text shown in the input field. For type='text', shown in the main input. For type='choice', shown in the 'Other' custom input.",
              "type": "string",
            },
            "question": {
              "description": "The complete question to ask the user. Should be clear, specific, and end with a question mark.",
              "type": "string",
            },
            "type": {
              "default": "choice",
              "description": "Question type: 'choice' (default) for multiple-choice with options, 'text' for free-form input, 'yesno' for Yes/No confirmation.",
              "enum": [
                "choice",
                "text",
                "yesno",
              ],
              "type": "string",
            },
          },
          "required": [
            "question",
            "header",
            "type",
          ],
          "type": "object",
        },
        "maxItems": 4,
        "minItems": 1,
        "type": "array",
      },
    },
    "required": [
      "questions",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: enter_plan_mode 1`] = `
{
  "description": "Switch to Plan Mode to safely research, design, and plan complex changes using read-only tools.",
  "name": "enter_plan_mode",
  "parametersJsonSchema": {
    "properties": {
      "reason": {
        "description": "Short reason explaining why you are entering plan mode.",
        "type": "string",
      },
    },
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: exit_plan_mode 1`] = `
{
  "description": "Finalizes the planning phase and transitions to implementation by presenting the plan for user approval. This tool MUST be used to exit Plan Mode before any source code edits can be performed. Call this whenever a plan is ready or the user requests implementation.",
  "name": "exit_plan_mode",
  "parametersJsonSchema": {
    "properties": {
      "plan_path": {
        "description": "The file path to the finalized plan (e.g., "/mock/plans/feature-x.md"). This path MUST be within the designated plans directory: /mock/plans/",
        "type": "string",
      },
    },
    "required": [
      "plan_path",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: get_internal_docs 1`] = `
{
  "description": "Returns the content of Gemini CLI internal documentation files. If no path is provided, returns a list of all available documentation paths.",
  "name": "get_internal_docs",
  "parametersJsonSchema": {
    "properties": {
      "path": {
        "description": "The relative path to the documentation file (e.g., 'cli/commands.md'). If omitted, lists all available documentation.",
        "type": "string",
      },
    },
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: glob 1`] = `
{
  "description": "Efficiently finds files matching specific glob patterns (e.g., \`src/**/*.ts\`, \`**/*.md\`), returning absolute paths sorted by modification time (newest first). Ideal for quickly locating files based on their name or path structure, especially in large codebases.",
  "name": "glob",
  "parametersJsonSchema": {
    "properties": {
      "case_sensitive": {
        "description": "Optional: Whether the search should be case-sensitive. Defaults to false.",
        "type": "boolean",
      },
      "dir_path": {
        "description": "Optional: The absolute path to the directory to search within. If omitted, searches the root directory.",
        "type": "string",
      },
      "pattern": {
        "description": "The glob pattern to match against (e.g., '**/*.py', 'docs/*.md').",
        "type": "string",
      },
      "respect_gemini_ignore": {
        "description": "Optional: Whether to respect .geminiignore patterns when finding files. Defaults to true.",
        "type": "boolean",
      },
      "respect_git_ignore": {
        "description": "Optional: Whether to respect .gitignore patterns when finding files. Only available in git repositories. Defaults to true.",
        "type": "boolean",
      },
    },
    "required": [
      "pattern",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: google_web_search 1`] = `
{
  "description": "Performs a grounded Google Search to find information across the internet. Returns a synthesized answer with citations (e.g., [1]) and source URIs. Best for finding up-to-date documentation, troubleshooting obscure errors, or broad research. Use this when you don't have a specific URL. If a search result requires deeper analysis, follow up by using 'web_fetch' on the provided URI.",
  "name": "google_web_search",
  "parametersJsonSchema": {
    "properties": {
      "query": {
        "description": "The search query. Supports natural language questions (e.g., 'Latest breaking changes in React 19') or specific technical queries.",
        "type": "string",
      },
    },
    "required": [
      "query",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: grep_search 1`] = `
{
  "description": "Searches for a regular expression pattern within file contents. Max 100 matches.",
  "name": "grep_search",
  "parametersJsonSchema": {
    "properties": {
      "dir_path": {
        "description": "Optional: The absolute path to the directory to search within. If omitted, searches the current working directory.",
        "type": "string",
      },
      "exclude_pattern": {
        "description": "Optional: A regular expression pattern to exclude from the search results. If a line matches both the pattern and the exclude_pattern, it will be omitted.",
        "type": "string",
      },
      "include_pattern": {
        "description": "Optional: A glob pattern to filter which files are searched (e.g., '*.js', '*.{ts,tsx}', 'src/**'). If omitted, searches all files (respecting potential global ignores).",
        "type": "string",
      },
      "max_matches_per_file": {
        "description": "Optional: Maximum number of matches to return per file. Use this to prevent being overwhelmed by repetitive matches in large files.",
        "minimum": 1,
        "type": "integer",
      },
      "names_only": {
        "description": "Optional: If true, only the file paths of the matches will be returned, without the line content or line numbers. This is useful for gathering a list of files.",
        "type": "boolean",
      },
      "pattern": {
        "description": "The regular expression (regex) pattern to search for within file contents (e.g., 'function\\s+myFunction', 'import\\s+\\{.*\\}\\s+from\\s+.*').",
        "type": "string",
      },
      "total_max_matches": {
        "description": "Optional: Maximum number of total matches to return. Use this to limit the overall size of the response. Defaults to 100 if omitted.",
        "minimum": 1,
        "type": "integer",
      },
    },
    "required": [
      "pattern",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: grep_search_ripgrep 1`] = `
{
  "description": "Searches for a regular expression pattern within file contents. This tool is FAST and optimized, powered by ripgrep. PREFERRED over standard \`run_shell_command("grep ...")\` due to better performance and automatic output limiting (defaults to 100 matches, but can be increased via \`total_max_matches\`).",
  "name": "grep_search",
  "parametersJsonSchema": {
    "properties": {
      "after": {
        "description": "Show this many lines after each match (equivalent to grep -A). Defaults to 0 if omitted.",
        "minimum": 0,
        "type": "integer",
      },
      "before": {
        "description": "Show this many lines before each match (equivalent to grep -B). Defaults to 0 if omitted.",
        "minimum": 0,
        "type": "integer",
      },
      "case_sensitive": {
        "description": "If true, search is case-sensitive. Defaults to false (ignore case) if omitted.",
        "type": "boolean",
      },
      "context": {
        "description": "Show this many lines of context around each match (equivalent to grep -C). Defaults to 0 if omitted.",
        "type": "integer",
      },
      "dir_path": {
        "description": "Directory or file to search. Directories are searched recursively. Relative paths are resolved against current working directory. Defaults to current working directory ('.') if omitted.",
        "type": "string",
      },
      "exclude_pattern": {
        "description": "Optional: A regular expression pattern to exclude from the search results. If a line matches both the pattern and the exclude_pattern, it will be omitted.",
        "type": "string",
      },
      "fixed_strings": {
        "description": "If true, treats the \`pattern\` as a literal string instead of a regular expression. Defaults to false (basic regex) if omitted.",
        "type": "boolean",
      },
      "include_pattern": {
        "description": "Glob pattern to filter files (e.g., '*.ts', 'src/**'). Recommended for large repositories to reduce noise. Defaults to all files if omitted.",
        "type": "string",
      },
      "max_matches_per_file": {
        "description": "Optional: Maximum number of matches to return per file. Use this to prevent being overwhelmed by repetitive matches in large files.",
        "minimum": 1,
        "type": "integer",
      },
      "names_only": {
        "description": "Optional: If true, only the file paths of the matches will be returned, without the line content or line numbers. This is useful for gathering a list of files.",
        "type": "boolean",
      },
      "no_ignore": {
        "description": "If true, searches all files including those usually ignored (like in .gitignore, build/, dist/, etc). Defaults to false if omitted.",
        "type": "boolean",
      },
      "pattern": {
        "description": "The pattern to search for. By default, treated as a Rust-flavored regular expression. Use '\\b' for precise symbol matching (e.g., '\\bMatchMe\\b').",
        "type": "string",
      },
      "total_max_matches": {
        "description": "Optional: Maximum number of total matches to return. Use this to limit the overall size of the response. Defaults to 100 if omitted.",
        "minimum": 1,
        "type": "integer",
      },
    },
    "required": [
      "pattern",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: list_directory 1`] = `
{
  "description": "Lists the names of files and subdirectories directly within a specified directory path. Can optionally ignore entries matching provided glob patterns.",
  "name": "list_directory",
  "parametersJsonSchema": {
    "properties": {
      "dir_path": {
        "description": "The path to the directory to list",
        "type": "string",
      },
      "file_filtering_options": {
        "description": "Optional: Whether to respect ignore patterns from .gitignore or .geminiignore",
        "properties": {
          "respect_gemini_ignore": {
            "description": "Optional: Whether to respect .geminiignore patterns when listing files. Defaults to true.",
            "type": "boolean",
          },
          "respect_git_ignore": {
            "description": "Optional: Whether to respect .gitignore patterns when listing files. Only available in git repositories. Defaults to true.",
            "type": "boolean",
          },
        },
        "type": "object",
      },
      "ignore": {
        "description": "List of glob patterns to ignore",
        "items": {
          "type": "string",
        },
        "type": "array",
      },
    },
    "required": [
      "dir_path",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: read_file 1`] = `
{
  "description": "Reads and returns the content of a specified file. To maintain context efficiency, you MUST use 'start_line' and 'end_line' for targeted, surgical reads of specific sections. For your safety, the tool will automatically truncate output exceeding 2000 lines, 2000 characters per line, or 20MB in size; however, triggering these limits is considered token-inefficient. Always retrieve only the minimum content necessary for your next step. Handles text, images (PNG, JPG, GIF, WEBP, SVG, BMP), audio files (MP3, WAV, AIFF, AAC, OGG, FLAC), and PDF files.",
  "name": "read_file",
  "parametersJsonSchema": {
    "properties": {
      "end_line": {
        "description": "Optional: The 1-based line number to end reading at (inclusive).",
        "type": "number",
      },
      "file_path": {
        "description": "The path to the file to read.",
        "type": "string",
      },
      "start_line": {
        "description": "Optional: The 1-based line number to start reading from.",
        "type": "number",
      },
    },
    "required": [
      "file_path",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: read_many_files 1`] = `
{
  "description": "Reads content from multiple files specified by glob patterns within a configured target directory. For text files, it concatenates their content into a single string. It is primarily designed for text-based files. However, it can also process image (e.g., .png, .jpg), audio (e.g., .mp3, .wav), and PDF (.pdf) files if their file names or extensions are explicitly included in the 'include' argument. For these explicitly requested non-text files, their data is read and included in a format suitable for model consumption (e.g., base64 encoded).

This tool is useful when you need to understand or analyze a collection of files, such as:
- Getting an overview of a codebase or parts of it (e.g., all TypeScript files in the 'src' directory).
- Finding where specific functionality is implemented if the user asks broad questions about code.
- Reviewing documentation files (e.g., all Markdown files in the 'docs' directory).
- Gathering context from multiple configuration files.
- When the user asks to "read all files in X directory" or "show me the content of all Y files".

Use this tool when the user's query implies needing the content of several files simultaneously for context, analysis, or summarization. For text files, it uses default UTF-8 encoding and a '--- {filePath} ---' separator between file contents. The tool inserts a '--- End of content ---' after the last file. Ensure glob patterns are relative to the target directory. Glob patterns like 'src/**/*.js' are supported. Avoid using for single files if a more specific single-file reading tool is available, unless the user specifically requests to process a list containing just one file via this tool. Other binary files (not explicitly requested as image/audio/PDF) are generally skipped. Default excludes apply to common non-text files (except for explicitly requested images/audio/PDFs) and large dependency directories unless 'useDefaultExcludes' is false.",
  "name": "read_many_files",
  "parametersJsonSchema": {
    "properties": {
      "exclude": {
        "default": [],
        "description": "Optional. Glob patterns for files/directories to exclude. Added to default excludes if useDefaultExcludes is true. Example: "**/*.log", "temp/"",
        "items": {
          "minLength": 1,
          "type": "string",
        },
        "type": "array",
      },
      "file_filtering_options": {
        "description": "Whether to respect ignore patterns from .gitignore or .geminiignore",
        "properties": {
          "respect_gemini_ignore": {
            "description": "Optional: Whether to respect .geminiignore patterns when listing files. Defaults to true.",
            "type": "boolean",
          },
          "respect_git_ignore": {
            "description": "Optional: Whether to respect .gitignore patterns when listing files. Only available in git repositories. Defaults to true.",
            "type": "boolean",
          },
        },
        "type": "object",
      },
      "include": {
        "description": "An array of glob patterns or paths. Examples: ["src/**/*.ts"], ["README.md", "docs/"]",
        "items": {
          "minLength": 1,
          "type": "string",
        },
        "minItems": 1,
        "type": "array",
      },
      "recursive": {
        "default": true,
        "description": "Optional. Whether to search recursively (primarily controlled by \`**\` in glob patterns). Defaults to true.",
        "type": "boolean",
      },
      "useDefaultExcludes": {
        "default": true,
        "description": "Optional. Whether to apply a list of default exclusion patterns (e.g., node_modules, .git, binary files). Defaults to true.",
        "type": "boolean",
      },
    },
    "required": [
      "include",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: replace 1`] = `
{
  "description": "Replaces text within a file. By default, the tool expects to find and replace exactly ONE occurrence of \`old_string\`. If you want to replace multiple occurrences of the exact same string, set \`allow_multiple\` to true. This tool requires providing significant context around the change to ensure precise targeting.
The user has the ability to modify the \`new_string\` content. If modified, this will be stated in the response.",
  "name": "replace",
  "parametersJsonSchema": {
    "properties": {
      "allow_multiple": {
        "description": "If true, the tool will replace all occurrences of \`old_string\`. If false (default), it will only succeed if exactly one occurrence is found.",
        "type": "boolean",
      },
      "file_path": {
        "description": "The path to the file to modify.",
        "type": "string",
      },
      "instruction": {
        "description": "A clear, semantic instruction for the code change, acting as a high-quality prompt for an expert LLM assistant. It must be self-contained and explain the goal of the change.",
        "type": "string",
      },
      "new_string": {
        "description": "The exact literal text to replace \`old_string\` with, unescaped. Provide the EXACT text. Ensure the resulting code is correct and idiomatic. Do not use omission placeholders like '(rest of methods ...)', '...', or 'unchanged code'; provide exact literal code.",
        "type": "string",
      },
      "old_string": {
        "description": "The exact literal text to replace, unescaped. If this string is not the exact literal text (i.e. you escaped it) or does not match exactly, the tool will fail.",
        "type": "string",
      },
    },
    "required": [
      "file_path",
      "instruction",
      "old_string",
      "new_string",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: run_shell_command 1`] = `
{
  "description": "This tool executes a given shell command as \`bash -c <command>\`. To run a command in the background, set the \`is_background\` parameter to true. Do NOT use \`&\` to background commands. Command is executed as a subprocess that leads its own process group. Command process group can be terminated as \`kill -- -PGID\` or signaled as \`kill -s SIGNAL -- -PGID\`.

      Efficiency Guidelines:
      - Quiet Flags: Always prefer silent or quiet flags (e.g., \`npm install --silent\`, \`git --no-pager\`) to reduce output volume while still capturing necessary information.
      - Pagination: Always disable terminal pagination to ensure commands terminate (e.g., use \`git --no-pager\`, \`systemctl --no-pager\`, or set \`PAGER=cat\`).

      The following information is returned:

      Output: Combined stdout/stderr. Can be \`(empty)\` or partial on error and for any unwaited background processes.
      Exit Code: Only included if non-zero (command failed).
      Error: Only included if a process-level error occurred (e.g., spawn failure).
      Signal: Only included if process was terminated by a signal.
      Background PIDs: Only included if background processes were started.
      Process Group PGID: Only included if available.",
  "name": "run_shell_command",
  "parametersJsonSchema": {
    "properties": {
      "command": {
        "description": "Exact bash command to execute as \`bash -c <command>\`",
        "type": "string",
      },
      "description": {
        "description": "Brief description of the command for the user. Be specific and concise. Ideally a single sentence. Can be up to 3 sentences for clarity. No line breaks.",
        "type": "string",
      },
      "dir_path": {
        "description": "(OPTIONAL) The path of the directory to run the command in. If not provided, the project root directory is used. Must be a directory within the workspace and must already exist.",
        "type": "string",
      },
      "is_background": {
        "description": "Set to true if this command should be run in the background (e.g. for long-running servers or watchers). The command will be started, allowed to run for a brief moment to check for immediate errors, and then moved to the background.",
        "type": "boolean",
      },
    },
    "required": [
      "command",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: save_memory 1`] = `
{
  "description": "Persists global preferences or facts across ALL future sessions. Use this for recurring instructions like coding styles or tool aliases. Unlike 'write_file', which is for project-specific files, this appends to a global memory file loaded in every workspace. If you are unsure whether a fact should be remembered globally, ask the user first. CRITICAL: Do not use for session-specific context or temporary data.",
  "name": "save_memory",
  "parametersJsonSchema": {
    "additionalProperties": false,
    "properties": {
      "fact": {
        "description": "A concise, global fact or preference (e.g., 'I prefer using tabs'). Do not include local paths or project-specific names.",
        "type": "string",
      },
    },
    "required": [
      "fact",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: web_fetch 1`] = `
{
  "description": "Analyzes and extracts information from up to 20 URLs. Ideal for documentation review, technical research, or reading raw code from GitHub. You can provide specific, complex instructions for the extraction (e.g., 'Summarize the breaking changes'). Provides cited answers based on the content. GitHub 'blob' URLs are automatically converted to raw versions for better processing. Supports HTTP/HTTPS only.",
  "name": "web_fetch",
  "parametersJsonSchema": {
    "properties": {
      "prompt": {
        "description": "A string containing the URL(s) and your specific analysis instructions. Be clear about what information you want to find or summarize. Supports up to 20 URLs.",
        "type": "string",
      },
    },
    "required": [
      "prompt",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: write_file 1`] = `
{
  "description": "Writes the complete content to a file, automatically creating missing parent directories. Overwrites existing files. The user has the ability to modify 'content' before it is saved. Best for new or small files; use 'replace' for targeted edits to large files.",
  "name": "write_file",
  "parametersJsonSchema": {
    "properties": {
      "content": {
        "description": "The complete content to write. Provide the full file; do not use placeholders like '// ... rest of code'.",
        "type": "string",
      },
      "file_path": {
        "description": "Path to the file.",
        "type": "string",
      },
    },
    "required": [
      "file_path",
      "content",
    ],
    "type": "object",
  },
}
`;

exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: write_todos 1`] = `
{
  "description": "This tool can help you list out the current subtasks that are required to be completed for a given user request. The list of subtasks helps you keep track of the current task, organize complex queries and help ensure that you don't miss any steps. With this list, the user can also see the current progress you are making in executing a given task.

Depending on the task complexity, you should first divide a given task into subtasks and then use this tool to list out the subtasks that are required to be completed for a given user request.
Each of the subtasks should be clear and distinct. 

Use this tool for complex queries that require multiple steps. If you find that the request is actually complex after you have started executing the user task, create a todo list and use it. If execution of the user task requires multiple steps, planning and generally is higher complexity than a simple Q&A, use this tool.

DO NOT use this tool for simple tasks that can be completed in less than 2 steps. If the user query is simple and straightforward, do not use the tool. If you can respond with an answer in a single turn then this tool is not required.

## Task state definitions

- pending: Work has not begun on a given subtask.
- in_progress: Marked just prior to beginning work on a given subtask. You should only have one subtask as in_progress at a time.
- completed: Subtask was successfully completed with no errors or issues. If the subtask required more steps to complete, update the todo list with the subtasks. All steps should be identified as completed only when they are completed.
- cancelled: As you update the todo list, some tasks are not required anymore due to the dynamic nature of the task. In this case, mark the subtasks as cancelled.


## Methodology for using this tool
1. Use this todo list as soon as you receive a user request based on the complexity of the task.
2. Keep track of every subtask that you update the list with.
3. Mark a subtask as in_progress before you begin working on it. You should only have one subtask as in_progress at a time.
4. Update the subtask list as you proceed in executing the task. The subtask list is not static and should reflect your progress and current plans, which may evolve as you acquire new information.
5. Mark a subtask as completed when you have completed it.
6. Mark a subtask as cancelled if the subtask is no longer needed.
7. You must update the todo list as soon as you start, stop or cancel a subtask. Don't batch or wait to update the todo list.


## Examples of When to Use the Todo List

<example>
User request: Create a website with a React for creating fancy logos using gemini-2.5-flash-image

ToDo list created by the agent:
1. Initialize a new React project environment (e.g., using Vite).
2. Design and build the core UI components: a text input (prompt field) for the logo description, selection controls for style parameters (if the API supports them), and an image preview area.
3. Implement state management (e.g., React Context or Zustand) to manage the user's input prompt, the API loading status (pending, success, error), and the resulting image data.
4. Create an API service module within the React app (using "fetch" or "axios") to securely format and send the prompt data via an HTTP POST request to the specified "gemini-2.5-flash-image" (Gemini model) endpoint.
5. Implement asynchronous logic to handle the API call: show a loading indicator while the request is pending, retrieve the generated image (e.g., as a URL or base64 string) upon success, and display any errors.
6. Display the returned "fancy logo" from the API response in the preview area component.
7. Add functionality (e.g., a "Download" button) to allow the user to save the generated image file.
8. Deploy the application to a web server or hosting platform.

<reasoning>
The agent used the todo list to break the task into distinct, manageable steps:
1. Building an entire interactive web application from scratch is a highly complex, multi-stage process involving setup, UI development, logic integration, and deployment.
2. The agent inferred the core functionality required for a "logo creator," such as UI controls for customization (Task 3) and an export feature (Task 7), which must be tracked as distinct goals.
3. The agent rightly inferred the requirement of an API service model for interacting with the image model endpoint.
</reasoning>
</example>


## Examples of When NOT to Use the Todo List

<example>
User request: Ensure that the test <test file> passes.

Agent:
<Goes into a loop of running the test, identifying errors, and updating the code until the test passes.>

<reasoning>
The agent did not use the todo list because this task could be completed by a tight loop of execute test->edit->execute test.
</reasoning>
</example>",
  "name": "write_todos",
  "parametersJsonSchema": {
    "additionalProperties": false,
    "properties": {
      "todos": {
        "description": "The complete list of todo items. This will replace the existing list.",
        "items": {
          "additionalProperties": false,
          "description": "A single todo item.",
          "properties": {
            "description": {
              "description": "The description of the task.",
              "type": "string",
            },
            "status": {
              "description": "The current status of the task.",
              "enum": [
                "pending",
                "in_progress",
                "completed",
                "cancelled",
              ],
              "type": "string",
            },
          },
          "required": [
            "description",
            "status",
          ],
          "type": "object",
        },
        "type": "array",
      },
    },
    "required": [
      "todos",
    ],
    "type": "object",
  },
}
`;
