ai

package
v0.6.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 11, 2026 License: MIT Imports: 59 Imported by: 0

Documentation

Index

Constants

View Source
const (
	AskUserReasonUserDecisionRequired = "user_decision_required"
	AskUserReasonPermissionBlocked    = "permission_blocked"
	AskUserReasonMissingExternalInput = "missing_external_input"
	AskUserReasonConflictingWork      = "conflicting_constraints"
	AskUserReasonSafetyConfirmation   = "safety_confirmation"
)
View Source
const (
	RunExecutionContractDirectReply     = "direct_reply"
	RunExecutionContractHybridFirstTurn = "hybrid_first_turn"
	RunExecutionContractAgenticLoop     = "agentic_loop"
)
View Source
const (
	RunIntentSocial   = "social"
	RunIntentCreative = "creative"
	RunIntentTask     = "task"

	RunIntentSourceModel         = "model"
	RunIntentSourceDeterministic = "deterministic_fallback"

	RunObjectiveModeReplace  = "replace"
	RunObjectiveModeContinue = "continue"
)
View Source
const (
	// Type IDs must stay in sync with
	// internal/envapp/ui_src/src/ui/protocol/redeven_v1/typeIds.ts.
	TypeID_AI_SEND_USER_TURN                    uint32 = 6001
	TypeID_AI_RUN_CANCEL                        uint32 = 6002
	TypeID_AI_SUBSCRIBE_SUMMARY                 uint32 = 6003
	TypeID_AI_EVENT_NOTIFY                      uint32 = 6004 // notify (agent -> client)
	TypeID_AI_TOOL_APPROVAL                     uint32 = 6005
	TypeID_AI_MESSAGES_LIST                     uint32 = 6006
	TypeID_AI_ACTIVE_RUN_SNAPSHOT               uint32 = 6007
	TypeID_AI_SET_TOOL_COLLAPSED                uint32 = 6008
	TypeID_AI_SUBSCRIBE_THREAD                  uint32 = 6009
	TypeID_AI_STOP_THREAD                       uint32 = 6011
	TypeID_AI_SUBMIT_STRUCTURED_PROMPT_RESPONSE uint32 = 6012
)
View Source
const (
	ErrCodeAISkillsInvalidScope      = "AI_SKILLS_INVALID_SCOPE"
	ErrCodeAISkillsInvalidSource     = "AI_SKILLS_INVALID_SOURCE"
	ErrCodeAISkillsInvalidPath       = "AI_SKILLS_INVALID_PATH"
	ErrCodeAISkillsPathEscape        = "AI_SKILLS_PATH_ESCAPE"
	ErrCodeAISkillsSkillExists       = "AI_SKILLS_SKILL_EXISTS"
	ErrCodeAISkillsSkillNotFound     = "AI_SKILLS_SKILL_NOT_FOUND"
	ErrCodeAISkillsFrontmatterBad    = "AI_SKILLS_FRONTMATTER_INVALID"
	ErrCodeAISkillsGitHubFetchFailed = "AI_SKILLS_GITHUB_FETCH_FAILED"
	ErrCodeAISkillsGitFallbackFailed = "AI_SKILLS_GIT_FALLBACK_FAILED"
	ErrCodeAISkillsArchiveInvalid    = "AI_SKILLS_ARCHIVE_INVALID"
	ErrCodeAISkillsBrowseForbidden   = "AI_SKILLS_BROWSE_FORBIDDEN"
	ErrCodeAISkillsFileTooLarge      = "AI_SKILLS_FILE_TOO_LARGE"
	ErrCodeAISkillsInternal          = "AI_SKILLS_INTERNAL_ERROR"
)
View Source
const (
	TaskComplexitySimple   = "simple"
	TaskComplexityStandard = "standard"
	TaskComplexityComplex  = "complex"
)
View Source
const (
	TodoPolicyNone        = "none"
	TodoPolicyRecommended = "recommended"
	TodoPolicyRequired    = "required"
)
View Source
const (
	TodoStatusPending    = "pending"
	TodoStatusInProgress = "in_progress"
	TodoStatusCompleted  = "completed"
	TodoStatusCancelled  = "cancelled"
)

Variables

View Source
var (
	ErrNotConfigured                      = errors.New("ai not configured")
	ErrRunActive                          = errors.New("run already active")
	ErrThreadBusy                         = errors.New("thread already active")
	ErrModelLockViolation                 = errors.New("model lock violation")
	ErrModelSwitchRequiresExplicitRestart = errors.New("model switch requires explicit restart")
)
View Source
var ErrFollowupsRevisionChanged = errors.New("followups revision changed")
View Source
var ErrInvalidFollowupLane = errors.New("invalid followup lane")
View Source
var ErrRunChanged = errors.New("run changed")
View Source
var ErrWaitingPromptChanged = errors.New("waiting prompt changed")
View Source
var ErrWaitingUserQueueConflict = errors.New("waiting-user queue request conflicts with waiting response")

Functions

func IsActiveRunState

func IsActiveRunState(raw string) bool

func NewQueuedTurnID

func NewQueuedTurnID() (string, error)

func NewRunID

func NewRunID() (string, error)

NewRunID generates a cryptographically random run id.

func NewThreadID

func NewThreadID() (string, error)

NewThreadID generates a cryptographically random thread id.

func SkillErrorCode

func SkillErrorCode(err error) string

func SkillErrorStatus

func SkillErrorStatus(err error) int

Types

type ActiveThreadRun

type ActiveThreadRun struct {
	ThreadID string `json:"thread_id"`
	RunID    string `json:"run_id"`
}

ActiveThreadRun is returned in subscribe snapshots so late subscribers can discover currently running threads before live events arrive.

type AgentLoop

type AgentLoop struct {
	// contains filtered or unexported fields
}

type AppendThreadMessageRequest

type AppendThreadMessageRequest struct {
	Role   string `json:"role"`
	Text   string `json:"text"`
	Format string `json:"format,omitempty"` // markdown|text (defaults to markdown for now)
}

type BudgetHint

type BudgetHint struct {
	MaxSteps int
}

type ContentPart

type ContentPart struct {
	Type       string `json:"type"`
	Text       string `json:"text,omitempty"`
	FileURI    string `json:"file_uri,omitempty"`
	MimeType   string `json:"mime_type,omitempty"`
	ToolCallID string `json:"tool_call_id,omitempty"`
	ToolUseID  string `json:"tool_use_id,omitempty"`
	ToolName   string `json:"tool_name,omitempty"`
	ArgsJSON   string `json:"args_json,omitempty"`
	JSON       []byte `json:"json,omitempty"`
}

type CoreToolScheduler

type CoreToolScheduler struct {
	// contains filtered or unexported fields
}

func NewCoreToolScheduler

func NewCoreToolScheduler(reg ToolRegistry, modeFilter ModeToolFilter, interceptors ...ToolInterceptor) (*CoreToolScheduler, error)

func (*CoreToolScheduler) ActiveTools

func (s *CoreToolScheduler) ActiveTools(mode string) []ToolDef

func (*CoreToolScheduler) Dispatch

func (s *CoreToolScheduler) Dispatch(ctx context.Context, mode string, calls []ToolCall) []ToolResult

func (*CoreToolScheduler) HandlePartial

func (s *CoreToolScheduler) HandlePartial(ctx context.Context, partial PartialToolCall) error

type CreateThreadRequest

type CreateThreadRequest struct {
	Title         string `json:"title"`
	ModelID       string `json:"model_id,omitempty"`
	ExecutionMode string `json:"execution_mode,omitempty"`
	WorkingDir    string `json:"working_dir,omitempty"`
}

type CreateThreadResponse

type CreateThreadResponse struct {
	Thread ThreadView `json:"thread"`
}

type DefaultModeToolFilter

