use schemars::JsonSchema; use serde::{Deserialize, Serialize}; /// Create new entities in the knowledge graph. Note: entity_type MUST ALWAYS be PascalCase (e.g. DatabaseTable, McpTool, File). #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct EntityInput { pub name: String, pub entity_type: String, #[serde(default)] pub observations: Vec, #[serde(default)] pub namespace: Option, } #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct CreateEntitiesTool { /// Array of entities to create. pub entities: Vec, } #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct UpdateEntityInput { /// The current name of the entity to update. pub name: String, /// Optional new name to rename the entity to. pub new_name: Option, /// Optional new entity type (e.g. PascalCase). pub new_entity_type: Option, } /// Update existing entities in the knowledge graph (e.g., to rename an entity or change its type). #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct UpdateEntitiesTool { /// Array of entity updates to perform. pub updates: Vec, } #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct RelationInput { pub from: String, pub to: String, pub relation_type: String, #[serde(default)] pub namespace: Option, } /// Create new relations between entities in the knowledge graph. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct CreateRelationsTool { /// Array of relations to create. pub relations: Vec, } #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct ObservationInput { /// The name of the entity. pub entity_name: String, /// The observation contents. pub contents: Vec, } /// Add new observations to existing entities in the knowledge graph. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct AddObservationsTool { /// Array of observations to add. pub observations: Vec, } /// Delete entities from the knowledge graph. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct DeleteEntitiesTool { /// Array of entity names to delete. pub entity_names: Vec, } #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct DeleteObservationInput { /// The name of the entity. pub entity_name: String, /// The observations to delete. pub observations: Vec, } /// Delete observations from existing entities. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct DeleteObservationsTool { /// Array of observation deletions. pub deletions: Vec, } /// Delete relations between entities. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct DeleteRelationsTool { /// Array of relations to delete. pub relations: Vec, } /// Read the entire knowledge graph. WARNING: For large graphs, use search_nodes or pagination (limit, offset) to avoid context limits. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct ReadGraphTool { /// Optional namespace to restrict the read to. pub namespace: Option, /// Optional entity_type to filter entities by (e.g. 'DatabaseTable'). pub entity_type: Option, /// Optional token budget cap. Truncates graph outputs to fit within the specified token budget. pub max_tokens: Option, /// Optional maximum number of entities to return (pagination). pub limit: Option, /// Optional entity offset for pagination. pub offset: Option, } /// Search specifically for Knowledge Graph entities and nodes by name or type. /// Note: For searching across tasks, snippets, ADRs, error fixes, and graph entities simultaneously, use 'omni_search' instead. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct SearchNodesTool { /// The search query. pub query: String, /// Optional namespace to restrict the search to. pub namespace: Option, /// Limit the number of results to avoid context limit overflow. Defaults to 10. pub limit: Option, /// Include the full observations of the matched items. If false, returns only IDs and types (recommended for LLMs to prevent context bloat). Defaults to false. pub include_body: Option, } /// Open and retrieve full details of specific nodes in the knowledge graph. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct OpenNodesTool { /// Array of entity names to open. pub names: Vec, } /// Log a significant code change or refactor in the memory system. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct LogCodeChangeTool { /// The path of the file that was changed. pub file_path: String, /// A description of the change. pub description: String, /// The associated git commit hash, if any. pub git_commit: Option, /// The associated git branch, if any. pub git_branch: Option, /// Optional symbol references (e.g. ['MemoryIndex', 'switchTab']) modified in this change. pub symbol_references: Option>, /// Optional line range (e.g. 'L123-L145') modified in the target file. pub line_range: Option, /// Optional repository name (e.g. 'mcp-memory', 'ai-pr-review'). pub repo_name: Option, /// Optional repository remote origin URL (e.g. 'git@bitbucket.org:org/repo.git' or 'svn://...'). pub repo_url: Option, /// Optional project namespace (defaults to repo_name or 'global'). pub namespace: Option, /// Optional change kind: 'added', 'modified', 'deleted', 'renamed'. Defaults to 'modified'. pub change_kind: Option, /// Optional author or subagent attribution (e.g. 'user', 'MemoryLibrarian', SVN author). pub author: Option, /// Optional conversation or session ID. pub session_id: Option, /// Optional VCS system type: 'git', 'svn', 'hg', etc. Auto-detected if omitted. pub vcs_type: Option, /// Optional VCS revision identifier (e.g. SVN 'r14829' or Git commit SHA). pub revision: Option, /// Optional VCS branch (e.g. SVN 'trunk', 'branches/v1.0' or Git branch). pub branch: Option, /// Optional repository root URL or path. pub repository_root: Option, } /// Query recently logged code changes. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct QueryRecentChangesTool { /// Optional namespace to filter changes by project/workspace. pub namespace: Option, /// Optional repository name to filter changes. pub repo_name: Option, /// Optional VCS type to filter changes ('git', 'svn', etc.). pub vcs_type: Option, /// Maximum number of records to return (defaults to 50). pub limit: Option, /// Optional offset for pagination. pub offset: Option, } /// Generate a visual representation of the knowledge graph. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct VisualizeGraphTool { /// Optional search query to filter the graph before visualization. pub query: Option, /// Optional namespace to restrict the visualization to. pub namespace: Option, } /// Condense or summarize an entity's observations to reduce size. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct CondenseEntityTool { /// The name of the entity to condense. pub entity_name: String, /// The condensed observations that will replace the existing ones. pub summarized_observations: Vec, } #[derive(Debug, Deserialize, Serialize, JsonSchema, PartialEq)] #[serde(rename_all = "snake_case")] pub enum SubgraphFormat { Json, MarkdownTree, } /// Extract a multi-hop neighborhood subgraph around a specific root entity node as JSON or Markdown topology tree. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct GetSubgraphTool { /// The root entity name to start the subgraph search from. pub root_entity: Option, /// Maximum search depth (hops). Defaults to 2. pub depth: Option, /// Output format: 'json' (raw entities and relations) or 'markdown_tree' (compact topology tree). Defaults to 'markdown_tree'. pub format: Option, /// Optional namespace filter. pub namespace: Option, /// Target maximum token length for generated summary when format is 'markdown_tree'. Defaults to 1000. pub max_tokens: Option, } /// Save, restore, list, or delete point-in-time memory state snapshot checkpoints. #[derive(Debug, Deserialize, Serialize, JsonSchema)] #[serde(tag = "action", rename_all = "snake_case")] pub enum ManageCheckpointTool { /// Save a checkpoint. Create { /// Unique name or ID for the snapshot checkpoint. name_or_id: Option, /// Optional description of why this checkpoint was created. description: Option, /// Optional namespace filter. namespace: Option, }, /// Restore a checkpoint. Restore { /// Unique name or ID for the snapshot checkpoint. name_or_id: Option, /// Optional namespace filter. namespace: Option, }, /// List checkpoints. List { /// Optional namespace filter. namespace: Option, }, /// Delete a checkpoint. Delete { /// Unique name or ID for the snapshot checkpoint. name_or_id: Option, /// Optional namespace filter. namespace: Option, } } /// Merge two entities in the knowledge graph into one. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct MergeEntitiesTool { /// The name of the entity to merge from (will be deleted). pub source_entity: String, /// The name of the entity to merge into. pub target_entity: String, } /// Find orphaned entities (entities without any relations) in the graph. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct FindOrphansTool {} /// Log a complex error and its fix for future reference. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct LogErrorFixTool { /// The error signature or stack trace. pub signature: String, /// The solution applied to fix the error. pub solution: String, /// The associated git commit hash, if any. pub git_commit: Option, /// The associated git branch, if any. pub git_branch: Option, /// Optional symbol references (e.g. ['MemoryIndex', 'switchTab']) associated with the error. pub symbol_references: Option>, /// Optional line range (e.g. 'L123-L145') associated with the error. pub line_range: Option, } /// Search historical error fixes using keyword query or stack trace vector similarity. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct SearchErrorFixesTool { /// The search query string. pub query: Option, /// Exact stack trace or error signature for vector cosine matching. pub stack_trace: Option, /// Limit the number of results to avoid context limit overflow. Defaults to 5. pub limit: Option, /// Include the full solution details. If false, returns only error signatures. Defaults to false. pub include_body: Option, } /// Add a summary of the current session. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct AddSessionSummaryTool { /// The summary content. pub summary: String, /// The namespace to add the summary to. #[serde(default = "crate::models::default_namespace")] pub namespace: String, /// Optional conversation or session ID. pub session_id: Option, /// Optional repository name. pub repo_name: Option, /// Optional git branch. pub git_branch: Option, /// Optional git commit hash. pub git_commit: Option, /// Optional list of completed task IDs or task summaries in this session. pub tasks_completed: Option>, /// Optional list of recommended next steps for incoming agents. pub next_steps: Option>, } /// Generate a standup report for a specific time window. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct GenerateStandupReportTool { /// The namespace to generate the report for. #[serde(default = "crate::models::default_namespace")] pub namespace: String, /// The number of hours to look back for activity. pub hours_lookback: u64, } /// Search across all memory stores (Graph, Tasks, Snippets, ADRs, Error Fixes, Tech Debt) using Hybrid Reciprocal Rank Fusion (BM25 + Dense Vectors). /// Highly recommended for discovery. Supports Lucene query syntax. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct OmniSearchTool { /// The search query. Supports Lucene syntax (e.g., 'title:"auth" AND status:open'). pub query: String, /// Optional namespace to restrict the search to. pub namespace: Option, /// Limit the number of results per category to avoid context limit overflow. Defaults to 5. pub limit: Option, /// Include the full body/content of the matched items. If false, returns only IDs and titles (recommended for LLMs to prevent context bloat). Defaults to false. pub include_body: Option, /// Optional token budget cap. Dynamically caps and truncates search results to stay within max_tokens. pub max_tokens: Option, } /// Get a health digest of the project. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct GetProjectHealthTool { /// The namespace to get health for. #[serde(default = "crate::models::default_namespace")] pub namespace: String, } /// Traverse the knowledge graph to find a path between two entities. #[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] pub struct QueryGraphPathTool { /// The starting entity name. pub start_node: String, /// The ending entity name. pub end_node: String, /// Optional maximum depth to search. pub max_depth: Option, } /// Define a strict checklist of acceptance criteria for a given task or feature before starting work. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct SetAcceptanceCriteriaTool { /// The title of the task. pub task_title: String, /// A list of acceptance criteria requirements. pub criteria: Vec, } /// Mark a previously defined acceptance criteria as met by providing cryptographic-like proof. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct VerifyAcceptanceCriteriaTool { /// The ID of the task. pub task_id: String, /// The specific criterion being verified. pub criteria: String, /// The proof or evidence that the criterion is met. pub proof: String, } /// Audit the knowledge graph to detect orphaned entities, compute name similarity for potential duplicate merges, and optionally auto-prune orphans and stale file/symbol tombstones (ADR-0111). #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct SweepGraphHealthTool { /// Optional flag to automatically prune orphaned nodes with 0 relations. Defaults to false. pub auto_prune_orphans: Option, /// Minimum string similarity threshold (0.0 to 1.0) to report duplicate entity pairs. Defaults to 0.8. pub similarity_threshold: Option, /// Optional flag to prune stale entities whose file paths or symbols no longer exist on disk (ADR-0111). Defaults to false. pub auto_prune_stale_files: Option, } /// Trace the causal provenance and historical lineage linking a task, ADR, git commit, code change, or error fix. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct QueryLineageTool { /// The task ID, file path, symbol name, or git commit to query lineage for. pub query: String, } /// Topological task resolver that returns unblocked, ready-to-run active tasks. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct GetNextActionableTasksTool { /// Optional git branch filter. pub git_branch: Option, /// Limit the number of actionable tasks returned. Defaults to 5. pub limit: Option, } /// Manage diagnostic hypotheses, tested evidence, and status during problem solving. #[derive(Debug, Deserialize, Serialize, JsonSchema)] #[serde(tag = "action", rename_all = "snake_case")] pub enum HypothesesTool { /// Log a new diagnostic hypothesis. Log { /// The diagnostic hypothesis or potential root cause. hypothesis: String, /// Optional task ID associated with this hypothesis. task_id: Option, /// Status: 'unverified', 'verified', or 'rejected'. Defaults to 'unverified'. status: Option, /// Evidence or test results supporting or disproving the hypothesis. evidence: Option, }, /// Query existing hypotheses. Query { /// Optional search query text. query: Option, /// Optional task ID to filter hypotheses. task_id: Option, /// Optional status filter. status: Option, } } #[cfg(test)] mod tests { use super::*; use schemars::schema_for; #[test] fn test_schema_extraction_includes_descriptions() { let schema = schema_for!(SetAcceptanceCriteriaTool); let schema_json = serde_json::to_value(&schema).unwrap(); let desc = schema_json .get("description") .and_then(|d| d.as_str()) .unwrap_or(""); assert!( desc.contains("Define a strict checklist of acceptance criteria"), "Schema should include struct docstring as description" ); let schema2 = schema_for!(LogCodeChangeTool); let schema2_json = serde_json::to_value(&schema2).unwrap(); let props = schema2_json.get("properties").expect("Missing properties"); let file_path_prop = props.get("file_path").expect("Missing file_path property"); let field_desc = file_path_prop .get("description") .and_then(|d| d.as_str()) .unwrap_or(""); assert!( field_desc.contains("The path of the file that was changed"), "Schema should include field docstring as description" ); } } /// Get the active worktree context, including branch name, modified files, and a truncated git diff. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct GetActiveWorktreeContextTool {} /// Tail a specific log file in the background so it can be queried later. #[derive(Debug, Deserialize, Serialize, JsonSchema, PartialEq)] #[serde(rename_all = "snake_case")] pub enum ProcessLogAction { Watch, Get, Clear, } /// Monitor, tail, and manage process logs: watch a log file, tail recent output, or clear log files. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct ProcessLogsTool { /// Action to perform: 'watch', 'get', or 'clear'. pub action: ProcessLogAction, /// Path to the log file. pub file_path: String, /// Maximum number of lines to return for action 'get'. Defaults to 100. pub max_lines: Option, } /// Read a file and return only its AST skeleton (Imports, Structs, Enums, Traits, Functions) #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct ReadFileSkeletonTool { /// The path to the file to read. pub file_path: String, } /// Replace a specific AST node in a file (robust structural editing). Use this instead of regex or line-based string replacement to prevent indentation bugs and matching failures. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct ReplaceAstNodeTool { /// The path of the file to modify. pub file_path: String, /// The AST node type to replace (e.g., 'function_item', 'impl_item'). pub node_type: String, /// The name of the specific AST node to replace (e.g., 'execute'). pub node_name: String, /// The completely new structural content for this AST node. pub new_content: String, } /// Semantic code search using local vector embeddings. Use this conceptual search instead of raw regex (grep) when trying to locate abstract logic or exploring new patterns. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct SemanticCodeSearchTool { /// The conceptual or semantic search query. pub query: String, /// Optional directory to restrict the search to. pub directory: Option, } /// Get a bird's-eye view of directory architecture. Use this when first exploring a new repository to get a summary of what each file is responsible for, instead of blindly reading files. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct ReadDirectoryArchitectureTool { /// The directory path to analyze. pub directory: String, } #[derive(Debug, Deserialize, Serialize, JsonSchema, PartialEq)] #[serde(rename_all = "snake_case")] pub enum SubagentNamespaceAction { Create, Condense, Purge, } /// Manage isolated memory namespaces for subagent sessions (create, condense/promote, or purge). #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct ManageSubagentNamespaceTool { /// Action to perform: 'create', 'condense', or 'purge'. pub action: SubagentNamespaceAction, /// Subagent namespace ID. pub subagent_id: String, /// For 'condense': whether to auto-purge the subagent namespace after promotion. Defaults to true. pub purge_after_promotion: Option, } /// Find all source locations and AST chunks where a specific symbol (function, struct, method, type) is referenced or called. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct FindSymbolReferencesTool { /// The symbol name (e.g. 'MemoryState', 'handle_search', 'AppError'). pub symbol: String, /// Optional maximum number of reference locations to return. Defaults to 10. pub limit: Option, /// Optional workspace or directory path to scan. If omitted, falls back to active pinned files or current working directory. #[serde(default, alias = "directory", alias = "path")] pub workspace_dir: Option, } /// Find all caller functions or methods that invoke a specified target function or method name. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct GetCallersTool { /// The target function or method name (e.g. 'generate_embeddings_async', 'keyword_search'). pub function_name: String, /// Optional maximum number of callers to return. Defaults to 10. pub limit: Option, /// Optional workspace or directory path to scan. If omitted, falls back to active pinned files or current working directory. #[serde(default, alias = "directory", alias = "path")] pub workspace_dir: Option, } /// Query git commit history, diffs, and change ledger entries using keyword or semantic search. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct QueryGitDiffsTool { /// Search query (e.g. 'deploy-server', 'shutdown', 'debounce', 'rename trick'). pub query: String, /// Optional maximum number of commit diff entries to return. Defaults to 5. pub limit: Option, } /// Promote a task observation or finding into a permanent Knowledge Graph entity. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct PromoteToEntityTool { /// Note text or content to promote. pub content: String, /// Target entity name to create or merge into. pub entity_name: String, /// Entity type (e.g. 'Component', 'Decision', 'BugFix', 'Architecture'). pub entity_type: String, /// Optional namespace. Defaults to 'default'. #[serde(default = "crate::models::default_namespace")] pub namespace: String, } /// Analyze the potential downstream breaking impact of modifying a function, struct, or file across AST callers and Knowledge Graph relations. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct AnalyzeImpactTool { /// Target function, struct, or symbol name (e.g. 'MemoryState', 'execute', 'AppError'). pub target_symbol: String, /// Optional file path. pub file_path: Option, } /// Get a consolidated 1-page executive summary of current active branch, active task, open tech debt, and diagnostic hypotheses in 1 turn. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct GetPreflightContextTool { /// Optional namespace. Defaults to 'default'. #[serde(default = "crate::models::default_namespace")] pub namespace: String, /// Optional git branch to filter context for. pub git_branch: Option, } /// Inspect Knowledge Graph entities, observations, and tech debt symbol/line references against current files on disk and AST, flagging and healing stale or broken pointers. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct ResolveStaleSymbolsTool { /// Optional entity or file path to check. If omitted, checks all graph entities and tech debts. pub target: Option, /// Whether to automatically update or remove broken references. Defaults to true. pub auto_heal: Option, } /// Generate a compact, LLM-optimized Markdown topology or summary of a graph component capped within a strict token budget. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct SummarizeSubgraphTool { /// The root entity name to center the summary on (e.g. 'MemoryState', 'ServerRouter'). pub root_entity: String, /// Search depth from root entity. Defaults to 2. pub depth: Option, /// Target maximum token length for the generated summary. Defaults to 1000. pub max_tokens: Option, } /// Real-time inter-agent communication bus: broadcast signals or query active signals from peer subagents. #[derive(Debug, Deserialize, Serialize, JsonSchema)] #[serde(tag = "action", rename_all = "snake_case")] pub enum AgentSignalsTool { /// Broadcast a signal to peer subagents. Broadcast { /// Sender agent ID or role (e.g. 'PrePushAuditor', 'MemoryLibrarian'). sender: String, /// Signal type or event category (e.g. 'AUDIT_PASSED', 'REPRODUCER_READY', 'TESTS_FAILED'). signal_type: String, /// JSON or text payload containing event details or artifact URIs. payload: String, /// Optional Time-To-Live in seconds for the signal. Defaults to 3600 (1 hour). ttl_seconds: Option, }, /// Query active signals. Query { /// Optional sender agent ID or role filter. sender: Option, /// Optional signal type filter. signal_type: Option, /// Optional limit on returned signals. Defaults to 20. limit: Option, } } /// Trigger an automated context checkpoint, summarizing active tasks, hypotheses, recent commits, and open tech debt into a permanent HandoffMemo. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct AutoSessionCheckpointTool { /// Author or agent ID creating the checkpoint. Defaults to 'AutoCheckpoint'. pub author: Option, /// Optional namespace. Defaults to 'default'. #[serde(default = "crate::models::default_namespace")] pub namespace: String, } // Consolidated Smart Management Tools #[derive(Debug, Deserialize, Serialize, JsonSchema, PartialEq)] #[serde(rename_all = "snake_case")] pub enum HandoffMemoAction { Leave, Read, Clear, } /// Persistent handoff memos for passing session context to future agents. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct HandoffMemosTool { /// Action to perform: 'leave', 'read', or 'clear'. pub action: HandoffMemoAction, /// Content of the handoff memo (required for 'leave'). pub content: Option, /// Optional namespace filter or assignment. pub namespace: Option, /// Array of memo IDs to clear (required for 'clear'). pub ids: Option>, } /// Action-oriented task tracking system. #[derive(Debug, Deserialize, Serialize, JsonSchema)] #[serde(tag = "action", rename_all = "snake_case")] pub enum TasksTool { /// Create a new task. Add { /// Task title. title: String, /// Task description. description: Option, /// Optional parent task ID for subtasks. parent_id: Option, /// List of dependent task IDs. dependencies: Option>, /// Branch associated with this task. git_branch: Option, /// Optional namespace filter or assignment. namespace: Option, /// Repository name. repo_name: Option, /// Priority: 'low', 'medium', 'high', 'critical'. priority: Option, /// Assigned agent or subagent. assigned_agent: Option, /// Command used to verify completion. verification_command: Option, }, /// Update task status. Update { /// Task ID. id: String, /// New status: 'pending', 'completed', or 'cancelled'. status: String, }, /// Delete a task and its subtasks. Delete { /// Task ID. id: String, }, /// List active tasks. List { /// Optional Git branch filter. git_branch: Option, /// Optional status filter. status: Option, /// Summary level: 'compact', 'detailed', or 'full'. Defaults to 'detailed'. summary_level: Option, /// Maximum tokens budget cap. max_tokens: Option, /// Optional pagination offset. offset: Option, }, /// Set a checklist of acceptance criteria. SetCriteria { /// Task ID or title. id: String, /// Acceptance criteria list. criteria: Vec, }, /// Mark an acceptance criteria as met with cryptographic-like proof. Verify { /// Task ID or title. id: String, /// Verification proof or details. proof: Option, } } /// Project milestone management. #[derive(Debug, Deserialize, Serialize, JsonSchema)] #[serde(tag = "action", rename_all = "snake_case")] pub enum MilestonesTool { /// Create a new milestone. Add { /// Milestone title. title: String, /// Optional namespace filter or assignment. namespace: Option, /// Optional target completion date. target_date: Option, /// Optional description of milestone scope. description: Option, /// Optional deliverables or task checklist. deliverables: Option>, /// Optional list of task IDs associated with this milestone. #[serde(default)] task_ids: Option>, /// Optional repository name. repo_name: Option, }, /// Update milestone status. Update { /// Milestone ID. id: String, /// New status. status: String, /// Optional deliverables or task checklist. deliverables: Option>, /// Optional list of task IDs associated with this milestone. #[serde(default)] task_ids: Option>, }, /// List milestones. List { /// Optional namespace. namespace: Option, } } #[derive(Debug, Deserialize, Serialize, JsonSchema, PartialEq)] #[serde(rename_all = "snake_case")] pub enum SnippetAction { Store, Search, Delete, Tag, } /// Syntactically preserved reusable code snippets vault (store, search, delete, tag). #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct SnippetsTool { /// Action to perform: 'store', 'search', 'delete', or 'tag'. pub action: SnippetAction, /// Snippet ID or name (required for 'delete', 'tag'). pub id: Option, /// Search query or snippet name (required for 'store'). pub query: Option, /// Snippet name alias (for 'store', 'delete', 'tag'). pub name: Option, /// Snippet language (for 'store'). pub language: Option, /// Code content (for 'store'). pub code: Option, /// Snippet description (for 'store'). pub description: Option, /// Classification tags (for 'store', 'search', 'tag'). pub tags: Option>, /// Enable hybrid lexical + semantic vector ranking (for 'search'). pub hybrid: Option, /// Optional project namespace. pub namespace: Option, /// Optional repository name. pub repo_name: Option, /// Optional origin file path where the snippet was extracted from. pub origin_file: Option, /// Optional line range in origin file (e.g. 'L10-L45'). pub line_range: Option, } /// Architectural Decision Records (ADRs) log. #[derive(Deserialize, Serialize, JsonSchema, Debug, Clone)] #[serde(tag = "action", rename_all = "snake_case")] pub enum DecisionsTool { /// Record an ADR. Log { /// ADR title. title: String, /// ADR status. status: Option, /// Context & problem statement. context: Option, /// Decision made. decision: Option, /// Consequences & tradeoffs. consequences: Option, /// Optional namespace. namespace: Option, /// Optional repository name. repo_name: Option, /// Optional author or architect behind the decision. author: Option, /// Optional affected system components or crates. affected_components: Option>, /// Optional alternative designs or libraries considered. alternatives_considered: Option>, /// Optional superseded ADR ID. supersedes: Option, /// Optional Git commit where decision was implemented. git_commit: Option, /// Optional Git branch where decision was implemented. git_branch: Option, /// Optional task ID linked to this decision. task_id: Option, }, /// Search ADRs. Query { /// Search query string. query: Option, /// Optional namespace. namespace: Option, /// Limit the number of query results. Defaults to 20. limit: Option, /// Include the full body of the matched decisions. Defaults to true. include_body: Option, }, /// Update ADR status or implementation info. Update { /// ADR ID. id: String, /// ADR title. title: Option, /// ADR status. status: Option, /// Context & problem statement. context: Option, /// Decision made. decision: Option, /// Consequences & tradeoffs. consequences: Option, /// Optional Git commit where decision was implemented. git_commit: Option, /// Optional Git branch where decision was implemented. git_branch: Option, /// Optional task ID linked to this decision. task_id: Option, /// Optional namespace. namespace: Option, /// Optional repository name. repo_name: Option, /// Optional author or architect behind the decision. author: Option, /// Optional affected system components or crates. affected_components: Option>, /// Optional alternative designs or libraries considered. alternatives_considered: Option>, /// Optional superseded ADR ID. supersedes: Option, }, /// Remove an ADR. Delete { /// ADR ID. id: String, } } /// Technical debt backlog management. #[derive(Debug, Deserialize, Serialize, JsonSchema)] #[serde(tag = "action", rename_all = "snake_case")] pub enum TechDebtTool { /// Record technical debt. Log { /// Tech debt description. description: String, /// Optional title or summary of tech debt. title: Option, /// Ideal solution. ideal_solution: Option, /// Associated git commit hash. git_commit: Option, /// Associated git branch. git_branch: Option, /// Symbol references associated with the tech debt. symbol_references: Option>, /// Line range associated with the tech debt. line_range: Option, /// Optional namespace. namespace: Option, /// Optional debt severity: 'low', 'medium', 'high', 'critical'. severity: Option, /// Optional repository name. repo_name: Option, /// Optional file path where debt exists. file_path: Option, /// Optional workaround currently in place. workaround: Option, /// Optional effort estimate to fix. effort_estimate: Option, }, /// Mark tech debt resolved. Resolve { /// Tech debt ID. id: String, }, /// List tech debt items. List { /// Include resolved tech debt items. include_resolved: Option, /// Optional namespace. namespace: Option, /// Summary level for list action: 'compact', 'detailed', or 'full'. summary_level: Option, /// Optional token budget cap for list output. max_tokens: Option, } } #[derive(Debug, Deserialize, Serialize, JsonSchema, PartialEq)] #[serde(rename_all = "snake_case")] pub enum EnvAction { UpdateFingerprint, ReadFingerprint, LogRequirement, Register, GetDetails, } /// Environment requirements, tool fingerprints & infrastructure management. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct EnvironmentTool { /// Action to perform: 'update_fingerprint', 'read_fingerprint', 'log_requirement', 'register', or 'get_details'. pub action: EnvAction, /// Map of tool names to versions (for 'update_fingerprint'). pub tool_versions: Option>, /// Env variable key (required for 'log_requirement'). pub key: Option, /// Description (for 'log_requirement', 'register'). pub description: Option, /// Secret flag (for 'log_requirement'). pub is_secret: Option, /// Environment name (required for 'register'). pub name: Option, /// Environment URL (for 'register'). pub url: Option, /// VPN required flag (for 'register'). pub requires_vpn: Option, /// Optional namespace. pub namespace: Option, /// Optional operating system name (e.g. 'windows', 'linux', 'darwin'). pub os: Option, /// Optional shell name (e.g. 'pwsh', 'bash', 'zsh', 'cmd'). pub shell: Option, } #[derive(Debug, Clone, Copy, Deserialize, Serialize, JsonSchema, PartialEq)] #[serde(rename_all = "snake_case")] pub enum ClipboardAction { Image, Text, History, Clear, Write, } /// Smart OS Clipboard management with overwrite-immune screenshot caching and OCR. /// Returns cached screenshot even if text was copied afterwards! /// Triggers: Call 'image' immediately when user says "look at image in clipboard", "see screenshot", /// "look at clipboard", "what I copied", or shares terminal error captures. #[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct ClipboardTool { /// Action to perform: 'image', 'text', 'history', 'clear', or 'write'. pub action: ClipboardAction, /// Plain text content (for 'write'). pub text: Option, /// HTML content (for 'write'). pub html: Option, /// File paths for Windows File Drop (for 'write'). pub files: Option>, /// Image path (for 'write'). pub image_path: Option, }