Skip to content

@stello-ai/core Configuration

Complete reference for StelloAgentConfig and all its nested interfaces.

StelloAgentConfig

Top-level configuration passed to createStelloAgent().

typescript
interface StelloAgentConfig {
  sessions: SessionTree
  memory: MemoryEngine
  session?: StelloAgentSessionConfig
  capabilities: StelloAgentCapabilitiesConfig
  runtime?: StelloAgentRuntimeConfig
  orchestration?: StelloAgentOrchestrationConfig
}
FieldRequiredDescription
sessionsYesTopology tree manager
memoryYesMemory engine
sessionNoSession component integration config
capabilitiesYesCapability injection config
runtimeNoRuntime config
orchestrationNoOrchestration layer config

StelloAgentSessionConfig

Connect @stello-ai/session Session / MainSession into the core Engine system.

typescript
interface StelloAgentSessionConfig {
  sessionResolver?: (sessionId: string) => Promise<SessionCompatible>
  mainSessionResolver?: () => Promise<MainSessionCompatible | null>
  consolidateFn?: SessionCompatibleConsolidateFn
  integrateFn?: SessionCompatibleIntegrateFn
  serializeSendResult?: (result: SessionCompatibleSendResult) => string
  toolCallParser?: ToolCallParser
  options?: Record<string, unknown>
}
FieldDescription
sessionResolverResolve a real Session instance by sessionId
mainSessionResolverResolve the MainSession; only needed when integration is required
consolidateFnSession L3 to L2 distillation function
integrateFnMainSession integration function
serializeSendResultSerialization for send() results, defaults to JSON
toolCallParserTool call parser for TurnRunner, defaults to sessionSendResultParser
optionsPass-through config reserved for the Session component

TIP

If sessionResolver + consolidateFn are provided, core will automatically build runtime.resolver. If runtime.resolver is also provided manually, the manual config takes precedence.

StelloAgentCapabilitiesConfig

typescript
interface StelloAgentCapabilitiesConfig {
  lifecycle: EngineLifecycleAdapter
  tools: EngineToolRuntime
  skills: SkillRouter
  confirm: ConfirmProtocol
}
FieldDescription
lifecycleLifecycle adapter
toolsTool runtime
skillsSkill router
confirmConfirm protocol

EngineLifecycleAdapter

typescript
interface EngineLifecycleAdapter {
  bootstrap(sessionId: string): Promise<BootstrapResult>
  afterTurn(sessionId: string, userMsg: TurnRecord, assistantMsg: TurnRecord): Promise<AfterTurnResult>
  prepareChildSpawn(options: CreateSessionOptions): Promise<TopologyNode>
}
MethodDescription
bootstrapInitialize when entering a Session; returns assembled context and metadata
afterTurnPost-turn processing: extract L1, update memory, append L3
prepareChildSpawnPrepare before forking: create folder, metadata, topology node

EngineToolRuntime

typescript
interface EngineToolRuntime {
  getToolDefinitions(): ToolDefinition[]
  executeTool(name: string, args: Record<string, unknown>): Promise<ToolExecutionResult>
}
MethodDescription
getToolDefinitionsReturn all available tool definitions (name, description, parameter schema)
executeToolExecute a named tool

ConfirmProtocol

typescript
interface ConfirmProtocol {
  confirmSplit(proposal: SplitProposal): Promise<TopologyNode>
  dismissSplit(proposal: SplitProposal): Promise<void>
  confirmUpdate(proposal: UpdateProposal): Promise<void>
  dismissUpdate(proposal: UpdateProposal): Promise<void>
}
MethodDescription
confirmSplitConfirm a split proposal, creating a child Session
dismissSplitDismiss a split proposal
confirmUpdateConfirm an L1 field update
dismissUpdateDismiss an L1 field update

SkillRouter / Skill

Skills follow the standard Agent Skills pattern (lazy-loaded prompt injection). The LLM activates a skill by name via the built-in activate_skill tool, and the Engine returns the skill's content as the tool result.

typescript
interface SkillRouter {
  register(skill: Skill): void
  get(name: string): Skill | undefined
  getAll(): Skill[]
}

interface Skill {
  name: string          // unique name
  description: string   // LLM uses this to decide whether to activate
  content: string       // full prompt content injected on activation
}

When skills are registered, the Engine automatically appends an activate_skill tool to getToolDefinitions(), allowing the LLM to activate skills via tool calls.

StelloAgentRuntimeConfig

