Skip to content

Agents Specification

Scope

  • Owns the core Robota agent runtime, tool integration, conversation execution, and plugin-facing agent behavior.
  • Defines the canonical agent orchestration surface used by provider and higher-level packages.
  • Provides abstract base classes that provider packages and extensions must implement.

Boundaries

  • Keeps provider-specific transport behavior in provider packages (@robota-sdk/agent-provider-openai, @robota-sdk/agent-provider-anthropic, @robota-sdk/agent-provider-google).
  • Keeps package-specific domain contracts owned once and reused through public surfaces.
  • Does not own workflow visualization, DAG orchestration, or session persistence (those belong to dag-*, @robota-sdk/agent-sessions).

Architecture Overview

Layer Structure

Robota (Facade)
  ├── ExecutionService (Orchestrator)
  │     ├── AI Provider call (via AIProviders manager)
  │     └── Tool execution (via ToolExecutionService)
  ├── Manager Layer
  │     ├── AIProviders        — provider registration and selection
  │     ├── Tools              — tool registry and schema lookup
  │     ├── AgentFactory       — agent creation and lifecycle
  │     ├── ConversationHistory — session and message storage
  │     └── ModuleRegistry     — dynamic module loading
  ├── Service Layer
  │     ├── ExecutionService        — message handling, LLM calls, response assembly
  │     ├── ToolExecutionService    — schema validation, tool lookup, batch execution
  │     └── EventService            — unified event emission with ownerPath binding
  ├── Permission Layer
  │     ├── permission-gate.ts      — evaluatePermission(): 3-step deterministic policy
  │     ├── permission-mode.ts      — MODE_POLICY matrix, UNKNOWN_TOOL_FALLBACK
  │     └── types.ts                — TPermissionMode, TTrustLevel, TPermissionDecision
  ├── Hook Layer
  │     ├── hook-runner.ts          — runHooks(): shell command hook execution engine
  │     └── types.ts                — THookEvent, THooksConfig, IHookInput, IHookResult
  └── Plugin Layer (1 built-in + 8 external @robota-sdk/agent-plugin-* packages)
        ├── EventEmitterPlugin           (built-in — event coordination)
        └── External plugins (per @robota-sdk/agent-plugin-*):
              conversation-history, logging, usage, performance,
              execution-analytics, error-handling, limits, webhook

Design Patterns

  • Facade: Robota is the single entry point, hiding manager/service/plugin complexity.
  • Template Method: AbstractAgent defines lifecycle hooks (beforeRun, afterRun, onError).
  • Strategy: Event services, storage strategies, error handling strategies are interchangeable.
  • Registry: ToolRegistry and ModuleRegistry for central resource management.
  • Null Object: SilentLogger and DefaultEventService provide safe no-op defaults.
  • Factory: AgentFactory for agent creation with lifecycle hooks.
  • Observer: EventEmitterPlugin for pub/sub event coordination.

Dependency Injection

All managers, services, and tools accept dependencies through constructor injection. No global singletons exist. Each Robota instance is completely independent.

Safe defaults use the Null Object pattern:

  • SilentLogger for logging (no side effects)
  • DEFAULT_ABSTRACT_EVENT_SERVICE for events (no-op)

Type Ownership

This package is the single source of truth (SSOT) for the following types:

