Documentation
¶
Index ¶
- Constants
- func AttachPermissionMatcherMetadata(metadata map[string]any, resolvedTool Tool, matcher func(string) bool) map[string]any
- func BuildPermissionMatcher(ctx context.Context, resolvedTool Tool, input map[string]any) (func(string) bool, error)
- func ExecutesInPlanMode(t Tool, input map[string]any) bool
- func IsValidToolName(name string) bool
- func PermissionMatcherFromMetadata(metadata map[string]any) func(string) bool
- func RequiresUserInteraction(t Tool) bool
- type CallInput
- type CallResult
- type ContentType
- type ContextModifier
- type Definition
- type PermissionMatcherTool
- type PlanModeExecutableTool
- type RequiresUserInteractionTool
- type ResultMetadata
- type Tool
- type ToolSurface
- type ToolUseContext
- type Toolset
Constants ¶
const PermissionRuleMatcherKey = "permission_rule_matcher"
PermissionRuleMatcherKey is the metadata key used to pass a prepared matcher through runtime metadata.
const ResolvedToolMetadataKey = "resolved_tool"
ResolvedToolMetadataKey is the metadata key used to pass the resolved tool through runtime metadata.
Variables ¶
This section is empty.
Functions ¶
func AttachPermissionMatcherMetadata ¶
func AttachPermissionMatcherMetadata(metadata map[string]any, resolvedTool Tool, matcher func(string) bool) map[string]any
AttachPermissionMatcherMetadata clones metadata and injects optional tool permission matching context.
func BuildPermissionMatcher ¶
func BuildPermissionMatcher(ctx context.Context, resolvedTool Tool, input map[string]any) (func(string) bool, error)
BuildPermissionMatcher prepares a content-specific permission matcher when the tool supports it.
func ExecutesInPlanMode ¶
ExecutesInPlanMode returns true when a tool should execute while the session is in plan mode. Read-only tools are always allowed so the agent can inspect the codebase, and specific control tools can opt in explicitly.
func PermissionMatcherFromMetadata ¶
PermissionMatcherFromMetadata extracts a prepared permission matcher from metadata when available.
func RequiresUserInteraction ¶
RequiresUserInteraction returns true if the tool requires explicit user interaction even in bypass mode. Returns false if the tool does not implement RequiresUserInteractionTool or if it returns false.
Types ¶
type CallInput ¶
type CallInput struct {
// Raw is the raw input string (for backward compatibility)
Raw string `json:"raw,omitempty"`
// Parsed is the structured input
Parsed map[string]any `json:"parsed,omitempty"`
// ToolUseID identifies which tool use this is for
ToolUseID string `json:"tool_use_id,omitempty"`
// SessionID identifies the session
SessionID types.SessionID `json:"session_id,omitempty"`
// TurnID identifies the turn
TurnID types.TurnID `json:"turn_id,omitempty"`
// ToolContext carries the runtime tool context for advanced execution paths.
ToolContext *ToolUseContext `json:"-"`
}
CallInput represents the input to a tool call
func (CallInput) ToolContextValue ¶
func (i CallInput) ToolContextValue() ToolUseContext
ToolContextValue returns the runtime tool context carried by the call input, or a default context.
type CallResult ¶
type CallResult struct {
// Data is the result data
Data any `json:"data"`
// ContentType indicates the type of result
ContentType ContentType `json:"content_type"`
// Content is the formatted content (for text results)
Content string `json:"content,omitempty"`
// Error contains any error that occurred
Error error `json:"error,omitempty"`
// Metadata contains additional result information
Metadata *ResultMetadata `json:"metadata,omitempty"`
// ProgressUpdates contains any progress updates made during execution
ProgressUpdates []types.ToolProgress `json:"progress_updates,omitempty"`
// NewMessages contains any follow-up runtime messages emitted by the tool.
NewMessages []types.Message `json:"new_messages,omitempty"`
// ContextModifier mutates runtime context after successful execution.
ContextModifier ContextModifier `json:"-"`
}
CallResult represents the result of a tool call
func NewErrorResult ¶
func NewErrorResult(err error) CallResult
NewErrorResult creates a new error result
func NewJSONResult ¶
func NewJSONResult(data any) CallResult
NewJSONResult creates a new JSON result. Content defaults to the JSON encoding of data - callers that want a human-readable summary instead (most do, for the model and for chat display) set .Content themselves right after calling this. Tools that don't (e.g. grep, list_directory, get_file_metadata as of this writing) used to ship an empty Content, which every consumer downstream (tool.progress metadata, persisted messages, the done payload's tool_results) treats differently when empty - one silently omits it, one falls back to a generic "Tool X completed" string, one used to fall back to Go's %v-formatted Data dump. Defaulting here means there is always at least valid JSON to fall back to, for the model and for any frontend renderer, regardless of which of those paths a given tool call happens to be read through.
func NewTextResult ¶
func NewTextResult(content string) CallResult
NewTextResult creates a new text result
func (CallResult) GetContent ¶
func (r CallResult) GetContent() string
GetContent returns the content as a string
func (CallResult) IsError ¶
func (r CallResult) IsError() bool
IsError returns true if the tool call failed
func (CallResult) IsSuccess ¶
func (r CallResult) IsSuccess() bool
IsSuccess returns true if the tool call succeeded
func (CallResult) String ¶
func (r CallResult) String() string
String returns the string representation of a tool result
type ContentType ¶
type ContentType string
ContentType represents the type of tool result
const ( ContentTypeText ContentType = "text" ContentTypeJSON ContentType = "json" ContentTypeBinary ContentType = "binary" ContentTypeStream ContentType = "stream" ContentTypeMixed ContentType = "mixed" )
type ContextModifier ¶
type ContextModifier func(ToolUseContext) ToolUseContext
ContextModifier mutates the tool runtime context after a tool call.
type Definition ¶
type Definition struct {
// Name is the unique identifier for this tool
Name string `json:"name"`
// DisplayName is a human-readable name
DisplayName string `json:"display_name,omitempty"`
// Description explains what the tool does
Description string `json:"description"`
// Prompt provides detailed guidance on when and how to use the tool
// This is used by the AI to understand the tool's usage patterns
Prompt string `json:"prompt,omitempty"`
// SearchHint provides a hint for tool search functionality
SearchHint string `json:"search_hint,omitempty"`
// Category groups related tools together
Category string `json:"category,omitempty"`
// InputSchema defines the expected input structure
InputSchema schema.JSONSchema `json:"input_schema"`
// IsReadOnly indicates if the tool doesn't modify state
IsReadOnly bool `json:"is_read_only"`
// IsDestructive indicates if the tool can cause destructive changes
IsDestructive bool `json:"is_destructive"`
// IsConcurrencySafe indicates if the tool can run concurrently with others
IsConcurrencySafe bool `json:"is_concurrency_safe"`
// RequiresPermission indicates if the tool requires permission checks
RequiresPermission bool `json:"requires_permission"`
// Aliases are alternative names for this tool
Aliases []string `json:"aliases,omitempty"`
// MaxResultSize is the maximum number of characters allowed in the tool
// result content. When exceeded the runtime truncates and records a
// ContentReplacementState (equivalent to OpenClaude's maxResultSizeChars).
// A value of 0 means unlimited.
MaxResultSize int `json:"max_result_size,omitempty"`
// ShouldDefer indicates this tool must be loaded via ToolSearch before calling.
ShouldDefer bool `json:"should_defer,omitempty"`
// AlwaysLoad indicates this tool should always be loaded in the initial prompt.
AlwaysLoad bool `json:"always_load,omitempty"`
// IsMCP indicates this is an MCP tool.
IsMCP bool `json:"is_mcp,omitempty"`
// Metadata contains additional tool metadata
Metadata map[string]any `json:"metadata,omitempty"`
}
Definition defines a tool's metadata and schema
func (Definition) Validate ¶
func (d Definition) Validate() error
Validate validates a tool definition
type PermissionMatcherTool ¶
type PermissionMatcherTool interface {
PreparePermissionMatcher(ctx context.Context, input map[string]any) (func(ruleContent string) bool, error)
}
PermissionMatcherTool is an optional capability for tools that support content-specific permission-rule matching.
type PlanModeExecutableTool ¶
PlanModeExecutableTool is an optional capability for tools that must still execute while the session is in plan mode, even if they are not read-only. This is primarily for plan control-flow tools such as ExitPlanMode.
type RequiresUserInteractionTool ¶
type RequiresUserInteractionTool interface {
RequiresUserInteraction() bool
}
RequiresUserInteractionTool is an optional capability for tools that require explicit user interaction even in bypass mode. When a tool implements this interface and RequiresUserInteraction returns true, the permission pipeline will not auto-allow the tool in bypass mode. Aligned with OpenClaude's tool.requiresUserInteraction?().
type ResultMetadata ¶
type ResultMetadata struct {
// ExecutionDuration is how long the tool took to run (milliseconds)
ExecutionDuration int64 `json:"execution_duration_ms"`
// ContentReplacement indicates if content was replaced due to size
ContentReplacement *types.ContentReplacementState `json:"content_replacement,omitempty"`
// Additional metadata
Additional map[string]any `json:"additional,omitempty"`
}
ResultMetadata contains metadata about a tool result
type Tool ¶
type Tool interface {
// Definition returns the tool's definition.
Definition() Definition
// Call executes the tool with the given input.
// The returned error is reserved for truly unrecoverable system failures
// (e.g. context cancellation). Tool-level errors should be returned inside
// CallResult.Error so that the runtime always produces a tool_result message.
Call(ctx context.Context, input CallInput, permissionCheck types.CanUseToolFn) (CallResult, error)
// Description returns a human-readable description of what this tool does.
Description(ctx context.Context) (string, error)
// ValidateInput validates and optionally normalizes tool input before execution.
ValidateInput(ctx context.Context, input map[string]any) (map[string]any, error)
// CheckPermissions performs tool-specific permission checks before the global
// permission pipeline. Return types.Passthrough to delegate to global checks.
CheckPermissions(ctx context.Context, input map[string]any, toolCtx ToolUseContext) types.PermissionResult
// IsConcurrencySafe returns whether this specific tool use can run concurrently.
IsConcurrencySafe(input map[string]any) bool
// IsReadOnly returns whether this specific tool use is read-only.
IsReadOnly(input map[string]any) bool
// IsEnabled returns whether this tool is currently active.
// Disabled tools are skipped during execution. Default: true.
IsEnabled() bool
// FormatResult serialises the tool output into the string that will be sent
// back to the model inside a tool_result content block. Each tool controls
// its own serialisation (equivalent to OpenClaude's mapToolResultToToolResultBlockParam).
// Default: fmt.Sprintf("%v", data) when Content is empty.
FormatResult(data any) string
// BackfillInput enriches a shallow clone of the parsed input with derived
// fields that should be visible to hooks and permissions but are NOT passed
// to tool.Call() (equivalent to OpenClaude's backfillObservableInput).
// The returned map is the enriched copy. Default: returns input unchanged.
BackfillInput(ctx context.Context, input map[string]any) map[string]any
}
Tool represents a tool that can be called by the AI.
This interface is aligned with OpenClaude's Tool contract. Every method beyond the core seven (Definition, Call, Description, ValidateInput, CheckPermissions, IsConcurrencySafe, IsReadOnly) has a sensible default provided by baseTool so that simple tools only implement what they need.
func ToolFromMetadata ¶
ToolFromMetadata extracts a resolved tool from metadata when available.
type ToolSurface ¶
type ToolSurface struct {
// Name is the unique identifier for this tool
Name string `json:"name"`
// DisplayName is a human-readable name
DisplayName string `json:"display_name,omitempty"`
// Description explains what the tool does
Description string `json:"description"`
// Prompt provides detailed guidance on when and how to use the tool
// This is used by the AI to understand the tool's usage patterns
Prompt string `json:"prompt,omitempty"`
// SearchHint provides a hint for tool search functionality
SearchHint string `json:"search_hint,omitempty"`
// Category groups related tools together
Category string `json:"category,omitempty"`
// InputSchema defines the expected input structure
InputSchema schema.JSONSchema `json:"input_schema"`
// IsReadOnly indicates if the tool doesn't modify state
IsReadOnly bool `json:"is_read_only"`
// IsDestructive indicates if the tool can cause destructive changes
IsDestructive bool `json:"is_destructive"`
// IsConcurrencySafe indicates if the tool can run concurrently with others
IsConcurrencySafe bool `json:"is_concurrency_safe"`
// RequiresPermission indicates if the tool requires permission checks
RequiresPermission bool `json:"requires_permission"`
// Aliases are alternative names for this tool
Aliases []string `json:"aliases,omitempty"`
// MaxResultSize is the maximum number of characters allowed in the tool
// result content. When exceeded the runtime truncates and records a
// ContentReplacementState (equivalent to OpenClaude's maxResultSizeChars).
// A value of 0 means unlimited.
MaxResultSize int `json:"max_result_size,omitempty"`
// Metadata contains additional tool metadata
Metadata map[string]any `json:"metadata,omitempty"`
}
ToolSurface represents the tool surface exposed to the model. This contains all the information needed to display and use a tool in the AI interface.
func FromJSON ¶
func FromJSON(data []byte) (*ToolSurface, error)
FromJSON creates a ToolSurface from JSON format.
func NewToolSurfaceFromDefinition ¶
func NewToolSurfaceFromDefinition(def Definition) ToolSurface
NewToolSurfaceFromDefinition creates a ToolSurface from a Tool Definition.
func (ToolSurface) IsEnabled ¶
func (s ToolSurface) IsEnabled() bool
IsEnabled returns whether the tool is enabled (always true for surfaces).
func (ToolSurface) MatchesName ¶
func (s ToolSurface) MatchesName(name string) bool
MatchesName checks if this tool matches the given name or any alias.
func (ToolSurface) ToJSON ¶
func (s ToolSurface) ToJSON() ([]byte, error)
ToJSON converts the ToolSurface to JSON format.
func (ToolSurface) ToMap ¶
func (s ToolSurface) ToMap() map[string]any
ToMap converts the ToolSurface to a map representation.
type ToolUseContext ¶
type ToolUseContext struct {
// SessionID identifies the session
SessionID types.SessionID `json:"session_id"`
// TurnID identifies the turn
TurnID types.TurnID `json:"turn_id"`
// ToolUseID identifies this specific tool use
ToolUseID string `json:"tool_use_id"`
// PermissionMode is the current permission mode (who approves)
PermissionMode types.PermissionMode `json:"permission_mode"`
// ExecutionMode is the current execution mode (agent behavior: plan, execute, browse)
// Separated from PermissionMode for clean separation of concerns.
ExecutionMode string `json:"execution_mode,omitempty"`
// PrePlanMode stores the mode that was active before entering plan mode.
PrePlanMode types.PermissionMode `json:"pre_plan_mode,omitempty"`
// IsAutoModeAvailable indicates whether auto mode is available for the session.
IsAutoModeAvailable bool `json:"is_auto_mode_available,omitempty"`
// WorkingDirectory is the current working directory
WorkingDirectory string `json:"working_directory,omitempty"`
// Workspace is the enforced filesystem boundary for file-aware tools.
Workspace *workspace.Context `json:"-"`
// AdditionalWorkingDirectories holds extra working directories that the
// tool may access (equivalent to OpenClaude's additionalWorkingDirectories).
AdditionalWorkingDirectories map[string]string `json:"additional_working_directories,omitempty"`
// EnableSandbox indicates whether the tool should run in a sandbox.
// Used for sandbox auto-allow permission logic.
EnableSandbox bool `json:"enable_sandbox,omitempty"`
// CanUseTool is the permission check function
CanUseTool types.CanUseToolFn `json:"-"`
// RequestPrompt is a function to prompt the user
RequestPrompt types.PromptFn `json:"-"`
// Metadata contains additional context
Metadata map[string]any `json:"metadata,omitempty"`
// IsBypassPermissionsModeAvailable indicates whether bypass mode was
// available at the start of the session. Used by plan mode to determine
// whether it should behave like bypass mode or ask for permissions.
IsBypassPermissionsModeAvailable bool `json:"is_bypass_permissions_mode_available,omitempty"`
}
ToolUseContext provides context for tool execution. Aligned with OpenClaude's ToolUseContext (headless-relevant subset).
func NewToolUseContext ¶
func NewToolUseContext( sessionID types.SessionID, turnID types.TurnID, toolUseID string, permissionMode types.PermissionMode, ) ToolUseContext
NewToolUseContext creates a new ToolUseContext
type Toolset ¶
type Toolset interface {
// Name returns a stable identifier for this toolset (used in logs/traces).
Name() string
// Tools returns the tools that should be available for this iteration.
// Implementations must be fast; they are called every loop iteration.
Tools(ctx context.Context) []Tool
}
Toolset is a named group of tools resolved dynamically at call time.
Unlike static tool registration (once at session creation), a Toolset is evaluated at the beginning of each loop iteration so that the set of available tools can change based on runtime context — the current session state, user preferences, permissions, or any other dynamic condition.
Usage:
RunRequest.Toolsets = []contract.Toolset{myDynamicSet}
The loop merges the returned tools with the static Tools map each iteration. If a Toolset returns a tool whose name already exists in the static map the Toolset version takes precedence (allows overriding defaults at runtime).