typescript
interface StelloAgentRuntimeConfig {
  resolver: SessionRuntimeResolver
  recyclePolicy?: RuntimeRecyclePolicy
}
FieldDescription
resolverSession runtime resolver
recyclePolicyEngine recycling policy

RuntimeRecyclePolicy

typescript
interface RuntimeRecyclePolicy {
  idleTtlMs?: number
}
FieldDefaultDescription
idleTtlMs0Idle recycling delay (ms). 0 means immediate recycling when ref count reaches zero; > 0 means delayed recycling

StelloAgentOrchestrationConfig

typescript
interface StelloAgentOrchestrationConfig {
  strategy?: OrchestrationStrategy
  splitGuard?: SplitGuard
  mainSession?: SchedulerMainSession | null
  turnRunner?: TurnRunner
  scheduler?: Scheduler
  hooks?: EngineHookProvider
}
FieldDescription
strategyOrchestration strategy, defaults to MainSessionFlatStrategy
splitGuardSplit protection guard
mainSessionMainSession for the Scheduler; omit to skip integration
turnRunnerCustom TurnRunner
schedulerCustom Scheduler
hooksEngine event hook provider

EngineHooks

typescript
interface EngineHooks {
  onMessageReceived(ctx: { sessionId: string; input: string }): Promise<void> | void
  onAssistantReply(ctx: { sessionId: string; input: string; content: string | null; rawResponse: string }): Promise<void> | void
  onToolCall(ctx: { sessionId: string; toolCall: ToolCall }): Promise<void> | void
  onToolResult(ctx: { sessionId: string; result: ToolCallResult }): Promise<void> | void
  onSessionEnter(ctx: { sessionId: string }): Promise<void> | void
  onSessionLeave(ctx: { sessionId: string }): Promise<void> | void
  onRoundStart(ctx: EngineRoundContext): Promise<void> | void
  onRoundEnd(ctx: EngineRoundResultContext): Promise<void> | void
  onSessionArchive(ctx: { sessionId: string }): Promise<void> | void
  onSessionFork(ctx: { parentId: string; child: TopologyNode }): Promise<void> | void
  onError(ctx: { source: string; error: Error }): Promise<void> | void
}

All hooks are optional and support both synchronous and asynchronous execution.

HookContext
onMessageReceivedsessionId, input
onAssistantReplysessionId, input, content, rawResponse
onToolCallsessionId, toolCall (with name, args)
onToolResultsessionId, result (with toolName, success, data, error)
onSessionEntersessionId
onSessionLeavesessionId
onRoundStartsessionId, input
onRoundEndsessionId, input, turn (TurnRunnerResult)
onSessionArchivesessionId
onSessionForkparentId, child (TopologyNode)
onErrorsource, error

SchedulerConfig

typescript
interface SchedulerConfig {
  consolidation?: ConsolidationPolicy
  integration?: IntegrationPolicy
}

interface ConsolidationPolicy {
  trigger: ConsolidationTrigger
  everyNTurns?: number
}

interface IntegrationPolicy {
  trigger: IntegrationTrigger
  everyNTurns?: number
}

ConsolidationTrigger: 'manual' | 'everyNTurns' | 'onSwitch' | 'onArchive' | 'onLeave'

IntegrationTrigger: 'manual' | 'afterConsolidate' | 'everyNTurns' | 'onSwitch' | 'onArchive' | 'onLeave'

SplitGuard

typescript
class SplitGuard {
  constructor(sessions: SessionTreeImpl, strategy?: Partial<SplitStrategy>)
  getConfig(): { minTurns: number; cooldownTurns: number }
  updateConfig(patch: Partial<{ minTurns: number; cooldownTurns: number }>): void
  checkCanSplit(sessionId: string): Promise<SplitCheckResult>
}
ParameterDefaultDescription
minTurns3Minimum turns before a Session can split
cooldownTurns5Minimum turns between two splits

TurnRunnerOptions

typescript
interface TurnRunnerOptions {
  maxToolRounds?: number
  onToolCall?: (toolCall: ToolCall) => Promise<void> | void
  onToolResult?: (result: ToolCallResult) => Promise<void> | void
}
FieldDescription
maxToolRoundsMaximum number of tool call rounds
onToolCallObserver callback before each tool call
onToolResultObserver callback after each tool call

StelloAgentHotConfig

Configuration subset that can be safely modified at runtime via updateConfig(). Only includes value-type fields, not function/object references.

typescript
interface StelloAgentHotConfig {
  runtime?: Partial<RuntimeRecyclePolicy>
  scheduling?: Partial<SchedulerConfig>
  splitGuard?: Partial<{ minTurns: number; cooldownTurns: number }>
}