syntax = "proto3";

package kigi.tools.v1;

// ============================================================================
// MAIN SERVICE
// ============================================================================

/// KigiToolsService provides a gRPC interface to the Kigi tools runtime.
/// It supports tool execution, discovery, configuration, and lifecycle management.
service KigiToolsService {
  // ========== 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": { "<tool_id>": { ... }, ... },
  ///   "state":  { "<tool_id>": { ... }, ... }
  /// }
  /// ```
  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., "Kigi:bash", "Kigi: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 kigi-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<string, string> 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. "Kigi: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<string, uint32> 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. "Kigi", "Codex", "OpenCode").
  /// Populated by ListTools pre-finalization from the fully-qualified
  /// registry key (e.g. "Kigi:grep" → namespace="Kigi").
  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<string, string> 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<string, AgentToolExecConfig> 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;
}