type DefaultModeToolFilter struct{}

func (DefaultModeToolFilter) FilterToolsForMode

func (f DefaultModeToolFilter) FilterToolsForMode(mode string, all []ToolDef) []ToolDef

type DiffHunkView

type DiffHunkView struct {
	OldStart int      `json:"old_start"`
	OldLines int      `json:"old_lines"`
	NewStart int      `json:"new_start"`
	NewLines int      `json:"new_lines"`
	Before   []string `json:"before,omitempty"`
	After    []string `json:"after,omitempty"`
}

type ExitPlanModeArgs

type ExitPlanModeArgs struct {
	Summary        string              `json:"summary,omitempty"`
	AllowedPrompts []ExitPlanPromptRef `json:"allowed_prompts,omitempty"`
}

type ExitPlanModeResult

type ExitPlanModeResult struct {
	WaitingPrompt *RequestUserInputPrompt `json:"waiting_prompt,omitempty"`
	Summary       string                  `json:"summary,omitempty"`
}

type ExitPlanPromptRef

type ExitPlanPromptRef struct {
	Tool   string `json:"tool"`
	Prompt string `json:"prompt"`
}

type FileEditArgs

type FileEditArgs struct {
	FilePath   string `json:"file_path"`
	OldString  string `json:"old_string"`
	NewString  string `json:"new_string"`
	ReplaceAll bool   `json:"replace_all,omitempty"`
}

type FileMutationResult

type FileMutationResult struct {
	FilePath       string         `json:"file_path"`
	ChangeType     string         `json:"change_type"`
	StructuredDiff []DiffHunkView `json:"structured_diff,omitempty"`
	OriginalFile   string         `json:"original_file,omitempty"`
	UpdatedFile    string         `json:"updated_file,omitempty"`
}

type FileReadArgs

type FileReadArgs struct {
	FilePath string `json:"file_path"`
	Offset   int    `json:"offset,omitempty"`
	Limit    int    `json:"limit,omitempty"`
}

type FileReadResult

type FileReadResult struct {
	FilePath   string `json:"file_path"`
	Content    string `json:"content"`
	LineOffset int    `json:"line_offset,omitempty"`
	LineCount  int    `json:"line_count,omitempty"`
	TotalLines int    `json:"total_lines,omitempty"`
	Truncated  bool   `json:"truncated,omitempty"`
}

type FileWriteArgs

type FileWriteArgs struct {
	FilePath string `json:"file_path"`
	Content  string `json:"content"`
}

type FollowupAttachmentView

type FollowupAttachmentView struct {
	Name     string `json:"name"`
	MimeType string `json:"mime_type"`
	URL      string `json:"url,omitempty"`
}

type FollowupItemView

type FollowupItemView struct {
	FollowupID      string                   `json:"followup_id"`
	Lane            string                   `json:"lane"`
	MessageID       string                   `json:"message_id"`
	Text            string                   `json:"text"`
	ModelID         string                   `json:"model_id,omitempty"`
	ExecutionMode   string                   `json:"execution_mode,omitempty"`
	Position        int                      `json:"position"`
	CreatedAtUnixMs int64                    `json:"created_at_unix_ms"`
	Attachments     []FollowupAttachmentView `json:"attachments,omitempty"`
}

type InMemoryToolRegistry

type InMemoryToolRegistry struct {
	// contains filtered or unexported fields
}

func NewInMemoryToolRegistry

func NewInMemoryToolRegistry() *InMemoryToolRegistry

func (*InMemoryToolRegistry) Register

func (r *InMemoryToolRegistry) Register(tool ToolDef, handler ToolHandler) error

func (*InMemoryToolRegistry) Snapshot

func (r *InMemoryToolRegistry) Snapshot() []ToolDef

func (*InMemoryToolRegistry) Unregister

func (r *InMemoryToolRegistry) Unregister(name string) error

type ListFollowupsResponse

type ListFollowupsResponse struct {
	Revision     int64              `json:"revision"`
	PausedReason string             `json:"paused_reason,omitempty"`
	Queued       []FollowupItemView `json:"queued"`
	Drafts       []FollowupItemView `json:"drafts"`
}

type ListRunEventsQuery

type ListRunEventsQuery struct {
	Cursor   int64
	Limit    int
	Category string
}

type ListRunEventsResponse

type ListRunEventsResponse struct {
	Events     []RunEventView `json:"events"`
	NextCursor int64          `json:"next_cursor,omitempty"`
	HasMore    bool           `json:"has_more,omitempty"`
}

type ListThreadMessagesResponse

type ListThreadMessagesResponse struct {
	Messages      []any `json:"messages"`
	NextBeforeID  int64 `json:"next_before_id,omitempty"`
	HasMore       bool  `json:"has_more,omitempty"`
	TotalReturned int   `json:"total_returned,omitempty"`
}

type ListThreadsResponse

type ListThreadsResponse struct {
	Threads    []ThreadView `json:"threads"`
	NextCursor string       `json:"next_cursor,omitempty"`
}

type LoopBudget

type LoopBudget struct {
	MaxSteps       int
	MaxWallTimeMS  int64
	MaxInputTokens int64
	MaxOutputToken int64
	MaxCostMilli   int64
}

type LoopDetector

type LoopDetector interface {
	Detect(ctx context.Context, window []TurnSnapshot) (hit bool, reason string, confidence float64)
}

type Message

type Message struct {
	Role    string        `json:"role"`
	Content []ContentPart `json:"content"`
}

type ModeFlags

type ModeFlags struct {
	Mode          string `json:"mode,omitempty"`
	ReasoningOnly bool   `json:"reasoning_only,omitempty"`
}

type ModeToolFilter

type ModeToolFilter interface {
	FilterToolsForMode(mode string, all []ToolDef) []ToolDef
}

type Model

type Model struct {
	ID    string `json:"id"`
	Label string `json:"label,omitempty"`
}

type ModelSelectInput

type ModelSelectInput struct {
	Mode          string
	ReasoningOnly bool
	Configured    string
}

type ModelSelector

type ModelSelector interface {
	Select(ctx context.Context, in ModelSelectInput) (provider string, model string, reason string)
}

type ModelsResponse

type ModelsResponse struct {
	CurrentModel string  `json:"current_model"`
	Models       []Model `json:"models"`
}

type Options

type Options struct {
	Logger   *slog.Logger
	StateDir string

	AgentHomeDir string
	Shell        string

	Config *config.AIConfig

	// PersistOpTimeout is the per-operation timeout for threadstore persistence
	// (SQLite reads/writes). It must NOT be tied to a run's overall lifetime, since
	// runs can take much longer than persistence should ever be allowed to block.
	//
	// When zero, it defaults to 10 seconds.
	PersistOpTimeout time.Duration

	// RunMaxWallTime is the hard cap for a single run's lifetime.
	//
	// When zero, it defaults to 15 minutes.
	RunMaxWallTime time.Duration
	// RunIdleTimeout cancels a run if no runtime stream activity is observed for the duration.
	//
	// When zero, it defaults to 2 minutes.
	RunIdleTimeout time.Duration
	// ToolApprovalTimeout is the max time a run waits for user approval for high-risk tools.
	//
	// When zero, it defaults to 10 minutes.
	ToolApprovalTimeout time.Duration
	// StreamWriteTimeout is the best-effort per-frame write deadline for the NDJSON stream.
	//
	// When zero, it defaults to 5 seconds.
	StreamWriteTimeout time.Duration

	// ResolveProviderAPIKey returns the API key for the given provider id.
	//
	// It should read from a local secrets store, not from config.json.
	ResolveProviderAPIKey func(providerID string) (string, bool, error)

	// ResolveWebSearchProviderAPIKey returns the API key for a provider-scoped web search backend.
	//
	// It should read from a local secrets store, not from config.json.
	ResolveWebSearchProviderAPIKey func(providerID string) (string, bool, error)
}