TypeLocationPurpose
TUniversalMessageinterfaces/messages.tsCanonical message union (User, Assistant, System, Tool)
TUniversalMessageMetadatainterfaces/messages.tsMessage metadata record. Values: string | number | boolean | Date | string[] | number[] | Record<string, number> (includes token usage objects)
TUniversalValueinterfaces/types.tsRecursive value type without any
TMetadatainterfaces/types.tsMetadata record type
IAgentConfiginterfaces/agent.tsAgent configuration contract
IAIProviderinterfaces/provider.tsProvider integration contract
IToolSchemainterfaces/provider.tsTool schema contract
TToolParametersinterfaces/types.tsTool parameter type (re-exported via interfaces/tool.ts)
IEventServiceevent-service/interfaces.tsEvent emission contract
IOwnerPathSegmentevent-service/interfaces.tsExecution path tracking
RobotaErrorutils/errors.tsBase error hierarchy
TTextDeltaCallbackinterfaces/provider.tsStreaming text delta callback (delta: string) => void
TPermissionModepermissions/types.tsPermission modes: plan, default, acceptEdits, bypassPermissions
TTrustLevelpermissions/types.tsFriendly trust aliases: safe, moderate, full
TPermissionDecisionpermissions/types.tsEvaluation outcome: auto, approve, deny
TToolArgspermissions/permission-gate.tsTool arguments record for permission matching
IPermissionListspermissions/permission-gate.tsAllow/deny pattern lists for permission config
TKnownToolNamepermissions/permission-mode.tsKnown tool names in the permission system
THookEventhooks/types.tsHook lifecycle events: PreToolUse, PostToolUse, PreCompact, PostCompact, SessionStart, Stop
THooksConfighooks/types.tsComplete hooks configuration: event to hook groups
IHookGrouphooks/types.tsHook group: matcher pattern + hook definitions
IHookDefinitionhooks/types.tsSingle hook definition (type: command, command string)
IHookInputhooks/types.tsInput passed to hook commands via stdin
IHookResulthooks/types.tsHook execution result (exitCode, stdout, stderr)
IContextTokenUsagecontext/types.tsToken usage from a single API call (input, output, cache tokens)
IContextWindowStatecontext/types.tsContext window state snapshot (maxTokens, usedTokens, percentage)

Provider packages import these types. They must not re-declare them.

Public API Surface

Core

ExportKindDescription
RobotaclassMain agent facade
AbstractAgentabstract classBase agent lifecycle
AbstractAIProviderabstract classBase for provider implementations
AbstractPluginabstract classBase for plugin extensions
AbstractToolabstract classBase for tool implementations
AbstractExecutorabstract classBase for execution strategies
LocalExecutorclassLocal provider execution

Tools

NOTE: ToolRegistry, FunctionTool, createFunctionTool, createZodFunctionTool, and OpenAPITool have been moved to @robota-sdk/agent-tools. MCPTool and RelayMcpTool have been moved to @robota-sdk/agent-tool-mcp.

Permissions

ExportKindDescription
evaluatePermissionfunction3-step deterministic policy: deny list, allow list, mode
MODE_POLICYconstPermission mode to tool decision matrix
TRUST_TO_MODEconstMaps TTrustLevel to TPermissionMode
UNKNOWN_TOOL_FALLBACKconstFallback decisions for unknown tools per mode
TPermissionModetype'plan' | 'default' | 'acceptEdits' | 'bypassPermissions'
TTrustLeveltype'safe' | 'moderate' | 'full'
TPermissionDecisiontype'auto' | 'approve' | 'deny'
TToolArgstypeTool arguments record for permission matching
IPermissionListstypeAllow/deny pattern lists
TKnownToolNametypeKnown tool names: Bash, Read, Write, Edit, Glob, Grep

Hooks

ExportKindDescription
runHooksfunctionExecute shell command hooks for lifecycle events
THookEventtype'PreToolUse' | 'PostToolUse' | 'SessionStart' | 'Stop' | 'PreCompact' | 'PostCompact'
THooksConfigtypeEvent to hook group array mapping
IHookGrouptypeMatcher pattern + hook definitions
IHookDefinitiontypeSingle hook definition (command type)
IHookInputtypeJSON input passed to hooks via stdin
IHookResulttypeHook result: exitCode (0=allow, 2=block), stdout, stderr

Streaming

ExportKindDescription
TTextDeltaCallbacktype(delta: string) => void — streaming text callback

This callback is declared in IChatOptions.onTextDelta and used by providers to emit text chunks during streaming responses.

