package claude import "encoding/json" // MessageHandler is called for each JSON message received from the Claude subprocess. type MessageHandler func(msg *CLIMessage) // CLIMessage is the base envelope for all messages from Claude's stdout. type CLIMessage struct { Type string `json:"type"` Raw json.RawMessage `json:"-"` // full original JSON line } // --- Messages FROM Claude (stdout) --- // SystemMessage is emitted once at session start. type SystemMessage struct { Type string `json:"type"` // "system" Subtype string `json:"subtype,omitempty"` SessionID string `json:"session_id"` Tools []string `json:"tools,omitempty"` Model string `json:"model,omitempty"` CWD string `json:"cwd,omitempty"` } // AssistantMessage contains Claude's response content. type AssistantMessage struct { Type string `json:"type"` // "assistant" Message AssistantContent `json:"message"` } // AssistantContent holds the content blocks of an assistant message. type AssistantContent struct { ID string `json:"id,omitempty"` Role string `json:"role,omitempty"` Content []ContentBlock `json:"content,omitempty"` Model string `json:"model,omitempty"` } // ContentBlock is a single block within a message (text or tool_use). type ContentBlock struct { Type string `json:"type"` // "text" or "tool_use" Text string `json:"text,omitempty"` ID string `json:"id,omitempty"` Name string `json:"name,omitempty"` Input json.RawMessage `json:"input,omitempty"` } // ResultMessage is emitted when a turn completes. type ResultMessage struct { Type string `json:"type"` // "result" Subtype string `json:"subtype,omitempty"` SessionID string `json:"session_id"` IsError bool `json:"is_error,omitempty"` Duration int `json:"duration_ms,omitempty"` NumTurns int `json:"num_turns,omitempty"` CostUSD float64 `json:"cost_usd,omitempty"` TotalCostUSD float64 `json:"total_cost_usd,omitempty"` } // ControlRequest is a permission or callback request from Claude. type ControlRequest struct { Type string `json:"type"` // "tool_use_permission" Tool ToolUseRequest `json:"tool,omitempty"` } // ToolUseRequest describes a tool permission request. type ToolUseRequest struct { RequestID string `json:"request_id"` ToolName string `json:"tool_name"` Input json.RawMessage `json:"input,omitempty"` } // --- Messages TO Claude (stdin) --- // UserMessage sends a prompt to Claude. type UserMessage struct { Type string `json:"type"` // "user_message" Content string `json:"content"` } // ControlResponse responds to a permission request. type ControlResponse struct { Type string `json:"type"` // "tool_use_permission_response" RequestID string `json:"request_id"` Allow bool `json:"allow"` Reason string `json:"reason,omitempty"` }