type PartialToolCall

type PartialToolCall struct {
	ID            string         `json:"id,omitempty"`
	Name          string         `json:"name,omitempty"`
	ArgumentsJSON string         `json:"arguments_json,omitempty"`
	Arguments     map[string]any `json:"arguments,omitempty"`
}

type PartialUsage

type PartialUsage struct {
	InputTokens     int64 `json:"input_tokens,omitempty"`
	OutputTokens    int64 `json:"output_tokens,omitempty"`
	ReasoningTokens int64 `json:"reasoning_tokens,omitempty"`
}

type PatchFollowupRequest

type PatchFollowupRequest struct {
	Text *string `json:"text,omitempty"`
}

type PatchThreadRequest

type PatchThreadRequest struct {
	Title         *string `json:"title,omitempty"`
	ModelID       *string `json:"model_id,omitempty"`
	ExecutionMode *string `json:"execution_mode,omitempty"`
}

type Provider

type Provider interface {
	StreamTurn(ctx context.Context, req TurnRequest, onEvent func(StreamEvent)) (TurnResult, error)
}

Provider is the normalized runtime adapter contract.

type ProviderControls

type ProviderControls struct {
	ThinkingBudgetTokens int      `json:"thinking_budget_tokens,omitempty"`
	CacheControl         string   `json:"cache_control,omitempty"`
	ResponseFormat       string   `json:"response_format,omitempty"`
	PreviousResponseID   string   `json:"previous_response_id,omitempty"`
	Temperature          *float64 `json:"temperature,omitempty"`
	TopP                 *float64 `json:"top_p,omitempty"`
}

type RealtimeEvent

type RealtimeEvent struct {
	EventType     RealtimeEventType       `json:"event_type"`
	EndpointID    string                  `json:"endpoint_id"`
	ThreadID      string                  `json:"thread_id"`
	RunID         string                  `json:"run_id"`
	AtUnixMs      int64                   `json:"at_unix_ms"`
	StreamKind    RealtimeStreamKind      `json:"stream_kind,omitempty"`
	Phase         RealtimeLifecyclePhase  `json:"phase,omitempty"`
	Diag          map[string]any          `json:"diag,omitempty"`
	StreamEvent   any                     `json:"stream_event,omitempty"`
	RunStatus     string                  `json:"run_status,omitempty"`
	RunError      string                  `json:"run_error,omitempty"`
	WaitingPrompt *RequestUserInputPrompt `json:"waiting_prompt,omitempty"`

	// Transcript message events (EventType=transcript_message).
	MessageRowID int64           `json:"message_row_id,omitempty"`
	MessageJSON  json.RawMessage `json:"message_json,omitempty"`

	// Thread summary events (EventType=thread_summary).
	Title               string `json:"title,omitempty"`
	UpdatedAtUnixMs     int64  `json:"updated_at_unix_ms,omitempty"`
	LastMessagePreview  string `json:"last_message_preview,omitempty"`
	LastMessageAtUnixMs int64  `json:"last_message_at_unix_ms,omitempty"`
	ActiveRunID         string `json:"active_run_id,omitempty"`
	LastContextRunID    string `json:"last_context_run_id,omitempty"`
	ExecutionMode       string `json:"execution_mode,omitempty"`
	QueuedTurnCount     int    `json:"queued_turn_count,omitempty"`

	// Transcript reset events (EventType=transcript_reset).
	ResetReason       string `json:"reset_reason,omitempty"`
	ResetCheckpointID string `json:"reset_checkpoint_id,omitempty"`
}

RealtimeEvent is emitted by the agent for cross-session AI chat collaboration.

JSON fields use snake_case because this payload is transported over Redeven RPC wire.

type RealtimeEventType

type RealtimeEventType string

RealtimeEventType defines the high-level AI event category sent over Flowersec RPC notify.

const (
	RealtimeEventTypeStream          RealtimeEventType = "stream_event"
	RealtimeEventTypeThreadState     RealtimeEventType = "thread_state"
	RealtimeEventTypeTranscript      RealtimeEventType = "transcript_message"
	RealtimeEventTypeTranscriptReset RealtimeEventType = "transcript_reset"
	RealtimeEventTypeThreadSummary   RealtimeEventType = "thread_summary"
)

type RealtimeLifecyclePhase

type RealtimeLifecyclePhase string

RealtimeLifecyclePhase marks lifecycle transitions.

const (
	RealtimePhaseStart       RealtimeLifecyclePhase = "start"
	RealtimePhaseStateChange RealtimeLifecyclePhase = "state_change"
	RealtimePhaseEnd         RealtimeLifecyclePhase = "end"
	RealtimePhaseError       RealtimeLifecyclePhase = "error"
)

type RealtimeStreamKind

type RealtimeStreamKind string

RealtimeStreamKind is a low-cardinality stream category for diagnostics/UI routing.

const (
	RealtimeStreamKindLifecycle RealtimeStreamKind = "lifecycle"
	RealtimeStreamKindAssistant RealtimeStreamKind = "assistant"
	RealtimeStreamKindTool      RealtimeStreamKind = "tool"
	RealtimeStreamKindContext   RealtimeStreamKind = "context"
)

type ReorderFollowupsRequest

type ReorderFollowupsRequest struct {
	Lane               string   `json:"lane"`
	OrderedFollowupIDs []string `json:"ordered_followup_ids"`
	ExpectedRevision   *int64   `json:"expected_revision,omitempty"`
}

type RequestUserInputAction

type RequestUserInputAction struct {
	Type string `json:"type"`
	Mode string `json:"mode,omitempty"`
}

type RequestUserInputAnswer

type RequestUserInputAnswer struct {
	ChoiceID string `json:"choice_id,omitempty"`
	Text     string `json:"text,omitempty"`
}

func (*RequestUserInputAnswer) UnmarshalJSON

func (a *RequestUserInputAnswer) UnmarshalJSON(data []byte) error

type RequestUserInputChoice

type RequestUserInputChoice struct {
	ChoiceID         string                   `json:"choice_id"`
	Label            string                   `json:"label"`
	Description      string                   `json:"description,omitempty"`
	Kind             string                   `json:"kind"`
	InputPlaceholder string                   `json:"input_placeholder,omitempty"`
	Actions          []RequestUserInputAction `json:"actions,omitempty"`
}

type RequestUserInputPrompt

type RequestUserInputPrompt struct {
	PromptID            string                     `json:"prompt_id"`
	MessageID           string                     `json:"message_id"`
	ToolID              string                     `json:"tool_id"`
	ReasonCode          string                     `json:"reason_code,omitempty"`
	RequiredFromUser    []string                   `json:"required_from_user,omitempty"`
	EvidenceRefs        []string                   `json:"evidence_refs,omitempty"`
	InteractionContract interactionContract        `json:"interaction_contract,omitempty"`
	Questions           []RequestUserInputQuestion `json:"questions,omitempty"`
	PublicSummary       string                     `json:"public_summary,omitempty"`
	ContainsSecret      bool                       `json:"contains_secret,omitempty"`
}

type RequestUserInputQuestion

type RequestUserInputQuestion struct {
	ID                string                   `json:"id"`
	Header            string                   `json:"header"`
	Question          string                   `json:"question"`
	IsSecret          bool                     `json:"is_secret"`
	ResponseMode      string                   `json:"response_mode,omitempty"`
	ChoicesExhaustive *bool                    `json:"choices_exhaustive,omitempty"`
	WriteLabel        string                   `json:"write_label,omitempty"`
	WritePlaceholder  string                   `json:"write_placeholder,omitempty"`
	Choices           []RequestUserInputChoice `json:"choices,omitempty"`
}

type RequestUserInputResolvedQuestion

