syntax = "proto3"; package xai.grok.tools.v1; // ============================================================================ // MAIN SERVICE // ============================================================================ /// GrokToolsService provides a gRPC interface to the Grok tools runtime. /// It supports tool execution, discovery, configuration, and lifecycle management. service GrokToolsService { // ========== TOOL EXECUTION ========== /// Execute a single tool call rpc ExecuteTool(ExecuteToolRequest) returns (ExecuteToolResponse); /// Execute a tool with streaming output. /// /// Currently operates as "chunked unary" — the tool executes to completion, /// then the result is streamed in byte-level chunks. True incremental /// streaming (partial output during execution) is planned. rpc ExecuteToolStream(ExecuteToolRequest) returns (stream ToolStreamChunk); // ========== TOOL DISCOVERY ========== /// List all available tools with their schemas and capabilities rpc ListTools(ListToolsRequest) returns (ListToolsResponse); /// Get detailed information about a specific tool rpc GetToolInfo(GetToolInfoRequest) returns (ToolInfo); /// Used to finalize the tool configuration, after this call /// tools are safe to call rpc FinalizeToolConfigRequest(FinalizeToolServerConfigRequest) returns (FinalizeToolServerConfigResponse); // ========== TOOL STATE ========== /// Get the current tool state (serialized Resources). /// /// Flushes any in-flight persistence writes and waits for any active /// tool execution to complete before serializing, so the returned /// snapshot is always consistent. /// /// The returned JSON has the shape: /// ```json /// { /// "params": { "": { ... }, ... }, /// "state": { "": { ... }, ... } /// } /// ``` rpc GetToolState(GetToolStateRequest) returns (GetToolStateResponse); // ========== DYNAMIC TOOL MANAGEMENT ========== /// Enable a tool (make it available for execution) rpc EnableTool(EnableToolRequest) returns (EnableToolResponse) { option deprecated = true; } /// Disable a tool (prevent execution, keep registered) rpc DisableTool(DisableToolRequest) returns (DisableToolResponse) { option deprecated = true; } // ========== TOOL OPTIONS ========== /// Set tool-specific options (merged with defaults) rpc SetToolOptions(SetToolOptionsRequest) returns (SetToolOptionsResponse) { option deprecated = true; } /// Get current tool options (effective options after merging) rpc GetToolOptions(GetToolOptionsRequest) returns (GetToolOptionsResponse) { option deprecated = true; } /// Reset tool options to defaults rpc ResetToolOptions(ResetToolOptionsRequest) returns (ResetToolOptionsResponse) { option deprecated = true; } // ========== TOOL NAME OVERRIDES ========== /// Set name overrides for a single tool (display name and/or parameter names). /// Call once per tool that needs overrides. Tools without overrides use /// canonical names. Overrides affect runtime error messages and schema /// property names returned to the model. rpc SetToolOverride(SetToolOverrideRequest) returns (SetToolOverrideResponse) { option deprecated = true; } /// Clear all name overrides for a tool, reverting to canonical names. rpc ClearToolOverride(ClearToolOverrideRequest) returns (ClearToolOverrideResponse) { option deprecated = true; } // ========== SYSTEM REMINDERS ========== /// Enable or disable system reminders globally. /// When disabled, both per-tool reminders and TodoNudge are suppressed. rpc SetSystemReminders(SetSystemRemindersRequest) returns (SetSystemRemindersResponse) { option deprecated = true; } /// Get the current state of the system reminders toggle. rpc GetSystemReminders(GetSystemRemindersRequest) returns (GetSystemRemindersResponse) { option deprecated = true; } // ========== TRUNCATION CONFIG ========== /// Set output truncation configuration for the session. /// Controls how much tool output is kept before truncation. /// Call once at session setup; applies to all subsequent tool executions. rpc SetTruncationConfig(SetTruncationConfigRequest) returns (SetTruncationConfigResponse) { option deprecated = true; } /// Get the current truncation configuration. rpc GetTruncationConfig(GetTruncationConfigRequest) returns (GetTruncationConfigResponse) { option deprecated = true; } // ========== AGENT ========== /// Get the agent's rendered system prompt. /// Returns empty string if the server was constructed without an agent. rpc GetSystemPrompt(GetSystemPromptRequest) returns (GetSystemPromptResponse) { option deprecated = true; } /// Get the agent definition metadata. /// Returns empty/default if the server was constructed without an agent. rpc GetAgentInfo(GetAgentInfoRequest) returns (GetAgentInfoResponse) { option deprecated = true; } /// Check whether the completion requirement has been satisfied /// for the current turn. Only meaningful if the agent has a /// completionRequirement set. rpc GetCompletionState(GetCompletionStateRequest) returns (GetCompletionStateResponse) { option deprecated = true; } /// Reset per-turn completion tracking. Call at the start of each /// new model turn so the harness gets a fresh "completed" signal. rpc ResetCompletionState(ResetCompletionStateRequest) returns (ResetCompletionStateResponse) { option deprecated = true; } /// Finalize the agent after all tool name/param overrides have been /// applied via SetToolOverride. Renders the system prompt with the /// current override state. After this call, SetToolOverride is /// rejected with an error. /// /// Not needed if the server was constructed with from_definition_file() /// — finalization happens automatically at build time. rpc FinalizeAgent(FinalizeAgentRequest) returns (FinalizeAgentResponse) { option deprecated = true; } } // ============================================================================ // TOOL SERVER CONFIG MESSAGES (finalize-time configuration) // ============================================================================ /// Request to finalize the tool server configuration. /// After this call, the toolset is locked and tools are safe to call. /// This replaces the old enable/disable/SetToolOptions pattern — /// all tool selection and configuration happens in a single call. message FinalizeToolServerConfigRequest { /// The tools to enable and their configuration. /// Only tools listed here will be available after finalization. repeated ToolConfigEntry tools = 1; /// Optional truncation configuration for the session. optional TruncationConfig truncation = 2; /// Whether system reminders should be enabled (default: false). bool system_reminders_enabled = 3; /// Optional: pre-load tool state from a previous session. /// /// JSON shape must match GetToolStateResponse.state_json: /// { "params": { ... }, "state": { ... } } /// /// Applied AFTER the toolset loads any existing state from disk, /// so values provided here override on-disk state. Missing keys /// are left at their defaults (merge semantics, not replace). /// /// Typical use: pass the output of a previous GetToolState call /// to warm-start a new session with the same FileReadTracker, /// TodoState, etc. optional string initial_tool_state_json = 4; /// Behavior preset name (e.g. "current", "legacy-0.4.10"). /// Applied to all version-managed tools. Defaults to "current" when empty. optional string behavior_preset = 5; } /// Per-tool configuration entry. /// Maps to `ToolConfig` in the tools library. message ToolConfigEntry { /// Fully qualified tool ID: colon-separated `Namespace:tool` /// (e.g., "GrokBuild:bash", "GrokBuild:read_file"). /// /// The whole selection path keys on this format: the default /// client-facing name is the segment after the FIRST colon (see /// `default_client_name` in the xai-grok-tools-api crate). string id = 1; /// Tool-specific parameters as JSON string. /// Merged with the tool's default params. Optional. optional string params_json = 2; /// Client-facing tool name override. /// If empty, the tool's default ID is used. optional string name_override = 3; /// Parameter name overrides (canonical param → client-facing param). /// Only include params that need overriding. map params_name_overrides = 4; /// Per-tool behavior version override (e.g. "legacy-0.4.10"). /// Wins over FinalizeToolServerConfigRequest.behavior_preset. /// Only valid for version-managed tools. optional string behavior_version = 5; /// Client-facing tool description override. /// When set, replaces the tool's built-in description entirely. /// The override string is still rendered through TemplateRenderer, /// so ${{ tools.by_kind.* }} variables resolve correctly. optional string description_override = 6; } /// Structured validation details returned when finalize rejects a tool config. message FinalizeConfigValidationDetails { repeated FinalizeConfigViolation violations = 1; } /// One validation violation in FinalizeToolServerConfigRequest. message FinalizeConfigViolation { /// Zero-based index into FinalizeToolServerConfigRequest.tools. optional uint32 entry_index = 1; /// Fully-qualified tool ID or synthetic scope like "(global)". string tool_id = 2; /// Request/config field path such as "tools[0].params_json" or "params.enabled_background". optional string field_path = 3; /// Human-readable reason for the violation. string message = 4; /// Expected type/constraint when known. optional string expected = 5; /// Preview of the rejected value as JSON/text when safe to include. optional string bad_value_json = 6; /// Machine-friendly category (e.g. "params_type", "params_json_parse"). string category = 7; } /// Structured deprecation/lifecycle warning for a specific tool version /// or bundle. Informational only — does not affect control flow. message VersionWarning { /// Fully-qualified tool ID (e.g. "GrokBuild:run_terminal_cmd"). /// Empty for bundle-level warnings. string fq_tool_id = 1; /// The deprecated version (e.g. "legacy-0.4.10"). string deprecated_version = 2; /// Suggested replacement version (e.g. "current"). string replacement = 3; /// Human-readable deprecation message. string message = 4; } /// Response from finalizing the tool server configuration. message FinalizeToolServerConfigResponse { bool success = 1; string message = 2; /// The finalized tool definitions (name, description, schema). /// Clients can use these to build tool schemas for the model. repeated ToolInfo tools = 3; /// Deprecation/lifecycle warnings for resolved versions. /// Empty when all versions are Active. repeated VersionWarning version_warnings = 4; } // ============================================================================ // TOOL EXECUTION MESSAGES // ============================================================================ message ExecuteToolRequest { /// Name of the tool to execute (e.g., "read_file", "grep", "run_terminal_cmd") string tool_name = 1; /// Tool input parameters as JSON string string input_json = 2; /// Reserved for future session support reserved 3; /// Execution options (global) ExecutionOptions options = 4; /// Unique call ID for tracing (optional, generated if not provided) optional string call_id = 5; // Field 6 reserved: was tool_options_json, removed. // Use ToolConfigEntry.params_json in FinalizeToolServerConfigRequest instead. reserved 6; } message ExecutionOptions { /// Timeout in milliseconds optional uint64 timeout_ms = 1; /// Whether to run in background (for bash) bool background = 2; /// Base output format preference OutputFormat output_format = 3; /// Working directory override (for file operations) optional string working_directory = 4; /// Specific fields to include in output_json (e.g., ["path", "lines", "line_count"]) /// If empty, includes all fields based on output_format. /// Field names are tool-specific; check tool's output schema for available fields. repeated string include_fields = 5; /// Fields to exclude from output_json (e.g., ["raw_bytes", "metadata"]) /// Applied after include_fields filtering. /// Useful for removing large/unnecessary fields to save tokens. repeated string exclude_fields = 6; /// Maximum size of each streaming data chunk in bytes. /// Default: 1 MiB (1048576). Must not exceed 4 MiB (4194304). /// Only used by ExecuteToolStream; ignored by ExecuteTool. optional uint32 stream_chunk_size = 7; } /// Client-configurable truncation settings. /// All fields are optional — omitted fields mean "use the tool's built-in default". message TruncationConfig { /// Max total output bytes for any tool. Default: 40KB. /// Overrides the built-in per-tool defaults. optional uint32 default_max_output_bytes = 1; /// Per-tool max output byte overrides. /// Keys are canonical tool names (e.g., "run_terminal_cmd", "grep"). map per_tool_max_output_bytes = 2; /// Deprecated and ignored: read_file no longer clips lines (clipping /// silently corrupts single-line files; the whole-read token cap bounds /// output instead). Field number kept for wire compatibility. optional uint32 max_chars_per_line = 3 [deprecated = true]; /// Max lines to read for read_file. Default: 1000. optional uint32 max_lines_read = 4; } /// Output format preference - affects output_json structure. /// Only DEFAULT and CONCISE are supported; other values are treated as DEFAULT. enum OutputFormat { OUTPUT_FORMAT_UNSPECIFIED = 0; /// Standard output with typical detail level OUTPUT_FORMAT_DEFAULT = 1; /// Minimal output with only essential fields (saves tokens) OUTPUT_FORMAT_CONCISE = 2; // Fields 3-4 removed (RAW, STRUCTURED were never implemented). reserved 3, 4; } message ExecuteToolResponse { /// Unique call ID for tracing string call_id = 1; /// Tool execution result oneof result { ToolSuccess success = 2; ToolError error = 3; } /// Execution metadata ExecutionMetadata metadata = 4; } message ToolSuccess { // Field 1 removed: output_schema_json moved to ToolInfo.output_schema_json. reserved 1; /// Structured output as JSON (conforms to the tool's output schema) string output_json = 2; /// Human-readable summary for prompt injection string prompt_text = 3; // Field 4 removed: was follow_up_messages, the tool follow-up mechanism. reserved 4; reserved "follow_up_messages"; } message ToolError { /// Error code for machine processing ErrorCode code = 1; /// Human-readable error message string message = 2; /// Detailed error context as JSON optional string details_json = 3; /// Whether this error is retryable bool retryable = 4; /// Suggested fix or next action (for LLM consumption) optional string suggestion = 5; /// Related file path (if applicable) optional string file_path = 6; /// Line number (if applicable) optional int32 line_number = 7; } enum ErrorCode { ERROR_CODE_UNSPECIFIED = 0; // Input/validation errors (4xx-like) ERROR_CODE_INVALID_INPUT = 100; ERROR_CODE_MISSING_REQUIRED_FIELD = 101; ERROR_CODE_INVALID_TOOL_NAME = 102; ERROR_CODE_TOOL_DISABLED = 103; ERROR_CODE_TOOL_NOT_FOUND = 104; reserved 106; // was TASK_NOT_FOUND, now handled by tool layer // File operation errors ERROR_CODE_FILE_NOT_FOUND = 200; ERROR_CODE_FILE_NOT_READ = 201; ERROR_CODE_FILE_EXTERNALLY_MODIFIED = 202; ERROR_CODE_FILE_ALREADY_EXISTS = 203; ERROR_CODE_PERMISSION_DENIED = 204; ERROR_CODE_MULTIPLE_MATCHES = 205; ERROR_CODE_NO_MATCHES = 206; // Execution errors (5xx-like) ERROR_CODE_EXECUTION_FAILED = 300; ERROR_CODE_TIMEOUT = 301; ERROR_CODE_CANCELLED = 302; ERROR_CODE_RATE_LIMITED = 303; // Internal errors ERROR_CODE_INTERNAL = 500; ERROR_CODE_NOT_IMPLEMENTED = 501; } message ExecutionMetadata { /// Time taken to execute in milliseconds uint64 duration_ms = 1; /// Tokens estimated in output (for LLM context management) int32 estimated_tokens = 2; /// Whether output was truncated bool truncated = 3; /// Tool version that executed string tool_version = 4; /// Resolved behavior contract version for the tool that executed /// (e.g. "current", "legacy-0.4.10"). Empty for unmanaged tools. string contract_version = 5; } /// Streaming output chunk message ToolStreamChunk { string call_id = 1; oneof chunk { /// Incremental data chunk (prompt_text or output_json fragment) StreamDataChunk data = 2; /// Final result (always the last chunk — metadata only, no payload) StreamFinalResult final_result = 3; } } /// What kind of data this chunk carries. enum StreamDataKind { STREAM_DATA_KIND_UNSPECIFIED = 0; /// Fragment of the human-readable prompt_text string. STREAM_DATA_KIND_PROMPT_TEXT = 1; /// Fragment of the structured output_json string. STREAM_DATA_KIND_OUTPUT_JSON = 2; } /// A single chunk of streamed data (either prompt_text or output_json). message StreamDataChunk { /// Which field this chunk belongs to. StreamDataKind kind = 1; /// Raw bytes of the chunk (UTF-8 encoded string fragment). bytes data = 2; /// Byte offset of this chunk within the complete field. /// First chunk starts at 0. Subsequent chunks continue from /// previous offset + len(data). uint64 offset = 3; } /// Final result sent as the last streaming chunk. /// Contains only metadata and error information — the actual payload /// (prompt_text, output_json) has already been streamed via StreamDataChunk. message StreamFinalResult { /// Execution metadata (timing, token estimates, truncation). ExecutionMetadata metadata = 1; /// If the tool execution failed, this contains the error. /// When present, any previously streamed data chunks should be discarded. optional ToolError error = 2; /// Total size in bytes of all prompt_text chunks combined. uint64 prompt_text_size = 3; /// Total size in bytes of all output_json chunks combined. uint64 output_json_size = 4; // Field 5 removed: was follow_up_messages, the tool follow-up mechanism. reserved 5; reserved "follow_up_messages"; } // ============================================================================ // TOOL DISCOVERY MESSAGES // ============================================================================ message ListToolsRequest { /// Filter by tool category optional ToolCategory category = 1; /// Include disabled tools bool include_disabled = 2; /// Include full schemas (can be large) bool include_schemas = 3; } enum ToolCategory { TOOL_CATEGORY_UNSPECIFIED = 0; TOOL_CATEGORY_FILE = 1; TOOL_CATEGORY_SEARCH = 2; TOOL_CATEGORY_SHELL = 3; TOOL_CATEGORY_WORKFLOW = 4; TOOL_CATEGORY_EXTERNAL = 5; TOOL_CATEGORY_CUSTOM = 6; } message ListToolsResponse { repeated ToolInfo tools = 1; int32 total_count = 2; int32 enabled_count = 3; } message GetToolInfoRequest { string tool_name = 1; } message ToolInfo { /// Unique tool identifier string name = 1; /// Tool display name string display_name = 2; /// Full description (for LLM system prompt) string description = 3; /// Short description (for UI) optional string short_description = 4; /// Tool category ToolCategory category = 5; /// JSON Schema for input parameters (as JSON string) string input_schema_json = 6; /// Current state bool enabled = 7; /// Tool capabilities/features ToolCapabilities capabilities = 8; /// Version info string version = 9; /// Whether this is a built-in or custom tool ToolSource source = 10; /// Reserved for removed config_schema_json reserved 11; /// Tool-specific options schema (JSON Schema as JSON string) /// Defines what options this tool accepts optional string options_schema_json = 12; /// Default values for tool options (as JSON string) optional string default_options_json = 13; /// Current effective options (defaults merged with configured, as JSON string) optional string current_options_json = 14; /// Supported output formats and what each includes. /// Each OutputFormat value should appear at most once. /// Server will reject duplicates during tool registration. repeated OutputFormatSpec output_formats = 15; /// All available output fields with descriptions. /// Each field name should be unique. /// Server will reject duplicates during tool registration. repeated OutputFieldSpec output_fields = 16; /// JSON Schema describing the structure of output_json returned by ExecuteTool. /// Generated from the tool's output types via schemars. string output_schema_json = 17; /// Resolved behavior contract version for this tool (e.g. "current", /// "legacy-0.4.10"). Empty for unmanaged tools. string contract_version = 18; /// Tool namespace (e.g. "GrokBuild", "Codex", "OpenCode"). /// Populated by ListTools pre-finalization from the fully-qualified /// registry key (e.g. "GrokBuild:grep" → namespace="GrokBuild"). string namespace = 19; } /// Describes an output format supported by a tool message OutputFormatSpec { /// Which format this describes OutputFormat format = 1; /// Human-readable description of this format string description = 2; /// Field names included by default in this format repeated string default_fields = 3; } /// Describes an available output field message OutputFieldSpec { /// Field name (used in include_fields/exclude_fields) string name = 1; /// Human-readable description string description = 2; /// JSON type: "string", "number", "boolean", "array", "object" string json_type = 3; /// Example value (as JSON string) optional string example_json = 4; /// Which formats include this field by default repeated OutputFormat included_in = 5; /// If true, this field can be large (useful for token management) bool potentially_large = 6; } message ToolCapabilities { /// Can run in background bool supports_background = 1; /// Can stream output bool supports_streaming = 2; /// Reserved for future session support reserved 3; /// Has side effects (modifies files/system) bool has_side_effects = 4; /// Can be cancelled mid-execution bool supports_cancellation = 5; /// Supports timeout configuration bool supports_timeout = 6; /// Custom capability flags repeated string custom_capabilities = 10; } enum ToolSource { TOOL_SOURCE_UNSPECIFIED = 0; TOOL_SOURCE_BUILTIN = 1; TOOL_SOURCE_MCP = 2; TOOL_SOURCE_CUSTOM = 3; TOOL_SOURCE_SKILL = 4; } // ============================================================================ // DYNAMIC TOOL MANAGEMENT MESSAGES // ============================================================================ message EnableToolRequest { string tool_name = 1; } message EnableToolResponse { bool success = 1; string message = 2; } message DisableToolRequest { string tool_name = 1; } message DisableToolResponse { bool success = 1; string message = 2; } // ============================================================================ // TOOL OPTIONS MESSAGES // ============================================================================ message SetToolOptionsRequest { string tool_name = 1; /// Options to set (as JSON string) /// These are merged with existing options unless replace=true string options_json = 2; /// If true, replace all options instead of merging bool replace = 3; } message SetToolOptionsResponse { bool success = 1; string message = 2; /// The effective options after setting (as JSON string) string effective_options_json = 3; } message GetToolOptionsRequest { string tool_name = 1; /// If true, include the options schema in the response bool include_schema = 2; } message GetToolOptionsResponse { string tool_name = 1; /// Current effective options (defaults + configured, as JSON string) string effective_options_json = 2; /// Default options for this tool (as JSON string) string default_options_json = 3; /// User-configured options that override defaults (as JSON string) string configured_options_json = 4; /// JSON Schema for options (if include_schema was true) optional string options_schema_json = 5; } message ResetToolOptionsRequest { string tool_name = 1; /// If provided, only reset these specific option keys /// If empty, reset all options to defaults repeated string keys_to_reset = 2; } message ResetToolOptionsResponse { bool success = 1; string message = 2; /// The effective options after reset (as JSON string) string effective_options_json = 3; } // ============================================================================ // TOOL NAME OVERRIDE MESSAGES // ============================================================================ message SetToolOverrideRequest { /// The canonical tool name to set overrides for. string tool_name = 1; /// The model-facing tool name. If empty, the canonical name is used /// (clears any existing tool name override for this tool). string tool_name_for_model = 2; /// Parameter name overrides (canonical param → model-facing param). /// Only include params that need overriding — unlisted params keep /// their canonical names. Empty map clears param overrides. map param_name_overrides_for_model = 3; } message SetToolOverrideResponse { bool success = 1; string message = 2; } message ClearToolOverrideRequest { /// The canonical tool name to clear all overrides for. string tool_name = 1; } message ClearToolOverrideResponse { bool success = 1; string message = 2; } // ============================================================================ // SYSTEM REMINDERS MESSAGES // ============================================================================ message SetSystemRemindersRequest { /// Whether system reminders should be enabled. bool enabled = 1; } message SetSystemRemindersResponse { bool success = 1; string message = 2; /// The effective state after the change. bool enabled = 3; } message GetSystemRemindersRequest {} message GetSystemRemindersResponse { /// Whether system reminders are currently enabled. bool enabled = 1; } // ============================================================================ // TRUNCATION CONFIG MESSAGES // ============================================================================ message SetTruncationConfigRequest { /// The truncation configuration to apply for the session. TruncationConfig config = 1; } message SetTruncationConfigResponse {} message GetTruncationConfigRequest {} message GetTruncationConfigResponse { /// The current effective truncation configuration. TruncationConfig config = 1; } // ============================================================================ // AGENT MESSAGES // ============================================================================ message GetSystemPromptRequest { /// "full" or "compact". Defaults to "full" if empty. string variant = 1; } message GetSystemPromptResponse { /// The rendered system prompt. string system_prompt = 1; /// "extend" or "full" — the prompt mode used. string prompt_mode = 2; } message GetAgentInfoRequest {} message GetAgentInfoResponse { string name = 1; string description = 2; repeated string tools = 3; repeated string disallowed_tools = 4; string permission_mode = 5; string output_format = 6; /// Completion requirement (if set). AgentCompletionRequirement completion_requirement = 7; /// Per-tool execution config. map tool_config = 8; } /// Completion requirement from the agent definition. message AgentCompletionRequirement { string tool = 1; string reminder = 2; } /// Per-tool execution config from the agent definition. message AgentToolExecConfig { AgentToolRetryConfig retry = 1; } /// Retry config for a single tool. message AgentToolRetryConfig { uint32 max_retries = 1; uint64 base_delay_ms = 2; uint64 max_delay_ms = 3; } message GetCompletionStateRequest {} message GetCompletionStateResponse { /// Whether a completion requirement exists for this agent. bool has_requirement = 1; /// The tool that must be called. string required_tool = 2; /// Whether the tool was called this turn. bool completed = 3; } message ResetCompletionStateRequest {} message ResetCompletionStateResponse {} message FinalizeAgentRequest {} message FinalizeAgentResponse { bool success = 1; /// The finalized system prompt (same as GetSystemPrompt would return). string system_prompt = 2; } // ============================================================================ // TOOL STATE MESSAGES // ============================================================================ message GetToolStateRequest {} message GetToolStateResponse { /// The serialized tool state as a JSON string. /// /// Shape: `{ "params": { ... }, "state": { ... } }`. /// Contains all registered (serializable) Resources — file read tracker, /// todo state, todo nudge counters, per-tool params, etc. /// Ephemeral resources (cwd, terminal, notification handle) are excluded. string state_json = 1; }