""" harness_types.jl - Extended types for AgentHarness This module defines the extended types used by the AgentHarness. """ module HarnessTypes using ..Types: * using ..Session: Session # ============================================================================ # Result type # ============================================================================ abstract type Result{TValue, TError} end struct Ok{TValue, TError} <: Result{TValue, TError} value::TValue end struct Err{TValue, TError} <: Result{TValue, TError} error::TError end function ok{TValue, TError}(value::TValue)::Ok{TValue, TError} return Ok{TValue, TError}(value) end function err{TValue, TError}(error::TError)::Err{TValue, TError} return Err{TValue, TError}(error) end function getOrThrow{TValue, TError}(result::Result{TValue, TError})::TValue if result isa Ok return result.value else throw(result.error) end end function getOrUndefined{TValue<:AbstractDict, TError}(result::Result{TValue, TError})::Union{TValue, Nothing} if result isa Ok return result.value else return nothing end end function toError(error::Any)::Error if error isa Error return error elseif error isa AbstractString return ErrorException(error) else try return ErrorException(string(error)) catch return ErrorException("Unknown error") end end end # ============================================================================ # Skill types # ============================================================================ mutable struct Skill name::String description::String content::String filePath::String disableModelInvocation::Bool end mutable struct PromptTemplate name::String description::Union{String, Nothing} content::String end mutable struct AgentHarnessResources{TSkill<:Skill, TPromptTemplate<:PromptTemplate} promptTemplates::Union{Vector{TPromptTemplate}, Nothing} skills::Union{Vector{TSkill}, Nothing} end # ============================================================================ # Tool types # ============================================================================ mutable struct AgentHarnessTool{TContext, TParameters, TDetails} name::String label::String description::String parameters::TParameters execute::Function prepareArguments::Union{Function, Nothing} executionMode::Union{ToolExecutionMode, Nothing} end mutable struct AgentHarnessToolContextSource{TContext} context::Union{TContext, Function} end # ============================================================================ # Stream options # ============================================================================ mutable struct AgentHarnessStreamOptions transport::Union{String, Nothing} timeout_ms::Union{Int64, Nothing} max_retries::Union{Int64, Nothing} max_retry_delay_ms::Union{Int64, Nothing} headers::Union{Dict{String, String}, Nothing} metadata::Union{Dict{String, Any}, Nothing} cache_retention::Union{String, Nothing} end mutable struct AgentHarnessStreamOptionsPatch transport::Union{String, Nothing} timeout_ms::Union{Int64, Nothing} max_retries::Union{Int64, Nothing} max_retry_delay_ms::Union{Int64, Nothing} cache_retention::Union{String, Nothing} headers::Union{Dict{String, String}, Nothing} metadata::Union{Dict{String, Any}, Nothing} end # ============================================================================ # File system types # ============================================================================ const FileKind = String const FILE_KIND_FILE = "file" const FILE_KIND_DIRECTORY = "directory" const FILE_KIND_SYMLINK = "symlink" const FileErrorCode = String const FILE_ERROR_ABORTED = "aborted" const FILE_ERROR_NOT_FOUND = "not_found" const FILE_ERROR_PERMISSION_DENIED = "permission_denied" const FILE_ERROR_NOT_DIRECTORY = "not_directory" const FILE_ERROR_IS_DIRECTORY = "is_directory" const FILE_ERROR_INVALID = "invalid" const FILE_ERROR_NOT_SUPPORTED = "not_supported" const FILE_ERROR_UNKNOWN = "unknown" mutable struct FileError <: Exception code::FileErrorCode message::String path::Union{String, Nothing} cause::Union{Exception, Nothing} end # ============================================================================ # Execution error types # ============================================================================ const ExecutionErrorCode = String const EXECUTION_ERROR_ABORTED = "aborted" const EXECUTION_ERROR_TIMEOUT = "timeout" const EXECUTION_ERROR_SHELL_UNAVAILABLE = "shell_unavailable" const EXECISION_ERROR_SPAWN_ERROR = "spawn_error" const EXECUTION_ERROR_CALLBACK_ERROR = "callback_error" const EXECUTION_ERROR_UNKNOWN = "unknown" mutable struct ExecutionError <: Exception code::ExecutionErrorCode message::String cause::Union{Exception, Nothing} end # ============================================================================ # Compaction error types # ============================================================================ const CompactionErrorCode = String const COMPACTION_ERROR_ABORTED = "aborted" const COMPACTION_ERROR_SUMMARIZATION_FAILED = "summarization_failed" const COMPACTION_ERROR_INVALID_SESSION = "invalid_session" const COMPACTION_ERROR_UNKNOWN = "unknown" mutable struct CompactionError <: Exception code::CompactionErrorCode message::String cause::Union{Exception, Nothing} end # ============================================================================ # Branch summary error types # ============================================================================ const BranchSummaryErrorCode = String const BRANCH_SUMMARY_ERROR_ABORTED = "aborted" const BRANCH_SUMMARY_ERROR_SUMMARIZATION_FAILED = "summarization_failed" const BRANCH_SUMMARY_ERROR_INVALID_SESSION = "invalid_session" mutable struct BranchSummaryError <: Exception code::BranchSummaryErrorCode message::String cause::Union{Exception, Nothing} end # ============================================================================ # Session error types # ============================================================================ const SessionErrorCode = String const SESSION_ERROR_NOT_FOUND = "not_found" const SESSION_ERROR_INVALID_SESSION = "invalid_session" const SESSION_ERROR_INVALID_ENTRY = "invalid_entry" const SESSION_ERROR_INVALID_FORK_TARGET = "invalid_fork_target" const SESSION_ERROR_STORAGE = "storage" const SESSION_ERROR_UNKNOWN = "unknown" mutable struct SessionError <: Exception code::SessionErrorCode message::String cause::Union{Exception, Nothing} end # ============================================================================ # Agent harness error types # ============================================================================ const AgentHarnessErrorCode = String const AGENT_HARNESS_ERROR_BUSY = "busy" const AGENT_HARNESS_ERROR_INVALID_STATE = "invalid_state" const AGENT_HARNESS_ERROR_INVALID_ARGUMENT = "invalid_argument" const AGENT_HARNESS_ERROR_SESSION = "session" const AGENT_HARNESS_ERROR_HOOK = "hook" const AGENT_HARNESS_ERROR_AUTH = "auth" const AGENT_HARNESS_ERROR_COMPACTION = "compaction" const AGENT_HARNESS_ERROR_BRANCH_SUMMARY = "branch_summary" const AGENT_HARNESS_ERROR_UNKNOWN = "unknown" mutable struct AgentHarnessError <: Exception code::AgentHarnessErrorCode message::String cause::Union{Exception, Nothing} end # ============================================================================ # File system interface # ============================================================================ abstract type FileSystem end function absolutePath(fs::FileSystem, path::String, abortSignal::Union{Nothing, Any})::Result{String, FileError} return err(FileError("not_supported", "absolutePath not implemented", path, nothing)) end function joinPath(fs::FileSystem, parts::Vector{String}, abortSignal::Union{Nothing, Any})::Result{String, FileError} return err(FileError("not_supported", "joinPath not implemented", nothing, nothing)) end function readTextFile(fs::FileSystem, path::String, abortSignal::Union{Nothing, Any})::Result{String, FileError} return err(FileError("not_supported", "readTextFile not implemented", path, nothing)) end function readTextLines( fs::FileSystem, path::String, options::Dict{String, Any}, )::Result{Vector{String}, FileError} return err(FileError("not_supported", "readTextLines not implemented", path, nothing)) end function readBinaryFile(fs::FileSystem, path::String, abortSignal::Union{Nothing, Any})::Result{Vector{UInt8}, FileError} return err(FileError("not_supported", "readBinaryFile not implemented", path, nothing)) end function writeFile(fs::FileSystem, path::String, content::Union{String, Vector{UInt8}}, abortSignal::Union{Nothing, Any})::Result{Nothing, FileError} return err(FileError("not_supported", "writeFile not implemented", path, nothing)) end function appendFile(fs::FileSystem, path::String, content::Union{String, Vector{UInt8}}, abortSignal::Union{Nothing, Any})::Result{Nothing, FileError} return err(FileError("not_supported", "appendFile not implemented", path, nothing)) end function fileInfo(fs::FileSystem, path::String, abortSignal::Union{Nothing, Any})::Result{FileInfo, FileError} return err(FileError("not_supported", "fileInfo not implemented", path, nothing)) end function listDir(fs::FileSystem, path::String, abortSignal::Union{Nothing, Any})::Result{Vector{FileInfo}, FileError} return err(FileError("not_supported", "listDir not implemented", path, nothing)) end function canonicalPath(fs::FileSystem, path::String, abortSignal::Union{Nothing, Any})::Result{String, FileError} return err(FileError("not_supported", "canonicalPath not implemented", path, nothing)) end function exists(fs::FileSystem, path::String, abortSignal::Union{Nothing, Any})::Result{Bool, FileError} return err(FileError("not_supported", "exists not implemented", path, nothing)) end function createDir( fs::FileSystem, path::String, options::Dict{String, Any}, )::Result{Nothing, FileError} return err(FileError("not_supported", "createDir not implemented", path, nothing)) end function remove( fs::FileSystem, path::String, options::Dict{String, Any}, )::Result{Nothing, FileError} return err(FileError("not_supported", "remove not implemented", path, nothing)) end function createTempDir(fs::FileSystem, prefix::String="tmp-", abortSignal::Union{Nothing, Any})::Result{String, FileError} return err(FileError("not_supported", "createTempDir not implemented", nothing, nothing)) end function createTempFile(fs::FileSystem, options::Dict{String, Any})::Result{String, FileError} return err(FileError("not_supported", "createTempFile not implemented", nothing, nothing)) end function cleanup(fs::FileSystem)::Nothing return nothing end # ============================================================================ # Shell interface # ============================================================================ mutable struct ShellExecOptions cwd::Union{String, Nothing} env::Union{Dict{String, String}, Nothing} inheritEnv::Bool timeout::Union{Int64, Nothing} abortSignal::Union{Any, Nothing} onStdout::Union{Function, Nothing} onStderr::Union{Function, Nothing} end abstract type Shell end function exec(shell::Shell, command::String, options::Dict{String, Any})::Result{Dict{String, Any}, ExecutionError} return err(ExecutionError("not_supported", "exec not implemented", nothing)) end function cleanup(shell::Shell)::Nothing return nothing end # ============================================================================ # Execution environment # ============================================================================ abstract type ExecutionEnv <: FileSystem, Shell end # ============================================================================ # Session tree entry types # ============================================================================ abstract type SessionTreeEntry end struct MessageEntry <: SessionTreeEntry type::String id::String parent_id::Union{String, Nothing} timestamp::String message::AgentMessage end struct ThinkingLevelChangeEntry <: SessionTreeEntry type::String id::String parent_id::Union{String, Nothing} timestamp::String thinking_level::String end struct ModelChangeEntry <: SessionTreeEntry type::String id::String parent_id::Union{String, Nothing} timestamp::String provider::String model_id::String end struct ActiveToolsChangeEntry <: SessionTreeEntry type::String id::String parent_id::Union{String, Nothing} timestamp::String active_tool_names::Vector{String} end struct CompactionEntry <: SessionTreeEntry type::String id::String parent_id::Union{String, Nothing} timestamp::String summary::String first_kept_entry_id::Union{String, Nothing} tokens_before::Int64 retained_tail::Union{Vector{AgentMessage}, Nothing} details::Union{Any, Nothing} usage::Union{Usage, Nothing} from_hook::Bool end struct BranchSummaryEntry <: SessionTreeEntry type::String id::String parent_id::Union{String, Nothing} timestamp::String from_id::String summary::String details::Union{Any, Nothing} usage::Union{Usage, Nothing} from_hook::Bool end struct CustomEntry <: SessionTreeEntry type::String id::String parent_id::Union{String, Nothing} timestamp::String custom_type::String data::Union{Any, Nothing} end struct CustomMessageEntry <: SessionTreeEntry type::String id::String parent_id::Union{String, Nothing} timestamp::String custom_type::String content::String details::Union{Any, Nothing} display::Bool end struct LabelEntry <: SessionTreeEntry type::String id::String parent_id::Union{String, Nothing} timestamp::String target_id::String label::Union{String, Nothing} end struct SessionInfoEntry <: SessionTreeEntry type::String id::String parent_id::Union{String, Nothing} timestamp::String name::Union{String, Nothing} end struct LeafEntry <: SessionTreeEntry type::String id::String parent_id::Union{String, Nothing} timestamp::String target_id::Union{String, Nothing} end # ============================================================================ # Session context # ============================================================================ struct SessionContext messages::Vector{AgentMessage} thinking_level::String model::Union{Dict{String, String}, Nothing} active_tool_names::Union{Vector{String}, Nothing} end # ============================================================================ # Session stats # ============================================================================ struct SessionStats message_count::Int64 cached_tokens::Int64 uncached_tokens::Int64 total_tokens::Int64 cost_total::Float64 end # ============================================================================ # Session metadata # ============================================================================ mutable struct SessionMetadata id::String created_at::String end mutable struct JsonlSessionMetadata <: SessionMetadata id::String created_at::String cwd::String path::String parent_session_path::Union{String, Nothing} metadata::Union{Dict{String, Any}, Nothing} end # ============================================================================ # Session storage interface # ============================================================================ abstract type SessionStorage{T<:SessionMetadata} end function getMetadata(storage::SessionStorage)::Promise{T} return Promise() end function getLeafId(storage::SessionStorage)::Promise{Union{String, Nothing}} return Promise() end function setLeafId(storage::SessionStorage, leaf_id::String)::Promise{Nothing} return Promise() end function createEntryId(storage::SessionStorage)::Promise{String} return Promise() end function appendEntry(storage::SessionStorage, entry::SessionTreeEntry)::Promise{Nothing} return Promise() end function getEntry(storage::SessionStorage, id::String)::Promise{Union{SessionTreeEntry, Nothing}} return Promise() end function findEntries(storage::SessionStorage, type::String)::Promise{Vector{SessionTreeEntry}} return Promise() end function getLabel(storage::SessionStorage, id::String)::Promise{Union{String, Nothing}} return Promise() end function getSessionName(storage::SessionStorage)::Promise{Union{String, Nothing}} return Promise() end function getSessionStats(storage::SessionStorage)::Promise{SessionStats} return Promise() end function getPathToRootOrCompaction(storage::SessionStorage, leaf_id::String)::Promise{Vector{SessionTreeEntry}} return Promise() end function getEntries(storage::SessionStorage, options::Dict{String, Any})::Promise{Vector{SessionTreeEntry}} return Promise() end # ============================================================================ # Session repo interface # ============================================================================ abstract type SessionRepo< TMetadata<:SessionMetadata, TCreateOptions, TListOptions > end function create(repo::SessionRepo, options::TCreateOptions)::Promise{Session} return Promise() end function open(repo::SessionRepo, metadata::TMetadata)::Promise{Session} return Promise() end function list(repo::SessionRepo, options::TListOptions)::Promise{Vector{TMetadata}} return Promise() end function delete(repo::SessionRepo, metadata::TMetadata)::Promise{Nothing} return Promise() end function fork(repo::SessionRepo, source::TMetadata, options::Dict{String, Any})::Promise{Session} return Promise() end # ============================================================================ # Pending session write # ============================================================================ mutable struct PendingSessionWrite type::String message::Union{AgentMessage, Nothing} provider::Union{String, Nothing} model_id::Union{String, Nothing} thinking_level::Union{String, Nothing} active_tool_names::Union{Vector{String}, Nothing} custom_type::Union{String, Nothing} data::Union{Any, Nothing} content::Union{String, Nothing} display::Union{Bool, Nothing} target_id::Union{String, Nothing} label::Union{String, Nothing} name::Union{String, Nothing} end # ============================================================================ # Queue update event # ============================================================================ mutable struct QueueUpdateEvent type::String steer::Vector{AgentMessage} followUp::Vector{AgentMessage} nextTurn::Vector{AgentMessage} end # ============================================================================ # Save point event # ============================================================================ mutable struct SavePointEvent type::String had_pending_mutations::Bool end # ============================================================================ # Abort event # ============================================================================ mutable struct AbortEvent type::String cleared_steer::Vector{AgentMessage} cleared_follow_up::Vector{AgentMessage} end # ============================================================================ # Settled event # ============================================================================ mutable struct SettledEvent type::String next_turn_count::Int64 end # ============================================================================ # Before agent start event # ============================================================================ mutable struct BeforeAgentStartEvent{TSkill<:Skill, TPromptTemplate<:PromptTemplate} type::String prompt::String images::Union{Vector{ImageContent}, Nothing} system_prompt::String resources::AgentHarnessResources{TSkill, TPromptTemplate} end # ============================================================================ # Context event # ============================================================================ mutable struct ContextEvent type::String messages::Vector{AgentMessage} end # ============================================================================ # Before provider request event # ============================================================================ mutable struct BeforeProviderRequestEvent type::String model::Model session_id::String stream_options::AgentHarnessStreamOptions end # ============================================================================ # Before provider payload event # ============================================================================ mutable struct BeforeProviderPayloadEvent type::String model::Model payload::Any end # ============================================================================ # After provider response event # ============================================================================ mutable struct AfterProviderResponseEvent type::String status::Int64 headers::Dict{String, String} end # ============================================================================ # Tool call event # ============================================================================ mutable struct ToolCallEvent type::String tool_call_id::String tool_name::String input::Dict{String, Any} end # ============================================================================ # Tool result event # ============================================================================ mutable struct ToolResultEvent type::String tool_call_id::String tool_name::String input::Dict{String, Any} content::Vector{MessageContent} details::Any is_error::Bool usage::Union{Usage, Nothing} end # ============================================================================ # Session before compact event # ============================================================================ mutable struct SessionBeforeCompactEvent type::String preparation::Any branch_entries::Vector{SessionTreeEntry} custom_instructions::Union{String, Nothing} signal::Any end # ============================================================================ # Session compact event # ============================================================================ mutable struct SessionCompactEvent type::String compaction_entry::CompactionEntry from_hook::Bool end # ============================================================================ # Session before tree event # ============================================================================ mutable struct SessionBeforeTreeEvent type::String preparation::Any signal::Any end # ============================================================================ # Session tree event # ============================================================================ mutable struct SessionTreeEvent type::String new_leaf_id::Union{String, Nothing} old_leaf_id::Union{String, Nothing} summary_entry::Union{BranchSummaryEntry, Nothing} from_hook::Union{Bool, Nothing} end # ============================================================================ # Retry scheduled event # ============================================================================ mutable struct RetryScheduledEvent type::String operation::String attempt::Int64 max_attempts::Int64 delay_ms::Int64 error_message::String end # ============================================================================ # Retry attempt start event # ============================================================================ mutable struct RetryAttemptStartEvent type::String operation::String end # ============================================================================ # Retry finished event # ============================================================================ mutable struct RetryFinishedEvent type::String operation::String end # ============================================================================ # Model update event # ============================================================================ mutable struct ModelUpdateEvent type::String model::Model previous_model::Union{Model, Nothing} source::String end # ============================================================================ # Thinking level update event # ============================================================================ mutable struct ThinkingLevelUpdateEvent type::String level::ThinkingLevel previous_level::ThinkingLevel end # ============================================================================ # Tools update event # ============================================================================ mutable struct ToolsUpdateEvent type::String tool_names::Vector{String} previous_tool_names::Vector{String} active_tool_names::Vector{String} previous_active_tool_names::Vector{String} source::String end # ============================================================================ # Resources update event # ============================================================================ mutable struct ResourcesUpdateEvent{TSkill<:Skill, TPromptTemplate<:PromptTemplate} type::String resources::AgentHarnessResources{TSkill, TPromptTemplate} previous_resources::AgentHarnessResources{TSkill, TPromptTemplate} end # ============================================================================ # Agent harness own events # ============================================================================ abstract type AgentHarnessOwnEvent{TSkill<:Skill, TPromptTemplate<:PromptTemplate} end # ============================================================================ # Agent harness event # ============================================================================ abstract type AgentHarnessEvent{TSkill<:Skill, TPromptTemplate<:PromptTemplate} <: AgentEvent, AgentHarnessOwnEvent{TSkill, TPromptTemplate} end # ============================================================================ # Before agent start result # ============================================================================ mutable struct BeforeAgentStartResult messages::Union{Vector{AgentMessage}, Nothing} system_prompt::Union{String, Nothing} end # ============================================================================ # Context result # ============================================================================ mutable struct ContextResult messages::Vector{AgentMessage} end # ============================================================================ # Before provider request result # ============================================================================ mutable struct BeforeProviderRequestResult stream_options::Union{AgentHarnessStreamOptionsPatch, Nothing} end # ============================================================================ # Before provider payload result # ============================================================================ mutable struct BeforeProviderPayloadResult payload::Any end # ============================================================================ # Tool call result # ============================================================================ mutable struct ToolCallResult block::Union{Bool, Nothing} reason::Union{String, Nothing} end # ============================================================================ # Tool result patch # ============================================================================ mutable struct ToolResultPatch content::Union{Vector{MessageContent}, Nothing} details::Union{Any, Nothing} is_error::Union{Bool, Nothing} usage::Union{Usage, Nothing} terminate::Union{Bool, Nothing} end # ============================================================================ # Session before compact result # ============================================================================ mutable struct SessionBeforeCompactResult cancel::Union{Bool, Nothing} compaction::Union{CompactResult, Nothing} end # ============================================================================ # Session before tree result # ============================================================================ mutable struct SessionBeforeTreeResult cancel::Union{Bool, Nothing} summary::Union{Dict{String, Any}, Nothing} custom_instructions::Union{String, Nothing} replace_instructions::Union{Bool, Nothing} label::Union{String, Nothing} end # ============================================================================ # Agent harness event result map # ============================================================================ # ============================================================================ # Agent harness prompt options # ============================================================================ mutable struct AgentHarnessPromptOptions images::Union{Vector{ImageContent}, Nothing} end # ============================================================================ # Abort result # ============================================================================ mutable struct AbortResult cleared_steer::Vector{AgentMessage} cleared_follow_up::Vector{AgentMessage} end # ============================================================================ # Compact result # ============================================================================ mutable struct CompactResult summary::String first_kept_entry_id::Union{String, Nothing} tokens_before::Int64 usage::Union{Usage, Nothing} retained_tail::Union{Vector{AgentMessage}, Nothing} details::Union{Any, Nothing} end # ============================================================================ # Navigate tree result # ============================================================================ mutable struct NavigateTreeResult cancelled::Bool editor_text::Union{String, Nothing} summary_entry::Union{BranchSummaryEntry, Nothing} end # ============================================================================ # Compaction settings # ============================================================================ mutable struct CompactionSettings enabled::Bool reserve_tokens::Int64 keep_recent_tokens::Int64 end const DEFAULT_COMPACTION_SETTINGS = CompactionSettings(true, 16384, 20000) # ============================================================================ # Compaction preparation # ============================================================================ mutable struct CompactionPreparation first_kept_entry_id::String messages_to_summarize::Vector{AgentMessage} turn_prefix_messages::Vector{AgentMessage} retained_tail::Vector{AgentMessage} is_split_turn::Bool tokens_before::Int64 previous_summary::Union{String, Nothing} file_ops::Any settings::CompactionSettings end # ============================================================================ # File operations # ============================================================================ mutable struct FileOperations read::Set{String} written::Set{String} edited::Set{String} end # ============================================================================ # Tree preparation # ============================================================================ mutable struct TreePreparation target_id::String old_leaf_id::Union{String, Nothing} common_ancestor_id::Union{String, Nothing} entries_to_summarize::Vector{SessionTreeEntry} user_wants_summary::Bool custom_instructions::Union{String, Nothing} replace_instructions::Union{Bool, Nothing} label::Union{String, Nothing} end # ============================================================================ # Generate branch summary options # ============================================================================ mutable struct GenerateBranchSummaryOptions model::Model api_key::String headers::Union{Dict{String, String}, Nothing} signal::Any custom_instructions::Union{String, Nothing} replace_instructions::Union{Bool, Nothing} reserve_tokens::Int64 end # ============================================================================ # Branch summary result # ============================================================================ mutable struct BranchSummaryResult summary::String usage::Union{Usage, Nothing} read_files::Vector{String} modified_files::Vector{String} end # ============================================================================ # Agent harness system prompt # ============================================================================ mutable struct AgentHarnessSystemPrompt{TC<:Any, TSkill<:Skill, TPromptTemplate<:PromptTemplate, TTool<:AgentHarnessTool} value::Union{String, Function} end # ============================================================================ # Agent harness options # ============================================================================ mutable struct AgentHarnessOptions{TC<:Any, TSkill<:Skill, TPromptTemplate<:PromptTemplate, TTool<:AgentHarnessTool} session::Session models::Any tools::Union{Vector{TTool}, Nothing} resources::Union{AgentHarnessResources{TSkill, TPromptTemplate}, Nothing} system_prompt::Union{AgentHarnessSystemPrompt{TC, TSkill, TPromptTemplate, TTool}, Nothing} stream_options::Union{AgentHarnessStreamOptions, Nothing} retry::Union{Any, Nothing} model::Model thinking_level::Union{ThinkingLevel, Nothing} active_tool_names::Union{Vector{String}, Nothing} steering_mode::Union{QueueMode, Nothing} follow_up_mode::Union{QueueMode, Nothing} tool_context::Union{AgentHarnessToolContextSource{TC}, Nothing} end end