type RequestUserInputResolvedQuestion struct {
	QuestionID          string `json:"question_id"`
	Header              string `json:"header,omitempty"`
	Question            string `json:"question,omitempty"`
	SelectedChoiceID    string `json:"selected_choice_id,omitempty"`
	SelectedChoiceLabel string `json:"selected_choice_label,omitempty"`
	Text                string `json:"text,omitempty"`
	PublicSummary       string `json:"public_summary,omitempty"`
	ContainsSecret      bool   `json:"contains_secret,omitempty"`
}

type RequestUserInputResponse

type RequestUserInputResponse struct {
	PromptID string                            `json:"prompt_id"`
	Answers  map[string]RequestUserInputAnswer `json:"answers"`
}

type RequestUserInputResponseRecord

type RequestUserInputResponseRecord struct {
	PromptID          string                             `json:"prompt_id"`
	ToolID            string                             `json:"tool_id,omitempty"`
	ReasonCode        string                             `json:"reason_code,omitempty"`
	Responses         []RequestUserInputResolvedQuestion `json:"responses,omitempty"`
	PublicSummary     string                             `json:"public_summary,omitempty"`
	ContainsSecret    bool                               `json:"contains_secret,omitempty"`
	ResponseMessageID string                             `json:"response_message_id,omitempty"`
}

type RequestUserInputSecretAnswer

type RequestUserInputSecretAnswer struct {
	QuestionID string `json:"question_id"`
	Text       string `json:"text,omitempty"`
}

type RunAttachmentIn

type RunAttachmentIn struct {
	Name     string `json:"name"`
	MimeType string `json:"mime_type"`
	URL      string `json:"url"`
}

type RunCompletionMode

type RunCompletionMode string
const (
	RunCompletionModeExplicitSignal  RunCompletionMode = "explicit_signal"
	RunCompletionModeRuntimeCloseout RunCompletionMode = "runtime_closeout"
)

type RunContext

type RunContext struct {
	RunID     string
	ThreadID  string
	Endpoint  string
	Objective string
}

type RunEventView

type RunEventView struct {
	EventID    int64  `json:"event_id"`
	RunID      string `json:"run_id"`
	ThreadID   string `json:"thread_id"`
	StreamKind string `json:"stream_kind,omitempty"`
	EventType  string `json:"event_type"`
	AtUnixMs   int64  `json:"at_unix_ms"`
	Payload    any    `json:"payload,omitempty"`
}

type RunHistoryMsg

type RunHistoryMsg struct {
	Role string `json:"role"`
	Text string `json:"text"`
}

type RunInput

type RunInput struct {
	// MessageID is an optional client-supplied id for the user input message persisted in the transcript.
	//
	// When set, the agent will prefer this id over generating a new one so the UI can keep a stable
	// message id across optimistic rendering, realtime events, and history backfill.
	MessageID               string                          `json:"message_id,omitempty"`
	Text                    string                          `json:"text"`
	Attachments             []RunAttachmentIn               `json:"attachments"`
	StructuredResponse      *RequestUserInputResponseRecord `json:"-"`
	SecretAnswers           []RequestUserInputSecretAnswer  `json:"-"`
	InteractionContractSeed interactionContract             `json:"-"`
}

type RunOptions

type RunOptions struct {
	MaxSteps int `json:"max_steps"`

	// MaxNoToolRounds controls no-tool backpressure rounds before forcing ask_user.
	// Default: 3.
	MaxNoToolRounds int `json:"max_no_tool_rounds,omitempty"`

	// ReasoningOnly relaxes tool-pressure heuristics, but task completion still requires explicit task_complete.
	ReasoningOnly bool `json:"reasoning_only,omitempty"`

	// RequireUserConfirmOnTaskComplete forces explicit user confirmation when model emits task_complete.
	RequireUserConfirmOnTaskComplete bool `json:"require_user_confirm_on_task_complete,omitempty"`

	// NoUserInteraction disables ask_user and approval waits for autonomous runs.
	NoUserInteraction bool `json:"no_user_interaction,omitempty"`

	// ToolAllowlist is an internal runtime guard that limits the visible tool surface
	// for the current run. It is intended for runtime-owned callers such as evals and
	// subagents rather than general user-facing requests.
	ToolAllowlist []string `json:"tool_allowlist,omitempty"`

	// ForceReadonlyExec is an internal runtime guard that blocks mutating
	// terminal.exec invocations for the current run.
	ForceReadonlyExec bool `json:"force_readonly_exec,omitempty"`

	// Mode overrides runtime mode for this run (act|plan).
	Mode string `json:"mode,omitempty"`

	// Intent is classified by the assistant runtime (social|creative|task).
	// Clients should not set this field directly.
	Intent string `json:"intent,omitempty"`

	// ExecutionContract is classified by the runtime (direct_reply|hybrid_first_turn|agentic_loop).
	// Clients should not set this field directly.
	ExecutionContract string `json:"execution_contract,omitempty"`

	// Complexity is classified by the runtime (simple|standard|complex).
	// Clients should not set this field directly.
	Complexity string `json:"complexity,omitempty"`

	// TodoPolicy is classified by the runtime (none|recommended|required).
	// Clients should not set this field directly.
	TodoPolicy string `json:"todo_policy,omitempty"`

	// MinimumTodoItems is enforced when TodoPolicy is required.
	// Clients should not set this field directly.
	MinimumTodoItems int `json:"minimum_todo_items,omitempty"`

	// Provider controls.
	ThinkingBudgetTokens int      `json:"thinking_budget_tokens,omitempty"`
	CacheControl         string   `json:"cache_control,omitempty"`
	ResponseFormat       string   `json:"response_format,omitempty"`
	Temperature          *float64 `json:"temperature,omitempty"`
	TopP                 *float64 `json:"top_p,omitempty"`

	// Optional hard budgets (0 means unset).
	MaxInputTokens  int     `json:"max_input_tokens,omitempty"`
	MaxOutputTokens int     `json:"max_output_tokens,omitempty"`
	MaxCostUSD      float64 `json:"max_cost_usd,omitempty"`

	// CompactionThreshold controls when runtime compaction is triggered.
	// Value is a fraction in range [0,1]. 0 means use runtime default.
	CompactionThreshold float64 `json:"compaction_threshold,omitempty"`
}

type RunProtocolProfile

type RunProtocolProfile struct {
	Surface          RunProtocolSurface `json:"surface"`
	CompletionMode   RunCompletionMode  `json:"completion_mode"`
	WaitingMode      RunWaitingMode     `json:"waiting_mode"`
	AllowPatchTool   bool               `json:"allow_patch_tool"`
	AllowSignalTools bool               `json:"allow_signal_tools"`
}

type RunProtocolSurface

type RunProtocolSurface string
const (
	RunProtocolSurfaceLegacySignals     RunProtocolSurface = "legacy_signals"
	RunProtocolSurfaceStructuredFileOps RunProtocolSurface = "structured_fileops"
)

type RunRequest

type RunRequest struct {
	Model               string                       `json:"model"`
	Objective           string                       `json:"objective,omitempty"`
	History             []RunHistoryMsg              `json:"history"`
	Input               RunInput                     `json:"input"`
	Options             RunOptions                   `json:"options"`
	ContextPack         contextmodel.PromptPack      `json:"-"`
	ModelCapability     contextmodel.ModelCapability `json:"-"`
	InteractionContract interactionContract          `json:"-"`
}

RunRequest is the internal run request for Go runtime execution (includes history).

type RunStartRequest

type RunStartRequest struct {
	ThreadID string     `json:"thread_id"`
	Model    string     `json:"model"`
	Input    RunInput   `json:"input"`
	Options  RunOptions `json:"options"`
}

RunStartRequest is the HTTP request body for starting an AI run.

