ai

package
v0.6.4 Latest Latest
Warning

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

Go to latest
Published: May 13, 2026 License: MIT Imports: 63 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"
)
View Source
const (
	DesktopBrokerProviderType = "desktop_broker"
)

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 ServeDesktopAIBroker added in v0.6.4

func ServeDesktopAIBroker(ctx context.Context, opts DesktopAIBrokerServerOptions) error

func SkillErrorCode

func SkillErrorCode(err error) string

func SkillErrorStatus

func SkillErrorStatus(err error) int

Types

type AIRuntimeStatus added in v0.6.4

type AIRuntimeStatus struct {
	RemoteConfigured bool                   `json:"remote_configured"`
	DesktopBroker    *DesktopAIBrokerStatus `json:"desktop_broker,omitempty"`
}

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 DesktopAIBrokerEndpoint added in v0.6.4

type DesktopAIBrokerEndpoint struct {
	URL                string
	SessionID          string
	Token              string
	SSHRuntimeKey      string
	ExpiresAtUnixMS    int64
	ModelSource        string
	LocalStateRootHint string
}

type DesktopAIBrokerServerOptions added in v0.6.4

type DesktopAIBrokerServerOptions struct {
	Logger            *slog.Logger
	ConfigPath        string
	SecretsPath       string
	Bind              string
	Token             string
	SessionID         string
	SSHRuntimeKey     string
	ExpiresAtUnixMS   int64
	StartupReportFile string
}

type DesktopAIBrokerStartupReport added in v0.6.4

type DesktopAIBrokerStartupReport struct {
	Status                string   `json:"status"`
	URL                   string   `json:"url"`
	PID                   int      `json:"pid"`
	Configured            bool     `json:"configured"`
	ModelCount            int      `json:"model_count"`
	MissingKeyProviderIDs []string `json:"missing_key_provider_ids,omitempty"`
}

type DesktopAIBrokerStatus added in v0.6.4

type DesktopAIBrokerStatus struct {
	Connected             bool     `json:"connected"`
	Available             bool     `json:"available"`
	ModelSource           string   `json:"model_source,omitempty"`
	SessionID             string   `json:"session_id,omitempty"`
	SSHRuntimeKey         string   `json:"ssh_runtime_key,omitempty"`
	ExpiresAtUnixMS       int64    `json:"expires_at_unix_ms,omitempty"`
	ModelCount            int      `json:"model_count"`
	MissingKeyProviderIDs []string `json:"missing_key_provider_ids,omitempty"`
	LastError             string   `json:"last_error,omitempty"`
}

type DesktopBrokerModel added in v0.6.4

type DesktopBrokerModel struct {
	ID                            string `json:"id"`
	ProviderID                    string `json:"provider_id"`
	ProviderType                  string `json:"provider_type"`
	ModelName                     string `json:"model_name"`
	Label                         string `json:"label,omitempty"`
	ContextWindow                 int    `json:"context_window,omitempty"`
	MaxOutputTokens               int    `json:"max_output_tokens,omitempty"`
	EffectiveContextWindowPercent int    `json:"effective_context_window_percent,omitempty"`
}

type DesktopBrokerModelSnapshot added in v0.6.4

type DesktopBrokerModelSnapshot struct {
	Configured            bool                 `json:"configured"`
	CurrentModel          string               `json:"current_model"`
	Models                []DesktopBrokerModel `json:"models"`
	MissingKeyProviderIDs []string             `json:"missing_key_provider_ids,omitempty"`
}

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"`
	Source      string `json:"source,omitempty"`
	SourceLabel string `json:"source_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"`
	Runtime      *AIRuntimeStatus `json:"runtime,omitempty"`
}

type Options

type Options struct {
	Logger   *slog.Logger
	StateDir string

	AgentHomeDir string
	Shell        string

	Config        *config.AIConfig
	DesktopBroker *DesktopAIBrokerEndpoint

	// 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) RuntimeStatus added in v0.6.4

func (s *Service) RuntimeStatus(ctx context.Context) *AIRuntimeStatus

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