Context Window Tracking

ExportKindDescription
IContextTokenUsageinterfaceToken usage from a single API call (inputTokens, outputTokens, cache)
IContextWindowStateinterfaceContext window state snapshot (maxTokens, usedTokens, usedPercentage)

These types are consumed by @robota-sdk/agent-sessions to track cumulative token usage and context window state across conversation turns.

Managers

ExportKindDescription
AgentFactoryclassAgent creation and lifecycle
AgentTemplatesclassTemplate-based agent creation
ConversationHistoryclassHistory management
ConversationSessionclassSession management

Services

ExportKindDescription
AbstractEventServiceabstract classEvent system base
DefaultEventServiceclassNo-op event service
StructuredEventServiceclassOwner-bound events
ObservableEventServiceclassRxJS integration
EventHistoryModuleclassEvent recording

Plugins (1 built-in)

PluginCategoryDescription
EventEmitterPluginevent_processingEvent coordination

8 plugins were extracted to @robota-sdk/agent-plugin-* packages to comply with the agent-core zero-dependency rule. They extend AbstractPlugin (defined here) and are wired by the consuming layer.

Plugin Contract

Plugins extend AbstractPlugin and implement lifecycle hooks:

HookTimingPurpose
beforeRunBefore LLM callInput transformation, validation
afterRunAfter LLM responseOutput processing, recording
onErrorOn execution errorError handling, recovery
onStreamChunkDuring streamingChunk processing
beforeToolExecutionBefore tool callTool input validation
afterToolExecutionAfter tool resultTool output processing

Plugins declare category (PluginCategory) and priority (PluginPriority) for execution ordering.

Event Architecture

Event Naming

Full event names follow the pattern ownerType.localName:

PrefixOwnerExamples
execution.*ExecutionServiceexecution.start, execution.complete
tool.*ToolExecutionServicetool.execute_start, tool.execute_success
agent.*Robotaagent.completion, agent.created
task.*Task systemtask.started, task.completed
user.*User actionsuser.input

Owner Path Tracking

Each event carries an ownerPath array of IOwnerPathSegment objects that traces the execution hierarchy:

typescript
interface IOwnerPathSegment {
  ownerType: string; // 'agent' | 'tool' | 'execution'
  ownerId: string;
}

Events are bound to their owner via bindWithOwnerPath().

Permission System

The permission module (src/permissions/) provides a deterministic, three-step policy evaluation for tool calls. It is consumed by @robota-sdk/agent-sessions to gate tool execution before delegating to the actual tool.

Evaluation Algorithm (evaluatePermission)

  1. Deny list match -- If any deny pattern matches the tool invocation, return 'deny'.
  2. Allow list match -- If any allow pattern matches, return 'auto' (proceed without prompting).
  3. Mode policy lookup -- Look up the tool in MODE_POLICY[mode]. If found, return the mapped decision. Otherwise, return UNKNOWN_TOOL_FALLBACK[mode].

Permission Modes

ModeRead toolsWrite toolsBash
planautodenydeny
defaultautoapprove (prompt)approve (prompt)
acceptEditsautoautoapprove (prompt)
bypassPermissionsautoautoauto

Pattern Syntax