Notes: - thread_id is mandatory; the agent builds history from the persisted thread store. - history must NOT be provided by clients (agent is the source of truth).

type RunState

type RunState string

RunState is the normalized state machine for a single AI run.

const (
	RunStateIdle            RunState = "idle"
	RunStateAccepted        RunState = "accepted"
	RunStateRunning         RunState = "running"
	RunStateWaitingApproval RunState = "waiting_approval"
	RunStateRecovering      RunState = "recovering"
	RunStateFinalizing      RunState = "finalizing"
	RunStateWaitingUser     RunState = "waiting_user"
	RunStateSuccess         RunState = "success"
	RunStateFailed          RunState = "failed"
	RunStateCanceled        RunState = "canceled"
	RunStateTimedOut        RunState = "timed_out"
)

func NormalizeRunState

func NormalizeRunState(raw string) RunState

type RunWaitingMode

type RunWaitingMode string
const (
	RunWaitingModeAskUser      RunWaitingMode = "ask_user"
	RunWaitingModeExitPlanMode RunWaitingMode = "exit_plan_mode"
)

type RuntimeCloseout

type RuntimeCloseout struct {
	Result       string   `json:"result"`
	EvidenceRefs []string `json:"evidence_refs,omitempty"`
	Risks        []string `json:"remaining_risks,omitempty"`
	NextActions  []string `json:"next_actions,omitempty"`
	Source       string   `json:"source"`
}

type SendUserTurnRequest

type SendUserTurnRequest struct {
	ThreadID              string     `json:"thread_id"`
	Model                 string     `json:"model,omitempty"`
	Input                 RunInput   `json:"input"`
	Options               RunOptions `json:"options"`
	ExpectedRunID         string     `json:"expected_run_id,omitempty"`
	QueueAfterWaitingUser bool       `json:"queue_after_waiting_user,omitempty"`
	SourceFollowupID      string     `json:"source_followup_id,omitempty"`
}

type SendUserTurnResponse

type SendUserTurnResponse struct {
	RunID                   string `json:"run_id"`
	Kind                    string `json:"kind"` // "start" | "queued"
	QueueID                 string `json:"queue_id,omitempty"`
	QueuePosition           int    `json:"queue_position,omitempty"`
	ConsumedWaitingPromptID string `json:"consumed_waiting_prompt_id,omitempty"`
	AppliedExecutionMode    string `json:"applied_execution_mode,omitempty"`
}

type Service

type Service struct {
	// contains filtered or unexported fields
}

func NewService

func NewService(opts Options) (*Service, error)

func (*Service) ActiveRunCount

func (s *Service) ActiveRunCount(endpointID string) int

ActiveRunCount returns the number of active runs for the given endpoint.

When endpointID is empty, it returns the global active run count.

func (*Service) AppendThreadMessage

func (s *Service) AppendThreadMessage(ctx context.Context, meta *session.Meta, threadID string, role string, text string, format string) error

func (*Service) ApproveTool

func (s *Service) ApproveTool(meta *session.Meta, runID string, toolID string, approved bool) error

func (*Service) BrowseSkillFile

func (s *Service) BrowseSkillFile(skillPath string, file string, encoding string, maxBytes int) (*SkillBrowseFileResult, error)

func (*Service) BrowseSkillTree

func (s *Service) BrowseSkillTree(skillPath string, dir string) (*SkillBrowseTreeResult, error)

func (*Service) CancelRun

func (s *Service) CancelRun(meta *session.Meta, runID string) error

func (*Service) CancelThread

func (s *Service) CancelThread(meta *session.Meta, threadID string) error

func (*Service) Close

func (s *Service) Close() error

func (*Service) CreateSkill

func (s *Service) CreateSkill(scope string, name string, description string, body string) (*SkillCatalog, error)

func (*Service) CreateThread

func (s *Service) CreateThread(ctx context.Context, meta *session.Meta, title string, modelID string, executionMode string, workingDir string) (*ThreadView, error)

func (*Service) DeleteFollowup

func (s *Service) DeleteFollowup(ctx context.Context, meta *session.Meta, threadID string, followupID string) error

func (*Service) DeleteSkill

func (s *Service) DeleteSkill(scope string, name string) (*SkillCatalog, error)

func (*Service) DeleteThread

func (s *Service) DeleteThread(ctx context.Context, meta *session.Meta, threadID string, force bool) error

func (*Service) DetachRealtimeSink

func (s *Service) DetachRealtimeSink(streamServer *rpc.Server)

func (*Service) Enabled

func (s *Service) Enabled() bool

func (*Service) GetActiveRunSnapshot

func (s *Service) GetActiveRunSnapshot(meta *session.Meta, threadID string) (string, string, error)

func (*Service) GetTerminalToolOutput

func (s *Service) GetTerminalToolOutput(ctx context.Context, meta *session.Meta, runID string, toolID string) (*TerminalToolOutput, error)

func (*Service) GetThread

func (s *Service) GetThread(ctx context.Context, meta *session.Meta, threadID string) (*ThreadView, error)

func (*Service) GetThreadTodos

func (s *Service) GetThreadTodos(ctx context.Context, meta *session.Meta, threadID string) (*ThreadTodosView, error)

func (*Service) HasActiveThread

func (s *Service) HasActiveThread(threadID string) bool

func (*Service) HasActiveThreadForEndpoint

func (s *Service) HasActiveThreadForEndpoint(endpointID string, threadID string) bool

func (*Service) ImportGitHubSkills

func (s *Service) ImportGitHubSkills(req SkillGitHubImportRequest) (*SkillGitHubImportResult, error)

func (*Service) ListActiveThreadRuns

func (s *Service) ListActiveThreadRuns(endpointID string) []ActiveThreadRun

func (*Service) ListFollowups

func (s *Service) ListFollowups(ctx context.Context, meta *session.Meta, threadID string, limit int) (*ListFollowupsResponse, error)

func (*Service) ListGitHubSkillCatalog

func (s *Service) ListGitHubSkillCatalog(req SkillGitHubCatalogRequest) (*SkillGitHubCatalog, error)

func (*Service) ListModels

func (s *Service) ListModels() (*ModelsResponse, error)

func (*Service) ListRecentThreadToolCalls

func (s *Service) ListRecentThreadToolCalls(ctx context.Context, meta *session.Meta, threadID string, limit int) ([]threadstore.ToolCallRecord, error)

func (*Service) ListRunEvents

func (s *Service) ListRunEvents(ctx context.Context, meta *session.Meta, runID string, limit int) (*ListRunEventsResponse, error)

func (*Service) ListRunEventsWithQuery

func (s *Service) ListRunEventsWithQuery(ctx context.Context, meta *session.Meta, runID string, query ListRunEventsQuery) (*ListRunEventsResponse, error)

func (*Service) ListSkillSources

func (s *Service) ListSkillSources() (*SkillSourcesView, error)

func (*Service) ListSkillsCatalog

func (s *Service) ListSkillsCatalog() (*SkillCatalog, error)

func (*Service) ListThreadMessages

func (s *Service) ListThreadMessages(ctx context.Context, meta *session.Meta, threadID string, limit int, beforeID int64) (*ListThreadMessagesResponse, error)

func (*Service) ListThreads

func (s *Service) ListThreads(ctx context.Context, meta *session.Meta, limit int, cursor string) (*ListThreadsResponse, error)

func (*Service) OpenUpload

func (s *Service) OpenUpload(ctx context.Context, endpointID string, uploadID string) (*UploadResponse, string, error)

func (*Service) PatchSkillToggles

func (s *Service) PatchSkillToggles(patches []SkillTogglePatch) (*SkillCatalog, error)

func (*Service) RegisterRPC

func (s *Service) RegisterRPC(r *rpc.Router, meta *session.Meta, streamServer *rpc.Server)

func (*Service) RegisterRPCWithAccessGate

func (s *Service) RegisterRPCWithAccessGate(r *rpc.Router, meta *session.Meta, streamServer *rpc.Server, gate *accessgate.Gate)

func (*Service) ReinstallSkills

func (s *Service) ReinstallSkills(paths []string, overwrite bool) (*SkillReinstallResult, error)

func (*Service) ReloadSkillsCatalog

func (s *Service) ReloadSkillsCatalog() (*SkillCatalog, error)

func (*Service) RenameThread

func (s *Service) RenameThread(ctx context.Context, meta *session.Meta, threadID string, title string) error

func (*Service) ReorderFollowups

func (s *Service) ReorderFollowups(ctx context.Context, meta *session.Meta, threadID string, req ReorderFollowupsRequest) error

func (*Service) SaveUpload

func (s *Service) SaveUpload(ctx context.Context, endpointID string, r io.Reader, name string, mimeType string, maxBytes int64) (*UploadResponse, error)

func (*Service) SendUserTurn

func (s *Service) SendUserTurn(ctx context.Context, meta *session.Meta, req SendUserTurnRequest) (SendUserTurnResponse, error)

func (*Service) SetCurrentModelID

func (s *Service) SetCurrentModelID(modelID string, persist func(next *config.AIConfig) error) error

SetCurrentModelID updates current_model_id while keeping the provider/model registry unchanged.

Unlike UpdateConfig, this method is lightweight and allowed while runs are active because it only changes the current model for future chats.

func (*Service) SetThreadExecutionMode

func (s *Service) SetThreadExecutionMode(ctx context.Context, meta *session.Meta, threadID string, executionMode string) error

func (*Service) SetThreadModel

func (s *Service) SetThreadModel(ctx context.Context, meta *session.Meta, threadID string, modelID string) error

func (*Service) SetToolCollapsed

func (s *Service) SetToolCollapsed(meta *session.Meta, threadID string, messageID string, toolID string, collapsed bool) error

func (*Service) StartRun

func (s *Service) StartRun(ctx context.Context, meta *session.Meta, runID string, req RunStartRequest, w http.ResponseWriter) error

func (*Service) StartRunDetached

func (s *Service) StartRunDetached(meta *session.Meta, runID string, req RunStartRequest) error

func (*Service) StartRunDetachedWithPersisted

func (s *Service) StartRunDetachedWithPersisted(meta *session.Meta, runID string, req RunStartRequest, persisted persistedUserMessage) error

func (*Service) StopThread

func (s *Service) StopThread(ctx context.Context, meta *session.Meta, threadID string) (StopThreadResponse, error)

func (*Service) SubscribeSummary

func (s *Service) SubscribeSummary(endpointID string, streamServer *rpc.Server) ([]ActiveThreadRun, error)

func (*Service) SubscribeThread

func (s *Service) SubscribeThread(endpointID string, threadID string, streamServer *rpc.Server) (string, error)

func (*Service) UpdateConfig

func (s *Service) UpdateConfig(next *config.AIConfig, persist func() error) error

UpdateConfig updates the in-memory AI config after persisting it via the provided callback.

Active runs keep their existing run-local config snapshot. The updated config applies to runs created after this method returns.

func (*Service) UpdateFollowup

func (s *Service) UpdateFollowup(ctx context.Context, meta *session.Meta, threadID string, followupID string, req PatchFollowupRequest) error

func (*Service) ValidateGitHubSkillImport

func (s *Service) ValidateGitHubSkillImport(req SkillGitHubImportRequest) (*SkillGitHubValidateResult, error)

func (*Service) ValidateWorkingDir

func (s *Service) ValidateWorkingDir(workingDir string) (string, error)

type SkillActivation

type SkillActivation struct {
	ActivationID string               `json:"activation_id"`
	Name         string               `json:"name"`
	RootDir      string               `json:"root_dir"`
	Priority     int                  `json:"priority"`
	Content      string               `json:"content"`
	ContentRef   string               `json:"content_ref"`
	ModeHints    []string             `json:"mode_hints,omitempty"`
	Dependencies []SkillMCPDependency `json:"dependencies,omitempty"`
	ActivatedAt  int64                `json:"activated_at_unix_ms"`
}

type SkillBrowseFileResult

type SkillBrowseFileResult struct {
	Root      string `json:"root"`
	File      string `json:"file"`
	Encoding  string `json:"encoding"`
	Truncated bool   `json:"truncated"`
	Size      int64  `json:"size"`
	Content   string `json:"content"`
}

type SkillBrowseTreeEntry

type SkillBrowseTreeEntry struct {
	Name             string `json:"name"`
	Path             string `json:"path"`
	IsDir            bool   `json:"is_dir"`
	Size             int64  `json:"size"`
	ModifiedAtUnixMs int64  `json:"modified_at_unix_ms"`
}

type SkillBrowseTreeResult

type SkillBrowseTreeResult struct {
	Root    string                 `json:"root"`
	Dir     string                 `json:"dir"`
	Entries []SkillBrowseTreeEntry `json:"entries"`
}

type SkillCatalog

type SkillCatalog struct {
	CatalogVersion int64                `json:"catalog_version"`
	Skills         []SkillCatalogEntry  `json:"skills"`
	Conflicts      []SkillCatalogNotice `json:"conflicts,omitempty"`
	Errors         []SkillCatalogNotice `json:"errors,omitempty"`
}

type SkillCatalogEntry

type SkillCatalogEntry struct {
	ID                      string               `json:"id"`
	Name                    string               `json:"name"`
	Description             string               `json:"description"`
	Path                    string               `json:"path"`
	Scope                   string               `json:"scope"`
	Priority                int                  `json:"priority,omitempty"`
	ModeHints               []string             `json:"mode_hints,omitempty"`
	AllowImplicitInvocation bool                 `json:"allow_implicit_invocation"`
	Dependencies            []SkillMCPDependency `json:"dependencies,omitempty"`
	DependencyState         string               `json:"dependency_state,omitempty"`
	Enabled                 bool                 `json:"enabled"`
	Effective               bool                 `json:"effective"`
	ShadowedBy              string               `json:"shadowed_by,omitempty"`
}

type SkillCatalogNotice

type SkillCatalogNotice struct {
	Name       string `json:"name,omitempty"`
	Path       string `json:"path,omitempty"`
	Message    string `json:"message,omitempty"`
	WinnerPath string `json:"winner_path,omitempty"`
}

type SkillError

type SkillError struct {
	// contains filtered or unexported fields
}

func AsSkillError

func AsSkillError(err error) (*SkillError, bool)

func (*SkillError) Code

func (e *SkillError) Code() string

func (*SkillError) Error

func (e *SkillError) Error() string

func (*SkillError) HTTPStatus

func (e *SkillError) HTTPStatus() int

func (*SkillError) Unwrap

func (e *SkillError) Unwrap() error

type SkillGitHubAuth

type SkillGitHubAuth struct {
	GitHubToken            string `json:"github_token,omitempty"`
	UseLocalGitCredentials bool   `json:"use_local_git_credentials,omitempty"`
}

type SkillGitHubCatalog

type SkillGitHubCatalog struct {
	Source SkillGitHubCatalogSource `json:"source"`
	Skills []SkillGitHubCatalogItem `json:"skills"`
}

type SkillGitHubCatalogItem

type SkillGitHubCatalogItem struct {
	RemoteID       string   `json:"remote_id"`
	Name           string   `json:"name"`
	Description    string   `json:"description"`
	RepoPath       string   `json:"repo_path"`
	ExistsLocal    bool     `json:"exists_local"`
	InstalledPaths []string `json:"installed_paths,omitempty"`
}

type SkillGitHubCatalogRequest