Patterns follow the format ToolName(argGlob):

  • Bash(pnpm *) -- Bash tool whose command starts with "pnpm "
  • Read(/src/**) -- Read tool whose filePath is under /src/
  • Write(*) -- Write tool with any argument
  • ToolName -- Match any invocation of that tool (no argument constraint)

Hook System

The hook module (src/hooks/) provides a shell command-based lifecycle hook mechanism. Hooks receive JSON input on stdin and communicate results via exit codes.

Hook Events

EventTimingPurpose
PreToolUseBefore tool executionValidation, blocking, transformation
PostToolUseAfter tool executionLogging, auditing, notification
SessionStartSession initializationSetup, environment checks
StopSession terminationCleanup, reporting
PreCompactBefore context compactionValidation, logging (trigger: auto/manual)
PostCompactAfter context compactionLogging, notification (includes compact_summary)

Exit Code Protocol

CodeMeaning
0Allow / proceed
2Block / deny (stderr = reason)
otherProceed with warning

Hook Configuration

Hooks are configured as a THooksConfig object mapping events to arrays of IHookGroup entries. Each group has a matcher regex pattern (empty = match all) and an array of IHookDefinition commands. Hooks have a 10-second timeout.

Extension Points

ExtensionBase ClassContract
AI ProviderAbstractAIProviderImplement chat(), chatStream()
ToolAbstractToolImplement execute(), provide schema
PluginAbstractPluginOverride lifecycle hooks
ModuleAbstractModuleImplement execute()
ExecutorAbstractExecutorImplement execute(), executeStream()
StoragePer-plugin interfacesImplement storage adapter (memory, file, remote)

Error Taxonomy

All errors extend RobotaError with code, category, and recoverable properties:

Error ClassCodeCategoryRecoverable
ConfigurationErrorCONFIGURATION_ERRORuserno
ValidationErrorVALIDATION_ERRORuserno
ProviderErrorPROVIDER_ERRORprovideryes
AuthenticationErrorAUTHENTICATION_ERRORuserno
RateLimitErrorRATE_LIMIT_ERRORprovideryes
NetworkErrorNETWORK_ERRORsystemyes
ToolExecutionErrorTOOL_EXECUTION_ERRORsystemno
ModelNotAvailableErrorMODEL_NOT_AVAILABLEuserno
CircuitBreakerOpenErrorCIRCUIT_BREAKER_OPENsystemyes
PluginErrorPLUGIN_ERRORsystemno
StorageErrorSTORAGE_ERRORsystemyes

ErrorUtils provides isRecoverable(), getErrorCode(), fromUnknown(), and wrapProviderError().

Class Contract Registry

Interface Implementations

InterfaceImplementorKindLocation
IAgentAbstractAgentabstract basesrc/abstracts/abstract-agent.ts
IAgentRobotaproductionsrc/core/robota.ts
IAIProviderAbstractAIProviderabstract basesrc/abstracts/abstract-ai-provider.ts
IExecutorAbstractExecutorabstract basesrc/abstracts/abstract-executor.ts
IPluginContract, IPluginHooksAbstractPluginabstract basesrc/abstracts/abstract-plugin.ts
IToolWithEventServiceAbstractToolabstract basesrc/abstracts/abstract-tool.ts
IModule, IModuleHooksAbstractModuleabstract basesrc/abstracts/abstract-module.ts
IWorkflowConverterAbstractWorkflowConverterabstract basesrc/abstracts/abstract-workflow-converter.ts
IWorkflowValidatorAbstractWorkflowValidatorabstract basesrc/abstracts/abstract-workflow-validator.ts
IEventServiceAbstractEventServiceabstract basesrc/event-service/event-service.ts
IEventServiceDefaultEventServiceproduction (null object)src/event-service/event-service.ts
IEventServiceStructuredEventServiceproductionsrc/event-service/event-service.ts
IEventServiceObservableEventServiceproductionsrc/event-service/event-service.ts
IConversationHistoryConversationHistoryproductionsrc/managers/conversation-history-manager.ts
IConversationHistoryConversationSessionproductionsrc/managers/conversation-session.ts
IConversationServiceConversationServiceproductionsrc/services/conversation-service/index.ts
IToolManagerToolsproductionsrc/managers/tool-manager.ts
IAIProviderManagerAIProvidersproductionsrc/managers/ai-provider-manager.ts
IPluginsManagerPluginsproductionsrc/managers/plugins.ts
ILoggerConsoleLoggerproductionsrc/utils/logger.ts
IEventHistoryModuleEventHistoryModuleproductionsrc/services/history-module.ts
IEventHistoryModuleInMemoryHistoryStoreproductionsrc/services/in-memory-history-store.ts
IEventEmitterMetricsInMemoryEventEmitterMetricsproductionsrc/plugins/event-emitter/metrics.ts
ICacheStorageMemoryCacheStorageproductionsrc/services/cache/memory-cache-storage.ts

NOTE: FunctionTool, ToolRegistry, OpenAPITool moved to @robota-sdk/agent-tools. MCPTool, RelayMcpTool moved to @robota-sdk/agent-tool-mcp. Plugin storage implementations (ILogStorage, IUsageStorage, IPerformanceStorage, IHistoryStorage, etc.) moved to their respective @robota-sdk/agent-plugin-* packages.

Inheritance Chains (within agent-core)

BaseDerivedLocationNotes
AbstractAgentRobotasrc/core/robota.tsMain facade
AbstractEventServiceDefaultEventServicesrc/event-service/event-service.tsNull object
AbstractEventServiceStructuredEventServicesrc/event-service/event-service.tsOwner-bound events
AbstractEventServiceObservableEventServicesrc/event-service/event-service.tsRxJS integration
AbstractExecutorLocalExecutorsrc/executors/local-executor.tsLocal provider execution
AbstractPluginEventEmitterPluginsrc/plugins/event-emitter-plugin.tsEvent coordination

NOTE: Tool implementations (FunctionTool, OpenAPITool) in @robota-sdk/agent-tools implement IFunctionTool/ITool directly without extending AbstractTool. Plugin implementations in @robota-sdk/agent-plugin-* extend AbstractPlugin.

Cross-Package Port Consumers

Port (Owner)Adapter (Consumer Package)Location
AbstractAIProvider (agent-core)OpenAIProvider (agent-provider-openai)packages/agent-provider-openai/src/provider.ts
AbstractAIProvider (agent-core)AnthropicProvider (agent-provider-anthropic)packages/agent-provider-anthropic/src/provider.ts
AbstractAIProvider (agent-core)GoogleProvider (agent-provider-google)packages/agent-provider-google/src/provider.ts
AbstractAIProvider (agent-core)MockAIProvider (agent-sessions)packages/agent-sessions/examples/verify-offline.ts
AbstractExecutor (agent-core)SimpleRemoteExecutor (agent-remote)packages/agent-remote/src/client/remote-executor-simple.ts

Test Strategy

Current Coverage

LayerTest FilesCoverage
Core (Robota)robota.test.tsCore flow
Executorslocal-executor.test.tsLocal execution
Managersagent-factory.test.ts, tool-manager.test.ts, conversation-history-manager.test.tsCreation, tools, history
Pluginsevent-emitter-plugin.test.tsEvent coordination
Servicesevent-service.test.ts, execution-service.test.tsEvents, execution

Scenario Verification

  • Command: pnpm scenario:verify (runs examples/verify-offline.ts with MockAIProvider)
  • Record: examples/scenarios/offline-verify.record.json
  • Validates: agent creation, tool registration, conversation flow without network

Coverage Gaps (Improvement Targets)

  • Service edge cases: tool-execution-service, task-events, user-events
  • Utility tests: errors, validation, message-converter
  • NOTE: Plugin tests belong to @robota-sdk/agent-plugin-* packages. Tool tests belong to @robota-sdk/agent-tools.

Dependencies

Production (2)

  • jssha — SHA hashing for content verification
  • zod — Schema validation for tool parameters

Key Peer Contracts

  • Provider packages implement AbstractAIProvider and IAIProvider
  • @robota-sdk/agent-sessions consumes Robota, runHooks, evaluatePermission, TUniversalMessage
  • @robota-sdk/agent-tools consumes AbstractTool, IFunctionTool, IToolWithEventService
  • @robota-sdk/agent-plugin-* packages extend AbstractPlugin
  • @robota-sdk/agent-team consumes Robota, IAgentConfig, event services

Released under the MIT License.