type SkillGitHubCatalogRequest struct {
	Repo        string `json:"repo,omitempty"`
	Ref         string `json:"ref,omitempty"`
	BasePath    string `json:"base_path,omitempty"`
	ForceReload bool   `json:"force_reload,omitempty"`
}

type SkillGitHubCatalogSource

type SkillGitHubCatalogSource struct {
	Repo     string `json:"repo"`
	Ref      string `json:"ref"`
	BasePath string `json:"base_path"`
}

type SkillGitHubImportItem

type SkillGitHubImportItem struct {
	Name            string          `json:"name"`
	Scope           string          `json:"scope"`
	SkillPath       string          `json:"skill_path"`
	SourceType      SkillSourceType `json:"source_type"`
	SourceID        string          `json:"source_id"`
	InstallMode     string          `json:"install_mode"`
	InstalledCommit string          `json:"installed_commit,omitempty"`
}

type SkillGitHubImportRequest

type SkillGitHubImportRequest struct {
	Scope     string          `json:"scope"`
	Repo      string          `json:"repo,omitempty"`
	Ref       string          `json:"ref,omitempty"`
	Paths     []string        `json:"paths,omitempty"`
	URL       string          `json:"url,omitempty"`
	Overwrite bool            `json:"overwrite,omitempty"`
	Auth      SkillGitHubAuth `json:"auth,omitempty"`
}

type SkillGitHubImportResult

type SkillGitHubImportResult struct {
	Catalog SkillCatalog            `json:"catalog"`
	Imports []SkillGitHubImportItem `json:"imports"`
}

type SkillGitHubResolvedSkill

type SkillGitHubResolvedSkill struct {
	Name            string `json:"name"`
	Description     string `json:"description"`
	Scope           string `json:"scope,omitempty"`
	Repo            string `json:"repo"`
	Ref             string `json:"ref"`
	RepoPath        string `json:"repo_path"`
	TargetDir       string `json:"target_dir"`
	TargetSkillPath string `json:"target_skill_path"`
	AlreadyExists   bool   `json:"already_exists"`
}

type SkillGitHubValidateResult

type SkillGitHubValidateResult struct {
	Resolved []SkillGitHubResolvedSkill `json:"resolved"`
}

type SkillMCPDependency

type SkillMCPDependency struct {
	Name      string `json:"name,omitempty" yaml:"name"`
	Transport string `json:"transport,omitempty" yaml:"transport"`
	Command   string `json:"command,omitempty" yaml:"command"`
	URL       string `json:"url,omitempty" yaml:"url"`
}

type SkillMeta

type SkillMeta struct {
	Name                    string               `json:"name"`
	Description             string               `json:"description"`
	Path                    string               `json:"path"`
	Scope                   string               `json:"scope"`
	Priority                int                  `json:"priority,omitempty"`
	ModeHints               []string             `json:"mode_hints,omitempty"`
	AllowImplicitInvocation bool                 `json:"allow_implicit_invocation"`
	Dependencies            []SkillMCPDependency `json:"dependencies,omitempty"`
}

type SkillReinstallItem

type SkillReinstallItem struct {
	SkillPath   string `json:"skill_path"`
	SourceID    string `json:"source_id"`
	InstallMode string `json:"install_mode"`
}

type SkillReinstallResult

type SkillReinstallResult struct {
	Catalog     SkillCatalog         `json:"catalog"`
	Reinstalled []SkillReinstallItem `json:"reinstalled"`
}

type SkillSourceRecord

type SkillSourceRecord struct {
	SkillPath           string          `json:"skill_path"`
	SourceType          SkillSourceType `json:"source_type"`
	SourceID            string          `json:"source_id"`
	Repo                string          `json:"repo,omitempty"`
	Ref                 string          `json:"ref,omitempty"`
	RepoPath            string          `json:"repo_path,omitempty"`
	InstallMode         string          `json:"install_mode,omitempty"`
	InstalledCommit     string          `json:"installed_commit,omitempty"`
	InstalledAtUnixMs   int64           `json:"installed_at_unix_ms,omitempty"`
	LastCheckedAtUnixMs int64           `json:"last_checked_at_unix_ms,omitempty"`
}

type SkillSourceType

type SkillSourceType string
const (
	SkillSourceTypeLocalManual SkillSourceType = "local_manual"
	SkillSourceTypeGitHub      SkillSourceType = "github_import"
	SkillSourceTypeSystem      SkillSourceType = "system_bundle"
)

type SkillSourcesView

type SkillSourcesView struct {
	Items []SkillSourceRecord `json:"items"`
}

type SkillTogglePatch

type SkillTogglePatch struct {
	Path    string `json:"path"`
	Enabled bool   `json:"enabled"`
}

type SourceRef

type SourceRef struct {
	Title string `json:"title,omitempty"`
	URL   string `json:"url"`
}

type StepResult

type StepResult struct {
	Round        int
	TurnResult   TurnResult
	ToolResults  []ToolResult
	FinishReason string
}

type StopThreadRequest

type StopThreadRequest struct {
	ThreadID string `json:"thread_id"`
}

type StopThreadResponse

type StopThreadResponse struct {
	OK                 bool               `json:"ok"`
	RecoveredFollowups []FollowupItemView `json:"recovered_followups,omitempty"`
}

type StreamEvent

type StreamEvent struct {
	Type       StreamEventType  `json:"type"`
	Text       string           `json:"text,omitempty"`
	ToolCall   *PartialToolCall `json:"tool_call,omitempty"`
	Usage      *PartialUsage    `json:"usage,omitempty"`
	FinishHint string           `json:"finish_hint,omitempty"`
}

type StreamEventType

type StreamEventType string

StreamEventType is the normalized stream event kind produced by provider adapters.

const (
	StreamEventTextDelta     StreamEventType = "text_delta"
	StreamEventToolCallStart StreamEventType = "tool_call_start"
	StreamEventToolCallDelta StreamEventType = "tool_call_delta"
	StreamEventToolCallEnd   StreamEventType = "tool_call_end"
	StreamEventThinkingDelta StreamEventType = "thinking_delta"
	StreamEventUsage         StreamEventType = "usage"
	StreamEventFinishReason  StreamEventType = "finish_reason"
)

type SubmitStructuredPromptResponseRequest

type SubmitStructuredPromptResponseRequest struct {
	ThreadID         string                   `json:"thread_id"`
	Model            string                   `json:"model,omitempty"`
	Response         RequestUserInputResponse `json:"response"`
	Input            RunInput                 `json:"input"`
	Options          RunOptions               `json:"options"`
	ExpectedRunID    string                   `json:"expected_run_id,omitempty"`
	SourceFollowupID string                   `json:"source_followup_id,omitempty"`
}

type SubmitStructuredPromptResponseResponse

type SubmitStructuredPromptResponseResponse struct {
	RunID                   string `json:"run_id"`
	Kind                    string `json:"kind"`
	ConsumedWaitingPromptID string `json:"consumed_waiting_prompt_id,omitempty"`
	AppliedExecutionMode    string `json:"applied_execution_mode,omitempty"`
}

type TerminalToolOutput

type TerminalToolOutput struct {
	RunID              string `json:"run_id"`
	ToolID             string `json:"tool_id"`
	ToolName           string `json:"tool_name"`
	Status             string `json:"status"`
	Stdout             string `json:"stdout"`
	Stderr             string `json:"stderr"`
	ExitCode           int    `json:"exit_code"`
	DurationMS         int64  `json:"duration_ms"`
	TimedOut           bool   `json:"timed_out"`
	Truncated          bool   `json:"truncated"`
	Cwd                string `json:"cwd,omitempty"`
	TimeoutMS          int64  `json:"timeout_ms,omitempty"`
	RequestedTimeoutMS int64  `json:"requested_timeout_ms,omitempty"`
	TimeoutSource      string `json:"timeout_source,omitempty"`
	RawResult          string `json:"raw_result,omitempty"`
}

type ThreadTodosView

type ThreadTodosView struct {
	Version         int64      `json:"version"`
	UpdatedAtUnixMs int64      `json:"updated_at_unix_ms"`
	Todos           []TodoItem `json:"todos"`
}

type ThreadView

type ThreadView struct {
	ThreadID            string                  `json:"thread_id"`
	Title               string                  `json:"title"`
	ModelID             string                  `json:"model_id"`
	ModelLocked         bool                    `json:"model_locked"`
	ExecutionMode       string                  `json:"execution_mode"`
	WorkingDir          string                  `json:"working_dir"`
	QueuedTurnCount     int                     `json:"queued_turn_count"`
	RunStatus           string                  `json:"run_status"`
	RunUpdatedAtUnixMs  int64                   `json:"run_updated_at_unix_ms"`
	RunError            string                  `json:"run_error,omitempty"`
	WaitingPrompt       *RequestUserInputPrompt `json:"waiting_prompt,omitempty"`
	LastContextRunID    string                  `json:"last_context_run_id,omitempty"`
	CreatedAtUnixMs     int64                   `json:"created_at_unix_ms"`
	UpdatedAtUnixMs     int64                   `json:"updated_at_unix_ms"`
	LastMessageAtUnixMs int64                   `json:"last_message_at_unix_ms"`
	LastMessagePreview  string                  `json:"last_message_preview"`
}

type TodoItem

type TodoItem struct {
	ID      string `json:"id"`
	Content string `json:"content"`
	Status  string `json:"status"`
	Note    string `json:"note,omitempty"`
}

type TodoSummary

type TodoSummary struct {
	Total      int `json:"total"`
	Pending    int `json:"pending"`
	InProgress int `json:"in_progress"`
	Completed  int `json:"completed"`
	Cancelled  int `json:"cancelled"`
}

type ToolApprovalRequest

type ToolApprovalRequest struct {
	ToolID   string `json:"tool_id"`
	Approved bool   `json:"approved"`
}

type ToolCall

type ToolCall struct {
	ID   string         `json:"id,omitempty"`
	Name string         `json:"name"`
	Args map[string]any `json:"args,omitempty"`
}

type ToolCallBlock

type ToolCallBlock struct {
	Type             string             `json:"type"` // tool-call
	ToolName         string             `json:"toolName"`
	ToolID           string             `json:"toolId"`
	Args             map[string]any     `json:"args"`
	RequiresApproval bool               `json:"requiresApproval,omitempty"`
	ApprovalState    string             `json:"approvalState,omitempty"` // required|approved|rejected
	Status           ToolCallStatus     `json:"status"`
	Result           any                `json:"result,omitempty"`
	Error            string             `json:"error,omitempty"`
	ErrorDetails     *aitools.ToolError `json:"errorDetails,omitempty"`
	Children         []any              `json:"children,omitempty"`
	Collapsed        *bool              `json:"collapsed,omitempty"`
	StartedAt        *time.Time         `json:"-"`
}

type ToolCallStatus

type ToolCallStatus string
const (
	ToolCallStatusPending    ToolCallStatus = "pending"
	ToolCallStatusRunning    ToolCallStatus = "running"
	ToolCallStatusRecovering ToolCallStatus = "recovering"
	ToolCallStatusSuccess    ToolCallStatus = "success"
	ToolCallStatusError      ToolCallStatus = "error"
)

type ToolDef

type ToolDef struct {
	Name             string          `json:"name"`
	Description      string          `json:"description,omitempty"`
	InputSchema      json.RawMessage `json:"input_schema,omitempty"`
	ParallelSafe     bool            `json:"parallel_safe,omitempty"`
	Mutating         bool            `json:"mutating,omitempty"`
	RequiresApproval bool            `json:"requires_approval,omitempty"`
	Source           string          `json:"source,omitempty"`
	Namespace        string          `json:"namespace,omitempty"`
	Priority         int             `json:"priority,omitempty"`
}

type ToolHandler

type ToolHandler interface {
	Validate(ctx context.Context, call ToolCall) error
	Execute(ctx context.Context, call ToolCall) (ToolResult, error)
	HandlePartial(ctx context.Context, partial PartialToolCall) error
}

type ToolInterceptor

type ToolInterceptor interface {
	BeforeExec(ctx context.Context, call ToolCall) (ToolCall, error)
	AfterExec(ctx context.Context, call ToolCall, result ToolResult) (ToolResult, error)
}

type ToolRegistry

type ToolRegistry interface {
	Register(tool ToolDef, handler ToolHandler) error
	Unregister(name string) error
	Snapshot() []ToolDef
}

type ToolResult

type ToolResult struct {
	ToolID     string             `json:"tool_id,omitempty"`
	ToolName   string             `json:"tool_name,omitempty"`
	Status     string             `json:"status"`
	Summary    string             `json:"summary,omitempty"`
	Details    string             `json:"details,omitempty"`
	Data       any                `json:"data,omitempty"`
	Error      *aitools.ToolError `json:"error,omitempty"`
	Truncated  bool               `json:"truncated,omitempty"`
	ContentRef string             `json:"content_ref,omitempty"`
}

type TurnBudgets

type TurnBudgets struct {
	MaxSteps       int     `json:"max_steps,omitempty"`
	MaxInputTokens int     `json:"max_input_tokens,omitempty"`
	MaxOutputToken int     `json:"max_output_tokens,omitempty"`
	MaxCostUSD     float64 `json:"max_cost_usd,omitempty"`
}

type TurnHook

type TurnHook interface {
	BeforeTurn(ctx context.Context, run *RunContext) error
	AfterTurn(ctx context.Context, run *RunContext, step StepResult) error
}

type TurnProviderState

type TurnProviderState struct {
	ContinuationKind string `json:"continuation_kind,omitempty"`
	ContinuationID   string `json:"continuation_id,omitempty"`
}

type TurnRequest

type TurnRequest struct {
	Model            string           `json:"model"`
	Messages         []Message        `json:"messages"`
	Tools            []ToolDef        `json:"tools"`
	Budgets          TurnBudgets      `json:"budgets"`
	ModeFlags        ModeFlags        `json:"mode_flags"`
	ProviderControls ProviderControls `json:"provider_controls,omitempty"`
	WebSearchMode    string           `json:"web_search_mode,omitempty"`
}

type TurnResult

type TurnResult struct {
	FinishReason    string             `json:"finish_reason"`
	Text            string             `json:"text,omitempty"`
	Reasoning       string             `json:"reasoning,omitempty"`
	ToolCalls       []ToolCall         `json:"tool_calls,omitempty"`
	Sources         []SourceRef        `json:"sources,omitempty"`
	Usage           TurnUsage          `json:"usage,omitempty"`
	ProviderState   *TurnProviderState `json:"provider_state,omitempty"`
	RawProviderDiag map[string]any     `json:"raw_provider_diag,omitempty"`
	StreamEvents    []StreamEvent      `json:"stream_events,omitempty"`
	ToolResults     []ToolResult       `json:"tool_results,omitempty"`
}

type TurnSnapshot

type TurnSnapshot struct {
	ToolCalls    []ToolCall
	ToolResults  []ToolResult
	FinishReason string
	Assistant    string
}

type TurnUsage

type TurnUsage struct {
	InputTokens     int64 `json:"input_tokens,omitempty"`
	OutputTokens    int64 `json:"output_tokens,omitempty"`
	ReasoningTokens int64 `json:"reasoning_tokens,omitempty"`
}

type UploadResponse

type UploadResponse struct {
	URL      string `json:"url"`
	Name     string `json:"name"`
	Size     int64  `json:"size"`
	MimeType string `json:"mime_type"`
}

Directories

Path Synopsis
context

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL