@directive-run/ai 0.5.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/debug-timeline.ts","../src/guardrail-utils.ts","../src/orchestrator-bridge.ts","../src/breakpoints.ts","../src/checkpoint.ts","../src/structured-output.ts","../src/agent-orchestrator.ts","../src/health-monitor.ts","../src/reflection.ts","../src/streaming.ts","../src/pattern-factories.ts","../src/multi-agent-orchestrator.ts","../src/testing.ts"],"names":["GuardrailError","options","isGuardrailError","error","AGENT_KEY","APPROVAL_KEY","CONVERSATION_KEY","TOOL_CALLS_KEY","BREAKPOINT_KEY","SCRATCHPAD_KEY","orchestratorBridgeSchema","t","KNOWN_EVENT_TYPES","BLOCKED_IMPORT_KEYS","createDebugTimeline","maxEvents","goToSnapshot","events","nextId","listeners","event","fullEvent","overflow","listener","err","agentId","e","type","snapshotId","startMs","endMs","cutoffId","i","sliceEnd","json","parsed","key","data","validated","evt","createDebugTimelinePlugin","timeline","getSnapshotId","resolverStartTimes","id","active","resolver","req","startTime","_req","errorMessage","normalizeGuardrail","guardrail","index","calculateRetryDelay","attempt","config","backoff","baseDelayMs","maxDelayMs","delay","abortableDelay","ms","signal","resolve","reject","onAbort","timer","executeGuardrailWithRetry","context","retry","maxAttempts","lastError","calculateAgentRetryDelay","executeAgentWithRetry","runner","agent","input","retryConfig","isRetryable","onRetry","retryable","getAgentState","facts","getBridgeFact","setAgentState","state","setBridgeFact","getApprovalState","setApprovalState","getConversation","setConversation","messages","getToolCalls","setToolCalls","toolCalls","getBreakpointState","setBreakpointState","getOrchestratorState","convertOrchestratorConstraints","constraints","result","constraint","combinedFacts","convertOrchestratorResolvers","resolvers","runAgentWithGuardrails","getSystemFacts","orchestratorContext","opts","MAX_BREAKPOINT_HISTORY","breakpointCounter","createBreakpointId","matchBreakpoint","breakpoints","bp","createInitialBreakpointState","BLOCKED_KEYS","createCheckpointId","timestamp","random","validateCheckpoint","obj","localState","InMemoryCheckpointStore","checkpoint","existingIdx","checkpointId","cp","cutoff","pruned","toRemove","idx","oldest","extractJsonFromOutput","output","trimmed","objectStart","arrayStart","start","openChar","closeChar","depth","inString","escaped","char","jsonStr","sanitized","match","formatValidationError","issue","withStructuredOutput","schema","maxRetries","extractJson","schemaDescription","schemaPrompt","structuredAgent","lastResult","effectiveInput","outputStr","extracted","StructuredOutputError","message","MAX_CONVERSATION_MESSAGES","MAX_TOOL_CALLS","createAgentOrchestrator","factsSchema","init","guardrails","onApprovalRequest","autoApproveToolCalls","maxTokenBudget","budgetWarningThreshold","onBudgetWarning","plugins","rawDebug","approvalTimeoutMs","agentRetry","hooks","memory","circuitBreaker","selfHealing","outputSchema","maxSchemaRetries","checkpointStore","onBreakpoint","breakpointTimeoutMs","debug","MAX_VERBOSE_LENGTH","fireHook","name","hookError","RESERVED_ORCHESTRATOR_KEYS","combinedSchema","runAgentWithGuardrailsFn","system","directiveConstraints","directiveResolvers","currentFacts","requirementGuard","currentAgent","callbackPlugin","createCallbackPlugin","orchestratorModule","createModule","allPlugins","createSystem","_currentFacts","callOptions","runAgentWithGuardrailsInner","fallbackRunner","rerouteEvent","contextMessages","contextStr","m","bpContext","mods","handleBreakpoint","effectiveInputGuardrails","effectiveOutputGuardrails","inputGuardrailsList","g","guardStartTime","effectiveSchema","effectiveRunner","updated","toolCall","toolCallGuardrails","guardResult","approvalId","approvalRequest","currentApproval","waitForApproval","updatedToolCalls","delayMs","outputGuardrailsList","shouldFireBudgetWarning","budgetPercentage","newTokenUsage","warningFired","callbackError","memoryError","breakpointModifications","breakpointCancelReasons","waitForBreakpointResolution","bpId","settled","timeoutId","cleanupAll","unsubscribe","bpState","cancelReason","bpTimeout","request","requestId","approval","rejectedRequest","r","errorMsg","timeoutSeconds","getCombinedFacts","abortController","MAX_STREAM_BUFFER","chunks","waiters","closed","tokenCount","MAX_ACCUMULATED_OUTPUT","accumulatedOutput","abortHandler","cleanup","pushChunk","chunk","waiter","closeStream","resultPromise","processedInput","inputGuardrails","currentConversation","newTokens","currentToolCalls","outputGuardrails","duration","timeoutMs","isIdle","MAX_APPROVAL_HISTORY","approved","reason","MAX_REJECTION_HISTORY","rejected","cpOptions","restoreOpts","modifications","resolved","cancelled","DEFAULT_WEIGHTS","createHealthMonitor","windowMs","maxNormalLatencyMs","maxEventsPerAgent","weights","value","weightSum","circuitStates","generation","cachedAll","cachedGen","getAgentEvents","agentEvents","pruneAndCap","now","firstValid","excessFromCap","computeScore","successRate","avgLatency","s","normalizedLatency","circuitScore","raw","buildMetrics","successes","failures","avgLatencyMs","lastErrors","latencyMs","ReflectionExhaustedError","MAX_MULTIPLEX_BUFFER","mergeTaggedStreams","sources","done","buffer","activeSources","droppedCount","push","item","finish","source","dag","nodes","merge","safeStringify","shallowEqual","a","b","aObj","bObj","aKeys","bKeys","getPatternStep","Semaphore","max","released","entry","releaseFn","next","pending","isRunAgentReq","createMultiAgentOrchestrator","inputAgents","patterns","onHandoff","onHandoffComplete","maxHandoffHistory","sharedMemory","defaultAgentRetry","userConstraints","userResolvers","orchestratorCircuitBreaker","breakpointConfigs","userDerivations","scratchpadConfig","inputTasks","agents","tasks","taskStates","taskId","taskSemaphores","RESERVED_IDS","taskReg","attempts","reg","registeredAgentIds","missingAgents","patternId","pattern","agentsToCheck","node","details","validateDagAcyclic","timelinePlugin","healthMonitorInstance","roundRobinCounters","coordFacts","coordSchema","coordConstraints","coordResolvers","resolverCtx","globalStatus","runSingleAgent","coordinatorModule","modulesMap","registration","perAgentConstraints","perAgentResolvers","resolverContext","globalTokenCount","disposed","pendingRuns","lastReflectionHistory","assertNotDisposed","semaphores","agentStates","MAX_HANDOFF_RESULTS","pendingHandoffs","handoffResults","handoffCounter","addHandoffResult","approvalRequestIndex","idleWaiters","notifyIdleWaiters","derivedValues","derivedChangeCallbacks","buildCrossAgentSnapshot","agentsSnap","getAgentFacts","snapshot","recomputeDerivations","changed","errors","derivId","derivFn","newValue","oldValue","hasChanged","derivError","cb","scratchpadChangeCallbacks","scratchpadKeyCallbacks","scratchpadInstance","changedKeys","current","notifyScratchpadChange","_","rest","values","safeValues","k","keys","v","callback","allKeys","keyCbs","breakpointId","agentFacts","agentName","extra","matched","currentBp","runTask","label","bpResult","effectivePatternId","sem","buildContext","nodeId","agentState","taskState","percent","clampedPercent","baseDelay","executeAttempt","timeoutTimer","rawOutput","durationMs","MAX_BACKOFF_MS","rawDelay","available","effectiveCircuitBreaker","runSingleAgentInner","equivalents","findEquivalentAgents","alternate","selectBestEquivalent","originalInput","semaphore","release","controller","effectiveMemory","effectiveRetry","toolCallGuardrailsList","newTotal","messagesToStore","base","runAgentStreamImpl","taskChunks","taskWaiters","taskClosed","pushTaskChunk","closeTaskStream","w","taskAbortController","taskExternalAbortHandler","MAX_AGENT_STREAM_BUFFER","stream","runParallelPattern","patternStartTime","patternError","promises","results","successResults","failCount","savePatternCheckpoint","store","step","runSequentialPattern","initialInput","resumeFrom","pId","ckptConfig","ckptStore","ckptEveryN","ckptPrefix","currentInput","collectedResults","startIdx","last","nextInput","runSupervisorPattern","workerResults","serializedWorkerResults","maxRounds","wr","startRound","supervisorResult","round","action","cleaned","stripped","workerResult","runDagPattern","dagCkptConfig","dagCkptStore","dagCkptEveryN","dagCkptPrefix","dagCompletedCount","dagLastCheckpointCount","dagCheckpointChain","dagTotalNodes","status","nr","onNodeError","maxConcurrent","graphTimeoutId","evaluatePendingNodes","terminalStatuses","depId","inflight","running","launchNode","nodeStartTime","nodeInput","upstreamOutputs","nodeController","nodeTimeoutId","nodeResults","nid","ckptState","readyNodes","promise","runReflectPattern","maxIterations","effectiveSignal","reflectTimeoutId","reflectExternalOnAbort","parseEvaluation","buildRetryInput","inp","feedback","_iteration","reflectCkptConfig","reflectCkptStore","reflectCkptEveryN","reflectCkptPrefix","lastProducerResult","history","producerOutputs","startIteration","iteration","iterStart","producerResult","producerOutput","evaluatorResult","evaluation","parseError","thresholdValue","iterDurationMs","record","cbError","retryError","h","p","bestIdx","bestScore","bestOutput","runRacePattern","minSuccess","raceTimeoutId","raceExternalOnAbort","agentErrors","startedAgents","entries","allPromises","settledCount","winner","failedCount","maxPossibleSuccesses","msg","first","winnerId","successIds","cancelledIds","allResults","runDebateInternal","debateAgents","evaluator","extract","parseJudgement","debateTimeoutId","externalOnAbort","ctrl","parseJudge","rounds","lastWinnerId","lastWinnerOutput","debateCkptConfig","debateCkptStore","debateCkptEveryN","debateCkptPrefix","debateTotalTokens","proposalPromises","proposals","evalInput","evalResult","judgement","GOAL_BLOCKED_KEYS","goalSafeMerge","target","validateGoalAcyclic","producerMap","nodeIds","inDegree","adjacency","reqKey","producers","producerId","queue","visited","dependent","validateProducerConflicts","safeCall","fn","args","safeCallAsync","computeGoalMetrics","currentSatisfaction","stepMetrics","_step","recentSteps","avgDelta","sum","estimatedStepsRemaining","decelerating","recent3","prior3","recentAvg","priorAvg","clampSatisfaction","runGoalInternal","originalNodes","goalWhen","satisfactionFn","maxSteps","selectionStrategy","relaxation","onStep","onStall","goalTimeoutId","goalHandlers","n","executionOrder","out","relaxations","completedNodes","failedNodes","nodeInputHashes","agentMetrics","stallSteps","appliedRelaxationTiers","lastSatisfaction","goalAchieved","startStep","checkpointConfig","checkpointEveryN","checkpointStoreRef","checkpointLabelPrefix","lastCheckpointId","MAX_CONSECUTIVE_FAILURES","totalTokens","requires","inputHash","selectedNodes","rawSatisfaction","goalProgressMetrics","strategyMetrics","strategyResult","relaxationApplied","tierIdx","tier","threshold","strategy","altNode","altId","rawSat","ctx","stallMetrics","stepStart","rawPreSat","preSatisfaction","stepTokens","factsProduced","nodePromises","customInput","relevantFacts","outputFacts","rawPostSat","postSatisfaction","satisfactionDelta","savedId","seen","group","sourceReg","caps","c","counter","selected","best","score","getPatternHandlers","orchestrator","handlerIds","agentIds","inputs","inputArray","fromAgent","toAgent","targetMemory","contextSummary","handoffResult","allIdle","check","agentModule","referencedAgents","existing","tsem","local","perAgentStreams","streamResult","taggedSources","mergedStream","getDroppedCount","resultsPromise","mergePromise","raceOpts","evaluatorId","reflectOpts","exhausted","debateOpts","when","goalOpts","checkpointState","normalizedState","BLOCKED","replayInput","deps","createMockAgentRunner","defaultResponse","responses","recordCalls","onRun","calls","responseMap","currentDefault","runOptions","generated","testGuardrail","testInput","fullContext","expectedReason","expected","testGuardrailBatch","testCases","testCase","createApprovalSimulator","autoApprove","autoReject","recordRequests","requests","pendingRequests","requestWaiters","predicate","timeout","createTestOrchestrator","mockResponses","defaultMockResponse","orchestratorOptions","mockRunner","approvalSimulator","testOrchestrator","createConstraintRecorder","snapshots","assertOrchestratorState","min","exact","len","createTimeController","currentTime","initial","time","createTestMultiAgentOrchestrator","mockTaskConfigs","existingTasks","createMockTask","responsesByName","assertMultiAgentState","expectedStatus","allStates","total","pendingCount","_input","createTestDag","assertDagExecution","actual","expectedOutput","createTestTimeline","assertTimelineEvents","expectedCount","createFailingRunner","callCount","failAfter","_agent","_runOptions","assertRerouted","assertAgentHealth","monitor","metrics","createTestCheckpointStore","maxCheckpoints","inner","saved","assertCheckpoint","createBreakpointSimulator","hits","orchestratorRef","attached","doResolve","orch","assertBreakpointHit","types","createMockSchema","validate","description","collectMultiplexedStream","assertMultiplexedStream","seenAgents","createTestReflectionEvaluator","passAfter","_output","_context","passed","assertScratchpadState","scratchpad","all","expectedValue","assertDerivedValues","derived","sortedStringify"],"mappings":"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","file":"testing.js","sourcesContent":["/**\n * Shared types for AI adapter — used by orchestrator, guardrails, helpers, and stack.\n */\n\nimport type {\n ModuleSchema,\n Requirement,\n SchemaType,\n} from \"@directive-run/core\";\nimport { t } from \"@directive-run/core\";\nimport type {\n BreakpointRequest,\n BreakpointState as BreakpointStateFromBreakpoints,\n} from \"./breakpoints.js\";\n\n// ============================================================================\n// Agent Types (LLM-agnostic)\n// ============================================================================\n\n/** Simplified Agent interface */\nexport interface AgentLike {\n name: string;\n instructions?: string;\n model?: string;\n tools?: unknown[];\n}\n\n/** Agent run result */\nexport interface RunResult<T = unknown> {\n output: T;\n messages: Message[];\n toolCalls: ToolCall[];\n totalTokens: number;\n /** Breakdown of input vs output tokens, when available from the provider */\n tokenUsage?: TokenUsage;\n /** True when result was served from semantic cache */\n isCached?: boolean;\n}\n\n/** Breakdown of token usage by input/output */\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n}\n\n/** Message from agent run */\nexport interface Message {\n role: \"user\" | \"assistant\" | \"tool\" | \"system\";\n content: string;\n toolCallId?: string;\n}\n\n/** Tool call record */\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: string;\n result?: string;\n}\n\n/** Run function type */\nexport type AgentRunner = <T = unknown>(\n agent: AgentLike,\n input: string,\n options?: RunOptions,\n) => Promise<RunResult<T>>;\n\n/** Callback-based streaming run function (e.g. for SSE-based LLM APIs) */\nexport type StreamingCallbackRunner = (\n agent: AgentLike,\n input: string,\n callbacks: {\n onToken?: (token: string) => void;\n onToolStart?: (tool: string, id: string, args: string) => void;\n onToolEnd?: (tool: string, id: string, result: string) => void;\n onMessage?: (message: Message) => void;\n signal?: AbortSignal;\n },\n) => Promise<RunResult<unknown>>;\n\n/** Run options */\nexport interface RunOptions {\n maxTurns?: number;\n signal?: AbortSignal;\n onMessage?: (message: Message) => void;\n onToolCall?: (toolCall: ToolCall) => void | Promise<void>;\n}\n\n// ============================================================================\n// Adapter Lifecycle Hooks\n// ============================================================================\n\n/**\n * Lifecycle hooks for adapter-level observability.\n *\n * Attach to any adapter (runner or streaming runner) to trace, log,\n * or measure individual LLM calls without modifying application code.\n *\n * @example\n * ```typescript\n * const runner = createOpenAIRunner({\n * apiKey: process.env.OPENAI_API_KEY!,\n * hooks: {\n * onBeforeCall: ({ agent, input }) => console.log(`→ ${agent.name}`, input.slice(0, 50)),\n * onAfterCall: ({ durationMs, tokenUsage }) => {\n * metrics.track('llm_call', { durationMs, ...tokenUsage });\n * },\n * onError: ({ error }) => Sentry.captureException(error),\n * },\n * });\n * ```\n */\nexport interface AdapterHooks {\n /** Fires before each LLM API call. */\n onBeforeCall?: (event: {\n agent: AgentLike;\n input: string;\n timestamp: number;\n }) => void;\n\n /** Fires after a successful LLM API call. */\n onAfterCall?: (event: {\n agent: AgentLike;\n input: string;\n output: string;\n totalTokens: number;\n tokenUsage: TokenUsage;\n durationMs: number;\n timestamp: number;\n }) => void;\n\n /** Fires when an LLM API call fails. */\n onError?: (event: {\n agent: AgentLike;\n input: string;\n error: Error;\n durationMs: number;\n timestamp: number;\n }) => void;\n}\n\n// ============================================================================\n// Guardrail Types\n// ============================================================================\n\n/** Guardrail function */\nexport type GuardrailFn<T = unknown> = (\n data: T,\n context: GuardrailContext,\n) => GuardrailResult | Promise<GuardrailResult>;\n\n/** Guardrail context */\nexport interface GuardrailContext {\n agentName: string;\n input: string;\n facts: Record<string, unknown>;\n}\n\n/** Guardrail result */\nexport interface GuardrailResult {\n passed: boolean;\n reason?: string;\n transformed?: unknown;\n}\n\n/** Input guardrail data */\nexport interface InputGuardrailData {\n input: string;\n agentName: string;\n}\n\n/** Output guardrail data */\nexport interface OutputGuardrailData {\n output: unknown;\n agentName: string;\n input: string;\n messages: Message[];\n}\n\n/** Tool call guardrail data */\nexport interface ToolCallGuardrailData {\n toolCall: ToolCall;\n agentName: string;\n input: string;\n}\n\n/** Retry configuration for guardrails */\nexport interface GuardrailRetryConfig {\n /** Total attempts (1 = no retries, 2 = one retry, etc.). @default 1 */\n attempts?: number;\n /** @default \"exponential\" */\n backoff?: \"exponential\" | \"linear\" | \"fixed\";\n /** @default 100 */\n baseDelayMs?: number;\n /** @default 5000 */\n maxDelayMs?: number;\n}\n\n/** Named guardrail for better debugging */\nexport interface NamedGuardrail<T = unknown> {\n name: string;\n fn: GuardrailFn<T>;\n /** @default true */\n critical?: boolean;\n retry?: GuardrailRetryConfig;\n}\n\n/** Guardrails configuration */\nexport interface GuardrailsConfig {\n input?: Array<\n GuardrailFn<InputGuardrailData> | NamedGuardrail<InputGuardrailData>\n >;\n output?: Array<\n GuardrailFn<OutputGuardrailData> | NamedGuardrail<OutputGuardrailData>\n >;\n toolCall?: Array<\n GuardrailFn<ToolCallGuardrailData> | NamedGuardrail<ToolCallGuardrailData>\n >;\n}\n\n// ============================================================================\n// Retry Configuration\n// ============================================================================\n\n/** Retry configuration for agent runs */\nexport interface AgentRetryConfig {\n /** @default 1 */\n attempts?: number;\n /** @default \"exponential\" */\n backoff?: \"exponential\" | \"linear\" | \"fixed\";\n /** @default 1000 */\n baseDelayMs?: number;\n /** @default 30000 */\n maxDelayMs?: number;\n isRetryable?: (error: Error) => boolean;\n onRetry?: (attempt: number, error: Error, delayMs: number) => void;\n}\n\n// ============================================================================\n// Orchestrator State Types\n// ============================================================================\n\n/** Agent state in facts */\nexport interface AgentState {\n status: \"idle\" | \"running\" | \"paused\" | \"completed\" | \"error\";\n currentAgent: string | null;\n input: string | null;\n output: unknown | null;\n error: string | null;\n tokenUsage: number;\n turnCount: number;\n startedAt: number | null;\n completedAt: number | null;\n}\n\n/** Approval state */\nexport interface ApprovalState {\n pending: ApprovalRequest[];\n approved: string[];\n rejected: RejectedRequest[];\n}\n\n/** Rejected request with tracking information */\nexport interface RejectedRequest {\n id: string;\n reason?: string;\n rejectedAt: number;\n}\n\n/** Approval request */\nexport interface ApprovalRequest {\n id: string;\n type: \"tool_call\" | \"output\" | \"handoff\";\n agentName: string;\n description: string;\n data: unknown;\n requestedAt: number;\n}\n\n/** Combined orchestrator state */\nexport interface OrchestratorState {\n agent: AgentState;\n approval: ApprovalState;\n conversation: Message[];\n toolCalls: ToolCall[];\n}\n\n// ============================================================================\n// Orchestrator Config Types\n// ============================================================================\n\n/** Constraint for orchestrator */\nexport interface OrchestratorConstraint<F extends Record<string, unknown>> {\n when: (facts: F & OrchestratorState) => boolean | Promise<boolean>;\n require: Requirement | ((facts: F & OrchestratorState) => Requirement);\n priority?: number;\n}\n\n/** Resolver context for orchestrator */\nexport interface OrchestratorResolverContext<\n F extends Record<string, unknown>,\n> {\n facts: F & OrchestratorState;\n runAgent: <T>(\n agent: AgentLike,\n input: string,\n options?: RunOptions,\n ) => Promise<RunResult<T>>;\n signal: AbortSignal;\n}\n\n/** Resolver for orchestrator */\nexport interface OrchestratorResolver<\n F extends Record<string, unknown>,\n R extends Requirement = Requirement,\n> {\n requirement: (req: Requirement) => req is R;\n key?: (req: R) => string;\n resolve: (\n req: R,\n context: OrchestratorResolverContext<F>,\n ) => void | Promise<void>;\n}\n\n/** Lifecycle hooks for observability */\nexport interface OrchestratorLifecycleHooks {\n onAgentStart?: (event: {\n agentName: string;\n input: string;\n timestamp: number;\n }) => void;\n onAgentComplete?: (event: {\n agentName: string;\n input: string;\n output: unknown;\n tokenUsage: number;\n durationMs: number;\n timestamp: number;\n }) => void;\n onAgentError?: (event: {\n agentName: string;\n input: string;\n error: Error;\n durationMs: number;\n timestamp: number;\n }) => void;\n onGuardrailCheck?: (event: {\n agentId?: string;\n guardrailName: string;\n guardrailType: \"input\" | \"output\" | \"toolCall\";\n passed: boolean;\n reason?: string;\n durationMs: number;\n timestamp: number;\n }) => void;\n onAgentRetry?: (event: {\n agentName: string;\n input: string;\n attempt: number;\n error: Error;\n delayMs: number;\n timestamp: number;\n }) => void;\n /** Called when a breakpoint is hit and waiting for resolution. */\n onBreakpoint?: (request: BreakpointRequest) => void;\n}\n\n/** Lifecycle hooks for multi-agent orchestrator observability */\nexport interface MultiAgentLifecycleHooks {\n onAgentStart?: (event: {\n agentId: string;\n agentName: string;\n input: string;\n timestamp: number;\n }) => void;\n onAgentComplete?: (event: {\n agentId: string;\n agentName: string;\n input: string;\n output: unknown;\n tokenUsage: number;\n durationMs: number;\n timestamp: number;\n }) => void;\n onAgentError?: (event: {\n agentId: string;\n agentName: string;\n input: string;\n error: Error;\n durationMs: number;\n timestamp: number;\n }) => void;\n onGuardrailCheck?: (event: {\n agentId: string;\n guardrailName: string;\n guardrailType: \"input\" | \"output\" | \"toolCall\";\n passed: boolean;\n reason?: string;\n durationMs: number;\n timestamp: number;\n }) => void;\n onAgentRetry?: (event: {\n agentId: string;\n agentName: string;\n input: string;\n attempt: number;\n error: Error;\n delayMs: number;\n timestamp: number;\n }) => void;\n onHandoff?: (request: {\n id: string;\n fromAgent: string;\n toAgent: string;\n input: string;\n requestedAt: number;\n }) => void;\n onHandoffComplete?: (result: {\n request: { id: string; fromAgent: string; toAgent: string };\n completedAt: number;\n }) => void;\n onPatternStart?: (event: {\n patternId: string;\n patternType:\n | \"parallel\"\n | \"sequential\"\n | \"supervisor\"\n | \"dag\"\n | \"reflect\"\n | \"race\"\n | \"debate\"\n | \"goal\";\n input: string;\n timestamp: number;\n }) => void;\n onPatternComplete?: (event: {\n patternId: string;\n patternType:\n | \"parallel\"\n | \"sequential\"\n | \"supervisor\"\n | \"dag\"\n | \"reflect\"\n | \"race\"\n | \"debate\"\n | \"goal\";\n durationMs: number;\n timestamp: number;\n error?: Error;\n }) => void;\n onDagNodeStart?: (event: {\n patternId: string;\n nodeId: string;\n agentId: string;\n nodeType: \"agent\" | \"task\";\n timestamp: number;\n }) => void;\n onDagNodeComplete?: (event: {\n patternId: string;\n nodeId: string;\n agentId: string;\n nodeType: \"agent\" | \"task\";\n durationMs: number;\n timestamp: number;\n }) => void;\n onDagNodeError?: (event: {\n patternId: string;\n nodeId: string;\n agentId: string;\n nodeType: \"agent\" | \"task\";\n error: Error;\n durationMs: number;\n timestamp: number;\n }) => void;\n onDagNodeSkipped?: (event: {\n patternId: string;\n nodeId: string;\n agentId: string;\n nodeType: \"agent\" | \"task\";\n reason: string;\n timestamp: number;\n }) => void;\n onHealthChange?: (event: {\n agentId: string;\n oldScore: number;\n newScore: number;\n timestamp: number;\n }) => void;\n onReroute?: (event: RerouteEvent) => void;\n /** Called when a breakpoint is hit and waiting for resolution. */\n onBreakpoint?: (request: BreakpointRequest) => void;\n /** Called when a cross-agent derivation value updates */\n onDerivationUpdate?: (event: {\n derivationId: string;\n value: unknown;\n timestamp: number;\n }) => void;\n /** Called when a cross-agent derivation throws an error */\n onDerivationError?: (event: {\n derivationId: string;\n error: Error;\n timestamp: number;\n }) => void;\n /** Called when scratchpad values are updated */\n onScratchpadUpdate?: (event: { keys: string[]; timestamp: number }) => void;\n /** Called when a task starts executing */\n onTaskStart?: (event: {\n patternId: string;\n taskId: string;\n label: string;\n timestamp: number;\n }) => void;\n /** Called when a task completes successfully */\n onTaskComplete?: (event: {\n patternId: string;\n taskId: string;\n label: string;\n durationMs: number;\n timestamp: number;\n }) => void;\n /** Called when a task fails */\n onTaskError?: (event: {\n patternId: string;\n taskId: string;\n label: string;\n error: Error;\n durationMs: number;\n timestamp: number;\n }) => void;\n /** Called when a task reports progress */\n onTaskProgress?: (event: {\n patternId: string;\n taskId: string;\n label: string;\n percent: number;\n message?: string;\n timestamp: number;\n }) => void;\n /** Called when a pattern checkpoint is saved */\n onCheckpointSave?: (event: {\n checkpointId: string;\n patternType: string;\n step: number;\n timestamp: number;\n }) => void;\n /** Called when a checkpoint save fails */\n onCheckpointError?: (event: {\n patternType: string;\n step: number;\n error: Error;\n timestamp: number;\n }) => void;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/** Error codes for guardrail errors */\nexport type GuardrailErrorCode =\n | \"INPUT_GUARDRAIL_FAILED\"\n | \"OUTPUT_GUARDRAIL_FAILED\"\n | \"TOOL_CALL_GUARDRAIL_FAILED\"\n | \"APPROVAL_REJECTED\"\n | \"BUDGET_EXCEEDED\"\n | \"RATE_LIMIT_EXCEEDED\"\n | \"AGENT_ERROR\";\n\n/**\n * Structured error for guardrail failures.\n *\n * **Security:** The `input` and `data` properties are non-enumerable to prevent\n * accidental leakage of sensitive data via JSON.stringify or console.log.\n */\nexport class GuardrailError extends Error {\n readonly code: GuardrailErrorCode;\n readonly guardrailName: string;\n readonly guardrailType: \"input\" | \"output\" | \"toolCall\";\n readonly userMessage: string;\n declare readonly data: unknown;\n readonly agentName: string;\n declare readonly input: string;\n\n constructor(options: {\n code: GuardrailErrorCode;\n message: string;\n guardrailName: string;\n guardrailType: \"input\" | \"output\" | \"toolCall\";\n userMessage?: string;\n data?: unknown;\n agentName: string;\n input: string;\n cause?: Error;\n }) {\n super(options.message, { cause: options.cause });\n this.name = \"GuardrailError\";\n this.code = options.code;\n this.guardrailName = options.guardrailName;\n this.guardrailType = options.guardrailType;\n this.userMessage = options.userMessage ?? options.message;\n this.agentName = options.agentName;\n\n Object.defineProperty(this, \"input\", {\n value: options.input,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n Object.defineProperty(this, \"data\", {\n value: options.data,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n guardrailName: this.guardrailName,\n guardrailType: this.guardrailType,\n userMessage: this.userMessage,\n agentName: this.agentName,\n };\n }\n}\n\n/** Check if an error is a GuardrailError. */\nexport function isGuardrailError(error: unknown): error is GuardrailError {\n return error instanceof GuardrailError;\n}\n\n// ============================================================================\n// Schema Validation Types (used by built-in guardrails)\n// ============================================================================\n\n/** Schema validation result */\nexport interface SchemaValidationResult {\n valid: boolean;\n errors?: string[];\n}\n\n/** Schema validator function type */\nexport type SchemaValidator<_T = unknown> = (\n value: unknown,\n) => SchemaValidationResult | boolean;\n\n// ============================================================================\n// Bridge Schema Constants\n// ============================================================================\n\nexport const AGENT_KEY = \"__agent\" as const;\nexport const APPROVAL_KEY = \"__approval\" as const;\nexport const CONVERSATION_KEY = \"__conversation\" as const;\nexport const TOOL_CALLS_KEY = \"__toolCalls\" as const;\nexport const BREAKPOINT_KEY = \"__breakpoints\" as const;\n\n// ============================================================================\n// DAG Execution Types (Multi-Agent)\n// ============================================================================\n\n/** Status of a DAG node during execution */\nexport type DagNodeStatus =\n | \"pending\"\n | \"ready\"\n | \"running\"\n | \"completed\"\n | \"error\"\n | \"skipped\";\n\n/** Execution context available to DAG node callbacks */\nexport interface DagExecutionContext {\n /** Original input to the DAG */\n input: string;\n /** Outputs keyed by node ID (populated as nodes complete) */\n outputs: Record<string, unknown>;\n /** Statuses keyed by node ID */\n statuses: Record<string, DagNodeStatus>;\n /** Error messages keyed by node ID */\n errors: Record<string, string>;\n /** Full RunResult keyed by node ID */\n results: Record<string, RunResult<unknown>>;\n}\n\n/** A node in a DAG execution pattern */\nexport interface DagNode {\n /** Registered handler ID (agent or task) to run for this node */\n handler: string;\n /** Upstream node IDs this node depends on */\n deps?: string[];\n /** Conditional edge — evaluated when deps are met. @default unconditional */\n when?: (context: DagExecutionContext) => boolean;\n /** Build input string for this node's agent. @default JSON.stringify(upstream outputs) */\n transform?: (context: DagExecutionContext) => string;\n /** Per-node timeout (ms) */\n timeout?: number;\n /** Tiebreaker when multiple nodes are ready (higher = first). @default 0 */\n priority?: number;\n}\n\n/** DAG execution pattern — nodes are agents, edges are reactive conditions */\nexport interface DagPattern<T = unknown> {\n type: \"dag\";\n /** Nodes keyed by node ID */\n nodes: Record<string, DagNode>;\n /** Merge all node outputs into the final result */\n merge: (context: DagExecutionContext) => T | Promise<T>;\n /** Overall DAG timeout (ms) */\n timeout?: number;\n /** Maximum nodes running concurrently. @default Infinity. Consider setting this to avoid API rate limits. */\n maxConcurrent?: number;\n /** Error handling strategy. @default \"fail\" */\n onNodeError?: \"fail\" | \"skip-downstream\" | \"continue\";\n /** Checkpoint configuration for mid-execution fault tolerance */\n checkpoint?: PatternCheckpointConfig;\n}\n\n// ============================================================================\n// Debug Configuration\n// ============================================================================\n\n/** Debug configuration for orchestrators */\nexport interface OrchestratorDebugConfig {\n verboseTimeline?: boolean;\n}\n\n// ============================================================================\n// Debug Timeline Types\n// ============================================================================\n\n/** All debug event types */\nexport type DebugEventType =\n | \"agent_start\"\n | \"agent_complete\"\n | \"agent_error\"\n | \"agent_retry\"\n | \"guardrail_check\"\n | \"constraint_evaluate\"\n | \"resolver_start\"\n | \"resolver_complete\"\n | \"resolver_error\"\n | \"approval_request\"\n | \"approval_response\"\n | \"handoff_start\"\n | \"handoff_complete\"\n | \"pattern_start\"\n | \"pattern_complete\"\n | \"dag_node_update\"\n | \"breakpoint_hit\"\n | \"breakpoint_resumed\"\n | \"derivation_update\"\n | \"scratchpad_update\"\n | \"reflection_iteration\"\n | \"race_start\"\n | \"race_winner\"\n | \"race_cancelled\"\n | \"debate_round\"\n | \"reroute\"\n | \"checkpoint_save\"\n | \"checkpoint_restore\"\n | \"task_start\"\n | \"task_complete\"\n | \"task_error\"\n | \"task_progress\"\n | \"goal_step\";\n\n/** Base debug event */\nexport interface DebugEventBase {\n id: number;\n type: DebugEventType;\n timestamp: number;\n agentId?: string;\n snapshotId: number | null;\n}\n\n/** Agent start event */\nexport interface AgentStartEvent extends DebugEventBase {\n type: \"agent_start\";\n agentId: string;\n inputLength: number;\n /** Truncated input text (max 5000 chars) */\n input?: string;\n}\n\n/** Agent complete event */\nexport interface AgentCompleteEvent extends DebugEventBase {\n type: \"agent_complete\";\n agentId: string;\n outputLength: number;\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n durationMs: number;\n modelId?: string;\n /** Truncated output text (max 5000 chars) */\n output?: string;\n}\n\n/** Agent error event */\nexport interface AgentErrorEvent extends DebugEventBase {\n type: \"agent_error\";\n agentId: string;\n errorMessage: string;\n durationMs: number;\n}\n\n/** Agent retry event */\nexport interface AgentRetryEvent extends DebugEventBase {\n type: \"agent_retry\";\n agentId: string;\n attempt: number;\n errorMessage: string;\n delayMs: number;\n}\n\n/** Guardrail check event */\nexport interface GuardrailCheckEvent extends DebugEventBase {\n type: \"guardrail_check\";\n guardrailName: string;\n guardrailType: \"input\" | \"output\" | \"toolCall\";\n passed: boolean;\n reason?: string;\n durationMs: number;\n}\n\n/** Constraint evaluate event */\nexport interface ConstraintEvaluateEvent extends DebugEventBase {\n type: \"constraint_evaluate\";\n constraintId: string;\n fired: boolean;\n}\n\n/** Resolver start event */\nexport interface ResolverStartEvent extends DebugEventBase {\n type: \"resolver_start\";\n resolverId: string;\n requirementType: string;\n}\n\n/** Resolver complete event */\nexport interface ResolverCompleteEvent extends DebugEventBase {\n type: \"resolver_complete\";\n resolverId: string;\n durationMs: number;\n}\n\n/** Resolver error event */\nexport interface ResolverErrorEvent extends DebugEventBase {\n type: \"resolver_error\";\n resolverId: string;\n errorMessage: string;\n durationMs: number;\n}\n\n/** Approval request event */\nexport interface ApprovalRequestEvent extends DebugEventBase {\n type: \"approval_request\";\n requestId: string;\n approvalType: \"tool_call\" | \"output\" | \"handoff\";\n}\n\n/** Approval response event */\nexport interface ApprovalResponseEvent extends DebugEventBase {\n type: \"approval_response\";\n requestId: string;\n approved: boolean;\n reason?: string;\n}\n\n/** Handoff start event */\nexport interface HandoffStartEvent extends DebugEventBase {\n type: \"handoff_start\";\n fromAgent: string;\n toAgent: string;\n}\n\n/** Handoff complete event */\nexport interface HandoffCompleteEvent extends DebugEventBase {\n type: \"handoff_complete\";\n fromAgent: string;\n toAgent: string;\n durationMs: number;\n}\n\n/** Pattern start event */\nexport interface PatternStartEvent extends DebugEventBase {\n type: \"pattern_start\";\n patternId: string;\n patternType:\n | \"parallel\"\n | \"sequential\"\n | \"supervisor\"\n | \"dag\"\n | \"reflect\"\n | \"race\"\n | \"debate\"\n | \"goal\";\n /** All handler IDs in this pattern (agents + tasks) */\n handlers?: string[];\n /** Which handler IDs are tasks (rest are agents) */\n taskIds?: string[];\n}\n\n/** Pattern complete event */\nexport interface PatternCompleteEvent extends DebugEventBase {\n type: \"pattern_complete\";\n patternId: string;\n patternType:\n | \"parallel\"\n | \"sequential\"\n | \"supervisor\"\n | \"dag\"\n | \"reflect\"\n | \"race\"\n | \"debate\"\n | \"goal\";\n durationMs: number;\n error?: string;\n}\n\n/** DAG node update event */\nexport interface DagNodeUpdateEvent extends DebugEventBase {\n type: \"dag_node_update\";\n nodeId: string;\n status: DagNodeStatus;\n deps?: string[];\n}\n\n/** Breakpoint hit event */\nexport interface BreakpointHitEvent extends DebugEventBase {\n type: \"breakpoint_hit\";\n breakpointId: string;\n breakpointType: string;\n label?: string;\n}\n\n/** Breakpoint resumed event */\nexport interface BreakpointResumedEvent extends DebugEventBase {\n type: \"breakpoint_resumed\";\n breakpointId: string;\n modified: boolean;\n skipped: boolean;\n}\n\n/** Derivation update event */\nexport interface DerivationUpdateEvent extends DebugEventBase {\n type: \"derivation_update\";\n derivationId: string;\n valueType: string;\n}\n\n/** Scratchpad update event */\nexport interface ScratchpadUpdateEvent extends DebugEventBase {\n type: \"scratchpad_update\";\n keys: string[];\n}\n\n/** Reflection iteration event */\nexport interface ReflectionIterationEvent extends DebugEventBase {\n type: \"reflection_iteration\";\n iteration: number;\n passed: boolean;\n score?: number;\n durationMs: number;\n producerTokens: number;\n evaluatorTokens: number;\n}\n\n/** Race start event */\nexport interface RaceStartEvent extends DebugEventBase {\n type: \"race_start\";\n patternId: string;\n agents: string[];\n}\n\n/** Race winner event */\nexport interface RaceWinnerEvent extends DebugEventBase {\n type: \"race_winner\";\n patternId: string;\n winnerId: string;\n durationMs: number;\n}\n\n/** Race cancelled event */\nexport interface RaceCancelledEvent extends DebugEventBase {\n type: \"race_cancelled\";\n patternId: string;\n cancelledIds: string[];\n reason: \"winner_found\" | \"timeout\" | \"all_failed\";\n}\n\n/** Debate round event — emitted after each round's judgement */\nexport interface DebateRoundEvent extends DebugEventBase {\n type: \"debate_round\";\n patternId: string;\n round: number;\n totalRounds: number;\n winnerId: string;\n score?: number;\n agentCount: number;\n}\n\n/** Reroute debug event recorded when self-healing reroutes to an alternate agent */\nexport interface RerouteDebugEvent extends DebugEventBase {\n type: \"reroute\";\n agentId: string;\n from: string;\n to: string;\n reason: string;\n}\n\n/** Checkpoint save event */\nexport interface CheckpointSaveEvent extends DebugEventBase {\n type: \"checkpoint_save\";\n checkpointId: string;\n patternType: string;\n step: number;\n}\n\n/** Checkpoint restore event */\nexport interface CheckpointRestoreEvent extends DebugEventBase {\n type: \"checkpoint_restore\";\n checkpointId: string;\n patternType: string;\n step: number;\n}\n\n/** Task start event */\nexport interface TaskStartEvent extends DebugEventBase {\n type: \"task_start\";\n taskId: string;\n label: string;\n description?: string;\n inputLength: number;\n}\n\n/** Task complete event */\nexport interface TaskCompleteEvent extends DebugEventBase {\n type: \"task_complete\";\n taskId: string;\n label: string;\n durationMs: number;\n}\n\n/** Task error event */\nexport interface TaskErrorEvent extends DebugEventBase {\n type: \"task_error\";\n taskId: string;\n label: string;\n error: string;\n durationMs: number;\n attempt?: number;\n}\n\n/** Task progress event */\nexport interface TaskProgressEvent extends DebugEventBase {\n type: \"task_progress\";\n taskId: string;\n label: string;\n percent: number;\n message?: string;\n}\n\n/** Goal step event — emitted for each agent invocation within a goal step */\nexport interface GoalStepEvent extends DebugEventBase {\n type: \"goal_step\";\n agentId: string;\n step: number;\n nodeId: string;\n satisfaction: number;\n satisfactionDelta: number;\n}\n\n/** Union of all debug event types */\nexport type DebugEvent =\n | AgentStartEvent\n | AgentCompleteEvent\n | AgentErrorEvent\n | AgentRetryEvent\n | GuardrailCheckEvent\n | ConstraintEvaluateEvent\n | ResolverStartEvent\n | ResolverCompleteEvent\n | ResolverErrorEvent\n | ApprovalRequestEvent\n | ApprovalResponseEvent\n | HandoffStartEvent\n | HandoffCompleteEvent\n | PatternStartEvent\n | PatternCompleteEvent\n | DagNodeUpdateEvent\n | BreakpointHitEvent\n | BreakpointResumedEvent\n | DerivationUpdateEvent\n | ScratchpadUpdateEvent\n | ReflectionIterationEvent\n | RaceStartEvent\n | RaceWinnerEvent\n | RaceCancelledEvent\n | DebateRoundEvent\n | RerouteDebugEvent\n | CheckpointSaveEvent\n | CheckpointRestoreEvent\n | TaskStartEvent\n | TaskCompleteEvent\n | TaskErrorEvent\n | TaskProgressEvent\n | GoalStepEvent;\n\n// ============================================================================\n// Self-Healing Types\n// ============================================================================\n\n/** Health state for an agent stored in facts */\nexport interface AgentHealthState {\n circuitState: \"CLOSED\" | \"OPEN\" | \"HALF_OPEN\";\n healthScore: number;\n lastUpdated: number;\n}\n\n/** Reroute event fired when an agent is rerouted */\nexport interface RerouteEvent {\n originalAgent: string;\n reroutedTo: string;\n reason: string;\n timestamp: number;\n}\n\n/** Health monitor configuration */\nexport interface HealthMonitorConfig {\n /** Rolling window for metrics (ms). @default 60000 */\n windowMs?: number;\n /** Weights for health score computation (must sum to ~1.0) */\n weights?: {\n /** Weight for success rate (0-1). @default 0.5 */\n successRate?: number;\n /** Weight for latency (0-1). @default 0.3 */\n latency?: number;\n /** Weight for circuit state (0-1). @default 0.2 */\n circuitState?: number;\n };\n /** Max latency considered \"normal\" (ms). @default 5000 */\n maxNormalLatencyMs?: number;\n /** Max events per agent before FIFO eviction. @default 1000 */\n maxEventsPerAgent?: number;\n}\n\n/** Self-healing configuration for single-agent orchestrator */\nexport interface SelfHealingConfig {\n /** Fallback runners to try in order when primary CB is open */\n fallbackRunners?: AgentRunner[];\n /** Fallback agent to try when all runners fail */\n fallbackAgent?: AgentLike;\n /** Circuit breaker config for primary runner */\n circuitBreaker?: AgentCircuitBreakerConfig;\n /** Health score below which to trigger reroute. @default 30 */\n healthThreshold?: number;\n /** Behavior when all fallbacks exhausted */\n degradation?: \"reject\" | \"fallback-response\";\n /** Static response to return when degradation is \"fallback-response\" */\n fallbackResponse?: unknown;\n /** Callback when reroute occurs */\n onReroute?: (event: RerouteEvent) => void;\n}\n\n/** Self-healing configuration for multi-agent orchestrator */\nexport interface MultiAgentSelfHealingConfig {\n /** Default circuit breaker config for agents without their own */\n circuitBreakerDefaults?: AgentCircuitBreakerConfig;\n /** Health score below which to trigger reroute. @default 30 */\n healthThreshold?: number;\n /** Explicit equivalency groups (group name → agent IDs) */\n equivalencyGroups?: Record<string, string[]>;\n /** Use capability matching for implicit equivalency. @default true */\n useCapabilities?: boolean;\n /** Strategy for selecting equivalent agent */\n selectionStrategy?: \"healthiest\" | \"round-robin\";\n /** Behavior when all equivalents are down */\n degradation?: \"reject\" | \"fallback-response\";\n /** Static response for \"fallback-response\" degradation */\n fallbackResponse?: unknown;\n /** Callback when reroute occurs */\n onReroute?: (event: RerouteEvent) => void;\n /** Callback when agent health changes */\n onHealthChange?: (event: {\n agentId: string;\n oldScore: number;\n newScore: number;\n }) => void;\n /** Health monitor configuration */\n healthMonitor?: HealthMonitorConfig;\n}\n\n/** Circuit breaker config for AI agent self-healing (simplified subset of core CircuitBreakerConfig) */\nexport interface AgentCircuitBreakerConfig {\n /** Number of failures before opening. @default 5 */\n failureThreshold?: number;\n /** Time before trying half-open (ms). @default 30000 */\n resetTimeoutMs?: number;\n /** Successes needed to close from half-open. @default 2 */\n halfOpenSuccesses?: number;\n /** State change callback */\n onStateChange?: (from: string, to: string) => void;\n}\n\n/** Internal key for health state in coordinator facts */\nexport const HEALTH_KEY = \"__agentHealth\" as const;\n\n/** Breakpoint state stored in bridge schema — canonical definition in breakpoints.ts */\nexport type BreakpointState = BreakpointStateFromBreakpoints;\n\n// ============================================================================\n// Cross-Agent Derivation Types\n// ============================================================================\n\n/** Snapshot of all agent states for cross-agent derivations */\nexport interface CrossAgentSnapshot {\n agents: Record<\n string,\n {\n status: \"idle\" | \"running\" | \"completed\" | \"error\";\n lastInput?: string;\n lastOutput?: unknown;\n lastError?: string;\n runCount: number;\n totalTokens: number;\n }\n >;\n coordinator: { globalTokens: number; status: string };\n scratchpad?: Record<string, unknown>;\n}\n\n/** Function that computes a derived value from a cross-agent snapshot */\nexport type CrossAgentDerivationFn<T = unknown> = (\n snapshot: CrossAgentSnapshot,\n) => T;\n\n// ============================================================================\n// Shared Scratchpad Types\n// ============================================================================\n\n/** Internal key for scratchpad fact on coordinator module */\nexport const SCRATCHPAD_KEY = \"__scratchpad\" as const;\n\n/** Shared scratchpad interface for multi-agent collaboration */\nexport interface Scratchpad<\n T extends Record<string, unknown> = Record<string, unknown>,\n> {\n get<K extends keyof T>(key: K): T[K];\n set<K extends keyof T>(key: K, value: T[K]): void;\n /** Check if a key exists in the scratchpad */\n has<K extends keyof T>(key: K): boolean;\n /** Delete a key from the scratchpad */\n delete<K extends keyof T>(key: K): void;\n update(values: Partial<T>): void;\n getAll(): T;\n subscribe(\n keys: (keyof T)[],\n callback: (key: keyof T, value: unknown) => void,\n ): () => void;\n onChange(callback: (key: string, value: unknown) => void): () => void;\n reset(): void;\n}\n\n// ============================================================================\n// Goal Pattern Types\n// ============================================================================\n\n/** A node in a goal execution pattern */\nexport interface GoalNode {\n /** Handler ID — agent or task registered on the orchestrator */\n handler: string;\n /** Fact keys this node can produce */\n produces: string[];\n /** Fact keys this node needs (must be satisfied before running) */\n requires?: string[];\n /** Allow re-run if input facts change after completion */\n allowRerun?: boolean;\n /** Priority for selection when multiple nodes are ready. Higher = first */\n priority?: number;\n /** Build the input string from current facts */\n buildInput?: (facts: Record<string, unknown>) => string;\n /** Extract output facts from the agent's result */\n extractOutput?: (result: RunResult<unknown>) => Record<string, unknown>;\n}\n\n/** Goal step metrics */\nexport interface GoalStepMetrics {\n step: number;\n durationMs: number;\n nodesRun: string[];\n factsProduced: string[];\n satisfaction: number;\n satisfactionDelta: number;\n tokensConsumed: number;\n}\n\n/** Goal progress metrics */\nexport interface GoalMetrics {\n satisfaction: number;\n progressRate: number;\n estimatedStepsRemaining: number | null;\n decelerating: boolean;\n}\n\n/** Agent selection strategy for goal pattern */\nexport interface AgentSelectionStrategy {\n /**\n * Select which ready agents to run this step.\n *\n * @param readyAgents - Agent IDs whose `requires` are satisfied\n * @param metrics - Per-agent performance metrics (runs, avgSatisfactionDelta, tokens)\n * @param goalMetrics - Global goal progress metrics. Built-in strategies use per-agent\n * metrics only; this parameter enables custom strategies that account for overall goal\n * progress (e.g., switching to cheaper agents as satisfaction approaches 1.0).\n */\n select: (\n readyAgents: string[],\n metrics: Record<\n string,\n { runs: number; avgSatisfactionDelta: number; tokens: number }\n >,\n goalMetrics: GoalMetrics,\n ) => string[];\n}\n\n/** Relaxation context passed to custom relaxation strategies */\nexport interface RelaxationContext {\n step: number;\n facts: Record<string, unknown>;\n metrics: GoalMetrics;\n completedNodes: Set<string>;\n failedNodes: Map<string, number>;\n}\n\n/** Relaxation strategy for when goal pursuit stalls */\nexport type RelaxationStrategy =\n | { type: \"allow_rerun\"; nodes: string[] }\n | { type: \"alternative_nodes\"; nodes: GoalNode[] }\n | { type: \"inject_facts\"; facts: Record<string, unknown> }\n | { type: \"accept_partial\" }\n | {\n type: \"custom\";\n apply: (context: RelaxationContext) => void | Promise<void>;\n };\n\n/** Relaxation tier — progressively applied when goal pursuit stalls */\nexport interface RelaxationTier {\n label: string;\n /** Steps of no progress before applying. @default 3 */\n afterStallSteps?: number;\n strategy: RelaxationStrategy;\n}\n\n/** Record of a relaxation event */\nexport interface RelaxationRecord {\n step: number;\n tierIndex: number;\n label: string;\n strategy: RelaxationStrategy[\"type\"];\n}\n\n/** Goal execution pattern — declare desired state, let the runtime resolve */\nexport interface GoalPattern<T = unknown> {\n type: \"goal\";\n /** Nodes with produces/requires declarations */\n nodes: Record<string, GoalNode>;\n /** Goal condition — when this returns true, the goal is achieved */\n when: (facts: Record<string, unknown>) => boolean;\n /** Quantitative satisfaction: 0.0 to 1.0. Enables progress tracking.\n * If omitted, binary: 0.0 when when() is false, 1.0 when true. */\n satisfaction?: (facts: Record<string, unknown>) => number;\n /** Max goal steps. @default 50 */\n maxSteps?: number;\n /** Extract final result from achieved facts */\n extract?: (facts: Record<string, unknown>) => T;\n /** Timeout in ms. @default 300000 */\n timeout?: number;\n /** Abort signal */\n signal?: AbortSignal;\n /** Agent selection strategy. @default \"all-ready\" */\n selectionStrategy?: AgentSelectionStrategy;\n /** Relaxation tiers — progressively applied when goal pursuit stalls */\n relaxation?: RelaxationTier[];\n /** Lifecycle hooks */\n onStep?: (\n step: number,\n facts: Record<string, unknown>,\n readyAgents: string[],\n ) => void;\n onStall?: (step: number, metrics: GoalMetrics) => void;\n /** Checkpoint configuration for mid-execution fault tolerance */\n checkpoint?: PatternCheckpointConfig;\n}\n\n/** Result of a goal pattern execution */\nexport interface GoalResult<T = unknown> {\n /** Whether the when() condition was satisfied */\n achieved: boolean;\n /** Final value (from extract, or raw facts) */\n result: T;\n /** Final facts state */\n facts: Record<string, unknown>;\n /** Nodes that ran, in execution order */\n executionOrder: string[];\n /** Per-node results */\n nodeResults: Record<string, RunResult<unknown>>;\n /** Total goal steps taken */\n steps: number;\n /** Total tokens consumed */\n totalTokens: number;\n /** Total duration (ms) */\n durationMs: number;\n /** Per-step metrics (satisfaction, nodes run, etc.) */\n stepMetrics: GoalStepMetrics[];\n /** Relaxation events applied */\n relaxations: RelaxationRecord[];\n /** Error message if goal was not achieved */\n error?: string;\n}\n\n// ============================================================================\n// Pattern Checkpoint Types (Universal)\n// ============================================================================\n\n/** Universal checkpoint configuration for all execution patterns */\nexport interface PatternCheckpointConfig {\n /** Save a checkpoint every N steps/rounds/iterations. @default 5 */\n everyN?: number;\n /** Checkpoint store. Uses the orchestrator's store if not provided. */\n store?: import(\"./checkpoint.js\").CheckpointStore;\n /** Label prefix for checkpoints. @default pattern type name */\n labelPrefix?: string;\n /** Conditional: only save when this returns true */\n when?: (context: CheckpointContext) => boolean;\n}\n\n/** Context passed to conditional checkpoint predicates */\nexport interface CheckpointContext {\n /** Current step/round/iteration number */\n step: number;\n /** Pattern type identifier */\n patternType: string;\n /** Pattern-specific facts (goal only) */\n facts?: Record<string, unknown>;\n /** Satisfaction score 0-1 (goal only) */\n satisfaction?: number;\n}\n\nexport type GoalCheckpointConfig = PatternCheckpointConfig;\n\n// ---- Common checkpoint state fields ----\n\n/** Common fields present on all pattern checkpoint states */\nexport interface PatternCheckpointBase {\n /** Checkpoint format version */\n version: 1;\n /** Unique ID */\n id: string;\n /** ISO timestamp */\n createdAt: string;\n /** User label */\n label?: string;\n /** Pattern ID */\n patternId: string;\n /** Total expected steps/rounds/iterations (null for unbounded) */\n stepsTotal?: number | null;\n}\n\n// ---- Per-pattern checkpoint states ----\n\n/** Checkpoint state for sequential pattern */\nexport interface SequentialCheckpointState extends PatternCheckpointBase {\n type: \"sequential\";\n /** Next agent index to run */\n step: number;\n /** Current input for the next agent */\n currentInput: string;\n /** Results collected so far (output + tokens) */\n results: Array<{ agentId: string; output: unknown; totalTokens: number }>;\n}\n\n/** Checkpoint state for supervisor pattern */\nexport interface SupervisorCheckpointState extends PatternCheckpointBase {\n type: \"supervisor\";\n /** Next round number */\n round: number;\n /** Last supervisor output */\n supervisorOutput: unknown;\n /** Worker results so far */\n workerResults: Array<{ output: unknown; totalTokens: number }>;\n /** Current input to supervisor */\n currentInput: string;\n}\n\n/** Checkpoint state for reflect pattern */\nexport interface ReflectCheckpointState extends PatternCheckpointBase {\n type: \"reflect\";\n /** Next iteration number */\n iteration: number;\n /** Current effective input */\n effectiveInput: string;\n /** Iteration history */\n history: Array<{\n iteration: number;\n passed: boolean;\n score?: number;\n feedback?: string;\n durationMs: number;\n producerTokens: number;\n evaluatorTokens: number;\n }>;\n /** Producer outputs so far */\n producerOutputs: Array<{ output: unknown; score?: number }>;\n /** Last producer output */\n lastProducerOutput: unknown | null;\n}\n\n/** Checkpoint state for debate pattern */\nexport interface DebateCheckpointState extends PatternCheckpointBase {\n type: \"debate\";\n /** Next round number */\n round: number;\n /** Current input for the round */\n currentInput: string;\n /** Completed rounds */\n rounds: Array<{\n proposals: Array<{ agentId: string; output: unknown }>;\n judgement: { winnerId: string; feedback?: string; score?: number };\n }>;\n /** Last winning agent ID */\n lastWinnerId: string;\n /** Last winning output */\n lastWinnerOutput: unknown;\n /** Tokens consumed so far */\n tokensConsumed: number;\n}\n\n/** Checkpoint state for DAG pattern */\nexport interface DagCheckpointState extends PatternCheckpointBase {\n type: \"dag\";\n /** Per-node statuses */\n statuses: Record<string, DagNodeStatus>;\n /** Per-node outputs */\n outputs: Record<string, unknown>;\n /** Per-node errors */\n errors: Record<string, string>;\n /** Number of completed nodes */\n completedCount: number;\n /** Full results (output + tokens per node) */\n nodeResults: Record<string, { output: unknown; totalTokens: number }>;\n /** Original input */\n input: string;\n}\n\n/** Serializable mid-goal state for save/resume */\nexport interface GoalCheckpointState extends PatternCheckpointBase {\n /** Pattern type discriminator */\n type: \"goal\";\n /** Current step */\n step: number;\n /** Current facts snapshot */\n facts: Record<string, unknown>;\n /** Completed node IDs */\n completedNodes: string[];\n /** Failed node IDs with consecutive failure counts */\n failedNodes: Record<string, number>;\n /** Node input hashes (for allowRerun detection) */\n nodeInputHashes: Record<string, string>;\n /** Per-node results (serialized — output only, not the full RunResult) */\n nodeOutputs: Record<string, { output: unknown; totalTokens: number }>;\n /** Execution order so far */\n executionOrder: string[];\n /** Step metrics collected so far */\n stepMetrics: GoalStepMetrics[];\n /** Relaxations applied so far */\n relaxations: RelaxationRecord[];\n /** Applied relaxation tier index */\n appliedRelaxationTiers: number;\n /** Stall step counter */\n stallSteps: number;\n /** Last satisfaction value */\n lastSatisfaction: number;\n /** Per-agent metrics */\n agentMetrics: Record<\n string,\n { runs: number; totalDelta: number; tokens: number }\n >;\n}\n\n/** Discriminated union of all pattern checkpoint states */\nexport type PatternCheckpointState =\n | SequentialCheckpointState\n | SupervisorCheckpointState\n | ReflectCheckpointState\n | DebateCheckpointState\n | DagCheckpointState\n | GoalCheckpointState;\n\n// ---- Checkpoint utilities ----\n\n/** Progress computed from a checkpoint state */\nexport interface CheckpointProgress {\n /** 0-100 percentage complete */\n percentage: number;\n /** Steps/rounds/iterations completed */\n stepsCompleted: number;\n /** Total expected steps (null for unbounded patterns) */\n stepsTotal: number | null;\n /** Tokens consumed so far */\n tokensConsumed: number;\n /** Estimated tokens remaining (null when unknowable) */\n estimatedTokensRemaining: number | null;\n /** Estimated steps remaining (null when unknowable) */\n estimatedStepsRemaining: number | null;\n}\n\n/** Diff between two checkpoint states */\nexport interface CheckpointDiff {\n /** Pattern type */\n patternType: string;\n /** Step/round/iteration difference */\n stepDelta: number;\n /** Token difference */\n tokensDelta: number;\n /** Fact changes (goal only) */\n facts?: {\n added: string[];\n removed: string[];\n changed: Array<{ key: string; before: unknown; after: unknown }>;\n };\n /** Nodes completed between checkpoints (DAG/goal) */\n nodesCompleted?: string[];\n}\n\n/** Bridge schema for orchestrator (internal plumbing — types cast to bypass t.object constraint) */\nexport const orchestratorBridgeSchema = {\n facts: {\n [AGENT_KEY]: t.object() as unknown as SchemaType<AgentState>,\n [APPROVAL_KEY]: t.object() as unknown as SchemaType<ApprovalState>,\n [CONVERSATION_KEY]: t.array() as unknown as SchemaType<Message[]>,\n [TOOL_CALLS_KEY]: t.array() as unknown as SchemaType<ToolCall[]>,\n [BREAKPOINT_KEY]: t.object() as unknown as SchemaType<BreakpointState>,\n },\n derivations: {},\n events: {},\n requirements: {},\n} satisfies ModuleSchema;\n","/**\n * Debug Timeline — AI-specific event log with snapshot correlation.\n *\n * Records agent lifecycle events (start, complete, error, guardrail checks,\n * approvals, handoffs, patterns) and correlates them with core time-travel\n * snapshots for visual timeline UIs and fork-and-replay debugging.\n *\n * Zero-cost when debug=false — the timeline is simply `null`.\n *\n * @module\n */\n\nimport type { Plugin } from \"@directive-run/core\";\nimport type { DebugEvent, DebugEventType } from \"./types.js\";\n\n/** A12: Known event types for import validation */\nconst KNOWN_EVENT_TYPES: Set<string> = new Set([\n \"agent_start\",\n \"agent_complete\",\n \"agent_error\",\n \"agent_retry\",\n \"guardrail_check\",\n \"constraint_evaluate\",\n \"resolver_start\",\n \"resolver_complete\",\n \"resolver_error\",\n \"approval_request\",\n \"approval_response\",\n \"handoff_start\",\n \"handoff_complete\",\n \"pattern_start\",\n \"pattern_complete\",\n \"dag_node_update\",\n \"breakpoint_hit\",\n \"breakpoint_resumed\",\n \"derivation_update\",\n \"scratchpad_update\",\n \"reflection_iteration\",\n \"race_start\",\n \"race_winner\",\n \"race_cancelled\",\n \"debate_round\",\n \"reroute\",\n \"checkpoint_save\",\n \"checkpoint_restore\",\n \"task_start\",\n \"task_complete\",\n \"task_error\",\n \"task_progress\",\n \"goal_step\",\n]);\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Callback fired when a new event is recorded */\nexport type DebugTimelineListener = (event: DebugEvent) => void;\n\n/** Debug timeline instance */\nexport interface DebugTimeline {\n /** Record a new event (id is auto-assigned) */\n record(event: Omit<DebugEvent, \"id\"> & Record<string, unknown>): DebugEvent;\n /** Get all events in order */\n getEvents(): DebugEvent[];\n /** Get events for a specific agent */\n getEventsForAgent(agentId: string): DebugEvent[];\n /** Get events by type with type narrowing */\n getEventsByType<T extends DebugEventType>(\n type: T,\n ): Extract<DebugEvent, { type: T }>[];\n /** Get events at a specific snapshot */\n getEventsAtSnapshot(snapshotId: number): DebugEvent[];\n /** Get events in a time range */\n getEventsInRange(startMs: number, endMs: number): DebugEvent[];\n /** Fork from a snapshot — truncates events after it and calls goTo */\n forkFrom(snapshotId: number): void;\n /** Export timeline as JSON */\n export(): string;\n /** Import timeline from JSON */\n import(json: string): void;\n /** Clear all events */\n clear(): void;\n /** Subscribe to new events. Returns unsubscribe function. */\n subscribe(listener: DebugTimelineListener): () => void;\n /** Current number of events */\n readonly length: number;\n}\n\n/** Options for creating a debug timeline */\nexport interface DebugTimelineOptions {\n /** Maximum events before eviction. @default 2000 */\n maxEvents?: number;\n /** Callback to get current snapshot ID from the system */\n getSnapshotId?: () => number | null;\n /** Callback to navigate to a snapshot (for forkFrom) */\n goToSnapshot?: (snapshotId: number) => void;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\nconst BLOCKED_IMPORT_KEYS = new Set([\n \"__proto__\",\n \"constructor\",\n \"prototype\",\n \"toString\",\n \"valueOf\",\n \"hasOwnProperty\",\n]);\n\n/**\n * Create a debug timeline for recording and correlating AI events.\n *\n * @example\n * ```typescript\n * const timeline = createDebugTimeline({ maxEvents: 1000 });\n *\n * timeline.record({\n * type: \"agent_start\",\n * timestamp: Date.now(),\n * agentId: \"researcher\",\n * snapshotId: null,\n * inputLength: 42,\n * });\n *\n * const agentEvents = timeline.getEventsForAgent(\"researcher\");\n * ```\n */\nexport function createDebugTimeline(\n options: DebugTimelineOptions = {},\n): DebugTimeline {\n const maxEvents = options.maxEvents ?? 2000;\n const goToSnapshot = options.goToSnapshot;\n\n // Validate config\n if (!Number.isFinite(maxEvents) || maxEvents < 1) {\n throw new Error(\"[Directive DebugTimeline] maxEvents must be >= 1\");\n }\n\n let events: DebugEvent[] = [];\n let nextId = 0;\n const listeners = new Set<DebugTimelineListener>();\n\n const timeline: DebugTimeline = {\n record(event: Omit<DebugEvent, \"id\">): DebugEvent {\n const fullEvent = { ...event, id: nextId++ } as DebugEvent;\n events.push(fullEvent);\n\n // Batch eviction — single splice instead of per-element shift\n const overflow = events.length - maxEvents;\n if (overflow > 0) {\n events.splice(0, overflow);\n }\n\n // Notify listeners\n for (const listener of listeners) {\n try {\n listener(fullEvent);\n } catch (err) {\n // A6: Log listener errors in dev mode instead of swallowing silently\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\"\n ) {\n console.error(\n \"[Directive DebugTimeline] Listener threw:\",\n err instanceof Error ? err.message : err,\n );\n }\n }\n }\n\n return fullEvent;\n },\n\n getEvents(): DebugEvent[] {\n return [...events];\n },\n\n getEventsForAgent(agentId: string): DebugEvent[] {\n return events.filter((e) => e.agentId === agentId);\n },\n\n getEventsByType<T extends DebugEventType>(\n type: T,\n ): Extract<DebugEvent, { type: T }>[] {\n return events.filter((e) => e.type === type) as Extract<\n DebugEvent,\n { type: T }\n >[];\n },\n\n getEventsAtSnapshot(snapshotId: number): DebugEvent[] {\n return events.filter((e) => e.snapshotId === snapshotId);\n },\n\n getEventsInRange(startMs: number, endMs: number): DebugEvent[] {\n return events.filter(\n (e) => e.timestamp >= startMs && e.timestamp <= endMs,\n );\n },\n\n forkFrom(snapshotId: number): void {\n // A8: Single reverse scan instead of two .filter() passes\n let cutoffId = -1;\n for (let i = events.length - 1; i >= 0; i--) {\n if (\n events[i]!.snapshotId !== null &&\n events[i]!.snapshotId! <= snapshotId\n ) {\n cutoffId = events[i]!.id;\n break;\n }\n }\n\n if (cutoffId >= 0) {\n // Find the index to slice at (events are monotonic by id)\n let sliceEnd = events.length;\n for (let i = events.length - 1; i >= 0; i--) {\n if (events[i]!.id <= cutoffId) {\n sliceEnd = i + 1;\n break;\n }\n }\n events = events.slice(0, sliceEnd);\n } else {\n // No matching events — clear all\n events = [];\n }\n\n // Navigate the system to the snapshot\n if (goToSnapshot) {\n goToSnapshot(snapshotId);\n }\n },\n\n export(): string {\n return JSON.stringify({ version: 1, events, nextId });\n },\n\n import(json: string): void {\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n throw new Error(\"[Directive DebugTimeline] Invalid JSON\");\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"[Directive DebugTimeline] Invalid timeline data\");\n }\n\n // Prototype pollution defense\n for (const key of Object.keys(parsed)) {\n if (BLOCKED_IMPORT_KEYS.has(key)) {\n throw new Error(\n `[Directive DebugTimeline] Blocked key in import: ${key}`,\n );\n }\n }\n\n const data = parsed as {\n version?: number;\n events?: unknown[];\n nextId?: number;\n };\n\n if (!Array.isArray(data.events)) {\n throw new Error(\"[Directive DebugTimeline] Missing events array\");\n }\n\n // Validate each event has required fields\n const validated: DebugEvent[] = [];\n for (const evt of data.events) {\n if (!evt || typeof evt !== \"object\") {\n continue;\n }\n\n // Prototype pollution defense on event objects\n for (const key of Object.keys(evt)) {\n if (BLOCKED_IMPORT_KEYS.has(key)) {\n throw new Error(\n `[Directive DebugTimeline] Blocked key in event: ${key}`,\n );\n }\n }\n\n const e = evt as Record<string, unknown>;\n // A12: Also validate that event type is a known DebugEventType\n if (\n typeof e.id === \"number\" &&\n typeof e.type === \"string\" &&\n KNOWN_EVENT_TYPES.has(e.type) &&\n typeof e.timestamp === \"number\"\n ) {\n validated.push(evt as DebugEvent);\n }\n }\n\n // Enforce maxEvents cap on imported data\n events =\n validated.length > maxEvents ? validated.slice(-maxEvents) : validated;\n nextId = typeof data.nextId === \"number\" ? data.nextId : validated.length;\n },\n\n clear(): void {\n events = [];\n nextId = 0;\n },\n\n subscribe(listener: DebugTimelineListener): () => void {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\n },\n\n get length(): number {\n return events.length;\n },\n };\n\n return timeline;\n}\n\n// ============================================================================\n// Plugin Factory\n// ============================================================================\n\n/**\n * Create a Directive plugin that bridges core constraint/resolver events\n * to the debug timeline.\n *\n * @example\n * ```typescript\n * const timeline = createDebugTimeline();\n * const plugin = createDebugTimelinePlugin(timeline, () => system.debug?.currentIndex ?? null);\n * ```\n */\nexport function createDebugTimelinePlugin(\n timeline: DebugTimeline,\n getSnapshotId: () => number | null,\n): Plugin {\n const resolverStartTimes = new Map<string, number>();\n\n return {\n name: \"directive-ai-debug-timeline\",\n\n onConstraintEvaluate(id: string, active: boolean) {\n timeline.record({\n type: \"constraint_evaluate\",\n timestamp: Date.now(),\n snapshotId: getSnapshotId(),\n constraintId: id,\n fired: active,\n });\n },\n\n onResolverStart(resolver: string, req) {\n resolverStartTimes.set(resolver, Date.now());\n timeline.record({\n type: \"resolver_start\",\n timestamp: Date.now(),\n snapshotId: getSnapshotId(),\n resolverId: resolver,\n requirementType: req.requirement.type,\n });\n },\n\n onResolverComplete(resolver: string) {\n const startTime = resolverStartTimes.get(resolver);\n resolverStartTimes.delete(resolver);\n timeline.record({\n type: \"resolver_complete\",\n timestamp: Date.now(),\n snapshotId: getSnapshotId(),\n resolverId: resolver,\n durationMs: startTime ? Date.now() - startTime : 0,\n });\n },\n\n onResolverError(resolver: string, _req, error) {\n const startTime = resolverStartTimes.get(resolver);\n resolverStartTimes.delete(resolver);\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n timeline.record({\n type: \"resolver_error\",\n timestamp: Date.now(),\n snapshotId: getSnapshotId(),\n resolverId: resolver,\n errorMessage,\n durationMs: startTime ? Date.now() - startTime : 0,\n });\n },\n };\n}\n","/**\n * Shared guardrail and retry utilities — used by both single-agent and multi-agent orchestrators.\n *\n * Extracted from agent-orchestrator.ts to enable reuse without circular dependencies.\n * Internal module — not a public subpath export.\n *\n * @module\n */\n\nimport type {\n AgentLike,\n AgentRetryConfig,\n AgentRunner,\n GuardrailContext,\n GuardrailFn,\n GuardrailResult,\n GuardrailRetryConfig,\n NamedGuardrail,\n RunOptions,\n RunResult,\n} from \"./types.js\";\n\n// ============================================================================\n// Guardrail Helpers\n// ============================================================================\n\n/**\n * Normalize a bare guardrail function or a {@link NamedGuardrail} into a consistent\n * {@link NamedGuardrail} shape. Bare functions are wrapped with a generated name\n * and `critical: true` by default.\n *\n * @param guardrail - A guardrail function or named guardrail object.\n * @param index - Positional index used to generate a unique name for bare functions.\n * @param type - Guardrail category label (e.g. `\"input\"`, `\"output\"`) included in the generated name.\n * @returns A {@link NamedGuardrail} with a guaranteed `name`, `fn`, and `critical` flag.\n */\nexport function normalizeGuardrail<T>(\n guardrail: GuardrailFn<T> | NamedGuardrail<T>,\n index: number,\n type: string,\n): NamedGuardrail<T> {\n if (typeof guardrail === \"function\") {\n return {\n name: `${type}-guardrail-${index}`,\n fn: guardrail,\n critical: true,\n };\n }\n\n return guardrail;\n}\n\n/**\n * Calculate the delay in milliseconds before the next guardrail retry attempt.\n * Supports exponential, linear, and fixed backoff strategies.\n *\n * @param attempt - The just-completed attempt number (1-based).\n * @param config - Retry configuration controlling backoff strategy and delay bounds.\n * @returns Delay in milliseconds, clamped to {@link GuardrailRetryConfig.maxDelayMs}.\n */\nexport function calculateRetryDelay(\n attempt: number,\n config: GuardrailRetryConfig,\n): number {\n const {\n backoff = \"exponential\",\n baseDelayMs = 100,\n maxDelayMs = 5000,\n } = config;\n let delay: number;\n switch (backoff) {\n case \"exponential\":\n delay = baseDelayMs * 2 ** (attempt - 1);\n break;\n case \"linear\":\n delay = baseDelayMs * attempt;\n break;\n default:\n delay = baseDelayMs;\n }\n\n return Math.min(delay, maxDelayMs);\n}\n\n/** Sleep that respects an abort signal — resolves early if aborted */\nfunction abortableDelay(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) {\n return Promise.reject(signal.reason ?? new Error(\"Aborted\"));\n }\n\n return new Promise<void>((resolve, reject) => {\n if (!signal) {\n setTimeout(resolve, ms);\n\n return;\n }\n\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal.reason ?? new Error(\"Aborted\"));\n };\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/**\n * Execute a guardrail function, retrying on thrown errors up to the configured\n * number of attempts. Delays between retries respect the guardrail's\n * {@link GuardrailRetryConfig} and can be cancelled via an {@link AbortSignal}.\n *\n * @remarks\n * When all retries are exhausted the function returns a structured\n * `{ passed: false }` result rather than re-throwing, so callers can classify\n * the failure as a guardrail rejection instead of an unhandled error.\n *\n * @param guardrail - The named guardrail to execute (includes retry config).\n * @param data - The guardrail input data (input text, output value, or tool call).\n * @param context - Shared guardrail context providing access to system facts.\n * @param signal - Optional abort signal to cancel pending retry delays.\n * @returns The guardrail result from a successful attempt, or a failure result after all retries.\n */\nexport async function executeGuardrailWithRetry<T>(\n guardrail: NamedGuardrail<T>,\n data: T,\n context: GuardrailContext,\n signal?: AbortSignal,\n): Promise<GuardrailResult> {\n const { retry } = guardrail;\n const maxAttempts = Math.max(retry?.attempts ?? 1, 1);\n\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await guardrail.fn(data, context);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n // Only retry if we have more attempts left\n if (attempt < maxAttempts) {\n const delay = calculateRetryDelay(attempt, retry ?? {});\n await abortableDelay(delay, signal);\n }\n }\n }\n\n // All retries exhausted — return structured failure instead of raw throw\n // so callers can classify this as a guardrail failure, not an unhandled error\n return {\n passed: false,\n reason: `Guardrail \"${guardrail.name}\" failed after ${maxAttempts} attempt(s): ${lastError!.message}`,\n };\n}\n\n// ============================================================================\n// Agent Retry Helpers\n// ============================================================================\n\n/**\n * Calculate the delay in milliseconds before the next agent-level retry attempt.\n * Supports exponential, linear, and fixed backoff strategies.\n *\n * @param attempt - The just-completed attempt number (1-based).\n * @param config - Retry configuration controlling backoff strategy and delay bounds.\n * @returns Delay in milliseconds, clamped to {@link AgentRetryConfig.maxDelayMs}.\n */\nexport function calculateAgentRetryDelay(\n attempt: number,\n config: AgentRetryConfig,\n): number {\n const {\n backoff = \"exponential\",\n baseDelayMs = 1000,\n maxDelayMs = 30000,\n } = config;\n let delay: number;\n switch (backoff) {\n case \"exponential\":\n delay = baseDelayMs * 2 ** (attempt - 1);\n break;\n case \"linear\":\n delay = baseDelayMs * attempt;\n break;\n default:\n delay = baseDelayMs;\n }\n\n return Math.min(delay, maxDelayMs);\n}\n\n/**\n * Execute an agent run via the provided {@link AgentRunner}, retrying on errors up to\n * the configured number of attempts. The optional `isRetryable` predicate and `onRetry`\n * callback in the retry config control which errors are retried and provide observability.\n *\n * @remarks\n * Unlike {@link executeGuardrailWithRetry}, this function re-throws the last error\n * when all retries are exhausted, since agent failures are not structured guardrail\n * rejections.\n *\n * @param runner - The agent runner function that performs the LLM call.\n * @param agent - The agent definition passed through to the runner.\n * @param input - The user input string for the agent run.\n * @param options - Optional run options including abort signal and message callbacks.\n * @param retryConfig - Optional retry configuration (attempts, backoff, predicates).\n * @returns The successful run result from the first passing attempt.\n * @throws The last error encountered when all retry attempts are exhausted.\n */\nexport async function executeAgentWithRetry<T>(\n runner: AgentRunner,\n agent: AgentLike,\n input: string,\n options: RunOptions | undefined,\n retryConfig: AgentRetryConfig | undefined,\n): Promise<RunResult<T>> {\n const maxAttempts = Math.max(retryConfig?.attempts ?? 1, 1);\n const isRetryable = retryConfig?.isRetryable ?? (() => true);\n const onRetry = retryConfig?.onRetry;\n\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await runner<T>(agent, input, options);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Check if error is retryable and we have more attempts\n if (attempt < maxAttempts) {\n let retryable = true;\n try {\n retryable = isRetryable(lastError);\n } catch {\n // If isRetryable itself throws, treat as non-retryable\n break;\n }\n if (!retryable) {\n break;\n }\n const delay = calculateAgentRetryDelay(attempt, retryConfig ?? {});\n try {\n onRetry?.(attempt, lastError, delay);\n } catch {\n // onRetry is best-effort — don't let callback errors disrupt retry logic\n }\n await abortableDelay(delay, options?.signal);\n } else {\n // Out of attempts\n break;\n }\n }\n }\n // All retries exhausted, throw the last error\n throw lastError!;\n}\n","/**\n * Shared bridge accessors and constraint/resolver converters.\n *\n * Used by both `agent-orchestrator.ts` (single-agent) and `multi-agent-orchestrator.ts` (multi-agent)\n * to read/write the bridge schema facts (agent state, approval, conversation,\n * tool calls) and convert user-facing OrchestratorConstraint/OrchestratorResolver\n * types into the Directive core format.\n *\n * Extracted to prevent drift between the two orchestrator implementations.\n * Internal module — not a public subpath export.\n *\n * @module\n */\n\nimport type { Requirement } from \"@directive-run/core\";\nimport {\n getBridgeFact,\n setBridgeFact,\n} from \"@directive-run/core/adapter-utils\";\n\nimport type {\n AgentHealthState,\n AgentLike,\n AgentState,\n ApprovalState,\n BreakpointState,\n Message,\n OrchestratorConstraint,\n OrchestratorResolver,\n OrchestratorResolverContext,\n OrchestratorState,\n RunOptions,\n RunResult,\n ToolCall,\n} from \"./types.js\";\n\nimport {\n AGENT_KEY,\n APPROVAL_KEY,\n BREAKPOINT_KEY,\n CONVERSATION_KEY,\n HEALTH_KEY,\n TOOL_CALLS_KEY,\n} from \"./types.js\";\n\n// ============================================================================\n// Bridge Accessors\n// ============================================================================\n\n/** @internal Read the agent state from bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getAgentState(facts: any): AgentState {\n return getBridgeFact<AgentState>(facts, AGENT_KEY);\n}\n\n/** @internal Write the agent state to bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function setAgentState(facts: any, state: AgentState): void {\n setBridgeFact(facts, AGENT_KEY, state);\n}\n\n/** @internal Read the approval state from bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getApprovalState(facts: any): ApprovalState {\n return getBridgeFact<ApprovalState>(facts, APPROVAL_KEY);\n}\n\n/** @internal Write the approval state to bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function setApprovalState(facts: any, state: ApprovalState): void {\n setBridgeFact(facts, APPROVAL_KEY, state);\n}\n\n/** @internal Read the conversation messages from bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getConversation(facts: any): Message[] {\n return getBridgeFact<Message[]>(facts, CONVERSATION_KEY);\n}\n\n/** @internal Write conversation messages to bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function setConversation(facts: any, messages: Message[]): void {\n setBridgeFact(facts, CONVERSATION_KEY, messages);\n}\n\n/** @internal Read the tool calls from bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getToolCalls(facts: any): ToolCall[] {\n return getBridgeFact<ToolCall[]>(facts, TOOL_CALLS_KEY);\n}\n\n/** @internal Write tool calls to bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function setToolCalls(facts: any, toolCalls: ToolCall[]): void {\n setBridgeFact(facts, TOOL_CALLS_KEY, toolCalls);\n}\n\n/** @internal Read the health state map from bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getHealthState(facts: any): Record<string, AgentHealthState> {\n return getBridgeFact<Record<string, AgentHealthState>>(facts, HEALTH_KEY);\n}\n\n/** @internal Write the health state map to bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function setHealthState(\n facts: any,\n state: Record<string, AgentHealthState>,\n): void {\n setBridgeFact(facts, HEALTH_KEY, state);\n}\n\n/** @internal Read the breakpoint state from bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getBreakpointState(facts: any): BreakpointState {\n return getBridgeFact<BreakpointState>(facts, BREAKPOINT_KEY);\n}\n\n/** @internal Write the breakpoint state to bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function setBreakpointState(facts: any, state: BreakpointState): void {\n setBridgeFact(facts, BREAKPOINT_KEY, state);\n}\n\n/** Get full orchestrator state from facts */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getOrchestratorState(facts: any): OrchestratorState {\n return {\n agent: getAgentState(facts),\n approval: getApprovalState(facts),\n conversation: getConversation(facts),\n toolCalls: getToolCalls(facts),\n };\n}\n\n// ============================================================================\n// Constraint/Resolver Converters\n// ============================================================================\n\n/** Convert user-facing OrchestratorConstraint objects into Directive core constraint format */\n// biome-ignore lint/suspicious/noExplicitAny: Constraint types are complex\nexport function convertOrchestratorConstraints<\n F extends Record<string, unknown>,\n>(constraints: Record<string, OrchestratorConstraint<F>>): Record<string, any> {\n // biome-ignore lint/suspicious/noExplicitAny: Result type is complex\n const result: Record<string, any> = Object.create(null);\n\n for (const [id, constraint] of Object.entries(constraints)) {\n result[id] = {\n priority: constraint.priority ?? 0,\n // biome-ignore lint/suspicious/noExplicitAny: Facts type varies\n when: (facts: any) => {\n const state = getOrchestratorState(facts);\n const combinedFacts = { ...facts, ...state } as unknown as F &\n OrchestratorState;\n\n return constraint.when(combinedFacts);\n },\n // biome-ignore lint/suspicious/noExplicitAny: Facts type varies\n require: (facts: any) => {\n const state = getOrchestratorState(facts);\n const combinedFacts = { ...facts, ...state } as unknown as F &\n OrchestratorState;\n\n return typeof constraint.require === \"function\"\n ? constraint.require(combinedFacts)\n : constraint.require;\n },\n };\n }\n\n return result;\n}\n\n/** Convert user-facing OrchestratorResolver objects into Directive core resolver format */\n// biome-ignore lint/suspicious/noExplicitAny: Resolver types are complex\nexport function convertOrchestratorResolvers<F extends Record<string, unknown>>(\n resolvers: Record<string, OrchestratorResolver<F, Requirement>>,\n runAgentWithGuardrails: <T>(\n agent: AgentLike,\n input: string,\n currentFacts: F & OrchestratorState,\n opts?: RunOptions,\n ) => Promise<RunResult<T>>,\n // biome-ignore lint/suspicious/noExplicitAny: Facts getter type varies\n getSystemFacts: () => any,\n): Record<string, any> {\n // biome-ignore lint/suspicious/noExplicitAny: Result type is complex\n const result: Record<string, any> = Object.create(null);\n\n for (const [id, resolver] of Object.entries(resolvers)) {\n result[id] = {\n requirement: resolver.requirement,\n key: resolver.key,\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async (req: Requirement, context: any) => {\n const state = getOrchestratorState(context.facts);\n const combinedFacts = { ...context.facts, ...state } as unknown as F &\n OrchestratorState;\n\n const orchestratorContext: OrchestratorResolverContext<F> = {\n facts: combinedFacts,\n runAgent: async <T>(\n agent: AgentLike,\n input: string,\n opts?: RunOptions,\n ) => {\n return runAgentWithGuardrails<T>(\n agent,\n input,\n getOrchestratorState(getSystemFacts()) as unknown as F &\n OrchestratorState,\n opts,\n );\n },\n signal: context.signal,\n };\n await resolver.resolve(req, orchestratorContext);\n },\n };\n }\n\n return result;\n}\n","/**\n * Human-in-the-Loop Breakpoints — Pause/inspect/modify/resume at arbitrary execution points.\n *\n * Separate from approvals (which are safety gates for tool calls). Breakpoints are\n * general-purpose pause points for debugging, inspection, and input modification.\n *\n * Zero overhead when breakpoints array is empty — guard at each insertion point.\n *\n * @module\n */\n\nimport {\n getBridgeFact,\n setBridgeFact,\n} from \"@directive-run/core/adapter-utils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Breakpoint types for single-agent orchestrator */\nexport type BreakpointType =\n | \"pre_input_guardrails\"\n | \"pre_agent_run\"\n | \"pre_output_guardrails\"\n | \"post_run\";\n\n/** Extended breakpoint types for multi-agent orchestrator */\nexport type MultiAgentBreakpointType =\n | BreakpointType\n | \"pre_handoff\"\n | \"pre_pattern_step\";\n\n/** Breakpoint configuration */\nexport interface BreakpointConfig<T extends string = BreakpointType> {\n type: T;\n when?: (context: BreakpointContext) => boolean;\n label?: string;\n}\n\n/** Context available when a breakpoint fires */\nexport interface BreakpointContext {\n agentId: string;\n agentName: string;\n input: string;\n state: Record<string, unknown>;\n breakpointType: string;\n patternId?: string;\n handoff?: { fromAgent: string; toAgent: string };\n}\n\n/** A pending breakpoint request */\nexport interface BreakpointRequest {\n id: string;\n type: string;\n agentId: string;\n input: string;\n label?: string;\n requestedAt: number;\n}\n\n/** Modifications that can be applied when resuming a breakpoint */\nexport interface BreakpointModifications {\n input?: string;\n skip?: boolean;\n}\n\n/** Breakpoint state stored in facts */\nexport interface BreakpointState {\n pending: BreakpointRequest[];\n resolved: string[];\n cancelled: string[];\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n// Import from types.ts — single source of truth\nimport { BREAKPOINT_KEY } from \"./types.js\";\nexport { BREAKPOINT_KEY };\n\n/** Maximum number of resolved/cancelled breakpoint IDs to retain (FIFO eviction) */\nexport const MAX_BREAKPOINT_HISTORY = 200;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nlet breakpointCounter = 0;\n\n/** Create a unique breakpoint ID */\nexport function createBreakpointId(): string {\n return `bp_${Date.now().toString(36)}_${(++breakpointCounter).toString(36)}`;\n}\n\n/**\n * Match a breakpoint configuration against the current execution point.\n * Returns the matching config or null if no match.\n */\nexport function matchBreakpoint<T extends string>(\n breakpoints: BreakpointConfig<T>[],\n type: T,\n context: BreakpointContext,\n): BreakpointConfig<T> | null {\n for (const bp of breakpoints) {\n if (bp.type !== type) {\n continue;\n }\n\n // If no condition, always match\n if (!bp.when) {\n return bp;\n }\n\n // Evaluate condition (catch errors — user-provided predicate)\n try {\n if (bp.when(context)) {\n return bp;\n }\n } catch {\n // Predicate error — skip this breakpoint\n }\n }\n\n return null;\n}\n\n/** Get breakpoint state from facts */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getBreakpointState(facts: any): BreakpointState {\n return getBridgeFact<BreakpointState>(facts, BREAKPOINT_KEY);\n}\n\n/** Set breakpoint state in facts */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function setBreakpointState(facts: any, state: BreakpointState): void {\n setBridgeFact(facts, BREAKPOINT_KEY, state);\n}\n\n/** Create initial breakpoint state */\nexport function createInitialBreakpointState(): BreakpointState {\n return {\n pending: [],\n resolved: [],\n cancelled: [],\n };\n}\n","/**\n * Persistent Checkpointing — Serialize/restore full orchestrator state.\n *\n * Enables long-running workflows, process restarts, and fork-and-replay by\n * capturing a complete snapshot of orchestrator state at rest.\n *\n * @module\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Checkpoint local state for single-agent orchestrators */\nexport interface SingleAgentCheckpointLocalState {\n type: \"single\";\n}\n\n/** Checkpoint local state for multi-agent orchestrators */\nexport interface MultiAgentCheckpointLocalState {\n type: \"multi\";\n globalTokenCount: number;\n globalStatus: \"idle\" | \"paused\";\n agentStates: Record<\n string,\n {\n status: \"idle\" | \"running\" | \"completed\" | \"error\";\n lastInput?: string;\n lastOutput?: unknown;\n lastError?: string;\n runCount: number;\n totalTokens: number;\n }\n >;\n handoffCounter: number;\n pendingHandoffs: unknown[];\n handoffResults: unknown[];\n roundRobinCounters: Record<string, number> | null;\n /** Serialized task states (task run functions are closures, not serializable) */\n taskStates?: Record<string, { lastOutput?: string; lastError?: string }>;\n}\n\n/** Union of local state types */\nexport type CheckpointLocalState =\n | SingleAgentCheckpointLocalState\n | MultiAgentCheckpointLocalState;\n\n/** Full checkpoint data */\nexport interface Checkpoint {\n version: 1;\n id: string;\n createdAt: string;\n label?: string;\n systemExport: string;\n timelineExport: string | null;\n localState: CheckpointLocalState;\n memoryExport: unknown | null;\n orchestratorType: \"single\" | \"multi\";\n /** Associated time-travel snapshot ID */\n snapshotId?: number;\n /** Arbitrary metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Checkpoint store interface */\nexport interface CheckpointStore {\n save(checkpoint: Checkpoint): Promise<string>;\n load(checkpointId: string): Promise<Checkpoint | null>;\n list(): Promise<Array<{ id: string; label?: string; createdAt: string }>>;\n delete(checkpointId: string): Promise<boolean>;\n clear(): Promise<void>;\n /** Prune old checkpoints based on retention policy. Returns number pruned. */\n prune(): Promise<number>;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst BLOCKED_KEYS = new Set([\n \"__proto__\",\n \"constructor\",\n \"prototype\",\n \"toString\",\n \"valueOf\",\n \"hasOwnProperty\",\n]);\n\n/** Create a unique checkpoint ID */\nexport function createCheckpointId(): string {\n const timestamp = Date.now().toString(36);\n const random = crypto.randomUUID().slice(0, 8);\n\n return `ckpt_${timestamp}_${random}`;\n}\n\n/** Validate that an unknown value is a valid Checkpoint */\nexport function validateCheckpoint(data: unknown): data is Checkpoint {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n // Prototype pollution defense\n for (const key of Object.keys(data)) {\n if (BLOCKED_KEYS.has(key)) {\n return false;\n }\n }\n\n const obj = data as Record<string, unknown>;\n\n if (obj.version !== 1) {\n return false;\n }\n\n if (typeof obj.id !== \"string\" || obj.id.length === 0) {\n return false;\n }\n\n if (typeof obj.createdAt !== \"string\") {\n return false;\n }\n\n if (typeof obj.systemExport !== \"string\") {\n return false;\n }\n\n if (obj.timelineExport !== null && typeof obj.timelineExport !== \"string\") {\n return false;\n }\n\n if (!obj.localState || typeof obj.localState !== \"object\") {\n return false;\n }\n\n // Validate localState prototype pollution\n for (const key of Object.keys(obj.localState)) {\n if (BLOCKED_KEYS.has(key)) {\n return false;\n }\n }\n\n const localState = obj.localState as Record<string, unknown>;\n if (localState.type !== \"single\" && localState.type !== \"multi\") {\n return false;\n }\n\n if (obj.orchestratorType !== \"single\" && obj.orchestratorType !== \"multi\") {\n return false;\n }\n\n return true;\n}\n\n// ============================================================================\n// InMemoryCheckpointStore\n// ============================================================================\n\n/** Options for InMemoryCheckpointStore */\nexport interface InMemoryCheckpointStoreOptions {\n /** Maximum checkpoints to retain before FIFO eviction. @default 100 */\n maxCheckpoints?: number;\n /** Time-based retention: prune checkpoints older than this (ms). @default Infinity */\n retentionMs?: number;\n /** When true, labeled checkpoints are exempt from auto-prune. @default false */\n preserveLabeled?: boolean;\n}\n\n/**\n * In-memory checkpoint store with FIFO eviction and time-based retention.\n *\n * @example\n * ```typescript\n * const store = new InMemoryCheckpointStore({\n * maxCheckpoints: 50,\n * retentionMs: 3600000, // 1 hour\n * preserveLabeled: true,\n * });\n *\n * const id = await store.save(checkpoint);\n * const pruned = await store.prune();\n * ```\n */\nexport class InMemoryCheckpointStore implements CheckpointStore {\n private readonly store = new Map<string, Checkpoint>();\n private readonly order: string[] = [];\n private readonly maxCheckpoints: number;\n private readonly retentionMs: number;\n private readonly preserveLabeled: boolean;\n\n constructor(options?: InMemoryCheckpointStoreOptions) {\n this.maxCheckpoints = options?.maxCheckpoints ?? 100;\n this.retentionMs = options?.retentionMs ?? Number.POSITIVE_INFINITY;\n this.preserveLabeled = options?.preserveLabeled ?? false;\n\n if (!Number.isFinite(this.maxCheckpoints) || this.maxCheckpoints < 1) {\n throw new Error(\n `[Directive Checkpoint] maxCheckpoints must be >= 1, got ${this.maxCheckpoints}`,\n );\n }\n }\n\n async save(checkpoint: Checkpoint): Promise<string> {\n if (!validateCheckpoint(checkpoint)) {\n throw new Error(\"[Directive Checkpoint] Invalid checkpoint data\");\n }\n\n // FIFO eviction (respects preserveLabeled)\n while (this.order.length >= this.maxCheckpoints) {\n const evicted = this.evictOldest();\n if (!evicted) {\n break;\n }\n }\n\n // Deduplicate: remove existing order entry if updating\n const existingIdx = this.order.indexOf(checkpoint.id);\n if (existingIdx >= 0) {\n this.order.splice(existingIdx, 1);\n }\n\n this.store.set(checkpoint.id, checkpoint);\n this.order.push(checkpoint.id);\n\n return checkpoint.id;\n }\n\n async load(checkpointId: string): Promise<Checkpoint | null> {\n return this.store.get(checkpointId) ?? null;\n }\n\n async list(): Promise<\n Array<{ id: string; label?: string; createdAt: string }>\n > {\n return this.order.map((id) => {\n const cp = this.store.get(id)!;\n\n return { id: cp.id, label: cp.label, createdAt: cp.createdAt };\n });\n }\n\n async delete(checkpointId: string): Promise<boolean> {\n if (!this.store.has(checkpointId)) {\n return false;\n }\n\n this.store.delete(checkpointId);\n const index = this.order.indexOf(checkpointId);\n if (index >= 0) {\n this.order.splice(index, 1);\n }\n\n return true;\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n this.order.length = 0;\n }\n\n async prune(): Promise<number> {\n if (!Number.isFinite(this.retentionMs)) {\n return 0;\n }\n\n const cutoff = Date.now() - this.retentionMs;\n let pruned = 0;\n\n // Iterate from oldest to newest\n const toRemove: string[] = [];\n for (const id of this.order) {\n const cp = this.store.get(id);\n if (!cp) {\n continue;\n }\n\n const createdAtMs = new Date(cp.createdAt).getTime();\n if (createdAtMs >= cutoff) {\n break; // Remaining are newer\n }\n\n // Skip labeled checkpoints if preserveLabeled\n if (this.preserveLabeled && cp.label) {\n continue;\n }\n\n toRemove.push(id);\n }\n\n for (const id of toRemove) {\n this.store.delete(id);\n const idx = this.order.indexOf(id);\n if (idx >= 0) {\n this.order.splice(idx, 1);\n }\n pruned++;\n }\n\n return pruned;\n }\n\n /** Evict the oldest non-labeled checkpoint. Returns true if one was evicted. */\n private evictOldest(): boolean {\n if (this.preserveLabeled) {\n // Find first non-labeled checkpoint\n for (let i = 0; i < this.order.length; i++) {\n const id = this.order[i]!;\n const cp = this.store.get(id);\n if (cp && !cp.label) {\n this.order.splice(i, 1);\n this.store.delete(id);\n\n return true;\n }\n }\n\n // All are labeled — evict oldest anyway to make room\n }\n\n const oldest = this.order.shift();\n if (oldest) {\n this.store.delete(oldest);\n\n return true;\n }\n\n return false;\n }\n}\n","/**\n * P6: Structured Outputs — Schema validation with auto-retry for LLM responses.\n *\n * Turns unreliable text output into typed, validated data. Appends JSON schema\n * instructions to the system prompt and retries with error feedback on parse failure.\n *\n * Works with any Zod-compatible schema (any object with a `safeParse` method).\n *\n * @module\n *\n * @example\n * ```typescript\n * import { z } from \"zod\";\n * import { withStructuredOutput, StructuredOutputError } from '@directive-run/ai';\n *\n * const SentimentSchema = z.object({\n * sentiment: z.enum([\"positive\", \"negative\", \"neutral\"]),\n * confidence: z.number().min(0).max(1),\n * });\n *\n * const runner = withStructuredOutput(baseRunner, {\n * schema: SentimentSchema,\n * maxRetries: 2,\n * });\n *\n * const result = await runner(agent, \"Analyze: I love this product!\");\n * // result.output is typed as { sentiment: string; confidence: number }\n * ```\n */\n\nimport type { AgentLike, AgentRunner, RunOptions, RunResult } from \"./types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Zod-compatible schema duck type — any object with a `safeParse` method.\n *\n * This interface allows structured outputs to work with Zod, Valibot,\n * or any validation library that implements this pattern.\n *\n * @example\n * ```typescript\n * import { z } from \"zod\";\n *\n * // Zod schemas implement SafeParseable automatically\n * const schema = z.object({ name: z.string() });\n *\n * // Custom schema\n * const custom: SafeParseable<{ name: string }> = {\n * safeParse(value) {\n * if (typeof value === \"object\" && value && \"name\" in value) {\n * return { success: true, data: value as { name: string } };\n * }\n * return { success: false, error: { message: \"Missing name field\" } };\n * },\n * };\n * ```\n */\nexport interface SafeParseable<T = unknown> {\n safeParse(value: unknown): SafeParseResult<T>;\n /** Optional: schema description injected into the system prompt. */\n description?: string;\n}\n\nexport interface SafeParseResult<T> {\n success: boolean;\n data?: T;\n error?: { message?: string; issues?: Array<{ message: string }> };\n}\n\nexport interface StructuredOutputConfig<T = unknown> {\n /** Zod-compatible schema with safeParse. */\n schema: SafeParseable<T>;\n /** Max retries on parse/validation failure. @default 2 */\n maxRetries?: number;\n /** Custom JSON extractor. Default: finds first `{...}` or `[...]` in output. */\n extractJson?: (output: string) => unknown;\n /** Schema description to inject into system prompt. Auto-derived from schema.description if available. */\n schemaDescription?: string;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Maximum output length to process (1MB). */\nconst MAX_EXTRACT_LENGTH = 1_048_576;\n\n/** Default JSON extractor — finds the first `{...}` or `[...]` in output. */\nexport function extractJsonFromOutput(output: string): unknown {\n if (output.length > MAX_EXTRACT_LENGTH) {\n throw new Error(\n `[Directive] Output too large for JSON extraction (${output.length} chars, max ${MAX_EXTRACT_LENGTH}).`,\n );\n }\n\n const trimmed = output.trim();\n\n // Try direct parse first\n try {\n return JSON.parse(trimmed);\n } catch {\n // Continue to extraction\n }\n\n // Try to find JSON object or array\n const objectStart = trimmed.indexOf(\"{\");\n const arrayStart = trimmed.indexOf(\"[\");\n\n let start: number;\n let openChar: string;\n let closeChar: string;\n\n if (objectStart === -1 && arrayStart === -1) {\n throw new Error(\"[Directive] No JSON object or array found in output\");\n }\n\n if (objectStart === -1) {\n start = arrayStart;\n openChar = \"[\";\n closeChar = \"]\";\n } else if (arrayStart === -1) {\n start = objectStart;\n openChar = \"{\";\n closeChar = \"}\";\n } else {\n start = Math.min(objectStart, arrayStart);\n openChar = start === objectStart ? \"{\" : \"[\";\n closeChar = start === objectStart ? \"}\" : \"]\";\n }\n\n // Find matching closing bracket\n let depth = 0;\n let inString = false;\n let escaped = false;\n\n for (let i = start; i < trimmed.length; i++) {\n const char = trimmed[i]!;\n\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (inString) {\n continue;\n }\n\n if (char === openChar) {\n depth++;\n } else if (char === closeChar) {\n depth--;\n if (depth === 0) {\n const jsonStr = trimmed.slice(start, i + 1);\n\n try {\n return JSON.parse(jsonStr);\n } catch {\n // LLMs emit literal newlines inside JSON string values — escape them\n const sanitized = jsonStr.replace(/\"(?:[^\"\\\\]|\\\\.)*\"/g, (match) =>\n match\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\"),\n );\n\n return JSON.parse(sanitized);\n }\n }\n }\n }\n\n throw new Error(\"[Directive] No valid JSON found in output\");\n}\n\n/** Format validation errors for feedback. */\nfunction formatValidationError(\n error: SafeParseResult<unknown>[\"error\"],\n): string {\n if (!error) {\n return \"Validation failed\";\n }\n\n if (error.issues && error.issues.length > 0) {\n return error.issues.map((issue) => issue.message).join(\"; \");\n }\n\n return error.message ?? \"Validation failed\";\n}\n\n// ============================================================================\n// Wrapper\n// ============================================================================\n\n/**\n * Wrap an AgentRunner with structured output parsing and validation.\n *\n * @example\n * ```typescript\n * import { z } from \"zod\";\n *\n * const SentimentSchema = z.object({\n * sentiment: z.enum([\"positive\", \"negative\", \"neutral\"]),\n * confidence: z.number().min(0).max(1),\n * });\n *\n * const runner = withStructuredOutput(baseRunner, {\n * schema: SentimentSchema,\n * maxRetries: 2,\n * });\n *\n * const result = await runner(agent, \"Analyze: I love this product!\");\n * // result.output is typed as { sentiment: string; confidence: number }\n * ```\n */\nexport function withStructuredOutput<T = unknown>(\n runner: AgentRunner,\n config: StructuredOutputConfig<T>,\n): AgentRunner {\n const {\n schema,\n maxRetries = 2,\n extractJson = extractJsonFromOutput,\n schemaDescription,\n } = config;\n\n // Validate config\n if (!Number.isFinite(maxRetries) || maxRetries < 0) {\n throw new Error(\n \"[Directive] withStructuredOutput: maxRetries must be a non-negative finite number.\",\n );\n }\n\n const schemaPrompt =\n schemaDescription ?? schema.description ?? \"the specified JSON schema\";\n\n // The returned runner produces `T` from the schema. We cast at the\n // boundary to satisfy the `AgentRunner` generic while keeping output type-safe.\n return async <_T = unknown>(\n agent: AgentLike,\n input: string,\n options?: RunOptions,\n ): Promise<RunResult<_T>> => {\n // Append JSON instruction to agent's system prompt\n const structuredAgent: AgentLike = {\n ...agent,\n instructions:\n (agent.instructions ?? \"\") +\n \"\\n\\nIMPORTANT: Respond with valid JSON matching \" +\n schemaPrompt +\n \". \" +\n \"Output ONLY the JSON object, no additional text or markdown formatting.\",\n };\n\n let lastResult: RunResult<unknown> | undefined;\n let lastError: string | undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n // On retries, append error feedback as additional input\n const effectiveInput =\n attempt === 0\n ? input\n : `${input}\\n\\nYour previous response was not valid JSON. Error: ${lastError}\\nPlease try again with valid JSON only.`;\n\n const result = await runner(structuredAgent, effectiveInput, options);\n lastResult = result;\n\n // Try to extract and validate JSON\n const outputStr =\n typeof result.output === \"string\"\n ? result.output\n : JSON.stringify(result.output);\n\n try {\n const extracted = extractJson(outputStr);\n const parsed = schema.safeParse(extracted);\n\n if (parsed.success) {\n return {\n ...result,\n output: parsed.data as _T,\n };\n }\n\n lastError = formatValidationError(parsed.error);\n } catch (err) {\n lastError = err instanceof Error ? err.message : String(err);\n }\n }\n\n // All retries exhausted — throw with context\n throw new StructuredOutputError(\n `[Directive] Failed to get valid structured output after ${maxRetries + 1} attempts: ${lastError}`,\n lastResult,\n );\n };\n}\n\n/** Error thrown when structured output parsing fails after all retries. */\nexport class StructuredOutputError extends Error {\n readonly lastResult: RunResult<unknown> | undefined;\n\n constructor(message: string, lastResult?: RunResult<unknown>) {\n super(message);\n this.name = \"StructuredOutputError\";\n this.lastResult = lastResult;\n }\n}\n","/**\n * Agent Orchestrator — constraint-driven agent execution with guardrails.\n *\n * Single-agent orchestrator backed by a Directive System with reactive state,\n * constraints, guardrails, streaming, approval workflow, and lifecycle hooks.\n */\n\nimport type {\n ModuleSchema,\n Plugin,\n Requirement,\n SingleModuleSystem,\n System,\n} from \"@directive-run/core\";\nimport { createModule, t } from \"@directive-run/core\";\nimport { createSystem } from \"@directive-run/core\";\nimport {\n createCallbackPlugin,\n getBridgeFact,\n requirementGuard,\n setBridgeFact,\n} from \"@directive-run/core/adapter-utils\";\nimport type { CircuitBreaker } from \"@directive-run/core/plugins\";\nimport type { AgentMemory } from \"./memory.js\";\nimport type { StreamChunk as StreamChunkBase } from \"./streaming.js\";\n\nimport type {\n AgentLike,\n AgentRetryConfig,\n AgentRunner,\n ApprovalRequest,\n GuardrailFn,\n GuardrailsConfig,\n InputGuardrailData,\n NamedGuardrail,\n OrchestratorConstraint,\n OrchestratorLifecycleHooks,\n OrchestratorResolver,\n OrchestratorState,\n OutputGuardrailData,\n RejectedRequest,\n RerouteEvent,\n RunOptions,\n RunResult,\n SelfHealingConfig,\n} from \"./types.js\";\n\nimport {\n APPROVAL_KEY,\n BREAKPOINT_KEY,\n GuardrailError,\n orchestratorBridgeSchema,\n} from \"./types.js\";\n\nimport {\n type DebugTimeline,\n createDebugTimeline,\n createDebugTimelinePlugin,\n} from \"./debug-timeline.js\";\n\nimport {\n executeAgentWithRetry,\n executeGuardrailWithRetry,\n normalizeGuardrail,\n} from \"./guardrail-utils.js\";\n\nimport {\n convertOrchestratorConstraints,\n convertOrchestratorResolvers,\n getAgentState,\n getApprovalState,\n getBreakpointState,\n getConversation,\n getOrchestratorState,\n getToolCalls,\n setAgentState,\n setApprovalState,\n setBreakpointState,\n setConversation,\n setToolCalls,\n} from \"./orchestrator-bridge.js\";\n\nimport type {\n BreakpointConfig,\n BreakpointContext,\n BreakpointModifications,\n BreakpointRequest,\n} from \"./breakpoints.js\";\nimport {\n MAX_BREAKPOINT_HISTORY,\n createBreakpointId,\n matchBreakpoint,\n} from \"./breakpoints.js\";\nimport {\n type Checkpoint,\n type CheckpointStore,\n createCheckpointId,\n validateCheckpoint,\n} from \"./checkpoint.js\";\nimport {\n type SafeParseable,\n withStructuredOutput,\n} from \"./structured-output.js\";\n\n// Bridge accessors and constraint/resolver converters imported from orchestrator-bridge.ts\n\n/** Maximum conversation messages retained (FIFO eviction) */\nconst MAX_CONVERSATION_MESSAGES = 500;\n/** Maximum tool calls retained (FIFO eviction) */\nconst MAX_TOOL_CALLS = 200;\n\n/** Built-in pause requirement type */\ninterface PauseBudgetExceededReq extends Requirement {\n type: \"__PAUSE_BUDGET_EXCEEDED\";\n}\n\n// ============================================================================\n// Exported Types\n// ============================================================================\n\n/** Orchestrator options */\nexport interface OrchestratorOptions<F extends Record<string, unknown>> {\n /** Function to run an agent */\n runner: AgentRunner;\n /**\n * Schema for custom facts tracked in the orchestrator's Directive System.\n * @example\n * ```typescript\n * import { t } from '@directive-run/core';\n * const orchestrator = createOrchestrator({\n * factsSchema: { confidence: t.number(), category: t.string() },\n * // ...\n * });\n * ```\n */\n factsSchema?: Record<string, { _type: unknown; _validators: [] }>;\n /** Initialize additional facts */\n init?: (facts: F & OrchestratorState) => void;\n /** Constraints for orchestration */\n constraints?: Record<string, OrchestratorConstraint<F>>;\n /** Resolvers for orchestration */\n resolvers?: Record<string, OrchestratorResolver<F, Requirement>>;\n /** Guardrails */\n guardrails?: GuardrailsConfig;\n /** Callback for approval requests */\n onApprovalRequest?: (request: ApprovalRequest) => void;\n /**\n * Auto-approve tool calls\n * @default true\n */\n autoApproveToolCalls?: boolean;\n /**\n * Maximum token budget across all agent runs.\n *\n * When exceeded, agents are automatically paused with status \"paused\".\n * Check `facts.agent.tokenUsage` to see current usage.\n *\n * For more sophisticated cost management (per-user budgets, tiered pricing,\n * cost alerts), see the Cost Management section in the documentation.\n *\n * @example\n * ```typescript\n * const orchestrator = createAgentOrchestrator({\n * maxTokenBudget: 10000, // Pause after 10K tokens\n * });\n *\n * // Check if paused due to budget\n * if (orchestrator.facts.agent.status === 'paused') {\n * console.log('Budget exceeded:', orchestrator.facts.agent.tokenUsage);\n * }\n * ```\n */\n maxTokenBudget?: number;\n /** Fires when token usage reaches this percentage of maxTokenBudget (0-1). @default 0.8 */\n budgetWarningThreshold?: number;\n /** Callback when budget warning threshold is reached */\n onBudgetWarning?: (event: {\n currentTokens: number;\n maxBudget: number;\n percentage: number;\n }) => void;\n /** Plugins */\n plugins?: Plugin[];\n /**\n * Enable debugging — `true` for default debug, or config object for advanced options\n * @default false\n */\n debug?: boolean | import(\"./types.js\").OrchestratorDebugConfig;\n /**\n * Approval timeout in milliseconds\n * @default 300000 (5 minutes)\n */\n approvalTimeoutMs?: number;\n /** Retry configuration for agent runs (no retries if not specified) */\n agentRetry?: AgentRetryConfig;\n /** Lifecycle hooks for observability */\n hooks?: OrchestratorLifecycleHooks;\n /**\n * Optional memory instance. When provided, context messages are auto-injected\n * into agent instructions before each run, and result messages are auto-stored.\n */\n memory?: AgentMemory;\n /**\n * Optional circuit breaker. Wraps every run() call.\n * When OPEN, throws CircuitBreakerOpenError instead of calling the agent.\n */\n circuitBreaker?: CircuitBreaker;\n /** Self-healing configuration for automatic fallback */\n selfHealing?: SelfHealingConfig;\n /**\n * Default schema for structured output. When set, agent output is parsed and\n * validated against this schema with automatic retry on failure.\n * Any Zod-compatible schema (anything with `safeParse`) works.\n */\n outputSchema?: SafeParseable<unknown>;\n /**\n * Max retries for structured output parsing.\n * @default 2\n */\n maxSchemaRetries?: number;\n /** Optional checkpoint store for save/restore workflow state. */\n checkpointStore?: CheckpointStore;\n /**\n * Breakpoint configurations for human-in-the-loop pause points.\n * Zero overhead when empty — guard checks at each insertion point.\n */\n breakpoints?: BreakpointConfig[];\n /** Callback fired when a breakpoint is hit and waiting for resolution. */\n onBreakpoint?: (request: BreakpointRequest) => void;\n /**\n * Timeout for breakpoint resolution in milliseconds.\n * @default 300000 (5 minutes)\n */\n breakpointTimeoutMs?: number;\n}\n\n/** Streaming run result from orchestrator */\nexport interface OrchestratorStreamResult<T = unknown> {\n /** Async iterator for streaming chunks */\n stream: AsyncIterable<OrchestratorStreamChunk>;\n /** Promise that resolves to the final result */\n result: Promise<RunResult<T>>;\n /** Abort the stream */\n abort: () => void;\n}\n\n/** Stream chunk types for orchestrator — extends StreamChunk with approval events */\nexport type OrchestratorStreamChunk =\n | StreamChunkBase\n | { type: \"approval_required\"; requestId: string; toolName: string }\n | { type: \"approval_resolved\"; requestId: string; approved: boolean };\n\n/** Per-call options for run() */\nexport interface RunCallOptions {\n /** Override output guardrails for this call only. Set to [] to skip. */\n outputGuardrails?: Array<\n GuardrailFn<OutputGuardrailData> | NamedGuardrail<OutputGuardrailData>\n >;\n /** Override input guardrails for this call only. Set to [] to skip. */\n inputGuardrails?: Array<\n GuardrailFn<InputGuardrailData> | NamedGuardrail<InputGuardrailData>\n >;\n /** Signal for abort */\n signal?: AbortSignal;\n /** Override structured output schema for this call. Set to `null` to opt out. */\n outputSchema?: SafeParseable<unknown> | null;\n /** Override max schema retries for this call. */\n maxSchemaRetries?: number;\n}\n\n/** Orchestrator instance */\nexport interface AgentOrchestrator<F extends Record<string, unknown>> {\n // biome-ignore lint/suspicious/noExplicitAny: System type varies\n system: System<any>;\n facts: F & OrchestratorState;\n /** Run an agent with guardrails. Pass options to override guardrails per-call. */\n run<T>(\n agent: AgentLike,\n input: string,\n options?: RunCallOptions,\n ): Promise<RunResult<T>>;\n /**\n * Run an agent with streaming support.\n * Returns an async iterator for chunks and a promise for the final result.\n *\n * @example\n * ```typescript\n * const { stream, result, abort } = orchestrator.runStream(agent, input);\n *\n * for await (const chunk of stream) {\n * if (chunk.type === 'token') process.stdout.write(chunk.data);\n * if (chunk.type === 'approval_required') showApprovalDialog(chunk);\n * if (chunk.type === 'guardrail_triggered') handleGuardrail(chunk);\n * }\n *\n * const finalResult = await result;\n * ```\n */\n runStream<T>(\n agent: AgentLike,\n input: string,\n options?: { signal?: AbortSignal },\n ): OrchestratorStreamResult<T>;\n /** Approve a pending request */\n approve(requestId: string): void;\n /** Reject a pending request */\n reject(requestId: string, reason?: string): void;\n /** Pause all agents */\n pause(): void;\n /** Resume agents */\n resume(): void;\n /** Reset conversation state */\n reset(): void;\n /** Total tokens consumed across all agent runs */\n readonly totalTokens: number;\n /** Debug timeline (null when debug is false) */\n readonly timeline: DebugTimeline | null;\n /** Wait until agent is idle. Resolves immediately if already idle. */\n waitForIdle(timeoutMs?: number): Promise<void>;\n /** Create a checkpoint of the current orchestrator state. Only valid when agent is not running. */\n checkpoint(options?: { label?: string }): Promise<Checkpoint>;\n /** Restore orchestrator state from a checkpoint. */\n restore(\n checkpoint: Checkpoint,\n options?: { restoreTimeline?: boolean },\n ): void;\n /** Resume a pending breakpoint, optionally with input modifications. */\n resumeBreakpoint(id: string, modifications?: BreakpointModifications): void;\n /** Cancel a pending breakpoint with optional reason. */\n cancelBreakpoint(id: string, reason?: string): void;\n /** Get all currently pending breakpoint requests. */\n getPendingBreakpoints(): BreakpointRequest[];\n /** Dispose of the orchestrator */\n dispose(): void;\n}\n\n// ============================================================================\n// Main Factory\n// ============================================================================\n\n/**\n * Create a constraint-driven agent orchestrator backed by a Directive System.\n *\n * Wraps a single agent runner with reactive state, guardrails, streaming,\n * approval workflows, breakpoints, structured output, and lifecycle hooks.\n * Constraints and resolvers let you declaratively control agent behavior\n * based on runtime facts.\n *\n * @param options - Orchestrator configuration including runner, guardrails, constraints, and plugins.\n * @returns An {@link AgentOrchestrator} instance with `run`, `runStream`, `approve`/`reject`, and checkpoint APIs.\n *\n * @example\n * ```typescript\n * import { run as runner } from '@openai/agents';\n *\n * const orchestrator = createAgentOrchestrator({\n * runner,\n * constraints: {\n * escalateToExpert: {\n * when: (facts) => facts.agent.output?.confidence < 0.7,\n * require: (facts) => ({\n * type: 'RUN_EXPERT_AGENT',\n * query: facts.agent.input,\n * }),\n * },\n * budgetExceeded: {\n * when: (facts) => facts.agent.tokenUsage > 10000,\n * require: { type: 'PAUSE_AGENTS' },\n * },\n * },\n * guardrails: {\n * input: [\n * async (data) => {\n * const hasPII = await detectPII(data.input);\n * return { passed: !hasPII, reason: hasPII ? 'Contains PII' : undefined };\n * },\n * ],\n * output: [\n * async (data) => {\n * const isToxic = await checkToxicity(data.output);\n * return { passed: !isToxic, reason: isToxic ? 'Toxic content' : undefined };\n * },\n * ],\n * },\n * });\n *\n * // Run with guardrails and constraint-driven orchestration\n * const result = await orchestrator.run(myAgent, 'Hello, can you help me?');\n * ```\n *\n * @throws If autoApproveToolCalls is false but no onApprovalRequest callback is provided\n * @public\n */\nexport function createAgentOrchestrator<\n F extends Record<string, unknown> = Record<string, never>,\n>(options: OrchestratorOptions<F>): AgentOrchestrator<F> {\n const {\n runner,\n factsSchema = {},\n init,\n constraints = {},\n resolvers = {},\n guardrails = {},\n onApprovalRequest,\n autoApproveToolCalls = true,\n maxTokenBudget,\n budgetWarningThreshold = 0.8,\n onBudgetWarning,\n plugins = [],\n debug: rawDebug = false,\n approvalTimeoutMs = 300000,\n agentRetry,\n hooks = {},\n memory,\n circuitBreaker,\n selfHealing,\n outputSchema,\n maxSchemaRetries,\n checkpointStore,\n breakpoints,\n onBreakpoint,\n breakpointTimeoutMs,\n } = options;\n\n // Normalize debug config\n const debug = typeof rawDebug === \"object\" ? true : !!rawDebug;\n const MAX_VERBOSE_LENGTH = 5000;\n\n // Warn if selfHealing is configured without circuitBreaker (selfHealing only triggers in CB error path)\n if (debug && selfHealing && !circuitBreaker) {\n console.warn(\n \"[Directive] selfHealing config has no effect without a circuitBreaker — \" +\n \"fallback behavior requires the circuit breaker to detect failures.\",\n );\n }\n\n // Validate budget warning threshold\n if (budgetWarningThreshold < 0 || budgetWarningThreshold > 1) {\n throw new Error(\n `[Directive Orchestrator] budgetWarningThreshold must be between 0 and 1, got ${budgetWarningThreshold}`,\n );\n }\n\n // Enforce approval workflow configuration - require either auto-approve or callback\n if (!autoApproveToolCalls && !onApprovalRequest) {\n throw new Error(\n \"[Directive] Invalid approval configuration: autoApproveToolCalls is false but no onApprovalRequest callback provided. \" +\n \"Tool calls would wait for approval indefinitely. Either:\\n\" +\n \" - Set autoApproveToolCalls: true to auto-approve all tool calls\\n\" +\n \" - Provide an onApprovalRequest callback to handle approvals programmatically\",\n );\n }\n\n /** Safe hook caller — user-provided hooks must never crash the orchestrator */\n function fireHook<K extends keyof OrchestratorLifecycleHooks>(\n name: K,\n event: Parameters<NonNullable<OrchestratorLifecycleHooks[K]>>[0],\n ): void {\n try {\n (hooks[name] as ((e: typeof event) => void) | undefined)?.(event);\n } catch (hookError) {\n if (debug) {\n console.debug(`[Directive] hooks.${name} threw:`, hookError);\n }\n }\n }\n\n // Dev-mode: validate that user-provided facts keys don't collide with bridge state keys\n const RESERVED_ORCHESTRATOR_KEYS = [\n \"agent\",\n \"approval\",\n \"conversation\",\n \"toolCalls\",\n ];\n for (const key of Object.keys(factsSchema)) {\n if (RESERVED_ORCHESTRATOR_KEYS.includes(key)) {\n throw new Error(\n `[Directive] Facts schema key \"${key}\" conflicts with orchestrator state. ` +\n `Reserved keys: ${RESERVED_ORCHESTRATOR_KEYS.join(\", \")}. ` +\n \"Rename your fact to avoid the collision.\",\n );\n }\n }\n\n // Build schema by combining bridge schema with user-provided schema\n const combinedSchema = {\n facts: {\n ...orchestratorBridgeSchema.facts,\n ...factsSchema,\n __budgetWarningFired: t.boolean(),\n },\n derivations: {},\n events: {},\n requirements: {},\n } satisfies ModuleSchema;\n\n // Forward declaration for runAgentWithGuardrails (used in resolver converter)\n // biome-ignore lint/style/useConst: forward declaration, assigned later\n let runAgentWithGuardrailsFn: <T>(\n agent: AgentLike,\n input: string,\n currentFacts: F & OrchestratorState,\n opts?: RunOptions,\n callOptions?: RunCallOptions,\n ) => Promise<RunResult<T>>;\n\n // Forward declaration for system (used in resolver converter)\n // biome-ignore lint/style/useConst: forward declaration, assigned later\n // biome-ignore lint/suspicious/noExplicitAny: System type varies\n let system: SingleModuleSystem<any>;\n\n // Convert user constraints\n // biome-ignore lint/suspicious/noExplicitAny: Constraint types are complex\n const directiveConstraints: Record<string, any> =\n convertOrchestratorConstraints<F>(constraints);\n\n // Add built-in budget limit constraint\n if (maxTokenBudget) {\n directiveConstraints.__budgetLimit = {\n priority: 100, // High priority\n // biome-ignore lint/suspicious/noExplicitAny: Facts type varies\n when: (facts: any) => getAgentState(facts).tokenUsage > maxTokenBudget,\n require: { type: \"__PAUSE_BUDGET_EXCEEDED\" } as PauseBudgetExceededReq,\n };\n }\n\n // Convert user resolvers\n // biome-ignore lint/suspicious/noExplicitAny: Resolver types are complex\n const directiveResolvers: Record<string, any> =\n convertOrchestratorResolvers<F>(\n resolvers,\n (agent, input, currentFacts, opts) =>\n runAgentWithGuardrailsFn(agent, input, currentFacts, opts),\n () => system.facts,\n );\n\n // Add built-in pause resolver\n directiveResolvers.__pause = {\n requirement: requirementGuard<PauseBudgetExceededReq>(\n \"__PAUSE_BUDGET_EXCEEDED\",\n ),\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async (_req: Requirement, context: any) => {\n const currentAgent = getAgentState(context.facts);\n setAgentState(context.facts, {\n ...currentAgent,\n status: \"paused\",\n });\n },\n };\n\n // ---- Debug Timeline setup ----\n let timeline: DebugTimeline | null = null;\n if (debug) {\n timeline = createDebugTimeline({\n getSnapshotId: () => {\n try {\n return (system as any).debug?.currentIndex ?? null;\n } catch {\n return null;\n }\n },\n goToSnapshot: (snapshotId: number) => {\n try {\n (system as any).debug?.goTo?.(snapshotId);\n } catch {\n // System may not support goTo\n }\n },\n });\n }\n\n // Create callback plugin for onApprovalRequest\n const callbackPlugin = createCallbackPlugin(\n \"directive-ai-callbacks\",\n {}, // No requirement callbacks needed, approval is handled separately\n );\n\n // Create module\n // biome-ignore lint/suspicious/noExplicitAny: Bridge module uses dynamic constraints/resolvers\n const orchestratorModule = createModule(\"directive-ai-orchestrator\", {\n schema: combinedSchema,\n init: (facts) => {\n setAgentState(facts, {\n status: \"idle\",\n currentAgent: null,\n input: null,\n output: null,\n error: null,\n tokenUsage: 0,\n turnCount: 0,\n startedAt: null,\n completedAt: null,\n });\n setApprovalState(facts, {\n pending: [],\n approved: [],\n rejected: [],\n });\n setConversation(facts, []);\n setToolCalls(facts, []);\n setBreakpointState(facts, { pending: [], resolved: [], cancelled: [] });\n setBridgeFact(facts, \"__budgetWarningFired\", false);\n if (init) {\n const state = getOrchestratorState(facts);\n const combinedFacts = { ...facts, ...state } as unknown as F &\n OrchestratorState;\n init(combinedFacts);\n }\n },\n constraints: directiveConstraints,\n resolvers: directiveResolvers as any,\n });\n\n // Build plugins array with optional timeline plugin\n const allPlugins = [...plugins, callbackPlugin];\n if (debug && timeline) {\n allPlugins.push(\n createDebugTimelinePlugin(timeline, () => {\n try {\n return (system as any).debug?.currentIndex ?? null;\n } catch {\n return null;\n }\n }),\n );\n }\n\n // Create system\n system = createSystem({\n module: orchestratorModule,\n plugins: allPlugins,\n debug: debug ? { timeTravel: true } : undefined,\n });\n\n system.start();\n\n // Helper to run agent with guardrails\n async function runAgentWithGuardrails<T>(\n agent: AgentLike,\n input: string,\n _currentFacts: F & OrchestratorState,\n opts?: RunOptions,\n callOptions?: RunCallOptions,\n ): Promise<RunResult<T>> {\n // Wrap in circuit breaker if configured\n if (circuitBreaker) {\n try {\n return await circuitBreaker.execute(() =>\n runAgentWithGuardrailsInner<T>(\n agent,\n input,\n _currentFacts,\n opts,\n callOptions,\n ),\n );\n } catch (error) {\n // Self-healing fallback\n if (selfHealing) {\n // Try fallback runners in order\n if (selfHealing.fallbackRunners) {\n for (const fallbackRunner of selfHealing.fallbackRunners) {\n try {\n const rerouteEvent: RerouteEvent = {\n originalAgent: agent.name,\n reroutedTo: \"fallback-runner\",\n reason:\n error instanceof Error ? error.message : String(error),\n timestamp: Date.now(),\n };\n try {\n selfHealing.onReroute?.(rerouteEvent);\n } catch {\n /* non-fatal */\n }\n if (timeline) {\n timeline.record({\n type: \"reroute\",\n timestamp: Date.now(),\n agentId: agent.name,\n snapshotId: null,\n from: agent.name,\n to: \"fallback-runner\",\n reason:\n error instanceof Error ? error.message : String(error),\n });\n }\n\n return await fallbackRunner<T>(agent, input, opts);\n } catch {\n // Try next fallback\n }\n }\n }\n\n // Try fallback agent\n if (selfHealing.fallbackAgent) {\n try {\n const rerouteEvent: RerouteEvent = {\n originalAgent: agent.name,\n reroutedTo: selfHealing.fallbackAgent.name,\n reason: error instanceof Error ? error.message : String(error),\n timestamp: Date.now(),\n };\n try {\n selfHealing.onReroute?.(rerouteEvent);\n } catch {\n /* non-fatal */\n }\n if (timeline) {\n timeline.record({\n type: \"reroute\",\n timestamp: Date.now(),\n agentId: agent.name,\n snapshotId: null,\n from: agent.name,\n to: selfHealing.fallbackAgent.name,\n reason:\n error instanceof Error ? error.message : String(error),\n });\n }\n\n return await runner<T>(selfHealing.fallbackAgent, input, opts);\n } catch {\n // Fallback agent also failed\n }\n }\n\n // Apply degradation policy\n if (\n selfHealing.degradation === \"fallback-response\" &&\n selfHealing.fallbackResponse !== undefined\n ) {\n return {\n output: selfHealing.fallbackResponse as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n }\n throw error;\n }\n }\n\n return runAgentWithGuardrailsInner<T>(\n agent,\n input,\n _currentFacts,\n opts,\n callOptions,\n );\n }\n\n async function runAgentWithGuardrailsInner<T>(\n agent: AgentLike,\n input: string,\n _currentFacts: F & OrchestratorState,\n opts?: RunOptions,\n callOptions?: RunCallOptions,\n ): Promise<RunResult<T>> {\n const startTime = Date.now();\n\n // Inject memory context into agent instructions if memory is configured\n if (memory) {\n const contextMessages = memory.getContextMessages();\n if (contextMessages.length > 0) {\n const contextStr = contextMessages\n .map((m) => `${m.role}: ${m.content}`)\n .join(\"\\n\");\n agent = {\n ...agent,\n instructions:\n (agent.instructions ?? \"\") +\n \"\\n\\nConversation context:\\n\" +\n contextStr,\n };\n }\n }\n\n // Breakpoint: pre_input_guardrails\n if (breakpoints && breakpoints.length > 0) {\n const bpContext: BreakpointContext = {\n agentId: agent.name,\n agentName: agent.name,\n input,\n state: system.facts.$store.toObject(),\n breakpointType: \"pre_input_guardrails\",\n };\n const mods = await handleBreakpoint(\n \"pre_input_guardrails\",\n bpContext,\n callOptions?.signal ?? opts?.signal,\n );\n if (mods?.skip) {\n return {\n output: undefined as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n if (mods?.input) {\n input = mods.input;\n }\n }\n\n // Resolve which guardrails to use: per-call override > orchestrator defaults\n const effectiveInputGuardrails =\n callOptions?.inputGuardrails !== undefined\n ? callOptions.inputGuardrails\n : (guardrails.input ?? []);\n const effectiveOutputGuardrails =\n callOptions?.outputGuardrails !== undefined\n ? callOptions.outputGuardrails\n : (guardrails.output ?? []);\n\n // Run input guardrails BEFORE agent_start so timeline shows correct order\n const inputGuardrailsList = effectiveInputGuardrails.map((g, i) =>\n normalizeGuardrail(g, i, \"input\"),\n );\n for (const guardrail of inputGuardrailsList) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input,\n facts: system.facts.$store.toObject(),\n };\n const guardStartTime = Date.now();\n const result = await executeGuardrailWithRetry(\n guardrail,\n { input, agentName: agent.name },\n context,\n );\n // Call onGuardrailCheck hook\n fireHook(\"onGuardrailCheck\", {\n agentId: agent.name,\n guardrailName: name,\n guardrailType: \"input\",\n passed: result.passed,\n reason: result.reason,\n durationMs: Date.now() - guardStartTime,\n timestamp: Date.now(),\n });\n if (!result.passed) {\n throw new GuardrailError({\n code: \"INPUT_GUARDRAIL_FAILED\",\n message: `Input guardrail \"${name}\" failed: ${result.reason}`,\n guardrailName: name,\n guardrailType: \"input\",\n userMessage: result.reason ?? \"Input validation failed\",\n agentName: agent.name,\n input,\n });\n }\n if (result.transformed !== undefined) {\n input = result.transformed as string;\n }\n }\n\n // Call onAgentStart hook (after guardrails pass)\n fireHook(\"onAgentStart\", {\n agentName: agent.name,\n input,\n timestamp: startTime,\n });\n\n if (timeline) {\n timeline.record({\n type: \"agent_start\",\n timestamp: Date.now(),\n agentId: agent.name,\n snapshotId: null,\n inputLength: input.length,\n modelId: agent.model ?? undefined,\n ...(agent.instructions\n ? { instructions: agent.instructions.slice(0, MAX_VERBOSE_LENGTH) }\n : {}),\n input: input.slice(0, MAX_VERBOSE_LENGTH),\n });\n }\n\n // Update state\n system.batch(() => {\n const currentAgent = getAgentState(system.facts);\n setAgentState(system.facts, {\n ...currentAgent,\n status: \"running\",\n currentAgent: agent.name,\n input,\n startedAt: Date.now(),\n });\n });\n\n // Breakpoint: pre_agent_run\n if (breakpoints && breakpoints.length > 0) {\n const bpContext: BreakpointContext = {\n agentId: agent.name,\n agentName: agent.name,\n input,\n state: system.facts.$store.toObject(),\n breakpointType: \"pre_agent_run\",\n };\n const mods = await handleBreakpoint(\n \"pre_agent_run\",\n bpContext,\n callOptions?.signal ?? opts?.signal,\n );\n if (mods?.skip) {\n return {\n output: undefined as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n if (mods?.input) {\n input = mods.input;\n }\n }\n\n // Structured output wrapping\n const effectiveSchema =\n callOptions?.outputSchema !== undefined\n ? callOptions.outputSchema\n : outputSchema;\n\n let effectiveRunner = runner;\n if (effectiveSchema) {\n effectiveRunner = withStructuredOutput(runner, {\n schema: effectiveSchema,\n maxRetries: callOptions?.maxSchemaRetries ?? maxSchemaRetries ?? 2,\n });\n }\n\n // Run the agent with retry support\n const result = await executeAgentWithRetry<T>(\n effectiveRunner,\n agent,\n input,\n {\n ...opts,\n signal: opts?.signal,\n onMessage: (message) => {\n const currentConversation = getConversation(system.facts);\n const updated = [...currentConversation, message];\n setConversation(\n system.facts,\n updated.length > MAX_CONVERSATION_MESSAGES\n ? updated.slice(-MAX_CONVERSATION_MESSAGES)\n : updated,\n );\n opts?.onMessage?.(message);\n },\n onToolCall: async (toolCall) => {\n // Run tool call guardrails with retry support\n const toolCallGuardrails = (guardrails.toolCall ?? []).map((g, i) =>\n normalizeGuardrail(g, i, \"toolCall\"),\n );\n for (const guardrail of toolCallGuardrails) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input,\n facts: system.facts.$store.toObject(),\n };\n const guardStartTime = Date.now();\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n { toolCall, agentName: agent.name, input },\n context,\n );\n fireHook(\"onGuardrailCheck\", {\n agentId: agent.name,\n guardrailName: name,\n guardrailType: \"toolCall\",\n passed: guardResult.passed,\n reason: guardResult.reason,\n durationMs: Date.now() - guardStartTime,\n timestamp: Date.now(),\n });\n if (!guardResult.passed) {\n throw new GuardrailError({\n code: \"TOOL_CALL_GUARDRAIL_FAILED\",\n message: `Tool call guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"toolCall\",\n userMessage: guardResult.reason ?? \"Tool call blocked\",\n data: { toolCall },\n agentName: agent.name,\n input,\n });\n }\n }\n\n // Check if approval is needed\n if (!autoApproveToolCalls) {\n const approvalId = `tool-${toolCall.id}`;\n const approvalRequest: ApprovalRequest = {\n id: approvalId,\n type: \"tool_call\",\n agentName: agent.name,\n description: `Tool call: ${toolCall.name}`,\n data: toolCall,\n requestedAt: Date.now(),\n };\n\n system.batch(() => {\n const currentApproval = getApprovalState(system.facts);\n setApprovalState(system.facts, {\n ...currentApproval,\n pending: [...currentApproval.pending, approvalRequest],\n });\n });\n\n onApprovalRequest?.(approvalRequest);\n\n // Wait for approval (pass signal so abort cancels the wait)\n await waitForApproval(\n approvalId,\n callOptions?.signal ?? opts?.signal,\n );\n }\n\n const currentToolCalls = getToolCalls(system.facts);\n const updatedToolCalls = [...currentToolCalls, toolCall];\n setToolCalls(\n system.facts,\n updatedToolCalls.length > MAX_TOOL_CALLS\n ? updatedToolCalls.slice(-MAX_TOOL_CALLS)\n : updatedToolCalls,\n );\n opts?.onToolCall?.(toolCall);\n },\n },\n agentRetry\n ? {\n ...agentRetry,\n onRetry: (attempt, error, delayMs) => {\n agentRetry.onRetry?.(attempt, error, delayMs);\n fireHook(\"onAgentRetry\", {\n agentName: agent.name,\n input,\n attempt,\n error,\n delayMs,\n timestamp: Date.now(),\n });\n },\n }\n : undefined,\n );\n\n // Breakpoint: pre_output_guardrails\n if (breakpoints && breakpoints.length > 0) {\n const bpContext: BreakpointContext = {\n agentId: agent.name,\n agentName: agent.name,\n input,\n state: system.facts.$store.toObject(),\n breakpointType: \"pre_output_guardrails\",\n };\n const mods = await handleBreakpoint(\n \"pre_output_guardrails\",\n bpContext,\n callOptions?.signal ?? opts?.signal,\n );\n if (mods?.skip) {\n return {\n output: undefined as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n if (mods?.input) {\n input = mods.input;\n }\n }\n\n // Run output guardrails with retry support\n const outputGuardrailsList = effectiveOutputGuardrails.map((g, i) =>\n normalizeGuardrail(g, i, \"output\"),\n );\n for (const guardrail of outputGuardrailsList) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input,\n facts: system.facts.$store.toObject(),\n };\n const guardStartTime = Date.now();\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n {\n output: result.output,\n agentName: agent.name,\n input,\n messages: result.messages,\n },\n context,\n );\n fireHook(\"onGuardrailCheck\", {\n agentId: agent.name,\n guardrailName: name,\n guardrailType: \"output\",\n passed: guardResult.passed,\n reason: guardResult.reason,\n durationMs: Date.now() - guardStartTime,\n timestamp: Date.now(),\n });\n if (!guardResult.passed) {\n throw new GuardrailError({\n code: \"OUTPUT_GUARDRAIL_FAILED\",\n message: `Output guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"output\",\n userMessage: guardResult.reason ?? \"Output validation failed\",\n agentName: agent.name,\n input,\n });\n }\n if (guardResult.transformed !== undefined) {\n (result as { output: unknown }).output = guardResult.transformed;\n }\n }\n\n // Update state\n let shouldFireBudgetWarning = false;\n let budgetPercentage = 0;\n system.batch(() => {\n const currentAgent = getAgentState(system.facts);\n const newTokenUsage = currentAgent.tokenUsage + result.totalTokens;\n setAgentState(system.facts, {\n ...currentAgent,\n status: \"completed\",\n output: result.output,\n tokenUsage: newTokenUsage,\n turnCount: currentAgent.turnCount + result.messages.length,\n completedAt: Date.now(),\n });\n\n // Check budget warning threshold\n if (maxTokenBudget && onBudgetWarning) {\n budgetPercentage = newTokenUsage / maxTokenBudget;\n const warningFired = getBridgeFact<boolean>(\n system.facts,\n \"__budgetWarningFired\",\n );\n if (budgetPercentage >= budgetWarningThreshold && !warningFired) {\n setBridgeFact(system.facts, \"__budgetWarningFired\", true);\n shouldFireBudgetWarning = true;\n }\n }\n });\n\n // Fire budget warning callback outside of batch (callbacks shouldn't run inside batch)\n if (shouldFireBudgetWarning) {\n try {\n onBudgetWarning!({\n currentTokens: getAgentState(system.facts).tokenUsage,\n maxBudget: maxTokenBudget!,\n percentage: budgetPercentage,\n });\n } catch (callbackError) {\n if (debug) {\n console.debug(\n \"[Directive Orchestrator] onBudgetWarning threw:\",\n callbackError,\n );\n }\n }\n }\n\n // Store messages in memory if configured (best-effort)\n if (memory && result.messages.length > 0) {\n try {\n memory.addMessages(result.messages);\n } catch (memoryError) {\n if (debug) {\n console.debug(\"[Directive] Memory addMessages failed:\", memoryError);\n }\n }\n }\n\n // Call onAgentComplete hook\n fireHook(\"onAgentComplete\", {\n agentName: agent.name,\n input,\n output: result.output,\n tokenUsage: result.totalTokens,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n });\n\n if (timeline) {\n const outputStr =\n typeof result.output === \"string\"\n ? result.output\n : JSON.stringify(result.output);\n timeline.record({\n type: \"agent_complete\",\n timestamp: Date.now(),\n agentId: agent.name,\n snapshotId: null,\n outputLength: outputStr?.length ?? 0,\n totalTokens: result.totalTokens,\n inputTokens: result.tokenUsage?.inputTokens ?? 0,\n outputTokens: result.tokenUsage?.outputTokens ?? 0,\n durationMs: Date.now() - startTime,\n modelId: agent.model ?? undefined,\n output: outputStr.slice(0, MAX_VERBOSE_LENGTH),\n });\n }\n\n // Breakpoint: post_run\n if (breakpoints && breakpoints.length > 0) {\n const bpContext: BreakpointContext = {\n agentId: agent.name,\n agentName: agent.name,\n input,\n state: system.facts.$store.toObject(),\n breakpointType: \"post_run\",\n };\n const mods = await handleBreakpoint(\n \"post_run\",\n bpContext,\n callOptions?.signal ?? opts?.signal,\n );\n if (mods?.skip) {\n return {\n output: undefined as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n if (mods?.input) {\n input = mods.input;\n }\n }\n\n return result;\n }\n\n // Assign the function to the forward-declared variable\n runAgentWithGuardrailsFn = runAgentWithGuardrails;\n\n // ---- Breakpoint infrastructure ----\n const breakpointModifications = new Map<string, BreakpointModifications>();\n const breakpointCancelReasons = new Map<string, string>();\n\n function waitForBreakpointResolution(\n bpId: string,\n signal?: AbortSignal,\n ): Promise<BreakpointModifications | null> {\n if (signal?.aborted) {\n return Promise.reject(\n signal.reason ?? new Error(\"Aborted while waiting for breakpoint\"),\n );\n }\n\n return new Promise((resolve, reject) => {\n let settled = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const cleanupAll = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n if (signal) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n unsubscribe();\n };\n\n const onAbort = () => {\n cleanupAll();\n reject(\n signal!.reason ?? new Error(`Breakpoint wait for ${bpId} aborted`),\n );\n };\n\n if (signal) {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n const unsubscribe = system.facts.$store.subscribe(\n [BREAKPOINT_KEY],\n () => {\n if (settled) {\n return;\n }\n\n const bpState = getBreakpointState(system.facts);\n if (bpState.resolved.includes(bpId)) {\n cleanupAll();\n const mods = breakpointModifications.get(bpId) ?? null;\n breakpointModifications.delete(bpId);\n resolve(mods);\n } else if (bpState.cancelled.includes(bpId)) {\n cleanupAll();\n breakpointModifications.delete(bpId);\n const cancelReason = breakpointCancelReasons.get(bpId);\n breakpointCancelReasons.delete(bpId);\n reject(\n new Error(\n cancelReason\n ? `Breakpoint ${bpId} was cancelled: ${cancelReason}`\n : `Breakpoint ${bpId} was cancelled`,\n ),\n );\n }\n },\n );\n\n const bpTimeout = breakpointTimeoutMs ?? 300000;\n timeoutId = setTimeout(() => {\n if (settled) {\n return;\n }\n\n cleanupAll();\n breakpointModifications.delete(bpId);\n breakpointCancelReasons.delete(bpId);\n reject(\n new Error(\n `[Directive] Breakpoint timeout: ${bpId} not resolved within ${Math.round(bpTimeout / 1000)}s`,\n ),\n );\n }, bpTimeout);\n });\n }\n\n async function handleBreakpoint(\n type: string,\n context: BreakpointContext,\n signal?: AbortSignal,\n ): Promise<BreakpointModifications | null> {\n if (!breakpoints || breakpoints.length === 0) {\n return null;\n }\n\n const match = matchBreakpoint(\n breakpoints as BreakpointConfig<string>[],\n type,\n context,\n );\n if (!match) {\n return null;\n }\n\n const bpId = createBreakpointId();\n const request: BreakpointRequest = {\n id: bpId,\n type,\n agentId: context.agentId,\n input: context.input,\n label: match.label,\n requestedAt: Date.now(),\n };\n\n system.batch(() => {\n const bpState = getBreakpointState(system.facts);\n setBreakpointState(system.facts, {\n ...bpState,\n pending: [...bpState.pending, request],\n });\n });\n\n try {\n onBreakpoint?.(request);\n } catch {\n /* non-fatal */\n }\n try {\n hooks.onBreakpoint?.(request);\n } catch {\n /* non-fatal */\n }\n\n if (timeline) {\n timeline.record({\n type: \"breakpoint_hit\",\n timestamp: Date.now(),\n snapshotId: null,\n agentId: context.agentId,\n breakpointId: bpId,\n breakpointType: type,\n label: match.label,\n });\n }\n\n const mods = await waitForBreakpointResolution(bpId, signal);\n\n if (timeline) {\n timeline.record({\n type: \"breakpoint_resumed\",\n timestamp: Date.now(),\n snapshotId: null,\n agentId: context.agentId,\n breakpointId: bpId,\n modified: !!mods?.input,\n skipped: !!mods?.skip,\n });\n }\n\n return mods;\n }\n\n // Wait for approval with configurable timeout and abort signal support\n function waitForApproval(\n requestId: string,\n signal?: AbortSignal,\n ): Promise<void> {\n if (signal?.aborted) {\n return Promise.reject(\n signal.reason ?? new Error(\"Aborted while waiting for approval\"),\n );\n }\n\n return new Promise((resolve, reject) => {\n let settled = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const cleanupAll = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n if (signal) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n unsubscribe();\n };\n\n const onAbort = () => {\n cleanupAll();\n reject(\n signal!.reason ?? new Error(`Approval wait for ${requestId} aborted`),\n );\n };\n\n if (signal) {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n const unsubscribe = system.facts.$store.subscribe([APPROVAL_KEY], () => {\n if (settled) {\n return;\n }\n\n const approval = getApprovalState(system.facts);\n if (approval.approved.includes(requestId)) {\n cleanupAll();\n resolve();\n } else {\n const rejectedRequest = approval.rejected.find(\n (r) => r.id === requestId,\n );\n if (rejectedRequest) {\n cleanupAll();\n const errorMsg = rejectedRequest.reason\n ? `Request ${requestId} rejected: ${rejectedRequest.reason}`\n : `Request ${requestId} rejected`;\n reject(new Error(errorMsg));\n }\n }\n });\n\n // Set timeout to prevent indefinite hanging (uses configured approvalTimeoutMs)\n timeoutId = setTimeout(() => {\n if (settled) {\n return;\n }\n\n cleanupAll();\n const timeoutSeconds = Math.round(approvalTimeoutMs / 1000);\n reject(\n new Error(\n `[Directive] Approval timeout: Request ${requestId} not resolved within ${timeoutSeconds}s.\\n` +\n \"Solutions:\\n\" +\n \" 1. Handle via onApprovalRequest callback and call orchestrator.approve()/reject()\\n\" +\n \" 2. Set autoApproveToolCalls: true to auto-approve\\n\" +\n ` 3. Increase approvalTimeoutMs (current: ${approvalTimeoutMs}ms)\\n` +\n \"See: https://directive.run/docs/ai/running-agents\",\n ),\n );\n }, approvalTimeoutMs);\n });\n }\n\n /** Get facts as the combined type for external access */\n function getCombinedFacts(): F & OrchestratorState {\n const state = getOrchestratorState(system.facts);\n\n return { ...state } as unknown as F & OrchestratorState;\n }\n\n const orchestrator: AgentOrchestrator<F> = {\n system: system as unknown as System<any>,\n get facts() {\n return getCombinedFacts();\n },\n get totalTokens() {\n return getAgentState(system.facts).tokenUsage;\n },\n get timeline() {\n return timeline;\n },\n\n async run<T>(\n agent: AgentLike,\n input: string,\n options?: RunCallOptions,\n ): Promise<RunResult<T>> {\n return runAgentWithGuardrails<T>(\n agent,\n input,\n getCombinedFacts(),\n undefined,\n options,\n );\n },\n\n runStream<T>(\n agent: AgentLike,\n input: string,\n options: { signal?: AbortSignal } = {},\n ): OrchestratorStreamResult<T> {\n const abortController = new AbortController();\n const MAX_STREAM_BUFFER = 10_000;\n const chunks: OrchestratorStreamChunk[] = [];\n const waiters: Array<(chunk: OrchestratorStreamChunk | null) => void> =\n [];\n let closed = false;\n const startTime = Date.now();\n let tokenCount = 0;\n const MAX_ACCUMULATED_OUTPUT = 100_000;\n let accumulatedOutput = \"\";\n\n // Combine external abort signal\n let abortHandler: (() => void) | undefined;\n if (options.signal) {\n abortHandler = () => abortController.abort();\n options.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n const cleanup = () => {\n if (abortHandler && options.signal) {\n options.signal.removeEventListener(\"abort\", abortHandler);\n }\n };\n\n // Push a chunk to the stream\n const pushChunk = (chunk: OrchestratorStreamChunk) => {\n if (closed) return;\n const waiter = waiters.shift();\n if (waiter) {\n waiter(chunk);\n } else {\n chunks.push(chunk);\n // FIFO eviction when buffer exceeds max\n if (chunks.length > MAX_STREAM_BUFFER) {\n chunks.shift();\n }\n }\n };\n\n // Close the stream\n const closeStream = () => {\n closed = true;\n cleanup();\n for (const waiter of waiters) {\n waiter(null);\n }\n waiters.length = 0;\n };\n\n // Run the agent with streaming callbacks\n const resultPromise = (async (): Promise<RunResult<T>> => {\n pushChunk({\n type: \"progress\",\n phase: \"starting\",\n message: \"Running input guardrails\",\n });\n\n try {\n // Run input guardrails first with retry support\n let processedInput = input;\n const inputGuardrails = (guardrails.input ?? []).map((g, i) =>\n normalizeGuardrail(g, i, \"input\"),\n );\n for (const guardrail of inputGuardrails) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input: processedInput,\n facts: system.facts.$store.toObject(),\n };\n const result = await executeGuardrailWithRetry(\n guardrail,\n { input: processedInput, agentName: agent.name },\n context,\n );\n if (!result.passed) {\n pushChunk({\n type: \"guardrail_triggered\",\n guardrailName: name,\n reason: result.reason ?? \"Input validation failed\",\n partialOutput: accumulatedOutput,\n stopped: true,\n });\n throw new GuardrailError({\n code: \"INPUT_GUARDRAIL_FAILED\",\n message: `Input guardrail \"${name}\" failed: ${result.reason}`,\n guardrailName: name,\n guardrailType: \"input\",\n userMessage: result.reason ?? \"Input validation failed\",\n agentName: agent.name,\n input: processedInput,\n });\n }\n if (result.transformed !== undefined) {\n processedInput = result.transformed as string;\n }\n }\n\n pushChunk({\n type: \"progress\",\n phase: \"generating\",\n message: \"Starting agent\",\n });\n\n // Update state\n system.batch(() => {\n const currentAgent = getAgentState(system.facts);\n setAgentState(system.facts, {\n ...currentAgent,\n status: \"running\",\n currentAgent: agent.name,\n input: processedInput,\n startedAt: Date.now(),\n });\n });\n\n // Run agent with streaming callbacks and retry support\n const result = await executeAgentWithRetry<T>(\n runner,\n agent,\n processedInput,\n {\n signal: abortController.signal,\n onMessage: (message) => {\n const currentConversation = getConversation(system.facts);\n setConversation(system.facts, [\n ...currentConversation,\n message,\n ]);\n pushChunk({ type: \"message\", message });\n\n // Approximate token counting from content\n if (message.role === \"assistant\" && message.content) {\n const newTokens = Math.ceil(message.content.length / 4);\n tokenCount += newTokens;\n accumulatedOutput += message.content;\n if (accumulatedOutput.length > MAX_ACCUMULATED_OUTPUT) {\n accumulatedOutput = accumulatedOutput.slice(\n -MAX_ACCUMULATED_OUTPUT,\n );\n }\n pushChunk({\n type: \"token\",\n data: message.content,\n tokenCount,\n });\n }\n },\n onToolCall: async (toolCall) => {\n pushChunk({\n type: \"tool_start\",\n tool: toolCall.name,\n toolCallId: toolCall.id,\n arguments: toolCall.arguments,\n });\n\n // Run tool call guardrails with retry support\n const toolCallGuardrails = (guardrails.toolCall ?? []).map(\n (g, i) => normalizeGuardrail(g, i, \"toolCall\"),\n );\n for (const guardrail of toolCallGuardrails) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input: processedInput,\n facts: system.facts.$store.toObject(),\n };\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n { toolCall, agentName: agent.name, input: processedInput },\n context,\n );\n if (!guardResult.passed) {\n pushChunk({\n type: \"guardrail_triggered\",\n guardrailName: name,\n reason: guardResult.reason ?? \"Tool call blocked\",\n partialOutput: accumulatedOutput,\n stopped: true,\n });\n throw new GuardrailError({\n code: \"TOOL_CALL_GUARDRAIL_FAILED\",\n message: `Tool call guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"toolCall\",\n userMessage: guardResult.reason ?? \"Tool call blocked\",\n data: { toolCall },\n agentName: agent.name,\n input: processedInput,\n });\n }\n }\n\n // Check if approval is needed\n if (!autoApproveToolCalls) {\n const approvalId = `tool-${toolCall.id}`;\n pushChunk({\n type: \"approval_required\",\n requestId: approvalId,\n toolName: toolCall.name,\n });\n\n const approvalRequest: ApprovalRequest = {\n id: approvalId,\n type: \"tool_call\",\n agentName: agent.name,\n description: `Tool call: ${toolCall.name}`,\n data: toolCall,\n requestedAt: Date.now(),\n };\n\n system.batch(() => {\n const currentApproval = getApprovalState(system.facts);\n setApprovalState(system.facts, {\n ...currentApproval,\n pending: [...currentApproval.pending, approvalRequest],\n });\n });\n\n onApprovalRequest?.(approvalRequest);\n await waitForApproval(approvalId, abortController.signal);\n pushChunk({\n type: \"approval_resolved\",\n requestId: approvalId,\n approved: true,\n });\n }\n\n const currentToolCalls = getToolCalls(system.facts);\n setToolCalls(system.facts, [...currentToolCalls, toolCall]);\n\n if (toolCall.result) {\n pushChunk({\n type: \"tool_end\",\n tool: toolCall.name,\n toolCallId: toolCall.id,\n result: toolCall.result,\n });\n }\n },\n },\n agentRetry,\n );\n\n // Run output guardrails\n pushChunk({\n type: \"progress\",\n phase: \"finishing\",\n message: \"Running output guardrails\",\n });\n\n const outputGuardrails = (guardrails.output ?? []).map((g, i) =>\n normalizeGuardrail(g, i, \"output\"),\n );\n for (const guardrail of outputGuardrails) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input: processedInput,\n facts: system.facts.$store.toObject(),\n };\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n {\n output: result.output,\n agentName: agent.name,\n input: processedInput,\n messages: result.messages,\n },\n context,\n );\n if (!guardResult.passed) {\n pushChunk({\n type: \"guardrail_triggered\",\n guardrailName: name,\n reason: guardResult.reason ?? \"Output validation failed\",\n partialOutput:\n typeof result.output === \"string\" ? result.output : \"\",\n stopped: true,\n });\n throw new GuardrailError({\n code: \"OUTPUT_GUARDRAIL_FAILED\",\n message: `Output guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"output\",\n userMessage: guardResult.reason ?? \"Output validation failed\",\n agentName: agent.name,\n input: processedInput,\n });\n }\n if (guardResult.transformed !== undefined) {\n (result as { output: unknown }).output = guardResult.transformed;\n }\n }\n\n // Update final state\n system.batch(() => {\n const currentAgent = getAgentState(system.facts);\n setAgentState(system.facts, {\n ...currentAgent,\n status: \"completed\",\n output: result.output,\n tokenUsage: currentAgent.tokenUsage + result.totalTokens,\n turnCount: currentAgent.turnCount + result.messages.length,\n completedAt: Date.now(),\n });\n });\n\n const duration = Date.now() - startTime;\n pushChunk({\n type: \"done\",\n totalTokens: result.totalTokens,\n duration,\n droppedTokens: 0,\n });\n closeStream();\n\n return result;\n } catch (error) {\n pushChunk({\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n });\n closeStream();\n throw error;\n }\n })();\n\n // Prevent unhandled rejection if caller only consumes stream (not .result)\n resultPromise.catch(() => {});\n\n // Create async iterator\n const stream: AsyncIterable<OrchestratorStreamChunk> = {\n [Symbol.asyncIterator](): AsyncIterator<OrchestratorStreamChunk> {\n return {\n async next(): Promise<IteratorResult<OrchestratorStreamChunk>> {\n if (chunks.length > 0) {\n return { done: false, value: chunks.shift()! };\n }\n if (closed) {\n return { done: true, value: undefined };\n }\n\n return new Promise<IteratorResult<OrchestratorStreamChunk>>(\n (resolve) => {\n waiters.push((chunk) => {\n if (chunk === null) {\n resolve({ done: true, value: undefined });\n } else {\n resolve({ done: false, value: chunk });\n }\n });\n },\n );\n },\n };\n },\n };\n\n return {\n stream,\n result: resultPromise,\n abort: () => {\n abortController.abort();\n closeStream();\n },\n };\n },\n\n async waitForIdle(timeoutMs?: number): Promise<void> {\n const isIdle = () => getAgentState(system.facts).status !== \"running\";\n if (isIdle()) {\n return;\n }\n\n const start = Date.now();\n while (!isIdle()) {\n if (timeoutMs !== undefined && Date.now() - start > timeoutMs) {\n throw new Error(\"[Directive Orchestrator] waitForIdle timed out\");\n }\n await new Promise((r) => setTimeout(r, 50));\n }\n },\n\n approve(requestId: string): void {\n system.batch(() => {\n const approval = getApprovalState(system.facts);\n if (!approval.pending.some((r) => r.id === requestId)) {\n if (debug)\n console.debug(\n `[Directive] approve() ignored: no pending request \"${requestId}\"`,\n );\n\n return;\n }\n const MAX_APPROVAL_HISTORY = 200;\n const approved = [...approval.approved, requestId];\n setApprovalState(system.facts, {\n ...approval,\n pending: approval.pending.filter((r) => r.id !== requestId),\n approved:\n approved.length > MAX_APPROVAL_HISTORY\n ? approved.slice(-MAX_APPROVAL_HISTORY)\n : approved,\n });\n });\n },\n\n reject(requestId: string, reason?: string): void {\n system.batch(() => {\n const approval = getApprovalState(system.facts);\n if (!approval.pending.some((r) => r.id === requestId)) {\n if (debug)\n console.debug(\n `[Directive] reject() ignored: no pending request \"${requestId}\"`,\n );\n\n return;\n }\n if (reason && debug) {\n console.debug(`[Directive] Request ${requestId} rejected: ${reason}`);\n }\n const rejectedRequest: RejectedRequest = {\n id: requestId,\n reason,\n rejectedAt: Date.now(),\n };\n const MAX_REJECTION_HISTORY = 200;\n const rejected = [...approval.rejected, rejectedRequest];\n setApprovalState(system.facts, {\n ...approval,\n pending: approval.pending.filter((r) => r.id !== requestId),\n rejected:\n rejected.length > MAX_REJECTION_HISTORY\n ? rejected.slice(-MAX_REJECTION_HISTORY)\n : rejected,\n });\n });\n },\n\n pause(): void {\n const currentAgent = getAgentState(system.facts);\n setAgentState(system.facts, {\n ...currentAgent,\n status: \"paused\",\n });\n },\n\n resume(): void {\n const agent = getAgentState(system.facts);\n if (agent.status === \"paused\") {\n setAgentState(system.facts, {\n ...agent,\n status: agent.currentAgent ? \"running\" : \"idle\",\n });\n }\n },\n\n reset(): void {\n system.batch(() => {\n setAgentState(system.facts, {\n status: \"idle\",\n currentAgent: null,\n input: null,\n output: null,\n error: null,\n tokenUsage: 0,\n turnCount: 0,\n startedAt: null,\n completedAt: null,\n });\n setApprovalState(system.facts, {\n pending: [],\n approved: [],\n rejected: [],\n });\n setConversation(system.facts, []);\n setToolCalls(system.facts, []);\n setBreakpointState(system.facts, {\n pending: [],\n resolved: [],\n cancelled: [],\n });\n setBridgeFact(system.facts, \"__budgetWarningFired\", false);\n });\n breakpointModifications.clear();\n breakpointCancelReasons.clear();\n },\n\n async checkpoint(cpOptions?: { label?: string }): Promise<Checkpoint> {\n const agentState = getAgentState(system.facts);\n if (agentState.status === \"running\") {\n throw new Error(\"[Directive] Cannot checkpoint while agent is running\");\n }\n if (!system.debug?.export) {\n throw new Error(\n \"[Directive] Checkpointing requires debug mode. Set `debug: true` in orchestrator options.\",\n );\n }\n\n const cp: Checkpoint = {\n version: 1,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: cpOptions?.label,\n systemExport: system.debug.export(),\n timelineExport: timeline?.export() ?? null,\n localState: { type: \"single\" },\n memoryExport: memory ? ((memory as any).export?.() ?? null) : null,\n orchestratorType: \"single\",\n };\n\n if (checkpointStore) {\n await checkpointStore.save(cp);\n }\n\n return cp;\n },\n\n restore(cp: Checkpoint, restoreOpts?: { restoreTimeline?: boolean }): void {\n if (!validateCheckpoint(cp)) {\n throw new Error(\"[Directive] Invalid checkpoint data\");\n }\n if (cp.orchestratorType !== \"single\") {\n throw new Error(\n \"[Directive] Cannot restore multi-agent checkpoint in single-agent orchestrator\",\n );\n }\n if (!system.debug?.import) {\n throw new Error(\n \"[Directive] Restoring a checkpoint requires debug mode. Set `debug: true` in orchestrator options.\",\n );\n }\n\n system.debug.import(cp.systemExport);\n\n if (\n restoreOpts?.restoreTimeline !== false &&\n cp.timelineExport &&\n timeline\n ) {\n timeline.import(cp.timelineExport);\n }\n\n if (cp.memoryExport !== null && memory && (memory as any).import) {\n (memory as any).import(cp.memoryExport);\n }\n },\n\n resumeBreakpoint(\n id: string,\n modifications?: BreakpointModifications,\n ): void {\n if (modifications) {\n breakpointModifications.set(id, modifications);\n }\n system.batch(() => {\n const bpState = getBreakpointState(system.facts);\n const resolved = [...bpState.resolved, id];\n setBreakpointState(system.facts, {\n ...bpState,\n pending: bpState.pending.filter((r) => r.id !== id),\n resolved:\n resolved.length > MAX_BREAKPOINT_HISTORY\n ? resolved.slice(-MAX_BREAKPOINT_HISTORY)\n : resolved,\n });\n });\n },\n\n cancelBreakpoint(id: string, reason?: string): void {\n if (reason) {\n breakpointCancelReasons.set(id, reason);\n }\n system.batch(() => {\n const bpState = getBreakpointState(system.facts);\n const cancelled = [...bpState.cancelled, id];\n setBreakpointState(system.facts, {\n ...bpState,\n pending: bpState.pending.filter((r) => r.id !== id),\n cancelled:\n cancelled.length > MAX_BREAKPOINT_HISTORY\n ? cancelled.slice(-MAX_BREAKPOINT_HISTORY)\n : cancelled,\n });\n });\n },\n\n getPendingBreakpoints(): BreakpointRequest[] {\n const bpState = getBreakpointState(system.facts);\n\n return [...bpState.pending];\n },\n\n dispose(): void {\n system.destroy();\n },\n };\n\n return orchestrator;\n}\n","/**\n * Health Monitor — tracks per-agent health metrics for self-healing networks.\n *\n * Pure computation module with zero Directive dependency.\n * Maintains a rolling window of success/failure events and computes a health\n * score from 0-100 based on configurable weights.\n *\n * @module\n */\n\nimport type { HealthMonitorConfig } from \"./types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Circuit state values */\nexport type HealthCircuitState = \"CLOSED\" | \"OPEN\" | \"HALF_OPEN\";\n\n/** Per-agent health metrics */\nexport interface AgentHealthMetrics {\n agentId: string;\n circuitState: HealthCircuitState;\n successRate: number;\n avgLatencyMs: number;\n recentFailures: number;\n recentSuccesses: number;\n healthScore: number;\n /** Last N error messages (most recent last) */\n lastErrors: string[];\n}\n\n/** Internal event record */\ninterface HealthEvent {\n success: boolean;\n latencyMs: number;\n timestamp: number;\n errorMessage?: string;\n}\n\n/** Health monitor instance */\nexport interface HealthMonitor {\n recordSuccess(agentId: string, latencyMs: number): void;\n recordFailure(agentId: string, latencyMs: number, error?: Error): void;\n getMetrics(agentId: string): AgentHealthMetrics;\n getAllMetrics(): Record<string, AgentHealthMetrics>;\n /** Returns a 0-100 health score. Returns 50 (neutral) when no data is available for the agent. */\n getHealthScore(agentId: string): number;\n updateCircuitState(agentId: string, state: HealthCircuitState): void;\n /** Reset all metrics. Useful for testing. */\n reset(): void;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\nconst DEFAULT_WINDOW_MS = 60_000;\nconst DEFAULT_MAX_NORMAL_LATENCY_MS = 5_000;\nconst DEFAULT_MAX_EVENTS_PER_AGENT = 1_000;\nconst DEFAULT_MAX_STORED_ERRORS = 5;\nconst DEFAULT_WEIGHTS = {\n successRate: 0.5,\n latency: 0.3,\n circuitState: 0.2,\n};\n\n/**\n * Create a health monitor that tracks per-agent metrics.\n *\n * @example\n * ```typescript\n * const monitor = createHealthMonitor({ windowMs: 30000 });\n *\n * monitor.recordSuccess(\"agent-a\", 120);\n * monitor.recordFailure(\"agent-a\", 5000, new Error(\"timeout\"));\n *\n * const score = monitor.getHealthScore(\"agent-a\");\n * console.log(score); // 0-100\n * ```\n */\nexport function createHealthMonitor(\n config: HealthMonitorConfig = {},\n): HealthMonitor {\n const windowMs = config.windowMs ?? DEFAULT_WINDOW_MS;\n const maxNormalLatencyMs =\n config.maxNormalLatencyMs ?? DEFAULT_MAX_NORMAL_LATENCY_MS;\n const maxEventsPerAgent =\n config.maxEventsPerAgent ?? DEFAULT_MAX_EVENTS_PER_AGENT;\n const weights = {\n successRate: config.weights?.successRate ?? DEFAULT_WEIGHTS.successRate,\n latency: config.weights?.latency ?? DEFAULT_WEIGHTS.latency,\n circuitState: config.weights?.circuitState ?? DEFAULT_WEIGHTS.circuitState,\n };\n\n // Validate config\n if (!Number.isFinite(windowMs) || windowMs <= 0) {\n throw new Error(\n \"[Directive HealthMonitor] windowMs must be a positive number\",\n );\n }\n if (!Number.isFinite(maxNormalLatencyMs) || maxNormalLatencyMs <= 0) {\n throw new Error(\n \"[Directive HealthMonitor] maxNormalLatencyMs must be a positive number\",\n );\n }\n if (!Number.isFinite(maxEventsPerAgent) || maxEventsPerAgent < 1) {\n throw new Error(\"[Directive HealthMonitor] maxEventsPerAgent must be >= 1\");\n }\n\n // A14: Validate individual weight bounds\n for (const [key, value] of Object.entries(weights)) {\n if (value < 0 || value > 1) {\n throw new Error(\n `[Directive HealthMonitor] weight \"${key}\" must be between 0 and 1 (got ${value})`,\n );\n }\n }\n\n // Validate weights sum approximately to 1.0\n const weightSum =\n weights.successRate + weights.latency + weights.circuitState;\n if (Math.abs(weightSum - 1.0) > 0.01) {\n throw new Error(\n `[Directive HealthMonitor] weights must sum to ~1.0 (tolerance: ±0.01, got ${weightSum.toFixed(4)})`,\n );\n }\n\n const events = new Map<string, HealthEvent[]>();\n const circuitStates = new Map<string, HealthCircuitState>();\n\n // L4: Generation counter for getAllMetrics caching\n let generation = 0;\n let cachedAll: Record<string, AgentHealthMetrics> | null = null;\n let cachedGen = -1;\n\n function getAgentEvents(agentId: string): HealthEvent[] {\n let agentEvents = events.get(agentId);\n if (!agentEvents) {\n agentEvents = [];\n events.set(agentId, agentEvents);\n }\n\n return agentEvents;\n }\n\n function pruneAndCap(agentEvents: HealthEvent[], now: number): void {\n // Time-based pruning: find first event within the window\n const cutoff = now - windowMs;\n let firstValid = 0;\n while (\n firstValid < agentEvents.length &&\n agentEvents[firstValid]!.timestamp < cutoff\n ) {\n firstValid++;\n }\n\n // Cap-based pruning: ensure we don't exceed maxEventsPerAgent\n const excessFromCap = agentEvents.length - firstValid - maxEventsPerAgent;\n if (excessFromCap > 0) {\n firstValid += excessFromCap;\n }\n\n // Batch remove all expired/excess events in one operation\n if (firstValid > 0) {\n agentEvents.splice(0, firstValid);\n }\n }\n\n function computeScore(agentId: string): number {\n const agentEvents = events.get(agentId);\n if (!agentEvents || agentEvents.length === 0) {\n return 50; // No data = neutral\n }\n\n const now = Date.now();\n pruneAndCap(agentEvents, now);\n\n if (agentEvents.length === 0) {\n return 50;\n }\n\n const successes = agentEvents.filter((e) => e.success).length;\n const successRate = successes / agentEvents.length;\n\n const avgLatency =\n agentEvents.reduce((s, e) => s + e.latencyMs, 0) / agentEvents.length;\n const normalizedLatency = Math.min(avgLatency / maxNormalLatencyMs, 1);\n\n const state = circuitStates.get(agentId) ?? \"CLOSED\";\n const circuitScore =\n state === \"CLOSED\" ? 1 : state === \"HALF_OPEN\" ? 0.5 : 0;\n\n const raw =\n successRate * weights.successRate +\n (1 - normalizedLatency) * weights.latency +\n circuitScore * weights.circuitState;\n\n return Math.round(raw * 100);\n }\n\n function buildMetrics(agentId: string): AgentHealthMetrics {\n const agentEvents = getAgentEvents(agentId);\n const now = Date.now();\n pruneAndCap(agentEvents, now);\n\n const successes = agentEvents.filter((e) => e.success).length;\n const failures = agentEvents.length - successes;\n const successRate =\n agentEvents.length > 0 ? successes / agentEvents.length : 0;\n const avgLatencyMs =\n agentEvents.length > 0\n ? agentEvents.reduce((s, e) => s + e.latencyMs, 0) / agentEvents.length\n : 0;\n\n // Collect last N error messages\n const lastErrors: string[] = [];\n for (\n let i = agentEvents.length - 1;\n i >= 0 && lastErrors.length < DEFAULT_MAX_STORED_ERRORS;\n i--\n ) {\n if (agentEvents[i]!.errorMessage) {\n lastErrors.unshift(agentEvents[i]!.errorMessage!);\n }\n }\n\n return {\n agentId,\n circuitState: circuitStates.get(agentId) ?? \"CLOSED\",\n successRate,\n avgLatencyMs,\n recentFailures: failures,\n recentSuccesses: successes,\n healthScore: computeScore(agentId),\n lastErrors,\n };\n }\n\n return {\n recordSuccess(agentId: string, latencyMs: number): void {\n const agentEvents = getAgentEvents(agentId);\n agentEvents.push({ success: true, latencyMs, timestamp: Date.now() });\n // A9: Prune on write path to prevent unbounded growth between reads\n pruneAndCap(agentEvents, Date.now());\n generation++;\n },\n\n recordFailure(agentId: string, latencyMs: number, error?: Error): void {\n const agentEvents = getAgentEvents(agentId);\n agentEvents.push({\n success: false,\n latencyMs,\n timestamp: Date.now(),\n errorMessage: error?.message,\n });\n // A9: Prune on write path to prevent unbounded growth between reads\n pruneAndCap(agentEvents, Date.now());\n generation++;\n },\n\n getMetrics(agentId: string): AgentHealthMetrics {\n return buildMetrics(agentId);\n },\n\n getAllMetrics(): Record<string, AgentHealthMetrics> {\n // L4: Return cached result when no writes have occurred\n if (generation === cachedGen && cachedAll) {\n return cachedAll;\n }\n\n const result: Record<string, AgentHealthMetrics> = Object.create(null);\n for (const agentId of events.keys()) {\n result[agentId] = buildMetrics(agentId);\n }\n\n cachedAll = result;\n cachedGen = generation;\n\n return result;\n },\n\n getHealthScore(agentId: string): number {\n return computeScore(agentId);\n },\n\n updateCircuitState(agentId: string, state: HealthCircuitState): void {\n circuitStates.set(agentId, state);\n generation++;\n },\n\n reset(): void {\n events.clear();\n circuitStates.clear();\n generation++;\n cachedAll = null;\n cachedGen = -1;\n },\n };\n}\n","/**\n * Agent Reflection / Self-Improvement\n *\n * Quality-based iteration: agent produces output → evaluator checks it → retry\n * with feedback until pass. Works with any AgentRunner.\n *\n * Shipped with aggressive safeguards to prevent silent budget burn:\n * - maxIterations default: 2 (conservative)\n * - Dev-mode warning for maxIterations > 3\n * - onIteration fires on every iteration (observable by default)\n * - Token usage accumulated across iterations\n *\n * @example\n * ```typescript\n * import { withReflection } from '@directive-run/ai';\n *\n * const reflective = withReflection(runner, {\n * evaluate: (output) => ({\n * passed: output.includes('conclusion'),\n * feedback: 'Missing conclusion section',\n * }),\n * maxIterations: 2,\n * });\n *\n * const result = await reflective(agent, 'Write a report');\n * ```\n */\n\nimport type { AgentLike, AgentRunner, RunOptions, RunResult } from \"./types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Context passed to the reflection evaluator */\nexport interface ReflectionContext {\n input: string;\n /** 0-based iteration number */\n iteration: number;\n result: RunResult<unknown>;\n history: ReflectionEvaluation[];\n}\n\n/** Result of a reflection evaluation */\nexport interface ReflectionEvaluation {\n passed: boolean;\n feedback?: string;\n /** Quality score from 0 to 1, optional */\n score?: number;\n}\n\n/** Evaluator function for reflection */\nexport type ReflectionEvaluator<T = unknown> = (\n output: T,\n context: ReflectionContext,\n) => ReflectionEvaluation | Promise<ReflectionEvaluation>;\n\n/** Configuration for the reflection wrapper */\nexport interface ReflectionConfig<T = unknown> {\n /** Evaluator function — decides if the output is acceptable */\n evaluate: ReflectionEvaluator<T>;\n /** Maximum iterations (including the first). Default: 2 (conservative) */\n maxIterations?: number;\n /** Build the retry input from original input + feedback */\n buildRetryInput?: (\n input: string,\n feedback: string,\n iteration: number,\n ) => string;\n /** Callback on each iteration */\n onIteration?: (event: {\n iteration: number;\n passed: boolean;\n feedback?: string;\n score?: number;\n durationMs: number;\n }) => void;\n /** Behavior when maxIterations exhausted. Default: \"accept-last\" */\n onExhausted?: \"accept-last\" | \"throw\";\n /** Stop early if budget remaining < threshold (tokens). Works with withBudget. */\n budgetThreshold?: number;\n}\n\n// ============================================================================\n// Error\n// ============================================================================\n\n/** Error thrown when reflection iterations are exhausted and onExhausted is \"throw\" */\nexport class ReflectionExhaustedError extends Error {\n readonly iterations: number;\n readonly history: ReflectionEvaluation[];\n readonly lastResult: RunResult<unknown>;\n readonly totalTokens: number;\n\n constructor(options: {\n iterations: number;\n history: ReflectionEvaluation[];\n lastResult: RunResult<unknown>;\n totalTokens: number;\n }) {\n super(\n `[Directive Reflection] Exhausted ${options.iterations} iterations without passing evaluation. ` +\n `Last feedback: ${options.history[options.history.length - 1]?.feedback ?? \"(none)\"}`,\n );\n this.name = \"ReflectionExhaustedError\";\n this.iterations = options.iterations;\n this.history = options.history;\n this.lastResult = options.lastResult;\n this.totalTokens = options.totalTokens;\n }\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/** Default retry input format */\nfunction defaultBuildRetryInput(\n input: string,\n feedback: string,\n _iteration: number,\n): string {\n return `${input}\\n\\nFeedback on your previous response:\\n${feedback}\\n\\nPlease improve your response.`;\n}\n\n/**\n * Wrap an AgentRunner with reflection (self-improvement) logic.\n *\n * The returned runner runs the agent, evaluates the output, and retries with\n * feedback if the evaluation fails — up to `maxIterations` times.\n *\n * @example\n * ```typescript\n * const reflective = withReflection(runner, {\n * evaluate: (output) => ({\n * passed: typeof output === 'string' && output.length > 100,\n * feedback: 'Response too short, please elaborate',\n * score: Math.min(1, (output as string).length / 200),\n * }),\n * maxIterations: 3,\n * onExhausted: 'accept-last',\n * });\n * ```\n */\nexport function withReflection<T = unknown>(\n runner: AgentRunner,\n config: ReflectionConfig<T>,\n): AgentRunner {\n const maxIterations = config.maxIterations ?? 2;\n const buildRetryInput = config.buildRetryInput ?? defaultBuildRetryInput;\n const onExhausted = config.onExhausted ?? \"accept-last\";\n\n if (maxIterations < 1) {\n throw new Error(\"[Directive Reflection] maxIterations must be >= 1\");\n }\n\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\" &&\n maxIterations > 3\n ) {\n console.warn(\n \"[Directive Reflection] maxIterations > 3 rarely improves quality. \" +\n \"Consider using maxIterations <= 3 to avoid unbounded token burn.\",\n );\n }\n\n return async <R>(\n agent: AgentLike,\n input: string,\n options?: RunOptions,\n ): Promise<RunResult<R>> => {\n const history: ReflectionEvaluation[] = [];\n let effectiveInput = input;\n let accumulatedTokens = 0;\n let lastResult: RunResult<unknown> | null = null;\n\n for (let iteration = 0; iteration < maxIterations; iteration++) {\n const iterationStart = Date.now();\n\n // Run the agent\n const result = await runner(agent, effectiveInput, options);\n lastResult = result;\n accumulatedTokens += result.totalTokens;\n\n // Evaluate the output\n const context: ReflectionContext = {\n input,\n iteration,\n result,\n history: [...history],\n };\n\n const evaluation = await config.evaluate(result.output as T, context);\n history.push(evaluation);\n\n const durationMs = Date.now() - iterationStart;\n\n // Fire callback\n try {\n config.onIteration?.({\n iteration,\n passed: evaluation.passed,\n feedback: evaluation.feedback,\n score: evaluation.score,\n durationMs,\n });\n } catch {\n // callback error is non-fatal\n }\n\n if (evaluation.passed) {\n // Return with accumulated tokens\n return {\n ...result,\n totalTokens: accumulatedTokens,\n } as RunResult<R>;\n }\n\n // Check budget threshold\n if (\n config.budgetThreshold !== undefined &&\n accumulatedTokens >= config.budgetThreshold\n ) {\n break;\n }\n\n // Build retry input for next iteration (unless this is the last)\n if (iteration < maxIterations - 1 && evaluation.feedback) {\n effectiveInput = buildRetryInput(input, evaluation.feedback, iteration);\n }\n }\n\n // Exhausted all iterations\n if (onExhausted === \"throw\") {\n throw new ReflectionExhaustedError({\n iterations: maxIterations,\n history,\n lastResult: lastResult!,\n totalTokens: accumulatedTokens,\n });\n }\n\n // \"accept-last\" — return the last result with accumulated tokens\n return {\n ...lastResult!,\n totalTokens: accumulatedTokens,\n } as RunResult<R>;\n };\n}\n","/**\n * Agent Streaming - Token-by-token streaming with backpressure support\n *\n * Provides async iterators for streaming agent responses with guardrail evaluation\n * on partial output and configurable backpressure handling.\n *\n * @example\n * ```typescript\n * import { createAgentOrchestrator } from '@directive-run/ai';\n * import { createStreamingRunner } from '@directive-run/ai';\n *\n * const { stream, result } = orchestrator.runStream(agent, input);\n *\n * for await (const chunk of stream) {\n * if (chunk.type === 'token') process.stdout.write(chunk.data);\n * if (chunk.type === 'guardrail_triggered') handleGuardrail(chunk);\n * }\n *\n * const finalResult = await result;\n * ```\n */\n\nimport type { OrchestratorStreamChunk } from \"./agent-orchestrator.js\";\nimport type {\n AgentLike,\n GuardrailFn,\n Message,\n OutputGuardrailData,\n RunResult,\n StreamingCallbackRunner,\n} from \"./types.js\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default buffer size for streaming backpressure */\nexport const DEFAULT_BUFFER_SIZE = 1000;\n\n/** Default interval (in tokens) between guardrail checks during streaming */\nexport const DEFAULT_GUARDRAIL_CHECK_INTERVAL = 50;\n\n/** Default toxicity threshold for toxicity streaming guardrail */\nexport const DEFAULT_TOXICITY_THRESHOLD = 0.8;\n\n// ============================================================================\n// Stream Event Types\n// ============================================================================\n\n/** Token chunk from streaming response */\nexport interface TokenChunk {\n type: \"token\";\n data: string;\n /** Running total of tokens received */\n tokenCount: number;\n}\n\n/** Tool execution started */\nexport interface ToolStartChunk {\n type: \"tool_start\";\n tool: string;\n toolCallId: string;\n arguments: string;\n}\n\n/** Tool execution completed */\nexport interface ToolEndChunk {\n type: \"tool_end\";\n tool: string;\n toolCallId: string;\n result: string;\n}\n\n/** Message added to conversation */\nexport interface MessageChunk {\n type: \"message\";\n message: Message;\n}\n\n/** Guardrail was triggered during streaming */\nexport interface GuardrailTriggeredChunk {\n type: \"guardrail_triggered\";\n guardrailName: string;\n reason: string;\n /** Partial output at the time of trigger */\n partialOutput: string;\n /** Whether the stream was stopped */\n stopped: boolean;\n}\n\n/** Progress update for UI feedback */\nexport interface ProgressChunk {\n type: \"progress\";\n phase: \"starting\" | \"generating\" | \"tool_calling\" | \"finishing\";\n /** Percentage complete (0-100), if known */\n percent?: number;\n /** Human-readable status message */\n message?: string;\n}\n\n/** Stream completed */\nexport interface DoneChunk {\n type: \"done\";\n totalTokens: number;\n duration: number;\n /** Number of tokens dropped due to backpressure (only with 'drop' strategy) */\n droppedTokens: number;\n}\n\n/** Error during streaming */\nexport interface ErrorChunk {\n type: \"error\";\n error: Error;\n /** Partial output before error */\n partialOutput?: string;\n}\n\n/** Union of all stream chunk types */\nexport type StreamChunk =\n | TokenChunk\n | ToolStartChunk\n | ToolEndChunk\n | MessageChunk\n | GuardrailTriggeredChunk\n | ProgressChunk\n | DoneChunk\n | ErrorChunk;\n\n// ============================================================================\n// Streaming Run Types\n// ============================================================================\n\n/** Backpressure strategy when consumer is slow */\nexport type BackpressureStrategy =\n /** Drop tokens when buffer is full (lossy, fast) */\n | \"drop\"\n /** Block producer when buffer is full (lossless, may slow response) */\n | \"block\"\n /** Buffer all tokens (lossless, uses memory) */\n | \"buffer\";\n\n/** Streaming run options */\nexport interface StreamRunOptions {\n /** Maximum turns before stopping */\n maxTurns?: number;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Backpressure strategy. @default \"buffer\" */\n backpressure?: BackpressureStrategy;\n /** Buffer size for 'drop' and 'block' strategies. @default 1000 */\n bufferSize?: number;\n /** Evaluate guardrails every N tokens. @default 50 */\n guardrailCheckInterval?: number;\n /** Stop stream on guardrail trigger. @default true */\n stopOnGuardrail?: boolean | ((chunk: GuardrailTriggeredChunk) => boolean);\n}\n\n/** Stream run function type (mirrors OpenAI Agents streaming API) */\nexport type StreamRunner = <T = unknown>(\n agent: AgentLike,\n input: string,\n options?: StreamRunOptions,\n) => StreamingRunResult<T>;\n\n/** Result from a streaming run */\nexport interface StreamingRunResult<T = unknown> {\n /** Async iterator for streaming chunks */\n stream: AsyncIterable<StreamChunk>;\n /** Promise that resolves to the final result */\n result: Promise<RunResult<T>>;\n /** Abort the stream */\n abort: () => void;\n}\n\n// ============================================================================\n// Streaming Guardrail Types\n// ============================================================================\n\n/** Streaming guardrail that evaluates partial output */\nexport interface StreamingGuardrail {\n /** Unique name for this guardrail */\n name: string;\n /** Check partial output (called every guardrailCheckInterval tokens) */\n check: (\n partialOutput: string,\n tokenCount: number,\n ) => StreamingGuardrailResult | Promise<StreamingGuardrailResult>;\n /** Whether to stop the stream on failure. @default true */\n stopOnFail?: boolean;\n}\n\n/** Result from a streaming guardrail check */\nexport interface StreamingGuardrailResult {\n passed: boolean;\n reason?: string;\n /** Severity level for UI display */\n severity?: \"warning\" | \"error\" | \"critical\";\n /** Warning message (guardrail passed but wants to emit a warning) */\n warning?: string;\n}\n\n// ============================================================================\n// Stream Buffer Implementation\n// ============================================================================\n\n/** Internal buffer for managing backpressure */\nclass StreamBuffer<T> {\n private buffer: T[] = [];\n private maxSize: number;\n private strategy: BackpressureStrategy;\n private pullWaiters: Array<(value: T | null) => void> = [];\n private pushWaiters: Array<() => void> = []; // For block strategy - queue-based, not polling\n private closed = false;\n private droppedCount = 0;\n\n constructor(\n strategy: BackpressureStrategy = \"buffer\",\n maxSize = DEFAULT_BUFFER_SIZE,\n ) {\n this.strategy = strategy;\n this.maxSize = maxSize;\n }\n\n async push(item: T): Promise<boolean> {\n if (this.closed) {\n return false;\n }\n\n // If there's a pull waiter, send directly\n const pullWaiter = this.pullWaiters.shift();\n if (pullWaiter) {\n pullWaiter(item);\n return true;\n }\n\n // Handle based on strategy\n if (this.buffer.length >= this.maxSize) {\n switch (this.strategy) {\n case \"drop\":\n this.droppedCount++;\n return false;\n case \"block\":\n // Queue-based blocking (no polling) - wait for consumer to pull\n await new Promise<void>((resolve) => {\n this.pushWaiters.push(resolve);\n });\n if (this.closed) {\n return false;\n }\n break;\n case \"buffer\":\n // Just push anyway (may use lots of memory)\n break;\n }\n }\n\n this.buffer.push(item);\n return true;\n }\n\n async pull(): Promise<T | null> {\n // Notify a blocked producer that space is available\n const pushWaiter = this.pushWaiters.shift();\n if (pushWaiter) {\n pushWaiter();\n }\n\n if (this.buffer.length > 0) {\n return this.buffer.shift()!;\n }\n\n if (this.closed) {\n return null;\n }\n\n // Wait for next item\n return new Promise<T | null>((resolve) => {\n this.pullWaiters.push(resolve);\n });\n }\n\n close(): void {\n this.closed = true;\n // Resolve all waiting consumers with null\n for (const waiter of this.pullWaiters) {\n waiter(null);\n }\n this.pullWaiters = [];\n // Unblock all waiting producers\n for (const waiter of this.pushWaiters) {\n waiter();\n }\n this.pushWaiters = [];\n }\n\n getDroppedCount(): number {\n return this.droppedCount;\n }\n}\n\n// ============================================================================\n// Streaming Runner Implementation\n// ============================================================================\n\n/**\n * Create a streaming runner that wraps a base run function.\n * This is used internally by the orchestrator but can be used standalone.\n *\n * @param baseRunner - The underlying non-streaming runner\n * @param options - Configuration options\n */\nexport function createStreamingRunner(\n baseRunner: StreamingCallbackRunner,\n options: {\n streamingGuardrails?: StreamingGuardrail[];\n } = {},\n): StreamRunner {\n const { streamingGuardrails = [] } = options;\n\n return <T>(\n agent: AgentLike,\n input: string,\n runOptions: StreamRunOptions = {},\n ): StreamingRunResult<T> => {\n const {\n signal,\n backpressure = \"buffer\",\n bufferSize = DEFAULT_BUFFER_SIZE,\n guardrailCheckInterval = DEFAULT_GUARDRAIL_CHECK_INTERVAL,\n stopOnGuardrail = true,\n } = runOptions;\n\n // Validate configuration\n if (\n guardrailCheckInterval <= 0 ||\n !Number.isFinite(guardrailCheckInterval)\n ) {\n throw new Error(\n `[Directive Streaming] guardrailCheckInterval must be a positive number, got ${guardrailCheckInterval}`,\n );\n }\n\n const buffer = new StreamBuffer<StreamChunk>(backpressure, bufferSize);\n const abortController = new AbortController();\n let partialOutput = \"\";\n let tokenCount = 0;\n let stopped = false;\n const startTime = Date.now();\n\n // Combine external abort signal with internal one (with proper cleanup)\n let abortHandler: (() => void) | undefined;\n if (signal) {\n abortHandler = () => abortController.abort();\n signal.addEventListener(\"abort\", abortHandler);\n }\n\n // Cleanup function to prevent memory leaks\n const cleanup = () => {\n if (abortHandler && signal) {\n signal.removeEventListener(\"abort\", abortHandler);\n }\n };\n\n // Check streaming guardrails\n async function checkGuardrails(): Promise<GuardrailTriggeredChunk | null> {\n for (const guardrail of streamingGuardrails) {\n try {\n const result = await guardrail.check(partialOutput, tokenCount);\n if (!result.passed) {\n const shouldStop = guardrail.stopOnFail !== false;\n const chunk: GuardrailTriggeredChunk = {\n type: \"guardrail_triggered\",\n guardrailName: guardrail.name,\n reason: result.reason ?? \"Guardrail check failed\",\n partialOutput,\n stopped: shouldStop,\n };\n\n await buffer.push(chunk);\n\n if (shouldStop) {\n const stopFn =\n typeof stopOnGuardrail === \"function\"\n ? stopOnGuardrail\n : () => stopOnGuardrail;\n if (stopFn(chunk)) {\n stopped = true;\n abortController.abort();\n }\n }\n\n return chunk;\n }\n } catch {\n // Guardrail errors during streaming are silently swallowed —\n // the guardrail result itself carries error info when applicable.\n }\n }\n return null;\n }\n\n // Run the agent and pipe to buffer\n const resultPromise = (async (): Promise<RunResult<T>> => {\n await buffer.push({\n type: \"progress\",\n phase: \"starting\",\n message: \"Starting agent\",\n });\n\n try {\n const result = await baseRunner(agent, input, {\n signal: abortController.signal,\n onToken: async (token) => {\n if (stopped) return;\n\n tokenCount++;\n partialOutput += token;\n\n await buffer.push({\n type: \"token\",\n data: token,\n tokenCount,\n });\n\n // Check guardrails periodically\n if (tokenCount % guardrailCheckInterval === 0) {\n await checkGuardrails();\n }\n },\n onToolStart: async (tool, id, args) => {\n await buffer.push({\n type: \"progress\",\n phase: \"tool_calling\",\n message: `Calling ${tool}`,\n });\n await buffer.push({\n type: \"tool_start\",\n tool,\n toolCallId: id,\n arguments: args,\n });\n },\n onToolEnd: async (tool, id, result) => {\n await buffer.push({\n type: \"tool_end\",\n tool,\n toolCallId: id,\n result,\n });\n await buffer.push({\n type: \"progress\",\n phase: \"generating\",\n message: \"Continuing generation\",\n });\n },\n onMessage: async (message) => {\n await buffer.push({ type: \"message\", message });\n },\n });\n\n // Final guardrail check\n await checkGuardrails();\n\n const duration = Date.now() - startTime;\n const droppedTokens = buffer.getDroppedCount();\n await buffer.push({\n type: \"done\",\n totalTokens: result.totalTokens,\n duration,\n droppedTokens,\n });\n\n buffer.close();\n return result as RunResult<T>;\n } catch (error) {\n const errorChunk: ErrorChunk = {\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n partialOutput: partialOutput || undefined,\n };\n await buffer.push(errorChunk);\n buffer.close();\n throw error;\n } finally {\n // Always cleanup abort signal listener to prevent memory leaks\n cleanup();\n }\n })();\n\n // Create async iterator\n const stream: AsyncIterable<StreamChunk> = {\n [Symbol.asyncIterator](): AsyncIterator<StreamChunk> {\n return {\n async next(): Promise<IteratorResult<StreamChunk>> {\n const chunk = await buffer.pull();\n if (chunk === null) {\n return { done: true, value: undefined };\n }\n return { done: false, value: chunk };\n },\n };\n },\n };\n\n return {\n stream,\n result: resultPromise,\n abort: () => abortController.abort(),\n };\n };\n}\n\n// ============================================================================\n// Built-in Streaming Guardrails\n// ============================================================================\n\n/**\n * Create a streaming guardrail that detects toxic content.\n *\n * @example\n * ```typescript\n * const toxicityGuardrail = createToxicityStreamingGuardrail({\n * threshold: 0.9,\n * checkFn: async (text) => myToxicityModel.score(text),\n * });\n * ```\n */\nexport function createToxicityStreamingGuardrail(options: {\n /** Toxicity scoring function (returns 0-1) */\n checkFn: (text: string) => number | Promise<number>;\n /** Threshold above which content is flagged. @default 0.8 */\n threshold?: number;\n /** Stop the stream on detection. @default true */\n stopOnFail?: boolean;\n}): StreamingGuardrail {\n const {\n checkFn,\n threshold = DEFAULT_TOXICITY_THRESHOLD,\n stopOnFail = true,\n } = options;\n\n return {\n name: \"toxicity-streaming\",\n stopOnFail,\n async check(partialOutput) {\n const score = await checkFn(partialOutput);\n if (score > threshold) {\n return {\n passed: false,\n reason: `Toxicity score ${score.toFixed(2)} exceeds threshold ${threshold}`,\n severity: \"critical\",\n };\n }\n return { passed: true };\n },\n };\n}\n\n/**\n * Create a streaming guardrail that limits output length.\n *\n * @example\n * ```typescript\n * const lengthGuardrail = createLengthStreamingGuardrail({\n * maxTokens: 4000,\n * warnAt: 3500,\n * });\n * ```\n */\nexport function createLengthStreamingGuardrail(options: {\n /** Maximum tokens before stopping */\n maxTokens: number;\n /** Warn at this token count (optional) */\n warnAt?: number;\n /** Stop the stream on max. @default true */\n stopOnFail?: boolean;\n}): StreamingGuardrail {\n const { maxTokens, warnAt, stopOnFail = true } = options;\n\n // Per-instance flag: if this guardrail is shared across concurrent streams,\n // the warning fires only once globally. Create separate instances for independent warning per stream.\n let warned = false;\n\n return {\n name: \"length-streaming\",\n stopOnFail,\n check(_partialOutput, tokenCount) {\n if (tokenCount >= maxTokens) {\n return {\n passed: false,\n reason: `Output exceeded maximum length of ${maxTokens} tokens`,\n severity: \"error\",\n };\n }\n\n if (warnAt && tokenCount >= warnAt && !warned) {\n warned = true;\n\n return {\n passed: true,\n warning: `Approaching maximum length: ${tokenCount}/${maxTokens} tokens`,\n severity: \"warning\",\n };\n }\n\n return { passed: true };\n },\n };\n}\n\n/**\n * Create a streaming guardrail that detects patterns (regex-based).\n *\n * @example\n * ```typescript\n * const piiGuardrail = createPatternStreamingGuardrail({\n * patterns: [\n * { regex: /\\b\\d{3}-\\d{2}-\\d{4}\\b/, name: 'SSN' },\n * { regex: /\\b\\d{16}\\b/, name: 'Credit Card' },\n * ],\n * stopOnFail: true,\n * });\n * ```\n */\nexport function createPatternStreamingGuardrail(options: {\n patterns: Array<{ regex: RegExp; name: string }>;\n stopOnFail?: boolean;\n}): StreamingGuardrail {\n const { patterns, stopOnFail = true } = options;\n\n return {\n name: \"pattern-streaming\",\n stopOnFail,\n check(partialOutput) {\n for (const { regex, name } of patterns) {\n regex.lastIndex = 0;\n if (regex.test(partialOutput)) {\n return {\n passed: false,\n reason: `Detected ${name} pattern in output`,\n severity: \"error\",\n };\n }\n }\n return { passed: true };\n },\n };\n}\n\n/**\n * Combine multiple streaming guardrails into one.\n *\n * @example\n * ```typescript\n * const combined = combineStreamingGuardrails([\n * createToxicityStreamingGuardrail({ ... }),\n * createLengthStreamingGuardrail({ ... }),\n * ]);\n * ```\n */\nexport function combineStreamingGuardrails(\n guardrails: StreamingGuardrail[],\n options: { name?: string; stopOnFirstFail?: boolean } = {},\n): StreamingGuardrail {\n const { name = \"combined-streaming\", stopOnFirstFail = true } = options;\n\n return {\n name,\n stopOnFail: stopOnFirstFail,\n async check(partialOutput, tokenCount) {\n const failures: string[] = [];\n for (const guardrail of guardrails) {\n const result = await guardrail.check(partialOutput, tokenCount);\n if (!result.passed) {\n if (stopOnFirstFail) {\n return {\n ...result,\n reason: `[${guardrail.name}] ${result.reason}`,\n };\n }\n failures.push(`[${guardrail.name}] ${result.reason ?? \"failed\"}`);\n }\n }\n if (failures.length > 0) {\n return { passed: false, reason: failures.join(\"; \") };\n }\n return { passed: true };\n },\n };\n}\n\n// ============================================================================\n// Output Guardrail Adapter\n// ============================================================================\n\n/**\n * Convert a regular output guardrail to a streaming guardrail.\n * Useful for reusing existing guardrails in streaming context.\n *\n * @example\n * ```typescript\n * const streamingPII = adaptOutputGuardrail(\n * \"pii-streaming\",\n * createPIIGuardrail({ redact: false }),\n * { checkInterval: 100 }\n * );\n * ```\n */\nexport function adaptOutputGuardrail(\n name: string,\n guardrail: GuardrailFn<OutputGuardrailData>,\n options: {\n /** Only run after this many tokens (optimization) */\n minTokens?: number;\n stopOnFail?: boolean;\n } = {},\n): StreamingGuardrail {\n const { minTokens = 0, stopOnFail = true } = options;\n\n return {\n name,\n stopOnFail,\n async check(partialOutput, tokenCount) {\n if (tokenCount < minTokens) {\n return { passed: true };\n }\n\n const result = await guardrail(\n {\n output: partialOutput,\n agentName: \"streaming\",\n input: \"\",\n messages: [],\n },\n {\n agentName: \"streaming\",\n input: \"\",\n facts: {},\n },\n );\n\n return {\n passed: result.passed,\n reason: result.reason,\n severity: result.passed ? undefined : \"error\",\n };\n },\n };\n}\n\n// ============================================================================\n// Stream Utilities\n// ============================================================================\n\n/**\n * Collect all tokens from a stream into a string.\n *\n * @example\n * ```typescript\n * const { stream, result } = orchestrator.runStream(agent, input);\n * const fullOutput = await collectTokens(stream);\n * ```\n */\nexport async function collectTokens(\n stream: AsyncIterable<StreamChunk>,\n): Promise<string> {\n let output = \"\";\n for await (const chunk of stream) {\n if (chunk.type === \"token\") {\n output += chunk.data;\n }\n }\n return output;\n}\n\n/**\n * Tap into a stream without consuming it.\n * Useful for logging or side effects.\n *\n * @example\n * ```typescript\n * const { stream } = orchestrator.runStream(agent, input);\n * const tapped = tapStream(stream, (chunk) => console.log(chunk));\n * for await (const chunk of tapped) { ... }\n * ```\n */\nexport async function* tapStream(\n stream: AsyncIterable<StreamChunk>,\n fn: (chunk: StreamChunk) => void | Promise<void>,\n): AsyncIterable<StreamChunk> {\n for await (const chunk of stream) {\n await fn(chunk);\n yield chunk;\n }\n}\n\n/**\n * Filter stream chunks by type.\n *\n * @example\n * ```typescript\n * const tokensOnly = filterStream(stream, ['token']);\n * ```\n */\nexport async function* filterStream<T extends StreamChunk[\"type\"]>(\n stream: AsyncIterable<StreamChunk>,\n types: T[],\n): AsyncIterable<Extract<StreamChunk, { type: T }>> {\n const typeSet = new Set(types);\n for await (const chunk of stream) {\n if (typeSet.has(chunk.type as T)) {\n yield chunk as Extract<StreamChunk, { type: T }>;\n }\n }\n}\n\n/**\n * Transform stream chunks.\n *\n * @example\n * ```typescript\n * const upperTokens = mapStream(stream, (chunk) => {\n * if (chunk.type === 'token') return { ...chunk, data: chunk.data.toUpperCase() };\n * return chunk;\n * });\n * ```\n */\nexport async function* mapStream<R>(\n stream: AsyncIterable<StreamChunk>,\n fn: (chunk: StreamChunk) => R | Promise<R>,\n): AsyncIterable<R> {\n for await (const chunk of stream) {\n yield await fn(chunk);\n }\n}\n\n// ============================================================================\n// Multiplexed Streaming (Parallel Agent Streams)\n// ============================================================================\n\n/** A multiplexed stream chunk tagged with the agent that produced it */\nexport interface MultiplexedStreamChunk {\n chunk: OrchestratorStreamChunk;\n agentId: string;\n}\n\n/** Result from a parallel streaming operation */\nexport interface MultiplexedStreamResult<T = unknown> {\n stream: AsyncIterable<MultiplexedStreamChunk>;\n results: Promise<RunResult<unknown>[]>;\n merge: Promise<T>;\n abort: () => void;\n /** Number of chunks dropped due to buffer overflow */\n getDroppedCount: () => number;\n}\n\n/** Maximum buffer size for multiplexed streams */\nconst MAX_MULTIPLEX_BUFFER = 10_000;\n\n/** A source stream with its agent ID */\ninterface TaggedSource {\n agentId: string;\n stream: AsyncIterable<OrchestratorStreamChunk>;\n}\n\n/**\n * Merge multiple async iterables into a single multiplexed stream,\n * tagging each chunk with its source agent ID.\n *\n * Race-based merge: pulls from all sources concurrently, emitting\n * chunks in arrival order. Error chunks from individual agents are\n * tagged and emitted (other agents continue).\n *\n * @example\n * ```typescript\n * const merged = mergeTaggedStreams([\n * { agentId: \"researcher\", stream: researchStream },\n * { agentId: \"writer\", stream: writerStream },\n * ]);\n *\n * for await (const { chunk, agentId } of merged) {\n * console.log(`[${agentId}]`, chunk);\n * }\n * ```\n */\n/** Result from mergeTaggedStreams */\nexport interface MergedTaggedStreamResult {\n stream: AsyncIterable<MultiplexedStreamChunk>;\n /** Number of chunks dropped due to buffer overflow */\n getDroppedCount: () => number;\n}\n\n/**\n * Merge multiple tagged async iterables into a single multiplexed stream.\n *\n * @param sources - Array of tagged source streams to merge.\n * @returns A merged stream result with a `getDroppedCount` accessor.\n */\nexport function mergeTaggedStreams(\n sources: TaggedSource[],\n): MergedTaggedStreamResult {\n // Guard: empty sources would hang forever since no consumer calls finish()\n if (sources.length === 0) {\n const emptyStream: AsyncIterable<MultiplexedStreamChunk> = {\n [Symbol.asyncIterator]() {\n const done = {\n done: true as const,\n value: undefined as unknown as MultiplexedStreamChunk,\n };\n\n return {\n async next() {\n return done;\n },\n async return() {\n return done;\n },\n };\n },\n };\n\n return { stream: emptyStream, getDroppedCount: () => 0 };\n }\n\n const buffer: MultiplexedStreamChunk[] = [];\n const waiters: Array<(item: MultiplexedStreamChunk | null) => void> = [];\n let activeSources = sources.length;\n let closed = false;\n let droppedCount = 0;\n\n function push(item: MultiplexedStreamChunk): void {\n if (closed) {\n return;\n }\n\n const waiter = waiters.shift();\n if (waiter) {\n waiter(item);\n\n return;\n }\n\n if (buffer.length < MAX_MULTIPLEX_BUFFER) {\n buffer.push(item);\n } else {\n droppedCount++;\n }\n }\n\n function finish(): void {\n activeSources--;\n if (activeSources <= 0) {\n closed = true;\n for (const waiter of waiters) {\n waiter(null);\n }\n waiters.length = 0;\n }\n }\n\n // Start consumers for each source\n for (const source of sources) {\n (async () => {\n try {\n for await (const chunk of source.stream) {\n push({ chunk, agentId: source.agentId });\n }\n } catch (error) {\n // Emit error as a tagged chunk\n push({\n chunk: {\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n },\n agentId: source.agentId,\n });\n } finally {\n finish();\n }\n })();\n }\n\n const stream: AsyncIterable<MultiplexedStreamChunk> = {\n [Symbol.asyncIterator](): AsyncIterator<MultiplexedStreamChunk> {\n return {\n async next(): Promise<IteratorResult<MultiplexedStreamChunk>> {\n if (buffer.length > 0) {\n return { done: false, value: buffer.shift()! };\n }\n\n if (closed) {\n return { done: true, value: undefined };\n }\n\n return new Promise<IteratorResult<MultiplexedStreamChunk>>(\n (resolve) => {\n waiters.push((item) => {\n if (item === null) {\n resolve({ done: true, value: undefined });\n } else {\n resolve({ done: false, value: item });\n }\n });\n },\n );\n },\n\n return(): Promise<IteratorResult<MultiplexedStreamChunk>> {\n // Stop accepting new chunks\n closed = true;\n buffer.length = 0;\n for (const waiter of waiters) {\n waiter(null);\n }\n waiters.length = 0;\n\n return Promise.resolve({ done: true, value: undefined });\n },\n };\n },\n };\n\n return {\n stream,\n getDroppedCount: () => droppedCount,\n };\n}\n","import type {\n AgentSelectionStrategy,\n DagExecutionContext,\n DagNode,\n DagPattern,\n GoalMetrics,\n GoalNode,\n GoalPattern,\n PatternCheckpointConfig,\n RelaxationTier,\n RunResult,\n} from \"./types.js\";\nimport type {\n ParallelPattern,\n SequentialPattern,\n SupervisorPattern,\n ReflectPattern,\n RacePattern,\n ReflectIterationRecord,\n} from \"./multi-agent-orchestrator.js\";\nimport type { ReflectionEvaluation } from \"./reflection.js\";\n\n// ============================================================================\n// Pattern Helpers\n// ============================================================================\n\n/**\n * Create a parallel execution pattern that runs handlers concurrently and merges results.\n *\n * @param handlers - Handler IDs (agents or tasks) to run concurrently.\n * @param merge - Combine all handler results into a single output (array may be shorter than handlers when `minSuccess` is set).\n * @param options - Optional `minSuccess` and `timeout` overrides.\n * @returns A {@link ParallelPattern} configuration object.\n *\n * @example\n * ```typescript\n * const researchPattern = parallel(\n * ['researcher', 'researcher', 'researcher'],\n * (results) => results.map(r => r.output).join('\\n'),\n * );\n * ```\n */\nexport function parallel<T>(\n handlers: string[],\n merge: (results: RunResult<unknown>[]) => T | Promise<T>,\n options?: { minSuccess?: number; timeout?: number },\n): ParallelPattern<T> {\n return {\n type: \"parallel\",\n handlers,\n merge,\n ...options,\n };\n}\n\n/**\n * Create a sequential execution pattern that pipes output from one handler to the next.\n *\n * @param handlers - Handler IDs (agents or tasks) to run in order, where each handler's output feeds as input to the next.\n * @param options - Optional `transform`, `extract`, and `continueOnError` overrides.\n * @returns A {@link SequentialPattern} configuration object.\n *\n * @example\n * ```typescript\n * const writeReviewPattern = sequential(\n * ['writer', 'reviewer'],\n * { transform: (output) => `Review this: ${output}` },\n * );\n * ```\n */\nexport function sequential<T>(\n handlers: string[],\n options?: {\n transform?: (output: unknown, handlerId: string, index: number) => string;\n extract?: (output: unknown) => T;\n continueOnError?: boolean;\n },\n): SequentialPattern<T> {\n return {\n type: \"sequential\",\n handlers,\n ...options,\n };\n}\n\n/**\n * Create a supervisor pattern where a coordinating agent delegates work to a pool of workers.\n *\n * The supervisor runs first, then dispatches tasks to workers based on its output.\n * This repeats for up to `maxRounds` until the supervisor signals completion.\n *\n * @param supervisorAgent - Agent ID that coordinates the workers.\n * @param workers - Agent IDs for the worker pool.\n * @param options - Optional `maxRounds` and `extract` overrides.\n * @returns A {@link SupervisorPattern} configuration object.\n *\n * @example\n * ```typescript\n * const managedPattern = supervisor(\n * 'manager',\n * ['worker1', 'worker2'],\n * { maxRounds: 3 },\n * );\n * ```\n */\nexport function supervisor<T>(\n supervisorAgent: string,\n workers: string[],\n options?: {\n maxRounds?: number;\n extract?: (\n supervisorOutput: unknown,\n workerResults: RunResult<unknown>[],\n ) => T;\n },\n): SupervisorPattern<T> {\n return {\n type: \"supervisor\",\n supervisor: supervisorAgent,\n workers,\n ...options,\n };\n}\n\n/**\n * Create a directed acyclic graph (DAG) execution pattern.\n *\n * Nodes run concurrently when their dependencies are satisfied. The runtime\n * validates the graph is acyclic and that all dependency references are valid.\n *\n * @param nodes - Node definitions keyed by ID, each with a `handler` and optional `deps` array.\n * @param merge - Combine DAG outputs into a single result (defaults to `context.outputs`).\n * @param options - Optional `timeout`, `maxConcurrent`, and `onNodeError` strategy.\n * @returns A {@link DagPattern} configuration object.\n *\n * @example\n * ```typescript\n * const researchPipeline = dag(\n * {\n * fetch: { handler: 'fetcher' },\n * analyze: { handler: 'analyzer', deps: ['fetch'] },\n * summarize: { handler: 'summarizer', deps: ['analyze'] },\n * },\n * (context) => context.outputs.summarize,\n * );\n * ```\n */\nexport function dag<T = Record<string, unknown>>(\n nodes: Record<string, DagNode>,\n merge?: (context: DagExecutionContext) => T | Promise<T>,\n options?: {\n /** Overall timeout in ms for the entire DAG. */\n timeout?: number;\n /** Max nodes running concurrently. Default: Infinity */\n maxConcurrent?: number;\n /**\n * Error handling strategy.\n * - `\"fail\"` — abort entire DAG on first node error (default)\n * - `\"skip-downstream\"` — mark downstream nodes as skipped, other branches continue\n * - `\"continue\"` — ignore errors, other branches continue\n */\n onNodeError?: \"fail\" | \"skip-downstream\" | \"continue\";\n },\n): DagPattern<T> {\n return {\n type: \"dag\",\n nodes,\n merge: merge ?? ((context: DagExecutionContext) => context.outputs as T),\n ...options,\n };\n}\n\n/**\n * Create a reflect pattern that iterates between a producer and evaluator until quality is met.\n *\n * The producer generates output, then the evaluator scores it. If the score\n * is below the threshold, the producer retries with evaluator feedback,\n * up to `maxIterations` times.\n *\n * @param handler - Producer handler ID (agent or task) that generates output.\n * @param evaluator - Evaluator handler ID that judges quality and provides feedback.\n * @param options - Optional iteration, parsing, signal, and threshold configuration.\n * @returns A {@link ReflectPattern} configuration object.\n *\n * @example\n * ```typescript\n * const reviewPattern = reflect('writer', 'reviewer', { maxIterations: 2 });\n * ```\n */\nexport function reflect<T>(\n handler: string,\n evaluator: string,\n options?: {\n maxIterations?: number;\n parseEvaluation?: (output: unknown) => ReflectionEvaluation;\n buildRetryInput?: (\n input: string,\n feedback: string,\n iteration: number,\n ) => string;\n extract?: (output: unknown) => T;\n onExhausted?: \"accept-last\" | \"accept-best\" | \"throw\";\n onIteration?: (record: ReflectIterationRecord) => void;\n signal?: AbortSignal;\n timeout?: number;\n threshold?: number | ((iteration: number) => number);\n },\n): ReflectPattern<T> {\n return {\n type: \"reflect\",\n handler,\n evaluator,\n ...options,\n };\n}\n\n/**\n * Create a race pattern that runs handlers concurrently and returns the first successful result.\n *\n * All handlers start simultaneously. The first to complete successfully wins;\n * remaining handlers are aborted. Use `minSuccess` to wait for N results before picking.\n *\n * @param handlers - Handler IDs (agents or tasks) to race concurrently.\n * @param options - Optional `extract`, `timeout`, `minSuccess`, and `signal` overrides.\n * @returns A {@link RacePattern} configuration object.\n *\n * @example\n * ```typescript\n * const fastest = race(['fast-model', 'smart-model'], { timeout: 5000 });\n * ```\n */\nexport function race<T>(\n handlers: string[],\n options?: {\n extract?: (result: RunResult<unknown>) => T;\n timeout?: number;\n minSuccess?: number;\n signal?: AbortSignal;\n },\n): RacePattern<T> {\n return {\n type: \"race\",\n handlers,\n ...options,\n };\n}\n\n// ============================================================================\n// Goal Pattern Factory & Selection Strategies\n// ============================================================================\n\n/**\n * Create a goal-driven execution pattern where agents are selected and run\n * until a goal condition is satisfied.\n *\n * Declare what each agent produces and requires. The runtime automatically\n * infers the execution graph from dependency analysis and drives agents\n * toward goal achievement, with optional satisfaction scoring and relaxation tiers.\n *\n * @param nodes - Goal node definitions keyed by ID, each declaring `produces`, `requires`, and a `handler`.\n * @param when - Predicate that returns `true` when the goal is achieved.\n * @param options - Optional `satisfaction`, `maxSteps`, `extract`, `timeout`, `selectionStrategy`, and `relaxation` config.\n * @returns A {@link GoalPattern} configuration object.\n *\n * @example\n * ```typescript\n * const pipeline = goal(\n * {\n * researcher: {\n * handler: \"researcher\",\n * produces: [\"research.findings\"],\n * requires: [\"research.topic\"],\n * extractOutput: (r) => ({ \"research.findings\": r.output }),\n * },\n * writer: {\n * handler: \"writer\",\n * produces: [\"article.draft\"],\n * requires: [\"research.findings\"],\n * extractOutput: (r) => ({ \"article.draft\": r.output }),\n * },\n * },\n * (facts) => facts[\"article.draft\"] != null,\n * { maxSteps: 10, extract: (facts) => facts[\"article.draft\"] },\n * );\n * ```\n */\nexport function goal<T = Record<string, unknown>>(\n nodes: Record<string, GoalNode>,\n when: (facts: Record<string, unknown>) => boolean,\n options?: {\n satisfaction?: (facts: Record<string, unknown>) => number;\n maxSteps?: number;\n extract?: (facts: Record<string, unknown>) => T;\n timeout?: number;\n signal?: AbortSignal;\n selectionStrategy?: AgentSelectionStrategy;\n relaxation?: RelaxationTier[];\n onStep?: (\n step: number,\n facts: Record<string, unknown>,\n readyNodes: string[],\n ) => void;\n onStall?: (step: number, metrics: GoalMetrics) => void;\n checkpoint?: PatternCheckpointConfig;\n },\n): GoalPattern<T> {\n return {\n type: \"goal\",\n nodes,\n when,\n ...options,\n };\n}\n\n/**\n * Create a selection strategy that runs all ready agents concurrently.\n *\n * This is the default strategy for {@link goal} patterns.\n *\n * @returns An {@link AgentSelectionStrategy} that selects every ready agent.\n */\nexport function allReadyStrategy(): AgentSelectionStrategy {\n return {\n select: (readyAgents) => readyAgents,\n };\n}\n\n/**\n * Create a selection strategy that picks agents with the highest historical impact.\n *\n * Sorts ready agents by average satisfaction delta (descending) and selects the top N.\n *\n * @param opts - Optional `topN` to limit how many agents are selected (default: 3).\n * @returns An {@link AgentSelectionStrategy} that prioritizes high-impact agents.\n */\nexport function highestImpactStrategy(opts?: {\n topN?: number;\n}): AgentSelectionStrategy {\n const topN = opts?.topN ?? 3;\n\n return {\n select: (readyAgents, metrics) => {\n const sorted = [...readyAgents].sort((a, b) => {\n const aAvg = metrics[a]?.avgSatisfactionDelta ?? 0;\n const bAvg = metrics[b]?.avgSatisfactionDelta ?? 0;\n\n return bAvg - aAvg;\n });\n\n return sorted.slice(0, topN);\n },\n };\n}\n\n/**\n * Create a selection strategy that prefers agents with lower token cost per satisfaction delta.\n *\n * Agents without historical metrics are prioritized first (to gather data).\n *\n * @returns An {@link AgentSelectionStrategy} that optimizes for cost efficiency.\n */\nexport function costEfficientStrategy(): AgentSelectionStrategy {\n return {\n select: (readyAgents, metrics) => {\n const sorted = [...readyAgents].sort((a, b) => {\n const aM = metrics[a];\n const bM = metrics[b];\n\n // Agents without metrics go first (need data)\n if (!aM || aM.runs === 0) {\n return -1;\n }\n if (!bM || bM.runs === 0) {\n return 1;\n }\n\n // Cost per delta: lower is better\n const aCost =\n aM.avgSatisfactionDelta > 0\n ? aM.tokens / aM.runs / aM.avgSatisfactionDelta\n : Number.POSITIVE_INFINITY;\n const bCost =\n bM.avgSatisfactionDelta > 0\n ? bM.tokens / bM.runs / bM.avgSatisfactionDelta\n : Number.POSITIVE_INFINITY;\n\n return aCost - bCost;\n });\n\n return sorted;\n },\n };\n}\n","/**\n * Multi-Agent Orchestration Patterns\n *\n * Provides patterns for coordinating multiple AI agents:\n * - Parallel execution with result merging\n * - Sequential pipelines\n * - Supervisor patterns with worker delegation\n * - Constraint-driven agent selection\n *\n * @example\n * ```typescript\n * import { createMultiAgentOrchestrator } from '@directive-run/ai';\n *\n * const orchestrator = createMultiAgentOrchestrator({\n * agents: {\n * researcher: { agent: researchAgent, maxConcurrent: 3 },\n * writer: { agent: writerAgent, maxConcurrent: 1 },\n * reviewer: { agent: reviewerAgent, maxConcurrent: 1 },\n * },\n * patterns: {\n * parallelResearch: {\n * type: 'parallel',\n * handlers: ['researcher', 'researcher', 'researcher'],\n * merge: (results) => combineResearch(results),\n * },\n * },\n * });\n * ```\n */\n\nimport type {\n ModuleSchema,\n Plugin,\n Requirement,\n System,\n} from \"@directive-run/core\";\nimport { createModule, createSystem, t } from \"@directive-run/core\";\nimport {\n createCallbackPlugin,\n getBridgeFact,\n requirementGuard,\n setBridgeFact,\n} from \"@directive-run/core/adapter-utils\";\nimport type { CircuitBreaker } from \"@directive-run/core/plugins\";\nimport type {\n OrchestratorStreamChunk,\n OrchestratorStreamResult,\n} from \"./agent-orchestrator.js\";\nimport {\n type DebugTimeline,\n createDebugTimeline,\n createDebugTimelinePlugin,\n} from \"./debug-timeline.js\";\nimport {\n executeAgentWithRetry,\n executeGuardrailWithRetry,\n normalizeGuardrail,\n} from \"./guardrail-utils.js\";\nimport { type HealthMonitor, createHealthMonitor } from \"./health-monitor.js\";\nimport type { AgentMemory } from \"./memory.js\";\nimport {\n convertOrchestratorConstraints,\n getAgentState,\n getApprovalState,\n getBreakpointState,\n getConversation,\n getOrchestratorState,\n getToolCalls,\n setAgentState,\n setApprovalState,\n setBreakpointState,\n setConversation,\n setToolCalls,\n} from \"./orchestrator-bridge.js\";\nimport { ReflectionExhaustedError } from \"./reflection.js\";\nimport type { ReflectionEvaluation } from \"./reflection.js\";\nimport type {\n AgentLike,\n AgentRetryConfig,\n AgentRunner,\n AgentSelectionStrategy,\n ApprovalRequest,\n CheckpointDiff,\n CheckpointProgress,\n CrossAgentDerivationFn,\n CrossAgentSnapshot,\n DagCheckpointState,\n DagExecutionContext,\n DagNode,\n DagPattern,\n DebateCheckpointState,\n GoalCheckpointState,\n GoalMetrics,\n GoalNode,\n GoalPattern,\n GoalResult,\n GoalStepMetrics,\n GuardrailFn,\n GuardrailsConfig,\n InputGuardrailData,\n MultiAgentLifecycleHooks,\n MultiAgentSelfHealingConfig,\n NamedGuardrail,\n OrchestratorConstraint,\n OrchestratorResolver,\n OrchestratorResolverContext,\n OrchestratorState,\n OutputGuardrailData,\n PatternCheckpointConfig,\n PatternCheckpointState,\n ReflectCheckpointState,\n RejectedRequest,\n RelaxationContext,\n RelaxationRecord,\n RelaxationTier,\n RerouteEvent,\n RunOptions,\n RunResult,\n Scratchpad,\n SequentialCheckpointState,\n SupervisorCheckpointState,\n ToolCallGuardrailData,\n} from \"./types.js\";\nimport {\n APPROVAL_KEY,\n BREAKPOINT_KEY,\n GuardrailError,\n SCRATCHPAD_KEY,\n isGuardrailError,\n orchestratorBridgeSchema,\n} from \"./types.js\";\n\nimport type {\n BreakpointConfig,\n BreakpointContext,\n BreakpointModifications,\n BreakpointRequest,\n MultiAgentBreakpointType,\n} from \"./breakpoints.js\";\nimport {\n MAX_BREAKPOINT_HISTORY,\n createBreakpointId,\n createInitialBreakpointState,\n matchBreakpoint,\n} from \"./breakpoints.js\";\nimport {\n type Checkpoint,\n type CheckpointStore,\n type MultiAgentCheckpointLocalState,\n createCheckpointId,\n validateCheckpoint,\n} from \"./checkpoint.js\";\nimport {\n type MultiplexedStreamResult,\n mergeTaggedStreams,\n} from \"./streaming.js\";\nimport {\n type SafeParseable,\n extractJsonFromOutput,\n withStructuredOutput,\n} from \"./structured-output.js\";\n\n// ============================================================================\n/** Safe JSON.stringify that handles circular refs or throwing toJSON */\nfunction safeStringify(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/** Shallow structural equality for change detection (plain objects, arrays, and primitives) */\nfunction shallowEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) {\n return true;\n }\n\n if (typeof a !== typeof b || a === null || b === null) {\n return false;\n }\n\n if (typeof a !== \"object\") {\n return false;\n }\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== (b as unknown[]).length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== (b as unknown[])[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n for (const key of aKeys) {\n if (aObj[key] !== bObj[key]) {\n return false;\n }\n }\n\n return true;\n}\n\n// Async Semaphore (for slot acquisition without polling)\n// ============================================================================\n\n// ============================================================================\n// Checkpoint Utility Functions\n// ============================================================================\n\n/**\n * Get the current step/round/iteration count from a pattern checkpoint state.\n *\n * Maps each pattern type to its natural progress counter: `step` for sequential\n * and goal, `round` for supervisor and debate, `iteration` for reflect, and\n * `completedCount` for DAG.\n *\n * @param state - The pattern checkpoint state to inspect.\n * @returns The current progress count for the pattern.\n */\nexport function getPatternStep(state: PatternCheckpointState): number {\n switch (state.type) {\n case \"sequential\":\n return state.step;\n case \"supervisor\":\n return state.round;\n case \"reflect\":\n return state.iteration;\n case \"debate\":\n return state.round;\n case \"dag\":\n return state.completedCount;\n case \"goal\":\n return state.step;\n }\n}\n\n/**\n * Compute progress metrics from a pattern checkpoint state.\n *\n * Returns percentage complete, steps completed/remaining, tokens consumed,\n * and estimated tokens remaining (when computable). Each pattern type\n * calculates these metrics from its own state structure.\n *\n * @param state - The pattern checkpoint state to analyze.\n * @returns A {@link CheckpointProgress} object with completion metrics.\n */\nexport function getCheckpointProgress(\n state: PatternCheckpointState,\n): CheckpointProgress {\n const stepsCompleted = getPatternStep(state);\n const stepsTotal = state.stepsTotal ?? null;\n\n switch (state.type) {\n case \"sequential\": {\n const tokensConsumed = state.results.reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n const avgTokens =\n state.results.length > 0 ? tokensConsumed / state.results.length : 0;\n const remaining = stepsTotal != null ? stepsTotal - stepsCompleted : null;\n\n return {\n percentage:\n stepsTotal != null && stepsTotal > 0\n ? Math.round((stepsCompleted / stepsTotal) * 100)\n : 0,\n stepsCompleted,\n stepsTotal,\n tokensConsumed,\n estimatedTokensRemaining:\n avgTokens > 0 && remaining != null\n ? Math.round(avgTokens * remaining)\n : null,\n estimatedStepsRemaining: remaining,\n };\n }\n\n case \"supervisor\": {\n const tokensConsumed = state.workerResults.reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n const remaining = stepsTotal != null ? stepsTotal - stepsCompleted : null;\n\n return {\n percentage:\n stepsTotal != null && stepsTotal > 0\n ? Math.round((stepsCompleted / stepsTotal) * 100)\n : 0,\n stepsCompleted,\n stepsTotal,\n tokensConsumed,\n estimatedTokensRemaining: null,\n estimatedStepsRemaining: remaining,\n };\n }\n\n case \"reflect\": {\n const tokensConsumed = state.history.reduce(\n (sum, h) => sum + h.producerTokens + h.evaluatorTokens,\n 0,\n );\n const remaining = stepsTotal != null ? stepsTotal - stepsCompleted : null;\n\n return {\n percentage:\n stepsTotal != null && stepsTotal > 0\n ? Math.round((stepsCompleted / stepsTotal) * 100)\n : 0,\n stepsCompleted,\n stepsTotal,\n tokensConsumed,\n estimatedTokensRemaining: null,\n estimatedStepsRemaining: remaining,\n };\n }\n\n case \"debate\": {\n const tokensConsumed = state.tokensConsumed;\n const remaining = stepsTotal != null ? stepsTotal - stepsCompleted : null;\n\n return {\n percentage:\n stepsTotal != null && stepsTotal > 0\n ? Math.round((stepsCompleted / stepsTotal) * 100)\n : 0,\n stepsCompleted,\n stepsTotal,\n tokensConsumed,\n estimatedTokensRemaining: null,\n estimatedStepsRemaining: remaining,\n };\n }\n\n case \"dag\": {\n const total = stepsTotal ?? Object.keys(state.statuses).length;\n const completed = state.completedCount;\n const tokensConsumed = Object.values(state.nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n const avgTokens = completed > 0 ? tokensConsumed / completed : 0;\n const remaining = total - completed;\n\n return {\n percentage: total > 0 ? Math.round((completed / total) * 100) : 0,\n stepsCompleted: completed,\n stepsTotal: total,\n tokensConsumed,\n estimatedTokensRemaining:\n remaining > 0 ? Math.round(avgTokens * remaining) : 0,\n estimatedStepsRemaining: remaining,\n };\n }\n\n case \"goal\": {\n const tokensConsumed = Object.values(state.nodeOutputs).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n const satisfaction = state.lastSatisfaction;\n\n return {\n percentage: Math.round(satisfaction * 100),\n stepsCompleted,\n stepsTotal: stepsTotal ?? null,\n tokensConsumed,\n estimatedTokensRemaining: null,\n estimatedStepsRemaining:\n state.stepMetrics.length > 0 ? estimateGoalSteps(state) : null,\n };\n }\n }\n}\n\nfunction estimateGoalSteps(state: GoalCheckpointState): number | null {\n const metrics = state.stepMetrics;\n if (metrics.length < 2) {\n return null;\n }\n\n const remaining = 1.0 - state.lastSatisfaction;\n if (remaining <= 0) {\n return 0;\n }\n\n // Average satisfaction delta\n const totalDelta = metrics.reduce(\n (sum, m) => sum + Math.max(0, m.satisfactionDelta),\n 0,\n );\n const avgDelta = totalDelta / metrics.length;\n if (avgDelta <= 0) {\n return null;\n }\n\n return Math.ceil(remaining / avgDelta);\n}\n\n/**\n * Compute the diff between two checkpoint states of the same pattern type.\n *\n * Returns the delta in steps, tokens, and time between checkpoints.\n * Useful for understanding how much progress occurred between saves.\n *\n * @param a - The earlier checkpoint state.\n * @param b - The later checkpoint state.\n * @returns A {@link CheckpointDiff} with step, token, and time deltas.\n * @throws If the two checkpoints have different pattern types.\n */\nexport function diffCheckpoints(\n a: PatternCheckpointState,\n b: PatternCheckpointState,\n): CheckpointDiff {\n if (a.type !== b.type) {\n throw new Error(\n `[Directive Checkpoint] Cannot diff different pattern types: ${a.type} vs ${b.type}`,\n );\n }\n\n const getTokens = (s: PatternCheckpointState): number => {\n switch (s.type) {\n case \"sequential\":\n return s.results.reduce((sum, r) => sum + r.totalTokens, 0);\n case \"supervisor\":\n return s.workerResults.reduce((sum, r) => sum + r.totalTokens, 0);\n case \"reflect\":\n return s.history.reduce(\n (sum, h) => sum + h.producerTokens + h.evaluatorTokens,\n 0,\n );\n case \"debate\":\n return s.tokensConsumed;\n case \"dag\":\n return Object.values(s.nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n case \"goal\":\n return Object.values(s.nodeOutputs).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n }\n };\n\n const diff: CheckpointDiff = {\n patternType: a.type,\n stepDelta: getPatternStep(b) - getPatternStep(a),\n tokensDelta: getTokens(b) - getTokens(a),\n };\n\n // Add facts diff for goal pattern\n if (a.type === \"goal\" && b.type === \"goal\") {\n const aKeys = new Set(Object.keys(a.facts));\n const bKeys = new Set(Object.keys(b.facts));\n const added: string[] = [];\n const removed: string[] = [];\n const changed: Array<{ key: string; before: unknown; after: unknown }> = [];\n\n for (const key of bKeys) {\n if (!aKeys.has(key)) {\n added.push(key);\n } else if (\n JSON.stringify(a.facts[key]) !== JSON.stringify(b.facts[key])\n ) {\n changed.push({ key, before: a.facts[key], after: b.facts[key] });\n }\n }\n for (const key of aKeys) {\n if (!bKeys.has(key)) {\n removed.push(key);\n }\n }\n\n diff.facts = { added, removed, changed };\n }\n\n // Add nodes completed for DAG/goal\n if (a.type === \"dag\" && b.type === \"dag\") {\n const aCompleted = new Set(\n Object.entries(a.statuses)\n .filter(([, s]) => s === \"completed\")\n .map(([id]) => id),\n );\n diff.nodesCompleted = Object.entries(b.statuses)\n .filter(([id, s]) => s === \"completed\" && !aCompleted.has(id))\n .map(([id]) => id);\n }\n\n if (a.type === \"goal\" && b.type === \"goal\") {\n const aCompleted = new Set(a.completedNodes);\n diff.nodesCompleted = b.completedNodes.filter((id) => !aCompleted.has(id));\n }\n\n return diff;\n}\n\n/**\n * Fork an orchestrator from a checkpoint — creates a new independent orchestrator\n * restored to the checkpoint's state, ready to diverge from that point.\n *\n * @param options - The original orchestrator options used to create the orchestrator\n * @param checkpointStore - The checkpoint store containing the checkpoint\n * @param checkpointId - The ID of the checkpoint to fork from\n * @returns A new independent MultiAgentOrchestrator restored to checkpoint state\n *\n * @example\n * ```typescript\n * const forked = await forkFromCheckpoint(orchestratorOptions, store, \"ckpt_abc123\");\n * const result = await forked.replay(\"ckpt_abc123\", pattern, { input: \"new input\" });\n * ```\n */\nexport async function forkFromCheckpoint(\n options: MultiAgentOrchestratorOptions,\n checkpointStore: CheckpointStore,\n checkpointId: string,\n): Promise<MultiAgentOrchestrator> {\n const checkpoint = await checkpointStore.load(checkpointId);\n if (!checkpoint) {\n throw new Error(\n `[Directive MultiAgent] Checkpoint not found: ${checkpointId}`,\n );\n }\n\n // Deep-clone the checkpoint so the forked orchestrator is fully independent\n const cloned = structuredClone(checkpoint);\n\n const forked = createMultiAgentOrchestrator({\n ...options,\n checkpointStore,\n });\n\n forked.restore(cloned);\n\n return forked;\n}\n\n/**\n * Async semaphore for controlling concurrent access.\n * Uses a queue-based approach instead of polling for efficiency.\n *\n * @example\n * ```typescript\n * import { Semaphore } from '@directive-run/ai';\n *\n * const sem = new Semaphore(3); // Allow 3 concurrent operations\n *\n * async function doWork() {\n * const release = await sem.acquire();\n * try {\n * await performWork();\n * } finally {\n * release();\n * }\n * }\n * ```\n */\nexport class Semaphore {\n private count: number;\n private readonly maxPermits: number;\n private readonly queue: Array<{\n resolve: (release: () => void) => void;\n reject: (error: Error) => void;\n }> = [];\n\n constructor(max: number) {\n if (max < 1 || !Number.isFinite(max)) {\n throw new Error(\n `[Directive Semaphore] Invalid max permits: ${max}. Must be a finite number >= 1.`,\n );\n }\n this.maxPermits = max;\n this.count = max;\n }\n\n /** Create a one-shot release function that guards against double-release */\n private createReleaseFn(): () => void {\n let released = false;\n\n return () => {\n if (released) {\n return;\n }\n released = true;\n this.release();\n };\n }\n\n /** Acquire a permit, optionally with abort signal support */\n async acquire(signal?: AbortSignal): Promise<() => void> {\n if (signal?.aborted) {\n throw new Error(\"[Directive Semaphore] Aborted before acquiring permit\");\n }\n if (this.count > 0) {\n this.count--;\n\n return this.createReleaseFn();\n }\n\n return new Promise<() => void>((resolve, reject) => {\n let onAbort: (() => void) | undefined;\n\n const entry = {\n resolve: (releaseFn: () => void) => {\n if (onAbort && signal) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n resolve(releaseFn);\n },\n reject,\n };\n this.queue.push(entry);\n\n if (signal) {\n onAbort = () => {\n const idx = this.queue.indexOf(entry);\n if (idx >= 0) {\n this.queue.splice(idx, 1);\n reject(\n new Error(\n \"[Directive Semaphore] Aborted while waiting for permit\",\n ),\n );\n }\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n }\n\n /** Non-blocking acquire — returns null if no permits available */\n tryAcquire(): (() => void) | null {\n if (this.count > 0) {\n this.count--;\n\n return this.createReleaseFn();\n }\n\n return null;\n }\n\n private release(): void {\n this.count++;\n const next = this.queue.shift();\n if (next) {\n this.count--;\n next.resolve(this.createReleaseFn());\n }\n }\n\n /** Get current available permits */\n get available(): number {\n return this.count;\n }\n\n /** Get number of waiters in queue */\n get waiting(): number {\n return this.queue.length;\n }\n\n /** Get maximum permits */\n get max(): number {\n return this.maxPermits;\n }\n\n /** Reject all pending waiters with an error and reset permits */\n drain(): void {\n const err = new Error(\n \"[Directive Semaphore] Semaphore drained - all pending acquisitions rejected\",\n );\n const pending = this.queue.splice(0, this.queue.length);\n for (const waiter of pending) {\n waiter.reject(err);\n }\n this.count = this.maxPermits;\n }\n}\n\n// ============================================================================\n// Agent Registry Types\n// ============================================================================\n\n/** Configuration for a registered agent */\nexport interface AgentRegistration {\n /** The agent instance */\n agent: AgentLike;\n /** Maximum concurrent runs for this agent. @default 1 */\n maxConcurrent?: number;\n /** Timeout for agent runs (ms) */\n timeout?: number;\n /** Custom run options */\n runOptions?: Omit<RunOptions, \"signal\">;\n /** Description for constraint-based selection */\n description?: string;\n /** Capabilities this agent has */\n capabilities?: string[];\n /** Per-agent guardrails (applied in addition to orchestrator-level guardrails) */\n guardrails?: {\n input?: Array<\n GuardrailFn<InputGuardrailData> | NamedGuardrail<InputGuardrailData>\n >;\n output?: Array<\n GuardrailFn<OutputGuardrailData> | NamedGuardrail<OutputGuardrailData>\n >;\n toolCall?: Array<\n GuardrailFn<ToolCallGuardrailData> | NamedGuardrail<ToolCallGuardrailData>\n >;\n };\n /** Per-agent retry config (overrides orchestrator-level agentRetry) */\n retry?: AgentRetryConfig;\n /** Per-agent constraints */\n constraints?: Record<string, OrchestratorConstraint<Record<string, unknown>>>;\n /** Per-agent resolvers */\n resolvers?: Record<\n string,\n OrchestratorResolver<Record<string, unknown>, Requirement>\n >;\n /** Per-agent memory (overrides orchestrator-level memory) */\n memory?: AgentMemory;\n /** Per-agent circuit breaker (overrides orchestrator-level circuitBreaker) */\n circuitBreaker?: CircuitBreaker;\n /** Per-agent output schema for structured output */\n outputSchema?: SafeParseable<unknown>;\n /** Max retries for structured output validation. @default 2 */\n maxSchemaRetries?: number;\n /** Custom JSON extractor for structured output */\n extractJson?: (output: string) => unknown;\n /** Description of the schema for structured output prompting */\n schemaDescription?: string;\n}\n\n/** Agent registry configuration */\nexport interface AgentRegistry {\n [agentId: string]: AgentRegistration;\n}\n\n// ============================================================================\n// Execution Pattern Types\n// ============================================================================\n\n/** Parallel execution pattern - run handlers concurrently and merge results */\nexport interface ParallelPattern<T = unknown> {\n type: \"parallel\";\n /** Handler IDs (agents or tasks) to run in parallel (can repeat for multiple instances) */\n handlers: string[];\n /** Function to merge results from all handlers */\n merge: (results: RunResult<unknown>[]) => T | Promise<T>;\n /** Minimum successful results required. @default handlers.length */\n minSuccess?: number;\n /** Overall timeout (ms) */\n timeout?: number;\n}\n\n/** Sequential execution pattern - pipeline of handlers */\nexport interface SequentialPattern<T = unknown> {\n type: \"sequential\";\n /** Handler IDs (agents or tasks) in execution order */\n handlers: string[];\n /** Transform output to next input. @default JSON.stringify */\n transform?: (output: unknown, handlerId: string, index: number) => string;\n /** Final result extractor */\n extract?: (output: unknown) => T;\n /** Continue on error. @default false */\n continueOnError?: boolean;\n /** Checkpoint configuration for mid-execution fault tolerance */\n checkpoint?: PatternCheckpointConfig;\n}\n\n/** Supervisor pattern - one agent directs others */\nexport interface SupervisorPattern<T = unknown> {\n type: \"supervisor\";\n /** Supervisor agent ID */\n supervisor: string;\n /** Worker agent IDs */\n workers: string[];\n /** Maximum delegation rounds. @default 5 */\n maxRounds?: number;\n /** Extract final result */\n extract?: (\n supervisorOutput: unknown,\n workerResults: RunResult<unknown>[],\n ) => T;\n /** Checkpoint configuration for mid-execution fault tolerance */\n checkpoint?: PatternCheckpointConfig;\n}\n\n/** Record of a single reflection iteration (for score history) */\nexport interface ReflectIterationRecord {\n iteration: number;\n passed: boolean;\n score?: number;\n feedback?: string;\n durationMs: number;\n producerTokens: number;\n evaluatorTokens: number;\n}\n\n/**\n * Reflect pattern - produce, evaluate, retry with feedback.\n * @see reflect — factory helper\n * @see ReflectIterationRecord — per-iteration history entries\n */\nexport interface ReflectPattern<T = unknown> {\n type: \"reflect\";\n /** Producer handler ID (agent or task) */\n handler: string;\n /** Evaluator agent ID (receives output as input) */\n evaluator: string;\n /** Maximum iterations. @default 2 */\n maxIterations?: number;\n /** Parse evaluator output into ReflectionEvaluation. @default JSON.parse */\n parseEvaluation?: (output: unknown) => ReflectionEvaluation;\n /** Build retry input from original input + feedback */\n buildRetryInput?: (\n input: string,\n feedback: string,\n iteration: number,\n ) => string;\n /** Extract result from raw producer output. Unlike race's extract (which receives RunResult), this receives the output directly since the producer is already selected. */\n extract?: (output: unknown) => T;\n /** Behavior when maxIterations exhausted. @default \"accept-last\" */\n onExhausted?: \"accept-last\" | \"accept-best\" | \"throw\";\n /** Callback fired after each iteration with score/feedback data. @see ReflectIterationRecord */\n onIteration?: (record: ReflectIterationRecord) => void;\n /** AbortSignal for external cancellation of the reflection loop */\n signal?: AbortSignal;\n /** Overall timeout (ms). Creates an internal AbortSignal. */\n timeout?: number;\n /** Score threshold for acceptance. Number or function of iteration. When set, evaluator score >= threshold is treated as passed. */\n threshold?: number | ((iteration: number) => number);\n /** Checkpoint configuration for mid-execution fault tolerance */\n checkpoint?: PatternCheckpointConfig;\n}\n\n/**\n * Race pattern - first successful agent wins, rest cancelled.\n * @see race — factory helper\n * @see RaceResult — return type\n */\nexport interface RacePattern<T = unknown> {\n type: \"race\";\n /** Handler IDs (agents or tasks) to race */\n handlers: string[];\n /** Extract result from winning RunResult (receives full RunResult for access to tokens/metadata). @default output field */\n extract?: (result: RunResult<unknown>) => T;\n /** Overall timeout (ms) */\n timeout?: number;\n /** Require N successful results before resolving. @default 1 */\n minSuccess?: number;\n /** AbortSignal for external cancellation */\n signal?: AbortSignal;\n}\n\n/** Return type from debate pattern execution */\nexport interface DebateResult<T = unknown> {\n winnerId: string;\n result: T;\n rounds: Array<{\n proposals: Array<{ agentId: string; output: unknown }>;\n judgement: { winnerId: string; feedback?: string; score?: number };\n }>;\n}\n\n/** Individual result entry returned when minSuccess > 1 */\nexport interface RaceSuccessEntry<T = unknown> {\n agentId: string;\n result: T;\n}\n\n/** Return type from race pattern execution */\nexport interface RaceResult<T = unknown> {\n winnerId: string;\n result: T;\n allResults?: Array<RaceSuccessEntry<T>>;\n}\n\n/**\n * Debate pattern - agents compete, evaluator judges across rounds.\n * @see debate — factory helper\n * @see runDebate — imperative API\n * @see DebateResult — return type\n */\nexport interface DebatePattern<T = unknown> {\n type: \"debate\";\n /** Handler IDs (agents or tasks) that will generate competing proposals */\n handlers: string[];\n /** Evaluator agent ID that judges proposals */\n evaluator: string;\n /** Maximum rounds of debate. @default 2 */\n maxRounds?: number;\n /** Extract final result from the winning proposal */\n extract?: (output: unknown) => T;\n /** Parse evaluator output. @default JSON.parse expecting `{ winnerId, feedback }` */\n parseJudgement?: (output: unknown) => {\n winnerId: string;\n feedback?: string;\n score?: number;\n };\n /** AbortSignal for external cancellation */\n signal?: AbortSignal;\n /** Overall timeout (ms). Creates an internal AbortSignal. */\n timeout?: number;\n /** Checkpoint configuration for mid-execution fault tolerance */\n checkpoint?: PatternCheckpointConfig;\n}\n\n/** Re-export types consumed by tests / external consumers */\nexport type { DagPattern, DagExecutionContext } from \"./types.js\";\n\n/** Re-export goal types consumed by tests / external consumers */\nexport type {\n GoalPattern,\n GoalNode,\n GoalResult,\n GoalStepMetrics,\n GoalMetrics,\n AgentSelectionStrategy,\n RelaxationTier,\n RelaxationStrategy,\n RelaxationRecord,\n RelaxationContext,\n} from \"./types.js\";\n\n/** Union of all patterns */\nexport type ExecutionPattern<T = unknown> =\n | ParallelPattern<T>\n | SequentialPattern<T>\n | SupervisorPattern<T>\n | DagPattern<T>\n | ReflectPattern<T>\n | RacePattern<T>\n | DebatePattern<T>\n | GoalPattern<T>;\n\n// ============================================================================\n// Handoff Types\n// ============================================================================\n\n/** Handoff request between agents */\nexport interface HandoffRequest {\n id: string;\n fromAgent: string;\n toAgent: string;\n input: string;\n context?: Record<string, unknown>;\n requestedAt: number;\n}\n\n/** Handoff result */\nexport interface HandoffResult {\n request: HandoffRequest;\n result: RunResult<unknown>;\n completedAt: number;\n}\n\n// ============================================================================\n// Multi-Agent Orchestrator Types\n// ============================================================================\n\n/** Run agent requirement */\nexport interface RunAgentRequirement extends Requirement {\n type: \"RUN_AGENT\";\n agent: string;\n input: string;\n context?: Record<string, unknown>;\n}\n\n/** Read-only context passed to task functions */\nexport interface TaskContext {\n /** The ID of this task */\n taskId: string;\n /** Conversation history from orchestrator memory (read-only deep copy) */\n memory: ReadonlyArray<{ role: string; content: string }>;\n /** Current scratchpad state (read-only deep copy) */\n scratchpad: Readonly<Record<string, unknown>>;\n /** Read the state of any registered agent or task (status, lastOutput, lastError, totalTokens) */\n readAgentState: (nodeId: string) =>\n | Readonly<{\n status: string;\n lastOutput?: string;\n lastError?: string;\n totalTokens: number;\n }>\n | undefined;\n /** Report intermediate progress (0-100) for DevTools timeline */\n reportProgress: (percent: number, message?: string) => void;\n}\n\n/** Configuration for a registered task (imperative code) */\nexport interface TaskRegistration {\n /** The function to execute. Receives input, abort signal, and context. */\n run: (\n input: string,\n signal: AbortSignal,\n context: TaskContext,\n ) => unknown | Promise<unknown>;\n /** Display label for DevTools graph. Defaults to task ID. */\n label?: string;\n /** Description for DevTools tooltip/detail panel. */\n description?: string;\n /** Timeout (ms) */\n timeout?: number;\n /** Max concurrent executions of this task. @default 1 */\n maxConcurrent?: number;\n /** Optional retry configuration for transient failures */\n retry?: {\n /** Max number of attempts (including the first try) */\n attempts: number;\n /** Backoff strategy between retries. @default 'fixed' */\n backoff?: \"fixed\" | \"exponential\";\n /** Base delay between retries (ms). @default 1000 */\n delayMs?: number;\n };\n}\n\n/** Multi-agent orchestrator options */\nexport interface MultiAgentOrchestratorOptions {\n /** Base run function */\n runner: AgentRunner;\n /** Registered agents */\n agents: AgentRegistry;\n /** Imperative code tasks, referenced by ID in patterns (same namespace as agents) */\n tasks?: Record<string, TaskRegistration>;\n /** Execution patterns */\n patterns?: Record<string, ExecutionPattern>;\n /** Handoff callbacks */\n onHandoff?: (request: HandoffRequest) => void;\n /** Handoff completion callbacks */\n onHandoffComplete?: (result: HandoffResult) => void;\n /** Maximum number of handoff results to retain. @default 1000 */\n maxHandoffHistory?: number;\n /** Debug mode — `true` for default debug, or config object for advanced options */\n debug?: boolean | import(\"./types.js\").OrchestratorDebugConfig;\n /** Orchestrator-level guardrails (applied to all agents) */\n guardrails?: GuardrailsConfig;\n /** Lifecycle hooks */\n hooks?: MultiAgentLifecycleHooks;\n /** Shared memory across all agents */\n memory?: AgentMemory;\n /** Default retry config for all agents (per-agent overrides this) */\n agentRetry?: AgentRetryConfig;\n /** Maximum token budget across all agent runs */\n maxTokenBudget?: number;\n /** Fires when token usage reaches this percentage of maxTokenBudget (0-1). @default 0.8 */\n budgetWarningThreshold?: number;\n /** Callback when budget warning threshold is reached */\n onBudgetWarning?: (event: {\n currentTokens: number;\n maxBudget: number;\n percentage: number;\n }) => void;\n /** Plugins to attach to the underlying Directive System */\n plugins?: Plugin[];\n /** Callback for approval requests */\n onApprovalRequest?: (request: ApprovalRequest) => void;\n /** Auto-approve tool calls. @default true */\n autoApproveToolCalls?: boolean;\n /** Approval timeout in milliseconds. @default 300000 */\n approvalTimeoutMs?: number;\n /** Orchestrator-level constraints */\n constraints?: Record<string, OrchestratorConstraint<Record<string, unknown>>>;\n /** Orchestrator-level resolvers */\n resolvers?: Record<\n string,\n OrchestratorResolver<Record<string, unknown>, Requirement>\n >;\n /** Orchestrator-level circuit breaker */\n circuitBreaker?: CircuitBreaker;\n /** Self-healing configuration for automatic agent rerouting */\n selfHealing?: MultiAgentSelfHealingConfig;\n /** Checkpoint store for persistent state */\n checkpointStore?: CheckpointStore;\n /** Breakpoints for human-in-the-loop pause/inspect/modify */\n breakpoints?: BreakpointConfig<MultiAgentBreakpointType>[];\n /** Callback when a breakpoint fires */\n onBreakpoint?: (request: BreakpointRequest) => void;\n /** Timeout for breakpoint resolution (ms). @default 300000 */\n breakpointTimeoutMs?: number;\n /** Cross-agent derivation functions — compute values from combined agent states */\n derive?: Record<string, CrossAgentDerivationFn>;\n /** Shared scratchpad configuration */\n scratchpad?: { init: Record<string, unknown> };\n}\n\n/** Multi-agent state in facts */\nexport interface MultiAgentState {\n /** Namespace for each agent's state */\n __agents: Record<\n string,\n {\n status: \"idle\" | \"running\" | \"completed\" | \"error\";\n lastInput?: string;\n lastOutput?: unknown;\n lastError?: string;\n runCount: number;\n totalTokens: number;\n }\n >;\n /** Pending handoffs */\n __handoffs: HandoffRequest[];\n /** Completed handoffs */\n __handoffResults: HandoffResult[];\n}\n\n/** Per-call options for multi-agent runAgent/run */\nexport interface MultiAgentRunCallOptions extends RunOptions {\n /** Override structured output schema for this call. Set to `null` to opt out of per-agent schema. */\n outputSchema?: SafeParseable<unknown> | null;\n /** Override max schema retries for this call. */\n maxSchemaRetries?: number;\n /** Pattern ID that initiated this run (for lifecycle hooks). Set internally by pattern executors. */\n patternId?: string;\n}\n\n/** Multi-agent orchestrator instance */\nexport interface MultiAgentOrchestrator {\n /** The underlying Directive System */\n // biome-ignore lint/suspicious/noExplicitAny: System type varies per configuration\n system: System<any>;\n /** Combined facts from all agent modules + coordinator */\n facts: Record<string, unknown>;\n /** Run a single agent */\n runAgent<T>(\n agentId: string,\n input: string,\n options?: MultiAgentRunCallOptions,\n ): Promise<RunResult<T>>;\n /** Run an agent with streaming support */\n runAgentStream<T>(\n agentId: string,\n input: string,\n options?: { signal?: AbortSignal },\n ): OrchestratorStreamResult<T>;\n /**\n * Run an execution pattern by its registered pattern ID.\n *\n * Note: For race and debate patterns, `runPattern` returns only the extracted result value.\n * Use `runRace()` or `runDebate()` to access full results including `winnerId` and `allResults`.\n */\n runPattern<T>(patternId: string, input: string): Promise<T>;\n /** Run agents in parallel. Note: parallel does not support checkpoint/resume (single-step pattern). */\n runParallel<T>(\n agentIds: string[],\n inputs: string | string[],\n merge: (results: RunResult<unknown>[]) => T | Promise<T>,\n options?: { minSuccess?: number; timeout?: number },\n ): Promise<T>;\n /** Run agents sequentially */\n runSequential<T>(\n agentIds: string[],\n initialInput: string,\n options?: {\n transform?: (output: unknown, agentId: string, index: number) => string;\n },\n ): Promise<RunResult<T>[]>;\n /** Request a handoff between agents */\n handoff(\n fromAgent: string,\n toAgent: string,\n input: string,\n context?: Record<string, unknown>,\n ): Promise<RunResult<unknown>>;\n /** Approve a pending request */\n approve(requestId: string): void;\n /** Reject a pending request */\n reject(requestId: string, reason?: string): void;\n /** Pause all agents */\n pause(): void;\n /** Resume agents */\n resume(): void;\n /** Total tokens consumed across all agents */\n readonly totalTokens: number;\n /** Wait until all agents are idle */\n waitForIdle(timeoutMs?: number): Promise<void>;\n /** Alias for runAgent */\n run<T>(\n agentId: string,\n input: string,\n options?: MultiAgentRunCallOptions,\n ): Promise<RunResult<T>>;\n /** Alias for runAgentStream */\n runStream<T>(\n agentId: string,\n input: string,\n options?: { signal?: AbortSignal },\n ): OrchestratorStreamResult<T>;\n /** Register a new agent dynamically */\n registerAgent(agentId: string, registration: AgentRegistration): void;\n /** Unregister an agent (must be idle) */\n unregisterAgent(agentId: string): void;\n /** Get registered agent IDs */\n getAgentIds(): string[];\n /** Register a new task dynamically */\n registerTask(taskId: string, registration: TaskRegistration): void;\n /** Unregister a task */\n unregisterTask(taskId: string): void;\n /** Get registered task IDs */\n getTaskIds(): string[];\n /** Get task registry info (labels + descriptions) */\n getTaskRegistry(): Record<string, { label?: string; description?: string }>;\n /** Get task state */\n getTaskState(taskId: string):\n | {\n status: string;\n lastOutput?: unknown;\n lastError?: string;\n startTime?: number;\n durationMs?: number;\n }\n | undefined;\n /** Get all task states */\n getAllTaskStates(): Record<\n string,\n {\n status: string;\n lastOutput?: unknown;\n lastError?: string;\n startTime?: number;\n durationMs?: number;\n }\n >;\n /** Get all handler IDs (agents + tasks combined) */\n getNodeIds(): string[];\n /** Get agent state */\n getAgentState(\n agentId: string,\n ): MultiAgentState[\"__agents\"][string] | undefined;\n /** Get all agent states */\n getAllAgentStates(): Record<string, MultiAgentState[\"__agents\"][string]>;\n /** Get pending handoffs */\n getPendingHandoffs(): HandoffRequest[];\n /** Reset all agent states */\n reset(): void;\n /** Debug timeline (null when debug is false) */\n readonly timeline: DebugTimeline | null;\n /** Health monitor (null when selfHealing is not configured) */\n readonly healthMonitor: HealthMonitor | null;\n /** Create a checkpoint of the current state */\n checkpoint(options?: { label?: string }): Promise<Checkpoint>;\n /** Restore from a checkpoint */\n restore(\n checkpoint: Checkpoint,\n options?: { restoreTimeline?: boolean },\n ): void;\n /** Run multiple agents with multiplexed streaming */\n runParallelStream<T>(\n agentIds: string[],\n inputs: string | string[],\n merge: (results: RunResult<unknown>[]) => T | Promise<T>,\n options?: { minSuccess?: number; timeout?: number; signal?: AbortSignal },\n ): MultiplexedStreamResult<T>;\n /** Resume a paused breakpoint */\n resumeBreakpoint(id: string, modifications?: BreakpointModifications): void;\n /** Cancel a paused breakpoint */\n cancelBreakpoint(id: string, reason?: string): void;\n /** Get pending breakpoints */\n getPendingBreakpoints(): BreakpointRequest[];\n /** Race multiple agents — first successful result wins, rest cancelled. Note: race does not support checkpoint/resume (single-step pattern). */\n runRace<T>(\n agentIds: string[],\n input: string,\n options?: {\n extract?: (result: RunResult<unknown>) => T;\n timeout?: number;\n minSuccess?: number;\n signal?: AbortSignal;\n },\n ): Promise<RaceResult<T>>;\n /** Run a reflect pattern imperatively (no pre-registration needed) */\n runReflect<T>(\n producerId: string,\n evaluatorId: string,\n input: string,\n options?: {\n maxIterations?: number;\n parseEvaluation?: (output: unknown) => ReflectionEvaluation;\n buildRetryInput?: (\n input: string,\n feedback: string,\n iteration: number,\n ) => string;\n extract?: (output: unknown) => T;\n onExhausted?: \"accept-last\" | \"accept-best\" | \"throw\";\n onIteration?: (record: ReflectIterationRecord) => void;\n signal?: AbortSignal;\n timeout?: number;\n threshold?: number | ((iteration: number) => number);\n },\n ): Promise<{\n result: T;\n iterations: number;\n history: ReflectIterationRecord[];\n exhausted: boolean;\n }>;\n /** Run a debate imperatively (no pre-registration needed) */\n runDebate<T>(\n agentIds: string[],\n evaluatorId: string,\n input: string,\n options?: {\n maxRounds?: number;\n extract?: (output: unknown) => T;\n parseJudgement?: (output: unknown) => {\n winnerId: string;\n feedback?: string;\n score?: number;\n };\n signal?: AbortSignal;\n timeout?: number;\n },\n ): Promise<DebateResult<T>>;\n /** Run a goal pattern imperatively — declare desired state, let the runtime resolve */\n runGoal<T>(\n nodes: Record<string, GoalNode>,\n initialInput: string | Record<string, unknown>,\n when: (facts: Record<string, unknown>) => boolean,\n options?: {\n satisfaction?: (facts: Record<string, unknown>) => number;\n maxSteps?: number;\n extract?: (facts: Record<string, unknown>) => T;\n timeout?: number;\n signal?: AbortSignal;\n selectionStrategy?: AgentSelectionStrategy;\n relaxation?: RelaxationTier[];\n onStep?: GoalPattern[\"onStep\"];\n onStall?: GoalPattern[\"onStall\"];\n checkpoint?: PatternCheckpointConfig;\n },\n ): Promise<GoalResult<T>>;\n /** Resume a goal pattern from a saved checkpoint */\n resumeGoal<T>(\n checkpointState: GoalCheckpointState,\n pattern: GoalPattern<T>,\n ): Promise<GoalResult<T>>;\n /** Resume a sequential pattern from a saved checkpoint */\n resumeSequential<T>(\n checkpointState: SequentialCheckpointState,\n pattern: SequentialPattern<T>,\n ): Promise<T>;\n /** Resume a supervisor pattern from a saved checkpoint */\n resumeSupervisor<T>(\n checkpointState: SupervisorCheckpointState,\n pattern: SupervisorPattern<T>,\n options?: { input?: string },\n ): Promise<T>;\n /** Resume a reflect pattern from a saved checkpoint */\n resumeReflect<T>(\n checkpointState: ReflectCheckpointState,\n pattern: ReflectPattern<T>,\n options?: { input?: string },\n ): Promise<T>;\n /** Resume a debate pattern from a saved checkpoint */\n resumeDebate<T>(\n checkpointState: DebateCheckpointState,\n pattern: DebatePattern<T>,\n ): Promise<DebateResult<T>>;\n /** Resume a DAG pattern from a saved checkpoint */\n resumeDag<T>(\n checkpointState: DagCheckpointState,\n pattern: DagPattern<T>,\n options?: { input?: string },\n ): Promise<T>;\n /** Replay from a saved checkpoint (auto-detects pattern type) */\n replay<T>(\n checkpointId: string,\n pattern: ExecutionPattern,\n options?: { input?: string },\n ): Promise<T>;\n /**\n * Get reflection iteration history from last runReflectPattern call.\n */\n getLastReflectionHistory(): ReflectIterationRecord[] | null;\n /** Cross-agent derived values (frozen snapshot). Empty when derive not configured. */\n readonly derived: Record<string, unknown>;\n /** Subscribe to cross-agent derivation changes */\n onDerivedChange(callback: (id: string, value: unknown) => void): () => void;\n /** Shared scratchpad (null when not configured) */\n readonly scratchpad: Scratchpad | null;\n /** Dispose of the orchestrator, resetting all state */\n dispose(): void;\n}\n\n/** Built-in pause requirement type */\ninterface PauseBudgetExceededReq extends Requirement {\n type: \"__PAUSE_BUDGET_EXCEEDED\";\n}\n\n/** Built-in RUN_AGENT requirement guard */\nconst isRunAgentReq = requirementGuard<RunAgentRequirement>(\"RUN_AGENT\");\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Create a multi-agent orchestrator backed by a Directive System.\n *\n * Each registered agent becomes a namespaced Directive module with reactive state,\n * constraint evaluation, guardrails, streaming, approval, memory, retry, budget,\n * hooks, and time-travel debugging -- all features at parity with {@link createAgentOrchestrator}.\n *\n * @param options - Orchestrator configuration including runner, agent registry, patterns, guardrails, and plugins.\n * @returns A {@link MultiAgentOrchestrator} instance with `runAgent`, `runPattern`, `handoff`, and checkpoint APIs.\n *\n * @example\n * ```typescript\n * const orchestrator = createMultiAgentOrchestrator({\n * runner,\n * agents: {\n * researcher: { agent: researchAgent, maxConcurrent: 3 },\n * writer: { agent: writerAgent },\n * reviewer: { agent: reviewerAgent },\n * },\n * guardrails: {\n * input: [detectPII],\n * output: [checkToxicity],\n * },\n * hooks: {\n * onAgentStart: ({ agentId, input }) => console.log(`${agentId}: ${input}`),\n * },\n * maxTokenBudget: 50000,\n * debug: true,\n * });\n *\n * // Run with full guardrails + approval + streaming\n * const result = await orchestrator.runAgent('researcher', 'What is AI?');\n *\n * // Stream agent output\n * const { stream } = orchestrator.runAgentStream('writer', 'Write about AI');\n * for await (const chunk of stream) {\n * if (chunk.type === 'token') process.stdout.write(chunk.data);\n * }\n * ```\n *\n * @throws If a pattern references an agent that is not in the registry\n * @throws If autoApproveToolCalls is false but no onApprovalRequest callback is provided\n * @public\n */\nexport function createMultiAgentOrchestrator(\n options: MultiAgentOrchestratorOptions,\n): MultiAgentOrchestrator {\n const {\n runner,\n agents: inputAgents,\n patterns = {},\n onHandoff,\n onHandoffComplete,\n maxHandoffHistory = 1000,\n debug: rawDebug = false,\n guardrails = {},\n hooks = {},\n memory: sharedMemory,\n agentRetry: defaultAgentRetry,\n maxTokenBudget,\n plugins = [],\n onApprovalRequest,\n autoApproveToolCalls = true,\n approvalTimeoutMs = 300000,\n constraints: userConstraints = {},\n resolvers: userResolvers = {},\n circuitBreaker: orchestratorCircuitBreaker,\n budgetWarningThreshold = 0.8,\n onBudgetWarning,\n selfHealing,\n checkpointStore,\n breakpoints: breakpointConfigs = [],\n onBreakpoint,\n breakpointTimeoutMs = 300000,\n derive: userDerivations,\n scratchpad: scratchpadConfig,\n tasks: inputTasks = {},\n } = options;\n\n // Normalize debug config\n const debug = typeof rawDebug === \"object\" ? true : !!rawDebug;\n const MAX_VERBOSE_LENGTH = 5000;\n\n // Shallow copy so registerAgent/unregisterAgent don't mutate the caller's object\n const agents: AgentRegistry = { ...inputAgents };\n\n // Task registry (shallow copy for same reason as agents)\n const tasks: Record<string, TaskRegistration> = { ...inputTasks };\n\n // Task state tracking (parallel to agentStates)\n const taskStates: Record<\n string,\n {\n status: string;\n lastOutput?: unknown;\n lastError?: string;\n startTime?: number;\n durationMs?: number;\n }\n > = Object.create(null);\n for (const taskId of Object.keys(tasks)) {\n taskStates[taskId] = { status: \"idle\" };\n }\n\n // Task semaphores are created after validation (below)\n const taskSemaphores = new Map<string, Semaphore>();\n\n // Enforce approval workflow configuration\n if (!autoApproveToolCalls && !onApprovalRequest) {\n throw new Error(\n \"[Directive MultiAgent] Invalid approval configuration: autoApproveToolCalls is false but no onApprovalRequest callback provided. \" +\n \"Tool calls would wait for approval indefinitely. Either:\\n\" +\n \" - Set autoApproveToolCalls: true to auto-approve all tool calls\\n\" +\n \" - Provide an onApprovalRequest callback to handle approvals programmatically\",\n );\n }\n\n // Validate budget warning threshold\n if (budgetWarningThreshold < 0 || budgetWarningThreshold > 1) {\n throw new Error(\n `[Directive MultiAgent] budgetWarningThreshold must be between 0 and 1, got ${budgetWarningThreshold}`,\n );\n }\n\n // Validate reserved agent IDs\n const RESERVED_IDS = new Set([\n \"__coord\",\n \"__proto__\",\n \"constructor\",\n \"prototype\",\n \"toString\",\n \"valueOf\",\n \"hasOwnProperty\",\n ]);\n for (const agentId of Object.keys(agents)) {\n if (RESERVED_IDS.has(agentId)) {\n throw new Error(\n `[Directive MultiAgent] Agent ID \"${agentId}\" is reserved and cannot be used`,\n );\n }\n }\n for (const [taskId, taskReg] of Object.entries(tasks)) {\n if (!taskId || taskId.trim() !== taskId) {\n throw new Error(\n `[Directive MultiAgent] Task ID must be a non-empty trimmed string, got \"${taskId}\"`,\n );\n }\n if (RESERVED_IDS.has(taskId)) {\n throw new Error(\n `[Directive MultiAgent] Task ID \"${taskId}\" is reserved and cannot be used`,\n );\n }\n // Validate timeout and maxConcurrent\n if (\n taskReg.timeout !== undefined &&\n (!Number.isFinite(taskReg.timeout) || taskReg.timeout <= 0)\n ) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" timeout must be a finite number > 0`,\n );\n }\n if (\n taskReg.maxConcurrent !== undefined &&\n (!Number.isFinite(taskReg.maxConcurrent) ||\n taskReg.maxConcurrent < 1 ||\n !Number.isInteger(taskReg.maxConcurrent))\n ) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" maxConcurrent must be a finite integer >= 1`,\n );\n }\n // Validate retry configuration\n if (taskReg.retry) {\n const { attempts, delayMs } = taskReg.retry;\n if (!Number.isFinite(attempts) || attempts < 1) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" retry attempts must be a finite number >= 1`,\n );\n }\n if (delayMs !== undefined && (!Number.isFinite(delayMs) || delayMs < 0)) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" retry delayMs must be a finite number >= 0`,\n );\n }\n }\n }\n\n // Create task semaphores (after validation passes)\n for (const [taskId, reg] of Object.entries(tasks)) {\n taskSemaphores.set(taskId, new Semaphore(reg.maxConcurrent ?? 1));\n }\n\n // Validate no ID collisions between agents and tasks\n for (const taskId of Object.keys(tasks)) {\n if (agents[taskId]) {\n throw new Error(\n `[Directive MultiAgent] ID \"${taskId}\" is registered as both an agent and a task. IDs must be unique across both registries.`,\n );\n }\n }\n\n // Validate that all pattern handlers exist in the combined registry\n const registeredAgentIds = new Set([\n ...Object.keys(agents),\n ...Object.keys(tasks),\n ]);\n const missingAgents: Array<{ patternId: string; agentId: string }> = [];\n\n for (const [patternId, pattern] of Object.entries(patterns)) {\n const agentsToCheck: string[] = [];\n\n switch (pattern.type) {\n case \"parallel\":\n agentsToCheck.push(...pattern.handlers);\n break;\n case \"sequential\":\n agentsToCheck.push(...pattern.handlers);\n break;\n case \"supervisor\":\n agentsToCheck.push(pattern.supervisor, ...pattern.workers);\n break;\n case \"dag\":\n for (const node of Object.values(pattern.nodes)) {\n agentsToCheck.push(node.handler);\n }\n break;\n case \"reflect\":\n agentsToCheck.push(pattern.handler, pattern.evaluator);\n break;\n case \"race\":\n agentsToCheck.push(...pattern.handlers);\n break;\n case \"debate\":\n agentsToCheck.push(\n ...(pattern as DebatePattern).handlers,\n (pattern as DebatePattern).evaluator,\n );\n break;\n }\n\n for (const agentId of agentsToCheck) {\n if (!registeredAgentIds.has(agentId)) {\n missingAgents.push({ patternId, agentId });\n }\n }\n }\n\n if (missingAgents.length > 0) {\n const details = missingAgents\n .map(\n ({ patternId, agentId }) =>\n ` - Pattern \"${patternId}\" references unknown agent \"${agentId}\"`,\n )\n .join(\"\\n\");\n throw new Error(\n `[Directive MultiAgent] Pattern validation failed. The following agents are not registered:\\n${details}\\n\\nRegistered agents: ${[...registeredAgentIds].join(\", \") || \"(none)\"}`,\n );\n }\n\n // Validate DAG patterns for cycles\n for (const [patternId, pattern] of Object.entries(patterns)) {\n if (pattern.type === \"dag\") {\n validateDagAcyclic(patternId, pattern.nodes);\n }\n }\n\n // ---- Debug Timeline setup ----\n let timeline: DebugTimeline | null = null;\n let timelinePlugin: ReturnType<typeof createDebugTimelinePlugin> | null =\n null;\n if (debug) {\n timeline = createDebugTimeline({\n getSnapshotId: () => {\n try {\n return (system as any).debug?.currentIndex ?? null;\n } catch {\n return null;\n }\n },\n goToSnapshot: (snapshotId: number) => {\n try {\n (system as any).debug?.goTo?.(snapshotId);\n } catch {\n // System may not support goTo\n }\n },\n });\n }\n\n // ---- Health Monitor setup ----\n let healthMonitorInstance: HealthMonitor | null = null;\n let roundRobinCounters: Map<string, number> | null = null;\n if (selfHealing) {\n healthMonitorInstance = createHealthMonitor(selfHealing.healthMonitor);\n if (selfHealing.selectionStrategy === \"round-robin\") {\n roundRobinCounters = new Map();\n }\n }\n\n /** Safe hook caller — user-provided hooks must never crash the orchestrator */\n function fireHook<K extends keyof MultiAgentLifecycleHooks>(\n name: K,\n event: Parameters<NonNullable<MultiAgentLifecycleHooks[K]>>[0],\n ): void {\n try {\n (hooks[name] as ((e: typeof event) => void) | undefined)?.(event);\n } catch (hookError) {\n if (debug) {\n console.debug(`[Directive MultiAgent] hooks.${name} threw:`, hookError);\n }\n }\n }\n\n // ---- Coordinator Module ----\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic schema construction\n const coordFacts: Record<string, any> = {\n __globalTokens: t.number(),\n __status: t.string(),\n __handoffs: t.array() as unknown as ReturnType<typeof t.array>,\n __handoffResults: t.array() as unknown as ReturnType<typeof t.array>,\n __budgetWarningFired: t.boolean(),\n };\n\n // Add scratchpad fact to coordinator schema if configured\n if (scratchpadConfig) {\n coordFacts[SCRATCHPAD_KEY] = t.object() as unknown;\n }\n\n // Add __derived bridge fact so constraints can read derivation values via facts.__derived\n if (userDerivations && Object.keys(userDerivations).length > 0) {\n coordFacts.__derived = t.object() as unknown;\n }\n\n const coordSchema = {\n facts: coordFacts,\n derivations: {},\n events: {},\n requirements: {},\n } satisfies ModuleSchema;\n\n // Convert orchestrator-level constraints\n // biome-ignore lint/suspicious/noExplicitAny: Constraint types complex\n const coordConstraints: Record<string, any> =\n convertOrchestratorConstraints(userConstraints);\n\n // Add built-in budget constraint — reads coordinator fact reactively\n if (maxTokenBudget) {\n coordConstraints.__budgetLimit = {\n priority: 100,\n // biome-ignore lint/suspicious/noExplicitAny: Facts type varies\n when: (facts: any) => {\n const tokens = getBridgeFact<number>(facts, \"__globalTokens\");\n\n return tokens > maxTokenBudget;\n },\n require: { type: \"__PAUSE_BUDGET_EXCEEDED\" } as PauseBudgetExceededReq,\n };\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Resolver types complex\n const coordResolvers: Record<string, any> = Object.create(null);\n\n // Convert user-provided orchestrator-level resolvers\n for (const [id, resolver] of Object.entries(userResolvers)) {\n coordResolvers[id] = {\n requirement: resolver.requirement,\n key: resolver.key,\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async (req: Requirement, context: any) => {\n const state = getOrchestratorState(context.facts);\n const combinedFacts = {\n ...context.facts,\n ...state,\n } as unknown as Record<string, unknown> & OrchestratorState;\n\n const resolverCtx: OrchestratorResolverContext<\n Record<string, unknown>\n > = {\n facts: combinedFacts,\n runAgent: async <T>(\n agent: AgentLike,\n input: string,\n opts?: RunOptions,\n ) => {\n return runner<T>(agent, input, opts);\n },\n signal: context.signal,\n };\n\n return resolver.resolve(req, resolverCtx);\n },\n };\n }\n\n // Built-in pause resolver\n coordResolvers.__pause = {\n requirement: requirementGuard<PauseBudgetExceededReq>(\n \"__PAUSE_BUDGET_EXCEEDED\",\n ),\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async () => {\n globalStatus = \"paused\";\n if (debug) {\n console.debug(\n \"[Directive MultiAgent] Budget exceeded — all agents paused\",\n );\n }\n },\n };\n\n // Built-in RUN_AGENT resolver\n coordResolvers.__runAgent = {\n requirement: isRunAgentReq,\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async (req: RunAgentRequirement) => {\n await runSingleAgent(req.agent, req.input);\n },\n };\n\n const coordinatorModule = createModule(\"__coord\", {\n schema: coordSchema,\n init: (facts) => {\n setBridgeFact(facts, \"__globalTokens\", 0);\n setBridgeFact(facts, \"__status\", \"idle\");\n setBridgeFact(facts, \"__handoffs\", []);\n setBridgeFact(facts, \"__handoffResults\", []);\n setBridgeFact(facts, \"__budgetWarningFired\", false);\n if (scratchpadConfig) {\n setBridgeFact(facts, SCRATCHPAD_KEY, { ...scratchpadConfig.init });\n }\n // Derived values initialized via recomputeDerivations() after system creation\n },\n constraints: coordConstraints,\n resolvers: coordResolvers as any,\n });\n\n // ---- Per-Agent Modules (as a map for createSystem) ----\n // biome-ignore lint/suspicious/noExplicitAny: Module types vary\n const modulesMap: Record<string, any> = Object.create(null);\n modulesMap.__coord = coordinatorModule;\n\n for (const [agentId, registration] of Object.entries(agents)) {\n // biome-ignore lint/suspicious/noExplicitAny: Constraint types complex\n const perAgentConstraints: Record<string, any> = registration.constraints\n ? convertOrchestratorConstraints(registration.constraints)\n : {};\n\n // Convert per-agent resolvers\n // biome-ignore lint/suspicious/noExplicitAny: Resolver types complex\n const perAgentResolvers: Record<string, any> = Object.create(null);\n if (registration.resolvers) {\n for (const [id, resolver] of Object.entries(registration.resolvers)) {\n perAgentResolvers[id] = {\n requirement: resolver.requirement,\n key: resolver.key,\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async (req: Requirement, context: any) => {\n const state = getOrchestratorState(context.facts);\n const combinedFacts = {\n ...context.facts,\n ...state,\n } as unknown as Record<string, unknown> & OrchestratorState;\n\n const resolverContext: OrchestratorResolverContext<\n Record<string, unknown>\n > = {\n facts: combinedFacts,\n runAgent: async <T>(\n agent: AgentLike,\n input: string,\n opts?: RunOptions,\n ) => {\n return runner<T>(agent, input, opts);\n },\n signal: context.signal,\n };\n\n return resolver.resolve(req, resolverContext);\n },\n };\n }\n }\n\n modulesMap[agentId] = createModule(agentId, {\n schema: orchestratorBridgeSchema,\n init: (facts) => {\n setAgentState(facts, {\n status: \"idle\",\n currentAgent: registration.agent.name,\n input: null,\n output: null,\n error: null,\n tokenUsage: 0,\n turnCount: 0,\n startedAt: null,\n completedAt: null,\n });\n setApprovalState(facts, { pending: [], approved: [], rejected: [] });\n setConversation(facts, []);\n setToolCalls(facts, []);\n setBreakpointState(facts, createInitialBreakpointState());\n },\n constraints: perAgentConstraints,\n resolvers:\n Object.keys(perAgentResolvers).length > 0\n ? (perAgentResolvers as any)\n : undefined,\n });\n }\n\n // ---- Create System ----\n const callbackPlugin = createCallbackPlugin(\n \"directive-multi-agent-callbacks\",\n {},\n );\n\n // Build plugins array with optional timeline plugin\n const allPlugins = [...plugins, callbackPlugin];\n if (debug && timeline) {\n // Create timeline plugin after system is available (uses lazy getSnapshotId)\n timelinePlugin = createDebugTimelinePlugin(timeline, () => {\n try {\n return (system as any).debug?.currentIndex ?? null;\n } catch {\n return null;\n }\n });\n allPlugins.push(timelinePlugin);\n }\n\n const system = createSystem({\n modules: modulesMap,\n plugins: allPlugins,\n debug: debug ? { timeTravel: true } : undefined,\n } as any);\n\n system.start();\n\n // Maximum conversation messages to retain per agent (prevent unbounded growth)\n const MAX_CONVERSATION_MESSAGES = 500;\n const MAX_TOOL_CALLS = 200;\n\n // ---- Mutable State (tracked via System facts + local) ----\n let globalTokenCount = 0;\n let globalStatus: \"idle\" | \"paused\" = \"idle\";\n let disposed = false;\n // Tracks in-flight runAgent calls (incremented synchronously before any await)\n // so waitForIdle knows when runs have been dispatched but not yet started\n let pendingRuns = 0;\n // Reflection score history — updated after each runReflectPattern call\n let lastReflectionHistory: ReflectIterationRecord[] | null = null;\n\n function assertNotDisposed(): void {\n if (disposed) {\n throw new Error(\"[Directive MultiAgent] Orchestrator has been disposed\");\n }\n }\n\n // Semaphores for concurrency control\n const semaphores = new Map<string, Semaphore>();\n for (const [agentId, reg] of Object.entries(agents)) {\n semaphores.set(agentId, new Semaphore(reg.maxConcurrent ?? 1));\n }\n\n // Agent states: lightweight local tracking for orchestrator API methods (getAgentState, etc.)\n // System facts (per-agent bridge schema) provide the rich state for constraints/resolvers/plugins.\n // Both are updated together — local state is the quick-access view, System facts drive reactivity.\n const agentStates: Record<string, MultiAgentState[\"__agents\"][string]> =\n Object.create(null);\n for (const agentId of Object.keys(agents)) {\n agentStates[agentId] = {\n status: \"idle\",\n runCount: 0,\n totalTokens: 0,\n };\n }\n\n // Handoff tracking\n const MAX_HANDOFF_RESULTS = maxHandoffHistory;\n const pendingHandoffs: HandoffRequest[] = [];\n const handoffResults: HandoffResult[] = [];\n let handoffCounter = 0;\n\n function addHandoffResult(result: HandoffResult): void {\n handoffResults.push(result);\n while (handoffResults.length > MAX_HANDOFF_RESULTS) {\n handoffResults.shift();\n }\n }\n\n // Approval request reverse index: requestId → agentId for O(1) approve/reject lookup\n const approvalRequestIndex = new Map<string, string>();\n\n // Idle waiters — notified whenever any agent's status changes\n const idleWaiters = new Set<() => void>();\n function notifyIdleWaiters(): void {\n for (const waiter of idleWaiters) {\n waiter();\n }\n }\n\n // ---- Cross-Agent Derivations ----\n const derivedValues: Record<string, unknown> = Object.create(null);\n const derivedChangeCallbacks = new Set<\n (id: string, value: unknown) => void\n >();\n\n /** Build a CrossAgentSnapshot from current state */\n function buildCrossAgentSnapshot(): CrossAgentSnapshot {\n const agentsSnap: CrossAgentSnapshot[\"agents\"] = Object.create(null);\n for (const [id, s] of Object.entries(agentStates)) {\n agentsSnap[id] = {\n status: s.status,\n lastInput: s.lastInput,\n lastOutput: s.lastOutput,\n lastError: s.lastError,\n runCount: s.runCount,\n totalTokens: s.totalTokens,\n };\n }\n\n const coordFacts = getAgentFacts(\"__coord\");\n const snapshot: CrossAgentSnapshot = {\n agents: agentsSnap,\n coordinator: {\n globalTokens: globalTokenCount,\n status: globalStatus,\n },\n };\n\n // Include scratchpad in snapshot if configured\n if (scratchpadConfig && coordFacts) {\n snapshot.scratchpad =\n getBridgeFact<Record<string, unknown>>(coordFacts, SCRATCHPAD_KEY) ??\n {};\n }\n\n return snapshot;\n }\n\n /** Recompute all cross-agent derivations */\n function recomputeDerivations(): void {\n if (!userDerivations) {\n return;\n }\n\n const snapshot = buildCrossAgentSnapshot();\n\n // Collect changed derivations and errors during the batch (fact writes only)\n type ChangedEntry = { derivId: string; newValue: unknown };\n type ErrorEntry = { derivId: string; derivError: unknown };\n const changed: ChangedEntry[] = [];\n const errors: ErrorEntry[] = [];\n\n system.batch(() => {\n for (const [derivId, derivFn] of Object.entries(userDerivations)) {\n try {\n const newValue = derivFn(snapshot);\n const oldValue = derivedValues[derivId];\n\n // Change detection: === for primitives, shallow equality for objects\n const hasChanged = !shallowEqual(newValue, oldValue);\n\n derivedValues[derivId] = newValue;\n\n if (hasChanged) {\n changed.push({ derivId, newValue });\n }\n } catch (derivError) {\n errors.push({ derivId, derivError });\n }\n }\n\n // Inject derived values into coordinator facts AFTER computation so constraints see current-cycle values\n const coordFacts = getAgentFacts(\"__coord\");\n if (coordFacts) {\n setBridgeFact(coordFacts, \"__derived\", { ...derivedValues });\n }\n });\n\n // Fire timeline records, hooks, and callbacks outside the batch\n for (const { derivId, newValue } of changed) {\n if (timeline) {\n timeline.record({\n type: \"derivation_update\",\n timestamp: Date.now(),\n snapshotId: null,\n derivationId: derivId,\n valueType: typeof newValue,\n });\n }\n\n fireHook(\"onDerivationUpdate\", {\n derivationId: derivId,\n value: newValue,\n timestamp: Date.now(),\n });\n\n for (const cb of derivedChangeCallbacks) {\n try {\n cb(derivId, newValue);\n } catch {\n // callback error is non-fatal\n }\n }\n }\n\n for (const { derivId, derivError } of errors) {\n if (debug) {\n console.warn(\n `[Directive MultiAgent] Derivation \"${derivId}\" threw:`,\n derivError,\n );\n }\n fireHook(\"onDerivationError\", {\n derivationId: derivId,\n error:\n derivError instanceof Error\n ? derivError\n : new Error(String(derivError)),\n timestamp: Date.now(),\n });\n }\n }\n\n // ---- Shared Scratchpad ----\n const scratchpadChangeCallbacks = new Set<\n (key: string, value: unknown) => void\n >();\n const scratchpadKeyCallbacks = new Map<\n string,\n Set<(key: string, value: unknown) => void>\n >();\n\n const scratchpadInstance: Scratchpad | null = scratchpadConfig\n ? {\n get(key: string): unknown {\n const coordFacts = getAgentFacts(\"__coord\");\n const data = getBridgeFact<Record<string, unknown>>(\n coordFacts,\n SCRATCHPAD_KEY,\n );\n if (data == null || !Object.hasOwn(data, key)) {\n return undefined;\n }\n\n return data[key];\n },\n\n set(key: string, value: unknown): void {\n if (\n key === \"__proto__\" ||\n key === \"constructor\" ||\n key === \"prototype\"\n ) {\n return;\n }\n\n const coordFacts = getAgentFacts(\"__coord\");\n const changedKeys = [key];\n system.batch(() => {\n const current =\n getBridgeFact<Record<string, unknown>>(\n coordFacts,\n SCRATCHPAD_KEY,\n ) ?? {};\n setBridgeFact(coordFacts, SCRATCHPAD_KEY, {\n ...current,\n [key]: value,\n });\n });\n\n notifyScratchpadChange(changedKeys, key, value);\n recomputeDerivations();\n },\n\n has(key: string): boolean {\n const coordFacts = getAgentFacts(\"__coord\");\n const data = getBridgeFact<Record<string, unknown>>(\n coordFacts,\n SCRATCHPAD_KEY,\n );\n\n return data != null && Object.hasOwn(data, key);\n },\n\n delete(key: string): void {\n if (\n key === \"__proto__\" ||\n key === \"constructor\" ||\n key === \"prototype\"\n ) {\n return;\n }\n const coordFacts = getAgentFacts(\"__coord\");\n system.batch(() => {\n const current =\n getBridgeFact<Record<string, unknown>>(\n coordFacts,\n SCRATCHPAD_KEY,\n ) ?? {};\n const { [key]: _, ...rest } = current;\n setBridgeFact(coordFacts, SCRATCHPAD_KEY, rest);\n });\n\n notifyScratchpadChange([key], key, undefined);\n recomputeDerivations();\n },\n\n update(values: Record<string, unknown>): void {\n // Filter out prototype pollution keys\n const safeValues: Record<string, unknown> = Object.create(null);\n for (const k of Object.keys(values)) {\n if (k === \"__proto__\" || k === \"constructor\" || k === \"prototype\") {\n continue;\n }\n safeValues[k] = values[k];\n }\n\n const coordFacts = getAgentFacts(\"__coord\");\n const keys = Object.keys(safeValues);\n if (keys.length === 0) {\n return;\n }\n\n system.batch(() => {\n const current =\n getBridgeFact<Record<string, unknown>>(\n coordFacts,\n SCRATCHPAD_KEY,\n ) ?? {};\n setBridgeFact(coordFacts, SCRATCHPAD_KEY, {\n ...current,\n ...safeValues,\n });\n });\n\n for (const [k, v] of Object.entries(safeValues)) {\n notifyScratchpadChange(keys, k, v);\n }\n recomputeDerivations();\n },\n\n getAll(): Record<string, unknown> {\n const coordFacts = getAgentFacts(\"__coord\");\n\n return {\n ...(getBridgeFact<Record<string, unknown>>(\n coordFacts,\n SCRATCHPAD_KEY,\n ) ?? {}),\n };\n },\n\n subscribe(\n keys: string[],\n callback: (key: string, value: unknown) => void,\n ): () => void {\n for (const key of keys) {\n if (!scratchpadKeyCallbacks.has(key)) {\n scratchpadKeyCallbacks.set(key, new Set());\n }\n scratchpadKeyCallbacks.get(key)!.add(callback);\n }\n\n return () => {\n for (const key of keys) {\n scratchpadKeyCallbacks.get(key)?.delete(callback);\n }\n };\n },\n\n onChange(callback: (key: string, value: unknown) => void): () => void {\n scratchpadChangeCallbacks.add(callback);\n\n return () => {\n scratchpadChangeCallbacks.delete(callback);\n };\n },\n\n reset(): void {\n if (!scratchpadConfig) {\n return;\n }\n const coordFacts = getAgentFacts(\"__coord\");\n system.batch(() => {\n setBridgeFact(coordFacts, SCRATCHPAD_KEY, {\n ...scratchpadConfig.init,\n });\n });\n },\n }\n : null;\n\n function notifyScratchpadChange(\n allKeys: string[],\n key: string,\n value: unknown,\n ): void {\n // Fire key-specific callbacks\n const keyCbs = scratchpadKeyCallbacks.get(key);\n if (keyCbs) {\n for (const cb of keyCbs) {\n try {\n cb(key, value);\n } catch {\n /* non-fatal */\n }\n }\n }\n\n // Fire global change callbacks\n for (const cb of scratchpadChangeCallbacks) {\n try {\n cb(key, value);\n } catch {\n /* non-fatal */\n }\n }\n\n // Record timeline event (once per batch of keys, not per key)\n if (timeline && key === allKeys[allKeys.length - 1]) {\n timeline.record({\n type: \"scratchpad_update\",\n timestamp: Date.now(),\n snapshotId: null,\n keys: allKeys,\n });\n }\n\n // Fire lifecycle hook (once per batch of keys)\n if (key === allKeys[allKeys.length - 1]) {\n fireHook(\"onScratchpadUpdate\", {\n keys: allKeys,\n timestamp: Date.now(),\n });\n }\n }\n\n // ---- Breakpoint Infrastructure ----\n const breakpointModifications = new Map<string, BreakpointModifications>();\n const breakpointCancelReasons = new Map<string, string>();\n\n /** Wait for a breakpoint to be resolved or cancelled */\n function waitForBreakpointResolution(\n agentId: string,\n breakpointId: string,\n signal?: AbortSignal,\n ): Promise<BreakpointModifications | null> {\n return new Promise((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let settled = false;\n let onAbort: (() => void) | undefined;\n const agentFacts = getAgentFacts(agentId);\n\n const cleanupAll = () => {\n if (settled) {\n return;\n }\n settled = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n if (onAbort && signal) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n unsubscribe();\n };\n\n const unsubscribe = system.subscribe(\n [`${agentId}.${BREAKPOINT_KEY}`],\n () => {\n const bpState = getBreakpointState(agentFacts);\n if (bpState.resolved.includes(breakpointId)) {\n cleanupAll();\n const mods = breakpointModifications.get(breakpointId) ?? null;\n breakpointModifications.delete(breakpointId);\n\n resolve(mods);\n } else if (bpState.cancelled.includes(breakpointId)) {\n cleanupAll();\n breakpointModifications.delete(breakpointId);\n const cancelReason = breakpointCancelReasons.get(breakpointId);\n breakpointCancelReasons.delete(breakpointId);\n reject(\n new Error(\n cancelReason\n ? `[Directive MultiAgent] Breakpoint ${breakpointId} cancelled: ${cancelReason}`\n : `[Directive MultiAgent] Breakpoint ${breakpointId} cancelled`,\n ),\n );\n }\n },\n );\n\n if (signal) {\n onAbort = () => {\n cleanupAll();\n reject(\n new Error(\n `[Directive MultiAgent] Breakpoint wait aborted for ${breakpointId}`,\n ),\n );\n };\n if (signal.aborted) {\n cleanupAll();\n reject(\n new Error(\n `[Directive MultiAgent] Breakpoint wait aborted for ${breakpointId}`,\n ),\n );\n\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n timeoutId = setTimeout(() => {\n cleanupAll();\n breakpointModifications.delete(breakpointId);\n breakpointCancelReasons.delete(breakpointId);\n reject(\n new Error(\n `[Directive MultiAgent] Breakpoint timeout: ${breakpointId} not resolved within ${Math.round(breakpointTimeoutMs / 1000)}s`,\n ),\n );\n }, breakpointTimeoutMs);\n });\n }\n\n /** Check and handle a breakpoint at a given execution point */\n async function handleBreakpoint(\n type: MultiAgentBreakpointType,\n agentId: string,\n agentName: string,\n input: string,\n signal?: AbortSignal,\n extra?: {\n patternId?: string;\n handoff?: { fromAgent: string; toAgent: string };\n },\n ): Promise<{ input: string; skip: boolean }> {\n if (breakpointConfigs.length === 0) {\n return { input, skip: false };\n }\n\n const agentFacts = getAgentFacts(agentId);\n const context: BreakpointContext = {\n agentId,\n agentName,\n input,\n state: getOrchestratorState(agentFacts) as unknown as Record<\n string,\n unknown\n >,\n breakpointType: type,\n patternId: extra?.patternId,\n handoff: extra?.handoff,\n };\n\n const matched = matchBreakpoint(breakpointConfigs, type, context);\n if (!matched) {\n return { input, skip: false };\n }\n\n const bpId = createBreakpointId();\n const request: BreakpointRequest = {\n id: bpId,\n type,\n agentId,\n input,\n label: matched.label,\n requestedAt: Date.now(),\n };\n\n // Write to facts\n system.batch(() => {\n const currentBp = getBreakpointState(agentFacts);\n setBreakpointState(agentFacts, {\n ...currentBp,\n pending: [...currentBp.pending, request],\n });\n });\n\n // Fire callbacks\n try {\n onBreakpoint?.(request);\n } catch {\n /* callback error non-fatal */\n }\n try {\n (hooks as any).onBreakpoint?.(request);\n } catch {\n /* hook error non-fatal */\n }\n\n // Record timeline event\n if (timeline) {\n timeline.record({\n type: \"breakpoint_hit\",\n timestamp: Date.now(),\n agentId,\n snapshotId: null,\n breakpointId: bpId,\n breakpointType: type,\n label: matched.label,\n });\n }\n\n // Wait for resolution\n const modifications = await waitForBreakpointResolution(\n agentId,\n bpId,\n signal,\n );\n\n // Record resume event\n if (timeline) {\n timeline.record({\n type: \"breakpoint_resumed\",\n timestamp: Date.now(),\n agentId,\n snapshotId: null,\n breakpointId: bpId,\n modified: !!modifications?.input,\n skipped: !!modifications?.skip,\n });\n }\n\n return {\n input: modifications?.input ?? input,\n skip: modifications?.skip ?? false,\n };\n }\n\n // ---- Helper: Get per-agent facts from namespaced System ----\n // biome-ignore lint/suspicious/noExplicitAny: System facts vary\n function getAgentFacts(agentId: string): any {\n return (system.facts as any)[agentId];\n }\n\n // ---- Helper: Wait for approval ----\n function waitForApproval(\n agentId: string,\n requestId: string,\n signal?: AbortSignal,\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let settled = false;\n let onAbort: (() => void) | undefined;\n const agentFacts = getAgentFacts(agentId);\n\n const cleanupAll = () => {\n if (settled) return;\n settled = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n if (onAbort && signal) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n unsubscribe();\n };\n\n // Use system.subscribe with namespaced key\n const unsubscribe = system.subscribe(\n [`${agentId}.${APPROVAL_KEY}`],\n () => {\n const approval = getApprovalState(agentFacts);\n if (approval.approved.includes(requestId)) {\n cleanupAll();\n resolve();\n } else {\n const rejectedRequest = approval.rejected.find(\n (r: RejectedRequest) => r.id === requestId,\n );\n if (rejectedRequest) {\n cleanupAll();\n const errorMsg = rejectedRequest.reason\n ? `Request ${requestId} rejected: ${rejectedRequest.reason}`\n : `Request ${requestId} rejected`;\n reject(new Error(errorMsg));\n }\n }\n },\n );\n\n // Abort signal cleanup\n if (signal) {\n onAbort = () => {\n cleanupAll();\n reject(\n new Error(\n `[Directive MultiAgent] Approval wait aborted for request ${requestId}`,\n ),\n );\n };\n if (signal.aborted) {\n cleanupAll();\n reject(\n new Error(\n `[Directive MultiAgent] Approval wait aborted for request ${requestId}`,\n ),\n );\n\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n // Timeout with solution guidance\n timeoutId = setTimeout(() => {\n cleanupAll();\n const timeoutSeconds = Math.round(approvalTimeoutMs / 1000);\n reject(\n new Error(\n `[Directive MultiAgent] Approval timeout: Request ${requestId} not resolved within ${timeoutSeconds}s.\\n` +\n \"Solutions:\\n\" +\n \" 1. Handle via onApprovalRequest callback and call orchestrator.approve()/reject()\\n\" +\n \" 2. Set autoApproveToolCalls: true to auto-approve\\n\" +\n ` 3. Increase approvalTimeoutMs (current: ${approvalTimeoutMs}ms)\\n` +\n \"See: https://directive.run/docs/ai/multi-agent\",\n ),\n );\n }, approvalTimeoutMs);\n });\n }\n\n // ---- Core: Run a task (imperative code) ----\n async function runTask<T>(\n taskId: string,\n taskReg: TaskRegistration,\n input: string,\n opts?: MultiAgentRunCallOptions,\n ): Promise<RunResult<T>> {\n const label = taskReg.label ?? taskId;\n const startTime = Date.now();\n const state =\n taskStates[taskId] ?? (taskStates[taskId] = { status: \"idle\" });\n state.status = \"running\";\n state.startTime = startTime;\n state.lastError = undefined;\n\n // Check breakpoints — tasks don't have system modules, so only check if\n // breakpoints are configured and handle the missing agent facts gracefully\n let effectiveInput = input;\n if (breakpointConfigs.length > 0) {\n try {\n const bpResult = await handleBreakpoint(\n \"pre_agent_run\",\n taskId,\n label,\n input,\n opts?.signal,\n );\n if (bpResult.skip) {\n state.status = \"completed\";\n\n return {\n output: undefined as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n effectiveInput = bpResult.input;\n } catch {\n // Tasks don't have system facts — breakpoint state access may fail.\n // Fall through with original input.\n }\n }\n\n // Emit timeline event\n if (timeline) {\n timeline.record({\n type: \"task_start\",\n timestamp: startTime,\n agentId: taskId,\n snapshotId: null,\n taskId,\n label,\n description: taskReg.description,\n inputLength: effectiveInput.length,\n input: effectiveInput.slice(0, MAX_VERBOSE_LENGTH),\n });\n }\n\n // Fire hook\n const effectivePatternId = opts?.patternId ?? \"\";\n fireHook(\"onTaskStart\", {\n patternId: effectivePatternId,\n taskId,\n label,\n timestamp: startTime,\n });\n\n // Semaphore for maxConcurrent\n const sem = taskSemaphores.get(taskId);\n\n // Build TaskContext with deep-cloned memory and scratchpad\n const buildContext = (): TaskContext => ({\n taskId,\n memory: sharedMemory\n ? (structuredClone(\n sharedMemory.getContextMessages?.() ?? [],\n ) as ReadonlyArray<{ role: string; content: string }>)\n : [],\n scratchpad: scratchpadInstance\n ? Object.freeze(structuredClone(scratchpadInstance.getAll()))\n : Object.freeze({}),\n readAgentState: (nodeId: string) => {\n // Check agent states first, then task states\n const agentState = agentStates[nodeId];\n if (agentState) {\n return Object.freeze({\n status: agentState.status,\n lastOutput:\n agentState.lastOutput != null\n ? String(agentState.lastOutput)\n : undefined,\n lastError: agentState.lastError,\n totalTokens: agentState.totalTokens,\n });\n }\n const taskState = taskStates[nodeId];\n if (taskState) {\n return Object.freeze({\n status: taskState.status,\n lastOutput:\n taskState.lastOutput != null\n ? String(taskState.lastOutput)\n : undefined,\n lastError: taskState.lastError,\n totalTokens: 0,\n });\n }\n\n return undefined;\n },\n reportProgress: (percent: number, message?: string) => {\n const clampedPercent = Number.isFinite(percent)\n ? Math.max(0, Math.min(100, percent))\n : 0;\n if (timeline) {\n timeline.record({\n type: \"task_progress\",\n timestamp: Date.now(),\n agentId: taskId,\n snapshotId: null,\n taskId,\n label,\n percent: clampedPercent,\n message,\n });\n }\n fireHook(\"onTaskProgress\", {\n patternId: effectivePatternId,\n taskId,\n label,\n percent: clampedPercent,\n message,\n timestamp: Date.now(),\n });\n },\n });\n\n const maxAttempts = taskReg.retry?.attempts ?? 1;\n const backoff = taskReg.retry?.backoff ?? \"fixed\";\n const baseDelay = taskReg.retry?.delayMs ?? 1000;\n let lastError: Error | undefined;\n\n const executeAttempt = async (signal: AbortSignal): Promise<unknown> => {\n const context = buildContext();\n\n return taskReg.run(effectiveInput, signal, context);\n };\n\n let releaseFn: (() => void) | null = null;\n\n try {\n if (sem) {\n releaseFn = await sem.acquire();\n }\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const abortController = new AbortController();\n let timeoutTimer: ReturnType<typeof setTimeout> | undefined;\n\n // Chain with external signal — store handler for cleanup\n const abortHandler = () => abortController.abort();\n if (opts?.signal) {\n if (opts.signal.aborted) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" aborted before starting`,\n );\n }\n opts.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n // Timeout\n if (taskReg.timeout) {\n timeoutTimer = setTimeout(\n () => abortController.abort(),\n taskReg.timeout,\n );\n }\n\n try {\n const rawOutput = await executeAttempt(abortController.signal);\n if (timeoutTimer) {\n clearTimeout(timeoutTimer);\n }\n\n // Stringify non-string output\n const output =\n typeof rawOutput === \"string\"\n ? rawOutput\n : safeStringify(rawOutput);\n const durationMs = Date.now() - startTime;\n\n state.status = \"completed\";\n state.lastOutput = output;\n state.durationMs = durationMs;\n\n // Emit timeline event\n if (timeline) {\n timeline.record({\n type: \"task_complete\",\n timestamp: Date.now(),\n agentId: taskId,\n snapshotId: null,\n taskId,\n label,\n durationMs,\n output,\n });\n }\n\n // Fire hooks\n fireHook(\"onTaskComplete\", {\n patternId: opts?.patternId ?? \"\",\n taskId,\n label,\n durationMs,\n timestamp: Date.now(),\n });\n\n // Update coordinator fact for constraint reactivity\n try {\n const coordFacts = system.read(\"__coord\");\n setBridgeFact(coordFacts as any, \"__lastTaskCompletion\" as any, {\n taskId,\n timestamp: Date.now(),\n });\n } catch {\n // non-fatal: system might be disposed\n }\n\n return {\n output: output as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n } catch (err) {\n if (timeoutTimer) {\n clearTimeout(timeoutTimer);\n }\n lastError = err instanceof Error ? err : new Error(String(err));\n\n // Emit per-attempt error if retrying\n if (attempt < maxAttempts) {\n if (timeline) {\n timeline.record({\n type: \"task_error\",\n timestamp: Date.now(),\n agentId: taskId,\n snapshotId: null,\n taskId,\n label,\n error: lastError.message,\n durationMs: Date.now() - startTime,\n attempt,\n });\n }\n\n // Backoff with cap and abort-awareness\n const MAX_BACKOFF_MS = 30_000;\n const rawDelay =\n backoff === \"exponential\"\n ? baseDelay * 2 ** (attempt - 1)\n : baseDelay;\n const delay = Math.min(rawDelay, MAX_BACKOFF_MS);\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const onAbort = () => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n reject(\n new Error(\n `[Directive MultiAgent] Task \"${taskId}\" aborted during retry backoff`,\n ),\n );\n }\n };\n const timer = setTimeout(() => {\n settled = true;\n opts?.signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delay);\n if (opts?.signal) {\n opts.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n }\n } finally {\n // Clean up abort listener to prevent accumulation\n opts?.signal?.removeEventListener(\"abort\", abortHandler);\n }\n }\n\n // All attempts exhausted\n const durationMs = Date.now() - startTime;\n state.status = \"error\";\n state.lastError = lastError?.message;\n state.durationMs = durationMs;\n\n // Emit final error event\n if (timeline) {\n timeline.record({\n type: \"task_error\",\n timestamp: Date.now(),\n agentId: taskId,\n snapshotId: null,\n taskId,\n label,\n error: lastError?.message ?? \"Unknown error\",\n durationMs,\n });\n }\n\n fireHook(\"onTaskError\", {\n patternId: effectivePatternId,\n taskId,\n label,\n error: lastError!,\n durationMs,\n timestamp: Date.now(),\n });\n\n // Note: Tasks bypass the circuit breaker's execute() wrapper (tasks are imperative\n // code, not LLM calls). Task failure recovery is handled by the retry config on\n // TaskRegistration. The CB's execute() is only used for agent runs.\n\n throw lastError;\n } finally {\n releaseFn?.();\n }\n }\n\n // ---- Core: Run a single agent ----\n async function runSingleAgent<T>(\n agentId: string,\n input: string,\n opts?: MultiAgentRunCallOptions,\n ): Promise<RunResult<T>> {\n assertNotDisposed();\n\n if (opts?.signal?.aborted) {\n throw new Error(\n `[Directive MultiAgent] Handler \"${agentId}\" run aborted before starting`,\n );\n }\n\n if (globalStatus === \"paused\") {\n throw new Error(\n \"[Directive MultiAgent] Orchestrator is paused (budget exceeded or manual pause)\",\n );\n }\n\n // Increment synchronously before any await so waitForIdle knows a run is pending\n pendingRuns++;\n\n try {\n // Check if this is a task (imperative code), not an agent (LLM call)\n const taskReg = tasks[agentId];\n if (taskReg) {\n return await runTask<T>(agentId, taskReg, input, opts);\n }\n\n const registration = agents[agentId];\n if (!registration) {\n const available =\n [...Object.keys(agents), ...Object.keys(tasks)].join(\", \") ||\n \"(none)\";\n\n throw new Error(\n `[Directive MultiAgent] Unknown handler \"${agentId}\". Registered handlers: ${available}`,\n );\n }\n\n const effectiveCircuitBreaker =\n registration.circuitBreaker ?? orchestratorCircuitBreaker;\n if (effectiveCircuitBreaker) {\n return await effectiveCircuitBreaker.execute(() =>\n runSingleAgentInner<T>(agentId, registration, input, opts),\n );\n }\n\n return await runSingleAgentInner<T>(agentId, registration, input, opts);\n } catch (error) {\n // Self-healing: attempt reroute if configured and this is a CB error or health threshold\n // Tasks are imperative code — self-healing reroute/degradation only applies to agents\n if (\n selfHealing &&\n !tasks[agentId] &&\n !(opts as { __isReroute?: boolean })?.__isReroute\n ) {\n const equivalents = findEquivalentAgents(agentId);\n const alternate = selectBestEquivalent(equivalents);\n if (alternate) {\n const rerouteEvent: RerouteEvent = {\n originalAgent: agentId,\n reroutedTo: alternate,\n reason: error instanceof Error ? error.message : String(error),\n timestamp: Date.now(),\n };\n\n try {\n selfHealing.onReroute?.(rerouteEvent);\n } catch {\n // callback error is non-fatal\n }\n fireHook(\"onReroute\", rerouteEvent);\n\n if (timeline) {\n timeline.record({\n type: \"reroute\",\n timestamp: Date.now(),\n agentId,\n snapshotId: null,\n from: agentId,\n to: alternate,\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Prevent circular reroute (max 1 hop)\n return runSingleAgent<T>(alternate, input, {\n ...opts,\n __isReroute: true,\n } as any);\n }\n\n // No equivalents — apply degradation policy\n if (\n selfHealing.degradation === \"fallback-response\" &&\n selfHealing.fallbackResponse !== undefined\n ) {\n return {\n output: selfHealing.fallbackResponse as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n }\n\n // Update state for errors that happen before semaphore acquisition\n const state = agentStates[agentId];\n if (state && state.status !== \"error\") {\n state.status = \"error\";\n state.lastError =\n error instanceof Error ? error.message : String(error);\n }\n\n throw error;\n } finally {\n pendingRuns--;\n notifyIdleWaiters();\n }\n }\n\n async function runSingleAgentInner<T>(\n agentId: string,\n registration: AgentRegistration,\n originalInput: string,\n opts?: MultiAgentRunCallOptions,\n ): Promise<RunResult<T>> {\n const startTime = Date.now();\n const agentFacts = getAgentFacts(agentId);\n const state = agentStates[agentId]!;\n let agent = registration.agent;\n let processedInput = originalInput;\n\n // Acquire semaphore slot\n const semaphore = semaphores.get(agentId);\n if (!semaphore) {\n const available = Object.keys(agents).join(\", \") || \"(none)\";\n\n throw new Error(\n `[Directive MultiAgent] Unknown agent \"${agentId}\". Registered agents: ${available}`,\n );\n }\n const release = await semaphore.acquire(opts?.signal);\n\n // Create timeout if specified\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let abortHandler: (() => void) | undefined;\n\n try {\n if (registration.timeout) {\n timeoutId = setTimeout(() => controller.abort(), registration.timeout);\n }\n if (opts?.signal) {\n abortHandler = () => controller.abort();\n opts.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n // Inject memory context\n const effectiveMemory = registration.memory ?? sharedMemory;\n if (effectiveMemory) {\n const contextMessages = effectiveMemory.getContextMessages();\n if (contextMessages.length > 0) {\n const contextStr = contextMessages\n .map((m) => `${m.role}: ${m.content}`)\n .join(\"\\n\");\n agent = {\n ...agent,\n instructions:\n (agent.instructions ?? \"\") +\n \"\\n\\nConversation context:\\n\" +\n contextStr,\n };\n }\n }\n\n // ---- Breakpoint: pre_input_guardrails ----\n {\n const bpResult = await handleBreakpoint(\n \"pre_input_guardrails\",\n agentId,\n agent.name,\n processedInput,\n opts?.signal,\n );\n if (bpResult.skip) {\n state.status = \"completed\";\n notifyIdleWaiters();\n\n return {\n output: undefined as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n processedInput = bpResult.input;\n }\n\n // ---- Input guardrails BEFORE agent_start so timeline shows correct order ----\n const allInputGuardrails = [\n ...(guardrails.input ?? []),\n ...(registration.guardrails?.input ?? []),\n ];\n const inputGuardrailsList = allInputGuardrails.map((g, i) =>\n normalizeGuardrail(g, i, \"input\"),\n );\n for (const guardrail of inputGuardrailsList) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input: processedInput,\n facts: getOrchestratorState(agentFacts) as unknown as Record<\n string,\n unknown\n >,\n };\n const guardStartTime = Date.now();\n const result = await executeGuardrailWithRetry(\n guardrail,\n { input: processedInput, agentName: agent.name },\n context,\n );\n fireHook(\"onGuardrailCheck\", {\n agentId,\n guardrailName: name,\n guardrailType: \"input\",\n passed: result.passed,\n reason: result.reason,\n durationMs: Date.now() - guardStartTime,\n timestamp: Date.now(),\n });\n if (!result.passed) {\n throw new GuardrailError({\n code: \"INPUT_GUARDRAIL_FAILED\",\n message: `Input guardrail \"${name}\" failed: ${result.reason}`,\n guardrailName: name,\n guardrailType: \"input\",\n userMessage: result.reason ?? \"Input validation failed\",\n agentName: agent.name,\n input: processedInput,\n });\n }\n if (result.transformed !== undefined) {\n processedInput = result.transformed as string;\n }\n }\n\n // Fire onAgentStart hook (after guardrails pass)\n fireHook(\"onAgentStart\", {\n agentId,\n agentName: agent.name,\n input: processedInput,\n timestamp: startTime,\n });\n\n // Record timeline event\n if (timeline) {\n timeline.record({\n type: \"agent_start\",\n timestamp: Date.now(),\n agentId,\n snapshotId: null,\n inputLength: processedInput.length,\n ...(\"description\" in agent && agent.description\n ? { description: String(agent.description) }\n : {}),\n ...(agent.instructions\n ? { instructions: agent.instructions.slice(0, MAX_VERBOSE_LENGTH) }\n : {}),\n input: processedInput.slice(0, MAX_VERBOSE_LENGTH),\n });\n }\n\n // Update per-agent facts\n system.batch(() => {\n const currentAgent = getAgentState(agentFacts);\n setAgentState(agentFacts, {\n ...currentAgent,\n status: \"running\",\n input: processedInput,\n startedAt: Date.now(),\n });\n });\n state.status = \"running\";\n state.lastInput = processedInput;\n\n // ---- Breakpoint: pre_agent_run ----\n {\n const bpResult = await handleBreakpoint(\n \"pre_agent_run\",\n agentId,\n agent.name,\n processedInput,\n opts?.signal,\n );\n if (bpResult.skip) {\n state.status = \"completed\";\n notifyIdleWaiters();\n\n return {\n output: undefined as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n processedInput = bpResult.input;\n }\n\n // ---- Per-agent structured output wrapping (per-call overrides per-agent) ----\n let effectiveRunner: AgentRunner = runner;\n const effectiveSchema =\n opts?.outputSchema !== undefined\n ? opts.outputSchema // null = opt-out, SafeParseable = override\n : registration.outputSchema; // per-agent default\n if (effectiveSchema) {\n effectiveRunner = withStructuredOutput(runner, {\n schema: effectiveSchema,\n maxRetries:\n opts?.maxSchemaRetries ?? registration.maxSchemaRetries ?? 2,\n extractJson: registration.extractJson,\n schemaDescription: registration.schemaDescription,\n });\n }\n\n // Effective retry config: per-agent overrides orchestrator default\n const effectiveRetry = registration.retry ?? defaultAgentRetry;\n\n // Run agent with retry support\n const result = await executeAgentWithRetry<T>(\n effectiveRunner,\n agent,\n processedInput,\n {\n ...registration.runOptions,\n ...opts,\n signal: controller.signal,\n onMessage: (message) => {\n const currentConversation = getConversation(agentFacts);\n const updated = [...currentConversation, message];\n setConversation(\n agentFacts,\n updated.length > MAX_CONVERSATION_MESSAGES\n ? updated.slice(-MAX_CONVERSATION_MESSAGES)\n : updated,\n );\n opts?.onMessage?.(message);\n },\n onToolCall: async (toolCall) => {\n // ---- Tool call guardrails: orchestrator-level, then per-agent ----\n const allToolCallGuardrails = [\n ...(guardrails.toolCall ?? []),\n ...(registration.guardrails?.toolCall ?? []),\n ];\n const toolCallGuardrailsList = allToolCallGuardrails.map((g, i) =>\n normalizeGuardrail(g, i, \"toolCall\"),\n );\n for (const guardrail of toolCallGuardrailsList) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input: processedInput,\n facts: getOrchestratorState(agentFacts) as unknown as Record<\n string,\n unknown\n >,\n };\n const guardStartTime = Date.now();\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n { toolCall, agentName: agent.name, input: processedInput },\n context,\n );\n fireHook(\"onGuardrailCheck\", {\n agentId,\n guardrailName: name,\n guardrailType: \"toolCall\",\n passed: guardResult.passed,\n reason: guardResult.reason,\n durationMs: Date.now() - guardStartTime,\n timestamp: Date.now(),\n });\n if (!guardResult.passed) {\n throw new GuardrailError({\n code: \"TOOL_CALL_GUARDRAIL_FAILED\",\n message: `Tool call guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"toolCall\",\n userMessage: guardResult.reason ?? \"Tool call blocked\",\n data: { toolCall },\n agentName: agent.name,\n input: processedInput,\n });\n }\n }\n\n // Approval workflow\n if (!autoApproveToolCalls) {\n const approvalId = `tool-${agentId}-${toolCall.id}`;\n const approvalRequest: ApprovalRequest = {\n id: approvalId,\n type: \"tool_call\",\n agentName: agent.name,\n description: `Tool call: ${toolCall.name}`,\n data: toolCall,\n requestedAt: Date.now(),\n };\n\n approvalRequestIndex.set(approvalId, agentId);\n system.batch(() => {\n const currentApproval = getApprovalState(agentFacts);\n setApprovalState(agentFacts, {\n ...currentApproval,\n pending: [...currentApproval.pending, approvalRequest],\n });\n });\n\n onApprovalRequest?.(approvalRequest);\n await waitForApproval(agentId, approvalId, opts?.signal);\n }\n\n const currentToolCalls = getToolCalls(agentFacts);\n const updatedToolCalls = [...currentToolCalls, toolCall];\n setToolCalls(\n agentFacts,\n updatedToolCalls.length > MAX_TOOL_CALLS\n ? updatedToolCalls.slice(-MAX_TOOL_CALLS)\n : updatedToolCalls,\n );\n opts?.onToolCall?.(toolCall);\n },\n },\n effectiveRetry\n ? {\n ...effectiveRetry,\n onRetry: (attempt, error, delayMs) => {\n effectiveRetry.onRetry?.(attempt, error, delayMs);\n fireHook(\"onAgentRetry\", {\n agentId,\n agentName: agent.name,\n input: processedInput,\n attempt,\n error,\n delayMs,\n timestamp: Date.now(),\n });\n },\n }\n : undefined,\n );\n\n // ---- Breakpoint: pre_output_guardrails ----\n {\n const bpResult = await handleBreakpoint(\n \"pre_output_guardrails\",\n agentId,\n agent.name,\n processedInput,\n opts?.signal,\n );\n if (bpResult.skip) {\n // Skip output guardrails, return result directly\n state.status = \"completed\";\n notifyIdleWaiters();\n\n return result;\n }\n }\n\n // ---- Output guardrails: orchestrator-level, then per-agent ----\n const allOutputGuardrails = [\n ...(guardrails.output ?? []),\n ...(registration.guardrails?.output ?? []),\n ];\n const outputGuardrailsList = allOutputGuardrails.map((g, i) =>\n normalizeGuardrail(g, i, \"output\"),\n );\n for (const guardrail of outputGuardrailsList) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input: processedInput,\n facts: getOrchestratorState(agentFacts) as unknown as Record<\n string,\n unknown\n >,\n };\n const guardStartTime = Date.now();\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n {\n output: result.output,\n agentName: agent.name,\n input: processedInput,\n messages: result.messages,\n },\n context,\n );\n fireHook(\"onGuardrailCheck\", {\n agentId,\n guardrailName: name,\n guardrailType: \"output\",\n passed: guardResult.passed,\n reason: guardResult.reason,\n durationMs: Date.now() - guardStartTime,\n timestamp: Date.now(),\n });\n if (!guardResult.passed) {\n throw new GuardrailError({\n code: \"OUTPUT_GUARDRAIL_FAILED\",\n message: `Output guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"output\",\n userMessage: guardResult.reason ?? \"Output validation failed\",\n agentName: agent.name,\n input: processedInput,\n });\n }\n if (guardResult.transformed !== undefined) {\n (result as { output: unknown }).output = guardResult.transformed;\n }\n }\n\n // Update per-agent facts\n system.batch(() => {\n const currentAgent = getAgentState(agentFacts);\n setAgentState(agentFacts, {\n ...currentAgent,\n status: \"completed\",\n output: result.output,\n tokenUsage: currentAgent.tokenUsage + result.totalTokens,\n turnCount: currentAgent.turnCount + result.messages.length,\n completedAt: Date.now(),\n });\n });\n\n // Update local state\n state.status = \"completed\";\n state.lastOutput = result.output;\n state.runCount++;\n state.totalTokens += result.totalTokens;\n notifyIdleWaiters();\n\n // Update global token count atomically via System facts\n // Use read-modify-write inside batch to prevent desync from concurrent runs\n const coordFacts = getAgentFacts(\"__coord\");\n let shouldFireBudgetWarning = false;\n let budgetPercentage = 0;\n system.batch(() => {\n const currentTokens = getBridgeFact<number>(\n coordFacts,\n \"__globalTokens\",\n );\n const newTotal = currentTokens + result.totalTokens;\n globalTokenCount = newTotal;\n setBridgeFact(coordFacts, \"__globalTokens\", newTotal);\n\n // Check budget warning threshold\n if (maxTokenBudget && onBudgetWarning) {\n budgetPercentage = newTotal / maxTokenBudget;\n const warningFired = getBridgeFact<boolean>(\n coordFacts,\n \"__budgetWarningFired\",\n );\n if (budgetPercentage >= budgetWarningThreshold && !warningFired) {\n setBridgeFact(coordFacts, \"__budgetWarningFired\", true);\n shouldFireBudgetWarning = true;\n }\n }\n });\n\n // Fire budget warning callback outside of batch (callbacks shouldn't run inside batch)\n if (shouldFireBudgetWarning) {\n try {\n onBudgetWarning!({\n currentTokens: globalTokenCount,\n maxBudget: maxTokenBudget!,\n percentage: budgetPercentage,\n });\n } catch (callbackError) {\n if (debug) {\n console.debug(\n \"[Directive MultiAgent] onBudgetWarning threw:\",\n callbackError,\n );\n }\n }\n }\n\n // Store messages in memory (best-effort — don't fail the run on memory errors)\n // Only store the user message once — agent-utils includes it in every result,\n // but memory already has it from the first agent call in a conversation.\n if (effectiveMemory && result.messages.length > 0) {\n try {\n const existingMessages = effectiveMemory.getContextMessages();\n const hasUserMessage = existingMessages.some(\n (m) => m.role === \"user\" && m.content === processedInput,\n );\n const messagesToStore = hasUserMessage\n ? result.messages.filter(\n (m) => !(m.role === \"user\" && m.content === processedInput),\n )\n : result.messages;\n effectiveMemory.addMessages(messagesToStore);\n } catch (memoryError) {\n if (debug) {\n console.debug(\n \"[Directive MultiAgent] Memory addMessages failed:\",\n memoryError,\n );\n }\n }\n }\n\n // Fire onAgentComplete hook\n fireHook(\"onAgentComplete\", {\n agentId,\n agentName: agent.name,\n input: processedInput,\n output: result.output,\n tokenUsage: result.totalTokens,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n });\n\n // Record timeline event\n if (timeline) {\n const outputStr =\n typeof result.output === \"string\"\n ? result.output\n : safeStringify(result.output);\n timeline.record({\n type: \"agent_complete\",\n timestamp: Date.now(),\n agentId,\n snapshotId: null,\n outputLength: outputStr.length,\n totalTokens: result.totalTokens,\n inputTokens: result.tokenUsage?.inputTokens ?? 0,\n outputTokens: result.tokenUsage?.outputTokens ?? 0,\n durationMs: Date.now() - startTime,\n modelId: registration.agent.model ?? undefined,\n output: outputStr.slice(0, MAX_VERBOSE_LENGTH),\n });\n }\n\n // Record health success\n if (healthMonitorInstance) {\n healthMonitorInstance.recordSuccess(agentId, Date.now() - startTime);\n }\n\n // Recompute cross-agent derivations\n recomputeDerivations();\n\n // ---- Breakpoint: post_run ----\n await handleBreakpoint(\n \"post_run\",\n agentId,\n agent.name,\n processedInput,\n opts?.signal,\n );\n\n return result;\n } catch (error) {\n state.status = \"error\";\n state.lastError = error instanceof Error ? error.message : String(error);\n notifyIdleWaiters();\n\n // Update per-agent facts with error\n system.batch(() => {\n const currentAgent = getAgentState(agentFacts);\n setAgentState(agentFacts, {\n ...currentAgent,\n status: \"error\",\n error: error instanceof Error ? error.message : String(error),\n completedAt: Date.now(),\n });\n });\n\n // Fire onAgentError hook\n fireHook(\"onAgentError\", {\n agentId,\n agentName: agent.name,\n input: processedInput,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n });\n\n // Record timeline event\n if (timeline) {\n const base: Record<string, unknown> = {\n type: \"agent_error\",\n timestamp: Date.now(),\n agentId,\n snapshotId: null,\n errorMessage: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n };\n if (isGuardrailError(error)) {\n base.guardrailName = error.guardrailName;\n base.guardrailType = error.guardrailType;\n base.errorCode = error.code;\n }\n timeline.record(base as any);\n }\n\n // Record health failure\n if (healthMonitorInstance) {\n healthMonitorInstance.recordFailure(\n agentId,\n Date.now() - startTime,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Recompute cross-agent derivations\n recomputeDerivations();\n\n throw error;\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n if (abortHandler && opts?.signal) {\n opts.signal.removeEventListener(\"abort\", abortHandler);\n }\n release();\n }\n }\n\n // ---- Streaming ----\n function runAgentStreamImpl<T>(\n agentId: string,\n input: string,\n options: { signal?: AbortSignal } = {},\n ): OrchestratorStreamResult<T> {\n assertNotDisposed();\n\n // Task streaming: run task, emit single chunk + done\n const taskReg = tasks[agentId];\n if (taskReg) {\n const taskChunks: OrchestratorStreamChunk[] = [];\n const taskWaiters: Array<\n (chunk: OrchestratorStreamChunk | null) => void\n > = [];\n let taskClosed = false;\n\n const pushTaskChunk = (chunk: OrchestratorStreamChunk) => {\n if (taskClosed) {\n return;\n }\n const waiter = taskWaiters.shift();\n if (waiter) {\n waiter(chunk);\n } else {\n taskChunks.push(chunk);\n }\n };\n\n const closeTaskStream = () => {\n taskClosed = true;\n for (const w of taskWaiters) {\n w(null);\n }\n taskWaiters.length = 0;\n };\n\n const taskAbortController = new AbortController();\n // Wire external signal into task-local controller\n let taskExternalAbortHandler: (() => void) | undefined;\n if (options.signal) {\n if (options.signal.aborted) {\n taskAbortController.abort();\n } else {\n taskExternalAbortHandler = () => taskAbortController.abort();\n options.signal.addEventListener(\"abort\", taskExternalAbortHandler, {\n once: true,\n });\n }\n }\n\n const resultPromise = runSingleAgent<T>(agentId, input, {\n signal: taskAbortController.signal,\n })\n .then(\n (result) => {\n const output =\n typeof result.output === \"string\"\n ? result.output\n : safeStringify(result.output);\n pushTaskChunk({ type: \"token\", data: output, tokenCount: 0 });\n pushTaskChunk({\n type: \"done\",\n totalTokens: 0,\n duration: 0,\n droppedTokens: 0,\n });\n closeTaskStream();\n\n return result;\n },\n (err) => {\n pushTaskChunk({ type: \"error\", error: err });\n closeTaskStream();\n throw err;\n },\n )\n .finally(() => {\n if (taskExternalAbortHandler && options.signal) {\n options.signal.removeEventListener(\n \"abort\",\n taskExternalAbortHandler,\n );\n }\n });\n\n // Prevent unhandled rejection if no one awaits .result\n resultPromise.catch(() => {});\n\n return {\n stream: {\n async *[Symbol.asyncIterator]() {\n while (true) {\n const chunk = taskChunks.shift();\n if (chunk) {\n yield chunk;\n if (chunk.type === \"done\" || chunk.type === \"error\") {\n return;\n }\n } else if (taskClosed) {\n return;\n } else {\n const next = await new Promise<OrchestratorStreamChunk | null>(\n (resolve) => taskWaiters.push(resolve),\n );\n if (!next) {\n return;\n }\n yield next;\n if (next.type === \"done\" || next.type === \"error\") {\n return;\n }\n }\n }\n },\n },\n result: resultPromise,\n abort: () => {\n taskAbortController.abort();\n },\n } as OrchestratorStreamResult<T>;\n }\n\n const registration = agents[agentId];\n if (!registration) {\n const available =\n [...Object.keys(agents), ...Object.keys(tasks)].join(\", \") || \"(none)\";\n\n throw new Error(\n `[Directive MultiAgent] Unknown handler \"${agentId}\". Registered handlers: ${available}`,\n );\n }\n\n const MAX_AGENT_STREAM_BUFFER = 10_000;\n const MAX_ACCUMULATED_OUTPUT = 100_000;\n const abortController = new AbortController();\n const chunks: OrchestratorStreamChunk[] = [];\n const waiters: Array<(chunk: OrchestratorStreamChunk | null) => void> = [];\n let closed = false;\n const startTime = Date.now();\n let tokenCount = 0;\n let accumulatedOutput = \"\";\n\n let abortHandler: (() => void) | undefined;\n if (options.signal) {\n abortHandler = () => abortController.abort();\n options.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n const cleanup = () => {\n if (abortHandler && options.signal) {\n options.signal.removeEventListener(\"abort\", abortHandler);\n }\n };\n\n const pushChunk = (chunk: OrchestratorStreamChunk) => {\n if (closed) return;\n const waiter = waiters.shift();\n if (waiter) {\n waiter(chunk);\n } else {\n if (chunks.length >= MAX_AGENT_STREAM_BUFFER) {\n chunks.shift();\n }\n chunks.push(chunk);\n }\n };\n\n const closeStream = () => {\n closed = true;\n cleanup();\n for (const waiter of waiters) {\n waiter(null);\n }\n waiters.length = 0;\n };\n\n const resultPromise = (async (): Promise<RunResult<T>> => {\n pushChunk({\n type: \"progress\",\n phase: \"starting\",\n message: \"Running input guardrails\",\n });\n\n try {\n const result = await runSingleAgent<T>(agentId, input, {\n signal: abortController.signal,\n onMessage: (message) => {\n pushChunk({ type: \"message\", message });\n if (message.role === \"assistant\" && message.content) {\n const newTokens = Math.ceil(message.content.length / 4);\n tokenCount += newTokens;\n accumulatedOutput += message.content;\n if (accumulatedOutput.length > MAX_ACCUMULATED_OUTPUT) {\n accumulatedOutput = accumulatedOutput.slice(\n -MAX_ACCUMULATED_OUTPUT,\n );\n }\n pushChunk({ type: \"token\", data: message.content, tokenCount });\n }\n },\n onToolCall: async (toolCall) => {\n pushChunk({\n type: \"tool_start\",\n tool: toolCall.name,\n toolCallId: toolCall.id,\n arguments: toolCall.arguments,\n });\n if (toolCall.result) {\n pushChunk({\n type: \"tool_end\",\n tool: toolCall.name,\n toolCallId: toolCall.id,\n result: toolCall.result,\n });\n }\n },\n });\n\n const duration = Date.now() - startTime;\n pushChunk({\n type: \"done\",\n totalTokens: result.totalTokens,\n duration,\n droppedTokens: 0,\n });\n closeStream();\n\n return result;\n } catch (error) {\n if (error instanceof GuardrailError) {\n pushChunk({\n type: \"guardrail_triggered\",\n guardrailName: error.guardrailName,\n reason: error.message,\n partialOutput: accumulatedOutput,\n stopped: true,\n });\n }\n pushChunk({\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n });\n closeStream();\n throw error;\n }\n })();\n\n const stream: AsyncIterable<OrchestratorStreamChunk> = {\n [Symbol.asyncIterator](): AsyncIterator<OrchestratorStreamChunk> {\n return {\n async next(): Promise<IteratorResult<OrchestratorStreamChunk>> {\n if (chunks.length > 0) {\n return { done: false, value: chunks.shift()! };\n }\n if (closed) {\n return { done: true, value: undefined };\n }\n\n return new Promise<IteratorResult<OrchestratorStreamChunk>>(\n (resolve) => {\n waiters.push((chunk) => {\n if (chunk === null) {\n resolve({ done: true, value: undefined });\n } else {\n resolve({ done: false, value: chunk });\n }\n });\n },\n );\n },\n };\n },\n };\n\n // Prevent unhandled rejection if caller only consumes stream (not .result)\n resultPromise.catch(() => {});\n\n return {\n stream,\n result: resultPromise,\n abort: () => {\n abortController.abort();\n closeStream();\n },\n };\n }\n\n // ---- Pattern Runners ----\n async function runParallelPattern<T>(\n pattern: ParallelPattern<T>,\n input: string,\n patternId?: string,\n ): Promise<T> {\n const patternStartTime = Date.now();\n if (patternId) {\n fireHook(\"onPatternStart\", {\n patternId,\n patternType: \"parallel\",\n input,\n timestamp: patternStartTime,\n });\n }\n\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n if (pattern.timeout) {\n timeoutId = setTimeout(() => controller.abort(), pattern.timeout);\n }\n\n let patternError: Error | undefined;\n try {\n const promises = pattern.handlers.map((agentId) =>\n runSingleAgent(agentId, input, {\n signal: controller.signal,\n patternId,\n }).catch((error) => {\n if (pattern.minSuccess === undefined) {\n throw error;\n }\n\n return null;\n }),\n );\n\n const results = await Promise.all(promises);\n const successResults = results.filter(\n (r): r is RunResult<unknown> => r !== null,\n );\n\n if (\n pattern.minSuccess !== undefined &&\n successResults.length < pattern.minSuccess\n ) {\n const failCount = results.length - successResults.length;\n\n throw new Error(\n `[Directive MultiAgent] Parallel pattern: Only ${successResults.length}/${pattern.handlers.length} agents succeeded ` +\n `(minimum required: ${pattern.minSuccess}, failed: ${failCount})`,\n );\n }\n\n return pattern.merge(successResults);\n } catch (error) {\n patternError = error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n if (patternId) {\n fireHook(\"onPatternComplete\", {\n patternId,\n patternType: \"parallel\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n }\n\n // ---- Shared checkpoint helper ----\n\n /** Save a pattern checkpoint state to the configured store */\n async function savePatternCheckpoint(\n state: PatternCheckpointState,\n store: CheckpointStore,\n config?: PatternCheckpointConfig,\n ): Promise<string | null> {\n const step = getPatternStep(state);\n\n // Conditional: evaluate when() predicate\n if (config?.when) {\n try {\n const shouldSave = config.when({\n step,\n patternType: state.type,\n facts:\n state.type === \"goal\"\n ? (state as GoalCheckpointState).facts\n : undefined,\n satisfaction:\n state.type === \"goal\"\n ? (state as GoalCheckpointState).lastSatisfaction\n : undefined,\n });\n if (!shouldSave) {\n return null;\n }\n } catch {\n // If when() throws, skip this checkpoint\n return null;\n }\n }\n\n try {\n const checkpoint: Checkpoint = {\n version: 1,\n id: state.id,\n createdAt: state.createdAt,\n label: state.label,\n systemExport: JSON.stringify(state),\n timelineExport: null,\n localState: {\n type: \"multi\",\n globalTokenCount: 0,\n globalStatus: \"idle\",\n agentStates: {},\n handoffCounter: 0,\n pendingHandoffs: [],\n handoffResults: [],\n roundRobinCounters: null,\n },\n memoryExport: null,\n orchestratorType: \"multi\",\n metadata: { patternType: state.type },\n };\n await store.save(checkpoint);\n\n // Record timeline event\n if (timeline) {\n timeline.record({\n type: \"checkpoint_save\",\n timestamp: Date.now(),\n snapshotId: null,\n checkpointId: state.id,\n patternType: state.type,\n step,\n });\n }\n\n fireHook(\"onCheckpointSave\", {\n checkpointId: state.id,\n patternType: state.type,\n step,\n timestamp: Date.now(),\n });\n\n return state.id;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n console.error(\n `[Directive MultiAgent] ${state.type}: checkpoint save failed:`,\n error,\n );\n\n fireHook(\"onCheckpointError\", {\n patternType: state.type,\n step,\n error,\n timestamp: Date.now(),\n });\n\n return null;\n }\n }\n\n // ---- Pattern Runners ----\n\n async function runSequentialPattern<T>(\n pattern: SequentialPattern<T>,\n initialInput: string,\n patternId?: string,\n resumeFrom?: SequentialCheckpointState,\n ): Promise<T> {\n const patternStartTime = Date.now();\n const pId = patternId ?? \"__inline_sequential\";\n if (patternId) {\n fireHook(\"onPatternStart\", {\n patternId,\n patternType: \"sequential\",\n input: initialInput,\n timestamp: patternStartTime,\n });\n }\n\n // Checkpoint config\n const ckptConfig = pattern.checkpoint;\n const ckptStore = ckptConfig?.store ?? checkpointStore;\n const ckptEveryN = ckptConfig?.everyN ?? 5;\n const ckptPrefix = ckptConfig?.labelPrefix ?? \"sequential\";\n\n // Resume state\n let currentInput = resumeFrom?.currentInput ?? initialInput;\n let lastResult: RunResult<unknown> | undefined;\n const collectedResults: Array<{\n agentId: string;\n output: unknown;\n totalTokens: number;\n }> = resumeFrom?.results ? [...resumeFrom.results] : [];\n const startIdx = resumeFrom?.step ?? 0;\n let patternError: Error | undefined;\n\n // Restore lastResult from checkpoint\n if (resumeFrom && collectedResults.length > 0) {\n const last = collectedResults[collectedResults.length - 1]!;\n lastResult = {\n output: last.output,\n totalTokens: last.totalTokens,\n messages: [],\n toolCalls: [],\n };\n }\n\n try {\n for (let i = startIdx; i < pattern.handlers.length; i++) {\n const agentId = pattern.handlers[i]!;\n\n // ---- Breakpoint: pre_pattern_step ----\n {\n const bpResult = await handleBreakpoint(\n \"pre_pattern_step\",\n agentId,\n agents[agentId]?.agent.name ?? agentId,\n currentInput,\n undefined,\n {\n patternId,\n },\n );\n if (bpResult.skip) {\n continue;\n }\n currentInput = bpResult.input;\n }\n\n try {\n lastResult = await runSingleAgent(agentId, currentInput, {\n patternId,\n });\n collectedResults.push({\n agentId,\n output: lastResult.output,\n totalTokens: lastResult.totalTokens,\n });\n\n if (i < pattern.handlers.length - 1) {\n if (pattern.transform) {\n currentInput = pattern.transform(lastResult.output, agentId, i);\n } else {\n currentInput =\n typeof lastResult.output === \"string\"\n ? lastResult.output\n : safeStringify(lastResult.output);\n }\n }\n\n // Save checkpoint after each agent\n if (\n ckptConfig &&\n ckptStore &&\n i > startIdx &&\n (i - startIdx) % ckptEveryN === 0\n ) {\n const nextInput =\n i < pattern.handlers.length - 1 ? currentInput : initialInput;\n await savePatternCheckpoint(\n {\n type: \"sequential\",\n version: 1,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: `${ckptPrefix}:step-${i + 1}`,\n patternId: pId,\n stepsTotal: pattern.handlers.length,\n step: i + 1,\n currentInput: nextInput,\n results: [...collectedResults],\n },\n ckptStore,\n ckptConfig,\n );\n }\n } catch (error) {\n if (!pattern.continueOnError) {\n throw error;\n }\n }\n }\n\n if (!lastResult) {\n throw new Error(\n \"[Directive MultiAgent] No successful results in sequential pattern\",\n );\n }\n\n return pattern.extract\n ? pattern.extract(lastResult.output)\n : (lastResult.output as T);\n } catch (error) {\n patternError = error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (patternId) {\n fireHook(\"onPatternComplete\", {\n patternId,\n patternType: \"sequential\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n }\n\n async function runSupervisorPattern<T>(\n pattern: SupervisorPattern<T>,\n input: string,\n patternId?: string,\n resumeFrom?: SupervisorCheckpointState,\n ): Promise<T> {\n const patternStartTime = Date.now();\n const pId = patternId ?? \"__inline_supervisor\";\n if (patternId) {\n fireHook(\"onPatternStart\", {\n patternId,\n patternType: \"supervisor\",\n input,\n timestamp: patternStartTime,\n });\n }\n\n // Checkpoint config\n const ckptConfig = pattern.checkpoint;\n const ckptStore = ckptConfig?.store ?? checkpointStore;\n const ckptEveryN = ckptConfig?.everyN ?? 5;\n const ckptPrefix = ckptConfig?.labelPrefix ?? \"supervisor\";\n\n const workerResults: RunResult<unknown>[] = [];\n const serializedWorkerResults: Array<{\n output: unknown;\n totalTokens: number;\n }> = resumeFrom?.workerResults ? [...resumeFrom.workerResults] : [];\n const maxRounds = pattern.maxRounds ?? 5;\n if (maxRounds < 1 || !Number.isFinite(maxRounds)) {\n throw new Error(\n \"[Directive MultiAgent] supervisor maxRounds must be >= 1\",\n );\n }\n let patternError: Error | undefined;\n\n // Restore worker results from checkpoint\n if (resumeFrom) {\n for (const wr of resumeFrom.workerResults) {\n workerResults.push({\n output: wr.output,\n totalTokens: wr.totalTokens,\n messages: [],\n toolCalls: [],\n });\n }\n }\n\n const startRound = resumeFrom?.round ?? 0;\n\n try {\n let supervisorResult: RunResult<unknown>;\n if (resumeFrom) {\n supervisorResult = {\n output: resumeFrom.supervisorOutput,\n totalTokens: 0,\n messages: [],\n toolCalls: [],\n };\n } else {\n supervisorResult = await runSingleAgent<unknown>(\n pattern.supervisor,\n input,\n );\n }\n\n let currentInput = resumeFrom?.currentInput ?? input;\n\n for (let round = startRound; round < maxRounds; round++) {\n // Validate supervisor output shape\n const raw = supervisorResult.output;\n let action: {\n action: string;\n worker?: string;\n workerInput?: string;\n output?: unknown;\n };\n\n if (typeof raw === \"string\") {\n try {\n // Strip markdown code fences LLMs often wrap JSON in\n const cleaned = raw.replace(/```(?:json|JSON)?\\s*\\n?/g, \"\").trim();\n action = JSON.parse(cleaned);\n } catch {\n // LLMs sometimes wrap JSON in conversational text or XML tool-call markup\n try {\n // Strip markdown fences + XML tags (models sometimes emit <function_calls>/<invoke>/<parameter> wrappers)\n const stripped = raw\n .replace(/```(?:json|JSON)?\\s*\\n?/g, \"\")\n .replace(/<[^>]+>/g, \" \");\n const extracted = extractJsonFromOutput(stripped);\n if (\n extracted &&\n typeof extracted === \"object\" &&\n \"action\" in (extracted as Record<string, unknown>)\n ) {\n action = extracted as typeof action;\n } else {\n throw new Error(\"extracted value missing 'action' property\");\n }\n } catch {\n throw new Error(\n `[Directive MultiAgent] Supervisor \"${pattern.supervisor}\" returned unparseable output (round ${round + 1}). ` +\n `Expected JSON with { action, worker?, workerInput? } but got: ${raw.slice(0, 200)}`,\n );\n }\n }\n } else if (raw && typeof raw === \"object\" && \"action\" in raw) {\n action = raw as typeof action;\n } else {\n throw new Error(\n `[Directive MultiAgent] Supervisor \"${pattern.supervisor}\" returned invalid output (round ${round + 1}). ` +\n `Expected { action: \"delegate\"|\"complete\", worker?, workerInput? }`,\n );\n }\n\n if (action.action === \"complete\" || !action.worker) {\n break;\n }\n\n if (!pattern.workers.includes(action.worker)) {\n const available = pattern.workers.join(\", \");\n\n throw new Error(\n `[Directive MultiAgent] Supervisor delegated to unknown worker \"${action.worker}\". Available workers: ${available}`,\n );\n }\n\n const workerResult = await runSingleAgent(\n action.worker,\n action.workerInput ?? \"\",\n { patternId },\n );\n workerResults.push(workerResult);\n serializedWorkerResults.push({\n output: workerResult.output,\n totalTokens: workerResult.totalTokens,\n });\n\n currentInput = `Worker ${action.worker} completed with result: ${safeStringify(workerResult.output)}`;\n supervisorResult = await runSingleAgent(\n pattern.supervisor,\n currentInput,\n { patternId },\n );\n\n // Save checkpoint after each round\n if (\n ckptConfig &&\n ckptStore &&\n round > startRound &&\n (round - startRound) % ckptEveryN === 0\n ) {\n await savePatternCheckpoint(\n {\n type: \"supervisor\",\n version: 1,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: `${ckptPrefix}:round-${round + 1}`,\n patternId: pId,\n stepsTotal: pattern.maxRounds ?? 10,\n round: round + 1,\n supervisorOutput: supervisorResult.output,\n workerResults: [...serializedWorkerResults],\n currentInput,\n },\n ckptStore,\n ckptConfig,\n );\n }\n }\n\n return pattern.extract\n ? pattern.extract(supervisorResult.output, workerResults)\n : (supervisorResult.output as T);\n } catch (error) {\n patternError = error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (patternId) {\n fireHook(\"onPatternComplete\", {\n patternId,\n patternType: \"supervisor\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n }\n\n // ---- DAG Pattern Runner ----\n async function runDagPattern<T>(\n pattern: DagPattern<T>,\n input: string,\n patternId?: string,\n resumeFrom?: DagCheckpointState,\n ): Promise<T> {\n const patternStartTime = Date.now();\n const pId = patternId ?? \"__inline_dag\";\n\n if (patternId) {\n fireHook(\"onPatternStart\", {\n patternId,\n patternType: \"dag\",\n input,\n timestamp: patternStartTime,\n });\n }\n\n // Checkpoint config\n const dagCkptConfig = pattern.checkpoint;\n const dagCkptStore = dagCkptConfig?.store ?? checkpointStore;\n const dagCkptEveryN = dagCkptConfig?.everyN ?? 5;\n const dagCkptPrefix = dagCkptConfig?.labelPrefix ?? \"dag\";\n let dagCompletedCount = resumeFrom?.completedCount ?? 0;\n let dagLastCheckpointCount = 0;\n // Serialize concurrent checkpoint saves to prevent race conditions\n let dagCheckpointChain: Promise<unknown> = Promise.resolve();\n const dagTotalNodes = Object.keys(pattern.nodes).length;\n\n const context: DagExecutionContext = {\n input: resumeFrom?.input ?? input,\n outputs: Object.create(null),\n statuses: Object.create(null),\n errors: Object.create(null),\n results: Object.create(null),\n };\n\n // Initialize all nodes as pending\n for (const nodeId of Object.keys(pattern.nodes)) {\n context.statuses[nodeId] = \"pending\";\n }\n\n // Restore from checkpoint\n if (resumeFrom) {\n for (const [nodeId, status] of Object.entries(resumeFrom.statuses)) {\n context.statuses[nodeId] = status;\n }\n for (const [nodeId, output] of Object.entries(resumeFrom.outputs)) {\n context.outputs[nodeId] = output;\n }\n for (const [nodeId, error] of Object.entries(resumeFrom.errors)) {\n context.errors[nodeId] = error;\n }\n for (const [nodeId, nr] of Object.entries(resumeFrom.nodeResults)) {\n context.results[nodeId] = {\n output: nr.output,\n totalTokens: nr.totalTokens,\n messages: [],\n toolCalls: [],\n };\n }\n }\n\n const onNodeError = pattern.onNodeError ?? \"fail\";\n const maxConcurrent = pattern.maxConcurrent ?? Number.POSITIVE_INFINITY;\n const controller = new AbortController();\n let graphTimeoutId: ReturnType<typeof setTimeout> | undefined;\n let patternError: Error | undefined;\n\n if (pattern.timeout) {\n graphTimeoutId = setTimeout(() => controller.abort(), pattern.timeout);\n }\n\n try {\n // Mark root nodes as ready (skip if restoring from checkpoint)\n if (!resumeFrom) {\n for (const [nodeId, node] of Object.entries(pattern.nodes)) {\n if (!node.deps || node.deps.length === 0) {\n context.statuses[nodeId] = \"ready\";\n }\n }\n }\n\n const inflight = new Set<Promise<void>>();\n let running = 0;\n\n function evaluatePendingNodes(): void {\n for (const [nodeId, node] of Object.entries(pattern.nodes)) {\n if (context.statuses[nodeId] !== \"pending\") {\n continue;\n }\n\n // Check if all deps are terminal (completed, skipped, or error for non-fail modes)\n const terminalStatuses =\n onNodeError === \"fail\"\n ? new Set([\"completed\", \"skipped\"])\n : new Set([\"completed\", \"skipped\", \"error\"]);\n const depsResolved = (node.deps ?? []).every((depId) => {\n return terminalStatuses.has(context.statuses[depId]!);\n });\n\n if (!depsResolved) {\n continue;\n }\n\n // Check if any dep errored or was skipped (for skip-downstream propagation)\n if (onNodeError === \"skip-downstream\") {\n const anyDepFailed = (node.deps ?? []).some(\n (depId) =>\n context.statuses[depId] === \"error\" ||\n context.statuses[depId] === \"skipped\",\n );\n if (anyDepFailed) {\n context.statuses[nodeId] = \"skipped\";\n if (timeline) {\n timeline.record({\n type: \"dag_node_update\",\n timestamp: Date.now(),\n snapshotId: null,\n nodeId,\n status: \"skipped\",\n deps: node.deps ?? [],\n });\n }\n fireHook(\"onDagNodeSkipped\", {\n patternId: pId,\n nodeId,\n agentId: node.handler,\n nodeType: tasks[node.handler]\n ? (\"task\" as const)\n : (\"agent\" as const),\n reason: \"upstream dependency errored\",\n timestamp: Date.now(),\n });\n\n continue;\n }\n }\n\n // Evaluate when condition\n if (node.when) {\n try {\n if (!node.when(context)) {\n context.statuses[nodeId] = \"skipped\";\n if (timeline) {\n timeline.record({\n type: \"dag_node_update\",\n timestamp: Date.now(),\n snapshotId: null,\n nodeId,\n status: \"skipped\",\n deps: node.deps ?? [],\n });\n }\n fireHook(\"onDagNodeSkipped\", {\n patternId: pId,\n nodeId,\n agentId: node.handler,\n nodeType: tasks[node.handler]\n ? (\"task\" as const)\n : (\"agent\" as const),\n reason: \"when() returned false\",\n timestamp: Date.now(),\n });\n\n continue;\n }\n } catch {\n context.statuses[nodeId] = \"skipped\";\n\n continue;\n }\n }\n\n context.statuses[nodeId] = \"ready\";\n }\n }\n\n async function launchNode(nodeId: string, node: DagNode): Promise<void> {\n const nodeStartTime = Date.now();\n context.statuses[nodeId] = \"running\";\n\n if (timeline) {\n timeline.record({\n type: \"dag_node_update\",\n timestamp: nodeStartTime,\n snapshotId: null,\n nodeId,\n status: \"running\",\n deps: node.deps ?? [],\n });\n }\n fireHook(\"onDagNodeStart\", {\n patternId: pId,\n nodeId,\n agentId: node.handler,\n nodeType: tasks[node.handler]\n ? (\"task\" as const)\n : (\"agent\" as const),\n timestamp: nodeStartTime,\n });\n\n // Build input\n let nodeInput: string;\n if (node.transform) {\n nodeInput = node.transform(context);\n } else if (node.deps && node.deps.length > 0) {\n const upstreamOutputs: Record<string, unknown> = Object.create(null);\n for (const depId of node.deps) {\n if (context.outputs[depId] !== undefined) {\n upstreamOutputs[depId] = context.outputs[depId];\n }\n }\n nodeInput = JSON.stringify(upstreamOutputs);\n } else {\n nodeInput = input;\n }\n\n // Per-node timeout\n const nodeController = new AbortController();\n let nodeTimeoutId: ReturnType<typeof setTimeout> | undefined;\n if (node.timeout) {\n nodeTimeoutId = setTimeout(\n () => nodeController.abort(),\n node.timeout,\n );\n }\n\n // Forward graph-level abort\n const abortHandler = () => nodeController.abort();\n controller.signal.addEventListener(\"abort\", abortHandler, {\n once: true,\n });\n\n try {\n const result = await runSingleAgent(node.handler, nodeInput, {\n signal: nodeController.signal,\n patternId: pId,\n });\n\n context.outputs[nodeId] = result.output;\n context.results[nodeId] = result;\n context.statuses[nodeId] = \"completed\";\n\n if (timeline) {\n timeline.record({\n type: \"dag_node_update\",\n timestamp: Date.now(),\n snapshotId: null,\n nodeId,\n status: \"completed\",\n deps: node.deps ?? [],\n });\n }\n fireHook(\"onDagNodeComplete\", {\n patternId: pId,\n nodeId,\n agentId: node.handler,\n nodeType: tasks[node.handler]\n ? (\"task\" as const)\n : (\"agent\" as const),\n durationMs: Date.now() - nodeStartTime,\n timestamp: Date.now(),\n });\n\n // Save checkpoint after node completion (serialized to prevent concurrent race)\n dagCompletedCount++;\n if (\n dagCkptConfig &&\n dagCkptStore &&\n dagCompletedCount > dagLastCheckpointCount &&\n dagCompletedCount - dagLastCheckpointCount >= dagCkptEveryN\n ) {\n dagLastCheckpointCount = dagCompletedCount;\n const nodeResults: Record<\n string,\n { output: unknown; totalTokens: number }\n > = Object.create(null);\n for (const [nid, r] of Object.entries(context.results)) {\n nodeResults[nid] = {\n output: r.output,\n totalTokens: r.totalTokens,\n };\n }\n const ckptState = {\n type: \"dag\" as const,\n version: 1 as const,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: `${dagCkptPrefix}:node-${dagCompletedCount}`,\n patternId: pId,\n stepsTotal: dagTotalNodes,\n statuses: { ...context.statuses },\n outputs: { ...context.outputs },\n errors: { ...context.errors },\n completedCount: dagCompletedCount,\n nodeResults,\n input: context.input,\n };\n dagCheckpointChain = dagCheckpointChain.then(() =>\n savePatternCheckpoint(ckptState, dagCkptStore!, dagCkptConfig),\n );\n await dagCheckpointChain;\n }\n } catch (error) {\n context.statuses[nodeId] = \"error\";\n context.errors[nodeId] =\n error instanceof Error ? error.message : String(error);\n\n if (timeline) {\n timeline.record({\n type: \"dag_node_update\",\n timestamp: Date.now(),\n snapshotId: null,\n nodeId,\n status: \"error\",\n deps: node.deps ?? [],\n });\n }\n fireHook(\"onDagNodeError\", {\n patternId: pId,\n nodeId,\n agentId: node.handler,\n nodeType: tasks[node.handler]\n ? (\"task\" as const)\n : (\"agent\" as const),\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - nodeStartTime,\n timestamp: Date.now(),\n });\n\n if (onNodeError === \"fail\") {\n controller.abort();\n throw error;\n }\n // \"continue\" and \"skip-downstream\" just keep going\n } finally {\n if (nodeTimeoutId) {\n clearTimeout(nodeTimeoutId);\n }\n controller.signal.removeEventListener(\"abort\", abortHandler);\n running--;\n }\n }\n\n // Main loop\n while (true) {\n if (controller.signal.aborted) {\n break;\n }\n\n evaluatePendingNodes();\n\n // Collect ready nodes sorted by priority (descending)\n const readyNodes = Object.entries(pattern.nodes)\n .filter(([nodeId]) => context.statuses[nodeId] === \"ready\")\n .sort(([, a], [, b]) => (b.priority ?? 0) - (a.priority ?? 0));\n\n // Launch ready nodes up to maxConcurrent\n for (const [nodeId, node] of readyNodes) {\n if (running >= maxConcurrent) {\n break;\n }\n running++;\n const promise = launchNode(nodeId, node).finally(() => {\n inflight.delete(promise);\n });\n inflight.add(promise);\n }\n\n // Check if we're done\n const hasPendingOrRunning = Object.values(context.statuses).some(\n (s) => s === \"pending\" || s === \"running\" || s === \"ready\",\n );\n if (!hasPendingOrRunning) {\n break;\n }\n\n // Wait for at least one inflight to complete\n if (inflight.size > 0) {\n await Promise.race(inflight);\n } else {\n // No inflight and still pending — must be stuck (unreachable deps)\n break;\n }\n }\n\n // Wait for remaining inflight\n if (inflight.size > 0) {\n await Promise.allSettled(inflight);\n }\n\n return await pattern.merge(context);\n } catch (error) {\n patternError = error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (graphTimeoutId) {\n clearTimeout(graphTimeoutId);\n }\n if (patternId) {\n fireHook(\"onPatternComplete\", {\n patternId,\n patternType: \"dag\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n }\n\n // ---- Reflect Pattern Runner ----\n async function runReflectPattern<T>(\n pattern: ReflectPattern<T>,\n input: string,\n patternId?: string,\n resumeFrom?: ReflectCheckpointState,\n ): Promise<T> {\n const patternStartTime = Date.now();\n const pId = patternId ?? \"__inline_reflect\";\n const maxIterations = pattern.maxIterations ?? 2;\n\n if (maxIterations < 1) {\n throw new Error(\n \"[Directive MultiAgent] Reflect pattern maxIterations must be >= 1\",\n );\n }\n if (debug && maxIterations > 3) {\n console.warn(\n \"[Directive MultiAgent] Reflection loops > 3 iterations rarely improve quality. Consider reducing maxIterations.\",\n );\n }\n\n // Merge timeout into signal if provided\n let effectiveSignal = pattern.signal;\n let reflectTimeoutId: ReturnType<typeof setTimeout> | undefined;\n let reflectExternalOnAbort: (() => void) | undefined;\n if (pattern.timeout && !effectiveSignal) {\n const controller = new AbortController();\n reflectTimeoutId = setTimeout(() => controller.abort(), pattern.timeout);\n effectiveSignal = controller.signal;\n } else if (pattern.timeout && effectiveSignal) {\n // Both timeout and signal: combine them\n const controller = new AbortController();\n reflectTimeoutId = setTimeout(() => controller.abort(), pattern.timeout);\n reflectExternalOnAbort = () => controller.abort();\n effectiveSignal.addEventListener(\"abort\", reflectExternalOnAbort, {\n once: true,\n });\n effectiveSignal = controller.signal;\n }\n\n const parseEvaluation =\n pattern.parseEvaluation ??\n ((output: unknown): ReflectionEvaluation => {\n if (typeof output === \"string\") {\n try {\n return JSON.parse(output);\n } catch {\n return {\n passed: false,\n feedback: `Evaluator returned unparseable output: ${output.slice(0, 200)}`,\n };\n }\n }\n if (output && typeof output === \"object\" && \"passed\" in output) {\n return output as ReflectionEvaluation;\n }\n\n return { passed: false, feedback: \"Evaluator returned invalid format\" };\n });\n const buildRetryInput =\n pattern.buildRetryInput ??\n ((inp: string, feedback: string, _iteration: number) =>\n `${inp}\\n\\nFeedback on your previous response:\\n${feedback}\\n\\nPlease improve your response.`);\n\n if (patternId) {\n fireHook(\"onPatternStart\", {\n patternId: pId,\n patternType: \"reflect\",\n input,\n timestamp: patternStartTime,\n });\n }\n\n // Checkpoint config\n const reflectCkptConfig = pattern.checkpoint;\n const reflectCkptStore = reflectCkptConfig?.store ?? checkpointStore;\n const reflectCkptEveryN = reflectCkptConfig?.everyN ?? 5;\n const reflectCkptPrefix = reflectCkptConfig?.labelPrefix ?? \"reflect\";\n\n let patternError: Error | undefined;\n let lastProducerResult: RunResult<unknown> | undefined;\n const history: ReflectIterationRecord[] = resumeFrom?.history\n ? [...resumeFrom.history]\n : [];\n // Track per-iteration producer outputs for accept-best\n const producerOutputs: Array<{ output: unknown; score?: number }> =\n resumeFrom?.producerOutputs ? [...resumeFrom.producerOutputs] : [];\n const startIteration = resumeFrom?.iteration ?? 0;\n\n // Restore last producer result from checkpoint\n if (resumeFrom?.lastProducerOutput != null) {\n lastProducerResult = {\n output: resumeFrom.lastProducerOutput,\n totalTokens: 0,\n messages: [],\n toolCalls: [],\n };\n }\n\n try {\n let effectiveInput = resumeFrom?.effectiveInput ?? input;\n\n for (\n let iteration = startIteration;\n iteration < maxIterations;\n iteration++\n ) {\n // Check abort signal at top of each iteration\n if (effectiveSignal?.aborted) {\n if (lastProducerResult) {\n lastReflectionHistory = history;\n\n return pattern.extract\n ? pattern.extract(lastProducerResult.output)\n : (lastProducerResult.output as T);\n }\n\n throw new DOMException(\"Reflect pattern aborted\", \"AbortError\");\n }\n\n const iterStart = Date.now();\n\n // Run producer (pass signal through)\n const producerResult = await runSingleAgent(\n pattern.handler,\n effectiveInput,\n { signal: effectiveSignal, patternId },\n );\n lastProducerResult = producerResult;\n const producerOutput =\n typeof producerResult.output === \"string\"\n ? producerResult.output\n : safeStringify(producerResult.output);\n\n // Check abort after producer, before evaluator\n if (effectiveSignal?.aborted) {\n lastReflectionHistory = history;\n\n return pattern.extract\n ? pattern.extract(producerResult.output)\n : (producerResult.output as T);\n }\n\n // Run evaluator (pass signal through)\n const evaluatorResult = await runSingleAgent(\n pattern.evaluator,\n producerOutput,\n { signal: effectiveSignal, patternId },\n );\n let evaluation: ReflectionEvaluation;\n try {\n evaluation = parseEvaluation(evaluatorResult.output);\n } catch (parseError) {\n evaluation = {\n passed: false,\n feedback: `Evaluation parse error: ${parseError instanceof Error ? parseError.message : String(parseError)}`,\n };\n }\n\n // Apply threshold-based pass override\n if (\n !evaluation.passed &&\n pattern.threshold != null &&\n evaluation.score != null\n ) {\n const thresholdValue =\n typeof pattern.threshold === \"function\"\n ? pattern.threshold(iteration)\n : pattern.threshold;\n if (evaluation.score >= thresholdValue) {\n evaluation = { ...evaluation, passed: true };\n }\n }\n\n const iterDurationMs = Date.now() - iterStart;\n\n // Store producer output for accept-best\n producerOutputs.push({\n output: producerResult.output,\n score: evaluation.score,\n });\n\n // Build iteration record\n const record: ReflectIterationRecord = {\n iteration,\n passed: evaluation.passed,\n score: evaluation.score,\n feedback: evaluation.feedback,\n durationMs: iterDurationMs,\n producerTokens: producerResult.totalTokens ?? 0,\n evaluatorTokens: evaluatorResult.totalTokens ?? 0,\n };\n history.push(record);\n\n // Fire onIteration callback\n if (pattern.onIteration) {\n try {\n pattern.onIteration(record);\n } catch (cbError) {\n if (debug) {\n console.warn(\n \"[Directive MultiAgent] onIteration callback threw:\",\n cbError,\n );\n }\n }\n }\n\n // Record timeline event\n if (timeline) {\n timeline.record({\n type: \"reflection_iteration\",\n timestamp: Date.now(),\n snapshotId: null,\n iteration,\n passed: evaluation.passed,\n score: evaluation.score,\n durationMs: iterDurationMs,\n producerTokens: producerResult.totalTokens,\n evaluatorTokens: evaluatorResult.totalTokens,\n });\n }\n\n if (evaluation.passed) {\n lastReflectionHistory = history;\n\n return pattern.extract\n ? pattern.extract(producerResult.output)\n : (producerResult.output as T);\n }\n\n // Build retry input for next iteration\n if (iteration < maxIterations - 1 && evaluation.feedback) {\n try {\n effectiveInput = buildRetryInput(\n input,\n evaluation.feedback,\n iteration,\n );\n } catch (retryError) {\n if (debug) {\n console.warn(\n \"[Directive MultiAgent] buildRetryInput threw, using default format:\",\n retryError,\n );\n }\n effectiveInput = `${input}\\n\\nFeedback on your previous response:\\n${evaluation.feedback}\\n\\nPlease improve your response.`;\n }\n }\n\n // Save checkpoint after each iteration\n if (\n reflectCkptConfig &&\n reflectCkptStore &&\n iteration >= startIteration &&\n (iteration - startIteration + 1) % reflectCkptEveryN === 0\n ) {\n await savePatternCheckpoint(\n {\n type: \"reflect\",\n version: 1,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: `${reflectCkptPrefix}:iter-${iteration + 1}`,\n patternId: pId,\n stepsTotal: maxIterations,\n iteration: iteration + 1,\n effectiveInput,\n history: [...history],\n producerOutputs: [...producerOutputs],\n lastProducerOutput: producerResult.output,\n },\n reflectCkptStore,\n reflectCkptConfig,\n );\n }\n }\n\n lastReflectionHistory = history;\n\n // Exhausted\n if (pattern.onExhausted === \"throw\") {\n throw new ReflectionExhaustedError({\n iterations: maxIterations,\n history: history.map((h) => ({\n passed: h.passed,\n feedback: h.feedback,\n score: h.score,\n })),\n lastResult: lastProducerResult!,\n totalTokens: lastProducerResult!.totalTokens ?? 0,\n });\n }\n\n // \"accept-best\" — pick iteration with highest score\n if (pattern.onExhausted === \"accept-best\" && producerOutputs.length > 0) {\n const hasAnyScore = producerOutputs.some((p) => p.score != null);\n if (!hasAnyScore && debug) {\n console.warn(\n \"[Directive MultiAgent] accept-best exhaustion strategy used but no iterations returned scores. Falling back to last output.\",\n );\n }\n let bestIdx = producerOutputs.length - 1;\n let bestScore = Number.NEGATIVE_INFINITY;\n for (let i = 0; i < producerOutputs.length; i++) {\n const s = producerOutputs[i]!.score;\n if (s != null && s > bestScore) {\n bestScore = s;\n bestIdx = i;\n }\n }\n\n const bestOutput = producerOutputs[bestIdx]!.output;\n\n return pattern.extract\n ? pattern.extract(bestOutput)\n : (bestOutput as T);\n }\n\n // \"accept-last\" (default)\n return pattern.extract\n ? pattern.extract(lastProducerResult!.output)\n : (lastProducerResult!.output as T);\n } catch (error) {\n lastReflectionHistory = history;\n patternError = error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (reflectTimeoutId) {\n clearTimeout(reflectTimeoutId);\n }\n if (reflectExternalOnAbort && pattern.signal) {\n pattern.signal.removeEventListener(\"abort\", reflectExternalOnAbort);\n }\n if (patternId) {\n fireHook(\"onPatternComplete\", {\n patternId: pId,\n patternType: \"reflect\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n }\n\n // ---- Race Pattern Runner ----\n async function runRacePattern<T>(\n pattern: RacePattern<T>,\n input: string,\n patternId?: string,\n ): Promise<RaceResult<T>> {\n if (pattern.handlers.length === 0) {\n throw new Error(\n \"[Directive MultiAgent] Race pattern requires at least one agent\",\n );\n }\n\n const minSuccess = pattern.minSuccess ?? 1;\n\n if (!Number.isInteger(minSuccess) || minSuccess < 1) {\n throw new Error(\n \"[Directive MultiAgent] Race pattern minSuccess must be a positive integer\",\n );\n }\n if (minSuccess > pattern.handlers.length) {\n throw new Error(\n `[Directive MultiAgent] Race pattern minSuccess (${minSuccess}) exceeds agent count (${pattern.handlers.length})`,\n );\n }\n\n // Validate handler IDs (agents or tasks)\n for (const agentId of pattern.handlers) {\n if (!agents[agentId] && !tasks[agentId]) {\n throw new Error(\n `[Directive MultiAgent] Race: unknown handler \"${agentId}\"`,\n );\n }\n }\n\n const patternStartTime = Date.now();\n const pId = patternId ?? \"__inline_race\";\n const controller = new AbortController();\n let raceTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n // Wire external signal into internal controller\n let raceExternalOnAbort: (() => void) | undefined;\n if (pattern.signal) {\n if (pattern.signal.aborted) {\n controller.abort();\n } else {\n raceExternalOnAbort = () => controller.abort();\n pattern.signal.addEventListener(\"abort\", raceExternalOnAbort, {\n once: true,\n });\n }\n }\n\n if (patternId) {\n fireHook(\"onPatternStart\", {\n patternId: pId,\n patternType: \"race\",\n input,\n timestamp: patternStartTime,\n });\n }\n\n if (timeline) {\n timeline.record({\n type: \"race_start\",\n timestamp: patternStartTime,\n snapshotId: null,\n patternId: pId,\n agents: pattern.handlers,\n });\n }\n\n if (pattern.timeout) {\n raceTimeoutId = setTimeout(() => controller.abort(), pattern.timeout);\n }\n\n let patternError: Error | undefined;\n const agentErrors: Record<string, string> = Object.create(null);\n const startedAgents = [...pattern.handlers];\n\n try {\n // Start all agents, collecting promises\n type RaceEntry = {\n agentId: string;\n promise: Promise<{ agentId: string; result: RunResult<unknown> }>;\n };\n const entries: RaceEntry[] = pattern.handlers.map((agentId) => ({\n agentId,\n // Output guardrails are already checked inside runSingleAgent\n promise: runSingleAgent(agentId, input, {\n signal: controller.signal,\n patternId,\n }).then((result) => ({ agentId, result })),\n }));\n\n // Custom race: track settled count, await all promises for cleanup\n const allPromises = entries.map((e) => e.promise.catch(() => undefined));\n\n const collectedResults: Array<{\n agentId: string;\n result: RunResult<unknown>;\n }> = [];\n\n const result = await new Promise<\n Array<{ agentId: string; result: RunResult<unknown> }>\n >((resolve, reject) => {\n let settledCount = 0;\n let resolved = false;\n\n for (const entry of entries) {\n entry.promise\n .then((winner) => {\n settledCount++;\n if (resolved) {\n return;\n }\n collectedResults.push(winner);\n if (collectedResults.length >= minSuccess) {\n resolved = true;\n controller.abort();\n resolve([...collectedResults]);\n }\n })\n .catch((error) => {\n agentErrors[entry.agentId] =\n error instanceof Error ? error.message : String(error);\n settledCount++;\n\n if (resolved) {\n return;\n }\n\n const failedCount = Object.keys(agentErrors).length;\n const maxPossibleSuccesses =\n collectedResults.length + (entries.length - settledCount);\n\n // All agents failed\n if (\n settledCount === entries.length &&\n failedCount === entries.length\n ) {\n resolved = true;\n reject(\n new Error(\n `[Directive MultiAgent] Race: all ${entries.length} agents failed.\\n` +\n Object.entries(agentErrors)\n .map(([id, msg]) => ` - ${id}: ${msg}`)\n .join(\"\\n\"),\n ),\n );\n } else if (maxPossibleSuccesses < minSuccess) {\n // Impossible to reach minSuccess — some succeeded but not enough can\n resolved = true;\n reject(\n new Error(\n `[Directive MultiAgent] Race: cannot reach minSuccess (${minSuccess}). ` +\n `${failedCount} agent(s) failed.\\n` +\n Object.entries(agentErrors)\n .map(([id, msg]) => ` - ${id}: ${msg}`)\n .join(\"\\n\"),\n ),\n );\n }\n });\n }\n });\n\n // Wait for all losing agents to settle so their side effects\n // (token counting, state mutations) complete before we return\n await Promise.all(allPromises).catch(() => {});\n\n // First result is the \"winner\" (fastest) — guaranteed to exist since minSuccess >= 1\n const first = result[0]!;\n const winnerId = first.agentId;\n const successIds = new Set(result.map((r) => r.agentId));\n const cancelledIds = startedAgents.filter(\n (id) => !successIds.has(id) && !(id in agentErrors),\n );\n\n if (timeline) {\n timeline.record({\n type: \"race_winner\",\n timestamp: Date.now(),\n snapshotId: null,\n patternId: pId,\n winnerId,\n durationMs: Date.now() - patternStartTime,\n });\n if (cancelledIds.length > 0) {\n timeline.record({\n type: \"race_cancelled\",\n timestamp: Date.now(),\n snapshotId: null,\n patternId: pId,\n cancelledIds,\n reason: \"winner_found\",\n });\n }\n }\n\n const extracted = pattern.extract\n ? pattern.extract(first.result)\n : (first.result.output as T);\n\n // Build allResults when minSuccess > 1\n const allResults =\n minSuccess > 1\n ? result.map((r) => ({\n agentId: r.agentId,\n result: pattern.extract\n ? pattern.extract(r.result)\n : (r.result.output as T),\n }))\n : undefined;\n\n return { winnerId, result: extracted, allResults };\n } catch (error) {\n patternError = error instanceof Error ? error : new Error(String(error));\n\n // Record cancellation due to all-failed or timeout\n if (timeline) {\n timeline.record({\n type: \"race_cancelled\",\n timestamp: Date.now(),\n snapshotId: null,\n patternId: pId,\n cancelledIds: startedAgents,\n reason: controller.signal.aborted ? \"timeout\" : \"all_failed\",\n });\n }\n\n throw error;\n } finally {\n if (raceTimeoutId) {\n clearTimeout(raceTimeoutId);\n }\n if (raceExternalOnAbort && pattern.signal) {\n pattern.signal.removeEventListener(\"abort\", raceExternalOnAbort);\n }\n if (patternId) {\n fireHook(\"onPatternComplete\", {\n patternId: pId,\n patternType: \"race\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n }\n\n // ---- Debate Pattern Runner ----\n async function runDebateInternal<T>(\n pattern: DebatePattern<T>,\n input: string,\n patternId?: string,\n resumeFrom?: DebateCheckpointState,\n ): Promise<DebateResult<T>> {\n const {\n handlers: debateAgents,\n evaluator,\n maxRounds = 2,\n extract,\n parseJudgement,\n } = pattern;\n\n if (debateAgents.length < 2) {\n throw new Error(\n \"[Directive MultiAgent] debate requires at least 2 handlers\",\n );\n }\n if (maxRounds < 1 || !Number.isFinite(maxRounds)) {\n throw new Error(\"[Directive MultiAgent] debate maxRounds must be >= 1\");\n }\n\n // Signal/timeout composition\n let effectiveSignal = pattern.signal;\n let debateTimeoutId: ReturnType<typeof setTimeout> | undefined;\n let externalOnAbort: (() => void) | undefined;\n if (pattern.timeout && !effectiveSignal) {\n const ctrl = new AbortController();\n debateTimeoutId = setTimeout(() => ctrl.abort(), pattern.timeout);\n effectiveSignal = ctrl.signal;\n } else if (pattern.timeout && effectiveSignal) {\n const ctrl = new AbortController();\n debateTimeoutId = setTimeout(() => ctrl.abort(), pattern.timeout);\n externalOnAbort = () => ctrl.abort();\n effectiveSignal.addEventListener(\"abort\", externalOnAbort, {\n once: true,\n });\n effectiveSignal = ctrl.signal;\n }\n\n const defaultParseJudgement = (\n output: unknown,\n ): { winnerId: string; feedback?: string; score?: number } => {\n if (typeof output === \"string\") {\n try {\n const parsed = JSON.parse(output);\n if (\n parsed &&\n typeof parsed === \"object\" &&\n typeof parsed.winnerId === \"string\"\n ) {\n return parsed;\n }\n\n if (debug) {\n console.warn(\n \"[Directive MultiAgent] defaultParseJudgement: parsed JSON missing winnerId, falling back to first agent\",\n );\n }\n\n return { winnerId: debateAgents[0]! };\n } catch {\n if (debug) {\n console.warn(\n \"[Directive MultiAgent] defaultParseJudgement: output is not valid JSON, falling back to first agent\",\n );\n }\n\n return { winnerId: debateAgents[0]! };\n }\n }\n if (\n output &&\n typeof output === \"object\" &&\n \"winnerId\" in output &&\n typeof (output as Record<string, unknown>).winnerId === \"string\"\n ) {\n return output as {\n winnerId: string;\n feedback?: string;\n score?: number;\n };\n }\n\n if (debug) {\n console.warn(\n \"[Directive MultiAgent] defaultParseJudgement: unrecognized output format, falling back to first agent\",\n );\n }\n\n return { winnerId: debateAgents[0]! };\n };\n\n const parseJudge = parseJudgement ?? defaultParseJudgement;\n const rounds: DebateResult<T>[\"rounds\"] = resumeFrom?.rounds\n ? [...resumeFrom.rounds]\n : [];\n let currentInput = resumeFrom?.currentInput ?? input;\n let lastWinnerId = resumeFrom?.lastWinnerId ?? debateAgents[0]!;\n let lastWinnerOutput: unknown = resumeFrom?.lastWinnerOutput ?? undefined;\n const startRound = resumeFrom?.round ?? 0;\n\n // Checkpoint config\n const debateCkptConfig = pattern.checkpoint;\n const debateCkptStore = debateCkptConfig?.store ?? checkpointStore;\n const debateCkptEveryN = debateCkptConfig?.everyN ?? 5;\n const debateCkptPrefix = debateCkptConfig?.labelPrefix ?? \"debate\";\n\n const pId = patternId ?? \"__inline_debate\";\n const patternStartTime = Date.now();\n let debateTotalTokens = resumeFrom?.tokensConsumed ?? 0;\n\n if (patternId) {\n fireHook(\"onPatternStart\", {\n patternId: pId,\n patternType: \"debate\",\n input,\n timestamp: patternStartTime,\n });\n }\n\n let patternError: Error | undefined;\n try {\n for (let round = startRound; round < maxRounds; round++) {\n if (effectiveSignal?.aborted) {\n break;\n }\n\n const proposalPromises = debateAgents.map(async (agentId) => {\n const result = await runSingleAgent(agentId, currentInput, {\n signal: effectiveSignal,\n patternId: pId,\n });\n debateTotalTokens += result.totalTokens;\n\n return { agentId, output: result.output };\n });\n const proposals = await Promise.all(proposalPromises);\n\n if (effectiveSignal?.aborted) {\n break;\n }\n\n const evalInput = JSON.stringify({\n round: round + 1,\n totalRounds: maxRounds,\n proposals: proposals.map((p) => ({\n agentId: p.agentId,\n proposal: p.output,\n })),\n });\n\n const evalResult = await runSingleAgent(evaluator, evalInput, {\n signal: effectiveSignal,\n patternId: pId,\n });\n debateTotalTokens += evalResult.totalTokens;\n const judgement = parseJudge(evalResult.output);\n\n // Validate winnerId\n if (!debateAgents.includes(judgement.winnerId)) {\n judgement.winnerId = debateAgents[0]!;\n }\n\n rounds.push({ proposals, judgement });\n\n // Record debate round timeline event\n if (timeline) {\n timeline.record({\n type: \"debate_round\",\n timestamp: Date.now(),\n snapshotId: null,\n patternId: pId,\n round: round + 1,\n totalRounds: maxRounds,\n winnerId: judgement.winnerId,\n score: judgement.score,\n agentCount: debateAgents.length,\n });\n }\n\n lastWinnerId = judgement.winnerId;\n const winnerProposal = proposals.find(\n (p) => p.agentId === judgement.winnerId,\n );\n lastWinnerOutput = winnerProposal?.output ?? proposals[0]!.output;\n\n // Save checkpoint at configured intervals\n if (\n debateCkptConfig &&\n debateCkptStore &&\n round > startRound &&\n (round - startRound) % debateCkptEveryN === 0\n ) {\n const ckptState: DebateCheckpointState = {\n type: \"debate\",\n version: 1,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: `${debateCkptPrefix}:round-${round + 1}`,\n patternId: pId,\n stepsTotal: maxRounds,\n round: round + 1,\n currentInput,\n rounds: [...rounds],\n lastWinnerId,\n lastWinnerOutput,\n tokensConsumed: debateTotalTokens,\n };\n await savePatternCheckpoint(\n ckptState,\n debateCkptStore,\n debateCkptConfig,\n );\n }\n\n if (round < maxRounds - 1 && judgement.feedback) {\n currentInput = `Previous round feedback: ${judgement.feedback}\\n\\nOriginal task: ${input}`;\n }\n }\n\n if (rounds.length === 0) {\n throw new Error(\n \"[Directive MultiAgent] Debate aborted before any round completed\",\n );\n }\n\n const result = extract\n ? extract(lastWinnerOutput)\n : (lastWinnerOutput as T);\n\n return { winnerId: lastWinnerId, result, rounds };\n } catch (error) {\n patternError = error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (debateTimeoutId) {\n clearTimeout(debateTimeoutId);\n }\n if (externalOnAbort && pattern.signal) {\n pattern.signal.removeEventListener(\"abort\", externalOnAbort);\n }\n if (patternId) {\n fireHook(\"onPatternComplete\", {\n patternId: pId,\n patternType: \"debate\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n }\n\n // ---- Goal Pattern Implementation ----\n\n /** Keys that must never appear in goal facts (prototype pollution guard) */\n const GOAL_BLOCKED_KEYS = new Set([\n \"__proto__\",\n \"constructor\",\n \"prototype\",\n \"toString\",\n \"valueOf\",\n \"hasOwnProperty\",\n ]);\n\n function goalSafeMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n ): void {\n for (const key of Object.keys(source)) {\n if (!GOAL_BLOCKED_KEYS.has(key)) {\n target[key] = source[key];\n }\n }\n }\n\n /**\n * Detect cycles in goal node dependency graph.\n * Builds an implicit DAG from produces/requires and applies Kahn's algorithm.\n */\n function validateGoalAcyclic(\n pId: string,\n nodes: Record<string, GoalNode>,\n ): void {\n // Build producer map: factKey → nodeId(s) that produce it\n const producerMap: Record<string, string[]> = Object.create(null);\n for (const [nodeId, node] of Object.entries(nodes)) {\n for (const key of node.produces) {\n if (!producerMap[key]) {\n producerMap[key] = [];\n }\n producerMap[key]!.push(nodeId);\n }\n }\n\n // Build adjacency from requires → produces edges\n const nodeIds = Object.keys(nodes);\n const inDegree: Record<string, number> = Object.create(null);\n const adjacency: Record<string, string[]> = Object.create(null);\n for (const id of nodeIds) {\n inDegree[id] = 0;\n adjacency[id] = [];\n }\n\n for (const [nodeId, node] of Object.entries(nodes)) {\n for (const reqKey of node.requires ?? []) {\n const producers = producerMap[reqKey];\n if (producers) {\n for (const producerId of producers) {\n if (producerId !== nodeId) {\n adjacency[producerId]!.push(nodeId);\n inDegree[nodeId] = (inDegree[nodeId] ?? 0) + 1;\n }\n }\n }\n }\n }\n\n // Kahn's algorithm\n const queue: string[] = [];\n for (const id of nodeIds) {\n if (inDegree[id] === 0) {\n queue.push(id);\n }\n }\n\n let visited = 0;\n while (queue.length > 0) {\n const current = queue.shift()!;\n visited++;\n for (const dependent of adjacency[current] ?? []) {\n inDegree[dependent]!--;\n if (inDegree[dependent] === 0) {\n queue.push(dependent);\n }\n }\n }\n\n if (visited !== nodeIds.length) {\n throw new Error(\n `[Directive MultiAgent] goal pattern \"${pId}\": cycle detected in produces/requires graph. Visited ${visited}/${nodeIds.length} nodes.`,\n );\n }\n }\n\n /**\n * Validate that no two nodes produce the same fact key (M1: producer conflict detection).\n * Logs a dev-mode warning rather than throwing, since some use cases intentionally overlap.\n */\n function validateProducerConflicts(\n pId: string,\n nodes: Record<string, GoalNode>,\n ): void {\n const producerMap: Record<string, string[]> = Object.create(null);\n for (const [nodeId, node] of Object.entries(nodes)) {\n for (const key of node.produces) {\n if (!producerMap[key]) {\n producerMap[key] = [];\n }\n producerMap[key]!.push(nodeId);\n }\n }\n\n for (const [key, producers] of Object.entries(producerMap)) {\n if (producers.length > 1) {\n console.warn(\n `[Directive MultiAgent] goal pattern \"${pId}\": fact key \"${key}\" is produced by multiple nodes: ${producers.join(\", \")}. Last writer wins.`,\n );\n }\n }\n }\n\n /** Safe wrapper for user-provided callbacks (C1). */\n function safeCall<A extends unknown[], R>(\n fn: ((...args: A) => R) | undefined,\n ...args: A\n ): R | undefined {\n if (!fn) {\n return undefined;\n }\n\n try {\n return fn(...args);\n } catch (err) {\n console.error(\"[Directive MultiAgent] goal: user callback threw:\", err);\n\n return undefined;\n }\n }\n\n /** Safe wrapper for async user-provided callbacks (C1). */\n async function safeCallAsync<A extends unknown[], R>(\n fn: ((...args: A) => R | Promise<R>) | undefined,\n ...args: A\n ): Promise<R | undefined> {\n if (!fn) {\n return undefined;\n }\n\n try {\n return await fn(...args);\n } catch (err) {\n console.error(\"[Directive MultiAgent] goal: user callback threw:\", err);\n\n return undefined;\n }\n }\n\n /** Compute estimatedStepsRemaining and decelerating from step history (M7). */\n function computeGoalMetrics(\n currentSatisfaction: number,\n stepMetrics: GoalStepMetrics[],\n _step: number,\n ): GoalMetrics {\n // Calculate recent progress rate (average delta over last 3 steps)\n const recentSteps = stepMetrics.slice(-3);\n const avgDelta =\n recentSteps.length > 0\n ? recentSteps.reduce((sum, s) => sum + s.satisfactionDelta, 0) /\n recentSteps.length\n : 0;\n\n let estimatedStepsRemaining: number | null = null;\n if (avgDelta > 0 && currentSatisfaction < 1.0) {\n estimatedStepsRemaining = Math.ceil(\n (1.0 - currentSatisfaction) / avgDelta,\n );\n }\n\n // Decelerating: compare last 3 deltas to prior 3 deltas\n let decelerating = false;\n if (stepMetrics.length >= 6) {\n const recent3 = stepMetrics.slice(-3);\n const prior3 = stepMetrics.slice(-6, -3);\n const recentAvg =\n recent3.reduce((s, m) => s + m.satisfactionDelta, 0) / 3;\n const priorAvg = prior3.reduce((s, m) => s + m.satisfactionDelta, 0) / 3;\n decelerating = recentAvg < priorAvg * 0.5;\n }\n\n return {\n satisfaction: currentSatisfaction,\n progressRate: avgDelta,\n estimatedStepsRemaining,\n decelerating,\n };\n }\n\n /** Clamp satisfaction to [0, 1] and guard against NaN/Infinity (M4). */\n function clampSatisfaction(value: number | undefined): number {\n if (value == null || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.min(1, value));\n }\n\n async function runGoalInternal<T>(\n pattern: GoalPattern<T>,\n initialInput: string | Record<string, unknown>,\n patternId?: string,\n resumeFrom?: GoalCheckpointState,\n ): Promise<GoalResult<T>> {\n const {\n nodes: originalNodes,\n when: goalWhen,\n satisfaction: satisfactionFn,\n maxSteps = 50,\n extract,\n selectionStrategy,\n relaxation,\n onStep,\n onStall,\n } = pattern;\n\n // Shadow copy of nodes so relaxation mutations don't affect the original (M2)\n const nodes: Record<string, GoalNode> = Object.create(null);\n for (const [id, node] of Object.entries(originalNodes)) {\n nodes[id] = { ...node };\n }\n\n const nodeIds = Object.keys(nodes);\n if (nodeIds.length === 0) {\n throw new Error(\"[Directive MultiAgent] goal requires at least one node\");\n }\n\n const pId = patternId ?? \"__goal\";\n\n // Validate all node handlers (agents or tasks) are registered\n for (const [nodeId, node] of Object.entries(nodes)) {\n if (!agents[node.handler] && !tasks[node.handler]) {\n throw new Error(\n `[Directive MultiAgent] goal node \"${nodeId}\" references unregistered handler \"${node.handler}\"`,\n );\n }\n }\n\n // Cycle detection\n validateGoalAcyclic(pId, nodes);\n\n // Producer conflict warnings\n validateProducerConflicts(pId, nodes);\n\n // Warn if extractOutput is missing (dev guidance)\n for (const [nodeId, node] of Object.entries(nodes)) {\n if (!node.extractOutput) {\n console.warn(\n `[Directive MultiAgent] goal node \"${nodeId}\": no extractOutput defined. Output will be auto-parsed from agent response. Define extractOutput for reliable fact extraction.`,\n );\n }\n }\n\n // Signal/timeout composition\n let effectiveSignal = pattern.signal;\n let goalTimeoutId: ReturnType<typeof setTimeout> | undefined;\n let externalOnAbort: (() => void) | undefined;\n const timeoutMs = pattern.timeout ?? 300_000;\n if (timeoutMs && !effectiveSignal) {\n const ctrl = new AbortController();\n goalTimeoutId = setTimeout(() => ctrl.abort(), timeoutMs);\n effectiveSignal = ctrl.signal;\n } else if (timeoutMs && effectiveSignal) {\n const ctrl = new AbortController();\n goalTimeoutId = setTimeout(() => ctrl.abort(), timeoutMs);\n externalOnAbort = () => ctrl.abort();\n effectiveSignal.addEventListener(\"abort\", externalOnAbort, {\n once: true,\n });\n effectiveSignal = ctrl.signal;\n }\n\n const patternStartTime = Date.now();\n\n if (timeline) {\n const goalHandlers = Object.values(nodes).map((n) => n.handler);\n\n timeline.record({\n type: \"pattern_start\",\n timestamp: patternStartTime,\n snapshotId: null,\n patternId: pId,\n patternType: \"goal\",\n handlers: goalHandlers,\n taskIds: goalHandlers.filter((h) => tasks[h] != null),\n });\n }\n fireHook(\"onPatternStart\", {\n patternId: pId,\n patternType: \"goal\",\n input:\n typeof initialInput === \"string\"\n ? initialInput\n : JSON.stringify(initialInput),\n timestamp: patternStartTime,\n });\n\n // Initialize facts\n const facts: Record<string, unknown> = Object.create(null);\n if (resumeFrom) {\n goalSafeMerge(facts, resumeFrom.facts);\n } else if (typeof initialInput === \"string\") {\n facts.input = initialInput;\n } else {\n goalSafeMerge(facts, initialInput);\n }\n\n // Tracking state — restore from checkpoint or start fresh\n const executionOrder: string[] = resumeFrom\n ? [...resumeFrom.executionOrder]\n : [];\n const nodeResults: Record<string, RunResult<unknown>> = Object.create(null);\n if (resumeFrom) {\n for (const [id, out] of Object.entries(resumeFrom.nodeOutputs)) {\n nodeResults[id] = {\n output: out.output,\n totalTokens: out.totalTokens,\n } as RunResult<unknown>;\n }\n }\n const stepMetrics: GoalStepMetrics[] = resumeFrom\n ? [...resumeFrom.stepMetrics]\n : [];\n const relaxations: RelaxationRecord[] = resumeFrom\n ? [...resumeFrom.relaxations]\n : [];\n const completedNodes = new Set<string>(resumeFrom?.completedNodes ?? []);\n const failedNodes = new Map<string, number>(\n resumeFrom\n ? Object.entries(resumeFrom.failedNodes).map(([k, v]) => [k, v])\n : [],\n );\n const nodeInputHashes = new Map<string, string>(\n resumeFrom ? Object.entries(resumeFrom.nodeInputHashes) : [],\n );\n const agentMetrics: Record<\n string,\n {\n runs: number;\n avgSatisfactionDelta: number;\n tokens: number;\n totalDelta: number;\n }\n > = Object.create(null);\n if (resumeFrom) {\n for (const [id, m] of Object.entries(resumeFrom.agentMetrics)) {\n agentMetrics[id] = {\n runs: m.runs,\n avgSatisfactionDelta: m.runs > 0 ? m.totalDelta / m.runs : 0,\n tokens: m.tokens,\n totalDelta: m.totalDelta,\n };\n }\n }\n let stallSteps = resumeFrom?.stallSteps ?? 0;\n let appliedRelaxationTiers = resumeFrom?.appliedRelaxationTiers ?? 0;\n let lastSatisfaction = resumeFrom?.lastSatisfaction ?? 0;\n let patternError: Error | undefined;\n let goalAchieved = false;\n const startStep = resumeFrom?.step ?? 0;\n\n // Checkpoint config\n const checkpointConfig = pattern.checkpoint;\n const checkpointEveryN = checkpointConfig?.everyN ?? 5;\n const checkpointStoreRef = checkpointConfig?.store ?? checkpointStore;\n const checkpointLabelPrefix = checkpointConfig?.labelPrefix ?? \"goal\";\n let lastCheckpointId: string | undefined;\n void lastCheckpointId; // Used later in checkpoint save\n\n const MAX_CONSECUTIVE_FAILURES = 3;\n\n try {\n for (let step = startStep; step < maxSteps; step++) {\n // Check goal condition (C1: safe-wrap user callback)\n if (safeCall(goalWhen, facts) === true) {\n goalAchieved = true;\n const durationMs = Date.now() - patternStartTime;\n const totalTokens = Object.values(nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n\n return {\n achieved: true,\n result: safeCall(extract, facts) ?? (facts as unknown as T),\n facts: { ...facts },\n executionOrder,\n nodeResults,\n steps: step,\n totalTokens,\n durationMs,\n stepMetrics,\n relaxations,\n };\n }\n\n // Check abort\n if (effectiveSignal?.aborted) {\n const durationMs = Date.now() - patternStartTime;\n const totalTokens = Object.values(nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n\n return {\n achieved: false,\n result: safeCall(extract, facts) ?? (facts as unknown as T),\n facts: { ...facts },\n executionOrder,\n nodeResults,\n steps: step,\n totalTokens,\n durationMs,\n stepMetrics,\n relaxations,\n error: \"Aborted or timed out\",\n };\n }\n\n // Find ready nodes\n const readyNodes: string[] = [];\n for (const [nodeId, node] of Object.entries(nodes)) {\n // Skip permanently failed nodes\n if ((failedNodes.get(nodeId) ?? 0) >= MAX_CONSECUTIVE_FAILURES) {\n continue;\n }\n\n // Check requires satisfied\n const requires = node.requires ?? [];\n const requiresSatisfied = requires.every((key) => facts[key] != null);\n if (!requiresSatisfied) {\n continue;\n }\n\n // Check if already completed\n if (completedNodes.has(nodeId)) {\n if (!node.allowRerun) {\n continue;\n }\n\n // Check if inputs changed\n const inputHash = JSON.stringify(requires.map((key) => facts[key]));\n if (nodeInputHashes.get(nodeId) === inputHash) {\n continue;\n }\n }\n\n readyNodes.push(nodeId);\n }\n\n // Apply selection strategy\n let selectedNodes = readyNodes;\n if (selectionStrategy && readyNodes.length > 0) {\n const rawSatisfaction = satisfactionFn\n ? (safeCall(satisfactionFn, facts) ?? 0)\n : safeCall(goalWhen, facts) === true\n ? 1.0\n : 0.0;\n const currentSatisfaction = clampSatisfaction(rawSatisfaction);\n const goalProgressMetrics = computeGoalMetrics(\n currentSatisfaction,\n stepMetrics,\n step,\n );\n\n // Build per-agent metrics for the strategy\n const strategyMetrics: Record<\n string,\n { runs: number; avgSatisfactionDelta: number; tokens: number }\n > = Object.create(null);\n for (const [id, m] of Object.entries(agentMetrics)) {\n strategyMetrics[id] = {\n runs: m.runs,\n avgSatisfactionDelta: m.runs > 0 ? m.totalDelta / m.runs : 0,\n tokens: m.tokens,\n };\n }\n\n const strategyResult = selectionStrategy.select(\n readyNodes,\n strategyMetrics,\n goalProgressMetrics,\n );\n // Guard against empty selection strategy result — fall back to readyNodes\n selectedNodes =\n strategyResult && strategyResult.length > 0\n ? strategyResult\n : readyNodes;\n }\n\n // Sort by priority (higher first)\n selectedNodes.sort(\n (a, b) => (nodes[b]!.priority ?? 0) - (nodes[a]!.priority ?? 0),\n );\n\n // Fire onStep hook (C1: safe-wrap)\n safeCall(onStep, step, { ...facts }, selectedNodes);\n\n // Handle no ready nodes\n if (selectedNodes.length === 0) {\n // Check relaxation tiers\n stallSteps++;\n let relaxationApplied = false;\n\n if (relaxation) {\n for (\n let tierIdx = appliedRelaxationTiers;\n tierIdx < relaxation.length;\n tierIdx++\n ) {\n const tier = relaxation[tierIdx]!;\n const threshold = tier.afterStallSteps ?? 3;\n if (stallSteps >= threshold) {\n // Apply relaxation\n const strategy = tier.strategy;\n switch (strategy.type) {\n case \"allow_rerun\":\n for (const nid of strategy.nodes) {\n completedNodes.delete(nid);\n nodeInputHashes.delete(nid);\n }\n break;\n case \"alternative_nodes\":\n // Use shadow copy — don't mutate original pattern nodes\n for (const altNode of strategy.nodes) {\n const altId = `__relaxation_${tierIdx}_${altNode.handler}`;\n nodes[altId] = { ...altNode };\n }\n break;\n case \"inject_facts\":\n goalSafeMerge(facts, strategy.facts);\n break;\n case \"accept_partial\": {\n const durationMs = Date.now() - patternStartTime;\n const totalTokens = Object.values(nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n\n return {\n achieved: false,\n result:\n safeCall(extract, facts) ?? (facts as unknown as T),\n facts: { ...facts },\n executionOrder,\n nodeResults,\n steps: step,\n totalTokens,\n durationMs,\n stepMetrics,\n relaxations,\n error: `Accepted partial result via relaxation tier \"${tier.label}\"`,\n };\n }\n case \"custom\": {\n const rawSat = safeCall(satisfactionFn, facts) ?? 0;\n const ctx: RelaxationContext = {\n step,\n facts: { ...facts },\n metrics: computeGoalMetrics(\n clampSatisfaction(rawSat),\n stepMetrics,\n step,\n ),\n completedNodes: new Set(completedNodes),\n failedNodes: new Map(failedNodes),\n };\n // safe-wrap custom strategy callback\n await safeCallAsync(strategy.apply, ctx);\n break;\n }\n }\n\n relaxations.push({\n step,\n tierIndex: tierIdx,\n label: tier.label,\n strategy: strategy.type,\n });\n appliedRelaxationTiers = tierIdx + 1;\n stallSteps = 0;\n relaxationApplied = true;\n break;\n }\n }\n }\n\n if (!relaxationApplied) {\n // Fire onStall hook (C1: safe-wrap, M7: computed metrics)\n const rawSat = safeCall(satisfactionFn, facts) ?? 0;\n const stallMetrics = computeGoalMetrics(\n clampSatisfaction(rawSat),\n stepMetrics,\n step,\n );\n safeCall(onStall, step, stallMetrics);\n\n // If we've exhausted all relaxation tiers and still stalled, fail\n if (!relaxation || appliedRelaxationTiers >= relaxation.length) {\n const durationMs = Date.now() - patternStartTime;\n const totalTokens = Object.values(nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n\n return {\n achieved: false,\n result: safeCall(extract, facts) ?? (facts as unknown as T),\n facts: { ...facts },\n executionOrder,\n nodeResults,\n steps: step,\n totalTokens,\n durationMs,\n stepMetrics,\n relaxations,\n error:\n \"Goal stalled: no ready nodes and no remaining relaxation tiers\",\n };\n }\n }\n\n continue;\n }\n\n // Reset stall counter since we have ready nodes\n stallSteps = 0;\n\n // Run selected nodes in parallel\n const stepStart = Date.now();\n const rawPreSat = satisfactionFn\n ? (safeCall(satisfactionFn, facts) ?? 0)\n : safeCall(goalWhen, facts) === true\n ? 1.0\n : 0.0;\n const preSatisfaction = clampSatisfaction(rawPreSat);\n let stepTokens = 0;\n const factsProduced: string[] = [];\n\n const nodePromises = selectedNodes.map(async (nodeId) => {\n const node = nodes[nodeId]!;\n\n // Record input hash for allowRerun detection\n const requires = node.requires ?? [];\n const inputHash = JSON.stringify(requires.map((key) => facts[key]));\n nodeInputHashes.set(nodeId, inputHash);\n\n // Build input (C1: safe-wrap buildInput)\n let nodeInput: string;\n const customInput = safeCall(node.buildInput, facts);\n if (customInput != null) {\n nodeInput = customInput;\n } else {\n const relevantFacts: Record<string, unknown> = Object.create(null);\n for (const key of requires) {\n if (facts[key] != null) {\n relevantFacts[key] = facts[key];\n }\n }\n if (Object.keys(relevantFacts).length > 0) {\n nodeInput = JSON.stringify(relevantFacts);\n } else if (facts.input != null) {\n nodeInput = String(facts.input);\n } else {\n nodeInput = JSON.stringify(facts);\n }\n }\n\n try {\n const result = await runSingleAgent(node.handler, nodeInput, {\n signal: effectiveSignal ?? undefined,\n patternId: pId,\n });\n nodeResults[nodeId] = result;\n executionOrder.push(nodeId);\n completedNodes.add(nodeId);\n failedNodes.delete(nodeId);\n\n // Extract output facts (C1: safe-wrap extractOutput)\n if (node.extractOutput) {\n const outputFacts = safeCall(node.extractOutput, result);\n if (outputFacts) {\n goalSafeMerge(facts, outputFacts);\n factsProduced.push(...Object.keys(outputFacts));\n }\n } else {\n // Default: try JSON parse of output\n const rawOutput = result.output;\n if (rawOutput && typeof rawOutput === \"object\") {\n goalSafeMerge(facts, rawOutput as Record<string, unknown>);\n factsProduced.push(\n ...Object.keys(rawOutput as Record<string, unknown>),\n );\n } else if (typeof rawOutput === \"string\") {\n try {\n const parsed = JSON.parse(rawOutput);\n if (\n parsed &&\n typeof parsed === \"object\" &&\n !Array.isArray(parsed)\n ) {\n goalSafeMerge(facts, parsed);\n factsProduced.push(...Object.keys(parsed));\n } else {\n // Store under produce keys\n for (const key of node.produces) {\n facts[key] = rawOutput;\n factsProduced.push(key);\n }\n }\n } catch {\n for (const key of node.produces) {\n facts[key] = rawOutput;\n factsProduced.push(key);\n }\n }\n }\n }\n\n stepTokens += result.totalTokens;\n\n return { nodeId, success: true };\n } catch (error) {\n const failures = (failedNodes.get(nodeId) ?? 0) + 1;\n failedNodes.set(nodeId, failures);\n\n return { nodeId, success: false, error };\n }\n });\n\n await Promise.allSettled(nodePromises);\n\n // Compute step metrics (M4: clamp satisfaction)\n const rawPostSat = satisfactionFn\n ? (safeCall(satisfactionFn, facts) ?? 0)\n : safeCall(goalWhen, facts) === true\n ? 1.0\n : 0.0;\n const postSatisfaction = clampSatisfaction(rawPostSat);\n const satisfactionDelta = postSatisfaction - preSatisfaction;\n\n stepMetrics.push({\n step,\n durationMs: Date.now() - stepStart,\n nodesRun: [...selectedNodes],\n factsProduced,\n satisfaction: postSatisfaction,\n satisfactionDelta,\n tokensConsumed: stepTokens,\n });\n\n // Record timeline events for each node run in this step\n if (timeline) {\n for (const nodeId of selectedNodes) {\n const node = nodes[nodeId]!;\n timeline.record({\n type: \"goal_step\",\n timestamp: Date.now(),\n snapshotId: null,\n agentId: node.handler,\n step,\n nodeId,\n satisfaction: postSatisfaction,\n satisfactionDelta,\n });\n }\n }\n\n // Update per-agent metrics\n for (const nodeId of selectedNodes) {\n const node = nodes[nodeId]!;\n if (!agentMetrics[node.handler]) {\n agentMetrics[node.handler] = {\n runs: 0,\n avgSatisfactionDelta: 0,\n tokens: 0,\n totalDelta: 0,\n };\n }\n const m = agentMetrics[node.handler]!;\n m.runs++;\n m.totalDelta += satisfactionDelta;\n m.tokens += nodeResults[nodeId]?.totalTokens ?? 0;\n }\n\n lastSatisfaction = postSatisfaction;\n\n // Track stall (no satisfaction change)\n if (satisfactionDelta <= 0) {\n stallSteps++;\n } else {\n stallSteps = 0;\n }\n\n // Save checkpoint at configured intervals\n if (\n checkpointConfig &&\n checkpointStoreRef &&\n step > startStep &&\n (step - startStep) % checkpointEveryN === 0\n ) {\n const ckptState: GoalCheckpointState = {\n type: \"goal\",\n version: 1,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: `${checkpointLabelPrefix}:step-${step}`,\n patternId: pId,\n stepsTotal: maxSteps,\n step: step + 1, // Next step to run\n facts: structuredClone(facts),\n completedNodes: [...completedNodes],\n failedNodes: Object.fromEntries(failedNodes),\n nodeInputHashes: Object.fromEntries(nodeInputHashes),\n nodeOutputs: Object.fromEntries(\n Object.entries(nodeResults).map(([id, r]) => [\n id,\n { output: r.output, totalTokens: r.totalTokens },\n ]),\n ),\n executionOrder: [...executionOrder],\n stepMetrics: [...stepMetrics],\n relaxations: [...relaxations],\n appliedRelaxationTiers,\n stallSteps,\n lastSatisfaction,\n agentMetrics: Object.fromEntries(\n Object.entries(agentMetrics).map(([id, m]) => [\n id,\n { runs: m.runs, totalDelta: m.totalDelta, tokens: m.tokens },\n ]),\n ),\n };\n const savedId = await savePatternCheckpoint(\n ckptState,\n checkpointStoreRef,\n checkpointConfig,\n );\n if (savedId) {\n lastCheckpointId = savedId;\n }\n }\n }\n\n // Max steps exhausted\n const durationMs = Date.now() - patternStartTime;\n const totalTokens = Object.values(nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n\n return {\n achieved: false,\n result: safeCall(extract, facts) ?? (facts as unknown as T),\n facts: { ...facts },\n executionOrder,\n nodeResults,\n steps: maxSteps,\n totalTokens,\n durationMs,\n stepMetrics,\n relaxations,\n error: `Max steps (${maxSteps}) exhausted without achieving goal`,\n };\n } catch (error) {\n patternError = error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (goalTimeoutId != null) {\n clearTimeout(goalTimeoutId);\n }\n if (externalOnAbort && pattern.signal) {\n pattern.signal.removeEventListener(\"abort\", externalOnAbort);\n }\n if (timeline) {\n const totalTokens = Object.values(nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n timeline.record({\n type: \"pattern_complete\",\n timestamp: Date.now(),\n snapshotId: null,\n patternId: pId,\n patternType: \"goal\",\n durationMs: Date.now() - patternStartTime,\n achieved: goalAchieved,\n stepMetrics,\n relaxations,\n totalTokens,\n ...(patternError ? { error: patternError.message } : {}),\n });\n }\n fireHook(\"onPatternComplete\", {\n patternId: pId,\n patternType: \"goal\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n\n // ---- Self-Healing Helpers ----\n function findEquivalentAgents(agentId: string): string[] {\n if (!selfHealing) {\n return [];\n }\n\n const equivalents: string[] = [];\n const seen = new Set<string>();\n seen.add(agentId);\n\n // Check explicit groups first\n if (selfHealing.equivalencyGroups) {\n for (const group of Object.values(selfHealing.equivalencyGroups)) {\n if (group.includes(agentId)) {\n for (const id of group) {\n if (!seen.has(id) && agents[id]) {\n equivalents.push(id);\n seen.add(id);\n }\n }\n }\n }\n }\n\n // Then capability matching\n if (selfHealing.useCapabilities !== false) {\n const sourceReg = agents[agentId];\n if (sourceReg?.capabilities && sourceReg.capabilities.length > 0) {\n for (const [id, reg] of Object.entries(agents)) {\n if (seen.has(id)) {\n continue;\n }\n const caps = reg.capabilities ?? [];\n if (sourceReg.capabilities.every((c) => caps.includes(c))) {\n equivalents.push(id);\n seen.add(id);\n }\n }\n }\n }\n\n // Filter out unhealthy agents\n if (healthMonitorInstance) {\n const threshold = selfHealing.healthThreshold ?? 30;\n\n return equivalents.filter((id) => {\n const score = healthMonitorInstance!.getHealthScore(id);\n\n return score > threshold;\n });\n }\n\n return equivalents;\n }\n\n function selectBestEquivalent(equivalents: string[]): string | null {\n if (equivalents.length === 0) {\n return null;\n }\n\n if (!selfHealing || !healthMonitorInstance) {\n return equivalents[0] ?? null;\n }\n\n if (selfHealing.selectionStrategy === \"round-robin\" && roundRobinCounters) {\n // Round-robin across equivalents\n const key = [...equivalents].sort().join(\",\");\n const counter = roundRobinCounters.get(key) ?? 0;\n const selected = equivalents[counter % equivalents.length]!;\n roundRobinCounters.set(key, counter + 1);\n\n return selected;\n }\n\n // Default: healthiest\n let best = equivalents[0]!;\n let bestScore = healthMonitorInstance.getHealthScore(best);\n for (let i = 1; i < equivalents.length; i++) {\n const score = healthMonitorInstance.getHealthScore(equivalents[i]!);\n if (score > bestScore) {\n best = equivalents[i]!;\n bestScore = score;\n }\n }\n\n return best;\n }\n\n // ---- Pattern handler extraction (for debug events) ----\n function getPatternHandlers(pattern: ExecutionPattern): string[] {\n switch (pattern.type) {\n case \"parallel\":\n return pattern.handlers;\n case \"sequential\":\n return pattern.handlers;\n case \"supervisor\":\n return [pattern.supervisor, ...pattern.workers];\n case \"dag\":\n return Object.values(pattern.nodes).map((n) => n.handler);\n case \"reflect\":\n return [pattern.handler, pattern.evaluator];\n case \"race\":\n return pattern.handlers;\n case \"debate\":\n return [...pattern.handlers, pattern.evaluator];\n case \"goal\":\n return Object.values(pattern.nodes).map((n) => n.handler);\n default:\n return [];\n }\n }\n\n // ---- Build Orchestrator Object ----\n const orchestrator: MultiAgentOrchestrator = {\n system: system as unknown as System<any>,\n\n get facts() {\n // biome-ignore lint/suspicious/noExplicitAny: System facts vary\n return system.facts as any;\n },\n\n get timeline() {\n return timeline;\n },\n\n get healthMonitor() {\n return healthMonitorInstance;\n },\n\n get derived() {\n return Object.freeze({ ...derivedValues });\n },\n\n onDerivedChange(\n callback: (id: string, value: unknown) => void,\n ): () => void {\n derivedChangeCallbacks.add(callback);\n\n return () => {\n derivedChangeCallbacks.delete(callback);\n };\n },\n\n get scratchpad() {\n return scratchpadInstance;\n },\n\n runAgent: runSingleAgent,\n runAgentStream: runAgentStreamImpl,\n\n async runPattern<T>(patternId: string, input: string): Promise<T> {\n assertNotDisposed();\n\n const pattern = patterns[patternId];\n if (!pattern) {\n const available = Object.keys(patterns).join(\", \") || \"(none)\";\n\n throw new Error(\n `[Directive MultiAgent] Unknown pattern \"${patternId}\". Available patterns: ${available}`,\n );\n }\n\n const patternStartTime = Date.now();\n if (timeline) {\n const handlerIds = getPatternHandlers(pattern);\n\n timeline.record({\n type: \"pattern_start\",\n timestamp: patternStartTime,\n snapshotId: null,\n patternId,\n patternType: pattern.type,\n handlers: handlerIds,\n taskIds: handlerIds.filter((h) => tasks[h] != null),\n });\n }\n\n let patternError: Error | undefined;\n try {\n switch (pattern.type) {\n case \"parallel\":\n return await runParallelPattern(\n pattern as ParallelPattern<T>,\n input,\n patternId,\n );\n case \"sequential\":\n return await runSequentialPattern(\n pattern as SequentialPattern<T>,\n input,\n patternId,\n );\n case \"supervisor\":\n return await runSupervisorPattern(\n pattern as SupervisorPattern<T>,\n input,\n patternId,\n );\n case \"dag\":\n return await runDagPattern(\n pattern as DagPattern<T>,\n input,\n patternId,\n );\n case \"reflect\":\n return await runReflectPattern(\n pattern as ReflectPattern<T>,\n input,\n patternId,\n );\n case \"race\": {\n const raceResult = await runRacePattern(\n pattern as RacePattern<T>,\n input,\n patternId,\n );\n\n return raceResult.result;\n }\n case \"debate\": {\n const debatePattern = pattern as DebatePattern<T>;\n const debateResult = await runDebateInternal<T>(\n debatePattern,\n input,\n patternId,\n );\n\n return debateResult.result;\n }\n case \"goal\": {\n const goalPattern = pattern as GoalPattern<T>;\n const goalResult = await runGoalInternal<T>(\n goalPattern,\n input,\n patternId,\n );\n\n return goalResult.result;\n }\n default:\n throw new Error(\n `[Directive MultiAgent] Unknown pattern type: ${(pattern as { type: string }).type}`,\n );\n }\n } catch (error) {\n patternError =\n error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (timeline) {\n timeline.record({\n type: \"pattern_complete\",\n timestamp: Date.now(),\n snapshotId: null,\n patternId,\n patternType: pattern.type,\n durationMs: Date.now() - patternStartTime,\n ...(patternError ? { error: patternError.message } : {}),\n });\n }\n }\n },\n\n async runParallel<T>(\n agentIds: string[],\n inputs: string | string[],\n merge: (results: RunResult<unknown>[]) => T | Promise<T>,\n options?: { minSuccess?: number; timeout?: number },\n ): Promise<T> {\n assertNotDisposed();\n const inputArray = Array.isArray(inputs)\n ? inputs\n : agentIds.map(() => inputs);\n\n if (inputArray.length !== agentIds.length) {\n throw new Error(\n `[Directive MultiAgent] Input count (${inputArray.length}) must match agent count (${agentIds.length})`,\n );\n }\n\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n if (options?.timeout) {\n timeoutId = setTimeout(() => controller.abort(), options.timeout);\n }\n\n try {\n const promises = agentIds.map((agentId, i) =>\n runSingleAgent(agentId, inputArray[i]!, {\n signal: controller.signal,\n }).catch((error) => {\n if (options?.minSuccess !== undefined) {\n return null;\n }\n\n throw error;\n }),\n );\n\n const results = await Promise.all(promises);\n const successResults = results.filter(\n (r): r is RunResult<unknown> => r !== null,\n );\n\n if (\n options?.minSuccess !== undefined &&\n successResults.length < options.minSuccess\n ) {\n const failCount = results.length - successResults.length;\n\n throw new Error(\n `[Directive MultiAgent] runParallel: Only ${successResults.length}/${agentIds.length} agents succeeded ` +\n `(minimum required: ${options.minSuccess}, failed: ${failCount})`,\n );\n }\n\n return merge(successResults);\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n },\n\n async runSequential<T>(\n agentIds: string[],\n initialInput: string,\n opts?: {\n transform?: (output: unknown, agentId: string, index: number) => string;\n },\n ): Promise<RunResult<T>[]> {\n assertNotDisposed();\n const results: RunResult<unknown>[] = [];\n let currentInput = initialInput;\n\n for (let i = 0; i < agentIds.length; i++) {\n const agentId = agentIds[i]!;\n const result = await runSingleAgent(agentId, currentInput);\n results.push(result);\n\n if (i < agentIds.length - 1) {\n if (opts?.transform) {\n currentInput = opts.transform(result.output, agentId, i);\n } else {\n currentInput =\n typeof result.output === \"string\"\n ? result.output\n : safeStringify(result.output);\n }\n }\n }\n\n return results as RunResult<T>[];\n },\n\n async handoff(\n fromAgent: string,\n toAgent: string,\n input: string,\n context?: Record<string, unknown>,\n ): Promise<RunResult<unknown>> {\n assertNotDisposed();\n\n if (!agents[fromAgent]) {\n const available = Object.keys(agents).join(\", \") || \"(none)\";\n\n throw new Error(\n `[Directive MultiAgent] Handoff source agent \"${fromAgent}\" not found. Registered: ${available}`,\n );\n }\n if (!agents[toAgent]) {\n const available = Object.keys(agents).join(\", \") || \"(none)\";\n\n throw new Error(\n `[Directive MultiAgent] Handoff target agent \"${toAgent}\" not found. Registered: ${available}`,\n );\n }\n\n // ---- Breakpoint: pre_handoff ----\n {\n const bpResult = await handleBreakpoint(\n \"pre_handoff\",\n fromAgent,\n agents[fromAgent]!.agent.name,\n input,\n undefined,\n {\n handoff: { fromAgent, toAgent },\n },\n );\n if (bpResult.skip) {\n return {\n output: undefined as unknown,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n input = bpResult.input;\n }\n\n const request: HandoffRequest = {\n id: `handoff-${++handoffCounter}`,\n fromAgent,\n toAgent,\n input,\n context,\n requestedAt: Date.now(),\n };\n\n pendingHandoffs.push(request);\n try {\n onHandoff?.(request);\n } catch (e) {\n if (debug) {\n console.debug(\"[Directive MultiAgent] onHandoff threw:\", e);\n }\n }\n fireHook(\"onHandoff\", request);\n\n if (timeline) {\n timeline.record({\n type: \"handoff_start\",\n timestamp: Date.now(),\n snapshotId: null,\n fromAgent,\n toAgent,\n });\n }\n\n // Forward handoff context to receiving agent's memory (best-effort)\n const targetMemory = agents[toAgent]!.memory ?? sharedMemory;\n if (targetMemory && context) {\n try {\n const contextSummary = Object.entries(context)\n .map(([k, v]) => `${k}: ${safeStringify(v)}`)\n .join(\", \");\n targetMemory.addMessages([\n {\n role: \"system\",\n content: `[Handoff from ${fromAgent}] Context: ${contextSummary}`,\n },\n ]);\n } catch (memoryError) {\n if (debug) {\n console.debug(\n \"[Directive MultiAgent] Handoff addMessages failed:\",\n memoryError,\n );\n }\n }\n }\n\n try {\n const result = await runSingleAgent(toAgent, input);\n\n const handoffResult: HandoffResult = {\n request,\n result,\n completedAt: Date.now(),\n };\n\n addHandoffResult(handoffResult);\n try {\n onHandoffComplete?.(handoffResult);\n } catch (e) {\n if (debug) {\n console.debug(\"[Directive MultiAgent] onHandoffComplete threw:\", e);\n }\n }\n fireHook(\"onHandoffComplete\", handoffResult);\n\n if (timeline) {\n timeline.record({\n type: \"handoff_complete\",\n timestamp: Date.now(),\n snapshotId: null,\n fromAgent,\n toAgent,\n durationMs: handoffResult.completedAt - request.requestedAt,\n });\n }\n\n const index = pendingHandoffs.indexOf(request);\n if (index >= 0) pendingHandoffs.splice(index, 1);\n\n return result;\n } catch (error) {\n const index = pendingHandoffs.indexOf(request);\n if (index >= 0) pendingHandoffs.splice(index, 1);\n throw error;\n }\n },\n\n approve(requestId: string): void {\n assertNotDisposed();\n\n // O(1) lookup via reverse index\n const agentId = approvalRequestIndex.get(requestId);\n if (agentId) {\n approvalRequestIndex.delete(requestId);\n const agentFacts = getAgentFacts(agentId);\n system.batch(() => {\n const currentApproval = getApprovalState(agentFacts);\n const MAX_APPROVAL_HISTORY = 200;\n const approved = [...currentApproval.approved, requestId];\n setApprovalState(agentFacts, {\n ...currentApproval,\n pending: currentApproval.pending.filter(\n (r: ApprovalRequest) => r.id !== requestId,\n ),\n approved:\n approved.length > MAX_APPROVAL_HISTORY\n ? approved.slice(-MAX_APPROVAL_HISTORY)\n : approved,\n });\n });\n\n return;\n }\n\n if (debug) {\n console.debug(\n `[Directive MultiAgent] approve() ignored: no pending request \"${requestId}\"`,\n );\n }\n },\n\n reject(requestId: string, reason?: string): void {\n assertNotDisposed();\n\n // O(1) lookup via reverse index\n const agentId = approvalRequestIndex.get(requestId);\n if (agentId) {\n approvalRequestIndex.delete(requestId);\n const agentFacts = getAgentFacts(agentId);\n system.batch(() => {\n const currentApproval = getApprovalState(agentFacts);\n if (reason && debug) {\n console.debug(\n `[Directive MultiAgent] Request ${requestId} rejected: ${reason}`,\n );\n }\n const rejectedRequest: RejectedRequest = {\n id: requestId,\n reason,\n rejectedAt: Date.now(),\n };\n const MAX_REJECTION_HISTORY = 200;\n const rejected = [...currentApproval.rejected, rejectedRequest];\n setApprovalState(agentFacts, {\n ...currentApproval,\n pending: currentApproval.pending.filter(\n (r: ApprovalRequest) => r.id !== requestId,\n ),\n rejected:\n rejected.length > MAX_REJECTION_HISTORY\n ? rejected.slice(-MAX_REJECTION_HISTORY)\n : rejected,\n });\n });\n\n return;\n }\n\n if (debug) {\n console.debug(\n `[Directive MultiAgent] reject() ignored: no pending request \"${requestId}\"`,\n );\n }\n },\n\n pause(): void {\n assertNotDisposed();\n globalStatus = \"paused\";\n if (debug) {\n console.debug(\"[Directive MultiAgent] Orchestrator paused\");\n }\n },\n\n resume(): void {\n assertNotDisposed();\n if (globalStatus === \"paused\") {\n globalStatus = \"idle\";\n if (debug) {\n console.debug(\"[Directive MultiAgent] Orchestrator resumed\");\n }\n }\n },\n\n getAgentState(agentId: string) {\n const state = agentStates[agentId];\n\n return state ? { ...state } : undefined;\n },\n\n getAllAgentStates() {\n return Object.fromEntries(\n Object.entries(agentStates).map(([k, v]) => [k, { ...v }]),\n );\n },\n\n getPendingHandoffs() {\n return [...pendingHandoffs];\n },\n\n /** Total tokens consumed across all agents */\n get totalTokens(): number {\n return globalTokenCount;\n },\n\n /** Wait until all agents are idle (no running agents) */\n waitForIdle(timeoutMs?: number): Promise<void> {\n const allIdle = () =>\n pendingRuns === 0 &&\n Object.values(agentStates).every(\n (s) =>\n s.status === \"idle\" ||\n s.status === \"completed\" ||\n s.status === \"error\",\n );\n if (allIdle()) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const cleanup = () => {\n idleWaiters.delete(check);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n\n const check = () => {\n if (allIdle()) {\n cleanup();\n resolve();\n }\n };\n\n idleWaiters.add(check);\n\n if (timeoutMs !== undefined) {\n timeoutId = setTimeout(() => {\n cleanup();\n reject(\n new Error(\n `[Directive MultiAgent] waitForIdle timed out after ${timeoutMs}ms`,\n ),\n );\n }, timeoutMs);\n }\n });\n },\n\n /** Alias for runAgent */\n run<T>(\n agentId: string,\n input: string,\n options?: MultiAgentRunCallOptions,\n ): Promise<RunResult<T>> {\n return runSingleAgent<T>(agentId, input, options);\n },\n\n /** Alias for runAgentStream */\n runStream<T>(\n agentId: string,\n input: string,\n options?: { signal?: AbortSignal },\n ): OrchestratorStreamResult<T> {\n return runAgentStreamImpl<T>(agentId, input, options);\n },\n\n registerAgent(agentId: string, registration: AgentRegistration): void {\n assertNotDisposed();\n if (RESERVED_IDS.has(agentId)) {\n throw new Error(\n `[Directive MultiAgent] Agent ID \"${agentId}\" is reserved and cannot be used`,\n );\n }\n if (agents[agentId]) {\n throw new Error(\n `[Directive MultiAgent] Agent \"${agentId}\" is already registered. Unregister first.`,\n );\n }\n if (tasks[agentId]) {\n throw new Error(\n `[Directive MultiAgent] ID \"${agentId}\" is already registered as a task`,\n );\n }\n\n // Build per-agent constraints and resolvers (same as initial setup)\n // biome-ignore lint/suspicious/noExplicitAny: Constraint types complex\n const perAgentConstraints: Record<string, any> = registration.constraints\n ? convertOrchestratorConstraints(registration.constraints)\n : {};\n\n // biome-ignore lint/suspicious/noExplicitAny: Resolver types complex\n const perAgentResolvers: Record<string, any> = Object.create(null);\n if (registration.resolvers) {\n for (const [id, resolver] of Object.entries(registration.resolvers)) {\n perAgentResolvers[id] = {\n requirement: resolver.requirement,\n key: resolver.key,\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async (req: Requirement, context: any) => {\n const state = getOrchestratorState(context.facts);\n const combinedFacts = {\n ...context.facts,\n ...state,\n } as unknown as Record<string, unknown> & OrchestratorState;\n\n const resolverContext: OrchestratorResolverContext<\n Record<string, unknown>\n > = {\n facts: combinedFacts,\n runAgent: async <T>(\n agent: AgentLike,\n input: string,\n opts?: RunOptions,\n ) => {\n return runner<T>(agent, input, opts);\n },\n signal: context.signal,\n };\n\n return resolver.resolve(req, resolverContext);\n },\n };\n }\n }\n\n // Create Directive module and register with the System\n const agentModule = createModule(agentId, {\n schema: orchestratorBridgeSchema,\n init: (facts) => {\n setAgentState(facts, {\n status: \"idle\",\n currentAgent: registration.agent.name,\n input: null,\n output: null,\n error: null,\n tokenUsage: 0,\n turnCount: 0,\n startedAt: null,\n completedAt: null,\n });\n setApprovalState(facts, { pending: [], approved: [], rejected: [] });\n setConversation(facts, []);\n setToolCalls(facts, []);\n setBreakpointState(facts, createInitialBreakpointState());\n },\n constraints: perAgentConstraints,\n resolvers:\n Object.keys(perAgentResolvers).length > 0\n ? (perAgentResolvers as any)\n : undefined,\n });\n\n // biome-ignore lint/suspicious/noExplicitAny: System type narrowing loses namespaced overload\n (system as any).registerModule(agentId, agentModule);\n\n // Add to registry\n agents[agentId] = registration;\n\n // Create semaphore\n semaphores.set(agentId, new Semaphore(registration.maxConcurrent ?? 1));\n\n // Initialize agent state\n agentStates[agentId] = {\n status: \"idle\",\n runCount: 0,\n totalTokens: 0,\n };\n\n if (debug) {\n console.debug(\n `[Directive MultiAgent] Registered agent \"${agentId}\" (${registration.agent.name})`,\n );\n }\n\n recomputeDerivations();\n },\n\n unregisterAgent(agentId: string): void {\n assertNotDisposed();\n if (!agents[agentId]) {\n throw new Error(\n `[Directive MultiAgent] Agent \"${agentId}\" is not registered`,\n );\n }\n\n const state = agentStates[agentId];\n if (state?.status === \"running\") {\n throw new Error(\n `[Directive MultiAgent] Cannot unregister agent \"${agentId}\" while it is running`,\n );\n }\n\n // Warn about orphaned patterns referencing this agent\n for (const [patternId, pattern] of Object.entries(patterns)) {\n let referencedAgents: string[];\n switch (pattern.type) {\n case \"supervisor\":\n referencedAgents = [pattern.supervisor, ...pattern.workers];\n break;\n case \"dag\":\n referencedAgents = Object.values(pattern.nodes).map(\n (n) => n.handler,\n );\n break;\n case \"reflect\":\n referencedAgents = [pattern.handler, pattern.evaluator];\n break;\n case \"parallel\":\n case \"sequential\":\n case \"race\":\n referencedAgents = pattern.handlers;\n break;\n case \"debate\":\n referencedAgents = [\n ...(pattern as DebatePattern).handlers,\n (pattern as DebatePattern).evaluator,\n ];\n break;\n default:\n referencedAgents = [];\n }\n if (referencedAgents.includes(agentId)) {\n console.warn(\n `[Directive MultiAgent] Warning: Pattern \"${patternId}\" references unregistered agent \"${agentId}\"`,\n );\n }\n }\n\n // Drain semaphore\n const sem = semaphores.get(agentId);\n if (sem) {\n sem.drain();\n semaphores.delete(agentId);\n }\n\n // Reset per-agent System facts to idle state\n const agentFacts = getAgentFacts(agentId);\n if (agentFacts) {\n system.batch(() => {\n setAgentState(agentFacts, {\n status: \"idle\",\n currentAgent: null,\n input: null,\n output: null,\n error: null,\n tokenUsage: 0,\n turnCount: 0,\n startedAt: null,\n completedAt: null,\n });\n setApprovalState(agentFacts, {\n pending: [],\n approved: [],\n rejected: [],\n });\n setConversation(agentFacts, []);\n setToolCalls(agentFacts, []);\n setBreakpointState(agentFacts, createInitialBreakpointState());\n });\n }\n\n // Remove from local registries\n // Note: Directive System modules cannot be removed at runtime,\n // but the agent's facts are reset and it won't be accessible via orchestrator methods\n delete agents[agentId];\n delete agentStates[agentId];\n\n if (debug) {\n console.debug(`[Directive MultiAgent] Unregistered agent \"${agentId}\"`);\n }\n\n recomputeDerivations();\n },\n\n getAgentIds(): string[] {\n return Object.keys(agents);\n },\n\n registerTask(taskId: string, registration: TaskRegistration): void {\n assertNotDisposed();\n if (RESERVED_IDS.has(taskId)) {\n throw new Error(\n `[Directive MultiAgent] Task ID \"${taskId}\" is reserved and cannot be used`,\n );\n }\n if (\n !taskId ||\n typeof taskId !== \"string\" ||\n taskId.trim() !== taskId ||\n taskId.length === 0\n ) {\n throw new Error(\n \"[Directive MultiAgent] Task ID must be a non-empty trimmed string\",\n );\n }\n if (agents[taskId]) {\n throw new Error(\n `[Directive MultiAgent] ID \"${taskId}\" is already registered as an agent`,\n );\n }\n if (tasks[taskId]) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" is already registered`,\n );\n }\n // Validate timeout and maxConcurrent\n if (\n registration.timeout !== undefined &&\n (!Number.isFinite(registration.timeout) || registration.timeout <= 0)\n ) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" timeout must be a finite number > 0`,\n );\n }\n if (\n registration.maxConcurrent !== undefined &&\n (!Number.isFinite(registration.maxConcurrent) ||\n registration.maxConcurrent < 1 ||\n !Number.isInteger(registration.maxConcurrent))\n ) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" maxConcurrent must be a finite integer >= 1`,\n );\n }\n // Validate retry configuration\n if (registration.retry) {\n const { attempts, delayMs } = registration.retry;\n if (!Number.isFinite(attempts) || attempts < 1) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" retry attempts must be a finite number >= 1`,\n );\n }\n if (\n delayMs !== undefined &&\n (!Number.isFinite(delayMs) || delayMs < 0)\n ) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" retry delayMs must be a finite number >= 0`,\n );\n }\n }\n tasks[taskId] = registration;\n taskStates[taskId] = { status: \"idle\" };\n taskSemaphores.set(\n taskId,\n new Semaphore(registration.maxConcurrent ?? 1),\n );\n\n if (debug) {\n console.debug(\n `[Directive MultiAgent] Registered task \"${taskId}\" (${registration.label ?? taskId})`,\n );\n }\n },\n\n unregisterTask(taskId: string): void {\n assertNotDisposed();\n if (!tasks[taskId]) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" is not registered`,\n );\n }\n const state = taskStates[taskId];\n if (state?.status === \"running\") {\n throw new Error(\n `[Directive MultiAgent] Cannot unregister task \"${taskId}\" while it is running`,\n );\n }\n const sem = taskSemaphores.get(taskId);\n if (sem) {\n sem.drain();\n taskSemaphores.delete(taskId);\n }\n delete tasks[taskId];\n delete taskStates[taskId];\n\n if (debug) {\n console.debug(`[Directive MultiAgent] Unregistered task \"${taskId}\"`);\n }\n },\n\n getTaskIds(): string[] {\n return Object.keys(tasks);\n },\n\n getTaskRegistry(): Record<\n string,\n { label?: string; description?: string }\n > {\n const result: Record<string, { label?: string; description?: string }> =\n Object.create(null);\n for (const [id, reg] of Object.entries(tasks)) {\n result[id] = { label: reg.label, description: reg.description };\n }\n\n return result;\n },\n\n getTaskState(taskId: string) {\n const s = taskStates[taskId];\n\n return s ? Object.freeze(structuredClone(s)) : undefined;\n },\n\n getAllTaskStates() {\n const result: Record<\n string,\n {\n status: string;\n lastOutput?: unknown;\n lastError?: string;\n startTime?: number;\n durationMs?: number;\n }\n > = Object.create(null);\n for (const [id, s] of Object.entries(taskStates)) {\n result[id] = Object.freeze(structuredClone(s));\n }\n\n return result;\n },\n\n getNodeIds(): string[] {\n return [...Object.keys(agents), ...Object.keys(tasks)];\n },\n\n reset() {\n assertNotDisposed();\n for (const agentId of Object.keys(agents)) {\n const maxConcurrent = agents[agentId]?.maxConcurrent ?? 1;\n agentStates[agentId] = {\n status: \"idle\",\n runCount: 0,\n totalTokens: 0,\n };\n const existing = semaphores.get(agentId);\n if (existing) {\n existing.drain();\n }\n semaphores.set(agentId, new Semaphore(maxConcurrent));\n\n // Reset per-agent facts\n const agentFacts = getAgentFacts(agentId);\n system.batch(() => {\n setAgentState(agentFacts, {\n status: \"idle\",\n currentAgent: agents[agentId]!.agent.name,\n input: null,\n output: null,\n error: null,\n tokenUsage: 0,\n turnCount: 0,\n startedAt: null,\n completedAt: null,\n });\n setApprovalState(agentFacts, {\n pending: [],\n approved: [],\n rejected: [],\n });\n setConversation(agentFacts, []);\n setToolCalls(agentFacts, []);\n setBreakpointState(agentFacts, createInitialBreakpointState());\n });\n }\n // Reset task states\n for (const taskId of Object.keys(tasks)) {\n taskStates[taskId] = { status: \"idle\" };\n const tsem = taskSemaphores.get(taskId);\n if (tsem) {\n tsem.drain();\n }\n taskSemaphores.set(\n taskId,\n new Semaphore(tasks[taskId]!.maxConcurrent ?? 1),\n );\n }\n\n breakpointModifications.clear();\n breakpointCancelReasons.clear();\n approvalRequestIndex.clear();\n pendingHandoffs.length = 0;\n handoffResults.length = 0;\n handoffCounter = 0;\n globalTokenCount = 0;\n globalStatus = \"idle\";\n pendingRuns = 0;\n notifyIdleWaiters();\n\n // Reset coordinator facts\n const coordFacts = getAgentFacts(\"__coord\");\n system.batch(() => {\n setBridgeFact(coordFacts, \"__globalTokens\", 0);\n setBridgeFact(coordFacts, \"__status\", \"idle\");\n setBridgeFact(coordFacts, \"__handoffs\", []);\n setBridgeFact(coordFacts, \"__handoffResults\", []);\n setBridgeFact(coordFacts, \"__budgetWarningFired\", false);\n if (scratchpadConfig) {\n setBridgeFact(coordFacts, SCRATCHPAD_KEY, {\n ...scratchpadConfig.init,\n });\n }\n });\n\n // Reset health monitor to clear stale metrics\n if (healthMonitorInstance) {\n healthMonitorInstance.reset();\n }\n\n lastReflectionHistory = null;\n\n // Reset derived values and recompute\n for (const key of Object.keys(derivedValues)) {\n delete derivedValues[key];\n }\n recomputeDerivations();\n },\n\n // ---- Checkpoint Methods ----\n\n async checkpoint(opts?: { label?: string }): Promise<Checkpoint> {\n assertNotDisposed();\n\n // Ensure no agents or tasks are running\n for (const [id, s] of Object.entries(agentStates)) {\n if (s.status === \"running\") {\n throw new Error(\n `[Directive MultiAgent] Cannot checkpoint while agent \"${id}\" is running`,\n );\n }\n }\n for (const [id, s] of Object.entries(taskStates)) {\n if (s.status === \"running\") {\n throw new Error(\n `[Directive MultiAgent] Cannot checkpoint while task \"${id}\" is running`,\n );\n }\n }\n if (!(system as any).debug?.export) {\n throw new Error(\n \"[Directive MultiAgent] Checkpointing requires debug mode. Set `debug: true` in orchestrator options.\",\n );\n }\n\n const checkpoint: Checkpoint = {\n version: 1,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: opts?.label,\n systemExport: (system as any).debug.export(),\n timelineExport: timeline?.export() ?? null,\n localState: {\n type: \"multi\",\n globalTokenCount,\n globalStatus,\n agentStates: Object.fromEntries(\n Object.entries(agentStates).map(([k, v]) => [\n k,\n structuredClone(v),\n ]),\n ),\n handoffCounter,\n pendingHandoffs: [...pendingHandoffs],\n handoffResults: [...handoffResults],\n roundRobinCounters: roundRobinCounters\n ? Object.fromEntries(roundRobinCounters)\n : null,\n taskStates: Object.fromEntries(\n Object.entries(taskStates).map(([k, v]) => [\n k,\n {\n lastOutput:\n v.lastOutput != null ? String(v.lastOutput) : undefined,\n lastError: v.lastError,\n },\n ]),\n ),\n } satisfies MultiAgentCheckpointLocalState,\n memoryExport: sharedMemory\n ? ((sharedMemory as any).export?.() ?? null)\n : null,\n orchestratorType: \"multi\",\n };\n\n if (checkpointStore) {\n await checkpointStore.save(checkpoint);\n }\n\n return checkpoint;\n },\n\n restore(cp: Checkpoint, opts?: { restoreTimeline?: boolean }): void {\n assertNotDisposed();\n\n if (!validateCheckpoint(cp)) {\n throw new Error(\"[Directive MultiAgent] Invalid checkpoint data\");\n }\n if (cp.orchestratorType !== \"multi\") {\n throw new Error(\n `[Directive MultiAgent] Expected multi-agent checkpoint, got \"${cp.orchestratorType}\"`,\n );\n }\n\n // Restore system state\n if (!(system as any).debug?.import) {\n throw new Error(\n \"[Directive MultiAgent] Restoring a checkpoint requires debug mode. Set `debug: true` in orchestrator options.\",\n );\n }\n (system as any).debug.import(cp.systemExport);\n\n // Restore timeline\n if (opts?.restoreTimeline !== false && cp.timelineExport && timeline) {\n timeline.import(cp.timelineExport);\n }\n\n // Restore memory\n if (cp.memoryExport && sharedMemory && (sharedMemory as any).import) {\n (sharedMemory as any).import(cp.memoryExport);\n }\n\n // Restore closure-local state\n const local = cp.localState as MultiAgentCheckpointLocalState;\n globalTokenCount = local.globalTokenCount;\n globalStatus = local.globalStatus;\n handoffCounter = local.handoffCounter;\n pendingHandoffs.length = 0;\n pendingHandoffs.push(...(local.pendingHandoffs as HandoffRequest[]));\n handoffResults.length = 0;\n handoffResults.push(...(local.handoffResults as HandoffResult[]));\n\n // Restore agent states\n for (const [id, s] of Object.entries(local.agentStates)) {\n if (agentStates[id]) {\n agentStates[id] = { ...s };\n }\n }\n\n // Restore round robin counters\n if (local.roundRobinCounters && roundRobinCounters) {\n roundRobinCounters.clear();\n for (const [k, v] of Object.entries(local.roundRobinCounters)) {\n roundRobinCounters.set(k, v);\n }\n }\n\n // Rebuild semaphores from registrations\n for (const [agentId, reg] of Object.entries(agents)) {\n const existing = semaphores.get(agentId);\n if (existing) {\n existing.drain();\n }\n semaphores.set(agentId, new Semaphore(reg.maxConcurrent ?? 1));\n }\n\n // Restore task states\n if (local.taskStates) {\n for (const [id, s] of Object.entries(local.taskStates)) {\n if (!tasks[id]) {\n throw new Error(\n `[Directive MultiAgent] Checkpoint references task \"${id}\" which is not registered. Task run functions cannot be serialized — re-provide the task registration.`,\n );\n }\n taskStates[id] = {\n status: \"idle\",\n lastOutput: s.lastOutput,\n lastError: s.lastError,\n };\n }\n // Rebuild task semaphores\n for (const [taskId, reg] of Object.entries(tasks)) {\n const existing = taskSemaphores.get(taskId);\n if (existing) {\n existing.drain();\n }\n taskSemaphores.set(taskId, new Semaphore(reg.maxConcurrent ?? 1));\n }\n }\n\n // Recompute derivations from restored state\n recomputeDerivations();\n },\n\n // ---- Parallel Streaming ----\n\n runParallelStream<T>(\n agentIds: string[],\n inputs: string | string[],\n merge: (results: RunResult<unknown>[]) => T | Promise<T>,\n opts?: { minSuccess?: number; timeout?: number; signal?: AbortSignal },\n ): MultiplexedStreamResult<T> {\n assertNotDisposed();\n\n const inputArray = Array.isArray(inputs)\n ? inputs\n : agentIds.map(() => inputs);\n\n if (inputArray.length !== agentIds.length) {\n throw new Error(\n `[Directive MultiAgent] Input count (${inputArray.length}) must match agent count (${agentIds.length})`,\n );\n }\n\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n if (opts?.timeout) {\n timeoutId = setTimeout(() => controller.abort(), opts.timeout);\n }\n // External signal handling is done after mergeTaggedStreams setup\n\n // Launch per-agent streams\n const perAgentStreams = agentIds.map((agentId, i) => {\n const streamResult = runAgentStreamImpl(agentId, inputArray[i]!, {\n signal: controller.signal,\n });\n\n return {\n agentId,\n streamResult,\n };\n });\n\n // Merge tagged streams\n const taggedSources = perAgentStreams.map(\n ({ agentId, streamResult }) => ({\n agentId,\n stream: streamResult.stream,\n }),\n );\n\n const { stream: mergedStream, getDroppedCount } =\n mergeTaggedStreams(taggedSources);\n\n // Clean up external abort listener when done\n let externalOnAbort: (() => void) | undefined;\n if (opts?.signal) {\n externalOnAbort = () => controller.abort();\n opts.signal.addEventListener(\"abort\", externalOnAbort, { once: true });\n }\n\n // Collect all results\n const resultsPromise = Promise.allSettled(\n perAgentStreams.map(({ streamResult }) => streamResult.result),\n ).then((settled) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n // Clean up external signal listener\n if (externalOnAbort && opts?.signal) {\n opts.signal.removeEventListener(\"abort\", externalOnAbort);\n }\n\n const successes: RunResult<unknown>[] = [];\n for (const s of settled) {\n if (s.status === \"fulfilled\") {\n successes.push(s.value);\n }\n }\n\n if (\n opts?.minSuccess !== undefined &&\n successes.length < opts.minSuccess\n ) {\n throw new Error(\n `[Directive MultiAgent] runParallelStream: Only ${successes.length}/${agentIds.length} agents succeeded ` +\n `(minimum required: ${opts.minSuccess})`,\n );\n }\n\n return successes;\n });\n\n const mergePromise = resultsPromise.then((results) => merge(results));\n\n // Prevent unhandled rejections\n resultsPromise.catch(() => {});\n mergePromise.catch(() => {});\n\n return {\n stream: mergedStream,\n results: resultsPromise,\n merge: mergePromise,\n getDroppedCount,\n abort: () => {\n controller.abort();\n if (externalOnAbort && opts?.signal) {\n opts.signal.removeEventListener(\"abort\", externalOnAbort);\n }\n for (const { streamResult } of perAgentStreams) {\n streamResult.abort();\n }\n },\n };\n },\n\n // ---- Race ----\n\n async runRace<T>(\n agentIds: string[],\n input: string,\n raceOpts?: {\n extract?: (result: RunResult<unknown>) => T;\n timeout?: number;\n minSuccess?: number;\n signal?: AbortSignal;\n },\n ): Promise<RaceResult<T>> {\n assertNotDisposed();\n\n const pattern: RacePattern<T> = {\n type: \"race\",\n handlers: agentIds,\n extract: raceOpts?.extract,\n timeout: raceOpts?.timeout,\n minSuccess: raceOpts?.minSuccess,\n signal: raceOpts?.signal,\n };\n\n return runRacePattern<T>(pattern, input, \"__imperative_race\");\n },\n\n // ---- Reflect (imperative) ----\n\n async runReflect<T>(\n producerId: string,\n evaluatorId: string,\n input: string,\n reflectOpts?: {\n maxIterations?: number;\n parseEvaluation?: (output: unknown) => ReflectionEvaluation;\n buildRetryInput?: (\n input: string,\n feedback: string,\n iteration: number,\n ) => string;\n extract?: (output: unknown) => T;\n onExhausted?: \"accept-last\" | \"accept-best\" | \"throw\";\n onIteration?: (record: ReflectIterationRecord) => void;\n signal?: AbortSignal;\n timeout?: number;\n threshold?: number | ((iteration: number) => number);\n },\n ): Promise<{\n result: T;\n iterations: number;\n history: ReflectIterationRecord[];\n exhausted: boolean;\n }> {\n assertNotDisposed();\n\n const pattern: ReflectPattern<T> = {\n type: \"reflect\",\n handler: producerId,\n evaluator: evaluatorId,\n maxIterations: reflectOpts?.maxIterations,\n parseEvaluation: reflectOpts?.parseEvaluation,\n buildRetryInput: reflectOpts?.buildRetryInput,\n extract: reflectOpts?.extract,\n onExhausted: reflectOpts?.onExhausted,\n onIteration: reflectOpts?.onIteration,\n signal: reflectOpts?.signal,\n timeout: reflectOpts?.timeout,\n threshold: reflectOpts?.threshold,\n };\n\n const result = await runReflectPattern<T>(\n pattern,\n input,\n \"__imperative_reflect\",\n );\n const history = lastReflectionHistory ? [...lastReflectionHistory] : [];\n const maxIterations = reflectOpts?.maxIterations ?? 2;\n const exhausted =\n history.length > 0 &&\n !history[history.length - 1]!.passed &&\n history.length >= maxIterations;\n\n return { result, iterations: history.length, history, exhausted };\n },\n\n // ---- Debate (imperative) ----\n\n async runDebate<T>(\n agentIds: string[],\n evaluatorId: string,\n input: string,\n debateOpts?: {\n maxRounds?: number;\n extract?: (output: unknown) => T;\n parseJudgement?: (output: unknown) => {\n winnerId: string;\n feedback?: string;\n score?: number;\n };\n signal?: AbortSignal;\n timeout?: number;\n },\n ): Promise<DebateResult<T>> {\n assertNotDisposed();\n\n return runDebateInternal<T>(\n {\n type: \"debate\",\n handlers: agentIds,\n evaluator: evaluatorId,\n maxRounds: debateOpts?.maxRounds,\n extract: debateOpts?.extract,\n parseJudgement: debateOpts?.parseJudgement,\n signal: debateOpts?.signal,\n timeout: debateOpts?.timeout,\n },\n input,\n \"__imperative_debate\",\n );\n },\n\n // ---- Goal Pattern ----\n\n async runGoal<T>(\n nodes: Record<string, GoalNode>,\n initialInput: string | Record<string, unknown>,\n when: (facts: Record<string, unknown>) => boolean,\n goalOpts?: {\n satisfaction?: (facts: Record<string, unknown>) => number;\n maxSteps?: number;\n extract?: (facts: Record<string, unknown>) => T;\n timeout?: number;\n signal?: AbortSignal;\n selectionStrategy?: AgentSelectionStrategy;\n relaxation?: RelaxationTier[];\n onStep?: GoalPattern[\"onStep\"];\n onStall?: GoalPattern[\"onStall\"];\n checkpoint?: PatternCheckpointConfig;\n },\n ): Promise<GoalResult<T>> {\n assertNotDisposed();\n\n return runGoalInternal<T>(\n {\n type: \"goal\",\n nodes,\n when,\n satisfaction: goalOpts?.satisfaction,\n maxSteps: goalOpts?.maxSteps,\n extract: goalOpts?.extract,\n timeout: goalOpts?.timeout,\n signal: goalOpts?.signal,\n selectionStrategy: goalOpts?.selectionStrategy,\n relaxation: goalOpts?.relaxation,\n onStep: goalOpts?.onStep,\n onStall: goalOpts?.onStall,\n checkpoint: goalOpts?.checkpoint,\n },\n initialInput,\n \"__imperative_goal\",\n );\n },\n\n async resumeGoal<T>(\n checkpointState: GoalCheckpointState,\n pattern: GoalPattern<T>,\n ): Promise<GoalResult<T>> {\n assertNotDisposed();\n\n if (\n !checkpointState ||\n checkpointState.version !== 1 ||\n (checkpointState.type !== \"goal\" &&\n (checkpointState as unknown as Record<string, unknown>).type !==\n \"converge\")\n ) {\n throw new Error(\"[Directive MultiAgent] Invalid goal checkpoint state\");\n }\n // Migration shim: accept legacy \"converge\" checkpoint states (shallow copy to avoid mutating input)\n const normalizedState =\n (checkpointState as unknown as Record<string, unknown>).type ===\n \"converge\"\n ? { ...checkpointState, type: \"goal\" as const }\n : checkpointState;\n\n return runGoalInternal<T>(\n pattern,\n {}, // initialInput ignored when resumeFrom is provided\n normalizedState.patternId,\n normalizedState,\n );\n },\n\n async resumeSequential<T>(\n checkpointState: SequentialCheckpointState,\n pattern: SequentialPattern<T>,\n ): Promise<T> {\n assertNotDisposed();\n\n if (\n !checkpointState ||\n checkpointState.version !== 1 ||\n checkpointState.type !== \"sequential\"\n ) {\n throw new Error(\n \"[Directive MultiAgent] Invalid sequential checkpoint state\",\n );\n }\n\n return runSequentialPattern<T>(\n pattern,\n checkpointState.currentInput,\n checkpointState.patternId,\n checkpointState,\n );\n },\n\n async resumeSupervisor<T>(\n checkpointState: SupervisorCheckpointState,\n pattern: SupervisorPattern<T>,\n options?: { input?: string },\n ): Promise<T> {\n assertNotDisposed();\n\n if (\n !checkpointState ||\n checkpointState.version !== 1 ||\n checkpointState.type !== \"supervisor\"\n ) {\n throw new Error(\n \"[Directive MultiAgent] Invalid supervisor checkpoint state\",\n );\n }\n\n const input = options?.input ?? checkpointState.currentInput;\n\n return runSupervisorPattern<T>(\n pattern,\n input,\n checkpointState.patternId,\n checkpointState,\n );\n },\n\n async resumeReflect<T>(\n checkpointState: ReflectCheckpointState,\n pattern: ReflectPattern<T>,\n options?: { input?: string },\n ): Promise<T> {\n assertNotDisposed();\n\n if (\n !checkpointState ||\n checkpointState.version !== 1 ||\n checkpointState.type !== \"reflect\"\n ) {\n throw new Error(\n \"[Directive MultiAgent] Invalid reflect checkpoint state\",\n );\n }\n\n const input = options?.input ?? checkpointState.effectiveInput;\n\n return runReflectPattern<T>(\n pattern,\n input,\n checkpointState.patternId,\n checkpointState,\n );\n },\n\n async resumeDebate<T>(\n checkpointState: DebateCheckpointState,\n pattern: DebatePattern<T>,\n ): Promise<DebateResult<T>> {\n assertNotDisposed();\n\n if (\n !checkpointState ||\n checkpointState.version !== 1 ||\n checkpointState.type !== \"debate\"\n ) {\n throw new Error(\n \"[Directive MultiAgent] Invalid debate checkpoint state\",\n );\n }\n\n return runDebateInternal<T>(\n pattern,\n checkpointState.currentInput,\n checkpointState.patternId,\n checkpointState,\n );\n },\n\n async resumeDag<T>(\n checkpointState: DagCheckpointState,\n pattern: DagPattern<T>,\n options?: { input?: string },\n ): Promise<T> {\n assertNotDisposed();\n\n if (\n !checkpointState ||\n checkpointState.version !== 1 ||\n checkpointState.type !== \"dag\"\n ) {\n throw new Error(\"[Directive MultiAgent] Invalid DAG checkpoint state\");\n }\n\n const input = options?.input ?? checkpointState.input;\n\n return runDagPattern<T>(\n pattern,\n input,\n checkpointState.patternId,\n checkpointState,\n );\n },\n\n async replay<T>(\n checkpointId: string,\n pattern: ExecutionPattern,\n options?: { input?: string },\n ): Promise<T> {\n assertNotDisposed();\n\n if (!checkpointStore) {\n throw new Error(\n \"[Directive MultiAgent] No checkpoint store configured\",\n );\n }\n\n const checkpoint = await checkpointStore.load(checkpointId);\n if (!checkpoint) {\n throw new Error(\n `[Directive MultiAgent] Checkpoint not found: ${checkpointId}`,\n );\n }\n\n // Validate parsed state — prototype pollution defense + structure check\n let state: PatternCheckpointState;\n try {\n const parsed = JSON.parse(checkpoint.systemExport);\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"Parsed checkpoint state is not an object\");\n }\n\n const BLOCKED = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n for (const key of Object.keys(parsed)) {\n if (BLOCKED.has(key)) {\n throw new Error(`Checkpoint state contains blocked key: ${key}`);\n }\n }\n\n const validTypes = new Set([\n \"sequential\",\n \"supervisor\",\n \"reflect\",\n \"debate\",\n \"dag\",\n \"goal\",\n \"converge\",\n ]);\n if (!validTypes.has(parsed.type)) {\n throw new Error(`Unknown checkpoint pattern type: ${parsed.type}`);\n }\n if (parsed.version !== 1) {\n throw new Error(`Unsupported checkpoint version: ${parsed.version}`);\n }\n\n state = parsed as PatternCheckpointState;\n } catch (err) {\n throw new Error(\n `[Directive MultiAgent] Invalid checkpoint state: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const step = getPatternStep(state);\n const replayInput =\n options?.input ??\n (\"currentInput\" in state\n ? (state as { currentInput: string }).currentInput\n : \"\");\n\n // Record timeline event\n if (timeline) {\n timeline.record({\n type: \"checkpoint_restore\",\n timestamp: Date.now(),\n snapshotId: null,\n checkpointId,\n patternType: state.type,\n step,\n });\n }\n\n switch (state.type) {\n case \"sequential\":\n return runSequentialPattern<T>(\n pattern as SequentialPattern<T>,\n replayInput,\n state.patternId,\n state,\n );\n case \"supervisor\":\n return runSupervisorPattern<T>(\n pattern as SupervisorPattern<T>,\n replayInput,\n state.patternId,\n state,\n );\n case \"reflect\":\n return runReflectPattern<T>(\n pattern as ReflectPattern<T>,\n replayInput,\n state.patternId,\n state,\n );\n case \"debate\":\n return runDebateInternal(\n pattern as DebatePattern<T>,\n replayInput,\n state.patternId,\n state,\n ) as Promise<T>;\n case \"dag\":\n return runDagPattern<T>(\n pattern as DagPattern<T>,\n replayInput,\n state.patternId,\n state,\n );\n case \"goal\":\n return runGoalInternal(\n pattern as GoalPattern<T>,\n state.facts,\n state.patternId,\n state,\n ) as Promise<T>;\n }\n },\n\n // ---- Breakpoint Methods ----\n\n resumeBreakpoint(\n id: string,\n modifications?: BreakpointModifications,\n ): void {\n assertNotDisposed();\n\n if (modifications) {\n breakpointModifications.set(id, modifications);\n }\n\n // Find which agent has this breakpoint pending and resolve it\n for (const agentId of Object.keys(agents)) {\n const agentFacts = getAgentFacts(agentId);\n const bpState = getBreakpointState(agentFacts);\n if (bpState.pending.some((r: BreakpointRequest) => r.id === id)) {\n system.batch(() => {\n const currentBp = getBreakpointState(agentFacts);\n const resolved = [...currentBp.resolved, id];\n setBreakpointState(agentFacts, {\n ...currentBp,\n pending: currentBp.pending.filter(\n (r: BreakpointRequest) => r.id !== id,\n ),\n resolved:\n resolved.length > MAX_BREAKPOINT_HISTORY\n ? resolved.slice(-MAX_BREAKPOINT_HISTORY)\n : resolved,\n });\n });\n\n return;\n }\n }\n\n if (debug) {\n console.debug(\n `[Directive MultiAgent] resumeBreakpoint() ignored: no pending breakpoint \"${id}\"`,\n );\n }\n },\n\n cancelBreakpoint(id: string, reason?: string): void {\n assertNotDisposed();\n\n if (reason) {\n breakpointCancelReasons.set(id, reason);\n }\n\n for (const agentId of Object.keys(agents)) {\n const agentFacts = getAgentFacts(agentId);\n const bpState = getBreakpointState(agentFacts);\n if (bpState.pending.some((r: BreakpointRequest) => r.id === id)) {\n system.batch(() => {\n const currentBp = getBreakpointState(agentFacts);\n const cancelled = [...currentBp.cancelled, id];\n setBreakpointState(agentFacts, {\n ...currentBp,\n pending: currentBp.pending.filter(\n (r: BreakpointRequest) => r.id !== id,\n ),\n cancelled:\n cancelled.length > MAX_BREAKPOINT_HISTORY\n ? cancelled.slice(-MAX_BREAKPOINT_HISTORY)\n : cancelled,\n });\n });\n\n return;\n }\n }\n\n if (debug) {\n console.debug(\n `[Directive MultiAgent] cancelBreakpoint() ignored: no pending breakpoint \"${id}\"`,\n );\n }\n },\n\n getPendingBreakpoints(): BreakpointRequest[] {\n const pending: BreakpointRequest[] = [];\n for (const agentId of Object.keys(agents)) {\n const agentFacts = getAgentFacts(agentId);\n const bpState = getBreakpointState(agentFacts);\n pending.push(...bpState.pending);\n }\n\n return pending;\n },\n\n getLastReflectionHistory(): ReflectIterationRecord[] | null {\n return lastReflectionHistory ? [...lastReflectionHistory] : null;\n },\n\n dispose() {\n if (disposed) {\n return;\n }\n // Reset before marking as disposed (reset() calls assertNotDisposed())\n orchestrator.reset();\n // Clear callback references to allow garbage collection\n scratchpadChangeCallbacks.clear();\n scratchpadKeyCallbacks.clear();\n derivedChangeCallbacks.clear();\n idleWaiters.clear();\n disposed = true;\n system.destroy();\n },\n };\n\n // Compute initial derivation values so they're available immediately\n recomputeDerivations();\n\n return orchestrator;\n}\n\n/**\n * Validate that a DAG has no cycles using Kahn's algorithm.\n * Throws if a cycle is detected.\n */\nfunction validateDagAcyclic(\n patternId: string,\n nodes: Record<string, DagNode>,\n): void {\n const nodeIds = Object.keys(nodes);\n\n // Validate deps reference valid node IDs\n for (const [nodeId, node] of Object.entries(nodes)) {\n for (const depId of node.deps ?? []) {\n if (!nodes[depId]) {\n throw new Error(\n `[Directive MultiAgent] DAG pattern \"${patternId}\": node \"${nodeId}\" depends on unknown node \"${depId}\"`,\n );\n }\n }\n }\n\n // Ensure at least one root node\n const hasRoot = nodeIds.some((id) => {\n const deps = nodes[id]?.deps;\n\n return !deps || deps.length === 0;\n });\n if (!hasRoot) {\n throw new Error(\n `[Directive MultiAgent] DAG pattern \"${patternId}\": no root nodes (every node has dependencies)`,\n );\n }\n\n // Kahn's algorithm for cycle detection\n const inDegree: Record<string, number> = Object.create(null);\n const adjacency: Record<string, string[]> = Object.create(null);\n for (const id of nodeIds) {\n adjacency[id] = [];\n }\n for (const [nodeId, node] of Object.entries(nodes)) {\n inDegree[nodeId] = (node.deps ?? []).length;\n for (const depId of node.deps ?? []) {\n adjacency[depId]!.push(nodeId);\n }\n }\n\n const queue: string[] = [];\n for (const id of nodeIds) {\n if (inDegree[id] === 0) {\n queue.push(id);\n }\n }\n\n let visited = 0;\n while (queue.length > 0) {\n const current = queue.shift()!;\n visited++;\n for (const dependent of adjacency[current] ?? []) {\n inDegree[dependent]!--;\n if (inDegree[dependent] === 0) {\n queue.push(dependent);\n }\n }\n }\n\n if (visited !== nodeIds.length) {\n throw new Error(\n `[Directive MultiAgent] DAG pattern \"${patternId}\": cycle detected. Visited ${visited}/${nodeIds.length} nodes.`,\n );\n }\n}\n\n// ============================================================================\n// Barrel Re-exports from Extracted Modules\n// ============================================================================\n// These modules were extracted for maintainability. Re-exporting here so all\n// existing `import { ... } from \"./multi-agent-orchestrator.js\"` continue to work.\n\nexport * from \"./pattern-factories.js\";\nexport * from \"./pattern-serialization.js\";\nexport * from \"./pattern-composition.js\";\n","/**\n * Directive AI Testing Utilities\n *\n * Provides testing helpers for:\n * - Mock agent runners with configurable responses\n * - Guardrail testing with assertions\n * - Approval workflow simulation\n * - Snapshot testing for constraint evaluation\n *\n * @example\n * ```typescript\n * import { createMockAgentRunner, testGuardrail, createApprovalSimulator } from '@directive-run/ai/testing';\n *\n * describe('MyOrchestrator', () => {\n * it('should block PII in input', async () => {\n * const result = await testGuardrail(createPIIGuardrail(), {\n * input: 'My SSN is 123-45-6789',\n * });\n * expect(result.passed).toBe(false);\n * expect(result.reason).toContain('PII');\n * });\n * });\n * ```\n */\n\nimport {\n type AgentOrchestrator,\n type OrchestratorOptions,\n createAgentOrchestrator,\n} from \"./agent-orchestrator.js\";\nimport type {\n BreakpointModifications,\n BreakpointRequest,\n} from \"./breakpoints.js\";\nimport {\n type Checkpoint,\n type CheckpointStore,\n InMemoryCheckpointStore,\n} from \"./checkpoint.js\";\nimport {\n type MultiAgentOrchestrator,\n type MultiAgentOrchestratorOptions,\n type TaskRegistration,\n createMultiAgentOrchestrator,\n} from \"./multi-agent-orchestrator.js\";\nimport type { MultiplexedStreamChunk } from \"./streaming.js\";\nimport type {\n AgentLike,\n AgentRunner,\n ApprovalRequest,\n GuardrailContext,\n GuardrailFn,\n GuardrailResult,\n InputGuardrailData,\n Message,\n OutputGuardrailData,\n RunOptions,\n RunResult,\n ToolCall,\n ToolCallGuardrailData,\n} from \"./types.js\";\n\n// ============================================================================\n// Mock Agent Runner\n// ============================================================================\n\n/** Configuration for mock agent responses */\nexport interface MockAgentConfig<T = unknown> {\n /** Final output to return */\n output: T;\n /** Messages to emit during run */\n messages?: Message[];\n /** Tool calls to emit during run */\n toolCalls?: ToolCall[];\n /** Total tokens to report */\n totalTokens?: number;\n /** Delay before responding (ms) */\n delay?: number;\n /** Error to throw instead of returning */\n error?: Error;\n /** Function to generate dynamic responses */\n generate?: (input: string, agent: AgentLike) => Partial<MockAgentConfig<T>>;\n}\n\n/** Mock agent runner options */\nexport interface MockAgentRunnerOptions {\n /** Default response for unmatched agents */\n defaultResponse?: MockAgentConfig;\n /** Responses keyed by agent name */\n responses?: Record<string, MockAgentConfig>;\n /** Record all calls for assertions */\n recordCalls?: boolean;\n /** Callback for each run */\n onRun?: (agent: AgentLike, input: string) => void;\n}\n\n/** Recorded call for assertions */\nexport interface RecordedCall {\n agent: AgentLike;\n input: string;\n options?: RunOptions;\n timestamp: number;\n}\n\n/** Mock agent runner instance */\nexport interface MockAgentRunner {\n /** The run function to pass to orchestrator */\n run: AgentRunner;\n /** Get all recorded calls */\n getCalls(): RecordedCall[];\n /** Get calls for a specific agent */\n getCallsFor(agentName: string): RecordedCall[];\n /** Clear recorded calls */\n clearCalls(): void;\n /** Set response for an agent */\n setResponse<T>(agentName: string, config: MockAgentConfig<T>): void;\n /** Set default response */\n setDefaultResponse<T>(config: MockAgentConfig<T>): void;\n}\n\n/**\n * Create a mock agent runner for testing.\n *\n * @example\n * ```typescript\n * const mock = createMockAgentRunner({\n * responses: {\n * 'my-agent': {\n * output: 'Hello, world!',\n * totalTokens: 100,\n * },\n * },\n * });\n *\n * const orchestrator = createAgentOrchestrator({ runner: mock.run });\n * const result = await orchestrator.run(myAgent, 'Hi');\n *\n * expect(result.output).toBe('Hello, world!');\n * expect(mock.getCalls()).toHaveLength(1);\n * ```\n */\nexport function createMockAgentRunner(\n options: MockAgentRunnerOptions = {},\n): MockAgentRunner {\n const {\n defaultResponse = { output: \"mock response\", totalTokens: 10 },\n responses = {},\n recordCalls = true,\n onRun,\n } = options;\n\n const calls: RecordedCall[] = [];\n const responseMap = new Map<string, MockAgentConfig>(\n Object.entries(responses),\n );\n let currentDefault = defaultResponse;\n\n const run: AgentRunner = async <T>(\n agent: AgentLike,\n input: string,\n runOptions?: RunOptions,\n ): Promise<RunResult<T>> => {\n onRun?.(agent, input);\n\n if (recordCalls) {\n calls.push({\n agent,\n input,\n options: runOptions,\n timestamp: Date.now(),\n });\n }\n\n // Get config for this agent\n let config = responseMap.get(agent.name) ?? currentDefault;\n\n // Apply dynamic generation if present\n if (config.generate) {\n const generated = config.generate(input, agent);\n config = { ...config, ...generated };\n }\n\n // Handle error case\n if (config.error) {\n throw config.error;\n }\n\n // Apply delay\n if (config.delay && config.delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, config.delay));\n }\n\n // Emit messages\n const messages = config.messages ?? [];\n for (const message of messages) {\n runOptions?.onMessage?.(message);\n }\n\n // Emit tool calls\n const toolCalls = config.toolCalls ?? [];\n for (const toolCall of toolCalls) {\n runOptions?.onToolCall?.(toolCall);\n }\n\n return {\n output: config.output as T,\n messages,\n toolCalls,\n totalTokens: config.totalTokens ?? 10,\n };\n };\n\n return {\n run,\n getCalls: () => [...calls],\n getCallsFor: (name) => calls.filter((c) => c.agent.name === name),\n clearCalls: () => (calls.length = 0),\n setResponse: (name, config) => responseMap.set(name, config),\n setDefaultResponse: (config) => (currentDefault = config),\n };\n}\n\n// ============================================================================\n// Guardrail Testing\n// ============================================================================\n\n/** Test input for guardrail testing */\nexport type GuardrailTestInput<T> = T extends InputGuardrailData\n ? { input: string; agentName?: string }\n : T extends OutputGuardrailData\n ? {\n output: unknown;\n agentName?: string;\n input?: string;\n messages?: Message[];\n }\n : T extends ToolCallGuardrailData\n ? { toolCall: ToolCall; agentName?: string; input?: string }\n : Partial<T>;\n\n/** Extended guardrail result with test assertions */\nexport interface GuardrailTestResult extends GuardrailResult {\n /** Time taken to evaluate (ms) */\n duration: number;\n /** The data that was tested */\n testedData: unknown;\n /** Assert that the guardrail passed */\n assertPassed(): void;\n /** Assert that the guardrail failed */\n assertFailed(expectedReason?: string | RegExp): void;\n /** Assert that transformation occurred */\n assertTransformed(expected?: unknown): void;\n}\n\n/**\n * Test a guardrail with assertions.\n *\n * @example\n * ```typescript\n * // Test PII detection\n * const result = await testGuardrail(createPIIGuardrail(), {\n * input: 'My SSN is 123-45-6789',\n * });\n * result.assertFailed(/PII/);\n *\n * // Test input transformation\n * const redactResult = await testGuardrail(createPIIGuardrail({ redact: true }), {\n * input: 'My SSN is 123-45-6789',\n * });\n * redactResult.assertPassed();\n * redactResult.assertTransformed();\n * ```\n */\nexport async function testGuardrail<T>(\n guardrail: GuardrailFn<T>,\n testInput: GuardrailTestInput<T>,\n context?: Partial<GuardrailContext>,\n): Promise<GuardrailTestResult> {\n // Build full data object\n const data = {\n agentName: \"test-agent\",\n input: \"\",\n ...testInput,\n } as unknown as T;\n\n // Build context\n const fullContext: GuardrailContext = {\n agentName: (testInput as { agentName?: string }).agentName ?? \"test-agent\",\n input: (testInput as { input?: string }).input ?? \"\",\n facts: context?.facts ?? {},\n ...context,\n };\n\n const start = Date.now();\n const result = await guardrail(data, fullContext);\n const duration = Date.now() - start;\n\n return {\n ...result,\n duration,\n testedData: data,\n assertPassed() {\n if (!result.passed) {\n throw new Error(\n `Expected guardrail to pass, but it failed: ${result.reason}`,\n );\n }\n },\n assertFailed(expectedReason) {\n if (result.passed) {\n throw new Error(\"Expected guardrail to fail, but it passed\");\n }\n if (expectedReason !== undefined) {\n if (\n typeof expectedReason === \"string\" &&\n !result.reason?.includes(expectedReason)\n ) {\n throw new Error(\n `Expected failure reason to include \"${expectedReason}\", got: ${result.reason}`,\n );\n }\n if (\n expectedReason instanceof RegExp &&\n !expectedReason.test(result.reason ?? \"\")\n ) {\n throw new Error(\n `Expected failure reason to match ${expectedReason}, got: ${result.reason}`,\n );\n }\n }\n },\n assertTransformed(expected) {\n if (result.transformed === undefined) {\n throw new Error(\n \"Expected guardrail to transform input, but no transformation occurred\",\n );\n }\n if (expected !== undefined && result.transformed !== expected) {\n throw new Error(\n `Expected transformation to be ${JSON.stringify(expected)}, got: ${JSON.stringify(result.transformed)}`,\n );\n }\n },\n };\n}\n\n/**\n * Test multiple inputs against a guardrail.\n *\n * @example\n * ```typescript\n * const results = await testGuardrailBatch(createPIIGuardrail(), [\n * { input: 'Hello world', expect: 'pass' },\n * { input: 'My SSN is 123-45-6789', expect: 'fail' },\n * { input: 'Email: test@example.com', expect: 'fail' },\n * ]);\n *\n * expect(results.allPassed()).toBe(true);\n * ```\n */\nexport async function testGuardrailBatch<T>(\n guardrail: GuardrailFn<T>,\n testCases: Array<{\n input: GuardrailTestInput<T>;\n expect: \"pass\" | \"fail\" | \"transform\";\n context?: Partial<GuardrailContext>;\n }>,\n): Promise<{\n results: GuardrailTestResult[];\n allPassed(): boolean;\n failures(): Array<{\n index: number;\n expected: string;\n actual: GuardrailTestResult;\n }>;\n}> {\n const results: GuardrailTestResult[] = [];\n const failures: Array<{\n index: number;\n expected: string;\n actual: GuardrailTestResult;\n }> = [];\n\n for (let i = 0; i < testCases.length; i++) {\n const testCase = testCases[i]!;\n const result = await testGuardrail(\n guardrail,\n testCase.input,\n testCase.context,\n );\n results.push(result);\n\n const actualOutcome = !result.passed\n ? \"fail\"\n : result.transformed !== undefined\n ? \"transform\"\n : \"pass\";\n\n if (actualOutcome !== testCase.expect) {\n failures.push({ index: i, expected: testCase.expect, actual: result });\n }\n }\n\n return {\n results,\n allPassed: () => failures.length === 0,\n failures: () => failures,\n };\n}\n\n// ============================================================================\n// Approval Simulation\n// ============================================================================\n\n/** Approval simulator options */\nexport interface ApprovalSimulatorOptions {\n /** Auto-approve requests matching this predicate */\n autoApprove?: (request: ApprovalRequest) => boolean;\n /** Auto-reject requests matching this predicate */\n autoReject?: (request: ApprovalRequest) => boolean | string;\n /** Delay before auto-approval/rejection (ms) */\n delay?: number;\n /** Record all requests for assertions */\n recordRequests?: boolean;\n}\n\n/** Approval simulator instance */\nexport interface ApprovalSimulator {\n /** Handle an approval request */\n handle(request: ApprovalRequest): Promise<\"approved\" | \"rejected\">;\n /** Get all recorded requests */\n getRequests(): ApprovalRequest[];\n /** Clear recorded requests */\n clearRequests(): void;\n /** Manually approve a request */\n approve(requestId: string): void;\n /** Manually reject a request */\n reject(requestId: string, reason?: string): void;\n /** Wait for a specific request */\n waitForRequest(\n predicate: (req: ApprovalRequest) => boolean,\n timeoutMs?: number,\n ): Promise<ApprovalRequest>;\n}\n\n/**\n * Create an approval simulator for testing approval workflows.\n *\n * @example\n * ```typescript\n * const simulator = createApprovalSimulator({\n * autoApprove: (req) => req.type === 'tool_call' && req.data.name === 'search',\n * autoReject: (req) => req.type === 'tool_call' && req.data.name === 'delete',\n * });\n *\n * // Use in tests\n * orchestrator.onApprovalRequest = (req) => simulator.handle(req);\n * ```\n */\nexport function createApprovalSimulator(\n options: ApprovalSimulatorOptions = {},\n): ApprovalSimulator {\n const { autoApprove, autoReject, delay = 0, recordRequests = true } = options;\n\n const requests: ApprovalRequest[] = [];\n const pendingRequests = new Map<\n string,\n {\n request: ApprovalRequest;\n resolve: (decision: \"approved\" | \"rejected\") => void;\n }\n >();\n const requestWaiters: Array<{\n predicate: (req: ApprovalRequest) => boolean;\n resolve: (req: ApprovalRequest) => void;\n }> = [];\n\n return {\n async handle(request: ApprovalRequest): Promise<\"approved\" | \"rejected\"> {\n if (recordRequests) {\n requests.push(request);\n }\n\n // Notify waiters (resolve matching ones, remove them from array)\n for (let i = requestWaiters.length - 1; i >= 0; i--) {\n const waiter = requestWaiters[i]!;\n if (waiter.predicate(request)) {\n requestWaiters.splice(i, 1);\n waiter.resolve(request);\n }\n }\n\n // Apply delay\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n // Check auto-reject first (security-first)\n if (autoReject) {\n const rejectResult = autoReject(request);\n if (rejectResult) {\n return \"rejected\";\n }\n }\n\n // Check auto-approve\n if (autoApprove?.(request)) {\n return \"approved\";\n }\n\n // Wait for manual decision\n return new Promise((resolve) => {\n pendingRequests.set(request.id, { request, resolve });\n });\n },\n\n getRequests: () => [...requests],\n clearRequests: () => (requests.length = 0),\n\n approve(requestId: string) {\n const pending = pendingRequests.get(requestId);\n if (pending) {\n pending.resolve(\"approved\");\n pendingRequests.delete(requestId);\n }\n },\n\n reject(requestId: string, reason?: string) {\n const pending = pendingRequests.get(requestId);\n if (pending) {\n pending.resolve(\"rejected\");\n pendingRequests.delete(requestId);\n // Store reason on the request for test assertions\n const request = requests.find((r) => r.id === requestId);\n if (request) {\n (\n request as ApprovalRequest & { rejectionReason?: string }\n ).rejectionReason = reason;\n }\n }\n },\n\n waitForRequest(predicate, timeoutMs = 5000): Promise<ApprovalRequest> {\n // Check existing requests first\n const existing = requests.find(predicate);\n if (existing) {\n return Promise.resolve(existing);\n }\n\n // Wait for future request\n return new Promise((resolve, reject) => {\n const entry = {\n predicate,\n resolve: (req: ApprovalRequest) => {\n clearTimeout(timeout);\n resolve(req);\n },\n };\n\n const timeout = setTimeout(() => {\n const idx = requestWaiters.indexOf(entry);\n if (idx >= 0) {\n requestWaiters.splice(idx, 1);\n }\n reject(new Error(\"Timeout waiting for approval request\"));\n }, timeoutMs);\n\n requestWaiters.push(entry);\n });\n },\n };\n}\n\n// ============================================================================\n// Test Orchestrator Factory\n// ============================================================================\n\n/** Options for test orchestrator */\nexport interface TestOrchestratorOptions<F extends Record<string, unknown>>\n extends Omit<OrchestratorOptions<F>, \"runner\"> {\n /** Mock responses for agents */\n mockResponses?: Record<string, MockAgentConfig>;\n /** Default mock response */\n defaultMockResponse?: MockAgentConfig;\n}\n\n/** Test orchestrator with additional testing utilities */\nexport interface TestOrchestrator<F extends Record<string, unknown>>\n extends AgentOrchestrator<F> {\n /** The mock runner */\n mockRunner: MockAgentRunner;\n /** Approval simulator */\n approvalSimulator: ApprovalSimulator;\n /** Get recorded agent calls */\n getCalls(): RecordedCall[];\n /** Get approval requests */\n getApprovalRequests(): ApprovalRequest[];\n /** Reset all state */\n resetAll(): void;\n}\n\n/**\n * Create a test orchestrator with mocking and simulation built in.\n *\n * @example\n * ```typescript\n * const test = createTestOrchestrator({\n * mockResponses: {\n * 'my-agent': { output: 'test response' },\n * },\n * constraints: {\n * needsApproval: {\n * when: () => true,\n * require: { type: 'NEED_APPROVAL' },\n * },\n * },\n * });\n *\n * await test.run(myAgent, 'Hello');\n * expect(test.getCalls()).toHaveLength(1);\n * ```\n */\nexport function createTestOrchestrator<\n F extends Record<string, unknown> = Record<string, never>,\n>(options: TestOrchestratorOptions<F> = {}): TestOrchestrator<F> {\n const { mockResponses, defaultMockResponse, ...orchestratorOptions } =\n options;\n\n const mockRunner = createMockAgentRunner({\n responses: mockResponses,\n defaultResponse: defaultMockResponse,\n });\n\n const approvalSimulator = createApprovalSimulator();\n\n const orchestrator = createAgentOrchestrator<F>({\n ...orchestratorOptions,\n runner: mockRunner.run,\n onApprovalRequest: (req) => {\n approvalSimulator.handle(req);\n orchestratorOptions.onApprovalRequest?.(req);\n },\n });\n\n // Use Object.create to preserve getters instead of { ...orchestrator } which evaluates them once\n const testOrchestrator = Object.create(orchestrator) as TestOrchestrator<F>;\n testOrchestrator.mockRunner = mockRunner;\n testOrchestrator.approvalSimulator = approvalSimulator;\n testOrchestrator.getCalls = () => mockRunner.getCalls();\n testOrchestrator.getApprovalRequests = () => approvalSimulator.getRequests();\n testOrchestrator.resetAll = () => {\n orchestrator.reset();\n mockRunner.clearCalls();\n approvalSimulator.clearRequests();\n };\n\n return testOrchestrator;\n}\n\n// ============================================================================\n// Snapshot Testing\n// ============================================================================\n\n/** Constraint evaluation snapshot */\nexport interface ConstraintSnapshot {\n constraintId: string;\n triggered: boolean;\n requirement?: unknown;\n facts: Record<string, unknown>;\n timestamp: number;\n}\n\n/**\n * Create a constraint evaluation recorder for snapshot testing.\n *\n * @example\n * ```typescript\n * const recorder = createConstraintRecorder();\n * const orchestrator = createAgentOrchestrator({\n * plugins: [recorder.plugin],\n * });\n *\n * await orchestrator.run(agent, 'Hello');\n *\n * expect(recorder.getSnapshots()).toMatchSnapshot();\n * ```\n */\nexport function createConstraintRecorder(): {\n plugin: {\n name: string;\n onRequirementCreated: (data: {\n constraintId: string;\n requirement: unknown;\n facts: unknown;\n }) => void;\n };\n getSnapshots(): ConstraintSnapshot[];\n clearSnapshots(): void;\n} {\n const snapshots: ConstraintSnapshot[] = [];\n\n return {\n plugin: {\n name: \"constraint-recorder\",\n onRequirementCreated(data) {\n snapshots.push({\n constraintId: data.constraintId,\n triggered: true,\n requirement: data.requirement,\n facts: data.facts as Record<string, unknown>,\n timestamp: Date.now(),\n });\n },\n },\n getSnapshots: () => [...snapshots],\n clearSnapshots: () => (snapshots.length = 0),\n };\n}\n\n// ============================================================================\n// Assertion Helpers\n// ============================================================================\n\n/**\n * Assert that an orchestrator has specific state.\n *\n * @example\n * ```typescript\n * assertOrchestratorState(orchestrator, {\n * agentStatus: 'completed',\n * tokenUsage: { min: 0, max: 1000 },\n * pendingApprovals: 0,\n * });\n * ```\n */\nexport function assertOrchestratorState<F extends Record<string, unknown>>(\n orchestrator: AgentOrchestrator<F>,\n expected: {\n agentStatus?: \"idle\" | \"running\" | \"paused\" | \"completed\" | \"error\";\n tokenUsage?: { min?: number; max?: number; exact?: number };\n pendingApprovals?: number;\n conversationLength?: { min?: number; max?: number; exact?: number };\n },\n): void {\n const state = orchestrator.facts;\n\n if (\n expected.agentStatus !== undefined &&\n state.agent.status !== expected.agentStatus\n ) {\n throw new Error(\n `Expected agent status to be \"${expected.agentStatus}\", got \"${state.agent.status}\"`,\n );\n }\n\n if (expected.tokenUsage !== undefined) {\n const { min, max, exact } = expected.tokenUsage;\n if (exact !== undefined && state.agent.tokenUsage !== exact) {\n throw new Error(\n `Expected token usage to be exactly ${exact}, got ${state.agent.tokenUsage}`,\n );\n }\n if (min !== undefined && state.agent.tokenUsage < min) {\n throw new Error(\n `Expected token usage to be at least ${min}, got ${state.agent.tokenUsage}`,\n );\n }\n if (max !== undefined && state.agent.tokenUsage > max) {\n throw new Error(\n `Expected token usage to be at most ${max}, got ${state.agent.tokenUsage}`,\n );\n }\n }\n\n if (\n expected.pendingApprovals !== undefined &&\n state.approval.pending.length !== expected.pendingApprovals\n ) {\n throw new Error(\n `Expected ${expected.pendingApprovals} pending approvals, got ${state.approval.pending.length}`,\n );\n }\n\n if (expected.conversationLength !== undefined) {\n const { min, max, exact } = expected.conversationLength;\n const len = state.conversation.length;\n if (exact !== undefined && len !== exact) {\n throw new Error(\n `Expected conversation length to be exactly ${exact}, got ${len}`,\n );\n }\n if (min !== undefined && len < min) {\n throw new Error(\n `Expected conversation length to be at least ${min}, got ${len}`,\n );\n }\n if (max !== undefined && len > max) {\n throw new Error(\n `Expected conversation length to be at most ${max}, got ${len}`,\n );\n }\n }\n}\n\n// ============================================================================\n// Fake Timers Support\n// ============================================================================\n\n/**\n * Create a time controller for testing time-dependent behavior.\n *\n * @example\n * ```typescript\n * const time = createTimeController();\n *\n * // Override Date.now\n * const originalNow = Date.now;\n * Date.now = () => time.now();\n *\n * time.advance(1000); // Advance 1 second\n *\n * // Restore\n * Date.now = originalNow;\n * ```\n */\nexport function createTimeController(startTime = Date.now()): {\n now(): number;\n advance(ms: number): void;\n set(time: number): void;\n reset(): void;\n} {\n let currentTime = startTime;\n const initial = startTime;\n\n return {\n now: () => currentTime,\n advance: (ms) => {\n currentTime += ms;\n },\n set: (time) => {\n currentTime = time;\n },\n reset: () => {\n currentTime = initial;\n },\n };\n}\n\n// ============================================================================\n// Multi-Agent Test Orchestrator\n// ============================================================================\n\n/** Options for test multi-agent orchestrator */\nexport interface TestMultiAgentOrchestratorOptions\n extends Omit<MultiAgentOrchestratorOptions, \"runner\"> {\n /** Mock responses keyed by agent ID — internally mapped to agent names for the mock runner */\n mockResponses?: Record<string, MockAgentConfig>;\n /** Default mock response for unmatched agents */\n defaultMockResponse?: MockAgentConfig;\n /** Mock tasks keyed by task ID — auto-generates TaskRegistration wrappers */\n mockTasks?: Record<\n string,\n { output: unknown; delay?: number; shouldError?: boolean }\n >;\n}\n\n/** Test multi-agent orchestrator with additional testing utilities */\nexport interface TestMultiAgentOrchestrator extends MultiAgentOrchestrator {\n /** The mock runner */\n mockRunner: MockAgentRunner;\n /** Approval simulator */\n approvalSimulator: ApprovalSimulator;\n /** Get recorded agent calls */\n getCalls(): RecordedCall[];\n /** Get approval requests */\n getApprovalRequests(): ApprovalRequest[];\n /** Reset all state */\n resetAll(): void;\n}\n\n/**\n * Create a test multi-agent orchestrator with mocking and simulation built in.\n *\n * @example\n * ```typescript\n * const test = createTestMultiAgentOrchestrator({\n * agents: {\n * researcher: { agent: { name: 'researcher' } },\n * writer: { agent: { name: 'writer' } },\n * },\n * mockResponses: {\n * researcher: { output: 'Research results', totalTokens: 100 },\n * writer: { output: 'Written article', totalTokens: 200 },\n * },\n * });\n *\n * const result = await test.runAgent('researcher', 'What is AI?');\n * expect(result.output).toBe('Research results');\n * expect(test.getCalls()).toHaveLength(1);\n * ```\n */\nexport function createTestMultiAgentOrchestrator(\n options: TestMultiAgentOrchestratorOptions,\n): TestMultiAgentOrchestrator {\n const {\n mockResponses = {},\n defaultMockResponse,\n mockTasks: mockTaskConfigs,\n ...orchestratorOptions\n } = options;\n\n // Convert mockTasks into real TaskRegistration entries\n if (mockTaskConfigs) {\n const existingTasks = orchestratorOptions.tasks ?? {};\n for (const [taskId, config] of Object.entries(mockTaskConfigs)) {\n if (!existingTasks[taskId]) {\n existingTasks[taskId] = createMockTask(config.output, {\n delay: config.delay,\n shouldError: config.shouldError,\n });\n }\n }\n orchestratorOptions.tasks = existingTasks;\n }\n\n // Map mock responses by agent name (from agent registration)\n const responsesByName: Record<string, MockAgentConfig> = {};\n for (const [agentId, config] of Object.entries(mockResponses)) {\n const registration = orchestratorOptions.agents[agentId];\n if (registration) {\n responsesByName[registration.agent.name] = config;\n }\n }\n\n const mockRunner = createMockAgentRunner({\n responses: responsesByName,\n defaultResponse: defaultMockResponse,\n });\n\n const approvalSimulator = createApprovalSimulator();\n\n const orchestrator = createMultiAgentOrchestrator({\n ...orchestratorOptions,\n runner: mockRunner.run,\n onApprovalRequest: (req) => {\n approvalSimulator.handle(req);\n orchestratorOptions.onApprovalRequest?.(req);\n },\n });\n\n // Use Object.create to preserve getters (derived, scratchpad, timeline, etc.)\n // instead of { ...orchestrator } which evaluates getters at spread time\n const testOrchestrator = Object.create(\n orchestrator,\n ) as TestMultiAgentOrchestrator;\n testOrchestrator.mockRunner = mockRunner;\n testOrchestrator.approvalSimulator = approvalSimulator;\n testOrchestrator.getCalls = () => mockRunner.getCalls();\n testOrchestrator.getApprovalRequests = () => approvalSimulator.getRequests();\n testOrchestrator.resetAll = () => {\n orchestrator.reset();\n mockRunner.clearCalls();\n approvalSimulator.clearRequests();\n };\n\n return testOrchestrator;\n}\n\n// ============================================================================\n// Multi-Agent Assertion Helpers\n// ============================================================================\n\n/**\n * Assert that a multi-agent orchestrator has specific state.\n *\n * @example\n * ```typescript\n * assertMultiAgentState(orchestrator, {\n * agentStatus: { researcher: 'completed', writer: 'idle' },\n * globalTokens: { min: 0, max: 1000 },\n * pendingHandoffs: 0,\n * });\n * ```\n */\nexport function assertMultiAgentState(\n orchestrator: MultiAgentOrchestrator,\n expected: {\n agentStatus?: Record<string, \"idle\" | \"running\" | \"completed\" | \"error\">;\n taskStatus?: Record<string, string>;\n totalTokens?: { agentId?: string; min?: number; max?: number };\n globalTokens?: { min?: number; max?: number };\n pendingHandoffs?: number;\n },\n): void {\n if (expected.taskStatus) {\n for (const [taskId, expectedStatus] of Object.entries(\n expected.taskStatus,\n )) {\n const state = orchestrator.getTaskState(taskId);\n if (!state) {\n throw new Error(\n `Expected task \"${taskId}\" to exist, but it was not found`,\n );\n }\n if (state.status !== expectedStatus) {\n throw new Error(\n `Expected task \"${taskId}\" status to be \"${expectedStatus}\", got \"${state.status}\"`,\n );\n }\n }\n }\n\n if (expected.agentStatus) {\n for (const [agentId, expectedStatus] of Object.entries(\n expected.agentStatus,\n )) {\n const state = orchestrator.getAgentState(agentId);\n if (!state) {\n throw new Error(\n `Expected agent \"${agentId}\" to exist, but it was not found`,\n );\n }\n if (state.status !== expectedStatus) {\n throw new Error(\n `Expected agent \"${agentId}\" status to be \"${expectedStatus}\", got \"${state.status}\"`,\n );\n }\n }\n }\n\n if (expected.totalTokens) {\n const { agentId, min, max } = expected.totalTokens;\n if (agentId) {\n const state = orchestrator.getAgentState(agentId);\n if (!state) {\n throw new Error(\n `Expected agent \"${agentId}\" to exist, but it was not found`,\n );\n }\n if (min !== undefined && state.totalTokens < min) {\n throw new Error(\n `Expected agent \"${agentId}\" tokens to be at least ${min}, got ${state.totalTokens}`,\n );\n }\n if (max !== undefined && state.totalTokens > max) {\n throw new Error(\n `Expected agent \"${agentId}\" tokens to be at most ${max}, got ${state.totalTokens}`,\n );\n }\n } else {\n const allStates = orchestrator.getAllAgentStates();\n const total = Object.values(allStates).reduce(\n (sum, s) => sum + s.totalTokens,\n 0,\n );\n if (min !== undefined && total < min) {\n throw new Error(\n `Expected total tokens to be at least ${min}, got ${total}`,\n );\n }\n if (max !== undefined && total > max) {\n throw new Error(\n `Expected total tokens to be at most ${max}, got ${total}`,\n );\n }\n }\n }\n\n if (expected.globalTokens) {\n const { min, max } = expected.globalTokens;\n const total = orchestrator.totalTokens;\n if (min !== undefined && total < min) {\n throw new Error(\n `Expected global tokens to be at least ${min}, got ${total}`,\n );\n }\n if (max !== undefined && total > max) {\n throw new Error(\n `Expected global tokens to be at most ${max}, got ${total}`,\n );\n }\n }\n\n if (expected.pendingHandoffs !== undefined) {\n const pendingCount = orchestrator.getPendingHandoffs().length;\n if (pendingCount !== expected.pendingHandoffs) {\n throw new Error(\n `Expected ${expected.pendingHandoffs} pending handoffs, got ${pendingCount}`,\n );\n }\n }\n}\n\n// ============================================================================\n// Mock Task Helpers\n// ============================================================================\n\n/**\n * Create a mock TaskRegistration for testing.\n *\n * @example\n * ```typescript\n * const task = createMockTask({ result: \"processed\" }, { delay: 100 });\n * const orchestrator = createTestMultiAgentOrchestrator({\n * agents: { writer: { agent: { name: \"writer\" } } },\n * tasks: { process: task },\n * });\n * ```\n */\nexport function createMockTask(\n output: unknown,\n options?: {\n delay?: number;\n shouldError?: boolean;\n label?: string;\n description?: string;\n },\n): TaskRegistration {\n return {\n run: async (_input: string, signal: AbortSignal) => {\n if (signal.aborted) {\n throw new Error(\"Task aborted\");\n }\n if (options?.delay && options.delay > 0) {\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, options.delay);\n signal.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(new Error(\"Task aborted\"));\n },\n { once: true },\n );\n });\n }\n\n if (options?.shouldError) {\n throw new Error(\"Mock task error\");\n }\n\n return output;\n },\n label: options?.label ?? \"Mock Task\",\n description: options?.description,\n };\n}\n\n// ============================================================================\n// DAG Testing Helpers\n// ============================================================================\n\nimport { dag } from \"./multi-agent-orchestrator.js\";\nimport type {\n DagExecutionContext,\n DagNode,\n DagNodeStatus,\n DagPattern,\n} from \"./types.js\";\n\n/**\n * Create a test DAG pattern from a simplified node spec.\n *\n * @example\n * ```typescript\n * const pattern = createTestDag({\n * A: { handler: \"researcher\" },\n * B: { handler: \"writer\", deps: [\"A\"] },\n * C: { handler: \"reviewer\", deps: [\"B\"] },\n * });\n * ```\n */\nexport function createTestDag<T = unknown>(\n nodes: Record<\n string,\n Pick<\n DagNode,\n \"handler\" | \"deps\" | \"when\" | \"transform\" | \"timeout\" | \"priority\"\n >\n >,\n merge?: (context: DagExecutionContext) => T | Promise<T>,\n options?: {\n timeout?: number;\n maxConcurrent?: number;\n onNodeError?: \"fail\" | \"skip-downstream\" | \"continue\";\n },\n): DagPattern<T> {\n const defaultMerge = (context: DagExecutionContext) =>\n context.outputs as unknown as T;\n\n return dag<T>(nodes, merge ?? defaultMerge, options);\n}\n\n/**\n * Assert that a DAG execution produced the expected node statuses.\n *\n * @example\n * ```typescript\n * assertDagExecution(context, {\n * nodeStatuses: { A: \"completed\", B: \"completed\", C: \"skipped\" },\n * completedNodes: [\"A\", \"B\"],\n * skippedNodes: [\"C\"],\n * });\n * ```\n */\nexport function assertDagExecution(\n context: DagExecutionContext,\n expected: {\n nodeStatuses?: Record<string, DagNodeStatus>;\n completedNodes?: string[];\n skippedNodes?: string[];\n errorNodes?: string[];\n outputContains?: Record<string, unknown>;\n },\n): void {\n if (expected.nodeStatuses) {\n for (const [nodeId, expectedStatus] of Object.entries(\n expected.nodeStatuses,\n )) {\n const actual = context.statuses[nodeId];\n if (actual !== expectedStatus) {\n throw new Error(\n `Expected node \"${nodeId}\" status to be \"${expectedStatus}\", got \"${actual}\"`,\n );\n }\n }\n }\n\n if (expected.completedNodes) {\n for (const nodeId of expected.completedNodes) {\n if (context.statuses[nodeId] !== \"completed\") {\n throw new Error(\n `Expected node \"${nodeId}\" to be completed, got \"${context.statuses[nodeId]}\"`,\n );\n }\n }\n }\n\n if (expected.skippedNodes) {\n for (const nodeId of expected.skippedNodes) {\n if (context.statuses[nodeId] !== \"skipped\") {\n throw new Error(\n `Expected node \"${nodeId}\" to be skipped, got \"${context.statuses[nodeId]}\"`,\n );\n }\n }\n }\n\n if (expected.errorNodes) {\n for (const nodeId of expected.errorNodes) {\n if (context.statuses[nodeId] !== \"error\") {\n throw new Error(\n `Expected node \"${nodeId}\" to be error, got \"${context.statuses[nodeId]}\"`,\n );\n }\n }\n }\n\n if (expected.outputContains) {\n for (const [nodeId, expectedOutput] of Object.entries(\n expected.outputContains,\n )) {\n const actual = context.outputs[nodeId];\n if (actual !== expectedOutput) {\n throw new Error(\n `Expected node \"${nodeId}\" output to be ${JSON.stringify(expectedOutput)}, got ${JSON.stringify(actual)}`,\n );\n }\n }\n }\n}\n\n// ============================================================================\n// Debug Timeline Testing Helpers\n// ============================================================================\n\nimport { type DebugTimeline, createDebugTimeline } from \"./debug-timeline.js\";\nimport type { DebugEvent, DebugEventType } from \"./types.js\";\n\n/**\n * Create a test debug timeline pre-populated with events.\n *\n * @example\n * ```typescript\n * const timeline = createTestTimeline([\n * { type: \"agent_start\", agentId: \"researcher\", inputLength: 42 },\n * { type: \"agent_complete\", agentId: \"researcher\", outputLength: 100, durationMs: 500, totalTokens: 200 },\n * ]);\n *\n * expect(timeline.getEventsForAgent(\"researcher\")).toHaveLength(2);\n * ```\n */\nexport function createTestTimeline(\n events?: Array<Partial<DebugEvent> & { type: DebugEventType }>,\n options?: { maxEvents?: number },\n): DebugTimeline {\n const timeline = createDebugTimeline({\n maxEvents: options?.maxEvents ?? 500,\n });\n\n if (events) {\n for (const event of events) {\n timeline.record({\n timestamp: Date.now(),\n snapshotId: null,\n agentId: \"\",\n ...event,\n } as Omit<DebugEvent, \"id\">);\n }\n }\n\n return timeline;\n}\n\n/**\n * Assert that a debug timeline contains expected events.\n *\n * @example\n * ```typescript\n * assertTimelineEvents(timeline, {\n * totalEvents: 5,\n * eventTypes: [\"agent_start\", \"guardrail_check\", \"agent_complete\"],\n * agentEvents: { researcher: 3, writer: 2 },\n * hasType: \"guardrail_check\",\n * });\n * ```\n */\nexport function assertTimelineEvents(\n timeline: DebugTimeline,\n expected: {\n totalEvents?: number;\n minEvents?: number;\n maxEvents?: number;\n eventTypes?: DebugEventType[];\n agentEvents?: Record<string, number>;\n hasType?: DebugEventType;\n doesNotHaveType?: DebugEventType;\n },\n): void {\n const events = timeline.getEvents();\n\n if (\n expected.totalEvents !== undefined &&\n events.length !== expected.totalEvents\n ) {\n throw new Error(\n `Expected ${expected.totalEvents} timeline events, got ${events.length}`,\n );\n }\n\n if (expected.minEvents !== undefined && events.length < expected.minEvents) {\n throw new Error(\n `Expected at least ${expected.minEvents} timeline events, got ${events.length}`,\n );\n }\n\n if (expected.maxEvents !== undefined && events.length > expected.maxEvents) {\n throw new Error(\n `Expected at most ${expected.maxEvents} timeline events, got ${events.length}`,\n );\n }\n\n if (expected.eventTypes) {\n for (const type of expected.eventTypes) {\n const found = events.some((e) => e.type === type);\n if (!found) {\n throw new Error(\n `Expected timeline to contain event of type \"${type}\", but none found`,\n );\n }\n }\n }\n\n if (expected.agentEvents) {\n for (const [agentId, expectedCount] of Object.entries(\n expected.agentEvents,\n )) {\n const actual = timeline.getEventsForAgent(agentId).length;\n if (actual !== expectedCount) {\n throw new Error(\n `Expected ${expectedCount} events for agent \"${agentId}\", got ${actual}`,\n );\n }\n }\n }\n\n if (expected.hasType) {\n const found = events.some((e) => e.type === expected.hasType);\n if (!found) {\n throw new Error(\n `Expected timeline to contain event of type \"${expected.hasType}\"`,\n );\n }\n }\n\n if (expected.doesNotHaveType) {\n const found = events.some((e) => e.type === expected.doesNotHaveType);\n if (found) {\n throw new Error(\n `Expected timeline NOT to contain event of type \"${expected.doesNotHaveType}\"`,\n );\n }\n }\n}\n\n// ============================================================================\n// Self-Healing Testing Helpers\n// ============================================================================\n\nimport type { HealthMonitor } from \"./health-monitor.js\";\nimport type { ReflectionEvaluator } from \"./reflection.js\";\nimport type { RerouteEvent, Scratchpad } from \"./types.js\";\n\n/**\n * Create a runner that always fails, useful for testing self-healing.\n *\n * @example\n * ```typescript\n * const failing = createFailingRunner(new Error(\"Provider down\"));\n * const orchestrator = createAgentOrchestrator({\n * runner: failing,\n * selfHealing: { fallbackRunners: [backupRunner] },\n * });\n * ```\n */\nexport function createFailingRunner(\n error?: Error,\n options?: { delay?: number; failAfter?: number },\n): AgentRunner {\n let callCount = 0;\n const failAfter = options?.failAfter ?? 0;\n\n return async <T>(\n _agent: AgentLike,\n _input: string,\n _runOptions?: RunOptions,\n ): Promise<RunResult<T>> => {\n callCount++;\n\n if (failAfter > 0 && callCount <= failAfter) {\n return {\n output: \"success\" as T,\n messages: [],\n toolCalls: [],\n totalTokens: 10,\n };\n }\n\n if (options?.delay && options.delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, options.delay));\n }\n\n throw error ?? new Error(\"Runner failed\");\n };\n}\n\n/**\n * Assert that an agent was rerouted during execution.\n *\n * @example\n * ```typescript\n * const events: RerouteEvent[] = [];\n * const orchestrator = createMultiAgentOrchestrator({\n * selfHealing: {\n * onReroute: (event) => events.push(event),\n * },\n * });\n *\n * // ... trigger reroute ...\n * assertRerouted(events, {\n * fromAgent: \"primary\",\n * toAgent: \"backup\",\n * reason: /circuit breaker/i,\n * });\n * ```\n */\nexport function assertRerouted(\n events: RerouteEvent[],\n expected: {\n fromAgent?: string;\n toAgent?: string;\n reason?: string | RegExp;\n minReroutes?: number;\n },\n): void {\n if (events.length === 0) {\n throw new Error(\"Expected at least one reroute event, but none occurred\");\n }\n\n if (\n expected.minReroutes !== undefined &&\n events.length < expected.minReroutes\n ) {\n throw new Error(\n `Expected at least ${expected.minReroutes} reroute events, got ${events.length}`,\n );\n }\n\n if (expected.fromAgent) {\n const found = events.some((e) => e.originalAgent === expected.fromAgent);\n if (!found) {\n throw new Error(\n `Expected reroute from agent \"${expected.fromAgent}\", but no matching event found`,\n );\n }\n }\n\n if (expected.toAgent) {\n const found = events.some((e) => e.reroutedTo === expected.toAgent);\n if (!found) {\n throw new Error(\n `Expected reroute to agent \"${expected.toAgent}\", but no matching event found`,\n );\n }\n }\n\n if (expected.reason) {\n const found = events.some((e) => {\n if (typeof expected.reason === \"string\") {\n return e.reason.includes(expected.reason);\n }\n\n return expected.reason!.test(e.reason);\n });\n if (!found) {\n throw new Error(\n `Expected reroute reason matching ${expected.reason}, but no matching event found`,\n );\n }\n }\n}\n\n/**\n * Assert the health state of an agent in the health monitor.\n *\n * @example\n * ```typescript\n * assertAgentHealth(monitor, \"researcher\", {\n * minScore: 70,\n * circuitState: \"CLOSED\",\n * });\n * ```\n */\nexport function assertAgentHealth(\n monitor: HealthMonitor,\n agentId: string,\n expected: {\n minScore?: number;\n maxScore?: number;\n circuitState?: \"CLOSED\" | \"OPEN\" | \"HALF_OPEN\";\n minSuccessRate?: number;\n },\n): void {\n const metrics = monitor.getMetrics(agentId);\n\n if (\n expected.minScore !== undefined &&\n metrics.healthScore < expected.minScore\n ) {\n throw new Error(\n `Expected agent \"${agentId}\" health score to be at least ${expected.minScore}, got ${metrics.healthScore}`,\n );\n }\n\n if (\n expected.maxScore !== undefined &&\n metrics.healthScore > expected.maxScore\n ) {\n throw new Error(\n `Expected agent \"${agentId}\" health score to be at most ${expected.maxScore}, got ${metrics.healthScore}`,\n );\n }\n\n if (\n expected.circuitState !== undefined &&\n metrics.circuitState !== expected.circuitState\n ) {\n throw new Error(\n `Expected agent \"${agentId}\" circuit state to be \"${expected.circuitState}\", got \"${metrics.circuitState}\"`,\n );\n }\n\n if (\n expected.minSuccessRate !== undefined &&\n metrics.successRate < expected.minSuccessRate\n ) {\n throw new Error(\n `Expected agent \"${agentId}\" success rate to be at least ${expected.minSuccessRate}, got ${metrics.successRate}`,\n );\n }\n}\n\n// ============================================================================\n// Checkpoint Test Helpers\n// ============================================================================\n\n/**\n * Create a test checkpoint store (wraps InMemoryCheckpointStore with assertion helpers).\n *\n * @example\n * ```typescript\n * const store = createTestCheckpointStore();\n * const orchestrator = createAgentOrchestrator({ runner, checkpointStore: store });\n * const cp = await orchestrator.checkpoint();\n * expect(store.saved).toHaveLength(1);\n * ```\n */\nexport function createTestCheckpointStore(\n maxCheckpoints = 100,\n): CheckpointStore & {\n saved: Checkpoint[];\n inner: InMemoryCheckpointStore;\n /** Get the most recently saved checkpoint */\n getLatest: () => Checkpoint | undefined;\n} {\n const inner = new InMemoryCheckpointStore({ maxCheckpoints });\n const saved: Checkpoint[] = [];\n\n return {\n inner,\n saved,\n getLatest: () => saved[saved.length - 1],\n async save(checkpoint: Checkpoint): Promise<string> {\n saved.push(checkpoint);\n\n return inner.save(checkpoint);\n },\n load: (id: string) => inner.load(id),\n list: () => inner.list(),\n delete: (id: string) => inner.delete(id),\n clear: () => inner.clear(),\n prune: () => inner.prune(),\n };\n}\n\n/**\n * Assert that a checkpoint has expected properties.\n */\nexport function assertCheckpoint(\n checkpoint: Checkpoint,\n expected: {\n orchestratorType?: \"single\" | \"multi\";\n hasTimeline?: boolean;\n hasMemory?: boolean;\n hasSystemExport?: boolean;\n label?: string;\n },\n): void {\n if (\n expected.orchestratorType !== undefined &&\n checkpoint.orchestratorType !== expected.orchestratorType\n ) {\n throw new Error(\n `Expected checkpoint orchestratorType \"${expected.orchestratorType}\", got \"${checkpoint.orchestratorType}\"`,\n );\n }\n\n if (\n expected.hasSystemExport === true &&\n (!checkpoint.systemExport || checkpoint.systemExport === \"\")\n ) {\n throw new Error(\n \"Expected checkpoint to have non-empty systemExport, but it was empty\",\n );\n }\n\n if (expected.hasTimeline === true && checkpoint.timelineExport === null) {\n throw new Error(\n \"Expected checkpoint to have timeline export, but it was null\",\n );\n }\n\n if (expected.hasTimeline === false && checkpoint.timelineExport !== null) {\n throw new Error(\n \"Expected checkpoint to have no timeline export, but it was present\",\n );\n }\n\n if (expected.hasMemory === true && checkpoint.memoryExport === null) {\n throw new Error(\n \"Expected checkpoint to have memory export, but it was null\",\n );\n }\n\n if (expected.hasMemory === false && checkpoint.memoryExport !== null) {\n throw new Error(\n \"Expected checkpoint to have no memory export, but it was present\",\n );\n }\n\n if (expected.label !== undefined && checkpoint.label !== expected.label) {\n throw new Error(\n `Expected checkpoint label \"${expected.label}\", got \"${checkpoint.label}\"`,\n );\n }\n}\n\n// ============================================================================\n// Breakpoint Test Helpers\n// ============================================================================\n\n/** Options for the breakpoint simulator */\nexport interface BreakpointSimulatorOptions {\n /** Auto-resume after this delay (ms). Default: 0 (immediate) */\n autoResumeDelay?: number;\n /** Modifications to apply on resume */\n modifications?: BreakpointModifications;\n /** If true, cancel instead of resume */\n cancel?: boolean;\n /** Cancel reason */\n cancelReason?: string;\n}\n\n/**\n * Create a breakpoint simulator that auto-resolves breakpoints.\n *\n * @example\n * ```typescript\n * const simulator = createBreakpointSimulator({ autoResumeDelay: 10 });\n * const orchestrator = createAgentOrchestrator({\n * runner,\n * breakpoints: [{ type: \"pre_agent_run\" }],\n * onBreakpoint: simulator.handler,\n * });\n * // Run agent — breakpoint fires and auto-resumes\n * await orchestrator.run(\"test input\");\n * expect(simulator.hits).toHaveLength(1);\n * ```\n */\n/** Minimal interface for breakpoint-capable orchestrators */\nexport interface BreakpointCapable {\n resumeBreakpoint(id: string, modifications?: BreakpointModifications): void;\n cancelBreakpoint(id: string, reason?: string): void;\n}\n\n/**\n * Create a breakpoint simulator that auto-resolves breakpoints for testing.\n *\n * @param options - Simulator options including `autoResumeDelay` and `modifications`.\n * @returns An object with `handler`, `hits`, and `attachTo` for test assertions.\n */\nexport function createBreakpointSimulator(\n options: BreakpointSimulatorOptions = {},\n): {\n handler: (request: BreakpointRequest) => void;\n hits: BreakpointRequest[];\n attachTo: (orchestrator: BreakpointCapable) => void;\n} {\n const hits: BreakpointRequest[] = [];\n let orchestratorRef: BreakpointCapable | null = null;\n let attached = false;\n\n const handler = (request: BreakpointRequest) => {\n hits.push(request);\n\n if (!attached) {\n throw new Error(\n \"[Directive] BreakpointSimulator: handler called but attachTo() was never called. \" +\n \"Breakpoints will not be resolved. Call simulator.attachTo(orchestrator) after creation.\",\n );\n }\n\n const delay = options.autoResumeDelay ?? 0;\n\n const doResolve = () => {\n if (!orchestratorRef) {\n return;\n }\n if (options.cancel) {\n orchestratorRef.cancelBreakpoint(request.id, options.cancelReason);\n } else {\n orchestratorRef.resumeBreakpoint(request.id, options.modifications);\n }\n };\n\n if (delay > 0) {\n setTimeout(doResolve, delay);\n } else {\n // Use queueMicrotask so the breakpoint state is written before we resolve\n queueMicrotask(doResolve);\n }\n };\n\n return {\n handler,\n hits,\n attachTo: (orch: BreakpointCapable) => {\n orchestratorRef = orch;\n attached = true;\n },\n };\n}\n\n/**\n * Assert that a breakpoint was hit with expected properties.\n */\nexport function assertBreakpointHit(\n hits: BreakpointRequest[],\n expected: {\n type?: string;\n agentId?: string;\n count?: number;\n },\n): void {\n if (expected.count !== undefined && hits.length !== expected.count) {\n throw new Error(\n `Expected ${expected.count} breakpoint hits, got ${hits.length}`,\n );\n }\n\n if (expected.type) {\n const found = hits.some((h) => h.type === expected.type);\n if (!found) {\n const types = hits.map((h) => h.type).join(\", \");\n\n throw new Error(\n `Expected breakpoint of type \"${expected.type}\", found types: [${types}]`,\n );\n }\n }\n\n if (expected.agentId) {\n const found = hits.some((h) => h.agentId === expected.agentId);\n if (!found) {\n const agents = hits.map((h) => h.agentId).join(\", \");\n\n throw new Error(\n `Expected breakpoint for agent \"${expected.agentId}\", found agents: [${agents}]`,\n );\n }\n }\n}\n\n// ============================================================================\n// Structured Output Test Helpers\n// ============================================================================\n\n/**\n * Create a mock SafeParseable schema for testing.\n *\n * @example\n * ```typescript\n * const schema = createMockSchema((data) => typeof data === \"object\" && data !== null);\n * const orchestrator = createAgentOrchestrator({\n * runner,\n * outputSchema: schema,\n * });\n * ```\n */\nexport function createMockSchema<T>(\n validate: (data: unknown) => boolean,\n description?: string,\n): {\n safeParse: (data: unknown) => {\n success: boolean;\n data?: T;\n error?: { message: string };\n };\n description?: string;\n} {\n return {\n safeParse: (data: unknown) => {\n if (validate(data)) {\n return { success: true, data: data as T };\n }\n\n return { success: false, error: { message: \"Validation failed\" } };\n },\n description,\n };\n}\n\n// ============================================================================\n// Multiplexed Stream Test Helpers\n// ============================================================================\n\n/**\n * Collect all chunks from a multiplexed stream into an array.\n *\n * @example\n * ```typescript\n * const { stream } = orchestrator.runParallelStream([\"a\", \"b\"], \"input\", merge);\n * const chunks = await collectMultiplexedStream(stream);\n * expect(chunks.length).toBeGreaterThan(0);\n * ```\n */\nexport async function collectMultiplexedStream(\n stream: AsyncIterable<MultiplexedStreamChunk>,\n): Promise<MultiplexedStreamChunk[]> {\n const chunks: MultiplexedStreamChunk[] = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n\n return chunks;\n}\n\n/**\n * Assert properties of collected multiplexed stream chunks.\n */\nexport function assertMultiplexedStream(\n chunks: MultiplexedStreamChunk[],\n expected: {\n agentIds?: string[];\n minChunks?: number;\n hasDone?: boolean;\n hasErrors?: boolean;\n },\n): void {\n if (expected.minChunks !== undefined && chunks.length < expected.minChunks) {\n throw new Error(\n `Expected at least ${expected.minChunks} chunks, got ${chunks.length}`,\n );\n }\n\n if (expected.agentIds) {\n const seenAgents = new Set(chunks.map((c) => c.agentId));\n for (const agentId of expected.agentIds) {\n if (!seenAgents.has(agentId)) {\n throw new Error(\n `Expected chunks from agent \"${agentId}\", found agents: [${[...seenAgents].join(\", \")}]`,\n );\n }\n }\n }\n\n if (expected.hasDone === true) {\n const hasDone = chunks.some((c) => c.chunk.type === \"done\");\n if (!hasDone) {\n throw new Error(\"Expected at least one 'done' chunk, found none\");\n }\n }\n\n if (expected.hasErrors === true) {\n const hasError = chunks.some((c) => c.chunk.type === \"error\");\n if (!hasError) {\n throw new Error(\"Expected at least one 'error' chunk, found none\");\n }\n }\n\n if (expected.hasErrors === false) {\n const hasError = chunks.some((c) => c.chunk.type === \"error\");\n if (hasError) {\n throw new Error(\"Expected no 'error' chunks, but found some\");\n }\n }\n}\n\n// ============================================================================\n// Reflection Test Helpers\n// ============================================================================\n\n/**\n * Create a test reflection evaluator that passes after N iterations.\n *\n * @example\n * ```typescript\n * const evaluator = createTestReflectionEvaluator({ passAfter: 2 });\n * const reflective = withReflection(runner, { evaluate: evaluator });\n * ```\n */\nexport function createTestReflectionEvaluator(options?: {\n /** Pass after this many evaluations (1 = pass on first try). Default: 1 */\n passAfter?: number;\n /** Feedback to provide on failure */\n feedback?: string;\n /** Score to assign (0-1) */\n score?: number;\n}): ReflectionEvaluator {\n const passAfter = options?.passAfter ?? 1;\n const feedback = options?.feedback ?? \"Needs improvement\";\n const score = options?.score;\n let callCount = 0;\n\n return (_output: unknown, _context) => {\n callCount++;\n const passed = callCount >= passAfter;\n\n return {\n passed,\n feedback: passed ? undefined : feedback,\n score: score ?? (passed ? 1 : 0.5),\n };\n };\n}\n\n// ============================================================================\n// Scratchpad Test Helpers\n// ============================================================================\n\n/**\n * Assert that a scratchpad contains expected values.\n *\n * @example\n * ```typescript\n * assertScratchpadState(orchestrator.scratchpad!, {\n * \"plan.status\": \"complete\",\n * \"research.results\": expect.any(Array),\n * });\n * ```\n */\nexport function assertScratchpadState(\n scratchpad: Scratchpad,\n expected: Record<string, unknown>,\n): void {\n const all = scratchpad.getAll();\n for (const [key, expectedValue] of Object.entries(expected)) {\n const actual = all[key];\n if (actual !== expectedValue) {\n throw new Error(\n `Expected scratchpad key \"${key}\" to be ${JSON.stringify(expectedValue)}, got ${JSON.stringify(actual)}`,\n );\n }\n }\n}\n\n// ============================================================================\n// Derivation Test Helpers\n// ============================================================================\n\n/**\n * Assert that derived values match expected values.\n *\n * @example\n * ```typescript\n * assertDerivedValues(orchestrator, {\n * totalRuns: 3,\n * allComplete: true,\n * });\n * ```\n */\nexport function assertDerivedValues(\n orchestrator: MultiAgentOrchestrator,\n expected: Record<string, unknown>,\n): void {\n const derived = orchestrator.derived;\n for (const [key, expectedValue] of Object.entries(expected)) {\n const actual = derived[key];\n if (typeof expectedValue === \"object\" && expectedValue !== null) {\n // Sort keys for order-independent comparison\n const sortedStringify = (v: unknown): string =>\n JSON.stringify(v, Object.keys(v as Record<string, unknown>).sort());\n if (sortedStringify(actual) !== sortedStringify(expectedValue)) {\n throw new Error(\n `Expected derived value \"${key}\" to be ${JSON.stringify(expectedValue)}, got ${JSON.stringify(actual)}`,\n );\n }\n } else if (actual !== expectedValue) {\n throw new Error(\n `Expected derived value \"${key}\" to be ${JSON.stringify(expectedValue)}, got ${JSON.stringify(actual)}`,\n );\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/debug-timeline.ts","../src/guardrail-utils.ts","../src/orchestrator-bridge.ts","../src/breakpoints.ts","../src/checkpoint.ts","../src/structured-output.ts","../src/agent-orchestrator.ts","../src/health-monitor.ts","../src/reflection.ts","../src/streaming.ts","../src/pattern-factories.ts","../src/multi-agent-orchestrator.ts","../src/testing.ts"],"names":["GuardrailError","options","isGuardrailError","error","AGENT_KEY","APPROVAL_KEY","CONVERSATION_KEY","TOOL_CALLS_KEY","BREAKPOINT_KEY","SCRATCHPAD_KEY","orchestratorBridgeSchema","t","KNOWN_EVENT_TYPES","BLOCKED_IMPORT_KEYS","createDebugTimeline","maxEvents","goToSnapshot","events","nextId","listeners","event","fullEvent","overflow","listener","err","agentId","e","type","snapshotId","startMs","endMs","cutoffId","i","sliceEnd","json","parsed","key","data","validated","evt","createDebugTimelinePlugin","timeline","getSnapshotId","resolverStartTimes","id","active","resolver","req","startTime","_req","errorMessage","normalizeGuardrail","guardrail","index","calculateRetryDelay","attempt","config","backoff","baseDelayMs","maxDelayMs","delay","abortableDelay","ms","signal","resolve","reject","onAbort","timer","executeGuardrailWithRetry","context","retry","maxAttempts","lastError","calculateAgentRetryDelay","executeAgentWithRetry","runner","agent","input","retryConfig","isRetryable","onRetry","retryable","getAgentState","facts","getBridgeFact","setAgentState","state","setBridgeFact","getApprovalState","setApprovalState","getConversation","setConversation","messages","getToolCalls","setToolCalls","toolCalls","getBreakpointState","setBreakpointState","getOrchestratorState","convertOrchestratorConstraints","constraints","result","constraint","combinedFacts","convertOrchestratorResolvers","resolvers","runAgentWithGuardrails","getSystemFacts","orchestratorContext","opts","MAX_BREAKPOINT_HISTORY","breakpointCounter","createBreakpointId","matchBreakpoint","breakpoints","bp","createInitialBreakpointState","BLOCKED_KEYS","createCheckpointId","timestamp","random","validateCheckpoint","obj","localState","InMemoryCheckpointStore","checkpoint","existingIdx","checkpointId","cp","cutoff","pruned","toRemove","idx","oldest","extractJsonFromOutput","output","trimmed","objectStart","arrayStart","start","openChar","closeChar","depth","inString","escaped","char","jsonStr","sanitized","match","formatValidationError","issue","withStructuredOutput","schema","maxRetries","extractJson","schemaDescription","schemaPrompt","structuredAgent","lastResult","effectiveInput","outputStr","extracted","StructuredOutputError","message","MAX_CONVERSATION_MESSAGES","MAX_TOOL_CALLS","createAgentOrchestrator","factsSchema","init","guardrails","onApprovalRequest","autoApproveToolCalls","maxTokenBudget","budgetWarningThreshold","onBudgetWarning","plugins","rawDebug","approvalTimeoutMs","agentRetry","hooks","memory","circuitBreaker","selfHealing","outputSchema","maxSchemaRetries","checkpointStore","onBreakpoint","breakpointTimeoutMs","debug","MAX_VERBOSE_LENGTH","fireHook","name","hookError","RESERVED_ORCHESTRATOR_KEYS","combinedSchema","runAgentWithGuardrailsFn","system","directiveConstraints","directiveResolvers","currentFacts","requirementGuard","currentAgent","callbackPlugin","createCallbackPlugin","orchestratorModule","createModule","allPlugins","createSystem","_currentFacts","callOptions","runAgentWithGuardrailsInner","fallbackRunner","rerouteEvent","contextMessages","contextStr","m","bpContext","mods","handleBreakpoint","effectiveInputGuardrails","effectiveOutputGuardrails","inputGuardrailsList","g","guardStartTime","effectiveSchema","effectiveRunner","updated","toolCall","toolCallGuardrails","guardResult","approvalId","approvalRequest","currentApproval","waitForApproval","updatedToolCalls","delayMs","outputGuardrailsList","shouldFireBudgetWarning","budgetPercentage","newTokenUsage","warningFired","callbackError","memoryError","breakpointModifications","breakpointCancelReasons","waitForBreakpointResolution","bpId","settled","timeoutId","cleanupAll","unsubscribe","bpState","cancelReason","bpTimeout","request","requestId","approval","rejectedRequest","r","errorMsg","timeoutSeconds","getCombinedFacts","abortController","MAX_STREAM_BUFFER","chunks","waiters","closed","tokenCount","MAX_ACCUMULATED_OUTPUT","accumulatedOutput","abortHandler","cleanup","pushChunk","chunk","waiter","closeStream","resultPromise","processedInput","inputGuardrails","currentConversation","newTokens","currentToolCalls","outputGuardrails","duration","timeoutMs","isIdle","MAX_APPROVAL_HISTORY","approved","reason","MAX_REJECTION_HISTORY","rejected","cpOptions","restoreOpts","modifications","resolved","cancelled","DEFAULT_WEIGHTS","createHealthMonitor","windowMs","maxNormalLatencyMs","maxEventsPerAgent","weights","value","weightSum","circuitStates","generation","cachedAll","cachedGen","getAgentEvents","agentEvents","pruneAndCap","now","firstValid","excessFromCap","computeScore","successRate","avgLatency","s","normalizedLatency","circuitScore","raw","buildMetrics","successes","failures","avgLatencyMs","lastErrors","latencyMs","ReflectionExhaustedError","MAX_MULTIPLEX_BUFFER","mergeTaggedStreams","sources","done","buffer","activeSources","droppedCount","push","item","finish","source","dag","nodes","merge","safeStringify","shallowEqual","a","b","aObj","bObj","aKeys","bKeys","getPatternStep","Semaphore","max","released","entry","releaseFn","next","pending","isRunAgentReq","createMultiAgentOrchestrator","inputAgents","patterns","onHandoff","onHandoffComplete","maxHandoffHistory","sharedMemory","defaultAgentRetry","userConstraints","userResolvers","orchestratorCircuitBreaker","breakpointConfigs","userDerivations","scratchpadConfig","inputTasks","agents","tasks","taskStates","taskId","taskSemaphores","RESERVED_IDS","taskReg","attempts","reg","registeredAgentIds","missingAgents","patternId","pattern","agentsToCheck","node","details","validateDagAcyclic","timelinePlugin","healthMonitorInstance","roundRobinCounters","coordFacts","coordSchema","coordConstraints","coordResolvers","resolverCtx","globalStatus","runSingleAgent","coordinatorModule","modulesMap","registration","perAgentConstraints","perAgentResolvers","resolverContext","globalTokenCount","disposed","pendingRuns","lastReflectionHistory","assertNotDisposed","semaphores","agentStates","MAX_HANDOFF_RESULTS","pendingHandoffs","handoffResults","handoffCounter","addHandoffResult","approvalRequestIndex","idleWaiters","notifyIdleWaiters","derivedValues","derivedChangeCallbacks","buildCrossAgentSnapshot","agentsSnap","getAgentFacts","snapshot","recomputeDerivations","changed","errors","derivId","derivFn","newValue","oldValue","hasChanged","derivError","cb","scratchpadChangeCallbacks","scratchpadKeyCallbacks","scratchpadInstance","changedKeys","current","notifyScratchpadChange","_","rest","values","safeValues","k","keys","v","callback","allKeys","keyCbs","breakpointId","agentFacts","agentName","extra","matched","currentBp","runTask","label","bpResult","effectivePatternId","sem","buildContext","nodeId","agentState","taskState","percent","clampedPercent","baseDelay","executeAttempt","timeoutTimer","rawOutput","durationMs","MAX_BACKOFF_MS","rawDelay","available","effectiveCircuitBreaker","runSingleAgentInner","equivalents","findEquivalentAgents","alternate","selectBestEquivalent","originalInput","semaphore","release","controller","effectiveMemory","effectiveRetry","toolCallGuardrailsList","newTotal","messagesToStore","base","runAgentStreamImpl","taskChunks","taskWaiters","taskClosed","pushTaskChunk","closeTaskStream","w","taskAbortController","taskExternalAbortHandler","MAX_AGENT_STREAM_BUFFER","stream","runParallelPattern","patternStartTime","patternError","promises","results","successResults","failCount","savePatternCheckpoint","store","step","runSequentialPattern","initialInput","resumeFrom","pId","ckptConfig","ckptStore","ckptEveryN","ckptPrefix","currentInput","collectedResults","startIdx","last","nextInput","runSupervisorPattern","workerResults","serializedWorkerResults","maxRounds","wr","startRound","supervisorResult","round","action","cleaned","stripped","workerResult","runDagPattern","dagCkptConfig","dagCkptStore","dagCkptEveryN","dagCkptPrefix","dagCompletedCount","dagLastCheckpointCount","dagCheckpointChain","dagTotalNodes","status","nr","onNodeError","maxConcurrent","graphTimeoutId","evaluatePendingNodes","terminalStatuses","depId","inflight","running","launchNode","nodeStartTime","nodeInput","upstreamOutputs","nodeController","nodeTimeoutId","nodeResults","nid","ckptState","readyNodes","promise","runReflectPattern","maxIterations","effectiveSignal","reflectTimeoutId","reflectExternalOnAbort","parseEvaluation","buildRetryInput","inp","feedback","_iteration","reflectCkptConfig","reflectCkptStore","reflectCkptEveryN","reflectCkptPrefix","lastProducerResult","history","producerOutputs","startIteration","iteration","iterStart","producerResult","producerOutput","evaluatorResult","evaluation","parseError","thresholdValue","iterDurationMs","record","cbError","retryError","h","p","bestIdx","bestScore","bestOutput","runRacePattern","minSuccess","raceTimeoutId","raceExternalOnAbort","agentErrors","startedAgents","entries","allPromises","settledCount","winner","failedCount","maxPossibleSuccesses","msg","first","winnerId","successIds","cancelledIds","allResults","runDebateInternal","debateAgents","evaluator","extract","parseJudgement","debateTimeoutId","externalOnAbort","ctrl","parseJudge","rounds","lastWinnerId","lastWinnerOutput","debateCkptConfig","debateCkptStore","debateCkptEveryN","debateCkptPrefix","debateTotalTokens","proposalPromises","proposals","evalInput","evalResult","judgement","GOAL_BLOCKED_KEYS","goalSafeMerge","target","validateGoalAcyclic","producerMap","nodeIds","inDegree","adjacency","reqKey","producers","producerId","queue","visited","dependent","validateProducerConflicts","safeCall","fn","args","safeCallAsync","computeGoalMetrics","currentSatisfaction","stepMetrics","_step","recentSteps","avgDelta","sum","estimatedStepsRemaining","decelerating","recent3","prior3","recentAvg","priorAvg","clampSatisfaction","runGoalInternal","originalNodes","goalWhen","satisfactionFn","maxSteps","selectionStrategy","relaxation","onStep","onStall","goalTimeoutId","goalHandlers","n","executionOrder","out","relaxations","completedNodes","failedNodes","nodeInputHashes","agentMetrics","stallSteps","appliedRelaxationTiers","lastSatisfaction","goalAchieved","startStep","checkpointConfig","checkpointEveryN","checkpointStoreRef","checkpointLabelPrefix","lastCheckpointId","MAX_CONSECUTIVE_FAILURES","totalTokens","requires","inputHash","selectedNodes","rawSatisfaction","goalProgressMetrics","strategyMetrics","strategyResult","relaxationApplied","tierIdx","tier","threshold","strategy","altNode","altId","rawSat","ctx","stallMetrics","stepStart","rawPreSat","preSatisfaction","stepTokens","factsProduced","nodePromises","customInput","relevantFacts","outputFacts","rawPostSat","postSatisfaction","satisfactionDelta","savedId","seen","group","sourceReg","caps","c","counter","selected","best","score","getPatternHandlers","orchestrator","handlerIds","agentIds","inputs","inputArray","fromAgent","toAgent","targetMemory","contextSummary","handoffResult","allIdle","check","agentModule","referencedAgents","existing","tsem","local","perAgentStreams","streamResult","taggedSources","mergedStream","getDroppedCount","resultsPromise","mergePromise","raceOpts","evaluatorId","reflectOpts","exhausted","debateOpts","when","goalOpts","checkpointState","normalizedState","BLOCKED","replayInput","deps","createMockAgentRunner","defaultResponse","responses","recordCalls","onRun","calls","responseMap","currentDefault","runOptions","generated","testGuardrail","testInput","fullContext","expectedReason","expected","testGuardrailBatch","testCases","testCase","createApprovalSimulator","autoApprove","autoReject","recordRequests","requests","pendingRequests","requestWaiters","predicate","timeout","createTestOrchestrator","mockResponses","defaultMockResponse","orchestratorOptions","mockRunner","approvalSimulator","testOrchestrator","createConstraintRecorder","snapshots","assertOrchestratorState","min","exact","len","createTimeController","currentTime","initial","time","createTestMultiAgentOrchestrator","mockTaskConfigs","existingTasks","createMockTask","responsesByName","assertMultiAgentState","expectedStatus","allStates","total","pendingCount","_input","createTestDag","assertDagExecution","actual","expectedOutput","createTestTimeline","assertTimelineEvents","expectedCount","createFailingRunner","callCount","failAfter","_agent","_runOptions","assertRerouted","assertAgentHealth","monitor","metrics","createTestCheckpointStore","maxCheckpoints","inner","saved","assertCheckpoint","createBreakpointSimulator","hits","orchestratorRef","attached","doResolve","orch","assertBreakpointHit","types","createMockSchema","validate","description","collectMultiplexedStream","assertMultiplexedStream","seenAgents","createTestReflectionEvaluator","passAfter","_output","_context","passed","assertScratchpadState","scratchpad","all","expectedValue","assertDerivedValues","derived","sortedStringify"],"mappings":"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","file":"testing.js","sourcesContent":["/**\n * Shared types for AI adapter — used by orchestrator, guardrails, helpers, and stack.\n */\n\nimport type {\n ModuleSchema,\n Requirement,\n SchemaType,\n} from \"@directive-run/core\";\nimport { t } from \"@directive-run/core\";\nimport type {\n BreakpointRequest,\n BreakpointState as BreakpointStateFromBreakpoints,\n} from \"./breakpoints.js\";\n\n// ============================================================================\n// Agent Types (LLM-agnostic)\n// ============================================================================\n\n/** Simplified Agent interface */\nexport interface AgentLike {\n name: string;\n instructions?: string;\n model?: string;\n tools?: unknown[];\n}\n\n/** Agent run result */\nexport interface RunResult<T = unknown> {\n output: T;\n messages: Message[];\n toolCalls: ToolCall[];\n totalTokens: number;\n /** Breakdown of input vs output tokens, when available from the provider */\n tokenUsage?: TokenUsage;\n /** True when result was served from semantic cache */\n isCached?: boolean;\n}\n\n/** Breakdown of token usage by input/output */\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n}\n\n/** Message from agent run */\nexport interface Message {\n role: \"user\" | \"assistant\" | \"tool\" | \"system\";\n content: string;\n toolCallId?: string;\n}\n\n/** Tool call record */\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: string;\n result?: string;\n}\n\n/** Run function type */\nexport type AgentRunner = <T = unknown>(\n agent: AgentLike,\n input: string,\n options?: RunOptions,\n) => Promise<RunResult<T>>;\n\n/** Callback-based streaming run function (e.g. for SSE-based LLM APIs) */\nexport type StreamingCallbackRunner = (\n agent: AgentLike,\n input: string,\n callbacks: {\n onToken?: (token: string) => void;\n onToolStart?: (tool: string, id: string, args: string) => void;\n onToolEnd?: (tool: string, id: string, result: string) => void;\n onMessage?: (message: Message) => void;\n signal?: AbortSignal;\n },\n) => Promise<RunResult<unknown>>;\n\n/** Run options */\nexport interface RunOptions {\n maxTurns?: number;\n signal?: AbortSignal;\n onMessage?: (message: Message) => void;\n onToolCall?: (toolCall: ToolCall) => void | Promise<void>;\n}\n\n// ============================================================================\n// Adapter Lifecycle Hooks\n// ============================================================================\n\n/**\n * Lifecycle hooks for adapter-level observability.\n *\n * Attach to any adapter (runner or streaming runner) to trace, log,\n * or measure individual LLM calls without modifying application code.\n *\n * @example\n * ```typescript\n * const runner = createOpenAIRunner({\n * apiKey: process.env.OPENAI_API_KEY!,\n * hooks: {\n * onBeforeCall: ({ agent, input }) => console.log(`→ ${agent.name}`, input.slice(0, 50)),\n * onAfterCall: ({ durationMs, tokenUsage }) => {\n * metrics.track('llm_call', { durationMs, ...tokenUsage });\n * },\n * onError: ({ error }) => Sentry.captureException(error),\n * },\n * });\n * ```\n */\nexport interface AdapterHooks {\n /** Fires before each LLM API call. */\n onBeforeCall?: (event: {\n agent: AgentLike;\n input: string;\n timestamp: number;\n }) => void;\n\n /** Fires after a successful LLM API call. */\n onAfterCall?: (event: {\n agent: AgentLike;\n input: string;\n output: string;\n totalTokens: number;\n tokenUsage: TokenUsage;\n durationMs: number;\n timestamp: number;\n }) => void;\n\n /** Fires when an LLM API call fails. */\n onError?: (event: {\n agent: AgentLike;\n input: string;\n error: Error;\n durationMs: number;\n timestamp: number;\n }) => void;\n}\n\n// ============================================================================\n// Guardrail Types\n// ============================================================================\n\n/** Guardrail function */\nexport type GuardrailFn<T = unknown> = (\n data: T,\n context: GuardrailContext,\n) => GuardrailResult | Promise<GuardrailResult>;\n\n/** Guardrail context */\nexport interface GuardrailContext {\n agentName: string;\n input: string;\n facts: Record<string, unknown>;\n}\n\n/** Guardrail result */\nexport interface GuardrailResult {\n passed: boolean;\n reason?: string;\n transformed?: unknown;\n}\n\n/** Input guardrail data */\nexport interface InputGuardrailData {\n input: string;\n agentName: string;\n}\n\n/** Output guardrail data */\nexport interface OutputGuardrailData {\n output: unknown;\n agentName: string;\n input: string;\n messages: Message[];\n}\n\n/** Tool call guardrail data */\nexport interface ToolCallGuardrailData {\n toolCall: ToolCall;\n agentName: string;\n input: string;\n}\n\n/** Retry configuration for guardrails */\nexport interface GuardrailRetryConfig {\n /** Total attempts (1 = no retries, 2 = one retry, etc.). @default 1 */\n attempts?: number;\n /** @default \"exponential\" */\n backoff?: \"exponential\" | \"linear\" | \"fixed\";\n /** @default 100 */\n baseDelayMs?: number;\n /** @default 5000 */\n maxDelayMs?: number;\n}\n\n/** Named guardrail for better debugging */\nexport interface NamedGuardrail<T = unknown> {\n name: string;\n fn: GuardrailFn<T>;\n /** @default true */\n critical?: boolean;\n retry?: GuardrailRetryConfig;\n}\n\n/** Guardrails configuration */\nexport interface GuardrailsConfig {\n input?: Array<\n GuardrailFn<InputGuardrailData> | NamedGuardrail<InputGuardrailData>\n >;\n output?: Array<\n GuardrailFn<OutputGuardrailData> | NamedGuardrail<OutputGuardrailData>\n >;\n toolCall?: Array<\n GuardrailFn<ToolCallGuardrailData> | NamedGuardrail<ToolCallGuardrailData>\n >;\n}\n\n// ============================================================================\n// Retry Configuration\n// ============================================================================\n\n/** Retry configuration for agent runs */\nexport interface AgentRetryConfig {\n /** @default 1 */\n attempts?: number;\n /** @default \"exponential\" */\n backoff?: \"exponential\" | \"linear\" | \"fixed\";\n /** @default 1000 */\n baseDelayMs?: number;\n /** @default 30000 */\n maxDelayMs?: number;\n isRetryable?: (error: Error) => boolean;\n onRetry?: (attempt: number, error: Error, delayMs: number) => void;\n}\n\n// ============================================================================\n// Orchestrator State Types\n// ============================================================================\n\n/** Agent state in facts */\nexport interface AgentState {\n status: \"idle\" | \"running\" | \"paused\" | \"completed\" | \"error\";\n currentAgent: string | null;\n input: string | null;\n output: unknown | null;\n error: string | null;\n tokenUsage: number;\n turnCount: number;\n startedAt: number | null;\n completedAt: number | null;\n}\n\n/** Approval state */\nexport interface ApprovalState {\n pending: ApprovalRequest[];\n approved: string[];\n rejected: RejectedRequest[];\n}\n\n/** Rejected request with tracking information */\nexport interface RejectedRequest {\n id: string;\n reason?: string;\n rejectedAt: number;\n}\n\n/** Approval request */\nexport interface ApprovalRequest {\n id: string;\n type: \"tool_call\" | \"output\" | \"handoff\";\n agentName: string;\n description: string;\n data: unknown;\n requestedAt: number;\n}\n\n/** Combined orchestrator state */\nexport interface OrchestratorState {\n agent: AgentState;\n approval: ApprovalState;\n conversation: Message[];\n toolCalls: ToolCall[];\n}\n\n// ============================================================================\n// Orchestrator Config Types\n// ============================================================================\n\n/** Constraint for orchestrator */\nexport interface OrchestratorConstraint<F extends Record<string, unknown>> {\n when: (facts: F & OrchestratorState) => boolean | Promise<boolean>;\n require: Requirement | ((facts: F & OrchestratorState) => Requirement);\n priority?: number;\n}\n\n/** Resolver context for orchestrator */\nexport interface OrchestratorResolverContext<\n F extends Record<string, unknown>,\n> {\n facts: F & OrchestratorState;\n runAgent: <T>(\n agent: AgentLike,\n input: string,\n options?: RunOptions,\n ) => Promise<RunResult<T>>;\n signal: AbortSignal;\n}\n\n/** Resolver for orchestrator */\nexport interface OrchestratorResolver<\n F extends Record<string, unknown>,\n R extends Requirement = Requirement,\n> {\n requirement: (req: Requirement) => req is R;\n key?: (req: R) => string;\n resolve: (\n req: R,\n context: OrchestratorResolverContext<F>,\n ) => void | Promise<void>;\n}\n\n/** Lifecycle hooks for observability */\nexport interface OrchestratorLifecycleHooks {\n onAgentStart?: (event: {\n agentName: string;\n input: string;\n timestamp: number;\n }) => void;\n onAgentComplete?: (event: {\n agentName: string;\n input: string;\n output: unknown;\n tokenUsage: number;\n durationMs: number;\n timestamp: number;\n }) => void;\n onAgentError?: (event: {\n agentName: string;\n input: string;\n error: Error;\n durationMs: number;\n timestamp: number;\n }) => void;\n onGuardrailCheck?: (event: {\n agentId?: string;\n guardrailName: string;\n guardrailType: \"input\" | \"output\" | \"toolCall\";\n passed: boolean;\n reason?: string;\n durationMs: number;\n timestamp: number;\n }) => void;\n onAgentRetry?: (event: {\n agentName: string;\n input: string;\n attempt: number;\n error: Error;\n delayMs: number;\n timestamp: number;\n }) => void;\n /** Called when a breakpoint is hit and waiting for resolution. */\n onBreakpoint?: (request: BreakpointRequest) => void;\n}\n\n/** Lifecycle hooks for multi-agent orchestrator observability */\nexport interface MultiAgentLifecycleHooks {\n onAgentStart?: (event: {\n agentId: string;\n agentName: string;\n input: string;\n timestamp: number;\n }) => void;\n onAgentComplete?: (event: {\n agentId: string;\n agentName: string;\n input: string;\n output: unknown;\n tokenUsage: number;\n durationMs: number;\n timestamp: number;\n }) => void;\n onAgentError?: (event: {\n agentId: string;\n agentName: string;\n input: string;\n error: Error;\n durationMs: number;\n timestamp: number;\n }) => void;\n onGuardrailCheck?: (event: {\n agentId: string;\n guardrailName: string;\n guardrailType: \"input\" | \"output\" | \"toolCall\";\n passed: boolean;\n reason?: string;\n durationMs: number;\n timestamp: number;\n }) => void;\n onAgentRetry?: (event: {\n agentId: string;\n agentName: string;\n input: string;\n attempt: number;\n error: Error;\n delayMs: number;\n timestamp: number;\n }) => void;\n onHandoff?: (request: {\n id: string;\n fromAgent: string;\n toAgent: string;\n input: string;\n requestedAt: number;\n }) => void;\n onHandoffComplete?: (result: {\n request: { id: string; fromAgent: string; toAgent: string };\n completedAt: number;\n }) => void;\n onPatternStart?: (event: {\n patternId: string;\n patternType:\n | \"parallel\"\n | \"sequential\"\n | \"supervisor\"\n | \"dag\"\n | \"reflect\"\n | \"race\"\n | \"debate\"\n | \"goal\";\n input: string;\n timestamp: number;\n }) => void;\n onPatternComplete?: (event: {\n patternId: string;\n patternType:\n | \"parallel\"\n | \"sequential\"\n | \"supervisor\"\n | \"dag\"\n | \"reflect\"\n | \"race\"\n | \"debate\"\n | \"goal\";\n durationMs: number;\n timestamp: number;\n error?: Error;\n }) => void;\n onDagNodeStart?: (event: {\n patternId: string;\n nodeId: string;\n agentId: string;\n nodeType: \"agent\" | \"task\";\n timestamp: number;\n }) => void;\n onDagNodeComplete?: (event: {\n patternId: string;\n nodeId: string;\n agentId: string;\n nodeType: \"agent\" | \"task\";\n durationMs: number;\n timestamp: number;\n }) => void;\n onDagNodeError?: (event: {\n patternId: string;\n nodeId: string;\n agentId: string;\n nodeType: \"agent\" | \"task\";\n error: Error;\n durationMs: number;\n timestamp: number;\n }) => void;\n onDagNodeSkipped?: (event: {\n patternId: string;\n nodeId: string;\n agentId: string;\n nodeType: \"agent\" | \"task\";\n reason: string;\n timestamp: number;\n }) => void;\n onHealthChange?: (event: {\n agentId: string;\n oldScore: number;\n newScore: number;\n timestamp: number;\n }) => void;\n onReroute?: (event: RerouteEvent) => void;\n /** Called when a breakpoint is hit and waiting for resolution. */\n onBreakpoint?: (request: BreakpointRequest) => void;\n /** Called when a cross-agent derivation value updates */\n onDerivationUpdate?: (event: {\n derivationId: string;\n value: unknown;\n timestamp: number;\n }) => void;\n /** Called when a cross-agent derivation throws an error */\n onDerivationError?: (event: {\n derivationId: string;\n error: Error;\n timestamp: number;\n }) => void;\n /** Called when scratchpad values are updated */\n onScratchpadUpdate?: (event: { keys: string[]; timestamp: number }) => void;\n /** Called when a task starts executing */\n onTaskStart?: (event: {\n patternId: string;\n taskId: string;\n label: string;\n timestamp: number;\n }) => void;\n /** Called when a task completes successfully */\n onTaskComplete?: (event: {\n patternId: string;\n taskId: string;\n label: string;\n durationMs: number;\n timestamp: number;\n }) => void;\n /** Called when a task fails */\n onTaskError?: (event: {\n patternId: string;\n taskId: string;\n label: string;\n error: Error;\n durationMs: number;\n timestamp: number;\n }) => void;\n /** Called when a task reports progress */\n onTaskProgress?: (event: {\n patternId: string;\n taskId: string;\n label: string;\n percent: number;\n message?: string;\n timestamp: number;\n }) => void;\n /** Called when a pattern checkpoint is saved */\n onCheckpointSave?: (event: {\n checkpointId: string;\n patternType: string;\n step: number;\n timestamp: number;\n }) => void;\n /** Called when a checkpoint save fails */\n onCheckpointError?: (event: {\n patternType: string;\n step: number;\n error: Error;\n timestamp: number;\n }) => void;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/** Error codes for guardrail errors */\nexport type GuardrailErrorCode =\n | \"INPUT_GUARDRAIL_FAILED\"\n | \"OUTPUT_GUARDRAIL_FAILED\"\n | \"TOOL_CALL_GUARDRAIL_FAILED\"\n | \"APPROVAL_REJECTED\"\n | \"BUDGET_EXCEEDED\"\n | \"RATE_LIMIT_EXCEEDED\"\n | \"AGENT_ERROR\";\n\n/**\n * Structured error for guardrail failures.\n *\n * **Security:** The `input` and `data` properties are non-enumerable to prevent\n * accidental leakage of sensitive data via JSON.stringify or console.log.\n */\nexport class GuardrailError extends Error {\n readonly code: GuardrailErrorCode;\n readonly guardrailName: string;\n readonly guardrailType: \"input\" | \"output\" | \"toolCall\";\n readonly userMessage: string;\n declare readonly data: unknown;\n readonly agentName: string;\n declare readonly input: string;\n\n constructor(options: {\n code: GuardrailErrorCode;\n message: string;\n guardrailName: string;\n guardrailType: \"input\" | \"output\" | \"toolCall\";\n userMessage?: string;\n data?: unknown;\n agentName: string;\n input: string;\n cause?: Error;\n }) {\n super(options.message, { cause: options.cause });\n this.name = \"GuardrailError\";\n this.code = options.code;\n this.guardrailName = options.guardrailName;\n this.guardrailType = options.guardrailType;\n this.userMessage = options.userMessage ?? options.message;\n this.agentName = options.agentName;\n\n Object.defineProperty(this, \"input\", {\n value: options.input,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n Object.defineProperty(this, \"data\", {\n value: options.data,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n guardrailName: this.guardrailName,\n guardrailType: this.guardrailType,\n userMessage: this.userMessage,\n agentName: this.agentName,\n };\n }\n}\n\n/** Check if an error is a GuardrailError. */\nexport function isGuardrailError(error: unknown): error is GuardrailError {\n return error instanceof GuardrailError;\n}\n\n// ============================================================================\n// Schema Validation Types (used by built-in guardrails)\n// ============================================================================\n\n/** Schema validation result */\nexport interface SchemaValidationResult {\n valid: boolean;\n errors?: string[];\n}\n\n/** Schema validator function type */\nexport type SchemaValidator<_T = unknown> = (\n value: unknown,\n) => SchemaValidationResult | boolean;\n\n// ============================================================================\n// Bridge Schema Constants\n// ============================================================================\n\nexport const AGENT_KEY = \"__agent\" as const;\nexport const APPROVAL_KEY = \"__approval\" as const;\nexport const CONVERSATION_KEY = \"__conversation\" as const;\nexport const TOOL_CALLS_KEY = \"__toolCalls\" as const;\nexport const BREAKPOINT_KEY = \"__breakpoints\" as const;\n\n// ============================================================================\n// DAG Execution Types (Multi-Agent)\n// ============================================================================\n\n/** Status of a DAG node during execution */\nexport type DagNodeStatus =\n | \"pending\"\n | \"ready\"\n | \"running\"\n | \"completed\"\n | \"error\"\n | \"skipped\";\n\n/** Execution context available to DAG node callbacks */\nexport interface DagExecutionContext {\n /** Original input to the DAG */\n input: string;\n /** Outputs keyed by node ID (populated as nodes complete) */\n outputs: Record<string, unknown>;\n /** Statuses keyed by node ID */\n statuses: Record<string, DagNodeStatus>;\n /** Error messages keyed by node ID */\n errors: Record<string, string>;\n /** Full RunResult keyed by node ID */\n results: Record<string, RunResult<unknown>>;\n}\n\n/** A node in a DAG execution pattern */\nexport interface DagNode {\n /** Registered handler ID (agent or task) to run for this node */\n handler: string;\n /** Upstream node IDs this node depends on */\n deps?: string[];\n /** Conditional edge — evaluated when deps are met. @default unconditional */\n when?: (context: DagExecutionContext) => boolean;\n /** Build input string for this node's agent. @default JSON.stringify(upstream outputs) */\n transform?: (context: DagExecutionContext) => string;\n /** Per-node timeout (ms) */\n timeout?: number;\n /** Tiebreaker when multiple nodes are ready (higher = first). @default 0 */\n priority?: number;\n}\n\n/** DAG execution pattern — nodes are agents, edges are reactive conditions */\nexport interface DagPattern<T = unknown> {\n type: \"dag\";\n /** Nodes keyed by node ID */\n nodes: Record<string, DagNode>;\n /** Merge all node outputs into the final result */\n merge: (context: DagExecutionContext) => T | Promise<T>;\n /** Overall DAG timeout (ms) */\n timeout?: number;\n /** Maximum nodes running concurrently. @default Infinity. Consider setting this to avoid API rate limits. */\n maxConcurrent?: number;\n /** Error handling strategy. @default \"fail\" */\n onNodeError?: \"fail\" | \"skip-downstream\" | \"continue\";\n /** Checkpoint configuration for mid-execution fault tolerance */\n checkpoint?: PatternCheckpointConfig;\n}\n\n// ============================================================================\n// Debug Configuration\n// ============================================================================\n\n/** Debug configuration for orchestrators */\nexport interface OrchestratorDebugConfig {\n verboseTimeline?: boolean;\n}\n\n// ============================================================================\n// Debug Timeline Types\n// ============================================================================\n\n/** All debug event types */\nexport type DebugEventType =\n | \"agent_start\"\n | \"agent_complete\"\n | \"agent_error\"\n | \"agent_retry\"\n | \"guardrail_check\"\n | \"constraint_evaluate\"\n | \"resolver_start\"\n | \"resolver_complete\"\n | \"resolver_error\"\n | \"approval_request\"\n | \"approval_response\"\n | \"handoff_start\"\n | \"handoff_complete\"\n | \"pattern_start\"\n | \"pattern_complete\"\n | \"dag_node_update\"\n | \"breakpoint_hit\"\n | \"breakpoint_resumed\"\n | \"derivation_update\"\n | \"scratchpad_update\"\n | \"reflection_iteration\"\n | \"race_start\"\n | \"race_winner\"\n | \"race_cancelled\"\n | \"debate_round\"\n | \"reroute\"\n | \"checkpoint_save\"\n | \"checkpoint_restore\"\n | \"task_start\"\n | \"task_complete\"\n | \"task_error\"\n | \"task_progress\"\n | \"goal_step\";\n\n/** Base debug event */\nexport interface DebugEventBase {\n id: number;\n type: DebugEventType;\n timestamp: number;\n agentId?: string;\n snapshotId: number | null;\n}\n\n/** Agent start event */\nexport interface AgentStartEvent extends DebugEventBase {\n type: \"agent_start\";\n agentId: string;\n inputLength: number;\n /** Truncated input text (max 5000 chars) */\n input?: string;\n}\n\n/** Agent complete event */\nexport interface AgentCompleteEvent extends DebugEventBase {\n type: \"agent_complete\";\n agentId: string;\n outputLength: number;\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n durationMs: number;\n modelId?: string;\n /** Truncated output text (max 5000 chars) */\n output?: string;\n}\n\n/** Agent error event */\nexport interface AgentErrorEvent extends DebugEventBase {\n type: \"agent_error\";\n agentId: string;\n errorMessage: string;\n durationMs: number;\n}\n\n/** Agent retry event */\nexport interface AgentRetryEvent extends DebugEventBase {\n type: \"agent_retry\";\n agentId: string;\n attempt: number;\n errorMessage: string;\n delayMs: number;\n}\n\n/** Guardrail check event */\nexport interface GuardrailCheckEvent extends DebugEventBase {\n type: \"guardrail_check\";\n guardrailName: string;\n guardrailType: \"input\" | \"output\" | \"toolCall\";\n passed: boolean;\n reason?: string;\n durationMs: number;\n}\n\n/** Constraint evaluate event */\nexport interface ConstraintEvaluateEvent extends DebugEventBase {\n type: \"constraint_evaluate\";\n constraintId: string;\n fired: boolean;\n}\n\n/** Resolver start event */\nexport interface ResolverStartEvent extends DebugEventBase {\n type: \"resolver_start\";\n resolverId: string;\n requirementType: string;\n}\n\n/** Resolver complete event */\nexport interface ResolverCompleteEvent extends DebugEventBase {\n type: \"resolver_complete\";\n resolverId: string;\n durationMs: number;\n}\n\n/** Resolver error event */\nexport interface ResolverErrorEvent extends DebugEventBase {\n type: \"resolver_error\";\n resolverId: string;\n errorMessage: string;\n durationMs: number;\n}\n\n/** Approval request event */\nexport interface ApprovalRequestEvent extends DebugEventBase {\n type: \"approval_request\";\n requestId: string;\n approvalType: \"tool_call\" | \"output\" | \"handoff\";\n}\n\n/** Approval response event */\nexport interface ApprovalResponseEvent extends DebugEventBase {\n type: \"approval_response\";\n requestId: string;\n approved: boolean;\n reason?: string;\n}\n\n/** Handoff start event */\nexport interface HandoffStartEvent extends DebugEventBase {\n type: \"handoff_start\";\n fromAgent: string;\n toAgent: string;\n}\n\n/** Handoff complete event */\nexport interface HandoffCompleteEvent extends DebugEventBase {\n type: \"handoff_complete\";\n fromAgent: string;\n toAgent: string;\n durationMs: number;\n}\n\n/** Pattern start event */\nexport interface PatternStartEvent extends DebugEventBase {\n type: \"pattern_start\";\n patternId: string;\n patternType:\n | \"parallel\"\n | \"sequential\"\n | \"supervisor\"\n | \"dag\"\n | \"reflect\"\n | \"race\"\n | \"debate\"\n | \"goal\";\n /** All handler IDs in this pattern (agents + tasks) */\n handlers?: string[];\n /** Which handler IDs are tasks (rest are agents) */\n taskIds?: string[];\n}\n\n/** Pattern complete event */\nexport interface PatternCompleteEvent extends DebugEventBase {\n type: \"pattern_complete\";\n patternId: string;\n patternType:\n | \"parallel\"\n | \"sequential\"\n | \"supervisor\"\n | \"dag\"\n | \"reflect\"\n | \"race\"\n | \"debate\"\n | \"goal\";\n durationMs: number;\n error?: string;\n}\n\n/** DAG node update event */\nexport interface DagNodeUpdateEvent extends DebugEventBase {\n type: \"dag_node_update\";\n nodeId: string;\n status: DagNodeStatus;\n deps?: string[];\n}\n\n/** Breakpoint hit event */\nexport interface BreakpointHitEvent extends DebugEventBase {\n type: \"breakpoint_hit\";\n breakpointId: string;\n breakpointType: string;\n label?: string;\n}\n\n/** Breakpoint resumed event */\nexport interface BreakpointResumedEvent extends DebugEventBase {\n type: \"breakpoint_resumed\";\n breakpointId: string;\n modified: boolean;\n skipped: boolean;\n}\n\n/** Derivation update event */\nexport interface DerivationUpdateEvent extends DebugEventBase {\n type: \"derivation_update\";\n derivationId: string;\n valueType: string;\n}\n\n/** Scratchpad update event */\nexport interface ScratchpadUpdateEvent extends DebugEventBase {\n type: \"scratchpad_update\";\n keys: string[];\n}\n\n/** Reflection iteration event */\nexport interface ReflectionIterationEvent extends DebugEventBase {\n type: \"reflection_iteration\";\n iteration: number;\n passed: boolean;\n score?: number;\n durationMs: number;\n producerTokens: number;\n evaluatorTokens: number;\n}\n\n/** Race start event */\nexport interface RaceStartEvent extends DebugEventBase {\n type: \"race_start\";\n patternId: string;\n agents: string[];\n}\n\n/** Race winner event */\nexport interface RaceWinnerEvent extends DebugEventBase {\n type: \"race_winner\";\n patternId: string;\n winnerId: string;\n durationMs: number;\n}\n\n/** Race cancelled event */\nexport interface RaceCancelledEvent extends DebugEventBase {\n type: \"race_cancelled\";\n patternId: string;\n cancelledIds: string[];\n reason: \"winner_found\" | \"timeout\" | \"all_failed\";\n}\n\n/** Debate round event — emitted after each round's judgement */\nexport interface DebateRoundEvent extends DebugEventBase {\n type: \"debate_round\";\n patternId: string;\n round: number;\n totalRounds: number;\n winnerId: string;\n score?: number;\n agentCount: number;\n}\n\n/** Reroute debug event recorded when self-healing reroutes to an alternate agent */\nexport interface RerouteDebugEvent extends DebugEventBase {\n type: \"reroute\";\n agentId: string;\n from: string;\n to: string;\n reason: string;\n}\n\n/** Checkpoint save event */\nexport interface CheckpointSaveEvent extends DebugEventBase {\n type: \"checkpoint_save\";\n checkpointId: string;\n patternType: string;\n step: number;\n}\n\n/** Checkpoint restore event */\nexport interface CheckpointRestoreEvent extends DebugEventBase {\n type: \"checkpoint_restore\";\n checkpointId: string;\n patternType: string;\n step: number;\n}\n\n/** Task start event */\nexport interface TaskStartEvent extends DebugEventBase {\n type: \"task_start\";\n taskId: string;\n label: string;\n description?: string;\n inputLength: number;\n}\n\n/** Task complete event */\nexport interface TaskCompleteEvent extends DebugEventBase {\n type: \"task_complete\";\n taskId: string;\n label: string;\n durationMs: number;\n}\n\n/** Task error event */\nexport interface TaskErrorEvent extends DebugEventBase {\n type: \"task_error\";\n taskId: string;\n label: string;\n error: string;\n durationMs: number;\n attempt?: number;\n}\n\n/** Task progress event */\nexport interface TaskProgressEvent extends DebugEventBase {\n type: \"task_progress\";\n taskId: string;\n label: string;\n percent: number;\n message?: string;\n}\n\n/** Goal step event — emitted for each agent invocation within a goal step */\nexport interface GoalStepEvent extends DebugEventBase {\n type: \"goal_step\";\n agentId: string;\n step: number;\n nodeId: string;\n satisfaction: number;\n satisfactionDelta: number;\n}\n\n/** Union of all debug event types */\nexport type DebugEvent =\n | AgentStartEvent\n | AgentCompleteEvent\n | AgentErrorEvent\n | AgentRetryEvent\n | GuardrailCheckEvent\n | ConstraintEvaluateEvent\n | ResolverStartEvent\n | ResolverCompleteEvent\n | ResolverErrorEvent\n | ApprovalRequestEvent\n | ApprovalResponseEvent\n | HandoffStartEvent\n | HandoffCompleteEvent\n | PatternStartEvent\n | PatternCompleteEvent\n | DagNodeUpdateEvent\n | BreakpointHitEvent\n | BreakpointResumedEvent\n | DerivationUpdateEvent\n | ScratchpadUpdateEvent\n | ReflectionIterationEvent\n | RaceStartEvent\n | RaceWinnerEvent\n | RaceCancelledEvent\n | DebateRoundEvent\n | RerouteDebugEvent\n | CheckpointSaveEvent\n | CheckpointRestoreEvent\n | TaskStartEvent\n | TaskCompleteEvent\n | TaskErrorEvent\n | TaskProgressEvent\n | GoalStepEvent;\n\n// ============================================================================\n// Self-Healing Types\n// ============================================================================\n\n/** Health state for an agent stored in facts */\nexport interface AgentHealthState {\n circuitState: \"CLOSED\" | \"OPEN\" | \"HALF_OPEN\";\n healthScore: number;\n lastUpdated: number;\n}\n\n/** Reroute event fired when an agent is rerouted */\nexport interface RerouteEvent {\n originalAgent: string;\n reroutedTo: string;\n reason: string;\n timestamp: number;\n}\n\n/** Health monitor configuration */\nexport interface HealthMonitorConfig {\n /** Rolling window for metrics (ms). @default 60000 */\n windowMs?: number;\n /** Weights for health score computation (must sum to ~1.0) */\n weights?: {\n /** Weight for success rate (0-1). @default 0.5 */\n successRate?: number;\n /** Weight for latency (0-1). @default 0.3 */\n latency?: number;\n /** Weight for circuit state (0-1). @default 0.2 */\n circuitState?: number;\n };\n /** Max latency considered \"normal\" (ms). @default 5000 */\n maxNormalLatencyMs?: number;\n /** Max events per agent before FIFO eviction. @default 1000 */\n maxEventsPerAgent?: number;\n}\n\n/** Self-healing configuration for single-agent orchestrator */\nexport interface SelfHealingConfig {\n /** Fallback runners to try in order when primary CB is open */\n fallbackRunners?: AgentRunner[];\n /** Fallback agent to try when all runners fail */\n fallbackAgent?: AgentLike;\n /** Circuit breaker config for primary runner */\n circuitBreaker?: AgentCircuitBreakerConfig;\n /** Health score below which to trigger reroute. @default 30 */\n healthThreshold?: number;\n /** Behavior when all fallbacks exhausted */\n degradation?: \"reject\" | \"fallback-response\";\n /** Static response to return when degradation is \"fallback-response\" */\n fallbackResponse?: unknown;\n /** Callback when reroute occurs */\n onReroute?: (event: RerouteEvent) => void;\n}\n\n/** Self-healing configuration for multi-agent orchestrator */\nexport interface MultiAgentSelfHealingConfig {\n /** Default circuit breaker config for agents without their own */\n circuitBreakerDefaults?: AgentCircuitBreakerConfig;\n /** Health score below which to trigger reroute. @default 30 */\n healthThreshold?: number;\n /** Explicit equivalency groups (group name → agent IDs) */\n equivalencyGroups?: Record<string, string[]>;\n /** Use capability matching for implicit equivalency. @default true */\n useCapabilities?: boolean;\n /** Strategy for selecting equivalent agent */\n selectionStrategy?: \"healthiest\" | \"round-robin\";\n /** Behavior when all equivalents are down */\n degradation?: \"reject\" | \"fallback-response\";\n /** Static response for \"fallback-response\" degradation */\n fallbackResponse?: unknown;\n /** Callback when reroute occurs */\n onReroute?: (event: RerouteEvent) => void;\n /** Callback when agent health changes */\n onHealthChange?: (event: {\n agentId: string;\n oldScore: number;\n newScore: number;\n }) => void;\n /** Health monitor configuration */\n healthMonitor?: HealthMonitorConfig;\n}\n\n/** Circuit breaker config for AI agent self-healing (simplified subset of core CircuitBreakerConfig) */\nexport interface AgentCircuitBreakerConfig {\n /** Number of failures before opening. @default 5 */\n failureThreshold?: number;\n /** Time before trying half-open (ms). @default 30000 */\n resetTimeoutMs?: number;\n /** Successes needed to close from half-open. @default 2 */\n halfOpenSuccesses?: number;\n /** State change callback */\n onStateChange?: (from: string, to: string) => void;\n}\n\n/** Internal key for health state in coordinator facts */\nexport const HEALTH_KEY = \"__agentHealth\" as const;\n\n/** Breakpoint state stored in bridge schema — canonical definition in breakpoints.ts */\nexport type BreakpointState = BreakpointStateFromBreakpoints;\n\n// ============================================================================\n// Cross-Agent Derivation Types\n// ============================================================================\n\n/** Snapshot of all agent states for cross-agent derivations */\nexport interface CrossAgentSnapshot {\n agents: Record<\n string,\n {\n status: \"idle\" | \"running\" | \"completed\" | \"error\";\n lastInput?: string;\n lastOutput?: unknown;\n lastError?: string;\n runCount: number;\n totalTokens: number;\n }\n >;\n coordinator: { globalTokens: number; status: string };\n scratchpad?: Record<string, unknown>;\n}\n\n/** Function that computes a derived value from a cross-agent snapshot */\nexport type CrossAgentDerivationFn<T = unknown> = (\n snapshot: CrossAgentSnapshot,\n) => T;\n\n// ============================================================================\n// Shared Scratchpad Types\n// ============================================================================\n\n/** Internal key for scratchpad fact on coordinator module */\nexport const SCRATCHPAD_KEY = \"__scratchpad\" as const;\n\n/** Shared scratchpad interface for multi-agent collaboration */\nexport interface Scratchpad<\n T extends Record<string, unknown> = Record<string, unknown>,\n> {\n get<K extends keyof T>(key: K): T[K];\n set<K extends keyof T>(key: K, value: T[K]): void;\n /** Check if a key exists in the scratchpad */\n has<K extends keyof T>(key: K): boolean;\n /** Delete a key from the scratchpad */\n delete<K extends keyof T>(key: K): void;\n update(values: Partial<T>): void;\n getAll(): T;\n subscribe(\n keys: (keyof T)[],\n callback: (key: keyof T, value: unknown) => void,\n ): () => void;\n onChange(callback: (key: string, value: unknown) => void): () => void;\n reset(): void;\n}\n\n// ============================================================================\n// Goal Pattern Types\n// ============================================================================\n\n/** A node in a goal execution pattern */\nexport interface GoalNode {\n /** Handler ID — agent or task registered on the orchestrator */\n handler: string;\n /** Fact keys this node can produce */\n produces: string[];\n /** Fact keys this node needs (must be satisfied before running) */\n requires?: string[];\n /** Allow re-run if input facts change after completion */\n allowRerun?: boolean;\n /** Priority for selection when multiple nodes are ready. Higher = first */\n priority?: number;\n /** Build the input string from current facts */\n buildInput?: (facts: Record<string, unknown>) => string;\n /** Extract output facts from the agent's result */\n extractOutput?: (result: RunResult<unknown>) => Record<string, unknown>;\n}\n\n/** Goal step metrics */\nexport interface GoalStepMetrics {\n step: number;\n durationMs: number;\n nodesRun: string[];\n factsProduced: string[];\n satisfaction: number;\n satisfactionDelta: number;\n tokensConsumed: number;\n}\n\n/** Goal progress metrics */\nexport interface GoalMetrics {\n satisfaction: number;\n progressRate: number;\n estimatedStepsRemaining: number | null;\n decelerating: boolean;\n}\n\n/** Agent selection strategy for goal pattern */\nexport interface AgentSelectionStrategy {\n /**\n * Select which ready agents to run this step.\n *\n * @param readyAgents - Agent IDs whose `requires` are satisfied\n * @param metrics - Per-agent performance metrics (runs, avgSatisfactionDelta, tokens)\n * @param goalMetrics - Global goal progress metrics. Built-in strategies use per-agent\n * metrics only; this parameter enables custom strategies that account for overall goal\n * progress (e.g., switching to cheaper agents as satisfaction approaches 1.0).\n */\n select: (\n readyAgents: string[],\n metrics: Record<\n string,\n { runs: number; avgSatisfactionDelta: number; tokens: number }\n >,\n goalMetrics: GoalMetrics,\n ) => string[];\n}\n\n/** Relaxation context passed to custom relaxation strategies */\nexport interface RelaxationContext {\n step: number;\n facts: Record<string, unknown>;\n metrics: GoalMetrics;\n completedNodes: Set<string>;\n failedNodes: Map<string, number>;\n}\n\n/** Relaxation strategy for when goal pursuit stalls */\nexport type RelaxationStrategy =\n | { type: \"allow_rerun\"; nodes: string[] }\n | { type: \"alternative_nodes\"; nodes: GoalNode[] }\n | { type: \"inject_facts\"; facts: Record<string, unknown> }\n | { type: \"accept_partial\" }\n | {\n type: \"custom\";\n apply: (context: RelaxationContext) => void | Promise<void>;\n };\n\n/** Relaxation tier — progressively applied when goal pursuit stalls */\nexport interface RelaxationTier {\n label: string;\n /** Steps of no progress before applying. @default 3 */\n afterStallSteps?: number;\n strategy: RelaxationStrategy;\n}\n\n/** Record of a relaxation event */\nexport interface RelaxationRecord {\n step: number;\n tierIndex: number;\n label: string;\n strategy: RelaxationStrategy[\"type\"];\n}\n\n/** Goal execution pattern — declare desired state, let the runtime resolve */\nexport interface GoalPattern<T = unknown> {\n type: \"goal\";\n /** Nodes with produces/requires declarations */\n nodes: Record<string, GoalNode>;\n /** Goal condition — when this returns true, the goal is achieved */\n when: (facts: Record<string, unknown>) => boolean;\n /** Quantitative satisfaction: 0.0 to 1.0. Enables progress tracking.\n * If omitted, binary: 0.0 when when() is false, 1.0 when true. */\n satisfaction?: (facts: Record<string, unknown>) => number;\n /** Max goal steps. @default 50 */\n maxSteps?: number;\n /** Extract final result from achieved facts */\n extract?: (facts: Record<string, unknown>) => T;\n /** Timeout in ms. @default 300000 */\n timeout?: number;\n /** Abort signal */\n signal?: AbortSignal;\n /** Agent selection strategy. @default \"all-ready\" */\n selectionStrategy?: AgentSelectionStrategy;\n /** Relaxation tiers — progressively applied when goal pursuit stalls */\n relaxation?: RelaxationTier[];\n /** Lifecycle hooks */\n onStep?: (\n step: number,\n facts: Record<string, unknown>,\n readyAgents: string[],\n ) => void;\n onStall?: (step: number, metrics: GoalMetrics) => void;\n /** Checkpoint configuration for mid-execution fault tolerance */\n checkpoint?: PatternCheckpointConfig;\n}\n\n/** Result of a goal pattern execution */\nexport interface GoalResult<T = unknown> {\n /** Whether the when() condition was satisfied */\n achieved: boolean;\n /** Final value (from extract, or raw facts) */\n result: T;\n /** Final facts state */\n facts: Record<string, unknown>;\n /** Nodes that ran, in execution order */\n executionOrder: string[];\n /** Per-node results */\n nodeResults: Record<string, RunResult<unknown>>;\n /** Total goal steps taken */\n steps: number;\n /** Total tokens consumed */\n totalTokens: number;\n /** Total duration (ms) */\n durationMs: number;\n /** Per-step metrics (satisfaction, nodes run, etc.) */\n stepMetrics: GoalStepMetrics[];\n /** Relaxation events applied */\n relaxations: RelaxationRecord[];\n /** Error message if goal was not achieved */\n error?: string;\n}\n\n// ============================================================================\n// Pattern Checkpoint Types (Universal)\n// ============================================================================\n\n/** Universal checkpoint configuration for all execution patterns */\nexport interface PatternCheckpointConfig {\n /** Save a checkpoint every N steps/rounds/iterations. @default 5 */\n everyN?: number;\n /** Checkpoint store. Uses the orchestrator's store if not provided. */\n store?: import(\"./checkpoint.js\").CheckpointStore;\n /** Label prefix for checkpoints. @default pattern type name */\n labelPrefix?: string;\n /** Conditional: only save when this returns true */\n when?: (context: CheckpointContext) => boolean;\n}\n\n/** Context passed to conditional checkpoint predicates */\nexport interface CheckpointContext {\n /** Current step/round/iteration number */\n step: number;\n /** Pattern type identifier */\n patternType: string;\n /** Pattern-specific facts (goal only) */\n facts?: Record<string, unknown>;\n /** Satisfaction score 0-1 (goal only) */\n satisfaction?: number;\n}\n\nexport type GoalCheckpointConfig = PatternCheckpointConfig;\n\n// ---- Common checkpoint state fields ----\n\n/** Common fields present on all pattern checkpoint states */\nexport interface PatternCheckpointBase {\n /** Checkpoint format version */\n version: 1;\n /** Unique ID */\n id: string;\n /** ISO timestamp */\n createdAt: string;\n /** User label */\n label?: string;\n /** Pattern ID */\n patternId: string;\n /** Total expected steps/rounds/iterations (null for unbounded) */\n stepsTotal?: number | null;\n}\n\n// ---- Per-pattern checkpoint states ----\n\n/** Checkpoint state for sequential pattern */\nexport interface SequentialCheckpointState extends PatternCheckpointBase {\n type: \"sequential\";\n /** Next agent index to run */\n step: number;\n /** Current input for the next agent */\n currentInput: string;\n /** Results collected so far (output + tokens) */\n results: Array<{ agentId: string; output: unknown; totalTokens: number }>;\n}\n\n/** Checkpoint state for supervisor pattern */\nexport interface SupervisorCheckpointState extends PatternCheckpointBase {\n type: \"supervisor\";\n /** Next round number */\n round: number;\n /** Last supervisor output */\n supervisorOutput: unknown;\n /** Worker results so far */\n workerResults: Array<{ output: unknown; totalTokens: number }>;\n /** Current input to supervisor */\n currentInput: string;\n}\n\n/** Checkpoint state for reflect pattern */\nexport interface ReflectCheckpointState extends PatternCheckpointBase {\n type: \"reflect\";\n /** Next iteration number */\n iteration: number;\n /** Current effective input */\n effectiveInput: string;\n /** Iteration history */\n history: Array<{\n iteration: number;\n passed: boolean;\n score?: number;\n feedback?: string;\n durationMs: number;\n producerTokens: number;\n evaluatorTokens: number;\n }>;\n /** Producer outputs so far */\n producerOutputs: Array<{ output: unknown; score?: number }>;\n /** Last producer output */\n lastProducerOutput: unknown | null;\n}\n\n/** Checkpoint state for debate pattern */\nexport interface DebateCheckpointState extends PatternCheckpointBase {\n type: \"debate\";\n /** Next round number */\n round: number;\n /** Current input for the round */\n currentInput: string;\n /** Completed rounds */\n rounds: Array<{\n proposals: Array<{ agentId: string; output: unknown }>;\n judgement: { winnerId: string; feedback?: string; score?: number };\n }>;\n /** Last winning agent ID */\n lastWinnerId: string;\n /** Last winning output */\n lastWinnerOutput: unknown;\n /** Tokens consumed so far */\n tokensConsumed: number;\n}\n\n/** Checkpoint state for DAG pattern */\nexport interface DagCheckpointState extends PatternCheckpointBase {\n type: \"dag\";\n /** Per-node statuses */\n statuses: Record<string, DagNodeStatus>;\n /** Per-node outputs */\n outputs: Record<string, unknown>;\n /** Per-node errors */\n errors: Record<string, string>;\n /** Number of completed nodes */\n completedCount: number;\n /** Full results (output + tokens per node) */\n nodeResults: Record<string, { output: unknown; totalTokens: number }>;\n /** Original input */\n input: string;\n}\n\n/** Serializable mid-goal state for save/resume */\nexport interface GoalCheckpointState extends PatternCheckpointBase {\n /** Pattern type discriminator */\n type: \"goal\";\n /** Current step */\n step: number;\n /** Current facts snapshot */\n facts: Record<string, unknown>;\n /** Completed node IDs */\n completedNodes: string[];\n /** Failed node IDs with consecutive failure counts */\n failedNodes: Record<string, number>;\n /** Node input hashes (for allowRerun detection) */\n nodeInputHashes: Record<string, string>;\n /** Per-node results (serialized — output only, not the full RunResult) */\n nodeOutputs: Record<string, { output: unknown; totalTokens: number }>;\n /** Execution order so far */\n executionOrder: string[];\n /** Step metrics collected so far */\n stepMetrics: GoalStepMetrics[];\n /** Relaxations applied so far */\n relaxations: RelaxationRecord[];\n /** Applied relaxation tier index */\n appliedRelaxationTiers: number;\n /** Stall step counter */\n stallSteps: number;\n /** Last satisfaction value */\n lastSatisfaction: number;\n /** Per-agent metrics */\n agentMetrics: Record<\n string,\n { runs: number; totalDelta: number; tokens: number }\n >;\n}\n\n/** Discriminated union of all pattern checkpoint states */\nexport type PatternCheckpointState =\n | SequentialCheckpointState\n | SupervisorCheckpointState\n | ReflectCheckpointState\n | DebateCheckpointState\n | DagCheckpointState\n | GoalCheckpointState;\n\n// ---- Checkpoint utilities ----\n\n/** Progress computed from a checkpoint state */\nexport interface CheckpointProgress {\n /** 0-100 percentage complete */\n percentage: number;\n /** Steps/rounds/iterations completed */\n stepsCompleted: number;\n /** Total expected steps (null for unbounded patterns) */\n stepsTotal: number | null;\n /** Tokens consumed so far */\n tokensConsumed: number;\n /** Estimated tokens remaining (null when unknowable) */\n estimatedTokensRemaining: number | null;\n /** Estimated steps remaining (null when unknowable) */\n estimatedStepsRemaining: number | null;\n}\n\n/** Diff between two checkpoint states */\nexport interface CheckpointDiff {\n /** Pattern type */\n patternType: string;\n /** Step/round/iteration difference */\n stepDelta: number;\n /** Token difference */\n tokensDelta: number;\n /** Fact changes (goal only) */\n facts?: {\n added: string[];\n removed: string[];\n changed: Array<{ key: string; before: unknown; after: unknown }>;\n };\n /** Nodes completed between checkpoints (DAG/goal) */\n nodesCompleted?: string[];\n}\n\n/** Bridge schema for orchestrator (internal plumbing — types cast to bypass t.object constraint) */\nexport const orchestratorBridgeSchema = {\n facts: {\n [AGENT_KEY]: t.object() as unknown as SchemaType<AgentState>,\n [APPROVAL_KEY]: t.object() as unknown as SchemaType<ApprovalState>,\n [CONVERSATION_KEY]: t.array() as unknown as SchemaType<Message[]>,\n [TOOL_CALLS_KEY]: t.array() as unknown as SchemaType<ToolCall[]>,\n [BREAKPOINT_KEY]: t.object() as unknown as SchemaType<BreakpointState>,\n },\n derivations: {},\n events: {},\n requirements: {},\n} satisfies ModuleSchema;\n","/**\n * Debug Timeline — AI-specific event log with snapshot correlation.\n *\n * Records agent lifecycle events (start, complete, error, guardrail checks,\n * approvals, handoffs, patterns) and correlates them with core time-travel\n * snapshots for visual timeline UIs and fork-and-replay debugging.\n *\n * Zero-cost when debug=false — the timeline is simply `null`.\n *\n * @module\n */\n\nimport type { Plugin } from \"@directive-run/core\";\nimport type { DebugEvent, DebugEventType } from \"./types.js\";\n\n/** A12: Known event types for import validation */\nconst KNOWN_EVENT_TYPES: Set<string> = new Set([\n \"agent_start\",\n \"agent_complete\",\n \"agent_error\",\n \"agent_retry\",\n \"guardrail_check\",\n \"constraint_evaluate\",\n \"resolver_start\",\n \"resolver_complete\",\n \"resolver_error\",\n \"approval_request\",\n \"approval_response\",\n \"handoff_start\",\n \"handoff_complete\",\n \"pattern_start\",\n \"pattern_complete\",\n \"dag_node_update\",\n \"breakpoint_hit\",\n \"breakpoint_resumed\",\n \"derivation_update\",\n \"scratchpad_update\",\n \"reflection_iteration\",\n \"race_start\",\n \"race_winner\",\n \"race_cancelled\",\n \"debate_round\",\n \"reroute\",\n \"checkpoint_save\",\n \"checkpoint_restore\",\n \"task_start\",\n \"task_complete\",\n \"task_error\",\n \"task_progress\",\n \"goal_step\",\n]);\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Callback fired when a new event is recorded */\nexport type DebugTimelineListener = (event: DebugEvent) => void;\n\n/** Debug timeline instance */\nexport interface DebugTimeline {\n /** Record a new event (id is auto-assigned) */\n record(event: Omit<DebugEvent, \"id\"> & Record<string, unknown>): DebugEvent;\n /** Get all events in order */\n getEvents(): DebugEvent[];\n /** Get events for a specific agent */\n getEventsForAgent(agentId: string): DebugEvent[];\n /** Get events by type with type narrowing */\n getEventsByType<T extends DebugEventType>(\n type: T,\n ): Extract<DebugEvent, { type: T }>[];\n /** Get events at a specific snapshot */\n getEventsAtSnapshot(snapshotId: number): DebugEvent[];\n /** Get events in a time range */\n getEventsInRange(startMs: number, endMs: number): DebugEvent[];\n /** Fork from a snapshot — truncates events after it and calls goTo */\n forkFrom(snapshotId: number): void;\n /** Export timeline as JSON */\n export(): string;\n /** Import timeline from JSON */\n import(json: string): void;\n /** Clear all events */\n clear(): void;\n /** Subscribe to new events. Returns unsubscribe function. */\n subscribe(listener: DebugTimelineListener): () => void;\n /** Current number of events */\n readonly length: number;\n}\n\n/** Options for creating a debug timeline */\nexport interface DebugTimelineOptions {\n /** Maximum events before eviction. @default 2000 */\n maxEvents?: number;\n /** Callback to get current snapshot ID from the system */\n getSnapshotId?: () => number | null;\n /** Callback to navigate to a snapshot (for forkFrom) */\n goToSnapshot?: (snapshotId: number) => void;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\nconst BLOCKED_IMPORT_KEYS = new Set([\n \"__proto__\",\n \"constructor\",\n \"prototype\",\n \"toString\",\n \"valueOf\",\n \"hasOwnProperty\",\n]);\n\n/**\n * Create a debug timeline for recording and correlating AI events.\n *\n * @example\n * ```typescript\n * const timeline = createDebugTimeline({ maxEvents: 1000 });\n *\n * timeline.record({\n * type: \"agent_start\",\n * timestamp: Date.now(),\n * agentId: \"researcher\",\n * snapshotId: null,\n * inputLength: 42,\n * });\n *\n * const agentEvents = timeline.getEventsForAgent(\"researcher\");\n * ```\n */\nexport function createDebugTimeline(\n options: DebugTimelineOptions = {},\n): DebugTimeline {\n const maxEvents = options.maxEvents ?? 2000;\n const goToSnapshot = options.goToSnapshot;\n\n // Validate config\n if (!Number.isFinite(maxEvents) || maxEvents < 1) {\n throw new Error(\"[Directive DebugTimeline] maxEvents must be >= 1\");\n }\n\n let events: DebugEvent[] = [];\n let nextId = 0;\n const listeners = new Set<DebugTimelineListener>();\n\n const timeline: DebugTimeline = {\n record(event: Omit<DebugEvent, \"id\">): DebugEvent {\n const fullEvent = { ...event, id: nextId++ } as DebugEvent;\n events.push(fullEvent);\n\n // Batch eviction — single splice instead of per-element shift\n const overflow = events.length - maxEvents;\n if (overflow > 0) {\n events.splice(0, overflow);\n }\n\n // Notify listeners\n for (const listener of listeners) {\n try {\n listener(fullEvent);\n } catch (err) {\n // A6: Log listener errors in dev mode instead of swallowing silently\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\"\n ) {\n console.error(\n \"[Directive DebugTimeline] Listener threw:\",\n err instanceof Error ? err.message : err,\n );\n }\n }\n }\n\n return fullEvent;\n },\n\n getEvents(): DebugEvent[] {\n return [...events];\n },\n\n getEventsForAgent(agentId: string): DebugEvent[] {\n return events.filter((e) => e.agentId === agentId);\n },\n\n getEventsByType<T extends DebugEventType>(\n type: T,\n ): Extract<DebugEvent, { type: T }>[] {\n return events.filter((e) => e.type === type) as Extract<\n DebugEvent,\n { type: T }\n >[];\n },\n\n getEventsAtSnapshot(snapshotId: number): DebugEvent[] {\n return events.filter((e) => e.snapshotId === snapshotId);\n },\n\n getEventsInRange(startMs: number, endMs: number): DebugEvent[] {\n return events.filter(\n (e) => e.timestamp >= startMs && e.timestamp <= endMs,\n );\n },\n\n forkFrom(snapshotId: number): void {\n // A8: Single reverse scan instead of two .filter() passes\n let cutoffId = -1;\n for (let i = events.length - 1; i >= 0; i--) {\n if (\n events[i]!.snapshotId !== null &&\n events[i]!.snapshotId! <= snapshotId\n ) {\n cutoffId = events[i]!.id;\n break;\n }\n }\n\n if (cutoffId >= 0) {\n // Find the index to slice at (events are monotonic by id)\n let sliceEnd = events.length;\n for (let i = events.length - 1; i >= 0; i--) {\n if (events[i]!.id <= cutoffId) {\n sliceEnd = i + 1;\n break;\n }\n }\n events = events.slice(0, sliceEnd);\n } else {\n // No matching events — clear all\n events = [];\n }\n\n // Navigate the system to the snapshot\n if (goToSnapshot) {\n goToSnapshot(snapshotId);\n }\n },\n\n export(): string {\n return JSON.stringify({ version: 1, events, nextId });\n },\n\n import(json: string): void {\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n throw new Error(\"[Directive DebugTimeline] Invalid JSON\");\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"[Directive DebugTimeline] Invalid timeline data\");\n }\n\n // Prototype pollution defense\n for (const key of Object.keys(parsed)) {\n if (BLOCKED_IMPORT_KEYS.has(key)) {\n throw new Error(\n `[Directive DebugTimeline] Blocked key in import: ${key}`,\n );\n }\n }\n\n const data = parsed as {\n version?: number;\n events?: unknown[];\n nextId?: number;\n };\n\n if (!Array.isArray(data.events)) {\n throw new Error(\"[Directive DebugTimeline] Missing events array\");\n }\n\n // Validate each event has required fields\n const validated: DebugEvent[] = [];\n for (const evt of data.events) {\n if (!evt || typeof evt !== \"object\") {\n continue;\n }\n\n // Prototype pollution defense on event objects\n for (const key of Object.keys(evt)) {\n if (BLOCKED_IMPORT_KEYS.has(key)) {\n throw new Error(\n `[Directive DebugTimeline] Blocked key in event: ${key}`,\n );\n }\n }\n\n const e = evt as Record<string, unknown>;\n // A12: Also validate that event type is a known DebugEventType\n if (\n typeof e.id === \"number\" &&\n typeof e.type === \"string\" &&\n KNOWN_EVENT_TYPES.has(e.type) &&\n typeof e.timestamp === \"number\"\n ) {\n validated.push(evt as DebugEvent);\n }\n }\n\n // Enforce maxEvents cap on imported data\n events =\n validated.length > maxEvents ? validated.slice(-maxEvents) : validated;\n nextId = typeof data.nextId === \"number\" ? data.nextId : validated.length;\n },\n\n clear(): void {\n events = [];\n nextId = 0;\n },\n\n subscribe(listener: DebugTimelineListener): () => void {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\n },\n\n get length(): number {\n return events.length;\n },\n };\n\n return timeline;\n}\n\n// ============================================================================\n// Plugin Factory\n// ============================================================================\n\n/**\n * Create a Directive plugin that bridges core constraint/resolver events\n * to the debug timeline.\n *\n * @example\n * ```typescript\n * const timeline = createDebugTimeline();\n * const plugin = createDebugTimelinePlugin(timeline, () => system.history?.currentIndex ?? null);\n * ```\n */\nexport function createDebugTimelinePlugin(\n timeline: DebugTimeline,\n getSnapshotId: () => number | null,\n): Plugin {\n const resolverStartTimes = new Map<string, number>();\n\n return {\n name: \"directive-ai-debug-timeline\",\n\n onConstraintEvaluate(id: string, active: boolean) {\n timeline.record({\n type: \"constraint_evaluate\",\n timestamp: Date.now(),\n snapshotId: getSnapshotId(),\n constraintId: id,\n fired: active,\n });\n },\n\n onResolverStart(resolver: string, req) {\n resolverStartTimes.set(resolver, Date.now());\n timeline.record({\n type: \"resolver_start\",\n timestamp: Date.now(),\n snapshotId: getSnapshotId(),\n resolverId: resolver,\n requirementType: req.requirement.type,\n });\n },\n\n onResolverComplete(resolver: string) {\n const startTime = resolverStartTimes.get(resolver);\n resolverStartTimes.delete(resolver);\n timeline.record({\n type: \"resolver_complete\",\n timestamp: Date.now(),\n snapshotId: getSnapshotId(),\n resolverId: resolver,\n durationMs: startTime ? Date.now() - startTime : 0,\n });\n },\n\n onResolverError(resolver: string, _req, error) {\n const startTime = resolverStartTimes.get(resolver);\n resolverStartTimes.delete(resolver);\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n timeline.record({\n type: \"resolver_error\",\n timestamp: Date.now(),\n snapshotId: getSnapshotId(),\n resolverId: resolver,\n errorMessage,\n durationMs: startTime ? Date.now() - startTime : 0,\n });\n },\n };\n}\n","/**\n * Shared guardrail and retry utilities — used by both single-agent and multi-agent orchestrators.\n *\n * Extracted from agent-orchestrator.ts to enable reuse without circular dependencies.\n * Internal module — not a public subpath export.\n *\n * @module\n */\n\nimport type {\n AgentLike,\n AgentRetryConfig,\n AgentRunner,\n GuardrailContext,\n GuardrailFn,\n GuardrailResult,\n GuardrailRetryConfig,\n NamedGuardrail,\n RunOptions,\n RunResult,\n} from \"./types.js\";\n\n// ============================================================================\n// Guardrail Helpers\n// ============================================================================\n\n/**\n * Normalize a bare guardrail function or a {@link NamedGuardrail} into a consistent\n * {@link NamedGuardrail} shape. Bare functions are wrapped with a generated name\n * and `critical: true` by default.\n *\n * @param guardrail - A guardrail function or named guardrail object.\n * @param index - Positional index used to generate a unique name for bare functions.\n * @param type - Guardrail category label (e.g. `\"input\"`, `\"output\"`) included in the generated name.\n * @returns A {@link NamedGuardrail} with a guaranteed `name`, `fn`, and `critical` flag.\n */\nexport function normalizeGuardrail<T>(\n guardrail: GuardrailFn<T> | NamedGuardrail<T>,\n index: number,\n type: string,\n): NamedGuardrail<T> {\n if (typeof guardrail === \"function\") {\n return {\n name: `${type}-guardrail-${index}`,\n fn: guardrail,\n critical: true,\n };\n }\n\n return guardrail;\n}\n\n/**\n * Calculate the delay in milliseconds before the next guardrail retry attempt.\n * Supports exponential, linear, and fixed backoff strategies.\n *\n * @param attempt - The just-completed attempt number (1-based).\n * @param config - Retry configuration controlling backoff strategy and delay bounds.\n * @returns Delay in milliseconds, clamped to {@link GuardrailRetryConfig.maxDelayMs}.\n */\nexport function calculateRetryDelay(\n attempt: number,\n config: GuardrailRetryConfig,\n): number {\n const {\n backoff = \"exponential\",\n baseDelayMs = 100,\n maxDelayMs = 5000,\n } = config;\n let delay: number;\n switch (backoff) {\n case \"exponential\":\n delay = baseDelayMs * 2 ** (attempt - 1);\n break;\n case \"linear\":\n delay = baseDelayMs * attempt;\n break;\n default:\n delay = baseDelayMs;\n }\n\n return Math.min(delay, maxDelayMs);\n}\n\n/** Sleep that respects an abort signal — resolves early if aborted */\nfunction abortableDelay(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) {\n return Promise.reject(signal.reason ?? new Error(\"Aborted\"));\n }\n\n return new Promise<void>((resolve, reject) => {\n if (!signal) {\n setTimeout(resolve, ms);\n\n return;\n }\n\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal.reason ?? new Error(\"Aborted\"));\n };\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/**\n * Execute a guardrail function, retrying on thrown errors up to the configured\n * number of attempts. Delays between retries respect the guardrail's\n * {@link GuardrailRetryConfig} and can be cancelled via an {@link AbortSignal}.\n *\n * @remarks\n * When all retries are exhausted the function returns a structured\n * `{ passed: false }` result rather than re-throwing, so callers can classify\n * the failure as a guardrail rejection instead of an unhandled error.\n *\n * @param guardrail - The named guardrail to execute (includes retry config).\n * @param data - The guardrail input data (input text, output value, or tool call).\n * @param context - Shared guardrail context providing access to system facts.\n * @param signal - Optional abort signal to cancel pending retry delays.\n * @returns The guardrail result from a successful attempt, or a failure result after all retries.\n */\nexport async function executeGuardrailWithRetry<T>(\n guardrail: NamedGuardrail<T>,\n data: T,\n context: GuardrailContext,\n signal?: AbortSignal,\n): Promise<GuardrailResult> {\n const { retry } = guardrail;\n const maxAttempts = Math.max(retry?.attempts ?? 1, 1);\n\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await guardrail.fn(data, context);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n // Only retry if we have more attempts left\n if (attempt < maxAttempts) {\n const delay = calculateRetryDelay(attempt, retry ?? {});\n await abortableDelay(delay, signal);\n }\n }\n }\n\n // All retries exhausted — return structured failure instead of raw throw\n // so callers can classify this as a guardrail failure, not an unhandled error\n return {\n passed: false,\n reason: `Guardrail \"${guardrail.name}\" failed after ${maxAttempts} attempt(s): ${lastError!.message}`,\n };\n}\n\n// ============================================================================\n// Agent Retry Helpers\n// ============================================================================\n\n/**\n * Calculate the delay in milliseconds before the next agent-level retry attempt.\n * Supports exponential, linear, and fixed backoff strategies.\n *\n * @param attempt - The just-completed attempt number (1-based).\n * @param config - Retry configuration controlling backoff strategy and delay bounds.\n * @returns Delay in milliseconds, clamped to {@link AgentRetryConfig.maxDelayMs}.\n */\nexport function calculateAgentRetryDelay(\n attempt: number,\n config: AgentRetryConfig,\n): number {\n const {\n backoff = \"exponential\",\n baseDelayMs = 1000,\n maxDelayMs = 30000,\n } = config;\n let delay: number;\n switch (backoff) {\n case \"exponential\":\n delay = baseDelayMs * 2 ** (attempt - 1);\n break;\n case \"linear\":\n delay = baseDelayMs * attempt;\n break;\n default:\n delay = baseDelayMs;\n }\n\n return Math.min(delay, maxDelayMs);\n}\n\n/**\n * Execute an agent run via the provided {@link AgentRunner}, retrying on errors up to\n * the configured number of attempts. The optional `isRetryable` predicate and `onRetry`\n * callback in the retry config control which errors are retried and provide observability.\n *\n * @remarks\n * Unlike {@link executeGuardrailWithRetry}, this function re-throws the last error\n * when all retries are exhausted, since agent failures are not structured guardrail\n * rejections.\n *\n * @param runner - The agent runner function that performs the LLM call.\n * @param agent - The agent definition passed through to the runner.\n * @param input - The user input string for the agent run.\n * @param options - Optional run options including abort signal and message callbacks.\n * @param retryConfig - Optional retry configuration (attempts, backoff, predicates).\n * @returns The successful run result from the first passing attempt.\n * @throws The last error encountered when all retry attempts are exhausted.\n */\nexport async function executeAgentWithRetry<T>(\n runner: AgentRunner,\n agent: AgentLike,\n input: string,\n options: RunOptions | undefined,\n retryConfig: AgentRetryConfig | undefined,\n): Promise<RunResult<T>> {\n const maxAttempts = Math.max(retryConfig?.attempts ?? 1, 1);\n const isRetryable = retryConfig?.isRetryable ?? (() => true);\n const onRetry = retryConfig?.onRetry;\n\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await runner<T>(agent, input, options);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Check if error is retryable and we have more attempts\n if (attempt < maxAttempts) {\n let retryable = true;\n try {\n retryable = isRetryable(lastError);\n } catch {\n // If isRetryable itself throws, treat as non-retryable\n break;\n }\n if (!retryable) {\n break;\n }\n const delay = calculateAgentRetryDelay(attempt, retryConfig ?? {});\n try {\n onRetry?.(attempt, lastError, delay);\n } catch {\n // onRetry is best-effort — don't let callback errors disrupt retry logic\n }\n await abortableDelay(delay, options?.signal);\n } else {\n // Out of attempts\n break;\n }\n }\n }\n // All retries exhausted, throw the last error\n throw lastError!;\n}\n","/**\n * Shared bridge accessors and constraint/resolver converters.\n *\n * Used by both `agent-orchestrator.ts` (single-agent) and `multi-agent-orchestrator.ts` (multi-agent)\n * to read/write the bridge schema facts (agent state, approval, conversation,\n * tool calls) and convert user-facing OrchestratorConstraint/OrchestratorResolver\n * types into the Directive core format.\n *\n * Extracted to prevent drift between the two orchestrator implementations.\n * Internal module — not a public subpath export.\n *\n * @module\n */\n\nimport type { Requirement } from \"@directive-run/core\";\nimport {\n getBridgeFact,\n setBridgeFact,\n} from \"@directive-run/core/adapter-utils\";\n\nimport type {\n AgentHealthState,\n AgentLike,\n AgentState,\n ApprovalState,\n BreakpointState,\n Message,\n OrchestratorConstraint,\n OrchestratorResolver,\n OrchestratorResolverContext,\n OrchestratorState,\n RunOptions,\n RunResult,\n ToolCall,\n} from \"./types.js\";\n\nimport {\n AGENT_KEY,\n APPROVAL_KEY,\n BREAKPOINT_KEY,\n CONVERSATION_KEY,\n HEALTH_KEY,\n TOOL_CALLS_KEY,\n} from \"./types.js\";\n\n// ============================================================================\n// Bridge Accessors\n// ============================================================================\n\n/** @internal Read the agent state from bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getAgentState(facts: any): AgentState {\n return getBridgeFact<AgentState>(facts, AGENT_KEY);\n}\n\n/** @internal Write the agent state to bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function setAgentState(facts: any, state: AgentState): void {\n setBridgeFact(facts, AGENT_KEY, state);\n}\n\n/** @internal Read the approval state from bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getApprovalState(facts: any): ApprovalState {\n return getBridgeFact<ApprovalState>(facts, APPROVAL_KEY);\n}\n\n/** @internal Write the approval state to bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function setApprovalState(facts: any, state: ApprovalState): void {\n setBridgeFact(facts, APPROVAL_KEY, state);\n}\n\n/** @internal Read the conversation messages from bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getConversation(facts: any): Message[] {\n return getBridgeFact<Message[]>(facts, CONVERSATION_KEY);\n}\n\n/** @internal Write conversation messages to bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function setConversation(facts: any, messages: Message[]): void {\n setBridgeFact(facts, CONVERSATION_KEY, messages);\n}\n\n/** @internal Read the tool calls from bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getToolCalls(facts: any): ToolCall[] {\n return getBridgeFact<ToolCall[]>(facts, TOOL_CALLS_KEY);\n}\n\n/** @internal Write tool calls to bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function setToolCalls(facts: any, toolCalls: ToolCall[]): void {\n setBridgeFact(facts, TOOL_CALLS_KEY, toolCalls);\n}\n\n/** @internal Read the health state map from bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getHealthState(facts: any): Record<string, AgentHealthState> {\n return getBridgeFact<Record<string, AgentHealthState>>(facts, HEALTH_KEY);\n}\n\n/** @internal Write the health state map to bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function setHealthState(\n facts: any,\n state: Record<string, AgentHealthState>,\n): void {\n setBridgeFact(facts, HEALTH_KEY, state);\n}\n\n/** @internal Read the breakpoint state from bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getBreakpointState(facts: any): BreakpointState {\n return getBridgeFact<BreakpointState>(facts, BREAKPOINT_KEY);\n}\n\n/** @internal Write the breakpoint state to bridge facts. */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function setBreakpointState(facts: any, state: BreakpointState): void {\n setBridgeFact(facts, BREAKPOINT_KEY, state);\n}\n\n/** Get full orchestrator state from facts */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getOrchestratorState(facts: any): OrchestratorState {\n return {\n agent: getAgentState(facts),\n approval: getApprovalState(facts),\n conversation: getConversation(facts),\n toolCalls: getToolCalls(facts),\n };\n}\n\n// ============================================================================\n// Constraint/Resolver Converters\n// ============================================================================\n\n/** Convert user-facing OrchestratorConstraint objects into Directive core constraint format */\n// biome-ignore lint/suspicious/noExplicitAny: Constraint types are complex\nexport function convertOrchestratorConstraints<\n F extends Record<string, unknown>,\n>(constraints: Record<string, OrchestratorConstraint<F>>): Record<string, any> {\n // biome-ignore lint/suspicious/noExplicitAny: Result type is complex\n const result: Record<string, any> = Object.create(null);\n\n for (const [id, constraint] of Object.entries(constraints)) {\n result[id] = {\n priority: constraint.priority ?? 0,\n // biome-ignore lint/suspicious/noExplicitAny: Facts type varies\n when: (facts: any) => {\n const state = getOrchestratorState(facts);\n const combinedFacts = { ...facts, ...state } as unknown as F &\n OrchestratorState;\n\n return constraint.when(combinedFacts);\n },\n // biome-ignore lint/suspicious/noExplicitAny: Facts type varies\n require: (facts: any) => {\n const state = getOrchestratorState(facts);\n const combinedFacts = { ...facts, ...state } as unknown as F &\n OrchestratorState;\n\n return typeof constraint.require === \"function\"\n ? constraint.require(combinedFacts)\n : constraint.require;\n },\n };\n }\n\n return result;\n}\n\n/** Convert user-facing OrchestratorResolver objects into Directive core resolver format */\n// biome-ignore lint/suspicious/noExplicitAny: Resolver types are complex\nexport function convertOrchestratorResolvers<F extends Record<string, unknown>>(\n resolvers: Record<string, OrchestratorResolver<F, Requirement>>,\n runAgentWithGuardrails: <T>(\n agent: AgentLike,\n input: string,\n currentFacts: F & OrchestratorState,\n opts?: RunOptions,\n ) => Promise<RunResult<T>>,\n // biome-ignore lint/suspicious/noExplicitAny: Facts getter type varies\n getSystemFacts: () => any,\n): Record<string, any> {\n // biome-ignore lint/suspicious/noExplicitAny: Result type is complex\n const result: Record<string, any> = Object.create(null);\n\n for (const [id, resolver] of Object.entries(resolvers)) {\n result[id] = {\n requirement: resolver.requirement,\n key: resolver.key,\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async (req: Requirement, context: any) => {\n const state = getOrchestratorState(context.facts);\n const combinedFacts = { ...context.facts, ...state } as unknown as F &\n OrchestratorState;\n\n const orchestratorContext: OrchestratorResolverContext<F> = {\n facts: combinedFacts,\n runAgent: async <T>(\n agent: AgentLike,\n input: string,\n opts?: RunOptions,\n ) => {\n return runAgentWithGuardrails<T>(\n agent,\n input,\n getOrchestratorState(getSystemFacts()) as unknown as F &\n OrchestratorState,\n opts,\n );\n },\n signal: context.signal,\n };\n await resolver.resolve(req, orchestratorContext);\n },\n };\n }\n\n return result;\n}\n","/**\n * Human-in-the-Loop Breakpoints — Pause/inspect/modify/resume at arbitrary execution points.\n *\n * Separate from approvals (which are safety gates for tool calls). Breakpoints are\n * general-purpose pause points for debugging, inspection, and input modification.\n *\n * Zero overhead when breakpoints array is empty — guard at each insertion point.\n *\n * @module\n */\n\nimport {\n getBridgeFact,\n setBridgeFact,\n} from \"@directive-run/core/adapter-utils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Breakpoint types for single-agent orchestrator */\nexport type BreakpointType =\n | \"pre_input_guardrails\"\n | \"pre_agent_run\"\n | \"pre_output_guardrails\"\n | \"post_run\";\n\n/** Extended breakpoint types for multi-agent orchestrator */\nexport type MultiAgentBreakpointType =\n | BreakpointType\n | \"pre_handoff\"\n | \"pre_pattern_step\";\n\n/** Breakpoint configuration */\nexport interface BreakpointConfig<T extends string = BreakpointType> {\n type: T;\n when?: (context: BreakpointContext) => boolean;\n label?: string;\n}\n\n/** Context available when a breakpoint fires */\nexport interface BreakpointContext {\n agentId: string;\n agentName: string;\n input: string;\n state: Record<string, unknown>;\n breakpointType: string;\n patternId?: string;\n handoff?: { fromAgent: string; toAgent: string };\n}\n\n/** A pending breakpoint request */\nexport interface BreakpointRequest {\n id: string;\n type: string;\n agentId: string;\n input: string;\n label?: string;\n requestedAt: number;\n}\n\n/** Modifications that can be applied when resuming a breakpoint */\nexport interface BreakpointModifications {\n input?: string;\n skip?: boolean;\n}\n\n/** Breakpoint state stored in facts */\nexport interface BreakpointState {\n pending: BreakpointRequest[];\n resolved: string[];\n cancelled: string[];\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n// Import from types.ts — single source of truth\nimport { BREAKPOINT_KEY } from \"./types.js\";\nexport { BREAKPOINT_KEY };\n\n/** Maximum number of resolved/cancelled breakpoint IDs to retain (FIFO eviction) */\nexport const MAX_BREAKPOINT_HISTORY = 200;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nlet breakpointCounter = 0;\n\n/** Create a unique breakpoint ID */\nexport function createBreakpointId(): string {\n return `bp_${Date.now().toString(36)}_${(++breakpointCounter).toString(36)}`;\n}\n\n/**\n * Match a breakpoint configuration against the current execution point.\n * Returns the matching config or null if no match.\n */\nexport function matchBreakpoint<T extends string>(\n breakpoints: BreakpointConfig<T>[],\n type: T,\n context: BreakpointContext,\n): BreakpointConfig<T> | null {\n for (const bp of breakpoints) {\n if (bp.type !== type) {\n continue;\n }\n\n // If no condition, always match\n if (!bp.when) {\n return bp;\n }\n\n // Evaluate condition (catch errors — user-provided predicate)\n try {\n if (bp.when(context)) {\n return bp;\n }\n } catch {\n // Predicate error — skip this breakpoint\n }\n }\n\n return null;\n}\n\n/** Get breakpoint state from facts */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function getBreakpointState(facts: any): BreakpointState {\n return getBridgeFact<BreakpointState>(facts, BREAKPOINT_KEY);\n}\n\n/** Set breakpoint state in facts */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nexport function setBreakpointState(facts: any, state: BreakpointState): void {\n setBridgeFact(facts, BREAKPOINT_KEY, state);\n}\n\n/** Create initial breakpoint state */\nexport function createInitialBreakpointState(): BreakpointState {\n return {\n pending: [],\n resolved: [],\n cancelled: [],\n };\n}\n","/**\n * Persistent Checkpointing — Serialize/restore full orchestrator state.\n *\n * Enables long-running workflows, process restarts, and fork-and-replay by\n * capturing a complete snapshot of orchestrator state at rest.\n *\n * @module\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Checkpoint local state for single-agent orchestrators */\nexport interface SingleAgentCheckpointLocalState {\n type: \"single\";\n}\n\n/** Checkpoint local state for multi-agent orchestrators */\nexport interface MultiAgentCheckpointLocalState {\n type: \"multi\";\n globalTokenCount: number;\n globalStatus: \"idle\" | \"paused\";\n agentStates: Record<\n string,\n {\n status: \"idle\" | \"running\" | \"completed\" | \"error\";\n lastInput?: string;\n lastOutput?: unknown;\n lastError?: string;\n runCount: number;\n totalTokens: number;\n }\n >;\n handoffCounter: number;\n pendingHandoffs: unknown[];\n handoffResults: unknown[];\n roundRobinCounters: Record<string, number> | null;\n /** Serialized task states (task run functions are closures, not serializable) */\n taskStates?: Record<string, { lastOutput?: string; lastError?: string }>;\n}\n\n/** Union of local state types */\nexport type CheckpointLocalState =\n | SingleAgentCheckpointLocalState\n | MultiAgentCheckpointLocalState;\n\n/** Full checkpoint data */\nexport interface Checkpoint {\n version: 1;\n id: string;\n createdAt: string;\n label?: string;\n systemExport: string;\n timelineExport: string | null;\n localState: CheckpointLocalState;\n memoryExport: unknown | null;\n orchestratorType: \"single\" | \"multi\";\n /** Associated time-travel snapshot ID */\n snapshotId?: number;\n /** Arbitrary metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Checkpoint store interface */\nexport interface CheckpointStore {\n save(checkpoint: Checkpoint): Promise<string>;\n load(checkpointId: string): Promise<Checkpoint | null>;\n list(): Promise<Array<{ id: string; label?: string; createdAt: string }>>;\n delete(checkpointId: string): Promise<boolean>;\n clear(): Promise<void>;\n /** Prune old checkpoints based on retention policy. Returns number pruned. */\n prune(): Promise<number>;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst BLOCKED_KEYS = new Set([\n \"__proto__\",\n \"constructor\",\n \"prototype\",\n \"toString\",\n \"valueOf\",\n \"hasOwnProperty\",\n]);\n\n/** Create a unique checkpoint ID */\nexport function createCheckpointId(): string {\n const timestamp = Date.now().toString(36);\n const random = crypto.randomUUID().slice(0, 8);\n\n return `ckpt_${timestamp}_${random}`;\n}\n\n/** Validate that an unknown value is a valid Checkpoint */\nexport function validateCheckpoint(data: unknown): data is Checkpoint {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n // Prototype pollution defense\n for (const key of Object.keys(data)) {\n if (BLOCKED_KEYS.has(key)) {\n return false;\n }\n }\n\n const obj = data as Record<string, unknown>;\n\n if (obj.version !== 1) {\n return false;\n }\n\n if (typeof obj.id !== \"string\" || obj.id.length === 0) {\n return false;\n }\n\n if (typeof obj.createdAt !== \"string\") {\n return false;\n }\n\n if (typeof obj.systemExport !== \"string\") {\n return false;\n }\n\n if (obj.timelineExport !== null && typeof obj.timelineExport !== \"string\") {\n return false;\n }\n\n if (!obj.localState || typeof obj.localState !== \"object\") {\n return false;\n }\n\n // Validate localState prototype pollution\n for (const key of Object.keys(obj.localState)) {\n if (BLOCKED_KEYS.has(key)) {\n return false;\n }\n }\n\n const localState = obj.localState as Record<string, unknown>;\n if (localState.type !== \"single\" && localState.type !== \"multi\") {\n return false;\n }\n\n if (obj.orchestratorType !== \"single\" && obj.orchestratorType !== \"multi\") {\n return false;\n }\n\n return true;\n}\n\n// ============================================================================\n// InMemoryCheckpointStore\n// ============================================================================\n\n/** Options for InMemoryCheckpointStore */\nexport interface InMemoryCheckpointStoreOptions {\n /** Maximum checkpoints to retain before FIFO eviction. @default 100 */\n maxCheckpoints?: number;\n /** Time-based retention: prune checkpoints older than this (ms). @default Infinity */\n retentionMs?: number;\n /** When true, labeled checkpoints are exempt from auto-prune. @default false */\n preserveLabeled?: boolean;\n}\n\n/**\n * In-memory checkpoint store with FIFO eviction and time-based retention.\n *\n * @example\n * ```typescript\n * const store = new InMemoryCheckpointStore({\n * maxCheckpoints: 50,\n * retentionMs: 3600000, // 1 hour\n * preserveLabeled: true,\n * });\n *\n * const id = await store.save(checkpoint);\n * const pruned = await store.prune();\n * ```\n */\nexport class InMemoryCheckpointStore implements CheckpointStore {\n private readonly store = new Map<string, Checkpoint>();\n private readonly order: string[] = [];\n private readonly maxCheckpoints: number;\n private readonly retentionMs: number;\n private readonly preserveLabeled: boolean;\n\n constructor(options?: InMemoryCheckpointStoreOptions) {\n this.maxCheckpoints = options?.maxCheckpoints ?? 100;\n this.retentionMs = options?.retentionMs ?? Number.POSITIVE_INFINITY;\n this.preserveLabeled = options?.preserveLabeled ?? false;\n\n if (!Number.isFinite(this.maxCheckpoints) || this.maxCheckpoints < 1) {\n throw new Error(\n `[Directive Checkpoint] maxCheckpoints must be >= 1, got ${this.maxCheckpoints}`,\n );\n }\n }\n\n async save(checkpoint: Checkpoint): Promise<string> {\n if (!validateCheckpoint(checkpoint)) {\n throw new Error(\"[Directive Checkpoint] Invalid checkpoint data\");\n }\n\n // FIFO eviction (respects preserveLabeled)\n while (this.order.length >= this.maxCheckpoints) {\n const evicted = this.evictOldest();\n if (!evicted) {\n break;\n }\n }\n\n // Deduplicate: remove existing order entry if updating\n const existingIdx = this.order.indexOf(checkpoint.id);\n if (existingIdx >= 0) {\n this.order.splice(existingIdx, 1);\n }\n\n this.store.set(checkpoint.id, checkpoint);\n this.order.push(checkpoint.id);\n\n return checkpoint.id;\n }\n\n async load(checkpointId: string): Promise<Checkpoint | null> {\n return this.store.get(checkpointId) ?? null;\n }\n\n async list(): Promise<\n Array<{ id: string; label?: string; createdAt: string }>\n > {\n return this.order.map((id) => {\n const cp = this.store.get(id)!;\n\n return { id: cp.id, label: cp.label, createdAt: cp.createdAt };\n });\n }\n\n async delete(checkpointId: string): Promise<boolean> {\n if (!this.store.has(checkpointId)) {\n return false;\n }\n\n this.store.delete(checkpointId);\n const index = this.order.indexOf(checkpointId);\n if (index >= 0) {\n this.order.splice(index, 1);\n }\n\n return true;\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n this.order.length = 0;\n }\n\n async prune(): Promise<number> {\n if (!Number.isFinite(this.retentionMs)) {\n return 0;\n }\n\n const cutoff = Date.now() - this.retentionMs;\n let pruned = 0;\n\n // Iterate from oldest to newest\n const toRemove: string[] = [];\n for (const id of this.order) {\n const cp = this.store.get(id);\n if (!cp) {\n continue;\n }\n\n const createdAtMs = new Date(cp.createdAt).getTime();\n if (createdAtMs >= cutoff) {\n break; // Remaining are newer\n }\n\n // Skip labeled checkpoints if preserveLabeled\n if (this.preserveLabeled && cp.label) {\n continue;\n }\n\n toRemove.push(id);\n }\n\n for (const id of toRemove) {\n this.store.delete(id);\n const idx = this.order.indexOf(id);\n if (idx >= 0) {\n this.order.splice(idx, 1);\n }\n pruned++;\n }\n\n return pruned;\n }\n\n /** Evict the oldest non-labeled checkpoint. Returns true if one was evicted. */\n private evictOldest(): boolean {\n if (this.preserveLabeled) {\n // Find first non-labeled checkpoint\n for (let i = 0; i < this.order.length; i++) {\n const id = this.order[i]!;\n const cp = this.store.get(id);\n if (cp && !cp.label) {\n this.order.splice(i, 1);\n this.store.delete(id);\n\n return true;\n }\n }\n\n // All are labeled — evict oldest anyway to make room\n }\n\n const oldest = this.order.shift();\n if (oldest) {\n this.store.delete(oldest);\n\n return true;\n }\n\n return false;\n }\n}\n","/**\n * P6: Structured Outputs — Schema validation with auto-retry for LLM responses.\n *\n * Turns unreliable text output into typed, validated data. Appends JSON schema\n * instructions to the system prompt and retries with error feedback on parse failure.\n *\n * Works with any Zod-compatible schema (any object with a `safeParse` method).\n *\n * @module\n *\n * @example\n * ```typescript\n * import { z } from \"zod\";\n * import { withStructuredOutput, StructuredOutputError } from '@directive-run/ai';\n *\n * const SentimentSchema = z.object({\n * sentiment: z.enum([\"positive\", \"negative\", \"neutral\"]),\n * confidence: z.number().min(0).max(1),\n * });\n *\n * const runner = withStructuredOutput(baseRunner, {\n * schema: SentimentSchema,\n * maxRetries: 2,\n * });\n *\n * const result = await runner(agent, \"Analyze: I love this product!\");\n * // result.output is typed as { sentiment: string; confidence: number }\n * ```\n */\n\nimport type { AgentLike, AgentRunner, RunOptions, RunResult } from \"./types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Zod-compatible schema duck type — any object with a `safeParse` method.\n *\n * This interface allows structured outputs to work with Zod, Valibot,\n * or any validation library that implements this pattern.\n *\n * @example\n * ```typescript\n * import { z } from \"zod\";\n *\n * // Zod schemas implement SafeParseable automatically\n * const schema = z.object({ name: z.string() });\n *\n * // Custom schema\n * const custom: SafeParseable<{ name: string }> = {\n * safeParse(value) {\n * if (typeof value === \"object\" && value && \"name\" in value) {\n * return { success: true, data: value as { name: string } };\n * }\n * return { success: false, error: { message: \"Missing name field\" } };\n * },\n * };\n * ```\n */\nexport interface SafeParseable<T = unknown> {\n safeParse(value: unknown): SafeParseResult<T>;\n /** Optional: schema description injected into the system prompt. */\n description?: string;\n}\n\nexport interface SafeParseResult<T> {\n success: boolean;\n data?: T;\n error?: { message?: string; issues?: Array<{ message: string }> };\n}\n\nexport interface StructuredOutputConfig<T = unknown> {\n /** Zod-compatible schema with safeParse. */\n schema: SafeParseable<T>;\n /** Max retries on parse/validation failure. @default 2 */\n maxRetries?: number;\n /** Custom JSON extractor. Default: finds first `{...}` or `[...]` in output. */\n extractJson?: (output: string) => unknown;\n /** Schema description to inject into system prompt. Auto-derived from schema.description if available. */\n schemaDescription?: string;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Maximum output length to process (1MB). */\nconst MAX_EXTRACT_LENGTH = 1_048_576;\n\n/** Default JSON extractor — finds the first `{...}` or `[...]` in output. */\nexport function extractJsonFromOutput(output: string): unknown {\n if (output.length > MAX_EXTRACT_LENGTH) {\n throw new Error(\n `[Directive] Output too large for JSON extraction (${output.length} chars, max ${MAX_EXTRACT_LENGTH}).`,\n );\n }\n\n const trimmed = output.trim();\n\n // Try direct parse first\n try {\n return JSON.parse(trimmed);\n } catch {\n // Continue to extraction\n }\n\n // Try to find JSON object or array\n const objectStart = trimmed.indexOf(\"{\");\n const arrayStart = trimmed.indexOf(\"[\");\n\n let start: number;\n let openChar: string;\n let closeChar: string;\n\n if (objectStart === -1 && arrayStart === -1) {\n throw new Error(\"[Directive] No JSON object or array found in output\");\n }\n\n if (objectStart === -1) {\n start = arrayStart;\n openChar = \"[\";\n closeChar = \"]\";\n } else if (arrayStart === -1) {\n start = objectStart;\n openChar = \"{\";\n closeChar = \"}\";\n } else {\n start = Math.min(objectStart, arrayStart);\n openChar = start === objectStart ? \"{\" : \"[\";\n closeChar = start === objectStart ? \"}\" : \"]\";\n }\n\n // Find matching closing bracket\n let depth = 0;\n let inString = false;\n let escaped = false;\n\n for (let i = start; i < trimmed.length; i++) {\n const char = trimmed[i]!;\n\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (inString) {\n continue;\n }\n\n if (char === openChar) {\n depth++;\n } else if (char === closeChar) {\n depth--;\n if (depth === 0) {\n const jsonStr = trimmed.slice(start, i + 1);\n\n try {\n return JSON.parse(jsonStr);\n } catch {\n // LLMs emit literal newlines inside JSON string values — escape them\n const sanitized = jsonStr.replace(/\"(?:[^\"\\\\]|\\\\.)*\"/g, (match) =>\n match\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\"),\n );\n\n return JSON.parse(sanitized);\n }\n }\n }\n }\n\n throw new Error(\"[Directive] No valid JSON found in output\");\n}\n\n/** Format validation errors for feedback. */\nfunction formatValidationError(\n error: SafeParseResult<unknown>[\"error\"],\n): string {\n if (!error) {\n return \"Validation failed\";\n }\n\n if (error.issues && error.issues.length > 0) {\n return error.issues.map((issue) => issue.message).join(\"; \");\n }\n\n return error.message ?? \"Validation failed\";\n}\n\n// ============================================================================\n// Wrapper\n// ============================================================================\n\n/**\n * Wrap an AgentRunner with structured output parsing and validation.\n *\n * @example\n * ```typescript\n * import { z } from \"zod\";\n *\n * const SentimentSchema = z.object({\n * sentiment: z.enum([\"positive\", \"negative\", \"neutral\"]),\n * confidence: z.number().min(0).max(1),\n * });\n *\n * const runner = withStructuredOutput(baseRunner, {\n * schema: SentimentSchema,\n * maxRetries: 2,\n * });\n *\n * const result = await runner(agent, \"Analyze: I love this product!\");\n * // result.output is typed as { sentiment: string; confidence: number }\n * ```\n */\nexport function withStructuredOutput<T = unknown>(\n runner: AgentRunner,\n config: StructuredOutputConfig<T>,\n): AgentRunner {\n const {\n schema,\n maxRetries = 2,\n extractJson = extractJsonFromOutput,\n schemaDescription,\n } = config;\n\n // Validate config\n if (!Number.isFinite(maxRetries) || maxRetries < 0) {\n throw new Error(\n \"[Directive] withStructuredOutput: maxRetries must be a non-negative finite number.\",\n );\n }\n\n const schemaPrompt =\n schemaDescription ?? schema.description ?? \"the specified JSON schema\";\n\n // The returned runner produces `T` from the schema. We cast at the\n // boundary to satisfy the `AgentRunner` generic while keeping output type-safe.\n return async <_T = unknown>(\n agent: AgentLike,\n input: string,\n options?: RunOptions,\n ): Promise<RunResult<_T>> => {\n // Append JSON instruction to agent's system prompt\n const structuredAgent: AgentLike = {\n ...agent,\n instructions:\n (agent.instructions ?? \"\") +\n \"\\n\\nIMPORTANT: Respond with valid JSON matching \" +\n schemaPrompt +\n \". \" +\n \"Output ONLY the JSON object, no additional text or markdown formatting.\",\n };\n\n let lastResult: RunResult<unknown> | undefined;\n let lastError: string | undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n // On retries, append error feedback as additional input\n const effectiveInput =\n attempt === 0\n ? input\n : `${input}\\n\\nYour previous response was not valid JSON. Error: ${lastError}\\nPlease try again with valid JSON only.`;\n\n const result = await runner(structuredAgent, effectiveInput, options);\n lastResult = result;\n\n // Try to extract and validate JSON\n const outputStr =\n typeof result.output === \"string\"\n ? result.output\n : JSON.stringify(result.output);\n\n try {\n const extracted = extractJson(outputStr);\n const parsed = schema.safeParse(extracted);\n\n if (parsed.success) {\n return {\n ...result,\n output: parsed.data as _T,\n };\n }\n\n lastError = formatValidationError(parsed.error);\n } catch (err) {\n lastError = err instanceof Error ? err.message : String(err);\n }\n }\n\n // All retries exhausted — throw with context\n throw new StructuredOutputError(\n `[Directive] Failed to get valid structured output after ${maxRetries + 1} attempts: ${lastError}`,\n lastResult,\n );\n };\n}\n\n/** Error thrown when structured output parsing fails after all retries. */\nexport class StructuredOutputError extends Error {\n readonly lastResult: RunResult<unknown> | undefined;\n\n constructor(message: string, lastResult?: RunResult<unknown>) {\n super(message);\n this.name = \"StructuredOutputError\";\n this.lastResult = lastResult;\n }\n}\n","/**\n * Agent Orchestrator — constraint-driven agent execution with guardrails.\n *\n * Single-agent orchestrator backed by a Directive System with reactive state,\n * constraints, guardrails, streaming, approval workflow, and lifecycle hooks.\n */\n\nimport type {\n ModuleSchema,\n Plugin,\n Requirement,\n SingleModuleSystem,\n System,\n} from \"@directive-run/core\";\nimport { createModule, t } from \"@directive-run/core\";\nimport { createSystem } from \"@directive-run/core\";\nimport {\n createCallbackPlugin,\n getBridgeFact,\n requirementGuard,\n setBridgeFact,\n} from \"@directive-run/core/adapter-utils\";\nimport type { CircuitBreaker } from \"@directive-run/core/plugins\";\nimport type { AgentMemory } from \"./memory.js\";\nimport type { StreamChunk as StreamChunkBase } from \"./streaming.js\";\n\nimport type {\n AgentLike,\n AgentRetryConfig,\n AgentRunner,\n ApprovalRequest,\n GuardrailFn,\n GuardrailsConfig,\n InputGuardrailData,\n NamedGuardrail,\n OrchestratorConstraint,\n OrchestratorLifecycleHooks,\n OrchestratorResolver,\n OrchestratorState,\n OutputGuardrailData,\n RejectedRequest,\n RerouteEvent,\n RunOptions,\n RunResult,\n SelfHealingConfig,\n} from \"./types.js\";\n\nimport {\n APPROVAL_KEY,\n BREAKPOINT_KEY,\n GuardrailError,\n orchestratorBridgeSchema,\n} from \"./types.js\";\n\nimport {\n type DebugTimeline,\n createDebugTimeline,\n createDebugTimelinePlugin,\n} from \"./debug-timeline.js\";\n\nimport {\n executeAgentWithRetry,\n executeGuardrailWithRetry,\n normalizeGuardrail,\n} from \"./guardrail-utils.js\";\n\nimport {\n convertOrchestratorConstraints,\n convertOrchestratorResolvers,\n getAgentState,\n getApprovalState,\n getBreakpointState,\n getConversation,\n getOrchestratorState,\n getToolCalls,\n setAgentState,\n setApprovalState,\n setBreakpointState,\n setConversation,\n setToolCalls,\n} from \"./orchestrator-bridge.js\";\n\nimport type {\n BreakpointConfig,\n BreakpointContext,\n BreakpointModifications,\n BreakpointRequest,\n} from \"./breakpoints.js\";\nimport {\n MAX_BREAKPOINT_HISTORY,\n createBreakpointId,\n matchBreakpoint,\n} from \"./breakpoints.js\";\nimport {\n type Checkpoint,\n type CheckpointStore,\n createCheckpointId,\n validateCheckpoint,\n} from \"./checkpoint.js\";\nimport {\n type SafeParseable,\n withStructuredOutput,\n} from \"./structured-output.js\";\n\n// Bridge accessors and constraint/resolver converters imported from orchestrator-bridge.ts\n\n/** Maximum conversation messages retained (FIFO eviction) */\nconst MAX_CONVERSATION_MESSAGES = 500;\n/** Maximum tool calls retained (FIFO eviction) */\nconst MAX_TOOL_CALLS = 200;\n\n/** Built-in pause requirement type */\ninterface PauseBudgetExceededReq extends Requirement {\n type: \"__PAUSE_BUDGET_EXCEEDED\";\n}\n\n// ============================================================================\n// Exported Types\n// ============================================================================\n\n/** Orchestrator options */\nexport interface OrchestratorOptions<F extends Record<string, unknown>> {\n /** Function to run an agent */\n runner: AgentRunner;\n /**\n * Schema for custom facts tracked in the orchestrator's Directive System.\n * @example\n * ```typescript\n * import { t } from '@directive-run/core';\n * const orchestrator = createOrchestrator({\n * factsSchema: { confidence: t.number(), category: t.string() },\n * // ...\n * });\n * ```\n */\n factsSchema?: Record<string, { _type: unknown; _validators: [] }>;\n /** Initialize additional facts */\n init?: (facts: F & OrchestratorState) => void;\n /** Constraints for orchestration */\n constraints?: Record<string, OrchestratorConstraint<F>>;\n /** Resolvers for orchestration */\n resolvers?: Record<string, OrchestratorResolver<F, Requirement>>;\n /** Guardrails */\n guardrails?: GuardrailsConfig;\n /** Callback for approval requests */\n onApprovalRequest?: (request: ApprovalRequest) => void;\n /**\n * Auto-approve tool calls\n * @default true\n */\n autoApproveToolCalls?: boolean;\n /**\n * Maximum token budget across all agent runs.\n *\n * When exceeded, agents are automatically paused with status \"paused\".\n * Check `facts.agent.tokenUsage` to see current usage.\n *\n * For more sophisticated cost management (per-user budgets, tiered pricing,\n * cost alerts), see the Cost Management section in the documentation.\n *\n * @example\n * ```typescript\n * const orchestrator = createAgentOrchestrator({\n * maxTokenBudget: 10000, // Pause after 10K tokens\n * });\n *\n * // Check if paused due to budget\n * if (orchestrator.facts.agent.status === 'paused') {\n * console.log('Budget exceeded:', orchestrator.facts.agent.tokenUsage);\n * }\n * ```\n */\n maxTokenBudget?: number;\n /** Fires when token usage reaches this percentage of maxTokenBudget (0-1). @default 0.8 */\n budgetWarningThreshold?: number;\n /** Callback when budget warning threshold is reached */\n onBudgetWarning?: (event: {\n currentTokens: number;\n maxBudget: number;\n percentage: number;\n }) => void;\n /** Plugins */\n plugins?: Plugin[];\n /**\n * Enable debugging — `true` for default debug, or config object for advanced options\n * @default false\n */\n debug?: boolean | import(\"./types.js\").OrchestratorDebugConfig;\n /**\n * Approval timeout in milliseconds\n * @default 300000 (5 minutes)\n */\n approvalTimeoutMs?: number;\n /** Retry configuration for agent runs (no retries if not specified) */\n agentRetry?: AgentRetryConfig;\n /** Lifecycle hooks for observability */\n hooks?: OrchestratorLifecycleHooks;\n /**\n * Optional memory instance. When provided, context messages are auto-injected\n * into agent instructions before each run, and result messages are auto-stored.\n */\n memory?: AgentMemory;\n /**\n * Optional circuit breaker. Wraps every run() call.\n * When OPEN, throws CircuitBreakerOpenError instead of calling the agent.\n */\n circuitBreaker?: CircuitBreaker;\n /** Self-healing configuration for automatic fallback */\n selfHealing?: SelfHealingConfig;\n /**\n * Default schema for structured output. When set, agent output is parsed and\n * validated against this schema with automatic retry on failure.\n * Any Zod-compatible schema (anything with `safeParse`) works.\n */\n outputSchema?: SafeParseable<unknown>;\n /**\n * Max retries for structured output parsing.\n * @default 2\n */\n maxSchemaRetries?: number;\n /** Optional checkpoint store for save/restore workflow state. */\n checkpointStore?: CheckpointStore;\n /**\n * Breakpoint configurations for human-in-the-loop pause points.\n * Zero overhead when empty — guard checks at each insertion point.\n */\n breakpoints?: BreakpointConfig[];\n /** Callback fired when a breakpoint is hit and waiting for resolution. */\n onBreakpoint?: (request: BreakpointRequest) => void;\n /**\n * Timeout for breakpoint resolution in milliseconds.\n * @default 300000 (5 minutes)\n */\n breakpointTimeoutMs?: number;\n}\n\n/** Streaming run result from orchestrator */\nexport interface OrchestratorStreamResult<T = unknown> {\n /** Async iterator for streaming chunks */\n stream: AsyncIterable<OrchestratorStreamChunk>;\n /** Promise that resolves to the final result */\n result: Promise<RunResult<T>>;\n /** Abort the stream */\n abort: () => void;\n}\n\n/** Stream chunk types for orchestrator — extends StreamChunk with approval events */\nexport type OrchestratorStreamChunk =\n | StreamChunkBase\n | { type: \"approval_required\"; requestId: string; toolName: string }\n | { type: \"approval_resolved\"; requestId: string; approved: boolean };\n\n/** Per-call options for run() */\nexport interface RunCallOptions {\n /** Override output guardrails for this call only. Set to [] to skip. */\n outputGuardrails?: Array<\n GuardrailFn<OutputGuardrailData> | NamedGuardrail<OutputGuardrailData>\n >;\n /** Override input guardrails for this call only. Set to [] to skip. */\n inputGuardrails?: Array<\n GuardrailFn<InputGuardrailData> | NamedGuardrail<InputGuardrailData>\n >;\n /** Signal for abort */\n signal?: AbortSignal;\n /** Override structured output schema for this call. Set to `null` to opt out. */\n outputSchema?: SafeParseable<unknown> | null;\n /** Override max schema retries for this call. */\n maxSchemaRetries?: number;\n}\n\n/** Orchestrator instance */\nexport interface AgentOrchestrator<F extends Record<string, unknown>> {\n // biome-ignore lint/suspicious/noExplicitAny: System type varies\n system: System<any>;\n facts: F & OrchestratorState;\n /** Run an agent with guardrails. Pass options to override guardrails per-call. */\n run<T>(\n agent: AgentLike,\n input: string,\n options?: RunCallOptions,\n ): Promise<RunResult<T>>;\n /**\n * Run an agent with streaming support.\n * Returns an async iterator for chunks and a promise for the final result.\n *\n * @example\n * ```typescript\n * const { stream, result, abort } = orchestrator.runStream(agent, input);\n *\n * for await (const chunk of stream) {\n * if (chunk.type === 'token') process.stdout.write(chunk.data);\n * if (chunk.type === 'approval_required') showApprovalDialog(chunk);\n * if (chunk.type === 'guardrail_triggered') handleGuardrail(chunk);\n * }\n *\n * const finalResult = await result;\n * ```\n */\n runStream<T>(\n agent: AgentLike,\n input: string,\n options?: { signal?: AbortSignal },\n ): OrchestratorStreamResult<T>;\n /** Approve a pending request */\n approve(requestId: string): void;\n /** Reject a pending request */\n reject(requestId: string, reason?: string): void;\n /** Pause all agents */\n pause(): void;\n /** Resume agents */\n resume(): void;\n /** Reset conversation state */\n reset(): void;\n /** Total tokens consumed across all agent runs */\n readonly totalTokens: number;\n /** Debug timeline (null when debug is false) */\n readonly timeline: DebugTimeline | null;\n /** Wait until agent is idle. Resolves immediately if already idle. */\n waitForIdle(timeoutMs?: number): Promise<void>;\n /** Create a checkpoint of the current orchestrator state. Only valid when agent is not running. */\n checkpoint(options?: { label?: string }): Promise<Checkpoint>;\n /** Restore orchestrator state from a checkpoint. */\n restore(\n checkpoint: Checkpoint,\n options?: { restoreTimeline?: boolean },\n ): void;\n /** Resume a pending breakpoint, optionally with input modifications. */\n resumeBreakpoint(id: string, modifications?: BreakpointModifications): void;\n /** Cancel a pending breakpoint with optional reason. */\n cancelBreakpoint(id: string, reason?: string): void;\n /** Get all currently pending breakpoint requests. */\n getPendingBreakpoints(): BreakpointRequest[];\n /** Dispose of the orchestrator */\n dispose(): void;\n}\n\n// ============================================================================\n// Main Factory\n// ============================================================================\n\n/**\n * Create a constraint-driven agent orchestrator backed by a Directive System.\n *\n * Wraps a single agent runner with reactive state, guardrails, streaming,\n * approval workflows, breakpoints, structured output, and lifecycle hooks.\n * Constraints and resolvers let you declaratively control agent behavior\n * based on runtime facts.\n *\n * @param options - Orchestrator configuration including runner, guardrails, constraints, and plugins.\n * @returns An {@link AgentOrchestrator} instance with `run`, `runStream`, `approve`/`reject`, and checkpoint APIs.\n *\n * @example\n * ```typescript\n * import { run as runner } from '@openai/agents';\n *\n * const orchestrator = createAgentOrchestrator({\n * runner,\n * constraints: {\n * escalateToExpert: {\n * when: (facts) => facts.agent.output?.confidence < 0.7,\n * require: (facts) => ({\n * type: 'RUN_EXPERT_AGENT',\n * query: facts.agent.input,\n * }),\n * },\n * budgetExceeded: {\n * when: (facts) => facts.agent.tokenUsage > 10000,\n * require: { type: 'PAUSE_AGENTS' },\n * },\n * },\n * guardrails: {\n * input: [\n * async (data) => {\n * const hasPII = await detectPII(data.input);\n * return { passed: !hasPII, reason: hasPII ? 'Contains PII' : undefined };\n * },\n * ],\n * output: [\n * async (data) => {\n * const isToxic = await checkToxicity(data.output);\n * return { passed: !isToxic, reason: isToxic ? 'Toxic content' : undefined };\n * },\n * ],\n * },\n * });\n *\n * // Run with guardrails and constraint-driven orchestration\n * const result = await orchestrator.run(myAgent, 'Hello, can you help me?');\n * ```\n *\n * @throws If autoApproveToolCalls is false but no onApprovalRequest callback is provided\n * @public\n */\nexport function createAgentOrchestrator<\n F extends Record<string, unknown> = Record<string, never>,\n>(options: OrchestratorOptions<F>): AgentOrchestrator<F> {\n const {\n runner,\n factsSchema = {},\n init,\n constraints = {},\n resolvers = {},\n guardrails = {},\n onApprovalRequest,\n autoApproveToolCalls = true,\n maxTokenBudget,\n budgetWarningThreshold = 0.8,\n onBudgetWarning,\n plugins = [],\n debug: rawDebug = false,\n approvalTimeoutMs = 300000,\n agentRetry,\n hooks = {},\n memory,\n circuitBreaker,\n selfHealing,\n outputSchema,\n maxSchemaRetries,\n checkpointStore,\n breakpoints,\n onBreakpoint,\n breakpointTimeoutMs,\n } = options;\n\n // Normalize debug config\n const debug = typeof rawDebug === \"object\" ? true : !!rawDebug;\n const MAX_VERBOSE_LENGTH = 5000;\n\n // Warn if selfHealing is configured without circuitBreaker (selfHealing only triggers in CB error path)\n if (debug && selfHealing && !circuitBreaker) {\n console.warn(\n \"[Directive] selfHealing config has no effect without a circuitBreaker — \" +\n \"fallback behavior requires the circuit breaker to detect failures.\",\n );\n }\n\n // Validate budget warning threshold\n if (budgetWarningThreshold < 0 || budgetWarningThreshold > 1) {\n throw new Error(\n `[Directive Orchestrator] budgetWarningThreshold must be between 0 and 1, got ${budgetWarningThreshold}`,\n );\n }\n\n // Enforce approval workflow configuration - require either auto-approve or callback\n if (!autoApproveToolCalls && !onApprovalRequest) {\n throw new Error(\n \"[Directive] Invalid approval configuration: autoApproveToolCalls is false but no onApprovalRequest callback provided. \" +\n \"Tool calls would wait for approval indefinitely. Either:\\n\" +\n \" - Set autoApproveToolCalls: true to auto-approve all tool calls\\n\" +\n \" - Provide an onApprovalRequest callback to handle approvals programmatically\",\n );\n }\n\n /** Safe hook caller — user-provided hooks must never crash the orchestrator */\n function fireHook<K extends keyof OrchestratorLifecycleHooks>(\n name: K,\n event: Parameters<NonNullable<OrchestratorLifecycleHooks[K]>>[0],\n ): void {\n try {\n (hooks[name] as ((e: typeof event) => void) | undefined)?.(event);\n } catch (hookError) {\n if (debug) {\n console.debug(`[Directive] hooks.${name} threw:`, hookError);\n }\n }\n }\n\n // Dev-mode: validate that user-provided facts keys don't collide with bridge state keys\n const RESERVED_ORCHESTRATOR_KEYS = [\n \"agent\",\n \"approval\",\n \"conversation\",\n \"toolCalls\",\n ];\n for (const key of Object.keys(factsSchema)) {\n if (RESERVED_ORCHESTRATOR_KEYS.includes(key)) {\n throw new Error(\n `[Directive] Facts schema key \"${key}\" conflicts with orchestrator state. ` +\n `Reserved keys: ${RESERVED_ORCHESTRATOR_KEYS.join(\", \")}. ` +\n \"Rename your fact to avoid the collision.\",\n );\n }\n }\n\n // Build schema by combining bridge schema with user-provided schema\n const combinedSchema = {\n facts: {\n ...orchestratorBridgeSchema.facts,\n ...factsSchema,\n __budgetWarningFired: t.boolean(),\n },\n derivations: {},\n events: {},\n requirements: {},\n } satisfies ModuleSchema;\n\n // Forward declaration for runAgentWithGuardrails (used in resolver converter)\n // biome-ignore lint/style/useConst: forward declaration, assigned later\n let runAgentWithGuardrailsFn: <T>(\n agent: AgentLike,\n input: string,\n currentFacts: F & OrchestratorState,\n opts?: RunOptions,\n callOptions?: RunCallOptions,\n ) => Promise<RunResult<T>>;\n\n // Forward declaration for system (used in resolver converter)\n // biome-ignore lint/style/useConst: forward declaration, assigned later\n // biome-ignore lint/suspicious/noExplicitAny: System type varies\n let system: SingleModuleSystem<any>;\n\n // Convert user constraints\n // biome-ignore lint/suspicious/noExplicitAny: Constraint types are complex\n const directiveConstraints: Record<string, any> =\n convertOrchestratorConstraints<F>(constraints);\n\n // Add built-in budget limit constraint\n if (maxTokenBudget) {\n directiveConstraints.__budgetLimit = {\n priority: 100, // High priority\n // biome-ignore lint/suspicious/noExplicitAny: Facts type varies\n when: (facts: any) => getAgentState(facts).tokenUsage > maxTokenBudget,\n require: { type: \"__PAUSE_BUDGET_EXCEEDED\" } as PauseBudgetExceededReq,\n };\n }\n\n // Convert user resolvers\n // biome-ignore lint/suspicious/noExplicitAny: Resolver types are complex\n const directiveResolvers: Record<string, any> =\n convertOrchestratorResolvers<F>(\n resolvers,\n (agent, input, currentFacts, opts) =>\n runAgentWithGuardrailsFn(agent, input, currentFacts, opts),\n () => system.facts,\n );\n\n // Add built-in pause resolver\n directiveResolvers.__pause = {\n requirement: requirementGuard<PauseBudgetExceededReq>(\n \"__PAUSE_BUDGET_EXCEEDED\",\n ),\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async (_req: Requirement, context: any) => {\n const currentAgent = getAgentState(context.facts);\n setAgentState(context.facts, {\n ...currentAgent,\n status: \"paused\",\n });\n },\n };\n\n // ---- Debug Timeline setup ----\n let timeline: DebugTimeline | null = null;\n if (debug) {\n timeline = createDebugTimeline({\n getSnapshotId: () => {\n try {\n return (system as any).history?.currentIndex ?? null;\n } catch {\n return null;\n }\n },\n goToSnapshot: (snapshotId: number) => {\n try {\n (system as any).history?.goTo?.(snapshotId);\n } catch {\n // System may not support goTo\n }\n },\n });\n }\n\n // Create callback plugin for onApprovalRequest\n const callbackPlugin = createCallbackPlugin(\n \"directive-ai-callbacks\",\n {}, // No requirement callbacks needed, approval is handled separately\n );\n\n // Create module\n // biome-ignore lint/suspicious/noExplicitAny: Bridge module uses dynamic constraints/resolvers\n const orchestratorModule = createModule(\"directive-ai-orchestrator\", {\n schema: combinedSchema,\n init: (facts) => {\n setAgentState(facts, {\n status: \"idle\",\n currentAgent: null,\n input: null,\n output: null,\n error: null,\n tokenUsage: 0,\n turnCount: 0,\n startedAt: null,\n completedAt: null,\n });\n setApprovalState(facts, {\n pending: [],\n approved: [],\n rejected: [],\n });\n setConversation(facts, []);\n setToolCalls(facts, []);\n setBreakpointState(facts, { pending: [], resolved: [], cancelled: [] });\n setBridgeFact(facts, \"__budgetWarningFired\", false);\n if (init) {\n const state = getOrchestratorState(facts);\n const combinedFacts = { ...facts, ...state } as unknown as F &\n OrchestratorState;\n init(combinedFacts);\n }\n },\n constraints: directiveConstraints,\n resolvers: directiveResolvers as any,\n });\n\n // Build plugins array with optional timeline plugin\n const allPlugins = [...plugins, callbackPlugin];\n if (debug && timeline) {\n allPlugins.push(\n createDebugTimelinePlugin(timeline, () => {\n try {\n return (system as any).history?.currentIndex ?? null;\n } catch {\n return null;\n }\n }),\n );\n }\n\n // Create system\n system = createSystem({\n module: orchestratorModule,\n plugins: allPlugins,\n history: debug ? true : undefined,\n });\n\n system.start();\n\n // Helper to run agent with guardrails\n async function runAgentWithGuardrails<T>(\n agent: AgentLike,\n input: string,\n _currentFacts: F & OrchestratorState,\n opts?: RunOptions,\n callOptions?: RunCallOptions,\n ): Promise<RunResult<T>> {\n // Wrap in circuit breaker if configured\n if (circuitBreaker) {\n try {\n return await circuitBreaker.execute(() =>\n runAgentWithGuardrailsInner<T>(\n agent,\n input,\n _currentFacts,\n opts,\n callOptions,\n ),\n );\n } catch (error) {\n // Self-healing fallback\n if (selfHealing) {\n // Try fallback runners in order\n if (selfHealing.fallbackRunners) {\n for (const fallbackRunner of selfHealing.fallbackRunners) {\n try {\n const rerouteEvent: RerouteEvent = {\n originalAgent: agent.name,\n reroutedTo: \"fallback-runner\",\n reason:\n error instanceof Error ? error.message : String(error),\n timestamp: Date.now(),\n };\n try {\n selfHealing.onReroute?.(rerouteEvent);\n } catch {\n /* non-fatal */\n }\n if (timeline) {\n timeline.record({\n type: \"reroute\",\n timestamp: Date.now(),\n agentId: agent.name,\n snapshotId: null,\n from: agent.name,\n to: \"fallback-runner\",\n reason:\n error instanceof Error ? error.message : String(error),\n });\n }\n\n return await fallbackRunner<T>(agent, input, opts);\n } catch {\n // Try next fallback\n }\n }\n }\n\n // Try fallback agent\n if (selfHealing.fallbackAgent) {\n try {\n const rerouteEvent: RerouteEvent = {\n originalAgent: agent.name,\n reroutedTo: selfHealing.fallbackAgent.name,\n reason: error instanceof Error ? error.message : String(error),\n timestamp: Date.now(),\n };\n try {\n selfHealing.onReroute?.(rerouteEvent);\n } catch {\n /* non-fatal */\n }\n if (timeline) {\n timeline.record({\n type: \"reroute\",\n timestamp: Date.now(),\n agentId: agent.name,\n snapshotId: null,\n from: agent.name,\n to: selfHealing.fallbackAgent.name,\n reason:\n error instanceof Error ? error.message : String(error),\n });\n }\n\n return await runner<T>(selfHealing.fallbackAgent, input, opts);\n } catch {\n // Fallback agent also failed\n }\n }\n\n // Apply degradation policy\n if (\n selfHealing.degradation === \"fallback-response\" &&\n selfHealing.fallbackResponse !== undefined\n ) {\n return {\n output: selfHealing.fallbackResponse as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n }\n throw error;\n }\n }\n\n return runAgentWithGuardrailsInner<T>(\n agent,\n input,\n _currentFacts,\n opts,\n callOptions,\n );\n }\n\n async function runAgentWithGuardrailsInner<T>(\n agent: AgentLike,\n input: string,\n _currentFacts: F & OrchestratorState,\n opts?: RunOptions,\n callOptions?: RunCallOptions,\n ): Promise<RunResult<T>> {\n const startTime = Date.now();\n\n // Inject memory context into agent instructions if memory is configured\n if (memory) {\n const contextMessages = memory.getContextMessages();\n if (contextMessages.length > 0) {\n const contextStr = contextMessages\n .map((m) => `${m.role}: ${m.content}`)\n .join(\"\\n\");\n agent = {\n ...agent,\n instructions:\n (agent.instructions ?? \"\") +\n \"\\n\\nConversation context:\\n\" +\n contextStr,\n };\n }\n }\n\n // Breakpoint: pre_input_guardrails\n if (breakpoints && breakpoints.length > 0) {\n const bpContext: BreakpointContext = {\n agentId: agent.name,\n agentName: agent.name,\n input,\n state: system.facts.$store.toObject(),\n breakpointType: \"pre_input_guardrails\",\n };\n const mods = await handleBreakpoint(\n \"pre_input_guardrails\",\n bpContext,\n callOptions?.signal ?? opts?.signal,\n );\n if (mods?.skip) {\n return {\n output: undefined as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n if (mods?.input) {\n input = mods.input;\n }\n }\n\n // Resolve which guardrails to use: per-call override > orchestrator defaults\n const effectiveInputGuardrails =\n callOptions?.inputGuardrails !== undefined\n ? callOptions.inputGuardrails\n : (guardrails.input ?? []);\n const effectiveOutputGuardrails =\n callOptions?.outputGuardrails !== undefined\n ? callOptions.outputGuardrails\n : (guardrails.output ?? []);\n\n // Run input guardrails BEFORE agent_start so timeline shows correct order\n const inputGuardrailsList = effectiveInputGuardrails.map((g, i) =>\n normalizeGuardrail(g, i, \"input\"),\n );\n for (const guardrail of inputGuardrailsList) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input,\n facts: system.facts.$store.toObject(),\n };\n const guardStartTime = Date.now();\n const result = await executeGuardrailWithRetry(\n guardrail,\n { input, agentName: agent.name },\n context,\n );\n // Call onGuardrailCheck hook\n fireHook(\"onGuardrailCheck\", {\n agentId: agent.name,\n guardrailName: name,\n guardrailType: \"input\",\n passed: result.passed,\n reason: result.reason,\n durationMs: Date.now() - guardStartTime,\n timestamp: Date.now(),\n });\n if (!result.passed) {\n throw new GuardrailError({\n code: \"INPUT_GUARDRAIL_FAILED\",\n message: `Input guardrail \"${name}\" failed: ${result.reason}`,\n guardrailName: name,\n guardrailType: \"input\",\n userMessage: result.reason ?? \"Input validation failed\",\n agentName: agent.name,\n input,\n });\n }\n if (result.transformed !== undefined) {\n input = result.transformed as string;\n }\n }\n\n // Call onAgentStart hook (after guardrails pass)\n fireHook(\"onAgentStart\", {\n agentName: agent.name,\n input,\n timestamp: startTime,\n });\n\n if (timeline) {\n timeline.record({\n type: \"agent_start\",\n timestamp: Date.now(),\n agentId: agent.name,\n snapshotId: null,\n inputLength: input.length,\n modelId: agent.model ?? undefined,\n ...(agent.instructions\n ? { instructions: agent.instructions.slice(0, MAX_VERBOSE_LENGTH) }\n : {}),\n input: input.slice(0, MAX_VERBOSE_LENGTH),\n });\n }\n\n // Update state\n system.batch(() => {\n const currentAgent = getAgentState(system.facts);\n setAgentState(system.facts, {\n ...currentAgent,\n status: \"running\",\n currentAgent: agent.name,\n input,\n startedAt: Date.now(),\n });\n });\n\n // Breakpoint: pre_agent_run\n if (breakpoints && breakpoints.length > 0) {\n const bpContext: BreakpointContext = {\n agentId: agent.name,\n agentName: agent.name,\n input,\n state: system.facts.$store.toObject(),\n breakpointType: \"pre_agent_run\",\n };\n const mods = await handleBreakpoint(\n \"pre_agent_run\",\n bpContext,\n callOptions?.signal ?? opts?.signal,\n );\n if (mods?.skip) {\n return {\n output: undefined as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n if (mods?.input) {\n input = mods.input;\n }\n }\n\n // Structured output wrapping\n const effectiveSchema =\n callOptions?.outputSchema !== undefined\n ? callOptions.outputSchema\n : outputSchema;\n\n let effectiveRunner = runner;\n if (effectiveSchema) {\n effectiveRunner = withStructuredOutput(runner, {\n schema: effectiveSchema,\n maxRetries: callOptions?.maxSchemaRetries ?? maxSchemaRetries ?? 2,\n });\n }\n\n // Run the agent with retry support\n const result = await executeAgentWithRetry<T>(\n effectiveRunner,\n agent,\n input,\n {\n ...opts,\n signal: opts?.signal,\n onMessage: (message) => {\n const currentConversation = getConversation(system.facts);\n const updated = [...currentConversation, message];\n setConversation(\n system.facts,\n updated.length > MAX_CONVERSATION_MESSAGES\n ? updated.slice(-MAX_CONVERSATION_MESSAGES)\n : updated,\n );\n opts?.onMessage?.(message);\n },\n onToolCall: async (toolCall) => {\n // Run tool call guardrails with retry support\n const toolCallGuardrails = (guardrails.toolCall ?? []).map((g, i) =>\n normalizeGuardrail(g, i, \"toolCall\"),\n );\n for (const guardrail of toolCallGuardrails) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input,\n facts: system.facts.$store.toObject(),\n };\n const guardStartTime = Date.now();\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n { toolCall, agentName: agent.name, input },\n context,\n );\n fireHook(\"onGuardrailCheck\", {\n agentId: agent.name,\n guardrailName: name,\n guardrailType: \"toolCall\",\n passed: guardResult.passed,\n reason: guardResult.reason,\n durationMs: Date.now() - guardStartTime,\n timestamp: Date.now(),\n });\n if (!guardResult.passed) {\n throw new GuardrailError({\n code: \"TOOL_CALL_GUARDRAIL_FAILED\",\n message: `Tool call guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"toolCall\",\n userMessage: guardResult.reason ?? \"Tool call blocked\",\n data: { toolCall },\n agentName: agent.name,\n input,\n });\n }\n }\n\n // Check if approval is needed\n if (!autoApproveToolCalls) {\n const approvalId = `tool-${toolCall.id}`;\n const approvalRequest: ApprovalRequest = {\n id: approvalId,\n type: \"tool_call\",\n agentName: agent.name,\n description: `Tool call: ${toolCall.name}`,\n data: toolCall,\n requestedAt: Date.now(),\n };\n\n system.batch(() => {\n const currentApproval = getApprovalState(system.facts);\n setApprovalState(system.facts, {\n ...currentApproval,\n pending: [...currentApproval.pending, approvalRequest],\n });\n });\n\n onApprovalRequest?.(approvalRequest);\n\n // Wait for approval (pass signal so abort cancels the wait)\n await waitForApproval(\n approvalId,\n callOptions?.signal ?? opts?.signal,\n );\n }\n\n const currentToolCalls = getToolCalls(system.facts);\n const updatedToolCalls = [...currentToolCalls, toolCall];\n setToolCalls(\n system.facts,\n updatedToolCalls.length > MAX_TOOL_CALLS\n ? updatedToolCalls.slice(-MAX_TOOL_CALLS)\n : updatedToolCalls,\n );\n opts?.onToolCall?.(toolCall);\n },\n },\n agentRetry\n ? {\n ...agentRetry,\n onRetry: (attempt, error, delayMs) => {\n agentRetry.onRetry?.(attempt, error, delayMs);\n fireHook(\"onAgentRetry\", {\n agentName: agent.name,\n input,\n attempt,\n error,\n delayMs,\n timestamp: Date.now(),\n });\n },\n }\n : undefined,\n );\n\n // Breakpoint: pre_output_guardrails\n if (breakpoints && breakpoints.length > 0) {\n const bpContext: BreakpointContext = {\n agentId: agent.name,\n agentName: agent.name,\n input,\n state: system.facts.$store.toObject(),\n breakpointType: \"pre_output_guardrails\",\n };\n const mods = await handleBreakpoint(\n \"pre_output_guardrails\",\n bpContext,\n callOptions?.signal ?? opts?.signal,\n );\n if (mods?.skip) {\n return {\n output: undefined as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n if (mods?.input) {\n input = mods.input;\n }\n }\n\n // Run output guardrails with retry support\n const outputGuardrailsList = effectiveOutputGuardrails.map((g, i) =>\n normalizeGuardrail(g, i, \"output\"),\n );\n for (const guardrail of outputGuardrailsList) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input,\n facts: system.facts.$store.toObject(),\n };\n const guardStartTime = Date.now();\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n {\n output: result.output,\n agentName: agent.name,\n input,\n messages: result.messages,\n },\n context,\n );\n fireHook(\"onGuardrailCheck\", {\n agentId: agent.name,\n guardrailName: name,\n guardrailType: \"output\",\n passed: guardResult.passed,\n reason: guardResult.reason,\n durationMs: Date.now() - guardStartTime,\n timestamp: Date.now(),\n });\n if (!guardResult.passed) {\n throw new GuardrailError({\n code: \"OUTPUT_GUARDRAIL_FAILED\",\n message: `Output guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"output\",\n userMessage: guardResult.reason ?? \"Output validation failed\",\n agentName: agent.name,\n input,\n });\n }\n if (guardResult.transformed !== undefined) {\n (result as { output: unknown }).output = guardResult.transformed;\n }\n }\n\n // Update state\n let shouldFireBudgetWarning = false;\n let budgetPercentage = 0;\n system.batch(() => {\n const currentAgent = getAgentState(system.facts);\n const newTokenUsage = currentAgent.tokenUsage + result.totalTokens;\n setAgentState(system.facts, {\n ...currentAgent,\n status: \"completed\",\n output: result.output,\n tokenUsage: newTokenUsage,\n turnCount: currentAgent.turnCount + result.messages.length,\n completedAt: Date.now(),\n });\n\n // Check budget warning threshold\n if (maxTokenBudget && onBudgetWarning) {\n budgetPercentage = newTokenUsage / maxTokenBudget;\n const warningFired = getBridgeFact<boolean>(\n system.facts,\n \"__budgetWarningFired\",\n );\n if (budgetPercentage >= budgetWarningThreshold && !warningFired) {\n setBridgeFact(system.facts, \"__budgetWarningFired\", true);\n shouldFireBudgetWarning = true;\n }\n }\n });\n\n // Fire budget warning callback outside of batch (callbacks shouldn't run inside batch)\n if (shouldFireBudgetWarning) {\n try {\n onBudgetWarning!({\n currentTokens: getAgentState(system.facts).tokenUsage,\n maxBudget: maxTokenBudget!,\n percentage: budgetPercentage,\n });\n } catch (callbackError) {\n if (debug) {\n console.debug(\n \"[Directive Orchestrator] onBudgetWarning threw:\",\n callbackError,\n );\n }\n }\n }\n\n // Store messages in memory if configured (best-effort)\n if (memory && result.messages.length > 0) {\n try {\n memory.addMessages(result.messages);\n } catch (memoryError) {\n if (debug) {\n console.debug(\"[Directive] Memory addMessages failed:\", memoryError);\n }\n }\n }\n\n // Call onAgentComplete hook\n fireHook(\"onAgentComplete\", {\n agentName: agent.name,\n input,\n output: result.output,\n tokenUsage: result.totalTokens,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n });\n\n if (timeline) {\n const outputStr =\n typeof result.output === \"string\"\n ? result.output\n : JSON.stringify(result.output);\n timeline.record({\n type: \"agent_complete\",\n timestamp: Date.now(),\n agentId: agent.name,\n snapshotId: null,\n outputLength: outputStr?.length ?? 0,\n totalTokens: result.totalTokens,\n inputTokens: result.tokenUsage?.inputTokens ?? 0,\n outputTokens: result.tokenUsage?.outputTokens ?? 0,\n durationMs: Date.now() - startTime,\n modelId: agent.model ?? undefined,\n output: outputStr.slice(0, MAX_VERBOSE_LENGTH),\n });\n }\n\n // Breakpoint: post_run\n if (breakpoints && breakpoints.length > 0) {\n const bpContext: BreakpointContext = {\n agentId: agent.name,\n agentName: agent.name,\n input,\n state: system.facts.$store.toObject(),\n breakpointType: \"post_run\",\n };\n const mods = await handleBreakpoint(\n \"post_run\",\n bpContext,\n callOptions?.signal ?? opts?.signal,\n );\n if (mods?.skip) {\n return {\n output: undefined as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n if (mods?.input) {\n input = mods.input;\n }\n }\n\n return result;\n }\n\n // Assign the function to the forward-declared variable\n runAgentWithGuardrailsFn = runAgentWithGuardrails;\n\n // ---- Breakpoint infrastructure ----\n const breakpointModifications = new Map<string, BreakpointModifications>();\n const breakpointCancelReasons = new Map<string, string>();\n\n function waitForBreakpointResolution(\n bpId: string,\n signal?: AbortSignal,\n ): Promise<BreakpointModifications | null> {\n if (signal?.aborted) {\n return Promise.reject(\n signal.reason ?? new Error(\"Aborted while waiting for breakpoint\"),\n );\n }\n\n return new Promise((resolve, reject) => {\n let settled = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const cleanupAll = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n if (signal) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n unsubscribe();\n };\n\n const onAbort = () => {\n cleanupAll();\n reject(\n signal!.reason ?? new Error(`Breakpoint wait for ${bpId} aborted`),\n );\n };\n\n if (signal) {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n const unsubscribe = system.facts.$store.subscribe(\n [BREAKPOINT_KEY],\n () => {\n if (settled) {\n return;\n }\n\n const bpState = getBreakpointState(system.facts);\n if (bpState.resolved.includes(bpId)) {\n cleanupAll();\n const mods = breakpointModifications.get(bpId) ?? null;\n breakpointModifications.delete(bpId);\n resolve(mods);\n } else if (bpState.cancelled.includes(bpId)) {\n cleanupAll();\n breakpointModifications.delete(bpId);\n const cancelReason = breakpointCancelReasons.get(bpId);\n breakpointCancelReasons.delete(bpId);\n reject(\n new Error(\n cancelReason\n ? `Breakpoint ${bpId} was cancelled: ${cancelReason}`\n : `Breakpoint ${bpId} was cancelled`,\n ),\n );\n }\n },\n );\n\n const bpTimeout = breakpointTimeoutMs ?? 300000;\n timeoutId = setTimeout(() => {\n if (settled) {\n return;\n }\n\n cleanupAll();\n breakpointModifications.delete(bpId);\n breakpointCancelReasons.delete(bpId);\n reject(\n new Error(\n `[Directive] Breakpoint timeout: ${bpId} not resolved within ${Math.round(bpTimeout / 1000)}s`,\n ),\n );\n }, bpTimeout);\n });\n }\n\n async function handleBreakpoint(\n type: string,\n context: BreakpointContext,\n signal?: AbortSignal,\n ): Promise<BreakpointModifications | null> {\n if (!breakpoints || breakpoints.length === 0) {\n return null;\n }\n\n const match = matchBreakpoint(\n breakpoints as BreakpointConfig<string>[],\n type,\n context,\n );\n if (!match) {\n return null;\n }\n\n const bpId = createBreakpointId();\n const request: BreakpointRequest = {\n id: bpId,\n type,\n agentId: context.agentId,\n input: context.input,\n label: match.label,\n requestedAt: Date.now(),\n };\n\n system.batch(() => {\n const bpState = getBreakpointState(system.facts);\n setBreakpointState(system.facts, {\n ...bpState,\n pending: [...bpState.pending, request],\n });\n });\n\n try {\n onBreakpoint?.(request);\n } catch {\n /* non-fatal */\n }\n try {\n hooks.onBreakpoint?.(request);\n } catch {\n /* non-fatal */\n }\n\n if (timeline) {\n timeline.record({\n type: \"breakpoint_hit\",\n timestamp: Date.now(),\n snapshotId: null,\n agentId: context.agentId,\n breakpointId: bpId,\n breakpointType: type,\n label: match.label,\n });\n }\n\n const mods = await waitForBreakpointResolution(bpId, signal);\n\n if (timeline) {\n timeline.record({\n type: \"breakpoint_resumed\",\n timestamp: Date.now(),\n snapshotId: null,\n agentId: context.agentId,\n breakpointId: bpId,\n modified: !!mods?.input,\n skipped: !!mods?.skip,\n });\n }\n\n return mods;\n }\n\n // Wait for approval with configurable timeout and abort signal support\n function waitForApproval(\n requestId: string,\n signal?: AbortSignal,\n ): Promise<void> {\n if (signal?.aborted) {\n return Promise.reject(\n signal.reason ?? new Error(\"Aborted while waiting for approval\"),\n );\n }\n\n return new Promise((resolve, reject) => {\n let settled = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const cleanupAll = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n if (signal) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n unsubscribe();\n };\n\n const onAbort = () => {\n cleanupAll();\n reject(\n signal!.reason ?? new Error(`Approval wait for ${requestId} aborted`),\n );\n };\n\n if (signal) {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n const unsubscribe = system.facts.$store.subscribe([APPROVAL_KEY], () => {\n if (settled) {\n return;\n }\n\n const approval = getApprovalState(system.facts);\n if (approval.approved.includes(requestId)) {\n cleanupAll();\n resolve();\n } else {\n const rejectedRequest = approval.rejected.find(\n (r) => r.id === requestId,\n );\n if (rejectedRequest) {\n cleanupAll();\n const errorMsg = rejectedRequest.reason\n ? `Request ${requestId} rejected: ${rejectedRequest.reason}`\n : `Request ${requestId} rejected`;\n reject(new Error(errorMsg));\n }\n }\n });\n\n // Set timeout to prevent indefinite hanging (uses configured approvalTimeoutMs)\n timeoutId = setTimeout(() => {\n if (settled) {\n return;\n }\n\n cleanupAll();\n const timeoutSeconds = Math.round(approvalTimeoutMs / 1000);\n reject(\n new Error(\n `[Directive] Approval timeout: Request ${requestId} not resolved within ${timeoutSeconds}s.\\n` +\n \"Solutions:\\n\" +\n \" 1. Handle via onApprovalRequest callback and call orchestrator.approve()/reject()\\n\" +\n \" 2. Set autoApproveToolCalls: true to auto-approve\\n\" +\n ` 3. Increase approvalTimeoutMs (current: ${approvalTimeoutMs}ms)\\n` +\n \"See: https://directive.run/docs/ai/running-agents\",\n ),\n );\n }, approvalTimeoutMs);\n });\n }\n\n /** Get facts as the combined type for external access */\n function getCombinedFacts(): F & OrchestratorState {\n const state = getOrchestratorState(system.facts);\n\n return { ...state } as unknown as F & OrchestratorState;\n }\n\n const orchestrator: AgentOrchestrator<F> = {\n system: system as unknown as System<any>,\n get facts() {\n return getCombinedFacts();\n },\n get totalTokens() {\n return getAgentState(system.facts).tokenUsage;\n },\n get timeline() {\n return timeline;\n },\n\n async run<T>(\n agent: AgentLike,\n input: string,\n options?: RunCallOptions,\n ): Promise<RunResult<T>> {\n return runAgentWithGuardrails<T>(\n agent,\n input,\n getCombinedFacts(),\n undefined,\n options,\n );\n },\n\n runStream<T>(\n agent: AgentLike,\n input: string,\n options: { signal?: AbortSignal } = {},\n ): OrchestratorStreamResult<T> {\n const abortController = new AbortController();\n const MAX_STREAM_BUFFER = 10_000;\n const chunks: OrchestratorStreamChunk[] = [];\n const waiters: Array<(chunk: OrchestratorStreamChunk | null) => void> =\n [];\n let closed = false;\n const startTime = Date.now();\n let tokenCount = 0;\n const MAX_ACCUMULATED_OUTPUT = 100_000;\n let accumulatedOutput = \"\";\n\n // Combine external abort signal\n let abortHandler: (() => void) | undefined;\n if (options.signal) {\n abortHandler = () => abortController.abort();\n options.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n const cleanup = () => {\n if (abortHandler && options.signal) {\n options.signal.removeEventListener(\"abort\", abortHandler);\n }\n };\n\n // Push a chunk to the stream\n const pushChunk = (chunk: OrchestratorStreamChunk) => {\n if (closed) return;\n const waiter = waiters.shift();\n if (waiter) {\n waiter(chunk);\n } else {\n chunks.push(chunk);\n // FIFO eviction when buffer exceeds max\n if (chunks.length > MAX_STREAM_BUFFER) {\n chunks.shift();\n }\n }\n };\n\n // Close the stream\n const closeStream = () => {\n closed = true;\n cleanup();\n for (const waiter of waiters) {\n waiter(null);\n }\n waiters.length = 0;\n };\n\n // Run the agent with streaming callbacks\n const resultPromise = (async (): Promise<RunResult<T>> => {\n pushChunk({\n type: \"progress\",\n phase: \"starting\",\n message: \"Running input guardrails\",\n });\n\n try {\n // Run input guardrails first with retry support\n let processedInput = input;\n const inputGuardrails = (guardrails.input ?? []).map((g, i) =>\n normalizeGuardrail(g, i, \"input\"),\n );\n for (const guardrail of inputGuardrails) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input: processedInput,\n facts: system.facts.$store.toObject(),\n };\n const result = await executeGuardrailWithRetry(\n guardrail,\n { input: processedInput, agentName: agent.name },\n context,\n );\n if (!result.passed) {\n pushChunk({\n type: \"guardrail_triggered\",\n guardrailName: name,\n reason: result.reason ?? \"Input validation failed\",\n partialOutput: accumulatedOutput,\n stopped: true,\n });\n throw new GuardrailError({\n code: \"INPUT_GUARDRAIL_FAILED\",\n message: `Input guardrail \"${name}\" failed: ${result.reason}`,\n guardrailName: name,\n guardrailType: \"input\",\n userMessage: result.reason ?? \"Input validation failed\",\n agentName: agent.name,\n input: processedInput,\n });\n }\n if (result.transformed !== undefined) {\n processedInput = result.transformed as string;\n }\n }\n\n pushChunk({\n type: \"progress\",\n phase: \"generating\",\n message: \"Starting agent\",\n });\n\n // Update state\n system.batch(() => {\n const currentAgent = getAgentState(system.facts);\n setAgentState(system.facts, {\n ...currentAgent,\n status: \"running\",\n currentAgent: agent.name,\n input: processedInput,\n startedAt: Date.now(),\n });\n });\n\n // Run agent with streaming callbacks and retry support\n const result = await executeAgentWithRetry<T>(\n runner,\n agent,\n processedInput,\n {\n signal: abortController.signal,\n onMessage: (message) => {\n const currentConversation = getConversation(system.facts);\n setConversation(system.facts, [\n ...currentConversation,\n message,\n ]);\n pushChunk({ type: \"message\", message });\n\n // Approximate token counting from content\n if (message.role === \"assistant\" && message.content) {\n const newTokens = Math.ceil(message.content.length / 4);\n tokenCount += newTokens;\n accumulatedOutput += message.content;\n if (accumulatedOutput.length > MAX_ACCUMULATED_OUTPUT) {\n accumulatedOutput = accumulatedOutput.slice(\n -MAX_ACCUMULATED_OUTPUT,\n );\n }\n pushChunk({\n type: \"token\",\n data: message.content,\n tokenCount,\n });\n }\n },\n onToolCall: async (toolCall) => {\n pushChunk({\n type: \"tool_start\",\n tool: toolCall.name,\n toolCallId: toolCall.id,\n arguments: toolCall.arguments,\n });\n\n // Run tool call guardrails with retry support\n const toolCallGuardrails = (guardrails.toolCall ?? []).map(\n (g, i) => normalizeGuardrail(g, i, \"toolCall\"),\n );\n for (const guardrail of toolCallGuardrails) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input: processedInput,\n facts: system.facts.$store.toObject(),\n };\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n { toolCall, agentName: agent.name, input: processedInput },\n context,\n );\n if (!guardResult.passed) {\n pushChunk({\n type: \"guardrail_triggered\",\n guardrailName: name,\n reason: guardResult.reason ?? \"Tool call blocked\",\n partialOutput: accumulatedOutput,\n stopped: true,\n });\n throw new GuardrailError({\n code: \"TOOL_CALL_GUARDRAIL_FAILED\",\n message: `Tool call guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"toolCall\",\n userMessage: guardResult.reason ?? \"Tool call blocked\",\n data: { toolCall },\n agentName: agent.name,\n input: processedInput,\n });\n }\n }\n\n // Check if approval is needed\n if (!autoApproveToolCalls) {\n const approvalId = `tool-${toolCall.id}`;\n pushChunk({\n type: \"approval_required\",\n requestId: approvalId,\n toolName: toolCall.name,\n });\n\n const approvalRequest: ApprovalRequest = {\n id: approvalId,\n type: \"tool_call\",\n agentName: agent.name,\n description: `Tool call: ${toolCall.name}`,\n data: toolCall,\n requestedAt: Date.now(),\n };\n\n system.batch(() => {\n const currentApproval = getApprovalState(system.facts);\n setApprovalState(system.facts, {\n ...currentApproval,\n pending: [...currentApproval.pending, approvalRequest],\n });\n });\n\n onApprovalRequest?.(approvalRequest);\n await waitForApproval(approvalId, abortController.signal);\n pushChunk({\n type: \"approval_resolved\",\n requestId: approvalId,\n approved: true,\n });\n }\n\n const currentToolCalls = getToolCalls(system.facts);\n setToolCalls(system.facts, [...currentToolCalls, toolCall]);\n\n if (toolCall.result) {\n pushChunk({\n type: \"tool_end\",\n tool: toolCall.name,\n toolCallId: toolCall.id,\n result: toolCall.result,\n });\n }\n },\n },\n agentRetry,\n );\n\n // Run output guardrails\n pushChunk({\n type: \"progress\",\n phase: \"finishing\",\n message: \"Running output guardrails\",\n });\n\n const outputGuardrails = (guardrails.output ?? []).map((g, i) =>\n normalizeGuardrail(g, i, \"output\"),\n );\n for (const guardrail of outputGuardrails) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input: processedInput,\n facts: system.facts.$store.toObject(),\n };\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n {\n output: result.output,\n agentName: agent.name,\n input: processedInput,\n messages: result.messages,\n },\n context,\n );\n if (!guardResult.passed) {\n pushChunk({\n type: \"guardrail_triggered\",\n guardrailName: name,\n reason: guardResult.reason ?? \"Output validation failed\",\n partialOutput:\n typeof result.output === \"string\" ? result.output : \"\",\n stopped: true,\n });\n throw new GuardrailError({\n code: \"OUTPUT_GUARDRAIL_FAILED\",\n message: `Output guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"output\",\n userMessage: guardResult.reason ?? \"Output validation failed\",\n agentName: agent.name,\n input: processedInput,\n });\n }\n if (guardResult.transformed !== undefined) {\n (result as { output: unknown }).output = guardResult.transformed;\n }\n }\n\n // Update final state\n system.batch(() => {\n const currentAgent = getAgentState(system.facts);\n setAgentState(system.facts, {\n ...currentAgent,\n status: \"completed\",\n output: result.output,\n tokenUsage: currentAgent.tokenUsage + result.totalTokens,\n turnCount: currentAgent.turnCount + result.messages.length,\n completedAt: Date.now(),\n });\n });\n\n const duration = Date.now() - startTime;\n pushChunk({\n type: \"done\",\n totalTokens: result.totalTokens,\n duration,\n droppedTokens: 0,\n });\n closeStream();\n\n return result;\n } catch (error) {\n pushChunk({\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n });\n closeStream();\n throw error;\n }\n })();\n\n // Prevent unhandled rejection if caller only consumes stream (not .result)\n resultPromise.catch(() => {});\n\n // Create async iterator\n const stream: AsyncIterable<OrchestratorStreamChunk> = {\n [Symbol.asyncIterator](): AsyncIterator<OrchestratorStreamChunk> {\n return {\n async next(): Promise<IteratorResult<OrchestratorStreamChunk>> {\n if (chunks.length > 0) {\n return { done: false, value: chunks.shift()! };\n }\n if (closed) {\n return { done: true, value: undefined };\n }\n\n return new Promise<IteratorResult<OrchestratorStreamChunk>>(\n (resolve) => {\n waiters.push((chunk) => {\n if (chunk === null) {\n resolve({ done: true, value: undefined });\n } else {\n resolve({ done: false, value: chunk });\n }\n });\n },\n );\n },\n };\n },\n };\n\n return {\n stream,\n result: resultPromise,\n abort: () => {\n abortController.abort();\n closeStream();\n },\n };\n },\n\n async waitForIdle(timeoutMs?: number): Promise<void> {\n const isIdle = () => getAgentState(system.facts).status !== \"running\";\n if (isIdle()) {\n return;\n }\n\n const start = Date.now();\n while (!isIdle()) {\n if (timeoutMs !== undefined && Date.now() - start > timeoutMs) {\n throw new Error(\"[Directive Orchestrator] waitForIdle timed out\");\n }\n await new Promise((r) => setTimeout(r, 50));\n }\n },\n\n approve(requestId: string): void {\n system.batch(() => {\n const approval = getApprovalState(system.facts);\n if (!approval.pending.some((r) => r.id === requestId)) {\n if (debug)\n console.debug(\n `[Directive] approve() ignored: no pending request \"${requestId}\"`,\n );\n\n return;\n }\n const MAX_APPROVAL_HISTORY = 200;\n const approved = [...approval.approved, requestId];\n setApprovalState(system.facts, {\n ...approval,\n pending: approval.pending.filter((r) => r.id !== requestId),\n approved:\n approved.length > MAX_APPROVAL_HISTORY\n ? approved.slice(-MAX_APPROVAL_HISTORY)\n : approved,\n });\n });\n },\n\n reject(requestId: string, reason?: string): void {\n system.batch(() => {\n const approval = getApprovalState(system.facts);\n if (!approval.pending.some((r) => r.id === requestId)) {\n if (debug)\n console.debug(\n `[Directive] reject() ignored: no pending request \"${requestId}\"`,\n );\n\n return;\n }\n if (reason && debug) {\n console.debug(`[Directive] Request ${requestId} rejected: ${reason}`);\n }\n const rejectedRequest: RejectedRequest = {\n id: requestId,\n reason,\n rejectedAt: Date.now(),\n };\n const MAX_REJECTION_HISTORY = 200;\n const rejected = [...approval.rejected, rejectedRequest];\n setApprovalState(system.facts, {\n ...approval,\n pending: approval.pending.filter((r) => r.id !== requestId),\n rejected:\n rejected.length > MAX_REJECTION_HISTORY\n ? rejected.slice(-MAX_REJECTION_HISTORY)\n : rejected,\n });\n });\n },\n\n pause(): void {\n const currentAgent = getAgentState(system.facts);\n setAgentState(system.facts, {\n ...currentAgent,\n status: \"paused\",\n });\n },\n\n resume(): void {\n const agent = getAgentState(system.facts);\n if (agent.status === \"paused\") {\n setAgentState(system.facts, {\n ...agent,\n status: agent.currentAgent ? \"running\" : \"idle\",\n });\n }\n },\n\n reset(): void {\n system.batch(() => {\n setAgentState(system.facts, {\n status: \"idle\",\n currentAgent: null,\n input: null,\n output: null,\n error: null,\n tokenUsage: 0,\n turnCount: 0,\n startedAt: null,\n completedAt: null,\n });\n setApprovalState(system.facts, {\n pending: [],\n approved: [],\n rejected: [],\n });\n setConversation(system.facts, []);\n setToolCalls(system.facts, []);\n setBreakpointState(system.facts, {\n pending: [],\n resolved: [],\n cancelled: [],\n });\n setBridgeFact(system.facts, \"__budgetWarningFired\", false);\n });\n breakpointModifications.clear();\n breakpointCancelReasons.clear();\n },\n\n async checkpoint(cpOptions?: { label?: string }): Promise<Checkpoint> {\n const agentState = getAgentState(system.facts);\n if (agentState.status === \"running\") {\n throw new Error(\"[Directive] Cannot checkpoint while agent is running\");\n }\n if (!system.history?.export) {\n throw new Error(\n \"[Directive] Checkpointing requires history. Set `debug: true` in orchestrator options.\",\n );\n }\n\n const cp: Checkpoint = {\n version: 1,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: cpOptions?.label,\n systemExport: system.history.export(),\n timelineExport: timeline?.export() ?? null,\n localState: { type: \"single\" },\n memoryExport: memory ? ((memory as any).export?.() ?? null) : null,\n orchestratorType: \"single\",\n };\n\n if (checkpointStore) {\n await checkpointStore.save(cp);\n }\n\n return cp;\n },\n\n restore(cp: Checkpoint, restoreOpts?: { restoreTimeline?: boolean }): void {\n if (!validateCheckpoint(cp)) {\n throw new Error(\"[Directive] Invalid checkpoint data\");\n }\n if (cp.orchestratorType !== \"single\") {\n throw new Error(\n \"[Directive] Cannot restore multi-agent checkpoint in single-agent orchestrator\",\n );\n }\n if (!system.history?.import) {\n throw new Error(\n \"[Directive] Restoring a checkpoint requires history. Set `debug: true` in orchestrator options.\",\n );\n }\n\n system.history.import(cp.systemExport);\n\n if (\n restoreOpts?.restoreTimeline !== false &&\n cp.timelineExport &&\n timeline\n ) {\n timeline.import(cp.timelineExport);\n }\n\n if (cp.memoryExport !== null && memory && (memory as any).import) {\n (memory as any).import(cp.memoryExport);\n }\n },\n\n resumeBreakpoint(\n id: string,\n modifications?: BreakpointModifications,\n ): void {\n if (modifications) {\n breakpointModifications.set(id, modifications);\n }\n system.batch(() => {\n const bpState = getBreakpointState(system.facts);\n const resolved = [...bpState.resolved, id];\n setBreakpointState(system.facts, {\n ...bpState,\n pending: bpState.pending.filter((r) => r.id !== id),\n resolved:\n resolved.length > MAX_BREAKPOINT_HISTORY\n ? resolved.slice(-MAX_BREAKPOINT_HISTORY)\n : resolved,\n });\n });\n },\n\n cancelBreakpoint(id: string, reason?: string): void {\n if (reason) {\n breakpointCancelReasons.set(id, reason);\n }\n system.batch(() => {\n const bpState = getBreakpointState(system.facts);\n const cancelled = [...bpState.cancelled, id];\n setBreakpointState(system.facts, {\n ...bpState,\n pending: bpState.pending.filter((r) => r.id !== id),\n cancelled:\n cancelled.length > MAX_BREAKPOINT_HISTORY\n ? cancelled.slice(-MAX_BREAKPOINT_HISTORY)\n : cancelled,\n });\n });\n },\n\n getPendingBreakpoints(): BreakpointRequest[] {\n const bpState = getBreakpointState(system.facts);\n\n return [...bpState.pending];\n },\n\n dispose(): void {\n system.destroy();\n },\n };\n\n return orchestrator;\n}\n","/**\n * Health Monitor — tracks per-agent health metrics for self-healing networks.\n *\n * Pure computation module with zero Directive dependency.\n * Maintains a rolling window of success/failure events and computes a health\n * score from 0-100 based on configurable weights.\n *\n * @module\n */\n\nimport type { HealthMonitorConfig } from \"./types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Circuit state values */\nexport type HealthCircuitState = \"CLOSED\" | \"OPEN\" | \"HALF_OPEN\";\n\n/** Per-agent health metrics */\nexport interface AgentHealthMetrics {\n agentId: string;\n circuitState: HealthCircuitState;\n successRate: number;\n avgLatencyMs: number;\n recentFailures: number;\n recentSuccesses: number;\n healthScore: number;\n /** Last N error messages (most recent last) */\n lastErrors: string[];\n}\n\n/** Internal event record */\ninterface HealthEvent {\n success: boolean;\n latencyMs: number;\n timestamp: number;\n errorMessage?: string;\n}\n\n/** Health monitor instance */\nexport interface HealthMonitor {\n recordSuccess(agentId: string, latencyMs: number): void;\n recordFailure(agentId: string, latencyMs: number, error?: Error): void;\n getMetrics(agentId: string): AgentHealthMetrics;\n getAllMetrics(): Record<string, AgentHealthMetrics>;\n /** Returns a 0-100 health score. Returns 50 (neutral) when no data is available for the agent. */\n getHealthScore(agentId: string): number;\n updateCircuitState(agentId: string, state: HealthCircuitState): void;\n /** Reset all metrics. Useful for testing. */\n reset(): void;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\nconst DEFAULT_WINDOW_MS = 60_000;\nconst DEFAULT_MAX_NORMAL_LATENCY_MS = 5_000;\nconst DEFAULT_MAX_EVENTS_PER_AGENT = 1_000;\nconst DEFAULT_MAX_STORED_ERRORS = 5;\nconst DEFAULT_WEIGHTS = {\n successRate: 0.5,\n latency: 0.3,\n circuitState: 0.2,\n};\n\n/**\n * Create a health monitor that tracks per-agent metrics.\n *\n * @example\n * ```typescript\n * const monitor = createHealthMonitor({ windowMs: 30000 });\n *\n * monitor.recordSuccess(\"agent-a\", 120);\n * monitor.recordFailure(\"agent-a\", 5000, new Error(\"timeout\"));\n *\n * const score = monitor.getHealthScore(\"agent-a\");\n * console.log(score); // 0-100\n * ```\n */\nexport function createHealthMonitor(\n config: HealthMonitorConfig = {},\n): HealthMonitor {\n const windowMs = config.windowMs ?? DEFAULT_WINDOW_MS;\n const maxNormalLatencyMs =\n config.maxNormalLatencyMs ?? DEFAULT_MAX_NORMAL_LATENCY_MS;\n const maxEventsPerAgent =\n config.maxEventsPerAgent ?? DEFAULT_MAX_EVENTS_PER_AGENT;\n const weights = {\n successRate: config.weights?.successRate ?? DEFAULT_WEIGHTS.successRate,\n latency: config.weights?.latency ?? DEFAULT_WEIGHTS.latency,\n circuitState: config.weights?.circuitState ?? DEFAULT_WEIGHTS.circuitState,\n };\n\n // Validate config\n if (!Number.isFinite(windowMs) || windowMs <= 0) {\n throw new Error(\n \"[Directive HealthMonitor] windowMs must be a positive number\",\n );\n }\n if (!Number.isFinite(maxNormalLatencyMs) || maxNormalLatencyMs <= 0) {\n throw new Error(\n \"[Directive HealthMonitor] maxNormalLatencyMs must be a positive number\",\n );\n }\n if (!Number.isFinite(maxEventsPerAgent) || maxEventsPerAgent < 1) {\n throw new Error(\"[Directive HealthMonitor] maxEventsPerAgent must be >= 1\");\n }\n\n // A14: Validate individual weight bounds\n for (const [key, value] of Object.entries(weights)) {\n if (value < 0 || value > 1) {\n throw new Error(\n `[Directive HealthMonitor] weight \"${key}\" must be between 0 and 1 (got ${value})`,\n );\n }\n }\n\n // Validate weights sum approximately to 1.0\n const weightSum =\n weights.successRate + weights.latency + weights.circuitState;\n if (Math.abs(weightSum - 1.0) > 0.01) {\n throw new Error(\n `[Directive HealthMonitor] weights must sum to ~1.0 (tolerance: ±0.01, got ${weightSum.toFixed(4)})`,\n );\n }\n\n const events = new Map<string, HealthEvent[]>();\n const circuitStates = new Map<string, HealthCircuitState>();\n\n // L4: Generation counter for getAllMetrics caching\n let generation = 0;\n let cachedAll: Record<string, AgentHealthMetrics> | null = null;\n let cachedGen = -1;\n\n function getAgentEvents(agentId: string): HealthEvent[] {\n let agentEvents = events.get(agentId);\n if (!agentEvents) {\n agentEvents = [];\n events.set(agentId, agentEvents);\n }\n\n return agentEvents;\n }\n\n function pruneAndCap(agentEvents: HealthEvent[], now: number): void {\n // Time-based pruning: find first event within the window\n const cutoff = now - windowMs;\n let firstValid = 0;\n while (\n firstValid < agentEvents.length &&\n agentEvents[firstValid]!.timestamp < cutoff\n ) {\n firstValid++;\n }\n\n // Cap-based pruning: ensure we don't exceed maxEventsPerAgent\n const excessFromCap = agentEvents.length - firstValid - maxEventsPerAgent;\n if (excessFromCap > 0) {\n firstValid += excessFromCap;\n }\n\n // Batch remove all expired/excess events in one operation\n if (firstValid > 0) {\n agentEvents.splice(0, firstValid);\n }\n }\n\n function computeScore(agentId: string): number {\n const agentEvents = events.get(agentId);\n if (!agentEvents || agentEvents.length === 0) {\n return 50; // No data = neutral\n }\n\n const now = Date.now();\n pruneAndCap(agentEvents, now);\n\n if (agentEvents.length === 0) {\n return 50;\n }\n\n const successes = agentEvents.filter((e) => e.success).length;\n const successRate = successes / agentEvents.length;\n\n const avgLatency =\n agentEvents.reduce((s, e) => s + e.latencyMs, 0) / agentEvents.length;\n const normalizedLatency = Math.min(avgLatency / maxNormalLatencyMs, 1);\n\n const state = circuitStates.get(agentId) ?? \"CLOSED\";\n const circuitScore =\n state === \"CLOSED\" ? 1 : state === \"HALF_OPEN\" ? 0.5 : 0;\n\n const raw =\n successRate * weights.successRate +\n (1 - normalizedLatency) * weights.latency +\n circuitScore * weights.circuitState;\n\n return Math.round(raw * 100);\n }\n\n function buildMetrics(agentId: string): AgentHealthMetrics {\n const agentEvents = getAgentEvents(agentId);\n const now = Date.now();\n pruneAndCap(agentEvents, now);\n\n const successes = agentEvents.filter((e) => e.success).length;\n const failures = agentEvents.length - successes;\n const successRate =\n agentEvents.length > 0 ? successes / agentEvents.length : 0;\n const avgLatencyMs =\n agentEvents.length > 0\n ? agentEvents.reduce((s, e) => s + e.latencyMs, 0) / agentEvents.length\n : 0;\n\n // Collect last N error messages\n const lastErrors: string[] = [];\n for (\n let i = agentEvents.length - 1;\n i >= 0 && lastErrors.length < DEFAULT_MAX_STORED_ERRORS;\n i--\n ) {\n if (agentEvents[i]!.errorMessage) {\n lastErrors.unshift(agentEvents[i]!.errorMessage!);\n }\n }\n\n return {\n agentId,\n circuitState: circuitStates.get(agentId) ?? \"CLOSED\",\n successRate,\n avgLatencyMs,\n recentFailures: failures,\n recentSuccesses: successes,\n healthScore: computeScore(agentId),\n lastErrors,\n };\n }\n\n return {\n recordSuccess(agentId: string, latencyMs: number): void {\n const agentEvents = getAgentEvents(agentId);\n agentEvents.push({ success: true, latencyMs, timestamp: Date.now() });\n // A9: Prune on write path to prevent unbounded growth between reads\n pruneAndCap(agentEvents, Date.now());\n generation++;\n },\n\n recordFailure(agentId: string, latencyMs: number, error?: Error): void {\n const agentEvents = getAgentEvents(agentId);\n agentEvents.push({\n success: false,\n latencyMs,\n timestamp: Date.now(),\n errorMessage: error?.message,\n });\n // A9: Prune on write path to prevent unbounded growth between reads\n pruneAndCap(agentEvents, Date.now());\n generation++;\n },\n\n getMetrics(agentId: string): AgentHealthMetrics {\n return buildMetrics(agentId);\n },\n\n getAllMetrics(): Record<string, AgentHealthMetrics> {\n // L4: Return cached result when no writes have occurred\n if (generation === cachedGen && cachedAll) {\n return cachedAll;\n }\n\n const result: Record<string, AgentHealthMetrics> = Object.create(null);\n for (const agentId of events.keys()) {\n result[agentId] = buildMetrics(agentId);\n }\n\n cachedAll = result;\n cachedGen = generation;\n\n return result;\n },\n\n getHealthScore(agentId: string): number {\n return computeScore(agentId);\n },\n\n updateCircuitState(agentId: string, state: HealthCircuitState): void {\n circuitStates.set(agentId, state);\n generation++;\n },\n\n reset(): void {\n events.clear();\n circuitStates.clear();\n generation++;\n cachedAll = null;\n cachedGen = -1;\n },\n };\n}\n","/**\n * Agent Reflection / Self-Improvement\n *\n * Quality-based iteration: agent produces output → evaluator checks it → retry\n * with feedback until pass. Works with any AgentRunner.\n *\n * Shipped with aggressive safeguards to prevent silent budget burn:\n * - maxIterations default: 2 (conservative)\n * - Dev-mode warning for maxIterations > 3\n * - onIteration fires on every iteration (observable by default)\n * - Token usage accumulated across iterations\n *\n * @example\n * ```typescript\n * import { withReflection } from '@directive-run/ai';\n *\n * const reflective = withReflection(runner, {\n * evaluate: (output) => ({\n * passed: output.includes('conclusion'),\n * feedback: 'Missing conclusion section',\n * }),\n * maxIterations: 2,\n * });\n *\n * const result = await reflective(agent, 'Write a report');\n * ```\n */\n\nimport type { AgentLike, AgentRunner, RunOptions, RunResult } from \"./types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Context passed to the reflection evaluator */\nexport interface ReflectionContext {\n input: string;\n /** 0-based iteration number */\n iteration: number;\n result: RunResult<unknown>;\n history: ReflectionEvaluation[];\n}\n\n/** Result of a reflection evaluation */\nexport interface ReflectionEvaluation {\n passed: boolean;\n feedback?: string;\n /** Quality score from 0 to 1, optional */\n score?: number;\n}\n\n/** Evaluator function for reflection */\nexport type ReflectionEvaluator<T = unknown> = (\n output: T,\n context: ReflectionContext,\n) => ReflectionEvaluation | Promise<ReflectionEvaluation>;\n\n/** Configuration for the reflection wrapper */\nexport interface ReflectionConfig<T = unknown> {\n /** Evaluator function — decides if the output is acceptable */\n evaluate: ReflectionEvaluator<T>;\n /** Maximum iterations (including the first). Default: 2 (conservative) */\n maxIterations?: number;\n /** Build the retry input from original input + feedback */\n buildRetryInput?: (\n input: string,\n feedback: string,\n iteration: number,\n ) => string;\n /** Callback on each iteration */\n onIteration?: (event: {\n iteration: number;\n passed: boolean;\n feedback?: string;\n score?: number;\n durationMs: number;\n }) => void;\n /** Behavior when maxIterations exhausted. Default: \"accept-last\" */\n onExhausted?: \"accept-last\" | \"throw\";\n /** Stop early if budget remaining < threshold (tokens). Works with withBudget. */\n budgetThreshold?: number;\n}\n\n// ============================================================================\n// Error\n// ============================================================================\n\n/** Error thrown when reflection iterations are exhausted and onExhausted is \"throw\" */\nexport class ReflectionExhaustedError extends Error {\n readonly iterations: number;\n readonly history: ReflectionEvaluation[];\n readonly lastResult: RunResult<unknown>;\n readonly totalTokens: number;\n\n constructor(options: {\n iterations: number;\n history: ReflectionEvaluation[];\n lastResult: RunResult<unknown>;\n totalTokens: number;\n }) {\n super(\n `[Directive Reflection] Exhausted ${options.iterations} iterations without passing evaluation. ` +\n `Last feedback: ${options.history[options.history.length - 1]?.feedback ?? \"(none)\"}`,\n );\n this.name = \"ReflectionExhaustedError\";\n this.iterations = options.iterations;\n this.history = options.history;\n this.lastResult = options.lastResult;\n this.totalTokens = options.totalTokens;\n }\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/** Default retry input format */\nfunction defaultBuildRetryInput(\n input: string,\n feedback: string,\n _iteration: number,\n): string {\n return `${input}\\n\\nFeedback on your previous response:\\n${feedback}\\n\\nPlease improve your response.`;\n}\n\n/**\n * Wrap an AgentRunner with reflection (self-improvement) logic.\n *\n * The returned runner runs the agent, evaluates the output, and retries with\n * feedback if the evaluation fails — up to `maxIterations` times.\n *\n * @example\n * ```typescript\n * const reflective = withReflection(runner, {\n * evaluate: (output) => ({\n * passed: typeof output === 'string' && output.length > 100,\n * feedback: 'Response too short, please elaborate',\n * score: Math.min(1, (output as string).length / 200),\n * }),\n * maxIterations: 3,\n * onExhausted: 'accept-last',\n * });\n * ```\n */\nexport function withReflection<T = unknown>(\n runner: AgentRunner,\n config: ReflectionConfig<T>,\n): AgentRunner {\n const maxIterations = config.maxIterations ?? 2;\n const buildRetryInput = config.buildRetryInput ?? defaultBuildRetryInput;\n const onExhausted = config.onExhausted ?? \"accept-last\";\n\n if (maxIterations < 1) {\n throw new Error(\"[Directive Reflection] maxIterations must be >= 1\");\n }\n\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\" &&\n maxIterations > 3\n ) {\n console.warn(\n \"[Directive Reflection] maxIterations > 3 rarely improves quality. \" +\n \"Consider using maxIterations <= 3 to avoid unbounded token burn.\",\n );\n }\n\n return async <R>(\n agent: AgentLike,\n input: string,\n options?: RunOptions,\n ): Promise<RunResult<R>> => {\n const history: ReflectionEvaluation[] = [];\n let effectiveInput = input;\n let accumulatedTokens = 0;\n let lastResult: RunResult<unknown> | null = null;\n\n for (let iteration = 0; iteration < maxIterations; iteration++) {\n const iterationStart = Date.now();\n\n // Run the agent\n const result = await runner(agent, effectiveInput, options);\n lastResult = result;\n accumulatedTokens += result.totalTokens;\n\n // Evaluate the output\n const context: ReflectionContext = {\n input,\n iteration,\n result,\n history: [...history],\n };\n\n const evaluation = await config.evaluate(result.output as T, context);\n history.push(evaluation);\n\n const durationMs = Date.now() - iterationStart;\n\n // Fire callback\n try {\n config.onIteration?.({\n iteration,\n passed: evaluation.passed,\n feedback: evaluation.feedback,\n score: evaluation.score,\n durationMs,\n });\n } catch {\n // callback error is non-fatal\n }\n\n if (evaluation.passed) {\n // Return with accumulated tokens\n return {\n ...result,\n totalTokens: accumulatedTokens,\n } as RunResult<R>;\n }\n\n // Check budget threshold\n if (\n config.budgetThreshold !== undefined &&\n accumulatedTokens >= config.budgetThreshold\n ) {\n break;\n }\n\n // Build retry input for next iteration (unless this is the last)\n if (iteration < maxIterations - 1 && evaluation.feedback) {\n effectiveInput = buildRetryInput(input, evaluation.feedback, iteration);\n }\n }\n\n // Exhausted all iterations\n if (onExhausted === \"throw\") {\n throw new ReflectionExhaustedError({\n iterations: maxIterations,\n history,\n lastResult: lastResult!,\n totalTokens: accumulatedTokens,\n });\n }\n\n // \"accept-last\" — return the last result with accumulated tokens\n return {\n ...lastResult!,\n totalTokens: accumulatedTokens,\n } as RunResult<R>;\n };\n}\n","/**\n * Agent Streaming - Token-by-token streaming with backpressure support\n *\n * Provides async iterators for streaming agent responses with guardrail evaluation\n * on partial output and configurable backpressure handling.\n *\n * @example\n * ```typescript\n * import { createAgentOrchestrator } from '@directive-run/ai';\n * import { createStreamingRunner } from '@directive-run/ai';\n *\n * const { stream, result } = orchestrator.runStream(agent, input);\n *\n * for await (const chunk of stream) {\n * if (chunk.type === 'token') process.stdout.write(chunk.data);\n * if (chunk.type === 'guardrail_triggered') handleGuardrail(chunk);\n * }\n *\n * const finalResult = await result;\n * ```\n */\n\nimport type { OrchestratorStreamChunk } from \"./agent-orchestrator.js\";\nimport type {\n AgentLike,\n GuardrailFn,\n Message,\n OutputGuardrailData,\n RunResult,\n StreamingCallbackRunner,\n} from \"./types.js\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default buffer size for streaming backpressure */\nexport const DEFAULT_BUFFER_SIZE = 1000;\n\n/** Default interval (in tokens) between guardrail checks during streaming */\nexport const DEFAULT_GUARDRAIL_CHECK_INTERVAL = 50;\n\n/** Default toxicity threshold for toxicity streaming guardrail */\nexport const DEFAULT_TOXICITY_THRESHOLD = 0.8;\n\n// ============================================================================\n// Stream Event Types\n// ============================================================================\n\n/** Token chunk from streaming response */\nexport interface TokenChunk {\n type: \"token\";\n data: string;\n /** Running total of tokens received */\n tokenCount: number;\n}\n\n/** Tool execution started */\nexport interface ToolStartChunk {\n type: \"tool_start\";\n tool: string;\n toolCallId: string;\n arguments: string;\n}\n\n/** Tool execution completed */\nexport interface ToolEndChunk {\n type: \"tool_end\";\n tool: string;\n toolCallId: string;\n result: string;\n}\n\n/** Message added to conversation */\nexport interface MessageChunk {\n type: \"message\";\n message: Message;\n}\n\n/** Guardrail was triggered during streaming */\nexport interface GuardrailTriggeredChunk {\n type: \"guardrail_triggered\";\n guardrailName: string;\n reason: string;\n /** Partial output at the time of trigger */\n partialOutput: string;\n /** Whether the stream was stopped */\n stopped: boolean;\n}\n\n/** Progress update for UI feedback */\nexport interface ProgressChunk {\n type: \"progress\";\n phase: \"starting\" | \"generating\" | \"tool_calling\" | \"finishing\";\n /** Percentage complete (0-100), if known */\n percent?: number;\n /** Human-readable status message */\n message?: string;\n}\n\n/** Stream completed */\nexport interface DoneChunk {\n type: \"done\";\n totalTokens: number;\n duration: number;\n /** Number of tokens dropped due to backpressure (only with 'drop' strategy) */\n droppedTokens: number;\n}\n\n/** Error during streaming */\nexport interface ErrorChunk {\n type: \"error\";\n error: Error;\n /** Partial output before error */\n partialOutput?: string;\n}\n\n/** Union of all stream chunk types */\nexport type StreamChunk =\n | TokenChunk\n | ToolStartChunk\n | ToolEndChunk\n | MessageChunk\n | GuardrailTriggeredChunk\n | ProgressChunk\n | DoneChunk\n | ErrorChunk;\n\n// ============================================================================\n// Streaming Run Types\n// ============================================================================\n\n/** Backpressure strategy when consumer is slow */\nexport type BackpressureStrategy =\n /** Drop tokens when buffer is full (lossy, fast) */\n | \"drop\"\n /** Block producer when buffer is full (lossless, may slow response) */\n | \"block\"\n /** Buffer all tokens (lossless, uses memory) */\n | \"buffer\";\n\n/** Streaming run options */\nexport interface StreamRunOptions {\n /** Maximum turns before stopping */\n maxTurns?: number;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Backpressure strategy. @default \"buffer\" */\n backpressure?: BackpressureStrategy;\n /** Buffer size for 'drop' and 'block' strategies. @default 1000 */\n bufferSize?: number;\n /** Evaluate guardrails every N tokens. @default 50 */\n guardrailCheckInterval?: number;\n /** Stop stream on guardrail trigger. @default true */\n stopOnGuardrail?: boolean | ((chunk: GuardrailTriggeredChunk) => boolean);\n}\n\n/** Stream run function type (mirrors OpenAI Agents streaming API) */\nexport type StreamRunner = <T = unknown>(\n agent: AgentLike,\n input: string,\n options?: StreamRunOptions,\n) => StreamingRunResult<T>;\n\n/** Result from a streaming run */\nexport interface StreamingRunResult<T = unknown> {\n /** Async iterator for streaming chunks */\n stream: AsyncIterable<StreamChunk>;\n /** Promise that resolves to the final result */\n result: Promise<RunResult<T>>;\n /** Abort the stream */\n abort: () => void;\n}\n\n// ============================================================================\n// Streaming Guardrail Types\n// ============================================================================\n\n/** Streaming guardrail that evaluates partial output */\nexport interface StreamingGuardrail {\n /** Unique name for this guardrail */\n name: string;\n /** Check partial output (called every guardrailCheckInterval tokens) */\n check: (\n partialOutput: string,\n tokenCount: number,\n ) => StreamingGuardrailResult | Promise<StreamingGuardrailResult>;\n /** Whether to stop the stream on failure. @default true */\n stopOnFail?: boolean;\n}\n\n/** Result from a streaming guardrail check */\nexport interface StreamingGuardrailResult {\n passed: boolean;\n reason?: string;\n /** Severity level for UI display */\n severity?: \"warning\" | \"error\" | \"critical\";\n /** Warning message (guardrail passed but wants to emit a warning) */\n warning?: string;\n}\n\n// ============================================================================\n// Stream Buffer Implementation\n// ============================================================================\n\n/** Internal buffer for managing backpressure */\nclass StreamBuffer<T> {\n private buffer: T[] = [];\n private maxSize: number;\n private strategy: BackpressureStrategy;\n private pullWaiters: Array<(value: T | null) => void> = [];\n private pushWaiters: Array<() => void> = []; // For block strategy - queue-based, not polling\n private closed = false;\n private droppedCount = 0;\n\n constructor(\n strategy: BackpressureStrategy = \"buffer\",\n maxSize = DEFAULT_BUFFER_SIZE,\n ) {\n this.strategy = strategy;\n this.maxSize = maxSize;\n }\n\n async push(item: T): Promise<boolean> {\n if (this.closed) {\n return false;\n }\n\n // If there's a pull waiter, send directly\n const pullWaiter = this.pullWaiters.shift();\n if (pullWaiter) {\n pullWaiter(item);\n return true;\n }\n\n // Handle based on strategy\n if (this.buffer.length >= this.maxSize) {\n switch (this.strategy) {\n case \"drop\":\n this.droppedCount++;\n return false;\n case \"block\":\n // Queue-based blocking (no polling) - wait for consumer to pull\n await new Promise<void>((resolve) => {\n this.pushWaiters.push(resolve);\n });\n if (this.closed) {\n return false;\n }\n break;\n case \"buffer\":\n // Just push anyway (may use lots of memory)\n break;\n }\n }\n\n this.buffer.push(item);\n return true;\n }\n\n async pull(): Promise<T | null> {\n // Notify a blocked producer that space is available\n const pushWaiter = this.pushWaiters.shift();\n if (pushWaiter) {\n pushWaiter();\n }\n\n if (this.buffer.length > 0) {\n return this.buffer.shift()!;\n }\n\n if (this.closed) {\n return null;\n }\n\n // Wait for next item\n return new Promise<T | null>((resolve) => {\n this.pullWaiters.push(resolve);\n });\n }\n\n close(): void {\n this.closed = true;\n // Resolve all waiting consumers with null\n for (const waiter of this.pullWaiters) {\n waiter(null);\n }\n this.pullWaiters = [];\n // Unblock all waiting producers\n for (const waiter of this.pushWaiters) {\n waiter();\n }\n this.pushWaiters = [];\n }\n\n getDroppedCount(): number {\n return this.droppedCount;\n }\n}\n\n// ============================================================================\n// Streaming Runner Implementation\n// ============================================================================\n\n/**\n * Create a streaming runner that wraps a base run function.\n * This is used internally by the orchestrator but can be used standalone.\n *\n * @param baseRunner - The underlying non-streaming runner\n * @param options - Configuration options\n */\nexport function createStreamingRunner(\n baseRunner: StreamingCallbackRunner,\n options: {\n streamingGuardrails?: StreamingGuardrail[];\n } = {},\n): StreamRunner {\n const { streamingGuardrails = [] } = options;\n\n return <T>(\n agent: AgentLike,\n input: string,\n runOptions: StreamRunOptions = {},\n ): StreamingRunResult<T> => {\n const {\n signal,\n backpressure = \"buffer\",\n bufferSize = DEFAULT_BUFFER_SIZE,\n guardrailCheckInterval = DEFAULT_GUARDRAIL_CHECK_INTERVAL,\n stopOnGuardrail = true,\n } = runOptions;\n\n // Validate configuration\n if (\n guardrailCheckInterval <= 0 ||\n !Number.isFinite(guardrailCheckInterval)\n ) {\n throw new Error(\n `[Directive Streaming] guardrailCheckInterval must be a positive number, got ${guardrailCheckInterval}`,\n );\n }\n\n const buffer = new StreamBuffer<StreamChunk>(backpressure, bufferSize);\n const abortController = new AbortController();\n let partialOutput = \"\";\n let tokenCount = 0;\n let stopped = false;\n const startTime = Date.now();\n\n // Combine external abort signal with internal one (with proper cleanup)\n let abortHandler: (() => void) | undefined;\n if (signal) {\n abortHandler = () => abortController.abort();\n signal.addEventListener(\"abort\", abortHandler);\n }\n\n // Cleanup function to prevent memory leaks\n const cleanup = () => {\n if (abortHandler && signal) {\n signal.removeEventListener(\"abort\", abortHandler);\n }\n };\n\n // Check streaming guardrails\n async function checkGuardrails(): Promise<GuardrailTriggeredChunk | null> {\n for (const guardrail of streamingGuardrails) {\n try {\n const result = await guardrail.check(partialOutput, tokenCount);\n if (!result.passed) {\n const shouldStop = guardrail.stopOnFail !== false;\n const chunk: GuardrailTriggeredChunk = {\n type: \"guardrail_triggered\",\n guardrailName: guardrail.name,\n reason: result.reason ?? \"Guardrail check failed\",\n partialOutput,\n stopped: shouldStop,\n };\n\n await buffer.push(chunk);\n\n if (shouldStop) {\n const stopFn =\n typeof stopOnGuardrail === \"function\"\n ? stopOnGuardrail\n : () => stopOnGuardrail;\n if (stopFn(chunk)) {\n stopped = true;\n abortController.abort();\n }\n }\n\n return chunk;\n }\n } catch {\n // Guardrail errors during streaming are silently swallowed —\n // the guardrail result itself carries error info when applicable.\n }\n }\n return null;\n }\n\n // Run the agent and pipe to buffer\n const resultPromise = (async (): Promise<RunResult<T>> => {\n await buffer.push({\n type: \"progress\",\n phase: \"starting\",\n message: \"Starting agent\",\n });\n\n try {\n const result = await baseRunner(agent, input, {\n signal: abortController.signal,\n onToken: async (token) => {\n if (stopped) return;\n\n tokenCount++;\n partialOutput += token;\n\n await buffer.push({\n type: \"token\",\n data: token,\n tokenCount,\n });\n\n // Check guardrails periodically\n if (tokenCount % guardrailCheckInterval === 0) {\n await checkGuardrails();\n }\n },\n onToolStart: async (tool, id, args) => {\n await buffer.push({\n type: \"progress\",\n phase: \"tool_calling\",\n message: `Calling ${tool}`,\n });\n await buffer.push({\n type: \"tool_start\",\n tool,\n toolCallId: id,\n arguments: args,\n });\n },\n onToolEnd: async (tool, id, result) => {\n await buffer.push({\n type: \"tool_end\",\n tool,\n toolCallId: id,\n result,\n });\n await buffer.push({\n type: \"progress\",\n phase: \"generating\",\n message: \"Continuing generation\",\n });\n },\n onMessage: async (message) => {\n await buffer.push({ type: \"message\", message });\n },\n });\n\n // Final guardrail check\n await checkGuardrails();\n\n const duration = Date.now() - startTime;\n const droppedTokens = buffer.getDroppedCount();\n await buffer.push({\n type: \"done\",\n totalTokens: result.totalTokens,\n duration,\n droppedTokens,\n });\n\n buffer.close();\n return result as RunResult<T>;\n } catch (error) {\n const errorChunk: ErrorChunk = {\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n partialOutput: partialOutput || undefined,\n };\n await buffer.push(errorChunk);\n buffer.close();\n throw error;\n } finally {\n // Always cleanup abort signal listener to prevent memory leaks\n cleanup();\n }\n })();\n\n // Create async iterator\n const stream: AsyncIterable<StreamChunk> = {\n [Symbol.asyncIterator](): AsyncIterator<StreamChunk> {\n return {\n async next(): Promise<IteratorResult<StreamChunk>> {\n const chunk = await buffer.pull();\n if (chunk === null) {\n return { done: true, value: undefined };\n }\n return { done: false, value: chunk };\n },\n };\n },\n };\n\n return {\n stream,\n result: resultPromise,\n abort: () => abortController.abort(),\n };\n };\n}\n\n// ============================================================================\n// Built-in Streaming Guardrails\n// ============================================================================\n\n/**\n * Create a streaming guardrail that detects toxic content.\n *\n * @example\n * ```typescript\n * const toxicityGuardrail = createToxicityStreamingGuardrail({\n * threshold: 0.9,\n * checkFn: async (text) => myToxicityModel.score(text),\n * });\n * ```\n */\nexport function createToxicityStreamingGuardrail(options: {\n /** Toxicity scoring function (returns 0-1) */\n checkFn: (text: string) => number | Promise<number>;\n /** Threshold above which content is flagged. @default 0.8 */\n threshold?: number;\n /** Stop the stream on detection. @default true */\n stopOnFail?: boolean;\n}): StreamingGuardrail {\n const {\n checkFn,\n threshold = DEFAULT_TOXICITY_THRESHOLD,\n stopOnFail = true,\n } = options;\n\n return {\n name: \"toxicity-streaming\",\n stopOnFail,\n async check(partialOutput) {\n const score = await checkFn(partialOutput);\n if (score > threshold) {\n return {\n passed: false,\n reason: `Toxicity score ${score.toFixed(2)} exceeds threshold ${threshold}`,\n severity: \"critical\",\n };\n }\n return { passed: true };\n },\n };\n}\n\n/**\n * Create a streaming guardrail that limits output length.\n *\n * @example\n * ```typescript\n * const lengthGuardrail = createLengthStreamingGuardrail({\n * maxTokens: 4000,\n * warnAt: 3500,\n * });\n * ```\n */\nexport function createLengthStreamingGuardrail(options: {\n /** Maximum tokens before stopping */\n maxTokens: number;\n /** Warn at this token count (optional) */\n warnAt?: number;\n /** Stop the stream on max. @default true */\n stopOnFail?: boolean;\n}): StreamingGuardrail {\n const { maxTokens, warnAt, stopOnFail = true } = options;\n\n // Per-instance flag: if this guardrail is shared across concurrent streams,\n // the warning fires only once globally. Create separate instances for independent warning per stream.\n let warned = false;\n\n return {\n name: \"length-streaming\",\n stopOnFail,\n check(_partialOutput, tokenCount) {\n if (tokenCount >= maxTokens) {\n return {\n passed: false,\n reason: `Output exceeded maximum length of ${maxTokens} tokens`,\n severity: \"error\",\n };\n }\n\n if (warnAt && tokenCount >= warnAt && !warned) {\n warned = true;\n\n return {\n passed: true,\n warning: `Approaching maximum length: ${tokenCount}/${maxTokens} tokens`,\n severity: \"warning\",\n };\n }\n\n return { passed: true };\n },\n };\n}\n\n/**\n * Create a streaming guardrail that detects patterns (regex-based).\n *\n * @example\n * ```typescript\n * const piiGuardrail = createPatternStreamingGuardrail({\n * patterns: [\n * { regex: /\\b\\d{3}-\\d{2}-\\d{4}\\b/, name: 'SSN' },\n * { regex: /\\b\\d{16}\\b/, name: 'Credit Card' },\n * ],\n * stopOnFail: true,\n * });\n * ```\n */\nexport function createPatternStreamingGuardrail(options: {\n patterns: Array<{ regex: RegExp; name: string }>;\n stopOnFail?: boolean;\n}): StreamingGuardrail {\n const { patterns, stopOnFail = true } = options;\n\n return {\n name: \"pattern-streaming\",\n stopOnFail,\n check(partialOutput) {\n for (const { regex, name } of patterns) {\n regex.lastIndex = 0;\n if (regex.test(partialOutput)) {\n return {\n passed: false,\n reason: `Detected ${name} pattern in output`,\n severity: \"error\",\n };\n }\n }\n return { passed: true };\n },\n };\n}\n\n/**\n * Combine multiple streaming guardrails into one.\n *\n * @example\n * ```typescript\n * const combined = combineStreamingGuardrails([\n * createToxicityStreamingGuardrail({ ... }),\n * createLengthStreamingGuardrail({ ... }),\n * ]);\n * ```\n */\nexport function combineStreamingGuardrails(\n guardrails: StreamingGuardrail[],\n options: { name?: string; stopOnFirstFail?: boolean } = {},\n): StreamingGuardrail {\n const { name = \"combined-streaming\", stopOnFirstFail = true } = options;\n\n return {\n name,\n stopOnFail: stopOnFirstFail,\n async check(partialOutput, tokenCount) {\n const failures: string[] = [];\n for (const guardrail of guardrails) {\n const result = await guardrail.check(partialOutput, tokenCount);\n if (!result.passed) {\n if (stopOnFirstFail) {\n return {\n ...result,\n reason: `[${guardrail.name}] ${result.reason}`,\n };\n }\n failures.push(`[${guardrail.name}] ${result.reason ?? \"failed\"}`);\n }\n }\n if (failures.length > 0) {\n return { passed: false, reason: failures.join(\"; \") };\n }\n return { passed: true };\n },\n };\n}\n\n// ============================================================================\n// Output Guardrail Adapter\n// ============================================================================\n\n/**\n * Convert a regular output guardrail to a streaming guardrail.\n * Useful for reusing existing guardrails in streaming context.\n *\n * @example\n * ```typescript\n * const streamingPII = adaptOutputGuardrail(\n * \"pii-streaming\",\n * createPIIGuardrail({ redact: false }),\n * { checkInterval: 100 }\n * );\n * ```\n */\nexport function adaptOutputGuardrail(\n name: string,\n guardrail: GuardrailFn<OutputGuardrailData>,\n options: {\n /** Only run after this many tokens (optimization) */\n minTokens?: number;\n stopOnFail?: boolean;\n } = {},\n): StreamingGuardrail {\n const { minTokens = 0, stopOnFail = true } = options;\n\n return {\n name,\n stopOnFail,\n async check(partialOutput, tokenCount) {\n if (tokenCount < minTokens) {\n return { passed: true };\n }\n\n const result = await guardrail(\n {\n output: partialOutput,\n agentName: \"streaming\",\n input: \"\",\n messages: [],\n },\n {\n agentName: \"streaming\",\n input: \"\",\n facts: {},\n },\n );\n\n return {\n passed: result.passed,\n reason: result.reason,\n severity: result.passed ? undefined : \"error\",\n };\n },\n };\n}\n\n// ============================================================================\n// Stream Utilities\n// ============================================================================\n\n/**\n * Collect all tokens from a stream into a string.\n *\n * @example\n * ```typescript\n * const { stream, result } = orchestrator.runStream(agent, input);\n * const fullOutput = await collectTokens(stream);\n * ```\n */\nexport async function collectTokens(\n stream: AsyncIterable<StreamChunk>,\n): Promise<string> {\n let output = \"\";\n for await (const chunk of stream) {\n if (chunk.type === \"token\") {\n output += chunk.data;\n }\n }\n return output;\n}\n\n/**\n * Tap into a stream without consuming it.\n * Useful for logging or side effects.\n *\n * @example\n * ```typescript\n * const { stream } = orchestrator.runStream(agent, input);\n * const tapped = tapStream(stream, (chunk) => console.log(chunk));\n * for await (const chunk of tapped) { ... }\n * ```\n */\nexport async function* tapStream(\n stream: AsyncIterable<StreamChunk>,\n fn: (chunk: StreamChunk) => void | Promise<void>,\n): AsyncIterable<StreamChunk> {\n for await (const chunk of stream) {\n await fn(chunk);\n yield chunk;\n }\n}\n\n/**\n * Filter stream chunks by type.\n *\n * @example\n * ```typescript\n * const tokensOnly = filterStream(stream, ['token']);\n * ```\n */\nexport async function* filterStream<T extends StreamChunk[\"type\"]>(\n stream: AsyncIterable<StreamChunk>,\n types: T[],\n): AsyncIterable<Extract<StreamChunk, { type: T }>> {\n const typeSet = new Set(types);\n for await (const chunk of stream) {\n if (typeSet.has(chunk.type as T)) {\n yield chunk as Extract<StreamChunk, { type: T }>;\n }\n }\n}\n\n/**\n * Transform stream chunks.\n *\n * @example\n * ```typescript\n * const upperTokens = mapStream(stream, (chunk) => {\n * if (chunk.type === 'token') return { ...chunk, data: chunk.data.toUpperCase() };\n * return chunk;\n * });\n * ```\n */\nexport async function* mapStream<R>(\n stream: AsyncIterable<StreamChunk>,\n fn: (chunk: StreamChunk) => R | Promise<R>,\n): AsyncIterable<R> {\n for await (const chunk of stream) {\n yield await fn(chunk);\n }\n}\n\n// ============================================================================\n// Multiplexed Streaming (Parallel Agent Streams)\n// ============================================================================\n\n/** A multiplexed stream chunk tagged with the agent that produced it */\nexport interface MultiplexedStreamChunk {\n chunk: OrchestratorStreamChunk;\n agentId: string;\n}\n\n/** Result from a parallel streaming operation */\nexport interface MultiplexedStreamResult<T = unknown> {\n stream: AsyncIterable<MultiplexedStreamChunk>;\n results: Promise<RunResult<unknown>[]>;\n merge: Promise<T>;\n abort: () => void;\n /** Number of chunks dropped due to buffer overflow */\n getDroppedCount: () => number;\n}\n\n/** Maximum buffer size for multiplexed streams */\nconst MAX_MULTIPLEX_BUFFER = 10_000;\n\n/** A source stream with its agent ID */\ninterface TaggedSource {\n agentId: string;\n stream: AsyncIterable<OrchestratorStreamChunk>;\n}\n\n/**\n * Merge multiple async iterables into a single multiplexed stream,\n * tagging each chunk with its source agent ID.\n *\n * Race-based merge: pulls from all sources concurrently, emitting\n * chunks in arrival order. Error chunks from individual agents are\n * tagged and emitted (other agents continue).\n *\n * @example\n * ```typescript\n * const merged = mergeTaggedStreams([\n * { agentId: \"researcher\", stream: researchStream },\n * { agentId: \"writer\", stream: writerStream },\n * ]);\n *\n * for await (const { chunk, agentId } of merged) {\n * console.log(`[${agentId}]`, chunk);\n * }\n * ```\n */\n/** Result from mergeTaggedStreams */\nexport interface MergedTaggedStreamResult {\n stream: AsyncIterable<MultiplexedStreamChunk>;\n /** Number of chunks dropped due to buffer overflow */\n getDroppedCount: () => number;\n}\n\n/**\n * Merge multiple tagged async iterables into a single multiplexed stream.\n *\n * @param sources - Array of tagged source streams to merge.\n * @returns A merged stream result with a `getDroppedCount` accessor.\n */\nexport function mergeTaggedStreams(\n sources: TaggedSource[],\n): MergedTaggedStreamResult {\n // Guard: empty sources would hang forever since no consumer calls finish()\n if (sources.length === 0) {\n const emptyStream: AsyncIterable<MultiplexedStreamChunk> = {\n [Symbol.asyncIterator]() {\n const done = {\n done: true as const,\n value: undefined as unknown as MultiplexedStreamChunk,\n };\n\n return {\n async next() {\n return done;\n },\n async return() {\n return done;\n },\n };\n },\n };\n\n return { stream: emptyStream, getDroppedCount: () => 0 };\n }\n\n const buffer: MultiplexedStreamChunk[] = [];\n const waiters: Array<(item: MultiplexedStreamChunk | null) => void> = [];\n let activeSources = sources.length;\n let closed = false;\n let droppedCount = 0;\n\n function push(item: MultiplexedStreamChunk): void {\n if (closed) {\n return;\n }\n\n const waiter = waiters.shift();\n if (waiter) {\n waiter(item);\n\n return;\n }\n\n if (buffer.length < MAX_MULTIPLEX_BUFFER) {\n buffer.push(item);\n } else {\n droppedCount++;\n }\n }\n\n function finish(): void {\n activeSources--;\n if (activeSources <= 0) {\n closed = true;\n for (const waiter of waiters) {\n waiter(null);\n }\n waiters.length = 0;\n }\n }\n\n // Start consumers for each source\n for (const source of sources) {\n (async () => {\n try {\n for await (const chunk of source.stream) {\n push({ chunk, agentId: source.agentId });\n }\n } catch (error) {\n // Emit error as a tagged chunk\n push({\n chunk: {\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n },\n agentId: source.agentId,\n });\n } finally {\n finish();\n }\n })();\n }\n\n const stream: AsyncIterable<MultiplexedStreamChunk> = {\n [Symbol.asyncIterator](): AsyncIterator<MultiplexedStreamChunk> {\n return {\n async next(): Promise<IteratorResult<MultiplexedStreamChunk>> {\n if (buffer.length > 0) {\n return { done: false, value: buffer.shift()! };\n }\n\n if (closed) {\n return { done: true, value: undefined };\n }\n\n return new Promise<IteratorResult<MultiplexedStreamChunk>>(\n (resolve) => {\n waiters.push((item) => {\n if (item === null) {\n resolve({ done: true, value: undefined });\n } else {\n resolve({ done: false, value: item });\n }\n });\n },\n );\n },\n\n return(): Promise<IteratorResult<MultiplexedStreamChunk>> {\n // Stop accepting new chunks\n closed = true;\n buffer.length = 0;\n for (const waiter of waiters) {\n waiter(null);\n }\n waiters.length = 0;\n\n return Promise.resolve({ done: true, value: undefined });\n },\n };\n },\n };\n\n return {\n stream,\n getDroppedCount: () => droppedCount,\n };\n}\n","import type {\n AgentSelectionStrategy,\n DagExecutionContext,\n DagNode,\n DagPattern,\n GoalMetrics,\n GoalNode,\n GoalPattern,\n PatternCheckpointConfig,\n RelaxationTier,\n RunResult,\n} from \"./types.js\";\nimport type {\n ParallelPattern,\n SequentialPattern,\n SupervisorPattern,\n ReflectPattern,\n RacePattern,\n ReflectIterationRecord,\n} from \"./multi-agent-orchestrator.js\";\nimport type { ReflectionEvaluation } from \"./reflection.js\";\n\n// ============================================================================\n// Pattern Helpers\n// ============================================================================\n\n/**\n * Create a parallel execution pattern that runs handlers concurrently and merges results.\n *\n * @param handlers - Handler IDs (agents or tasks) to run concurrently.\n * @param merge - Combine all handler results into a single output (array may be shorter than handlers when `minSuccess` is set).\n * @param options - Optional `minSuccess` and `timeout` overrides.\n * @returns A {@link ParallelPattern} configuration object.\n *\n * @example\n * ```typescript\n * const researchPattern = parallel(\n * ['researcher', 'researcher', 'researcher'],\n * (results) => results.map(r => r.output).join('\\n'),\n * );\n * ```\n */\nexport function parallel<T>(\n handlers: string[],\n merge: (results: RunResult<unknown>[]) => T | Promise<T>,\n options?: { minSuccess?: number; timeout?: number },\n): ParallelPattern<T> {\n return {\n type: \"parallel\",\n handlers,\n merge,\n ...options,\n };\n}\n\n/**\n * Create a sequential execution pattern that pipes output from one handler to the next.\n *\n * @param handlers - Handler IDs (agents or tasks) to run in order, where each handler's output feeds as input to the next.\n * @param options - Optional `transform`, `extract`, and `continueOnError` overrides.\n * @returns A {@link SequentialPattern} configuration object.\n *\n * @example\n * ```typescript\n * const writeReviewPattern = sequential(\n * ['writer', 'reviewer'],\n * { transform: (output) => `Review this: ${output}` },\n * );\n * ```\n */\nexport function sequential<T>(\n handlers: string[],\n options?: {\n transform?: (output: unknown, handlerId: string, index: number) => string;\n extract?: (output: unknown) => T;\n continueOnError?: boolean;\n },\n): SequentialPattern<T> {\n return {\n type: \"sequential\",\n handlers,\n ...options,\n };\n}\n\n/**\n * Create a supervisor pattern where a coordinating agent delegates work to a pool of workers.\n *\n * The supervisor runs first, then dispatches tasks to workers based on its output.\n * This repeats for up to `maxRounds` until the supervisor signals completion.\n *\n * @param supervisorAgent - Agent ID that coordinates the workers.\n * @param workers - Agent IDs for the worker pool.\n * @param options - Optional `maxRounds` and `extract` overrides.\n * @returns A {@link SupervisorPattern} configuration object.\n *\n * @example\n * ```typescript\n * const managedPattern = supervisor(\n * 'manager',\n * ['worker1', 'worker2'],\n * { maxRounds: 3 },\n * );\n * ```\n */\nexport function supervisor<T>(\n supervisorAgent: string,\n workers: string[],\n options?: {\n maxRounds?: number;\n extract?: (\n supervisorOutput: unknown,\n workerResults: RunResult<unknown>[],\n ) => T;\n },\n): SupervisorPattern<T> {\n return {\n type: \"supervisor\",\n supervisor: supervisorAgent,\n workers,\n ...options,\n };\n}\n\n/**\n * Create a directed acyclic graph (DAG) execution pattern.\n *\n * Nodes run concurrently when their dependencies are satisfied. The runtime\n * validates the graph is acyclic and that all dependency references are valid.\n *\n * @param nodes - Node definitions keyed by ID, each with a `handler` and optional `deps` array.\n * @param merge - Combine DAG outputs into a single result (defaults to `context.outputs`).\n * @param options - Optional `timeout`, `maxConcurrent`, and `onNodeError` strategy.\n * @returns A {@link DagPattern} configuration object.\n *\n * @example\n * ```typescript\n * const researchPipeline = dag(\n * {\n * fetch: { handler: 'fetcher' },\n * analyze: { handler: 'analyzer', deps: ['fetch'] },\n * summarize: { handler: 'summarizer', deps: ['analyze'] },\n * },\n * (context) => context.outputs.summarize,\n * );\n * ```\n */\nexport function dag<T = Record<string, unknown>>(\n nodes: Record<string, DagNode>,\n merge?: (context: DagExecutionContext) => T | Promise<T>,\n options?: {\n /** Overall timeout in ms for the entire DAG. */\n timeout?: number;\n /** Max nodes running concurrently. Default: Infinity */\n maxConcurrent?: number;\n /**\n * Error handling strategy.\n * - `\"fail\"` — abort entire DAG on first node error (default)\n * - `\"skip-downstream\"` — mark downstream nodes as skipped, other branches continue\n * - `\"continue\"` — ignore errors, other branches continue\n */\n onNodeError?: \"fail\" | \"skip-downstream\" | \"continue\";\n },\n): DagPattern<T> {\n return {\n type: \"dag\",\n nodes,\n merge: merge ?? ((context: DagExecutionContext) => context.outputs as T),\n ...options,\n };\n}\n\n/**\n * Create a reflect pattern that iterates between a producer and evaluator until quality is met.\n *\n * The producer generates output, then the evaluator scores it. If the score\n * is below the threshold, the producer retries with evaluator feedback,\n * up to `maxIterations` times.\n *\n * @param handler - Producer handler ID (agent or task) that generates output.\n * @param evaluator - Evaluator handler ID that judges quality and provides feedback.\n * @param options - Optional iteration, parsing, signal, and threshold configuration.\n * @returns A {@link ReflectPattern} configuration object.\n *\n * @example\n * ```typescript\n * const reviewPattern = reflect('writer', 'reviewer', { maxIterations: 2 });\n * ```\n */\nexport function reflect<T>(\n handler: string,\n evaluator: string,\n options?: {\n maxIterations?: number;\n parseEvaluation?: (output: unknown) => ReflectionEvaluation;\n buildRetryInput?: (\n input: string,\n feedback: string,\n iteration: number,\n ) => string;\n extract?: (output: unknown) => T;\n onExhausted?: \"accept-last\" | \"accept-best\" | \"throw\";\n onIteration?: (record: ReflectIterationRecord) => void;\n signal?: AbortSignal;\n timeout?: number;\n threshold?: number | ((iteration: number) => number);\n },\n): ReflectPattern<T> {\n return {\n type: \"reflect\",\n handler,\n evaluator,\n ...options,\n };\n}\n\n/**\n * Create a race pattern that runs handlers concurrently and returns the first successful result.\n *\n * All handlers start simultaneously. The first to complete successfully wins;\n * remaining handlers are aborted. Use `minSuccess` to wait for N results before picking.\n *\n * @param handlers - Handler IDs (agents or tasks) to race concurrently.\n * @param options - Optional `extract`, `timeout`, `minSuccess`, and `signal` overrides.\n * @returns A {@link RacePattern} configuration object.\n *\n * @example\n * ```typescript\n * const fastest = race(['fast-model', 'smart-model'], { timeout: 5000 });\n * ```\n */\nexport function race<T>(\n handlers: string[],\n options?: {\n extract?: (result: RunResult<unknown>) => T;\n timeout?: number;\n minSuccess?: number;\n signal?: AbortSignal;\n },\n): RacePattern<T> {\n return {\n type: \"race\",\n handlers,\n ...options,\n };\n}\n\n// ============================================================================\n// Goal Pattern Factory & Selection Strategies\n// ============================================================================\n\n/**\n * Create a goal-driven execution pattern where agents are selected and run\n * until a goal condition is satisfied.\n *\n * Declare what each agent produces and requires. The runtime automatically\n * infers the execution graph from dependency analysis and drives agents\n * toward goal achievement, with optional satisfaction scoring and relaxation tiers.\n *\n * @param nodes - Goal node definitions keyed by ID, each declaring `produces`, `requires`, and a `handler`.\n * @param when - Predicate that returns `true` when the goal is achieved.\n * @param options - Optional `satisfaction`, `maxSteps`, `extract`, `timeout`, `selectionStrategy`, and `relaxation` config.\n * @returns A {@link GoalPattern} configuration object.\n *\n * @example\n * ```typescript\n * const pipeline = goal(\n * {\n * researcher: {\n * handler: \"researcher\",\n * produces: [\"research.findings\"],\n * requires: [\"research.topic\"],\n * extractOutput: (r) => ({ \"research.findings\": r.output }),\n * },\n * writer: {\n * handler: \"writer\",\n * produces: [\"article.draft\"],\n * requires: [\"research.findings\"],\n * extractOutput: (r) => ({ \"article.draft\": r.output }),\n * },\n * },\n * (facts) => facts[\"article.draft\"] != null,\n * { maxSteps: 10, extract: (facts) => facts[\"article.draft\"] },\n * );\n * ```\n */\nexport function goal<T = Record<string, unknown>>(\n nodes: Record<string, GoalNode>,\n when: (facts: Record<string, unknown>) => boolean,\n options?: {\n satisfaction?: (facts: Record<string, unknown>) => number;\n maxSteps?: number;\n extract?: (facts: Record<string, unknown>) => T;\n timeout?: number;\n signal?: AbortSignal;\n selectionStrategy?: AgentSelectionStrategy;\n relaxation?: RelaxationTier[];\n onStep?: (\n step: number,\n facts: Record<string, unknown>,\n readyNodes: string[],\n ) => void;\n onStall?: (step: number, metrics: GoalMetrics) => void;\n checkpoint?: PatternCheckpointConfig;\n },\n): GoalPattern<T> {\n return {\n type: \"goal\",\n nodes,\n when,\n ...options,\n };\n}\n\n/**\n * Create a selection strategy that runs all ready agents concurrently.\n *\n * This is the default strategy for {@link goal} patterns.\n *\n * @returns An {@link AgentSelectionStrategy} that selects every ready agent.\n */\nexport function allReadyStrategy(): AgentSelectionStrategy {\n return {\n select: (readyAgents) => readyAgents,\n };\n}\n\n/**\n * Create a selection strategy that picks agents with the highest historical impact.\n *\n * Sorts ready agents by average satisfaction delta (descending) and selects the top N.\n *\n * @param opts - Optional `topN` to limit how many agents are selected (default: 3).\n * @returns An {@link AgentSelectionStrategy} that prioritizes high-impact agents.\n */\nexport function highestImpactStrategy(opts?: {\n topN?: number;\n}): AgentSelectionStrategy {\n const topN = opts?.topN ?? 3;\n\n return {\n select: (readyAgents, metrics) => {\n const sorted = [...readyAgents].sort((a, b) => {\n const aAvg = metrics[a]?.avgSatisfactionDelta ?? 0;\n const bAvg = metrics[b]?.avgSatisfactionDelta ?? 0;\n\n return bAvg - aAvg;\n });\n\n return sorted.slice(0, topN);\n },\n };\n}\n\n/**\n * Create a selection strategy that prefers agents with lower token cost per satisfaction delta.\n *\n * Agents without historical metrics are prioritized first (to gather data).\n *\n * @returns An {@link AgentSelectionStrategy} that optimizes for cost efficiency.\n */\nexport function costEfficientStrategy(): AgentSelectionStrategy {\n return {\n select: (readyAgents, metrics) => {\n const sorted = [...readyAgents].sort((a, b) => {\n const aM = metrics[a];\n const bM = metrics[b];\n\n // Agents without metrics go first (need data)\n if (!aM || aM.runs === 0) {\n return -1;\n }\n if (!bM || bM.runs === 0) {\n return 1;\n }\n\n // Cost per delta: lower is better\n const aCost =\n aM.avgSatisfactionDelta > 0\n ? aM.tokens / aM.runs / aM.avgSatisfactionDelta\n : Number.POSITIVE_INFINITY;\n const bCost =\n bM.avgSatisfactionDelta > 0\n ? bM.tokens / bM.runs / bM.avgSatisfactionDelta\n : Number.POSITIVE_INFINITY;\n\n return aCost - bCost;\n });\n\n return sorted;\n },\n };\n}\n","/**\n * Multi-Agent Orchestration Patterns\n *\n * Provides patterns for coordinating multiple AI agents:\n * - Parallel execution with result merging\n * - Sequential pipelines\n * - Supervisor patterns with worker delegation\n * - Constraint-driven agent selection\n *\n * @example\n * ```typescript\n * import { createMultiAgentOrchestrator } from '@directive-run/ai';\n *\n * const orchestrator = createMultiAgentOrchestrator({\n * agents: {\n * researcher: { agent: researchAgent, maxConcurrent: 3 },\n * writer: { agent: writerAgent, maxConcurrent: 1 },\n * reviewer: { agent: reviewerAgent, maxConcurrent: 1 },\n * },\n * patterns: {\n * parallelResearch: {\n * type: 'parallel',\n * handlers: ['researcher', 'researcher', 'researcher'],\n * merge: (results) => combineResearch(results),\n * },\n * },\n * });\n * ```\n */\n\nimport type {\n ModuleSchema,\n Plugin,\n Requirement,\n System,\n} from \"@directive-run/core\";\nimport { createModule, createSystem, t } from \"@directive-run/core\";\nimport {\n createCallbackPlugin,\n getBridgeFact,\n requirementGuard,\n setBridgeFact,\n} from \"@directive-run/core/adapter-utils\";\nimport type { CircuitBreaker } from \"@directive-run/core/plugins\";\nimport type {\n OrchestratorStreamChunk,\n OrchestratorStreamResult,\n} from \"./agent-orchestrator.js\";\nimport {\n type DebugTimeline,\n createDebugTimeline,\n createDebugTimelinePlugin,\n} from \"./debug-timeline.js\";\nimport {\n executeAgentWithRetry,\n executeGuardrailWithRetry,\n normalizeGuardrail,\n} from \"./guardrail-utils.js\";\nimport { type HealthMonitor, createHealthMonitor } from \"./health-monitor.js\";\nimport type { AgentMemory } from \"./memory.js\";\nimport {\n convertOrchestratorConstraints,\n getAgentState,\n getApprovalState,\n getBreakpointState,\n getConversation,\n getOrchestratorState,\n getToolCalls,\n setAgentState,\n setApprovalState,\n setBreakpointState,\n setConversation,\n setToolCalls,\n} from \"./orchestrator-bridge.js\";\nimport { ReflectionExhaustedError } from \"./reflection.js\";\nimport type { ReflectionEvaluation } from \"./reflection.js\";\nimport type {\n AgentLike,\n AgentRetryConfig,\n AgentRunner,\n AgentSelectionStrategy,\n ApprovalRequest,\n CheckpointDiff,\n CheckpointProgress,\n CrossAgentDerivationFn,\n CrossAgentSnapshot,\n DagCheckpointState,\n DagExecutionContext,\n DagNode,\n DagPattern,\n DebateCheckpointState,\n GoalCheckpointState,\n GoalMetrics,\n GoalNode,\n GoalPattern,\n GoalResult,\n GoalStepMetrics,\n GuardrailFn,\n GuardrailsConfig,\n InputGuardrailData,\n MultiAgentLifecycleHooks,\n MultiAgentSelfHealingConfig,\n NamedGuardrail,\n OrchestratorConstraint,\n OrchestratorResolver,\n OrchestratorResolverContext,\n OrchestratorState,\n OutputGuardrailData,\n PatternCheckpointConfig,\n PatternCheckpointState,\n ReflectCheckpointState,\n RejectedRequest,\n RelaxationContext,\n RelaxationRecord,\n RelaxationTier,\n RerouteEvent,\n RunOptions,\n RunResult,\n Scratchpad,\n SequentialCheckpointState,\n SupervisorCheckpointState,\n ToolCallGuardrailData,\n} from \"./types.js\";\nimport {\n APPROVAL_KEY,\n BREAKPOINT_KEY,\n GuardrailError,\n SCRATCHPAD_KEY,\n isGuardrailError,\n orchestratorBridgeSchema,\n} from \"./types.js\";\n\nimport type {\n BreakpointConfig,\n BreakpointContext,\n BreakpointModifications,\n BreakpointRequest,\n MultiAgentBreakpointType,\n} from \"./breakpoints.js\";\nimport {\n MAX_BREAKPOINT_HISTORY,\n createBreakpointId,\n createInitialBreakpointState,\n matchBreakpoint,\n} from \"./breakpoints.js\";\nimport {\n type Checkpoint,\n type CheckpointStore,\n type MultiAgentCheckpointLocalState,\n createCheckpointId,\n validateCheckpoint,\n} from \"./checkpoint.js\";\nimport {\n type MultiplexedStreamResult,\n mergeTaggedStreams,\n} from \"./streaming.js\";\nimport {\n type SafeParseable,\n extractJsonFromOutput,\n withStructuredOutput,\n} from \"./structured-output.js\";\n\n// ============================================================================\n/** Safe JSON.stringify that handles circular refs or throwing toJSON */\nfunction safeStringify(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/** Shallow structural equality for change detection (plain objects, arrays, and primitives) */\nfunction shallowEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) {\n return true;\n }\n\n if (typeof a !== typeof b || a === null || b === null) {\n return false;\n }\n\n if (typeof a !== \"object\") {\n return false;\n }\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== (b as unknown[]).length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== (b as unknown[])[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n for (const key of aKeys) {\n if (aObj[key] !== bObj[key]) {\n return false;\n }\n }\n\n return true;\n}\n\n// Async Semaphore (for slot acquisition without polling)\n// ============================================================================\n\n// ============================================================================\n// Checkpoint Utility Functions\n// ============================================================================\n\n/**\n * Get the current step/round/iteration count from a pattern checkpoint state.\n *\n * Maps each pattern type to its natural progress counter: `step` for sequential\n * and goal, `round` for supervisor and debate, `iteration` for reflect, and\n * `completedCount` for DAG.\n *\n * @param state - The pattern checkpoint state to inspect.\n * @returns The current progress count for the pattern.\n */\nexport function getPatternStep(state: PatternCheckpointState): number {\n switch (state.type) {\n case \"sequential\":\n return state.step;\n case \"supervisor\":\n return state.round;\n case \"reflect\":\n return state.iteration;\n case \"debate\":\n return state.round;\n case \"dag\":\n return state.completedCount;\n case \"goal\":\n return state.step;\n }\n}\n\n/**\n * Compute progress metrics from a pattern checkpoint state.\n *\n * Returns percentage complete, steps completed/remaining, tokens consumed,\n * and estimated tokens remaining (when computable). Each pattern type\n * calculates these metrics from its own state structure.\n *\n * @param state - The pattern checkpoint state to analyze.\n * @returns A {@link CheckpointProgress} object with completion metrics.\n */\nexport function getCheckpointProgress(\n state: PatternCheckpointState,\n): CheckpointProgress {\n const stepsCompleted = getPatternStep(state);\n const stepsTotal = state.stepsTotal ?? null;\n\n switch (state.type) {\n case \"sequential\": {\n const tokensConsumed = state.results.reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n const avgTokens =\n state.results.length > 0 ? tokensConsumed / state.results.length : 0;\n const remaining = stepsTotal != null ? stepsTotal - stepsCompleted : null;\n\n return {\n percentage:\n stepsTotal != null && stepsTotal > 0\n ? Math.round((stepsCompleted / stepsTotal) * 100)\n : 0,\n stepsCompleted,\n stepsTotal,\n tokensConsumed,\n estimatedTokensRemaining:\n avgTokens > 0 && remaining != null\n ? Math.round(avgTokens * remaining)\n : null,\n estimatedStepsRemaining: remaining,\n };\n }\n\n case \"supervisor\": {\n const tokensConsumed = state.workerResults.reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n const remaining = stepsTotal != null ? stepsTotal - stepsCompleted : null;\n\n return {\n percentage:\n stepsTotal != null && stepsTotal > 0\n ? Math.round((stepsCompleted / stepsTotal) * 100)\n : 0,\n stepsCompleted,\n stepsTotal,\n tokensConsumed,\n estimatedTokensRemaining: null,\n estimatedStepsRemaining: remaining,\n };\n }\n\n case \"reflect\": {\n const tokensConsumed = state.history.reduce(\n (sum, h) => sum + h.producerTokens + h.evaluatorTokens,\n 0,\n );\n const remaining = stepsTotal != null ? stepsTotal - stepsCompleted : null;\n\n return {\n percentage:\n stepsTotal != null && stepsTotal > 0\n ? Math.round((stepsCompleted / stepsTotal) * 100)\n : 0,\n stepsCompleted,\n stepsTotal,\n tokensConsumed,\n estimatedTokensRemaining: null,\n estimatedStepsRemaining: remaining,\n };\n }\n\n case \"debate\": {\n const tokensConsumed = state.tokensConsumed;\n const remaining = stepsTotal != null ? stepsTotal - stepsCompleted : null;\n\n return {\n percentage:\n stepsTotal != null && stepsTotal > 0\n ? Math.round((stepsCompleted / stepsTotal) * 100)\n : 0,\n stepsCompleted,\n stepsTotal,\n tokensConsumed,\n estimatedTokensRemaining: null,\n estimatedStepsRemaining: remaining,\n };\n }\n\n case \"dag\": {\n const total = stepsTotal ?? Object.keys(state.statuses).length;\n const completed = state.completedCount;\n const tokensConsumed = Object.values(state.nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n const avgTokens = completed > 0 ? tokensConsumed / completed : 0;\n const remaining = total - completed;\n\n return {\n percentage: total > 0 ? Math.round((completed / total) * 100) : 0,\n stepsCompleted: completed,\n stepsTotal: total,\n tokensConsumed,\n estimatedTokensRemaining:\n remaining > 0 ? Math.round(avgTokens * remaining) : 0,\n estimatedStepsRemaining: remaining,\n };\n }\n\n case \"goal\": {\n const tokensConsumed = Object.values(state.nodeOutputs).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n const satisfaction = state.lastSatisfaction;\n\n return {\n percentage: Math.round(satisfaction * 100),\n stepsCompleted,\n stepsTotal: stepsTotal ?? null,\n tokensConsumed,\n estimatedTokensRemaining: null,\n estimatedStepsRemaining:\n state.stepMetrics.length > 0 ? estimateGoalSteps(state) : null,\n };\n }\n }\n}\n\nfunction estimateGoalSteps(state: GoalCheckpointState): number | null {\n const metrics = state.stepMetrics;\n if (metrics.length < 2) {\n return null;\n }\n\n const remaining = 1.0 - state.lastSatisfaction;\n if (remaining <= 0) {\n return 0;\n }\n\n // Average satisfaction delta\n const totalDelta = metrics.reduce(\n (sum, m) => sum + Math.max(0, m.satisfactionDelta),\n 0,\n );\n const avgDelta = totalDelta / metrics.length;\n if (avgDelta <= 0) {\n return null;\n }\n\n return Math.ceil(remaining / avgDelta);\n}\n\n/**\n * Compute the diff between two checkpoint states of the same pattern type.\n *\n * Returns the delta in steps, tokens, and time between checkpoints.\n * Useful for understanding how much progress occurred between saves.\n *\n * @param a - The earlier checkpoint state.\n * @param b - The later checkpoint state.\n * @returns A {@link CheckpointDiff} with step, token, and time deltas.\n * @throws If the two checkpoints have different pattern types.\n */\nexport function diffCheckpoints(\n a: PatternCheckpointState,\n b: PatternCheckpointState,\n): CheckpointDiff {\n if (a.type !== b.type) {\n throw new Error(\n `[Directive Checkpoint] Cannot diff different pattern types: ${a.type} vs ${b.type}`,\n );\n }\n\n const getTokens = (s: PatternCheckpointState): number => {\n switch (s.type) {\n case \"sequential\":\n return s.results.reduce((sum, r) => sum + r.totalTokens, 0);\n case \"supervisor\":\n return s.workerResults.reduce((sum, r) => sum + r.totalTokens, 0);\n case \"reflect\":\n return s.history.reduce(\n (sum, h) => sum + h.producerTokens + h.evaluatorTokens,\n 0,\n );\n case \"debate\":\n return s.tokensConsumed;\n case \"dag\":\n return Object.values(s.nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n case \"goal\":\n return Object.values(s.nodeOutputs).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n }\n };\n\n const diff: CheckpointDiff = {\n patternType: a.type,\n stepDelta: getPatternStep(b) - getPatternStep(a),\n tokensDelta: getTokens(b) - getTokens(a),\n };\n\n // Add facts diff for goal pattern\n if (a.type === \"goal\" && b.type === \"goal\") {\n const aKeys = new Set(Object.keys(a.facts));\n const bKeys = new Set(Object.keys(b.facts));\n const added: string[] = [];\n const removed: string[] = [];\n const changed: Array<{ key: string; before: unknown; after: unknown }> = [];\n\n for (const key of bKeys) {\n if (!aKeys.has(key)) {\n added.push(key);\n } else if (\n JSON.stringify(a.facts[key]) !== JSON.stringify(b.facts[key])\n ) {\n changed.push({ key, before: a.facts[key], after: b.facts[key] });\n }\n }\n for (const key of aKeys) {\n if (!bKeys.has(key)) {\n removed.push(key);\n }\n }\n\n diff.facts = { added, removed, changed };\n }\n\n // Add nodes completed for DAG/goal\n if (a.type === \"dag\" && b.type === \"dag\") {\n const aCompleted = new Set(\n Object.entries(a.statuses)\n .filter(([, s]) => s === \"completed\")\n .map(([id]) => id),\n );\n diff.nodesCompleted = Object.entries(b.statuses)\n .filter(([id, s]) => s === \"completed\" && !aCompleted.has(id))\n .map(([id]) => id);\n }\n\n if (a.type === \"goal\" && b.type === \"goal\") {\n const aCompleted = new Set(a.completedNodes);\n diff.nodesCompleted = b.completedNodes.filter((id) => !aCompleted.has(id));\n }\n\n return diff;\n}\n\n/**\n * Fork an orchestrator from a checkpoint — creates a new independent orchestrator\n * restored to the checkpoint's state, ready to diverge from that point.\n *\n * @param options - The original orchestrator options used to create the orchestrator\n * @param checkpointStore - The checkpoint store containing the checkpoint\n * @param checkpointId - The ID of the checkpoint to fork from\n * @returns A new independent MultiAgentOrchestrator restored to checkpoint state\n *\n * @example\n * ```typescript\n * const forked = await forkFromCheckpoint(orchestratorOptions, store, \"ckpt_abc123\");\n * const result = await forked.replay(\"ckpt_abc123\", pattern, { input: \"new input\" });\n * ```\n */\nexport async function forkFromCheckpoint(\n options: MultiAgentOrchestratorOptions,\n checkpointStore: CheckpointStore,\n checkpointId: string,\n): Promise<MultiAgentOrchestrator> {\n const checkpoint = await checkpointStore.load(checkpointId);\n if (!checkpoint) {\n throw new Error(\n `[Directive MultiAgent] Checkpoint not found: ${checkpointId}`,\n );\n }\n\n // Deep-clone the checkpoint so the forked orchestrator is fully independent\n const cloned = structuredClone(checkpoint);\n\n const forked = createMultiAgentOrchestrator({\n ...options,\n checkpointStore,\n });\n\n forked.restore(cloned);\n\n return forked;\n}\n\n/**\n * Async semaphore for controlling concurrent access.\n * Uses a queue-based approach instead of polling for efficiency.\n *\n * @example\n * ```typescript\n * import { Semaphore } from '@directive-run/ai';\n *\n * const sem = new Semaphore(3); // Allow 3 concurrent operations\n *\n * async function doWork() {\n * const release = await sem.acquire();\n * try {\n * await performWork();\n * } finally {\n * release();\n * }\n * }\n * ```\n */\nexport class Semaphore {\n private count: number;\n private readonly maxPermits: number;\n private readonly queue: Array<{\n resolve: (release: () => void) => void;\n reject: (error: Error) => void;\n }> = [];\n\n constructor(max: number) {\n if (max < 1 || !Number.isFinite(max)) {\n throw new Error(\n `[Directive Semaphore] Invalid max permits: ${max}. Must be a finite number >= 1.`,\n );\n }\n this.maxPermits = max;\n this.count = max;\n }\n\n /** Create a one-shot release function that guards against double-release */\n private createReleaseFn(): () => void {\n let released = false;\n\n return () => {\n if (released) {\n return;\n }\n released = true;\n this.release();\n };\n }\n\n /** Acquire a permit, optionally with abort signal support */\n async acquire(signal?: AbortSignal): Promise<() => void> {\n if (signal?.aborted) {\n throw new Error(\"[Directive Semaphore] Aborted before acquiring permit\");\n }\n if (this.count > 0) {\n this.count--;\n\n return this.createReleaseFn();\n }\n\n return new Promise<() => void>((resolve, reject) => {\n let onAbort: (() => void) | undefined;\n\n const entry = {\n resolve: (releaseFn: () => void) => {\n if (onAbort && signal) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n resolve(releaseFn);\n },\n reject,\n };\n this.queue.push(entry);\n\n if (signal) {\n onAbort = () => {\n const idx = this.queue.indexOf(entry);\n if (idx >= 0) {\n this.queue.splice(idx, 1);\n reject(\n new Error(\n \"[Directive Semaphore] Aborted while waiting for permit\",\n ),\n );\n }\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n }\n\n /** Non-blocking acquire — returns null if no permits available */\n tryAcquire(): (() => void) | null {\n if (this.count > 0) {\n this.count--;\n\n return this.createReleaseFn();\n }\n\n return null;\n }\n\n private release(): void {\n this.count++;\n const next = this.queue.shift();\n if (next) {\n this.count--;\n next.resolve(this.createReleaseFn());\n }\n }\n\n /** Get current available permits */\n get available(): number {\n return this.count;\n }\n\n /** Get number of waiters in queue */\n get waiting(): number {\n return this.queue.length;\n }\n\n /** Get maximum permits */\n get max(): number {\n return this.maxPermits;\n }\n\n /** Reject all pending waiters with an error and reset permits */\n drain(): void {\n const err = new Error(\n \"[Directive Semaphore] Semaphore drained - all pending acquisitions rejected\",\n );\n const pending = this.queue.splice(0, this.queue.length);\n for (const waiter of pending) {\n waiter.reject(err);\n }\n this.count = this.maxPermits;\n }\n}\n\n// ============================================================================\n// Agent Registry Types\n// ============================================================================\n\n/** Configuration for a registered agent */\nexport interface AgentRegistration {\n /** The agent instance */\n agent: AgentLike;\n /** Maximum concurrent runs for this agent. @default 1 */\n maxConcurrent?: number;\n /** Timeout for agent runs (ms) */\n timeout?: number;\n /** Custom run options */\n runOptions?: Omit<RunOptions, \"signal\">;\n /** Description for constraint-based selection */\n description?: string;\n /** Capabilities this agent has */\n capabilities?: string[];\n /** Per-agent guardrails (applied in addition to orchestrator-level guardrails) */\n guardrails?: {\n input?: Array<\n GuardrailFn<InputGuardrailData> | NamedGuardrail<InputGuardrailData>\n >;\n output?: Array<\n GuardrailFn<OutputGuardrailData> | NamedGuardrail<OutputGuardrailData>\n >;\n toolCall?: Array<\n GuardrailFn<ToolCallGuardrailData> | NamedGuardrail<ToolCallGuardrailData>\n >;\n };\n /** Per-agent retry config (overrides orchestrator-level agentRetry) */\n retry?: AgentRetryConfig;\n /** Per-agent constraints */\n constraints?: Record<string, OrchestratorConstraint<Record<string, unknown>>>;\n /** Per-agent resolvers */\n resolvers?: Record<\n string,\n OrchestratorResolver<Record<string, unknown>, Requirement>\n >;\n /** Per-agent memory (overrides orchestrator-level memory) */\n memory?: AgentMemory;\n /** Per-agent circuit breaker (overrides orchestrator-level circuitBreaker) */\n circuitBreaker?: CircuitBreaker;\n /** Per-agent output schema for structured output */\n outputSchema?: SafeParseable<unknown>;\n /** Max retries for structured output validation. @default 2 */\n maxSchemaRetries?: number;\n /** Custom JSON extractor for structured output */\n extractJson?: (output: string) => unknown;\n /** Description of the schema for structured output prompting */\n schemaDescription?: string;\n}\n\n/** Agent registry configuration */\nexport interface AgentRegistry {\n [agentId: string]: AgentRegistration;\n}\n\n// ============================================================================\n// Execution Pattern Types\n// ============================================================================\n\n/** Parallel execution pattern - run handlers concurrently and merge results */\nexport interface ParallelPattern<T = unknown> {\n type: \"parallel\";\n /** Handler IDs (agents or tasks) to run in parallel (can repeat for multiple instances) */\n handlers: string[];\n /** Function to merge results from all handlers */\n merge: (results: RunResult<unknown>[]) => T | Promise<T>;\n /** Minimum successful results required. @default handlers.length */\n minSuccess?: number;\n /** Overall timeout (ms) */\n timeout?: number;\n}\n\n/** Sequential execution pattern - pipeline of handlers */\nexport interface SequentialPattern<T = unknown> {\n type: \"sequential\";\n /** Handler IDs (agents or tasks) in execution order */\n handlers: string[];\n /** Transform output to next input. @default JSON.stringify */\n transform?: (output: unknown, handlerId: string, index: number) => string;\n /** Final result extractor */\n extract?: (output: unknown) => T;\n /** Continue on error. @default false */\n continueOnError?: boolean;\n /** Checkpoint configuration for mid-execution fault tolerance */\n checkpoint?: PatternCheckpointConfig;\n}\n\n/** Supervisor pattern - one agent directs others */\nexport interface SupervisorPattern<T = unknown> {\n type: \"supervisor\";\n /** Supervisor agent ID */\n supervisor: string;\n /** Worker agent IDs */\n workers: string[];\n /** Maximum delegation rounds. @default 5 */\n maxRounds?: number;\n /** Extract final result */\n extract?: (\n supervisorOutput: unknown,\n workerResults: RunResult<unknown>[],\n ) => T;\n /** Checkpoint configuration for mid-execution fault tolerance */\n checkpoint?: PatternCheckpointConfig;\n}\n\n/** Record of a single reflection iteration (for score history) */\nexport interface ReflectIterationRecord {\n iteration: number;\n passed: boolean;\n score?: number;\n feedback?: string;\n durationMs: number;\n producerTokens: number;\n evaluatorTokens: number;\n}\n\n/**\n * Reflect pattern - produce, evaluate, retry with feedback.\n * @see reflect — factory helper\n * @see ReflectIterationRecord — per-iteration history entries\n */\nexport interface ReflectPattern<T = unknown> {\n type: \"reflect\";\n /** Producer handler ID (agent or task) */\n handler: string;\n /** Evaluator agent ID (receives output as input) */\n evaluator: string;\n /** Maximum iterations. @default 2 */\n maxIterations?: number;\n /** Parse evaluator output into ReflectionEvaluation. @default JSON.parse */\n parseEvaluation?: (output: unknown) => ReflectionEvaluation;\n /** Build retry input from original input + feedback */\n buildRetryInput?: (\n input: string,\n feedback: string,\n iteration: number,\n ) => string;\n /** Extract result from raw producer output. Unlike race's extract (which receives RunResult), this receives the output directly since the producer is already selected. */\n extract?: (output: unknown) => T;\n /** Behavior when maxIterations exhausted. @default \"accept-last\" */\n onExhausted?: \"accept-last\" | \"accept-best\" | \"throw\";\n /** Callback fired after each iteration with score/feedback data. @see ReflectIterationRecord */\n onIteration?: (record: ReflectIterationRecord) => void;\n /** AbortSignal for external cancellation of the reflection loop */\n signal?: AbortSignal;\n /** Overall timeout (ms). Creates an internal AbortSignal. */\n timeout?: number;\n /** Score threshold for acceptance. Number or function of iteration. When set, evaluator score >= threshold is treated as passed. */\n threshold?: number | ((iteration: number) => number);\n /** Checkpoint configuration for mid-execution fault tolerance */\n checkpoint?: PatternCheckpointConfig;\n}\n\n/**\n * Race pattern - first successful agent wins, rest cancelled.\n * @see race — factory helper\n * @see RaceResult — return type\n */\nexport interface RacePattern<T = unknown> {\n type: \"race\";\n /** Handler IDs (agents or tasks) to race */\n handlers: string[];\n /** Extract result from winning RunResult (receives full RunResult for access to tokens/metadata). @default output field */\n extract?: (result: RunResult<unknown>) => T;\n /** Overall timeout (ms) */\n timeout?: number;\n /** Require N successful results before resolving. @default 1 */\n minSuccess?: number;\n /** AbortSignal for external cancellation */\n signal?: AbortSignal;\n}\n\n/** Return type from debate pattern execution */\nexport interface DebateResult<T = unknown> {\n winnerId: string;\n result: T;\n rounds: Array<{\n proposals: Array<{ agentId: string; output: unknown }>;\n judgement: { winnerId: string; feedback?: string; score?: number };\n }>;\n}\n\n/** Individual result entry returned when minSuccess > 1 */\nexport interface RaceSuccessEntry<T = unknown> {\n agentId: string;\n result: T;\n}\n\n/** Return type from race pattern execution */\nexport interface RaceResult<T = unknown> {\n winnerId: string;\n result: T;\n allResults?: Array<RaceSuccessEntry<T>>;\n}\n\n/**\n * Debate pattern - agents compete, evaluator judges across rounds.\n * @see debate — factory helper\n * @see runDebate — imperative API\n * @see DebateResult — return type\n */\nexport interface DebatePattern<T = unknown> {\n type: \"debate\";\n /** Handler IDs (agents or tasks) that will generate competing proposals */\n handlers: string[];\n /** Evaluator agent ID that judges proposals */\n evaluator: string;\n /** Maximum rounds of debate. @default 2 */\n maxRounds?: number;\n /** Extract final result from the winning proposal */\n extract?: (output: unknown) => T;\n /** Parse evaluator output. @default JSON.parse expecting `{ winnerId, feedback }` */\n parseJudgement?: (output: unknown) => {\n winnerId: string;\n feedback?: string;\n score?: number;\n };\n /** AbortSignal for external cancellation */\n signal?: AbortSignal;\n /** Overall timeout (ms). Creates an internal AbortSignal. */\n timeout?: number;\n /** Checkpoint configuration for mid-execution fault tolerance */\n checkpoint?: PatternCheckpointConfig;\n}\n\n/** Re-export types consumed by tests / external consumers */\nexport type { DagPattern, DagExecutionContext } from \"./types.js\";\n\n/** Re-export goal types consumed by tests / external consumers */\nexport type {\n GoalPattern,\n GoalNode,\n GoalResult,\n GoalStepMetrics,\n GoalMetrics,\n AgentSelectionStrategy,\n RelaxationTier,\n RelaxationStrategy,\n RelaxationRecord,\n RelaxationContext,\n} from \"./types.js\";\n\n/** Union of all patterns */\nexport type ExecutionPattern<T = unknown> =\n | ParallelPattern<T>\n | SequentialPattern<T>\n | SupervisorPattern<T>\n | DagPattern<T>\n | ReflectPattern<T>\n | RacePattern<T>\n | DebatePattern<T>\n | GoalPattern<T>;\n\n// ============================================================================\n// Handoff Types\n// ============================================================================\n\n/** Handoff request between agents */\nexport interface HandoffRequest {\n id: string;\n fromAgent: string;\n toAgent: string;\n input: string;\n context?: Record<string, unknown>;\n requestedAt: number;\n}\n\n/** Handoff result */\nexport interface HandoffResult {\n request: HandoffRequest;\n result: RunResult<unknown>;\n completedAt: number;\n}\n\n// ============================================================================\n// Multi-Agent Orchestrator Types\n// ============================================================================\n\n/** Run agent requirement */\nexport interface RunAgentRequirement extends Requirement {\n type: \"RUN_AGENT\";\n agent: string;\n input: string;\n context?: Record<string, unknown>;\n}\n\n/** Read-only context passed to task functions */\nexport interface TaskContext {\n /** The ID of this task */\n taskId: string;\n /** Conversation history from orchestrator memory (read-only deep copy) */\n memory: ReadonlyArray<{ role: string; content: string }>;\n /** Current scratchpad state (read-only deep copy) */\n scratchpad: Readonly<Record<string, unknown>>;\n /** Read the state of any registered agent or task (status, lastOutput, lastError, totalTokens) */\n readAgentState: (nodeId: string) =>\n | Readonly<{\n status: string;\n lastOutput?: string;\n lastError?: string;\n totalTokens: number;\n }>\n | undefined;\n /** Report intermediate progress (0-100) for DevTools timeline */\n reportProgress: (percent: number, message?: string) => void;\n}\n\n/** Configuration for a registered task (imperative code) */\nexport interface TaskRegistration {\n /** The function to execute. Receives input, abort signal, and context. */\n run: (\n input: string,\n signal: AbortSignal,\n context: TaskContext,\n ) => unknown | Promise<unknown>;\n /** Display label for DevTools graph. Defaults to task ID. */\n label?: string;\n /** Description for DevTools tooltip/detail panel. */\n description?: string;\n /** Timeout (ms) */\n timeout?: number;\n /** Max concurrent executions of this task. @default 1 */\n maxConcurrent?: number;\n /** Optional retry configuration for transient failures */\n retry?: {\n /** Max number of attempts (including the first try) */\n attempts: number;\n /** Backoff strategy between retries. @default 'fixed' */\n backoff?: \"fixed\" | \"exponential\";\n /** Base delay between retries (ms). @default 1000 */\n delayMs?: number;\n };\n}\n\n/** Multi-agent orchestrator options */\nexport interface MultiAgentOrchestratorOptions {\n /** Base run function */\n runner: AgentRunner;\n /** Registered agents */\n agents: AgentRegistry;\n /** Imperative code tasks, referenced by ID in patterns (same namespace as agents) */\n tasks?: Record<string, TaskRegistration>;\n /** Execution patterns */\n patterns?: Record<string, ExecutionPattern>;\n /** Handoff callbacks */\n onHandoff?: (request: HandoffRequest) => void;\n /** Handoff completion callbacks */\n onHandoffComplete?: (result: HandoffResult) => void;\n /** Maximum number of handoff results to retain. @default 1000 */\n maxHandoffHistory?: number;\n /** Debug mode — `true` for default debug, or config object for advanced options */\n debug?: boolean | import(\"./types.js\").OrchestratorDebugConfig;\n /** Orchestrator-level guardrails (applied to all agents) */\n guardrails?: GuardrailsConfig;\n /** Lifecycle hooks */\n hooks?: MultiAgentLifecycleHooks;\n /** Shared memory across all agents */\n memory?: AgentMemory;\n /** Default retry config for all agents (per-agent overrides this) */\n agentRetry?: AgentRetryConfig;\n /** Maximum token budget across all agent runs */\n maxTokenBudget?: number;\n /** Fires when token usage reaches this percentage of maxTokenBudget (0-1). @default 0.8 */\n budgetWarningThreshold?: number;\n /** Callback when budget warning threshold is reached */\n onBudgetWarning?: (event: {\n currentTokens: number;\n maxBudget: number;\n percentage: number;\n }) => void;\n /** Plugins to attach to the underlying Directive System */\n plugins?: Plugin[];\n /** Callback for approval requests */\n onApprovalRequest?: (request: ApprovalRequest) => void;\n /** Auto-approve tool calls. @default true */\n autoApproveToolCalls?: boolean;\n /** Approval timeout in milliseconds. @default 300000 */\n approvalTimeoutMs?: number;\n /** Orchestrator-level constraints */\n constraints?: Record<string, OrchestratorConstraint<Record<string, unknown>>>;\n /** Orchestrator-level resolvers */\n resolvers?: Record<\n string,\n OrchestratorResolver<Record<string, unknown>, Requirement>\n >;\n /** Orchestrator-level circuit breaker */\n circuitBreaker?: CircuitBreaker;\n /** Self-healing configuration for automatic agent rerouting */\n selfHealing?: MultiAgentSelfHealingConfig;\n /** Checkpoint store for persistent state */\n checkpointStore?: CheckpointStore;\n /** Breakpoints for human-in-the-loop pause/inspect/modify */\n breakpoints?: BreakpointConfig<MultiAgentBreakpointType>[];\n /** Callback when a breakpoint fires */\n onBreakpoint?: (request: BreakpointRequest) => void;\n /** Timeout for breakpoint resolution (ms). @default 300000 */\n breakpointTimeoutMs?: number;\n /** Cross-agent derivation functions — compute values from combined agent states */\n derive?: Record<string, CrossAgentDerivationFn>;\n /** Shared scratchpad configuration */\n scratchpad?: { init: Record<string, unknown> };\n}\n\n/** Multi-agent state in facts */\nexport interface MultiAgentState {\n /** Namespace for each agent's state */\n __agents: Record<\n string,\n {\n status: \"idle\" | \"running\" | \"completed\" | \"error\";\n lastInput?: string;\n lastOutput?: unknown;\n lastError?: string;\n runCount: number;\n totalTokens: number;\n }\n >;\n /** Pending handoffs */\n __handoffs: HandoffRequest[];\n /** Completed handoffs */\n __handoffResults: HandoffResult[];\n}\n\n/** Per-call options for multi-agent runAgent/run */\nexport interface MultiAgentRunCallOptions extends RunOptions {\n /** Override structured output schema for this call. Set to `null` to opt out of per-agent schema. */\n outputSchema?: SafeParseable<unknown> | null;\n /** Override max schema retries for this call. */\n maxSchemaRetries?: number;\n /** Pattern ID that initiated this run (for lifecycle hooks). Set internally by pattern executors. */\n patternId?: string;\n}\n\n/** Multi-agent orchestrator instance */\nexport interface MultiAgentOrchestrator {\n /** The underlying Directive System */\n // biome-ignore lint/suspicious/noExplicitAny: System type varies per configuration\n system: System<any>;\n /** Combined facts from all agent modules + coordinator */\n facts: Record<string, unknown>;\n /** Run a single agent */\n runAgent<T>(\n agentId: string,\n input: string,\n options?: MultiAgentRunCallOptions,\n ): Promise<RunResult<T>>;\n /** Run an agent with streaming support */\n runAgentStream<T>(\n agentId: string,\n input: string,\n options?: { signal?: AbortSignal },\n ): OrchestratorStreamResult<T>;\n /**\n * Run an execution pattern by its registered pattern ID.\n *\n * Note: For race and debate patterns, `runPattern` returns only the extracted result value.\n * Use `runRace()` or `runDebate()` to access full results including `winnerId` and `allResults`.\n */\n runPattern<T>(patternId: string, input: string): Promise<T>;\n /** Run agents in parallel. Note: parallel does not support checkpoint/resume (single-step pattern). */\n runParallel<T>(\n agentIds: string[],\n inputs: string | string[],\n merge: (results: RunResult<unknown>[]) => T | Promise<T>,\n options?: { minSuccess?: number; timeout?: number },\n ): Promise<T>;\n /** Run agents sequentially */\n runSequential<T>(\n agentIds: string[],\n initialInput: string,\n options?: {\n transform?: (output: unknown, agentId: string, index: number) => string;\n },\n ): Promise<RunResult<T>[]>;\n /** Request a handoff between agents */\n handoff(\n fromAgent: string,\n toAgent: string,\n input: string,\n context?: Record<string, unknown>,\n ): Promise<RunResult<unknown>>;\n /** Approve a pending request */\n approve(requestId: string): void;\n /** Reject a pending request */\n reject(requestId: string, reason?: string): void;\n /** Pause all agents */\n pause(): void;\n /** Resume agents */\n resume(): void;\n /** Total tokens consumed across all agents */\n readonly totalTokens: number;\n /** Wait until all agents are idle */\n waitForIdle(timeoutMs?: number): Promise<void>;\n /** Alias for runAgent */\n run<T>(\n agentId: string,\n input: string,\n options?: MultiAgentRunCallOptions,\n ): Promise<RunResult<T>>;\n /** Alias for runAgentStream */\n runStream<T>(\n agentId: string,\n input: string,\n options?: { signal?: AbortSignal },\n ): OrchestratorStreamResult<T>;\n /** Register a new agent dynamically */\n registerAgent(agentId: string, registration: AgentRegistration): void;\n /** Unregister an agent (must be idle) */\n unregisterAgent(agentId: string): void;\n /** Get registered agent IDs */\n getAgentIds(): string[];\n /** Register a new task dynamically */\n registerTask(taskId: string, registration: TaskRegistration): void;\n /** Unregister a task */\n unregisterTask(taskId: string): void;\n /** Get registered task IDs */\n getTaskIds(): string[];\n /** Get task registry info (labels + descriptions) */\n getTaskRegistry(): Record<string, { label?: string; description?: string }>;\n /** Get task state */\n getTaskState(taskId: string):\n | {\n status: string;\n lastOutput?: unknown;\n lastError?: string;\n startTime?: number;\n durationMs?: number;\n }\n | undefined;\n /** Get all task states */\n getAllTaskStates(): Record<\n string,\n {\n status: string;\n lastOutput?: unknown;\n lastError?: string;\n startTime?: number;\n durationMs?: number;\n }\n >;\n /** Get all handler IDs (agents + tasks combined) */\n getNodeIds(): string[];\n /** Get agent state */\n getAgentState(\n agentId: string,\n ): MultiAgentState[\"__agents\"][string] | undefined;\n /** Get all agent states */\n getAllAgentStates(): Record<string, MultiAgentState[\"__agents\"][string]>;\n /** Get pending handoffs */\n getPendingHandoffs(): HandoffRequest[];\n /** Reset all agent states */\n reset(): void;\n /** Debug timeline (null when debug is false) */\n readonly timeline: DebugTimeline | null;\n /** Health monitor (null when selfHealing is not configured) */\n readonly healthMonitor: HealthMonitor | null;\n /** Create a checkpoint of the current state */\n checkpoint(options?: { label?: string }): Promise<Checkpoint>;\n /** Restore from a checkpoint */\n restore(\n checkpoint: Checkpoint,\n options?: { restoreTimeline?: boolean },\n ): void;\n /** Run multiple agents with multiplexed streaming */\n runParallelStream<T>(\n agentIds: string[],\n inputs: string | string[],\n merge: (results: RunResult<unknown>[]) => T | Promise<T>,\n options?: { minSuccess?: number; timeout?: number; signal?: AbortSignal },\n ): MultiplexedStreamResult<T>;\n /** Resume a paused breakpoint */\n resumeBreakpoint(id: string, modifications?: BreakpointModifications): void;\n /** Cancel a paused breakpoint */\n cancelBreakpoint(id: string, reason?: string): void;\n /** Get pending breakpoints */\n getPendingBreakpoints(): BreakpointRequest[];\n /** Race multiple agents — first successful result wins, rest cancelled. Note: race does not support checkpoint/resume (single-step pattern). */\n runRace<T>(\n agentIds: string[],\n input: string,\n options?: {\n extract?: (result: RunResult<unknown>) => T;\n timeout?: number;\n minSuccess?: number;\n signal?: AbortSignal;\n },\n ): Promise<RaceResult<T>>;\n /** Run a reflect pattern imperatively (no pre-registration needed) */\n runReflect<T>(\n producerId: string,\n evaluatorId: string,\n input: string,\n options?: {\n maxIterations?: number;\n parseEvaluation?: (output: unknown) => ReflectionEvaluation;\n buildRetryInput?: (\n input: string,\n feedback: string,\n iteration: number,\n ) => string;\n extract?: (output: unknown) => T;\n onExhausted?: \"accept-last\" | \"accept-best\" | \"throw\";\n onIteration?: (record: ReflectIterationRecord) => void;\n signal?: AbortSignal;\n timeout?: number;\n threshold?: number | ((iteration: number) => number);\n },\n ): Promise<{\n result: T;\n iterations: number;\n history: ReflectIterationRecord[];\n exhausted: boolean;\n }>;\n /** Run a debate imperatively (no pre-registration needed) */\n runDebate<T>(\n agentIds: string[],\n evaluatorId: string,\n input: string,\n options?: {\n maxRounds?: number;\n extract?: (output: unknown) => T;\n parseJudgement?: (output: unknown) => {\n winnerId: string;\n feedback?: string;\n score?: number;\n };\n signal?: AbortSignal;\n timeout?: number;\n },\n ): Promise<DebateResult<T>>;\n /** Run a goal pattern imperatively — declare desired state, let the runtime resolve */\n runGoal<T>(\n nodes: Record<string, GoalNode>,\n initialInput: string | Record<string, unknown>,\n when: (facts: Record<string, unknown>) => boolean,\n options?: {\n satisfaction?: (facts: Record<string, unknown>) => number;\n maxSteps?: number;\n extract?: (facts: Record<string, unknown>) => T;\n timeout?: number;\n signal?: AbortSignal;\n selectionStrategy?: AgentSelectionStrategy;\n relaxation?: RelaxationTier[];\n onStep?: GoalPattern[\"onStep\"];\n onStall?: GoalPattern[\"onStall\"];\n checkpoint?: PatternCheckpointConfig;\n },\n ): Promise<GoalResult<T>>;\n /** Resume a goal pattern from a saved checkpoint */\n resumeGoal<T>(\n checkpointState: GoalCheckpointState,\n pattern: GoalPattern<T>,\n ): Promise<GoalResult<T>>;\n /** Resume a sequential pattern from a saved checkpoint */\n resumeSequential<T>(\n checkpointState: SequentialCheckpointState,\n pattern: SequentialPattern<T>,\n ): Promise<T>;\n /** Resume a supervisor pattern from a saved checkpoint */\n resumeSupervisor<T>(\n checkpointState: SupervisorCheckpointState,\n pattern: SupervisorPattern<T>,\n options?: { input?: string },\n ): Promise<T>;\n /** Resume a reflect pattern from a saved checkpoint */\n resumeReflect<T>(\n checkpointState: ReflectCheckpointState,\n pattern: ReflectPattern<T>,\n options?: { input?: string },\n ): Promise<T>;\n /** Resume a debate pattern from a saved checkpoint */\n resumeDebate<T>(\n checkpointState: DebateCheckpointState,\n pattern: DebatePattern<T>,\n ): Promise<DebateResult<T>>;\n /** Resume a DAG pattern from a saved checkpoint */\n resumeDag<T>(\n checkpointState: DagCheckpointState,\n pattern: DagPattern<T>,\n options?: { input?: string },\n ): Promise<T>;\n /** Replay from a saved checkpoint (auto-detects pattern type) */\n replay<T>(\n checkpointId: string,\n pattern: ExecutionPattern,\n options?: { input?: string },\n ): Promise<T>;\n /**\n * Get reflection iteration history from last runReflectPattern call.\n */\n getLastReflectionHistory(): ReflectIterationRecord[] | null;\n /** Cross-agent derived values (frozen snapshot). Empty when derive not configured. */\n readonly derived: Record<string, unknown>;\n /** Subscribe to cross-agent derivation changes */\n onDerivedChange(callback: (id: string, value: unknown) => void): () => void;\n /** Shared scratchpad (null when not configured) */\n readonly scratchpad: Scratchpad | null;\n /** Dispose of the orchestrator, resetting all state */\n dispose(): void;\n}\n\n/** Built-in pause requirement type */\ninterface PauseBudgetExceededReq extends Requirement {\n type: \"__PAUSE_BUDGET_EXCEEDED\";\n}\n\n/** Built-in RUN_AGENT requirement guard */\nconst isRunAgentReq = requirementGuard<RunAgentRequirement>(\"RUN_AGENT\");\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Create a multi-agent orchestrator backed by a Directive System.\n *\n * Each registered agent becomes a namespaced Directive module with reactive state,\n * constraint evaluation, guardrails, streaming, approval, memory, retry, budget,\n * hooks, and time-travel debugging -- all features at parity with {@link createAgentOrchestrator}.\n *\n * @param options - Orchestrator configuration including runner, agent registry, patterns, guardrails, and plugins.\n * @returns A {@link MultiAgentOrchestrator} instance with `runAgent`, `runPattern`, `handoff`, and checkpoint APIs.\n *\n * @example\n * ```typescript\n * const orchestrator = createMultiAgentOrchestrator({\n * runner,\n * agents: {\n * researcher: { agent: researchAgent, maxConcurrent: 3 },\n * writer: { agent: writerAgent },\n * reviewer: { agent: reviewerAgent },\n * },\n * guardrails: {\n * input: [detectPII],\n * output: [checkToxicity],\n * },\n * hooks: {\n * onAgentStart: ({ agentId, input }) => console.log(`${agentId}: ${input}`),\n * },\n * maxTokenBudget: 50000,\n * debug: true,\n * });\n *\n * // Run with full guardrails + approval + streaming\n * const result = await orchestrator.runAgent('researcher', 'What is AI?');\n *\n * // Stream agent output\n * const { stream } = orchestrator.runAgentStream('writer', 'Write about AI');\n * for await (const chunk of stream) {\n * if (chunk.type === 'token') process.stdout.write(chunk.data);\n * }\n * ```\n *\n * @throws If a pattern references an agent that is not in the registry\n * @throws If autoApproveToolCalls is false but no onApprovalRequest callback is provided\n * @public\n */\nexport function createMultiAgentOrchestrator(\n options: MultiAgentOrchestratorOptions,\n): MultiAgentOrchestrator {\n const {\n runner,\n agents: inputAgents,\n patterns = {},\n onHandoff,\n onHandoffComplete,\n maxHandoffHistory = 1000,\n debug: rawDebug = false,\n guardrails = {},\n hooks = {},\n memory: sharedMemory,\n agentRetry: defaultAgentRetry,\n maxTokenBudget,\n plugins = [],\n onApprovalRequest,\n autoApproveToolCalls = true,\n approvalTimeoutMs = 300000,\n constraints: userConstraints = {},\n resolvers: userResolvers = {},\n circuitBreaker: orchestratorCircuitBreaker,\n budgetWarningThreshold = 0.8,\n onBudgetWarning,\n selfHealing,\n checkpointStore,\n breakpoints: breakpointConfigs = [],\n onBreakpoint,\n breakpointTimeoutMs = 300000,\n derive: userDerivations,\n scratchpad: scratchpadConfig,\n tasks: inputTasks = {},\n } = options;\n\n // Normalize debug config\n const debug = typeof rawDebug === \"object\" ? true : !!rawDebug;\n const MAX_VERBOSE_LENGTH = 5000;\n\n // Shallow copy so registerAgent/unregisterAgent don't mutate the caller's object\n const agents: AgentRegistry = { ...inputAgents };\n\n // Task registry (shallow copy for same reason as agents)\n const tasks: Record<string, TaskRegistration> = { ...inputTasks };\n\n // Task state tracking (parallel to agentStates)\n const taskStates: Record<\n string,\n {\n status: string;\n lastOutput?: unknown;\n lastError?: string;\n startTime?: number;\n durationMs?: number;\n }\n > = Object.create(null);\n for (const taskId of Object.keys(tasks)) {\n taskStates[taskId] = { status: \"idle\" };\n }\n\n // Task semaphores are created after validation (below)\n const taskSemaphores = new Map<string, Semaphore>();\n\n // Enforce approval workflow configuration\n if (!autoApproveToolCalls && !onApprovalRequest) {\n throw new Error(\n \"[Directive MultiAgent] Invalid approval configuration: autoApproveToolCalls is false but no onApprovalRequest callback provided. \" +\n \"Tool calls would wait for approval indefinitely. Either:\\n\" +\n \" - Set autoApproveToolCalls: true to auto-approve all tool calls\\n\" +\n \" - Provide an onApprovalRequest callback to handle approvals programmatically\",\n );\n }\n\n // Validate budget warning threshold\n if (budgetWarningThreshold < 0 || budgetWarningThreshold > 1) {\n throw new Error(\n `[Directive MultiAgent] budgetWarningThreshold must be between 0 and 1, got ${budgetWarningThreshold}`,\n );\n }\n\n // Validate reserved agent IDs\n const RESERVED_IDS = new Set([\n \"__coord\",\n \"__proto__\",\n \"constructor\",\n \"prototype\",\n \"toString\",\n \"valueOf\",\n \"hasOwnProperty\",\n ]);\n for (const agentId of Object.keys(agents)) {\n if (RESERVED_IDS.has(agentId)) {\n throw new Error(\n `[Directive MultiAgent] Agent ID \"${agentId}\" is reserved and cannot be used`,\n );\n }\n }\n for (const [taskId, taskReg] of Object.entries(tasks)) {\n if (!taskId || taskId.trim() !== taskId) {\n throw new Error(\n `[Directive MultiAgent] Task ID must be a non-empty trimmed string, got \"${taskId}\"`,\n );\n }\n if (RESERVED_IDS.has(taskId)) {\n throw new Error(\n `[Directive MultiAgent] Task ID \"${taskId}\" is reserved and cannot be used`,\n );\n }\n // Validate timeout and maxConcurrent\n if (\n taskReg.timeout !== undefined &&\n (!Number.isFinite(taskReg.timeout) || taskReg.timeout <= 0)\n ) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" timeout must be a finite number > 0`,\n );\n }\n if (\n taskReg.maxConcurrent !== undefined &&\n (!Number.isFinite(taskReg.maxConcurrent) ||\n taskReg.maxConcurrent < 1 ||\n !Number.isInteger(taskReg.maxConcurrent))\n ) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" maxConcurrent must be a finite integer >= 1`,\n );\n }\n // Validate retry configuration\n if (taskReg.retry) {\n const { attempts, delayMs } = taskReg.retry;\n if (!Number.isFinite(attempts) || attempts < 1) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" retry attempts must be a finite number >= 1`,\n );\n }\n if (delayMs !== undefined && (!Number.isFinite(delayMs) || delayMs < 0)) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" retry delayMs must be a finite number >= 0`,\n );\n }\n }\n }\n\n // Create task semaphores (after validation passes)\n for (const [taskId, reg] of Object.entries(tasks)) {\n taskSemaphores.set(taskId, new Semaphore(reg.maxConcurrent ?? 1));\n }\n\n // Validate no ID collisions between agents and tasks\n for (const taskId of Object.keys(tasks)) {\n if (agents[taskId]) {\n throw new Error(\n `[Directive MultiAgent] ID \"${taskId}\" is registered as both an agent and a task. IDs must be unique across both registries.`,\n );\n }\n }\n\n // Validate that all pattern handlers exist in the combined registry\n const registeredAgentIds = new Set([\n ...Object.keys(agents),\n ...Object.keys(tasks),\n ]);\n const missingAgents: Array<{ patternId: string; agentId: string }> = [];\n\n for (const [patternId, pattern] of Object.entries(patterns)) {\n const agentsToCheck: string[] = [];\n\n switch (pattern.type) {\n case \"parallel\":\n agentsToCheck.push(...pattern.handlers);\n break;\n case \"sequential\":\n agentsToCheck.push(...pattern.handlers);\n break;\n case \"supervisor\":\n agentsToCheck.push(pattern.supervisor, ...pattern.workers);\n break;\n case \"dag\":\n for (const node of Object.values(pattern.nodes)) {\n agentsToCheck.push(node.handler);\n }\n break;\n case \"reflect\":\n agentsToCheck.push(pattern.handler, pattern.evaluator);\n break;\n case \"race\":\n agentsToCheck.push(...pattern.handlers);\n break;\n case \"debate\":\n agentsToCheck.push(\n ...(pattern as DebatePattern).handlers,\n (pattern as DebatePattern).evaluator,\n );\n break;\n }\n\n for (const agentId of agentsToCheck) {\n if (!registeredAgentIds.has(agentId)) {\n missingAgents.push({ patternId, agentId });\n }\n }\n }\n\n if (missingAgents.length > 0) {\n const details = missingAgents\n .map(\n ({ patternId, agentId }) =>\n ` - Pattern \"${patternId}\" references unknown agent \"${agentId}\"`,\n )\n .join(\"\\n\");\n throw new Error(\n `[Directive MultiAgent] Pattern validation failed. The following agents are not registered:\\n${details}\\n\\nRegistered agents: ${[...registeredAgentIds].join(\", \") || \"(none)\"}`,\n );\n }\n\n // Validate DAG patterns for cycles\n for (const [patternId, pattern] of Object.entries(patterns)) {\n if (pattern.type === \"dag\") {\n validateDagAcyclic(patternId, pattern.nodes);\n }\n }\n\n // ---- Debug Timeline setup ----\n let timeline: DebugTimeline | null = null;\n let timelinePlugin: ReturnType<typeof createDebugTimelinePlugin> | null =\n null;\n if (debug) {\n timeline = createDebugTimeline({\n getSnapshotId: () => {\n try {\n return (system as any).history?.currentIndex ?? null;\n } catch {\n return null;\n }\n },\n goToSnapshot: (snapshotId: number) => {\n try {\n (system as any).history?.goTo?.(snapshotId);\n } catch {\n // System may not support goTo\n }\n },\n });\n }\n\n // ---- Health Monitor setup ----\n let healthMonitorInstance: HealthMonitor | null = null;\n let roundRobinCounters: Map<string, number> | null = null;\n if (selfHealing) {\n healthMonitorInstance = createHealthMonitor(selfHealing.healthMonitor);\n if (selfHealing.selectionStrategy === \"round-robin\") {\n roundRobinCounters = new Map();\n }\n }\n\n /** Safe hook caller — user-provided hooks must never crash the orchestrator */\n function fireHook<K extends keyof MultiAgentLifecycleHooks>(\n name: K,\n event: Parameters<NonNullable<MultiAgentLifecycleHooks[K]>>[0],\n ): void {\n try {\n (hooks[name] as ((e: typeof event) => void) | undefined)?.(event);\n } catch (hookError) {\n if (debug) {\n console.debug(`[Directive MultiAgent] hooks.${name} threw:`, hookError);\n }\n }\n }\n\n // ---- Coordinator Module ----\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic schema construction\n const coordFacts: Record<string, any> = {\n __globalTokens: t.number(),\n __status: t.string(),\n __handoffs: t.array() as unknown as ReturnType<typeof t.array>,\n __handoffResults: t.array() as unknown as ReturnType<typeof t.array>,\n __budgetWarningFired: t.boolean(),\n };\n\n // Add scratchpad fact to coordinator schema if configured\n if (scratchpadConfig) {\n coordFacts[SCRATCHPAD_KEY] = t.object() as unknown;\n }\n\n // Add __derived bridge fact so constraints can read derivation values via facts.__derived\n if (userDerivations && Object.keys(userDerivations).length > 0) {\n coordFacts.__derived = t.object() as unknown;\n }\n\n const coordSchema = {\n facts: coordFacts,\n derivations: {},\n events: {},\n requirements: {},\n } satisfies ModuleSchema;\n\n // Convert orchestrator-level constraints\n // biome-ignore lint/suspicious/noExplicitAny: Constraint types complex\n const coordConstraints: Record<string, any> =\n convertOrchestratorConstraints(userConstraints);\n\n // Add built-in budget constraint — reads coordinator fact reactively\n if (maxTokenBudget) {\n coordConstraints.__budgetLimit = {\n priority: 100,\n // biome-ignore lint/suspicious/noExplicitAny: Facts type varies\n when: (facts: any) => {\n const tokens = getBridgeFact<number>(facts, \"__globalTokens\");\n\n return tokens > maxTokenBudget;\n },\n require: { type: \"__PAUSE_BUDGET_EXCEEDED\" } as PauseBudgetExceededReq,\n };\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Resolver types complex\n const coordResolvers: Record<string, any> = Object.create(null);\n\n // Convert user-provided orchestrator-level resolvers\n for (const [id, resolver] of Object.entries(userResolvers)) {\n coordResolvers[id] = {\n requirement: resolver.requirement,\n key: resolver.key,\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async (req: Requirement, context: any) => {\n const state = getOrchestratorState(context.facts);\n const combinedFacts = {\n ...context.facts,\n ...state,\n } as unknown as Record<string, unknown> & OrchestratorState;\n\n const resolverCtx: OrchestratorResolverContext<\n Record<string, unknown>\n > = {\n facts: combinedFacts,\n runAgent: async <T>(\n agent: AgentLike,\n input: string,\n opts?: RunOptions,\n ) => {\n return runner<T>(agent, input, opts);\n },\n signal: context.signal,\n };\n\n return resolver.resolve(req, resolverCtx);\n },\n };\n }\n\n // Built-in pause resolver\n coordResolvers.__pause = {\n requirement: requirementGuard<PauseBudgetExceededReq>(\n \"__PAUSE_BUDGET_EXCEEDED\",\n ),\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async () => {\n globalStatus = \"paused\";\n if (debug) {\n console.debug(\n \"[Directive MultiAgent] Budget exceeded — all agents paused\",\n );\n }\n },\n };\n\n // Built-in RUN_AGENT resolver\n coordResolvers.__runAgent = {\n requirement: isRunAgentReq,\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async (req: RunAgentRequirement) => {\n await runSingleAgent(req.agent, req.input);\n },\n };\n\n const coordinatorModule = createModule(\"__coord\", {\n schema: coordSchema,\n init: (facts) => {\n setBridgeFact(facts, \"__globalTokens\", 0);\n setBridgeFact(facts, \"__status\", \"idle\");\n setBridgeFact(facts, \"__handoffs\", []);\n setBridgeFact(facts, \"__handoffResults\", []);\n setBridgeFact(facts, \"__budgetWarningFired\", false);\n if (scratchpadConfig) {\n setBridgeFact(facts, SCRATCHPAD_KEY, { ...scratchpadConfig.init });\n }\n // Derived values initialized via recomputeDerivations() after system creation\n },\n constraints: coordConstraints,\n resolvers: coordResolvers as any,\n });\n\n // ---- Per-Agent Modules (as a map for createSystem) ----\n // biome-ignore lint/suspicious/noExplicitAny: Module types vary\n const modulesMap: Record<string, any> = Object.create(null);\n modulesMap.__coord = coordinatorModule;\n\n for (const [agentId, registration] of Object.entries(agents)) {\n // biome-ignore lint/suspicious/noExplicitAny: Constraint types complex\n const perAgentConstraints: Record<string, any> = registration.constraints\n ? convertOrchestratorConstraints(registration.constraints)\n : {};\n\n // Convert per-agent resolvers\n // biome-ignore lint/suspicious/noExplicitAny: Resolver types complex\n const perAgentResolvers: Record<string, any> = Object.create(null);\n if (registration.resolvers) {\n for (const [id, resolver] of Object.entries(registration.resolvers)) {\n perAgentResolvers[id] = {\n requirement: resolver.requirement,\n key: resolver.key,\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async (req: Requirement, context: any) => {\n const state = getOrchestratorState(context.facts);\n const combinedFacts = {\n ...context.facts,\n ...state,\n } as unknown as Record<string, unknown> & OrchestratorState;\n\n const resolverContext: OrchestratorResolverContext<\n Record<string, unknown>\n > = {\n facts: combinedFacts,\n runAgent: async <T>(\n agent: AgentLike,\n input: string,\n opts?: RunOptions,\n ) => {\n return runner<T>(agent, input, opts);\n },\n signal: context.signal,\n };\n\n return resolver.resolve(req, resolverContext);\n },\n };\n }\n }\n\n modulesMap[agentId] = createModule(agentId, {\n schema: orchestratorBridgeSchema,\n init: (facts) => {\n setAgentState(facts, {\n status: \"idle\",\n currentAgent: registration.agent.name,\n input: null,\n output: null,\n error: null,\n tokenUsage: 0,\n turnCount: 0,\n startedAt: null,\n completedAt: null,\n });\n setApprovalState(facts, { pending: [], approved: [], rejected: [] });\n setConversation(facts, []);\n setToolCalls(facts, []);\n setBreakpointState(facts, createInitialBreakpointState());\n },\n constraints: perAgentConstraints,\n resolvers:\n Object.keys(perAgentResolvers).length > 0\n ? (perAgentResolvers as any)\n : undefined,\n });\n }\n\n // ---- Create System ----\n const callbackPlugin = createCallbackPlugin(\n \"directive-multi-agent-callbacks\",\n {},\n );\n\n // Build plugins array with optional timeline plugin\n const allPlugins = [...plugins, callbackPlugin];\n if (debug && timeline) {\n // Create timeline plugin after system is available (uses lazy getSnapshotId)\n timelinePlugin = createDebugTimelinePlugin(timeline, () => {\n try {\n return (system as any).history?.currentIndex ?? null;\n } catch {\n return null;\n }\n });\n allPlugins.push(timelinePlugin);\n }\n\n const system = createSystem({\n modules: modulesMap,\n plugins: allPlugins,\n history: debug ? true : undefined,\n } as any);\n\n system.start();\n\n // Maximum conversation messages to retain per agent (prevent unbounded growth)\n const MAX_CONVERSATION_MESSAGES = 500;\n const MAX_TOOL_CALLS = 200;\n\n // ---- Mutable State (tracked via System facts + local) ----\n let globalTokenCount = 0;\n let globalStatus: \"idle\" | \"paused\" = \"idle\";\n let disposed = false;\n // Tracks in-flight runAgent calls (incremented synchronously before any await)\n // so waitForIdle knows when runs have been dispatched but not yet started\n let pendingRuns = 0;\n // Reflection score history — updated after each runReflectPattern call\n let lastReflectionHistory: ReflectIterationRecord[] | null = null;\n\n function assertNotDisposed(): void {\n if (disposed) {\n throw new Error(\"[Directive MultiAgent] Orchestrator has been disposed\");\n }\n }\n\n // Semaphores for concurrency control\n const semaphores = new Map<string, Semaphore>();\n for (const [agentId, reg] of Object.entries(agents)) {\n semaphores.set(agentId, new Semaphore(reg.maxConcurrent ?? 1));\n }\n\n // Agent states: lightweight local tracking for orchestrator API methods (getAgentState, etc.)\n // System facts (per-agent bridge schema) provide the rich state for constraints/resolvers/plugins.\n // Both are updated together — local state is the quick-access view, System facts drive reactivity.\n const agentStates: Record<string, MultiAgentState[\"__agents\"][string]> =\n Object.create(null);\n for (const agentId of Object.keys(agents)) {\n agentStates[agentId] = {\n status: \"idle\",\n runCount: 0,\n totalTokens: 0,\n };\n }\n\n // Handoff tracking\n const MAX_HANDOFF_RESULTS = maxHandoffHistory;\n const pendingHandoffs: HandoffRequest[] = [];\n const handoffResults: HandoffResult[] = [];\n let handoffCounter = 0;\n\n function addHandoffResult(result: HandoffResult): void {\n handoffResults.push(result);\n while (handoffResults.length > MAX_HANDOFF_RESULTS) {\n handoffResults.shift();\n }\n }\n\n // Approval request reverse index: requestId → agentId for O(1) approve/reject lookup\n const approvalRequestIndex = new Map<string, string>();\n\n // Idle waiters — notified whenever any agent's status changes\n const idleWaiters = new Set<() => void>();\n function notifyIdleWaiters(): void {\n for (const waiter of idleWaiters) {\n waiter();\n }\n }\n\n // ---- Cross-Agent Derivations ----\n const derivedValues: Record<string, unknown> = Object.create(null);\n const derivedChangeCallbacks = new Set<\n (id: string, value: unknown) => void\n >();\n\n /** Build a CrossAgentSnapshot from current state */\n function buildCrossAgentSnapshot(): CrossAgentSnapshot {\n const agentsSnap: CrossAgentSnapshot[\"agents\"] = Object.create(null);\n for (const [id, s] of Object.entries(agentStates)) {\n agentsSnap[id] = {\n status: s.status,\n lastInput: s.lastInput,\n lastOutput: s.lastOutput,\n lastError: s.lastError,\n runCount: s.runCount,\n totalTokens: s.totalTokens,\n };\n }\n\n const coordFacts = getAgentFacts(\"__coord\");\n const snapshot: CrossAgentSnapshot = {\n agents: agentsSnap,\n coordinator: {\n globalTokens: globalTokenCount,\n status: globalStatus,\n },\n };\n\n // Include scratchpad in snapshot if configured\n if (scratchpadConfig && coordFacts) {\n snapshot.scratchpad =\n getBridgeFact<Record<string, unknown>>(coordFacts, SCRATCHPAD_KEY) ??\n {};\n }\n\n return snapshot;\n }\n\n /** Recompute all cross-agent derivations */\n function recomputeDerivations(): void {\n if (!userDerivations) {\n return;\n }\n\n const snapshot = buildCrossAgentSnapshot();\n\n // Collect changed derivations and errors during the batch (fact writes only)\n type ChangedEntry = { derivId: string; newValue: unknown };\n type ErrorEntry = { derivId: string; derivError: unknown };\n const changed: ChangedEntry[] = [];\n const errors: ErrorEntry[] = [];\n\n system.batch(() => {\n for (const [derivId, derivFn] of Object.entries(userDerivations)) {\n try {\n const newValue = derivFn(snapshot);\n const oldValue = derivedValues[derivId];\n\n // Change detection: === for primitives, shallow equality for objects\n const hasChanged = !shallowEqual(newValue, oldValue);\n\n derivedValues[derivId] = newValue;\n\n if (hasChanged) {\n changed.push({ derivId, newValue });\n }\n } catch (derivError) {\n errors.push({ derivId, derivError });\n }\n }\n\n // Inject derived values into coordinator facts AFTER computation so constraints see current-cycle values\n const coordFacts = getAgentFacts(\"__coord\");\n if (coordFacts) {\n setBridgeFact(coordFacts, \"__derived\", { ...derivedValues });\n }\n });\n\n // Fire timeline records, hooks, and callbacks outside the batch\n for (const { derivId, newValue } of changed) {\n if (timeline) {\n timeline.record({\n type: \"derivation_update\",\n timestamp: Date.now(),\n snapshotId: null,\n derivationId: derivId,\n valueType: typeof newValue,\n });\n }\n\n fireHook(\"onDerivationUpdate\", {\n derivationId: derivId,\n value: newValue,\n timestamp: Date.now(),\n });\n\n for (const cb of derivedChangeCallbacks) {\n try {\n cb(derivId, newValue);\n } catch {\n // callback error is non-fatal\n }\n }\n }\n\n for (const { derivId, derivError } of errors) {\n if (debug) {\n console.warn(\n `[Directive MultiAgent] Derivation \"${derivId}\" threw:`,\n derivError,\n );\n }\n fireHook(\"onDerivationError\", {\n derivationId: derivId,\n error:\n derivError instanceof Error\n ? derivError\n : new Error(String(derivError)),\n timestamp: Date.now(),\n });\n }\n }\n\n // ---- Shared Scratchpad ----\n const scratchpadChangeCallbacks = new Set<\n (key: string, value: unknown) => void\n >();\n const scratchpadKeyCallbacks = new Map<\n string,\n Set<(key: string, value: unknown) => void>\n >();\n\n const scratchpadInstance: Scratchpad | null = scratchpadConfig\n ? {\n get(key: string): unknown {\n const coordFacts = getAgentFacts(\"__coord\");\n const data = getBridgeFact<Record<string, unknown>>(\n coordFacts,\n SCRATCHPAD_KEY,\n );\n if (data == null || !Object.hasOwn(data, key)) {\n return undefined;\n }\n\n return data[key];\n },\n\n set(key: string, value: unknown): void {\n if (\n key === \"__proto__\" ||\n key === \"constructor\" ||\n key === \"prototype\"\n ) {\n return;\n }\n\n const coordFacts = getAgentFacts(\"__coord\");\n const changedKeys = [key];\n system.batch(() => {\n const current =\n getBridgeFact<Record<string, unknown>>(\n coordFacts,\n SCRATCHPAD_KEY,\n ) ?? {};\n setBridgeFact(coordFacts, SCRATCHPAD_KEY, {\n ...current,\n [key]: value,\n });\n });\n\n notifyScratchpadChange(changedKeys, key, value);\n recomputeDerivations();\n },\n\n has(key: string): boolean {\n const coordFacts = getAgentFacts(\"__coord\");\n const data = getBridgeFact<Record<string, unknown>>(\n coordFacts,\n SCRATCHPAD_KEY,\n );\n\n return data != null && Object.hasOwn(data, key);\n },\n\n delete(key: string): void {\n if (\n key === \"__proto__\" ||\n key === \"constructor\" ||\n key === \"prototype\"\n ) {\n return;\n }\n const coordFacts = getAgentFacts(\"__coord\");\n system.batch(() => {\n const current =\n getBridgeFact<Record<string, unknown>>(\n coordFacts,\n SCRATCHPAD_KEY,\n ) ?? {};\n const { [key]: _, ...rest } = current;\n setBridgeFact(coordFacts, SCRATCHPAD_KEY, rest);\n });\n\n notifyScratchpadChange([key], key, undefined);\n recomputeDerivations();\n },\n\n update(values: Record<string, unknown>): void {\n // Filter out prototype pollution keys\n const safeValues: Record<string, unknown> = Object.create(null);\n for (const k of Object.keys(values)) {\n if (k === \"__proto__\" || k === \"constructor\" || k === \"prototype\") {\n continue;\n }\n safeValues[k] = values[k];\n }\n\n const coordFacts = getAgentFacts(\"__coord\");\n const keys = Object.keys(safeValues);\n if (keys.length === 0) {\n return;\n }\n\n system.batch(() => {\n const current =\n getBridgeFact<Record<string, unknown>>(\n coordFacts,\n SCRATCHPAD_KEY,\n ) ?? {};\n setBridgeFact(coordFacts, SCRATCHPAD_KEY, {\n ...current,\n ...safeValues,\n });\n });\n\n for (const [k, v] of Object.entries(safeValues)) {\n notifyScratchpadChange(keys, k, v);\n }\n recomputeDerivations();\n },\n\n getAll(): Record<string, unknown> {\n const coordFacts = getAgentFacts(\"__coord\");\n\n return {\n ...(getBridgeFact<Record<string, unknown>>(\n coordFacts,\n SCRATCHPAD_KEY,\n ) ?? {}),\n };\n },\n\n subscribe(\n keys: string[],\n callback: (key: string, value: unknown) => void,\n ): () => void {\n for (const key of keys) {\n if (!scratchpadKeyCallbacks.has(key)) {\n scratchpadKeyCallbacks.set(key, new Set());\n }\n scratchpadKeyCallbacks.get(key)!.add(callback);\n }\n\n return () => {\n for (const key of keys) {\n scratchpadKeyCallbacks.get(key)?.delete(callback);\n }\n };\n },\n\n onChange(callback: (key: string, value: unknown) => void): () => void {\n scratchpadChangeCallbacks.add(callback);\n\n return () => {\n scratchpadChangeCallbacks.delete(callback);\n };\n },\n\n reset(): void {\n if (!scratchpadConfig) {\n return;\n }\n const coordFacts = getAgentFacts(\"__coord\");\n system.batch(() => {\n setBridgeFact(coordFacts, SCRATCHPAD_KEY, {\n ...scratchpadConfig.init,\n });\n });\n },\n }\n : null;\n\n function notifyScratchpadChange(\n allKeys: string[],\n key: string,\n value: unknown,\n ): void {\n // Fire key-specific callbacks\n const keyCbs = scratchpadKeyCallbacks.get(key);\n if (keyCbs) {\n for (const cb of keyCbs) {\n try {\n cb(key, value);\n } catch {\n /* non-fatal */\n }\n }\n }\n\n // Fire global change callbacks\n for (const cb of scratchpadChangeCallbacks) {\n try {\n cb(key, value);\n } catch {\n /* non-fatal */\n }\n }\n\n // Record timeline event (once per batch of keys, not per key)\n if (timeline && key === allKeys[allKeys.length - 1]) {\n timeline.record({\n type: \"scratchpad_update\",\n timestamp: Date.now(),\n snapshotId: null,\n keys: allKeys,\n });\n }\n\n // Fire lifecycle hook (once per batch of keys)\n if (key === allKeys[allKeys.length - 1]) {\n fireHook(\"onScratchpadUpdate\", {\n keys: allKeys,\n timestamp: Date.now(),\n });\n }\n }\n\n // ---- Breakpoint Infrastructure ----\n const breakpointModifications = new Map<string, BreakpointModifications>();\n const breakpointCancelReasons = new Map<string, string>();\n\n /** Wait for a breakpoint to be resolved or cancelled */\n function waitForBreakpointResolution(\n agentId: string,\n breakpointId: string,\n signal?: AbortSignal,\n ): Promise<BreakpointModifications | null> {\n return new Promise((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let settled = false;\n let onAbort: (() => void) | undefined;\n const agentFacts = getAgentFacts(agentId);\n\n const cleanupAll = () => {\n if (settled) {\n return;\n }\n settled = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n if (onAbort && signal) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n unsubscribe();\n };\n\n const unsubscribe = system.subscribe(\n [`${agentId}.${BREAKPOINT_KEY}`],\n () => {\n const bpState = getBreakpointState(agentFacts);\n if (bpState.resolved.includes(breakpointId)) {\n cleanupAll();\n const mods = breakpointModifications.get(breakpointId) ?? null;\n breakpointModifications.delete(breakpointId);\n\n resolve(mods);\n } else if (bpState.cancelled.includes(breakpointId)) {\n cleanupAll();\n breakpointModifications.delete(breakpointId);\n const cancelReason = breakpointCancelReasons.get(breakpointId);\n breakpointCancelReasons.delete(breakpointId);\n reject(\n new Error(\n cancelReason\n ? `[Directive MultiAgent] Breakpoint ${breakpointId} cancelled: ${cancelReason}`\n : `[Directive MultiAgent] Breakpoint ${breakpointId} cancelled`,\n ),\n );\n }\n },\n );\n\n if (signal) {\n onAbort = () => {\n cleanupAll();\n reject(\n new Error(\n `[Directive MultiAgent] Breakpoint wait aborted for ${breakpointId}`,\n ),\n );\n };\n if (signal.aborted) {\n cleanupAll();\n reject(\n new Error(\n `[Directive MultiAgent] Breakpoint wait aborted for ${breakpointId}`,\n ),\n );\n\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n timeoutId = setTimeout(() => {\n cleanupAll();\n breakpointModifications.delete(breakpointId);\n breakpointCancelReasons.delete(breakpointId);\n reject(\n new Error(\n `[Directive MultiAgent] Breakpoint timeout: ${breakpointId} not resolved within ${Math.round(breakpointTimeoutMs / 1000)}s`,\n ),\n );\n }, breakpointTimeoutMs);\n });\n }\n\n /** Check and handle a breakpoint at a given execution point */\n async function handleBreakpoint(\n type: MultiAgentBreakpointType,\n agentId: string,\n agentName: string,\n input: string,\n signal?: AbortSignal,\n extra?: {\n patternId?: string;\n handoff?: { fromAgent: string; toAgent: string };\n },\n ): Promise<{ input: string; skip: boolean }> {\n if (breakpointConfigs.length === 0) {\n return { input, skip: false };\n }\n\n const agentFacts = getAgentFacts(agentId);\n const context: BreakpointContext = {\n agentId,\n agentName,\n input,\n state: getOrchestratorState(agentFacts) as unknown as Record<\n string,\n unknown\n >,\n breakpointType: type,\n patternId: extra?.patternId,\n handoff: extra?.handoff,\n };\n\n const matched = matchBreakpoint(breakpointConfigs, type, context);\n if (!matched) {\n return { input, skip: false };\n }\n\n const bpId = createBreakpointId();\n const request: BreakpointRequest = {\n id: bpId,\n type,\n agentId,\n input,\n label: matched.label,\n requestedAt: Date.now(),\n };\n\n // Write to facts\n system.batch(() => {\n const currentBp = getBreakpointState(agentFacts);\n setBreakpointState(agentFacts, {\n ...currentBp,\n pending: [...currentBp.pending, request],\n });\n });\n\n // Fire callbacks\n try {\n onBreakpoint?.(request);\n } catch {\n /* callback error non-fatal */\n }\n try {\n (hooks as any).onBreakpoint?.(request);\n } catch {\n /* hook error non-fatal */\n }\n\n // Record timeline event\n if (timeline) {\n timeline.record({\n type: \"breakpoint_hit\",\n timestamp: Date.now(),\n agentId,\n snapshotId: null,\n breakpointId: bpId,\n breakpointType: type,\n label: matched.label,\n });\n }\n\n // Wait for resolution\n const modifications = await waitForBreakpointResolution(\n agentId,\n bpId,\n signal,\n );\n\n // Record resume event\n if (timeline) {\n timeline.record({\n type: \"breakpoint_resumed\",\n timestamp: Date.now(),\n agentId,\n snapshotId: null,\n breakpointId: bpId,\n modified: !!modifications?.input,\n skipped: !!modifications?.skip,\n });\n }\n\n return {\n input: modifications?.input ?? input,\n skip: modifications?.skip ?? false,\n };\n }\n\n // ---- Helper: Get per-agent facts from namespaced System ----\n // biome-ignore lint/suspicious/noExplicitAny: System facts vary\n function getAgentFacts(agentId: string): any {\n return (system.facts as any)[agentId];\n }\n\n // ---- Helper: Wait for approval ----\n function waitForApproval(\n agentId: string,\n requestId: string,\n signal?: AbortSignal,\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let settled = false;\n let onAbort: (() => void) | undefined;\n const agentFacts = getAgentFacts(agentId);\n\n const cleanupAll = () => {\n if (settled) return;\n settled = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n if (onAbort && signal) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n unsubscribe();\n };\n\n // Use system.subscribe with namespaced key\n const unsubscribe = system.subscribe(\n [`${agentId}.${APPROVAL_KEY}`],\n () => {\n const approval = getApprovalState(agentFacts);\n if (approval.approved.includes(requestId)) {\n cleanupAll();\n resolve();\n } else {\n const rejectedRequest = approval.rejected.find(\n (r: RejectedRequest) => r.id === requestId,\n );\n if (rejectedRequest) {\n cleanupAll();\n const errorMsg = rejectedRequest.reason\n ? `Request ${requestId} rejected: ${rejectedRequest.reason}`\n : `Request ${requestId} rejected`;\n reject(new Error(errorMsg));\n }\n }\n },\n );\n\n // Abort signal cleanup\n if (signal) {\n onAbort = () => {\n cleanupAll();\n reject(\n new Error(\n `[Directive MultiAgent] Approval wait aborted for request ${requestId}`,\n ),\n );\n };\n if (signal.aborted) {\n cleanupAll();\n reject(\n new Error(\n `[Directive MultiAgent] Approval wait aborted for request ${requestId}`,\n ),\n );\n\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n // Timeout with solution guidance\n timeoutId = setTimeout(() => {\n cleanupAll();\n const timeoutSeconds = Math.round(approvalTimeoutMs / 1000);\n reject(\n new Error(\n `[Directive MultiAgent] Approval timeout: Request ${requestId} not resolved within ${timeoutSeconds}s.\\n` +\n \"Solutions:\\n\" +\n \" 1. Handle via onApprovalRequest callback and call orchestrator.approve()/reject()\\n\" +\n \" 2. Set autoApproveToolCalls: true to auto-approve\\n\" +\n ` 3. Increase approvalTimeoutMs (current: ${approvalTimeoutMs}ms)\\n` +\n \"See: https://directive.run/docs/ai/multi-agent\",\n ),\n );\n }, approvalTimeoutMs);\n });\n }\n\n // ---- Core: Run a task (imperative code) ----\n async function runTask<T>(\n taskId: string,\n taskReg: TaskRegistration,\n input: string,\n opts?: MultiAgentRunCallOptions,\n ): Promise<RunResult<T>> {\n const label = taskReg.label ?? taskId;\n const startTime = Date.now();\n const state =\n taskStates[taskId] ?? (taskStates[taskId] = { status: \"idle\" });\n state.status = \"running\";\n state.startTime = startTime;\n state.lastError = undefined;\n\n // Check breakpoints — tasks don't have system modules, so only check if\n // breakpoints are configured and handle the missing agent facts gracefully\n let effectiveInput = input;\n if (breakpointConfigs.length > 0) {\n try {\n const bpResult = await handleBreakpoint(\n \"pre_agent_run\",\n taskId,\n label,\n input,\n opts?.signal,\n );\n if (bpResult.skip) {\n state.status = \"completed\";\n\n return {\n output: undefined as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n effectiveInput = bpResult.input;\n } catch {\n // Tasks don't have system facts — breakpoint state access may fail.\n // Fall through with original input.\n }\n }\n\n // Emit timeline event\n if (timeline) {\n timeline.record({\n type: \"task_start\",\n timestamp: startTime,\n agentId: taskId,\n snapshotId: null,\n taskId,\n label,\n description: taskReg.description,\n inputLength: effectiveInput.length,\n input: effectiveInput.slice(0, MAX_VERBOSE_LENGTH),\n });\n }\n\n // Fire hook\n const effectivePatternId = opts?.patternId ?? \"\";\n fireHook(\"onTaskStart\", {\n patternId: effectivePatternId,\n taskId,\n label,\n timestamp: startTime,\n });\n\n // Semaphore for maxConcurrent\n const sem = taskSemaphores.get(taskId);\n\n // Build TaskContext with deep-cloned memory and scratchpad\n const buildContext = (): TaskContext => ({\n taskId,\n memory: sharedMemory\n ? (structuredClone(\n sharedMemory.getContextMessages?.() ?? [],\n ) as ReadonlyArray<{ role: string; content: string }>)\n : [],\n scratchpad: scratchpadInstance\n ? Object.freeze(structuredClone(scratchpadInstance.getAll()))\n : Object.freeze({}),\n readAgentState: (nodeId: string) => {\n // Check agent states first, then task states\n const agentState = agentStates[nodeId];\n if (agentState) {\n return Object.freeze({\n status: agentState.status,\n lastOutput:\n agentState.lastOutput != null\n ? String(agentState.lastOutput)\n : undefined,\n lastError: agentState.lastError,\n totalTokens: agentState.totalTokens,\n });\n }\n const taskState = taskStates[nodeId];\n if (taskState) {\n return Object.freeze({\n status: taskState.status,\n lastOutput:\n taskState.lastOutput != null\n ? String(taskState.lastOutput)\n : undefined,\n lastError: taskState.lastError,\n totalTokens: 0,\n });\n }\n\n return undefined;\n },\n reportProgress: (percent: number, message?: string) => {\n const clampedPercent = Number.isFinite(percent)\n ? Math.max(0, Math.min(100, percent))\n : 0;\n if (timeline) {\n timeline.record({\n type: \"task_progress\",\n timestamp: Date.now(),\n agentId: taskId,\n snapshotId: null,\n taskId,\n label,\n percent: clampedPercent,\n message,\n });\n }\n fireHook(\"onTaskProgress\", {\n patternId: effectivePatternId,\n taskId,\n label,\n percent: clampedPercent,\n message,\n timestamp: Date.now(),\n });\n },\n });\n\n const maxAttempts = taskReg.retry?.attempts ?? 1;\n const backoff = taskReg.retry?.backoff ?? \"fixed\";\n const baseDelay = taskReg.retry?.delayMs ?? 1000;\n let lastError: Error | undefined;\n\n const executeAttempt = async (signal: AbortSignal): Promise<unknown> => {\n const context = buildContext();\n\n return taskReg.run(effectiveInput, signal, context);\n };\n\n let releaseFn: (() => void) | null = null;\n\n try {\n if (sem) {\n releaseFn = await sem.acquire();\n }\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const abortController = new AbortController();\n let timeoutTimer: ReturnType<typeof setTimeout> | undefined;\n\n // Chain with external signal — store handler for cleanup\n const abortHandler = () => abortController.abort();\n if (opts?.signal) {\n if (opts.signal.aborted) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" aborted before starting`,\n );\n }\n opts.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n // Timeout\n if (taskReg.timeout) {\n timeoutTimer = setTimeout(\n () => abortController.abort(),\n taskReg.timeout,\n );\n }\n\n try {\n const rawOutput = await executeAttempt(abortController.signal);\n if (timeoutTimer) {\n clearTimeout(timeoutTimer);\n }\n\n // Stringify non-string output\n const output =\n typeof rawOutput === \"string\"\n ? rawOutput\n : safeStringify(rawOutput);\n const durationMs = Date.now() - startTime;\n\n state.status = \"completed\";\n state.lastOutput = output;\n state.durationMs = durationMs;\n\n // Emit timeline event\n if (timeline) {\n timeline.record({\n type: \"task_complete\",\n timestamp: Date.now(),\n agentId: taskId,\n snapshotId: null,\n taskId,\n label,\n durationMs,\n output,\n });\n }\n\n // Fire hooks\n fireHook(\"onTaskComplete\", {\n patternId: opts?.patternId ?? \"\",\n taskId,\n label,\n durationMs,\n timestamp: Date.now(),\n });\n\n // Update coordinator fact for constraint reactivity\n try {\n const coordFacts = system.read(\"__coord\");\n setBridgeFact(coordFacts as any, \"__lastTaskCompletion\" as any, {\n taskId,\n timestamp: Date.now(),\n });\n } catch {\n // non-fatal: system might be disposed\n }\n\n return {\n output: output as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n } catch (err) {\n if (timeoutTimer) {\n clearTimeout(timeoutTimer);\n }\n lastError = err instanceof Error ? err : new Error(String(err));\n\n // Emit per-attempt error if retrying\n if (attempt < maxAttempts) {\n if (timeline) {\n timeline.record({\n type: \"task_error\",\n timestamp: Date.now(),\n agentId: taskId,\n snapshotId: null,\n taskId,\n label,\n error: lastError.message,\n durationMs: Date.now() - startTime,\n attempt,\n });\n }\n\n // Backoff with cap and abort-awareness\n const MAX_BACKOFF_MS = 30_000;\n const rawDelay =\n backoff === \"exponential\"\n ? baseDelay * 2 ** (attempt - 1)\n : baseDelay;\n const delay = Math.min(rawDelay, MAX_BACKOFF_MS);\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const onAbort = () => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n reject(\n new Error(\n `[Directive MultiAgent] Task \"${taskId}\" aborted during retry backoff`,\n ),\n );\n }\n };\n const timer = setTimeout(() => {\n settled = true;\n opts?.signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delay);\n if (opts?.signal) {\n opts.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n }\n } finally {\n // Clean up abort listener to prevent accumulation\n opts?.signal?.removeEventListener(\"abort\", abortHandler);\n }\n }\n\n // All attempts exhausted\n const durationMs = Date.now() - startTime;\n state.status = \"error\";\n state.lastError = lastError?.message;\n state.durationMs = durationMs;\n\n // Emit final error event\n if (timeline) {\n timeline.record({\n type: \"task_error\",\n timestamp: Date.now(),\n agentId: taskId,\n snapshotId: null,\n taskId,\n label,\n error: lastError?.message ?? \"Unknown error\",\n durationMs,\n });\n }\n\n fireHook(\"onTaskError\", {\n patternId: effectivePatternId,\n taskId,\n label,\n error: lastError!,\n durationMs,\n timestamp: Date.now(),\n });\n\n // Note: Tasks bypass the circuit breaker's execute() wrapper (tasks are imperative\n // code, not LLM calls). Task failure recovery is handled by the retry config on\n // TaskRegistration. The CB's execute() is only used for agent runs.\n\n throw lastError;\n } finally {\n releaseFn?.();\n }\n }\n\n // ---- Core: Run a single agent ----\n async function runSingleAgent<T>(\n agentId: string,\n input: string,\n opts?: MultiAgentRunCallOptions,\n ): Promise<RunResult<T>> {\n assertNotDisposed();\n\n if (opts?.signal?.aborted) {\n throw new Error(\n `[Directive MultiAgent] Handler \"${agentId}\" run aborted before starting`,\n );\n }\n\n if (globalStatus === \"paused\") {\n throw new Error(\n \"[Directive MultiAgent] Orchestrator is paused (budget exceeded or manual pause)\",\n );\n }\n\n // Increment synchronously before any await so waitForIdle knows a run is pending\n pendingRuns++;\n\n try {\n // Check if this is a task (imperative code), not an agent (LLM call)\n const taskReg = tasks[agentId];\n if (taskReg) {\n return await runTask<T>(agentId, taskReg, input, opts);\n }\n\n const registration = agents[agentId];\n if (!registration) {\n const available =\n [...Object.keys(agents), ...Object.keys(tasks)].join(\", \") ||\n \"(none)\";\n\n throw new Error(\n `[Directive MultiAgent] Unknown handler \"${agentId}\". Registered handlers: ${available}`,\n );\n }\n\n const effectiveCircuitBreaker =\n registration.circuitBreaker ?? orchestratorCircuitBreaker;\n if (effectiveCircuitBreaker) {\n return await effectiveCircuitBreaker.execute(() =>\n runSingleAgentInner<T>(agentId, registration, input, opts),\n );\n }\n\n return await runSingleAgentInner<T>(agentId, registration, input, opts);\n } catch (error) {\n // Self-healing: attempt reroute if configured and this is a CB error or health threshold\n // Tasks are imperative code — self-healing reroute/degradation only applies to agents\n if (\n selfHealing &&\n !tasks[agentId] &&\n !(opts as { __isReroute?: boolean })?.__isReroute\n ) {\n const equivalents = findEquivalentAgents(agentId);\n const alternate = selectBestEquivalent(equivalents);\n if (alternate) {\n const rerouteEvent: RerouteEvent = {\n originalAgent: agentId,\n reroutedTo: alternate,\n reason: error instanceof Error ? error.message : String(error),\n timestamp: Date.now(),\n };\n\n try {\n selfHealing.onReroute?.(rerouteEvent);\n } catch {\n // callback error is non-fatal\n }\n fireHook(\"onReroute\", rerouteEvent);\n\n if (timeline) {\n timeline.record({\n type: \"reroute\",\n timestamp: Date.now(),\n agentId,\n snapshotId: null,\n from: agentId,\n to: alternate,\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Prevent circular reroute (max 1 hop)\n return runSingleAgent<T>(alternate, input, {\n ...opts,\n __isReroute: true,\n } as any);\n }\n\n // No equivalents — apply degradation policy\n if (\n selfHealing.degradation === \"fallback-response\" &&\n selfHealing.fallbackResponse !== undefined\n ) {\n return {\n output: selfHealing.fallbackResponse as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n }\n\n // Update state for errors that happen before semaphore acquisition\n const state = agentStates[agentId];\n if (state && state.status !== \"error\") {\n state.status = \"error\";\n state.lastError =\n error instanceof Error ? error.message : String(error);\n }\n\n throw error;\n } finally {\n pendingRuns--;\n notifyIdleWaiters();\n }\n }\n\n async function runSingleAgentInner<T>(\n agentId: string,\n registration: AgentRegistration,\n originalInput: string,\n opts?: MultiAgentRunCallOptions,\n ): Promise<RunResult<T>> {\n const startTime = Date.now();\n const agentFacts = getAgentFacts(agentId);\n const state = agentStates[agentId]!;\n let agent = registration.agent;\n let processedInput = originalInput;\n\n // Acquire semaphore slot\n const semaphore = semaphores.get(agentId);\n if (!semaphore) {\n const available = Object.keys(agents).join(\", \") || \"(none)\";\n\n throw new Error(\n `[Directive MultiAgent] Unknown agent \"${agentId}\". Registered agents: ${available}`,\n );\n }\n const release = await semaphore.acquire(opts?.signal);\n\n // Create timeout if specified\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let abortHandler: (() => void) | undefined;\n\n try {\n if (registration.timeout) {\n timeoutId = setTimeout(() => controller.abort(), registration.timeout);\n }\n if (opts?.signal) {\n abortHandler = () => controller.abort();\n opts.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n // Inject memory context\n const effectiveMemory = registration.memory ?? sharedMemory;\n if (effectiveMemory) {\n const contextMessages = effectiveMemory.getContextMessages();\n if (contextMessages.length > 0) {\n const contextStr = contextMessages\n .map((m) => `${m.role}: ${m.content}`)\n .join(\"\\n\");\n agent = {\n ...agent,\n instructions:\n (agent.instructions ?? \"\") +\n \"\\n\\nConversation context:\\n\" +\n contextStr,\n };\n }\n }\n\n // ---- Breakpoint: pre_input_guardrails ----\n {\n const bpResult = await handleBreakpoint(\n \"pre_input_guardrails\",\n agentId,\n agent.name,\n processedInput,\n opts?.signal,\n );\n if (bpResult.skip) {\n state.status = \"completed\";\n notifyIdleWaiters();\n\n return {\n output: undefined as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n processedInput = bpResult.input;\n }\n\n // ---- Input guardrails BEFORE agent_start so timeline shows correct order ----\n const allInputGuardrails = [\n ...(guardrails.input ?? []),\n ...(registration.guardrails?.input ?? []),\n ];\n const inputGuardrailsList = allInputGuardrails.map((g, i) =>\n normalizeGuardrail(g, i, \"input\"),\n );\n for (const guardrail of inputGuardrailsList) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input: processedInput,\n facts: getOrchestratorState(agentFacts) as unknown as Record<\n string,\n unknown\n >,\n };\n const guardStartTime = Date.now();\n const result = await executeGuardrailWithRetry(\n guardrail,\n { input: processedInput, agentName: agent.name },\n context,\n );\n fireHook(\"onGuardrailCheck\", {\n agentId,\n guardrailName: name,\n guardrailType: \"input\",\n passed: result.passed,\n reason: result.reason,\n durationMs: Date.now() - guardStartTime,\n timestamp: Date.now(),\n });\n if (!result.passed) {\n throw new GuardrailError({\n code: \"INPUT_GUARDRAIL_FAILED\",\n message: `Input guardrail \"${name}\" failed: ${result.reason}`,\n guardrailName: name,\n guardrailType: \"input\",\n userMessage: result.reason ?? \"Input validation failed\",\n agentName: agent.name,\n input: processedInput,\n });\n }\n if (result.transformed !== undefined) {\n processedInput = result.transformed as string;\n }\n }\n\n // Fire onAgentStart hook (after guardrails pass)\n fireHook(\"onAgentStart\", {\n agentId,\n agentName: agent.name,\n input: processedInput,\n timestamp: startTime,\n });\n\n // Record timeline event\n if (timeline) {\n timeline.record({\n type: \"agent_start\",\n timestamp: Date.now(),\n agentId,\n snapshotId: null,\n inputLength: processedInput.length,\n ...(\"description\" in agent && agent.description\n ? { description: String(agent.description) }\n : {}),\n ...(agent.instructions\n ? { instructions: agent.instructions.slice(0, MAX_VERBOSE_LENGTH) }\n : {}),\n input: processedInput.slice(0, MAX_VERBOSE_LENGTH),\n });\n }\n\n // Update per-agent facts\n system.batch(() => {\n const currentAgent = getAgentState(agentFacts);\n setAgentState(agentFacts, {\n ...currentAgent,\n status: \"running\",\n input: processedInput,\n startedAt: Date.now(),\n });\n });\n state.status = \"running\";\n state.lastInput = processedInput;\n\n // ---- Breakpoint: pre_agent_run ----\n {\n const bpResult = await handleBreakpoint(\n \"pre_agent_run\",\n agentId,\n agent.name,\n processedInput,\n opts?.signal,\n );\n if (bpResult.skip) {\n state.status = \"completed\";\n notifyIdleWaiters();\n\n return {\n output: undefined as T,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n processedInput = bpResult.input;\n }\n\n // ---- Per-agent structured output wrapping (per-call overrides per-agent) ----\n let effectiveRunner: AgentRunner = runner;\n const effectiveSchema =\n opts?.outputSchema !== undefined\n ? opts.outputSchema // null = opt-out, SafeParseable = override\n : registration.outputSchema; // per-agent default\n if (effectiveSchema) {\n effectiveRunner = withStructuredOutput(runner, {\n schema: effectiveSchema,\n maxRetries:\n opts?.maxSchemaRetries ?? registration.maxSchemaRetries ?? 2,\n extractJson: registration.extractJson,\n schemaDescription: registration.schemaDescription,\n });\n }\n\n // Effective retry config: per-agent overrides orchestrator default\n const effectiveRetry = registration.retry ?? defaultAgentRetry;\n\n // Run agent with retry support\n const result = await executeAgentWithRetry<T>(\n effectiveRunner,\n agent,\n processedInput,\n {\n ...registration.runOptions,\n ...opts,\n signal: controller.signal,\n onMessage: (message) => {\n const currentConversation = getConversation(agentFacts);\n const updated = [...currentConversation, message];\n setConversation(\n agentFacts,\n updated.length > MAX_CONVERSATION_MESSAGES\n ? updated.slice(-MAX_CONVERSATION_MESSAGES)\n : updated,\n );\n opts?.onMessage?.(message);\n },\n onToolCall: async (toolCall) => {\n // ---- Tool call guardrails: orchestrator-level, then per-agent ----\n const allToolCallGuardrails = [\n ...(guardrails.toolCall ?? []),\n ...(registration.guardrails?.toolCall ?? []),\n ];\n const toolCallGuardrailsList = allToolCallGuardrails.map((g, i) =>\n normalizeGuardrail(g, i, \"toolCall\"),\n );\n for (const guardrail of toolCallGuardrailsList) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input: processedInput,\n facts: getOrchestratorState(agentFacts) as unknown as Record<\n string,\n unknown\n >,\n };\n const guardStartTime = Date.now();\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n { toolCall, agentName: agent.name, input: processedInput },\n context,\n );\n fireHook(\"onGuardrailCheck\", {\n agentId,\n guardrailName: name,\n guardrailType: \"toolCall\",\n passed: guardResult.passed,\n reason: guardResult.reason,\n durationMs: Date.now() - guardStartTime,\n timestamp: Date.now(),\n });\n if (!guardResult.passed) {\n throw new GuardrailError({\n code: \"TOOL_CALL_GUARDRAIL_FAILED\",\n message: `Tool call guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"toolCall\",\n userMessage: guardResult.reason ?? \"Tool call blocked\",\n data: { toolCall },\n agentName: agent.name,\n input: processedInput,\n });\n }\n }\n\n // Approval workflow\n if (!autoApproveToolCalls) {\n const approvalId = `tool-${agentId}-${toolCall.id}`;\n const approvalRequest: ApprovalRequest = {\n id: approvalId,\n type: \"tool_call\",\n agentName: agent.name,\n description: `Tool call: ${toolCall.name}`,\n data: toolCall,\n requestedAt: Date.now(),\n };\n\n approvalRequestIndex.set(approvalId, agentId);\n system.batch(() => {\n const currentApproval = getApprovalState(agentFacts);\n setApprovalState(agentFacts, {\n ...currentApproval,\n pending: [...currentApproval.pending, approvalRequest],\n });\n });\n\n onApprovalRequest?.(approvalRequest);\n await waitForApproval(agentId, approvalId, opts?.signal);\n }\n\n const currentToolCalls = getToolCalls(agentFacts);\n const updatedToolCalls = [...currentToolCalls, toolCall];\n setToolCalls(\n agentFacts,\n updatedToolCalls.length > MAX_TOOL_CALLS\n ? updatedToolCalls.slice(-MAX_TOOL_CALLS)\n : updatedToolCalls,\n );\n opts?.onToolCall?.(toolCall);\n },\n },\n effectiveRetry\n ? {\n ...effectiveRetry,\n onRetry: (attempt, error, delayMs) => {\n effectiveRetry.onRetry?.(attempt, error, delayMs);\n fireHook(\"onAgentRetry\", {\n agentId,\n agentName: agent.name,\n input: processedInput,\n attempt,\n error,\n delayMs,\n timestamp: Date.now(),\n });\n },\n }\n : undefined,\n );\n\n // ---- Breakpoint: pre_output_guardrails ----\n {\n const bpResult = await handleBreakpoint(\n \"pre_output_guardrails\",\n agentId,\n agent.name,\n processedInput,\n opts?.signal,\n );\n if (bpResult.skip) {\n // Skip output guardrails, return result directly\n state.status = \"completed\";\n notifyIdleWaiters();\n\n return result;\n }\n }\n\n // ---- Output guardrails: orchestrator-level, then per-agent ----\n const allOutputGuardrails = [\n ...(guardrails.output ?? []),\n ...(registration.guardrails?.output ?? []),\n ];\n const outputGuardrailsList = allOutputGuardrails.map((g, i) =>\n normalizeGuardrail(g, i, \"output\"),\n );\n for (const guardrail of outputGuardrailsList) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input: processedInput,\n facts: getOrchestratorState(agentFacts) as unknown as Record<\n string,\n unknown\n >,\n };\n const guardStartTime = Date.now();\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n {\n output: result.output,\n agentName: agent.name,\n input: processedInput,\n messages: result.messages,\n },\n context,\n );\n fireHook(\"onGuardrailCheck\", {\n agentId,\n guardrailName: name,\n guardrailType: \"output\",\n passed: guardResult.passed,\n reason: guardResult.reason,\n durationMs: Date.now() - guardStartTime,\n timestamp: Date.now(),\n });\n if (!guardResult.passed) {\n throw new GuardrailError({\n code: \"OUTPUT_GUARDRAIL_FAILED\",\n message: `Output guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"output\",\n userMessage: guardResult.reason ?? \"Output validation failed\",\n agentName: agent.name,\n input: processedInput,\n });\n }\n if (guardResult.transformed !== undefined) {\n (result as { output: unknown }).output = guardResult.transformed;\n }\n }\n\n // Update per-agent facts\n system.batch(() => {\n const currentAgent = getAgentState(agentFacts);\n setAgentState(agentFacts, {\n ...currentAgent,\n status: \"completed\",\n output: result.output,\n tokenUsage: currentAgent.tokenUsage + result.totalTokens,\n turnCount: currentAgent.turnCount + result.messages.length,\n completedAt: Date.now(),\n });\n });\n\n // Update local state\n state.status = \"completed\";\n state.lastOutput = result.output;\n state.runCount++;\n state.totalTokens += result.totalTokens;\n notifyIdleWaiters();\n\n // Update global token count atomically via System facts\n // Use read-modify-write inside batch to prevent desync from concurrent runs\n const coordFacts = getAgentFacts(\"__coord\");\n let shouldFireBudgetWarning = false;\n let budgetPercentage = 0;\n system.batch(() => {\n const currentTokens = getBridgeFact<number>(\n coordFacts,\n \"__globalTokens\",\n );\n const newTotal = currentTokens + result.totalTokens;\n globalTokenCount = newTotal;\n setBridgeFact(coordFacts, \"__globalTokens\", newTotal);\n\n // Check budget warning threshold\n if (maxTokenBudget && onBudgetWarning) {\n budgetPercentage = newTotal / maxTokenBudget;\n const warningFired = getBridgeFact<boolean>(\n coordFacts,\n \"__budgetWarningFired\",\n );\n if (budgetPercentage >= budgetWarningThreshold && !warningFired) {\n setBridgeFact(coordFacts, \"__budgetWarningFired\", true);\n shouldFireBudgetWarning = true;\n }\n }\n });\n\n // Fire budget warning callback outside of batch (callbacks shouldn't run inside batch)\n if (shouldFireBudgetWarning) {\n try {\n onBudgetWarning!({\n currentTokens: globalTokenCount,\n maxBudget: maxTokenBudget!,\n percentage: budgetPercentage,\n });\n } catch (callbackError) {\n if (debug) {\n console.debug(\n \"[Directive MultiAgent] onBudgetWarning threw:\",\n callbackError,\n );\n }\n }\n }\n\n // Store messages in memory (best-effort — don't fail the run on memory errors)\n // Only store the user message once — agent-utils includes it in every result,\n // but memory already has it from the first agent call in a conversation.\n if (effectiveMemory && result.messages.length > 0) {\n try {\n const existingMessages = effectiveMemory.getContextMessages();\n const hasUserMessage = existingMessages.some(\n (m) => m.role === \"user\" && m.content === processedInput,\n );\n const messagesToStore = hasUserMessage\n ? result.messages.filter(\n (m) => !(m.role === \"user\" && m.content === processedInput),\n )\n : result.messages;\n effectiveMemory.addMessages(messagesToStore);\n } catch (memoryError) {\n if (debug) {\n console.debug(\n \"[Directive MultiAgent] Memory addMessages failed:\",\n memoryError,\n );\n }\n }\n }\n\n // Fire onAgentComplete hook\n fireHook(\"onAgentComplete\", {\n agentId,\n agentName: agent.name,\n input: processedInput,\n output: result.output,\n tokenUsage: result.totalTokens,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n });\n\n // Record timeline event\n if (timeline) {\n const outputStr =\n typeof result.output === \"string\"\n ? result.output\n : safeStringify(result.output);\n timeline.record({\n type: \"agent_complete\",\n timestamp: Date.now(),\n agentId,\n snapshotId: null,\n outputLength: outputStr.length,\n totalTokens: result.totalTokens,\n inputTokens: result.tokenUsage?.inputTokens ?? 0,\n outputTokens: result.tokenUsage?.outputTokens ?? 0,\n durationMs: Date.now() - startTime,\n modelId: registration.agent.model ?? undefined,\n output: outputStr.slice(0, MAX_VERBOSE_LENGTH),\n });\n }\n\n // Record health success\n if (healthMonitorInstance) {\n healthMonitorInstance.recordSuccess(agentId, Date.now() - startTime);\n }\n\n // Recompute cross-agent derivations\n recomputeDerivations();\n\n // ---- Breakpoint: post_run ----\n await handleBreakpoint(\n \"post_run\",\n agentId,\n agent.name,\n processedInput,\n opts?.signal,\n );\n\n return result;\n } catch (error) {\n state.status = \"error\";\n state.lastError = error instanceof Error ? error.message : String(error);\n notifyIdleWaiters();\n\n // Update per-agent facts with error\n system.batch(() => {\n const currentAgent = getAgentState(agentFacts);\n setAgentState(agentFacts, {\n ...currentAgent,\n status: \"error\",\n error: error instanceof Error ? error.message : String(error),\n completedAt: Date.now(),\n });\n });\n\n // Fire onAgentError hook\n fireHook(\"onAgentError\", {\n agentId,\n agentName: agent.name,\n input: processedInput,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n });\n\n // Record timeline event\n if (timeline) {\n const base: Record<string, unknown> = {\n type: \"agent_error\",\n timestamp: Date.now(),\n agentId,\n snapshotId: null,\n errorMessage: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n };\n if (isGuardrailError(error)) {\n base.guardrailName = error.guardrailName;\n base.guardrailType = error.guardrailType;\n base.errorCode = error.code;\n }\n timeline.record(base as any);\n }\n\n // Record health failure\n if (healthMonitorInstance) {\n healthMonitorInstance.recordFailure(\n agentId,\n Date.now() - startTime,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Recompute cross-agent derivations\n recomputeDerivations();\n\n throw error;\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n if (abortHandler && opts?.signal) {\n opts.signal.removeEventListener(\"abort\", abortHandler);\n }\n release();\n }\n }\n\n // ---- Streaming ----\n function runAgentStreamImpl<T>(\n agentId: string,\n input: string,\n options: { signal?: AbortSignal } = {},\n ): OrchestratorStreamResult<T> {\n assertNotDisposed();\n\n // Task streaming: run task, emit single chunk + done\n const taskReg = tasks[agentId];\n if (taskReg) {\n const taskChunks: OrchestratorStreamChunk[] = [];\n const taskWaiters: Array<\n (chunk: OrchestratorStreamChunk | null) => void\n > = [];\n let taskClosed = false;\n\n const pushTaskChunk = (chunk: OrchestratorStreamChunk) => {\n if (taskClosed) {\n return;\n }\n const waiter = taskWaiters.shift();\n if (waiter) {\n waiter(chunk);\n } else {\n taskChunks.push(chunk);\n }\n };\n\n const closeTaskStream = () => {\n taskClosed = true;\n for (const w of taskWaiters) {\n w(null);\n }\n taskWaiters.length = 0;\n };\n\n const taskAbortController = new AbortController();\n // Wire external signal into task-local controller\n let taskExternalAbortHandler: (() => void) | undefined;\n if (options.signal) {\n if (options.signal.aborted) {\n taskAbortController.abort();\n } else {\n taskExternalAbortHandler = () => taskAbortController.abort();\n options.signal.addEventListener(\"abort\", taskExternalAbortHandler, {\n once: true,\n });\n }\n }\n\n const resultPromise = runSingleAgent<T>(agentId, input, {\n signal: taskAbortController.signal,\n })\n .then(\n (result) => {\n const output =\n typeof result.output === \"string\"\n ? result.output\n : safeStringify(result.output);\n pushTaskChunk({ type: \"token\", data: output, tokenCount: 0 });\n pushTaskChunk({\n type: \"done\",\n totalTokens: 0,\n duration: 0,\n droppedTokens: 0,\n });\n closeTaskStream();\n\n return result;\n },\n (err) => {\n pushTaskChunk({ type: \"error\", error: err });\n closeTaskStream();\n throw err;\n },\n )\n .finally(() => {\n if (taskExternalAbortHandler && options.signal) {\n options.signal.removeEventListener(\n \"abort\",\n taskExternalAbortHandler,\n );\n }\n });\n\n // Prevent unhandled rejection if no one awaits .result\n resultPromise.catch(() => {});\n\n return {\n stream: {\n async *[Symbol.asyncIterator]() {\n while (true) {\n const chunk = taskChunks.shift();\n if (chunk) {\n yield chunk;\n if (chunk.type === \"done\" || chunk.type === \"error\") {\n return;\n }\n } else if (taskClosed) {\n return;\n } else {\n const next = await new Promise<OrchestratorStreamChunk | null>(\n (resolve) => taskWaiters.push(resolve),\n );\n if (!next) {\n return;\n }\n yield next;\n if (next.type === \"done\" || next.type === \"error\") {\n return;\n }\n }\n }\n },\n },\n result: resultPromise,\n abort: () => {\n taskAbortController.abort();\n },\n } as OrchestratorStreamResult<T>;\n }\n\n const registration = agents[agentId];\n if (!registration) {\n const available =\n [...Object.keys(agents), ...Object.keys(tasks)].join(\", \") || \"(none)\";\n\n throw new Error(\n `[Directive MultiAgent] Unknown handler \"${agentId}\". Registered handlers: ${available}`,\n );\n }\n\n const MAX_AGENT_STREAM_BUFFER = 10_000;\n const MAX_ACCUMULATED_OUTPUT = 100_000;\n const abortController = new AbortController();\n const chunks: OrchestratorStreamChunk[] = [];\n const waiters: Array<(chunk: OrchestratorStreamChunk | null) => void> = [];\n let closed = false;\n const startTime = Date.now();\n let tokenCount = 0;\n let accumulatedOutput = \"\";\n\n let abortHandler: (() => void) | undefined;\n if (options.signal) {\n abortHandler = () => abortController.abort();\n options.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n const cleanup = () => {\n if (abortHandler && options.signal) {\n options.signal.removeEventListener(\"abort\", abortHandler);\n }\n };\n\n const pushChunk = (chunk: OrchestratorStreamChunk) => {\n if (closed) return;\n const waiter = waiters.shift();\n if (waiter) {\n waiter(chunk);\n } else {\n if (chunks.length >= MAX_AGENT_STREAM_BUFFER) {\n chunks.shift();\n }\n chunks.push(chunk);\n }\n };\n\n const closeStream = () => {\n closed = true;\n cleanup();\n for (const waiter of waiters) {\n waiter(null);\n }\n waiters.length = 0;\n };\n\n const resultPromise = (async (): Promise<RunResult<T>> => {\n pushChunk({\n type: \"progress\",\n phase: \"starting\",\n message: \"Running input guardrails\",\n });\n\n try {\n const result = await runSingleAgent<T>(agentId, input, {\n signal: abortController.signal,\n onMessage: (message) => {\n pushChunk({ type: \"message\", message });\n if (message.role === \"assistant\" && message.content) {\n const newTokens = Math.ceil(message.content.length / 4);\n tokenCount += newTokens;\n accumulatedOutput += message.content;\n if (accumulatedOutput.length > MAX_ACCUMULATED_OUTPUT) {\n accumulatedOutput = accumulatedOutput.slice(\n -MAX_ACCUMULATED_OUTPUT,\n );\n }\n pushChunk({ type: \"token\", data: message.content, tokenCount });\n }\n },\n onToolCall: async (toolCall) => {\n pushChunk({\n type: \"tool_start\",\n tool: toolCall.name,\n toolCallId: toolCall.id,\n arguments: toolCall.arguments,\n });\n if (toolCall.result) {\n pushChunk({\n type: \"tool_end\",\n tool: toolCall.name,\n toolCallId: toolCall.id,\n result: toolCall.result,\n });\n }\n },\n });\n\n const duration = Date.now() - startTime;\n pushChunk({\n type: \"done\",\n totalTokens: result.totalTokens,\n duration,\n droppedTokens: 0,\n });\n closeStream();\n\n return result;\n } catch (error) {\n if (error instanceof GuardrailError) {\n pushChunk({\n type: \"guardrail_triggered\",\n guardrailName: error.guardrailName,\n reason: error.message,\n partialOutput: accumulatedOutput,\n stopped: true,\n });\n }\n pushChunk({\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n });\n closeStream();\n throw error;\n }\n })();\n\n const stream: AsyncIterable<OrchestratorStreamChunk> = {\n [Symbol.asyncIterator](): AsyncIterator<OrchestratorStreamChunk> {\n return {\n async next(): Promise<IteratorResult<OrchestratorStreamChunk>> {\n if (chunks.length > 0) {\n return { done: false, value: chunks.shift()! };\n }\n if (closed) {\n return { done: true, value: undefined };\n }\n\n return new Promise<IteratorResult<OrchestratorStreamChunk>>(\n (resolve) => {\n waiters.push((chunk) => {\n if (chunk === null) {\n resolve({ done: true, value: undefined });\n } else {\n resolve({ done: false, value: chunk });\n }\n });\n },\n );\n },\n };\n },\n };\n\n // Prevent unhandled rejection if caller only consumes stream (not .result)\n resultPromise.catch(() => {});\n\n return {\n stream,\n result: resultPromise,\n abort: () => {\n abortController.abort();\n closeStream();\n },\n };\n }\n\n // ---- Pattern Runners ----\n async function runParallelPattern<T>(\n pattern: ParallelPattern<T>,\n input: string,\n patternId?: string,\n ): Promise<T> {\n const patternStartTime = Date.now();\n if (patternId) {\n fireHook(\"onPatternStart\", {\n patternId,\n patternType: \"parallel\",\n input,\n timestamp: patternStartTime,\n });\n }\n\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n if (pattern.timeout) {\n timeoutId = setTimeout(() => controller.abort(), pattern.timeout);\n }\n\n let patternError: Error | undefined;\n try {\n const promises = pattern.handlers.map((agentId) =>\n runSingleAgent(agentId, input, {\n signal: controller.signal,\n patternId,\n }).catch((error) => {\n if (pattern.minSuccess === undefined) {\n throw error;\n }\n\n return null;\n }),\n );\n\n const results = await Promise.all(promises);\n const successResults = results.filter(\n (r): r is RunResult<unknown> => r !== null,\n );\n\n if (\n pattern.minSuccess !== undefined &&\n successResults.length < pattern.minSuccess\n ) {\n const failCount = results.length - successResults.length;\n\n throw new Error(\n `[Directive MultiAgent] Parallel pattern: Only ${successResults.length}/${pattern.handlers.length} agents succeeded ` +\n `(minimum required: ${pattern.minSuccess}, failed: ${failCount})`,\n );\n }\n\n return pattern.merge(successResults);\n } catch (error) {\n patternError = error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n if (patternId) {\n fireHook(\"onPatternComplete\", {\n patternId,\n patternType: \"parallel\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n }\n\n // ---- Shared checkpoint helper ----\n\n /** Save a pattern checkpoint state to the configured store */\n async function savePatternCheckpoint(\n state: PatternCheckpointState,\n store: CheckpointStore,\n config?: PatternCheckpointConfig,\n ): Promise<string | null> {\n const step = getPatternStep(state);\n\n // Conditional: evaluate when() predicate\n if (config?.when) {\n try {\n const shouldSave = config.when({\n step,\n patternType: state.type,\n facts:\n state.type === \"goal\"\n ? (state as GoalCheckpointState).facts\n : undefined,\n satisfaction:\n state.type === \"goal\"\n ? (state as GoalCheckpointState).lastSatisfaction\n : undefined,\n });\n if (!shouldSave) {\n return null;\n }\n } catch {\n // If when() throws, skip this checkpoint\n return null;\n }\n }\n\n try {\n const checkpoint: Checkpoint = {\n version: 1,\n id: state.id,\n createdAt: state.createdAt,\n label: state.label,\n systemExport: JSON.stringify(state),\n timelineExport: null,\n localState: {\n type: \"multi\",\n globalTokenCount: 0,\n globalStatus: \"idle\",\n agentStates: {},\n handoffCounter: 0,\n pendingHandoffs: [],\n handoffResults: [],\n roundRobinCounters: null,\n },\n memoryExport: null,\n orchestratorType: \"multi\",\n metadata: { patternType: state.type },\n };\n await store.save(checkpoint);\n\n // Record timeline event\n if (timeline) {\n timeline.record({\n type: \"checkpoint_save\",\n timestamp: Date.now(),\n snapshotId: null,\n checkpointId: state.id,\n patternType: state.type,\n step,\n });\n }\n\n fireHook(\"onCheckpointSave\", {\n checkpointId: state.id,\n patternType: state.type,\n step,\n timestamp: Date.now(),\n });\n\n return state.id;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n console.error(\n `[Directive MultiAgent] ${state.type}: checkpoint save failed:`,\n error,\n );\n\n fireHook(\"onCheckpointError\", {\n patternType: state.type,\n step,\n error,\n timestamp: Date.now(),\n });\n\n return null;\n }\n }\n\n // ---- Pattern Runners ----\n\n async function runSequentialPattern<T>(\n pattern: SequentialPattern<T>,\n initialInput: string,\n patternId?: string,\n resumeFrom?: SequentialCheckpointState,\n ): Promise<T> {\n const patternStartTime = Date.now();\n const pId = patternId ?? \"__inline_sequential\";\n if (patternId) {\n fireHook(\"onPatternStart\", {\n patternId,\n patternType: \"sequential\",\n input: initialInput,\n timestamp: patternStartTime,\n });\n }\n\n // Checkpoint config\n const ckptConfig = pattern.checkpoint;\n const ckptStore = ckptConfig?.store ?? checkpointStore;\n const ckptEveryN = ckptConfig?.everyN ?? 5;\n const ckptPrefix = ckptConfig?.labelPrefix ?? \"sequential\";\n\n // Resume state\n let currentInput = resumeFrom?.currentInput ?? initialInput;\n let lastResult: RunResult<unknown> | undefined;\n const collectedResults: Array<{\n agentId: string;\n output: unknown;\n totalTokens: number;\n }> = resumeFrom?.results ? [...resumeFrom.results] : [];\n const startIdx = resumeFrom?.step ?? 0;\n let patternError: Error | undefined;\n\n // Restore lastResult from checkpoint\n if (resumeFrom && collectedResults.length > 0) {\n const last = collectedResults[collectedResults.length - 1]!;\n lastResult = {\n output: last.output,\n totalTokens: last.totalTokens,\n messages: [],\n toolCalls: [],\n };\n }\n\n try {\n for (let i = startIdx; i < pattern.handlers.length; i++) {\n const agentId = pattern.handlers[i]!;\n\n // ---- Breakpoint: pre_pattern_step ----\n {\n const bpResult = await handleBreakpoint(\n \"pre_pattern_step\",\n agentId,\n agents[agentId]?.agent.name ?? agentId,\n currentInput,\n undefined,\n {\n patternId,\n },\n );\n if (bpResult.skip) {\n continue;\n }\n currentInput = bpResult.input;\n }\n\n try {\n lastResult = await runSingleAgent(agentId, currentInput, {\n patternId,\n });\n collectedResults.push({\n agentId,\n output: lastResult.output,\n totalTokens: lastResult.totalTokens,\n });\n\n if (i < pattern.handlers.length - 1) {\n if (pattern.transform) {\n currentInput = pattern.transform(lastResult.output, agentId, i);\n } else {\n currentInput =\n typeof lastResult.output === \"string\"\n ? lastResult.output\n : safeStringify(lastResult.output);\n }\n }\n\n // Save checkpoint after each agent\n if (\n ckptConfig &&\n ckptStore &&\n i > startIdx &&\n (i - startIdx) % ckptEveryN === 0\n ) {\n const nextInput =\n i < pattern.handlers.length - 1 ? currentInput : initialInput;\n await savePatternCheckpoint(\n {\n type: \"sequential\",\n version: 1,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: `${ckptPrefix}:step-${i + 1}`,\n patternId: pId,\n stepsTotal: pattern.handlers.length,\n step: i + 1,\n currentInput: nextInput,\n results: [...collectedResults],\n },\n ckptStore,\n ckptConfig,\n );\n }\n } catch (error) {\n if (!pattern.continueOnError) {\n throw error;\n }\n }\n }\n\n if (!lastResult) {\n throw new Error(\n \"[Directive MultiAgent] No successful results in sequential pattern\",\n );\n }\n\n return pattern.extract\n ? pattern.extract(lastResult.output)\n : (lastResult.output as T);\n } catch (error) {\n patternError = error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (patternId) {\n fireHook(\"onPatternComplete\", {\n patternId,\n patternType: \"sequential\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n }\n\n async function runSupervisorPattern<T>(\n pattern: SupervisorPattern<T>,\n input: string,\n patternId?: string,\n resumeFrom?: SupervisorCheckpointState,\n ): Promise<T> {\n const patternStartTime = Date.now();\n const pId = patternId ?? \"__inline_supervisor\";\n if (patternId) {\n fireHook(\"onPatternStart\", {\n patternId,\n patternType: \"supervisor\",\n input,\n timestamp: patternStartTime,\n });\n }\n\n // Checkpoint config\n const ckptConfig = pattern.checkpoint;\n const ckptStore = ckptConfig?.store ?? checkpointStore;\n const ckptEveryN = ckptConfig?.everyN ?? 5;\n const ckptPrefix = ckptConfig?.labelPrefix ?? \"supervisor\";\n\n const workerResults: RunResult<unknown>[] = [];\n const serializedWorkerResults: Array<{\n output: unknown;\n totalTokens: number;\n }> = resumeFrom?.workerResults ? [...resumeFrom.workerResults] : [];\n const maxRounds = pattern.maxRounds ?? 5;\n if (maxRounds < 1 || !Number.isFinite(maxRounds)) {\n throw new Error(\n \"[Directive MultiAgent] supervisor maxRounds must be >= 1\",\n );\n }\n let patternError: Error | undefined;\n\n // Restore worker results from checkpoint\n if (resumeFrom) {\n for (const wr of resumeFrom.workerResults) {\n workerResults.push({\n output: wr.output,\n totalTokens: wr.totalTokens,\n messages: [],\n toolCalls: [],\n });\n }\n }\n\n const startRound = resumeFrom?.round ?? 0;\n\n try {\n let supervisorResult: RunResult<unknown>;\n if (resumeFrom) {\n supervisorResult = {\n output: resumeFrom.supervisorOutput,\n totalTokens: 0,\n messages: [],\n toolCalls: [],\n };\n } else {\n supervisorResult = await runSingleAgent<unknown>(\n pattern.supervisor,\n input,\n );\n }\n\n let currentInput = resumeFrom?.currentInput ?? input;\n\n for (let round = startRound; round < maxRounds; round++) {\n // Validate supervisor output shape\n const raw = supervisorResult.output;\n let action: {\n action: string;\n worker?: string;\n workerInput?: string;\n output?: unknown;\n };\n\n if (typeof raw === \"string\") {\n try {\n // Strip markdown code fences LLMs often wrap JSON in\n const cleaned = raw.replace(/```(?:json|JSON)?\\s*\\n?/g, \"\").trim();\n action = JSON.parse(cleaned);\n } catch {\n // LLMs sometimes wrap JSON in conversational text or XML tool-call markup\n try {\n // Strip markdown fences + XML tags (models sometimes emit <function_calls>/<invoke>/<parameter> wrappers)\n const stripped = raw\n .replace(/```(?:json|JSON)?\\s*\\n?/g, \"\")\n .replace(/<[^>]+>/g, \" \");\n const extracted = extractJsonFromOutput(stripped);\n if (\n extracted &&\n typeof extracted === \"object\" &&\n \"action\" in (extracted as Record<string, unknown>)\n ) {\n action = extracted as typeof action;\n } else {\n throw new Error(\"extracted value missing 'action' property\");\n }\n } catch {\n throw new Error(\n `[Directive MultiAgent] Supervisor \"${pattern.supervisor}\" returned unparseable output (round ${round + 1}). ` +\n `Expected JSON with { action, worker?, workerInput? } but got: ${raw.slice(0, 200)}`,\n );\n }\n }\n } else if (raw && typeof raw === \"object\" && \"action\" in raw) {\n action = raw as typeof action;\n } else {\n throw new Error(\n `[Directive MultiAgent] Supervisor \"${pattern.supervisor}\" returned invalid output (round ${round + 1}). ` +\n `Expected { action: \"delegate\"|\"complete\", worker?, workerInput? }`,\n );\n }\n\n if (action.action === \"complete\" || !action.worker) {\n break;\n }\n\n if (!pattern.workers.includes(action.worker)) {\n const available = pattern.workers.join(\", \");\n\n throw new Error(\n `[Directive MultiAgent] Supervisor delegated to unknown worker \"${action.worker}\". Available workers: ${available}`,\n );\n }\n\n const workerResult = await runSingleAgent(\n action.worker,\n action.workerInput ?? \"\",\n { patternId },\n );\n workerResults.push(workerResult);\n serializedWorkerResults.push({\n output: workerResult.output,\n totalTokens: workerResult.totalTokens,\n });\n\n currentInput = `Worker ${action.worker} completed with result: ${safeStringify(workerResult.output)}`;\n supervisorResult = await runSingleAgent(\n pattern.supervisor,\n currentInput,\n { patternId },\n );\n\n // Save checkpoint after each round\n if (\n ckptConfig &&\n ckptStore &&\n round > startRound &&\n (round - startRound) % ckptEveryN === 0\n ) {\n await savePatternCheckpoint(\n {\n type: \"supervisor\",\n version: 1,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: `${ckptPrefix}:round-${round + 1}`,\n patternId: pId,\n stepsTotal: pattern.maxRounds ?? 10,\n round: round + 1,\n supervisorOutput: supervisorResult.output,\n workerResults: [...serializedWorkerResults],\n currentInput,\n },\n ckptStore,\n ckptConfig,\n );\n }\n }\n\n return pattern.extract\n ? pattern.extract(supervisorResult.output, workerResults)\n : (supervisorResult.output as T);\n } catch (error) {\n patternError = error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (patternId) {\n fireHook(\"onPatternComplete\", {\n patternId,\n patternType: \"supervisor\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n }\n\n // ---- DAG Pattern Runner ----\n async function runDagPattern<T>(\n pattern: DagPattern<T>,\n input: string,\n patternId?: string,\n resumeFrom?: DagCheckpointState,\n ): Promise<T> {\n const patternStartTime = Date.now();\n const pId = patternId ?? \"__inline_dag\";\n\n if (patternId) {\n fireHook(\"onPatternStart\", {\n patternId,\n patternType: \"dag\",\n input,\n timestamp: patternStartTime,\n });\n }\n\n // Checkpoint config\n const dagCkptConfig = pattern.checkpoint;\n const dagCkptStore = dagCkptConfig?.store ?? checkpointStore;\n const dagCkptEveryN = dagCkptConfig?.everyN ?? 5;\n const dagCkptPrefix = dagCkptConfig?.labelPrefix ?? \"dag\";\n let dagCompletedCount = resumeFrom?.completedCount ?? 0;\n let dagLastCheckpointCount = 0;\n // Serialize concurrent checkpoint saves to prevent race conditions\n let dagCheckpointChain: Promise<unknown> = Promise.resolve();\n const dagTotalNodes = Object.keys(pattern.nodes).length;\n\n const context: DagExecutionContext = {\n input: resumeFrom?.input ?? input,\n outputs: Object.create(null),\n statuses: Object.create(null),\n errors: Object.create(null),\n results: Object.create(null),\n };\n\n // Initialize all nodes as pending\n for (const nodeId of Object.keys(pattern.nodes)) {\n context.statuses[nodeId] = \"pending\";\n }\n\n // Restore from checkpoint\n if (resumeFrom) {\n for (const [nodeId, status] of Object.entries(resumeFrom.statuses)) {\n context.statuses[nodeId] = status;\n }\n for (const [nodeId, output] of Object.entries(resumeFrom.outputs)) {\n context.outputs[nodeId] = output;\n }\n for (const [nodeId, error] of Object.entries(resumeFrom.errors)) {\n context.errors[nodeId] = error;\n }\n for (const [nodeId, nr] of Object.entries(resumeFrom.nodeResults)) {\n context.results[nodeId] = {\n output: nr.output,\n totalTokens: nr.totalTokens,\n messages: [],\n toolCalls: [],\n };\n }\n }\n\n const onNodeError = pattern.onNodeError ?? \"fail\";\n const maxConcurrent = pattern.maxConcurrent ?? Number.POSITIVE_INFINITY;\n const controller = new AbortController();\n let graphTimeoutId: ReturnType<typeof setTimeout> | undefined;\n let patternError: Error | undefined;\n\n if (pattern.timeout) {\n graphTimeoutId = setTimeout(() => controller.abort(), pattern.timeout);\n }\n\n try {\n // Mark root nodes as ready (skip if restoring from checkpoint)\n if (!resumeFrom) {\n for (const [nodeId, node] of Object.entries(pattern.nodes)) {\n if (!node.deps || node.deps.length === 0) {\n context.statuses[nodeId] = \"ready\";\n }\n }\n }\n\n const inflight = new Set<Promise<void>>();\n let running = 0;\n\n function evaluatePendingNodes(): void {\n for (const [nodeId, node] of Object.entries(pattern.nodes)) {\n if (context.statuses[nodeId] !== \"pending\") {\n continue;\n }\n\n // Check if all deps are terminal (completed, skipped, or error for non-fail modes)\n const terminalStatuses =\n onNodeError === \"fail\"\n ? new Set([\"completed\", \"skipped\"])\n : new Set([\"completed\", \"skipped\", \"error\"]);\n const depsResolved = (node.deps ?? []).every((depId) => {\n return terminalStatuses.has(context.statuses[depId]!);\n });\n\n if (!depsResolved) {\n continue;\n }\n\n // Check if any dep errored or was skipped (for skip-downstream propagation)\n if (onNodeError === \"skip-downstream\") {\n const anyDepFailed = (node.deps ?? []).some(\n (depId) =>\n context.statuses[depId] === \"error\" ||\n context.statuses[depId] === \"skipped\",\n );\n if (anyDepFailed) {\n context.statuses[nodeId] = \"skipped\";\n if (timeline) {\n timeline.record({\n type: \"dag_node_update\",\n timestamp: Date.now(),\n snapshotId: null,\n nodeId,\n status: \"skipped\",\n deps: node.deps ?? [],\n });\n }\n fireHook(\"onDagNodeSkipped\", {\n patternId: pId,\n nodeId,\n agentId: node.handler,\n nodeType: tasks[node.handler]\n ? (\"task\" as const)\n : (\"agent\" as const),\n reason: \"upstream dependency errored\",\n timestamp: Date.now(),\n });\n\n continue;\n }\n }\n\n // Evaluate when condition\n if (node.when) {\n try {\n if (!node.when(context)) {\n context.statuses[nodeId] = \"skipped\";\n if (timeline) {\n timeline.record({\n type: \"dag_node_update\",\n timestamp: Date.now(),\n snapshotId: null,\n nodeId,\n status: \"skipped\",\n deps: node.deps ?? [],\n });\n }\n fireHook(\"onDagNodeSkipped\", {\n patternId: pId,\n nodeId,\n agentId: node.handler,\n nodeType: tasks[node.handler]\n ? (\"task\" as const)\n : (\"agent\" as const),\n reason: \"when() returned false\",\n timestamp: Date.now(),\n });\n\n continue;\n }\n } catch {\n context.statuses[nodeId] = \"skipped\";\n\n continue;\n }\n }\n\n context.statuses[nodeId] = \"ready\";\n }\n }\n\n async function launchNode(nodeId: string, node: DagNode): Promise<void> {\n const nodeStartTime = Date.now();\n context.statuses[nodeId] = \"running\";\n\n if (timeline) {\n timeline.record({\n type: \"dag_node_update\",\n timestamp: nodeStartTime,\n snapshotId: null,\n nodeId,\n status: \"running\",\n deps: node.deps ?? [],\n });\n }\n fireHook(\"onDagNodeStart\", {\n patternId: pId,\n nodeId,\n agentId: node.handler,\n nodeType: tasks[node.handler]\n ? (\"task\" as const)\n : (\"agent\" as const),\n timestamp: nodeStartTime,\n });\n\n // Build input\n let nodeInput: string;\n if (node.transform) {\n nodeInput = node.transform(context);\n } else if (node.deps && node.deps.length > 0) {\n const upstreamOutputs: Record<string, unknown> = Object.create(null);\n for (const depId of node.deps) {\n if (context.outputs[depId] !== undefined) {\n upstreamOutputs[depId] = context.outputs[depId];\n }\n }\n nodeInput = JSON.stringify(upstreamOutputs);\n } else {\n nodeInput = input;\n }\n\n // Per-node timeout\n const nodeController = new AbortController();\n let nodeTimeoutId: ReturnType<typeof setTimeout> | undefined;\n if (node.timeout) {\n nodeTimeoutId = setTimeout(\n () => nodeController.abort(),\n node.timeout,\n );\n }\n\n // Forward graph-level abort\n const abortHandler = () => nodeController.abort();\n controller.signal.addEventListener(\"abort\", abortHandler, {\n once: true,\n });\n\n try {\n const result = await runSingleAgent(node.handler, nodeInput, {\n signal: nodeController.signal,\n patternId: pId,\n });\n\n context.outputs[nodeId] = result.output;\n context.results[nodeId] = result;\n context.statuses[nodeId] = \"completed\";\n\n if (timeline) {\n timeline.record({\n type: \"dag_node_update\",\n timestamp: Date.now(),\n snapshotId: null,\n nodeId,\n status: \"completed\",\n deps: node.deps ?? [],\n });\n }\n fireHook(\"onDagNodeComplete\", {\n patternId: pId,\n nodeId,\n agentId: node.handler,\n nodeType: tasks[node.handler]\n ? (\"task\" as const)\n : (\"agent\" as const),\n durationMs: Date.now() - nodeStartTime,\n timestamp: Date.now(),\n });\n\n // Save checkpoint after node completion (serialized to prevent concurrent race)\n dagCompletedCount++;\n if (\n dagCkptConfig &&\n dagCkptStore &&\n dagCompletedCount > dagLastCheckpointCount &&\n dagCompletedCount - dagLastCheckpointCount >= dagCkptEveryN\n ) {\n dagLastCheckpointCount = dagCompletedCount;\n const nodeResults: Record<\n string,\n { output: unknown; totalTokens: number }\n > = Object.create(null);\n for (const [nid, r] of Object.entries(context.results)) {\n nodeResults[nid] = {\n output: r.output,\n totalTokens: r.totalTokens,\n };\n }\n const ckptState = {\n type: \"dag\" as const,\n version: 1 as const,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: `${dagCkptPrefix}:node-${dagCompletedCount}`,\n patternId: pId,\n stepsTotal: dagTotalNodes,\n statuses: { ...context.statuses },\n outputs: { ...context.outputs },\n errors: { ...context.errors },\n completedCount: dagCompletedCount,\n nodeResults,\n input: context.input,\n };\n dagCheckpointChain = dagCheckpointChain.then(() =>\n savePatternCheckpoint(ckptState, dagCkptStore!, dagCkptConfig),\n );\n await dagCheckpointChain;\n }\n } catch (error) {\n context.statuses[nodeId] = \"error\";\n context.errors[nodeId] =\n error instanceof Error ? error.message : String(error);\n\n if (timeline) {\n timeline.record({\n type: \"dag_node_update\",\n timestamp: Date.now(),\n snapshotId: null,\n nodeId,\n status: \"error\",\n deps: node.deps ?? [],\n });\n }\n fireHook(\"onDagNodeError\", {\n patternId: pId,\n nodeId,\n agentId: node.handler,\n nodeType: tasks[node.handler]\n ? (\"task\" as const)\n : (\"agent\" as const),\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - nodeStartTime,\n timestamp: Date.now(),\n });\n\n if (onNodeError === \"fail\") {\n controller.abort();\n throw error;\n }\n // \"continue\" and \"skip-downstream\" just keep going\n } finally {\n if (nodeTimeoutId) {\n clearTimeout(nodeTimeoutId);\n }\n controller.signal.removeEventListener(\"abort\", abortHandler);\n running--;\n }\n }\n\n // Main loop\n while (true) {\n if (controller.signal.aborted) {\n break;\n }\n\n evaluatePendingNodes();\n\n // Collect ready nodes sorted by priority (descending)\n const readyNodes = Object.entries(pattern.nodes)\n .filter(([nodeId]) => context.statuses[nodeId] === \"ready\")\n .sort(([, a], [, b]) => (b.priority ?? 0) - (a.priority ?? 0));\n\n // Launch ready nodes up to maxConcurrent\n for (const [nodeId, node] of readyNodes) {\n if (running >= maxConcurrent) {\n break;\n }\n running++;\n const promise = launchNode(nodeId, node).finally(() => {\n inflight.delete(promise);\n });\n inflight.add(promise);\n }\n\n // Check if we're done\n const hasPendingOrRunning = Object.values(context.statuses).some(\n (s) => s === \"pending\" || s === \"running\" || s === \"ready\",\n );\n if (!hasPendingOrRunning) {\n break;\n }\n\n // Wait for at least one inflight to complete\n if (inflight.size > 0) {\n await Promise.race(inflight);\n } else {\n // No inflight and still pending — must be stuck (unreachable deps)\n break;\n }\n }\n\n // Wait for remaining inflight\n if (inflight.size > 0) {\n await Promise.allSettled(inflight);\n }\n\n return await pattern.merge(context);\n } catch (error) {\n patternError = error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (graphTimeoutId) {\n clearTimeout(graphTimeoutId);\n }\n if (patternId) {\n fireHook(\"onPatternComplete\", {\n patternId,\n patternType: \"dag\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n }\n\n // ---- Reflect Pattern Runner ----\n async function runReflectPattern<T>(\n pattern: ReflectPattern<T>,\n input: string,\n patternId?: string,\n resumeFrom?: ReflectCheckpointState,\n ): Promise<T> {\n const patternStartTime = Date.now();\n const pId = patternId ?? \"__inline_reflect\";\n const maxIterations = pattern.maxIterations ?? 2;\n\n if (maxIterations < 1) {\n throw new Error(\n \"[Directive MultiAgent] Reflect pattern maxIterations must be >= 1\",\n );\n }\n if (debug && maxIterations > 3) {\n console.warn(\n \"[Directive MultiAgent] Reflection loops > 3 iterations rarely improve quality. Consider reducing maxIterations.\",\n );\n }\n\n // Merge timeout into signal if provided\n let effectiveSignal = pattern.signal;\n let reflectTimeoutId: ReturnType<typeof setTimeout> | undefined;\n let reflectExternalOnAbort: (() => void) | undefined;\n if (pattern.timeout && !effectiveSignal) {\n const controller = new AbortController();\n reflectTimeoutId = setTimeout(() => controller.abort(), pattern.timeout);\n effectiveSignal = controller.signal;\n } else if (pattern.timeout && effectiveSignal) {\n // Both timeout and signal: combine them\n const controller = new AbortController();\n reflectTimeoutId = setTimeout(() => controller.abort(), pattern.timeout);\n reflectExternalOnAbort = () => controller.abort();\n effectiveSignal.addEventListener(\"abort\", reflectExternalOnAbort, {\n once: true,\n });\n effectiveSignal = controller.signal;\n }\n\n const parseEvaluation =\n pattern.parseEvaluation ??\n ((output: unknown): ReflectionEvaluation => {\n if (typeof output === \"string\") {\n try {\n return JSON.parse(output);\n } catch {\n return {\n passed: false,\n feedback: `Evaluator returned unparseable output: ${output.slice(0, 200)}`,\n };\n }\n }\n if (output && typeof output === \"object\" && \"passed\" in output) {\n return output as ReflectionEvaluation;\n }\n\n return { passed: false, feedback: \"Evaluator returned invalid format\" };\n });\n const buildRetryInput =\n pattern.buildRetryInput ??\n ((inp: string, feedback: string, _iteration: number) =>\n `${inp}\\n\\nFeedback on your previous response:\\n${feedback}\\n\\nPlease improve your response.`);\n\n if (patternId) {\n fireHook(\"onPatternStart\", {\n patternId: pId,\n patternType: \"reflect\",\n input,\n timestamp: patternStartTime,\n });\n }\n\n // Checkpoint config\n const reflectCkptConfig = pattern.checkpoint;\n const reflectCkptStore = reflectCkptConfig?.store ?? checkpointStore;\n const reflectCkptEveryN = reflectCkptConfig?.everyN ?? 5;\n const reflectCkptPrefix = reflectCkptConfig?.labelPrefix ?? \"reflect\";\n\n let patternError: Error | undefined;\n let lastProducerResult: RunResult<unknown> | undefined;\n const history: ReflectIterationRecord[] = resumeFrom?.history\n ? [...resumeFrom.history]\n : [];\n // Track per-iteration producer outputs for accept-best\n const producerOutputs: Array<{ output: unknown; score?: number }> =\n resumeFrom?.producerOutputs ? [...resumeFrom.producerOutputs] : [];\n const startIteration = resumeFrom?.iteration ?? 0;\n\n // Restore last producer result from checkpoint\n if (resumeFrom?.lastProducerOutput != null) {\n lastProducerResult = {\n output: resumeFrom.lastProducerOutput,\n totalTokens: 0,\n messages: [],\n toolCalls: [],\n };\n }\n\n try {\n let effectiveInput = resumeFrom?.effectiveInput ?? input;\n\n for (\n let iteration = startIteration;\n iteration < maxIterations;\n iteration++\n ) {\n // Check abort signal at top of each iteration\n if (effectiveSignal?.aborted) {\n if (lastProducerResult) {\n lastReflectionHistory = history;\n\n return pattern.extract\n ? pattern.extract(lastProducerResult.output)\n : (lastProducerResult.output as T);\n }\n\n throw new DOMException(\"Reflect pattern aborted\", \"AbortError\");\n }\n\n const iterStart = Date.now();\n\n // Run producer (pass signal through)\n const producerResult = await runSingleAgent(\n pattern.handler,\n effectiveInput,\n { signal: effectiveSignal, patternId },\n );\n lastProducerResult = producerResult;\n const producerOutput =\n typeof producerResult.output === \"string\"\n ? producerResult.output\n : safeStringify(producerResult.output);\n\n // Check abort after producer, before evaluator\n if (effectiveSignal?.aborted) {\n lastReflectionHistory = history;\n\n return pattern.extract\n ? pattern.extract(producerResult.output)\n : (producerResult.output as T);\n }\n\n // Run evaluator (pass signal through)\n const evaluatorResult = await runSingleAgent(\n pattern.evaluator,\n producerOutput,\n { signal: effectiveSignal, patternId },\n );\n let evaluation: ReflectionEvaluation;\n try {\n evaluation = parseEvaluation(evaluatorResult.output);\n } catch (parseError) {\n evaluation = {\n passed: false,\n feedback: `Evaluation parse error: ${parseError instanceof Error ? parseError.message : String(parseError)}`,\n };\n }\n\n // Apply threshold-based pass override\n if (\n !evaluation.passed &&\n pattern.threshold != null &&\n evaluation.score != null\n ) {\n const thresholdValue =\n typeof pattern.threshold === \"function\"\n ? pattern.threshold(iteration)\n : pattern.threshold;\n if (evaluation.score >= thresholdValue) {\n evaluation = { ...evaluation, passed: true };\n }\n }\n\n const iterDurationMs = Date.now() - iterStart;\n\n // Store producer output for accept-best\n producerOutputs.push({\n output: producerResult.output,\n score: evaluation.score,\n });\n\n // Build iteration record\n const record: ReflectIterationRecord = {\n iteration,\n passed: evaluation.passed,\n score: evaluation.score,\n feedback: evaluation.feedback,\n durationMs: iterDurationMs,\n producerTokens: producerResult.totalTokens ?? 0,\n evaluatorTokens: evaluatorResult.totalTokens ?? 0,\n };\n history.push(record);\n\n // Fire onIteration callback\n if (pattern.onIteration) {\n try {\n pattern.onIteration(record);\n } catch (cbError) {\n if (debug) {\n console.warn(\n \"[Directive MultiAgent] onIteration callback threw:\",\n cbError,\n );\n }\n }\n }\n\n // Record timeline event\n if (timeline) {\n timeline.record({\n type: \"reflection_iteration\",\n timestamp: Date.now(),\n snapshotId: null,\n iteration,\n passed: evaluation.passed,\n score: evaluation.score,\n durationMs: iterDurationMs,\n producerTokens: producerResult.totalTokens,\n evaluatorTokens: evaluatorResult.totalTokens,\n });\n }\n\n if (evaluation.passed) {\n lastReflectionHistory = history;\n\n return pattern.extract\n ? pattern.extract(producerResult.output)\n : (producerResult.output as T);\n }\n\n // Build retry input for next iteration\n if (iteration < maxIterations - 1 && evaluation.feedback) {\n try {\n effectiveInput = buildRetryInput(\n input,\n evaluation.feedback,\n iteration,\n );\n } catch (retryError) {\n if (debug) {\n console.warn(\n \"[Directive MultiAgent] buildRetryInput threw, using default format:\",\n retryError,\n );\n }\n effectiveInput = `${input}\\n\\nFeedback on your previous response:\\n${evaluation.feedback}\\n\\nPlease improve your response.`;\n }\n }\n\n // Save checkpoint after each iteration\n if (\n reflectCkptConfig &&\n reflectCkptStore &&\n iteration >= startIteration &&\n (iteration - startIteration + 1) % reflectCkptEveryN === 0\n ) {\n await savePatternCheckpoint(\n {\n type: \"reflect\",\n version: 1,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: `${reflectCkptPrefix}:iter-${iteration + 1}`,\n patternId: pId,\n stepsTotal: maxIterations,\n iteration: iteration + 1,\n effectiveInput,\n history: [...history],\n producerOutputs: [...producerOutputs],\n lastProducerOutput: producerResult.output,\n },\n reflectCkptStore,\n reflectCkptConfig,\n );\n }\n }\n\n lastReflectionHistory = history;\n\n // Exhausted\n if (pattern.onExhausted === \"throw\") {\n throw new ReflectionExhaustedError({\n iterations: maxIterations,\n history: history.map((h) => ({\n passed: h.passed,\n feedback: h.feedback,\n score: h.score,\n })),\n lastResult: lastProducerResult!,\n totalTokens: lastProducerResult!.totalTokens ?? 0,\n });\n }\n\n // \"accept-best\" — pick iteration with highest score\n if (pattern.onExhausted === \"accept-best\" && producerOutputs.length > 0) {\n const hasAnyScore = producerOutputs.some((p) => p.score != null);\n if (!hasAnyScore && debug) {\n console.warn(\n \"[Directive MultiAgent] accept-best exhaustion strategy used but no iterations returned scores. Falling back to last output.\",\n );\n }\n let bestIdx = producerOutputs.length - 1;\n let bestScore = Number.NEGATIVE_INFINITY;\n for (let i = 0; i < producerOutputs.length; i++) {\n const s = producerOutputs[i]!.score;\n if (s != null && s > bestScore) {\n bestScore = s;\n bestIdx = i;\n }\n }\n\n const bestOutput = producerOutputs[bestIdx]!.output;\n\n return pattern.extract\n ? pattern.extract(bestOutput)\n : (bestOutput as T);\n }\n\n // \"accept-last\" (default)\n return pattern.extract\n ? pattern.extract(lastProducerResult!.output)\n : (lastProducerResult!.output as T);\n } catch (error) {\n lastReflectionHistory = history;\n patternError = error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (reflectTimeoutId) {\n clearTimeout(reflectTimeoutId);\n }\n if (reflectExternalOnAbort && pattern.signal) {\n pattern.signal.removeEventListener(\"abort\", reflectExternalOnAbort);\n }\n if (patternId) {\n fireHook(\"onPatternComplete\", {\n patternId: pId,\n patternType: \"reflect\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n }\n\n // ---- Race Pattern Runner ----\n async function runRacePattern<T>(\n pattern: RacePattern<T>,\n input: string,\n patternId?: string,\n ): Promise<RaceResult<T>> {\n if (pattern.handlers.length === 0) {\n throw new Error(\n \"[Directive MultiAgent] Race pattern requires at least one agent\",\n );\n }\n\n const minSuccess = pattern.minSuccess ?? 1;\n\n if (!Number.isInteger(minSuccess) || minSuccess < 1) {\n throw new Error(\n \"[Directive MultiAgent] Race pattern minSuccess must be a positive integer\",\n );\n }\n if (minSuccess > pattern.handlers.length) {\n throw new Error(\n `[Directive MultiAgent] Race pattern minSuccess (${minSuccess}) exceeds agent count (${pattern.handlers.length})`,\n );\n }\n\n // Validate handler IDs (agents or tasks)\n for (const agentId of pattern.handlers) {\n if (!agents[agentId] && !tasks[agentId]) {\n throw new Error(\n `[Directive MultiAgent] Race: unknown handler \"${agentId}\"`,\n );\n }\n }\n\n const patternStartTime = Date.now();\n const pId = patternId ?? \"__inline_race\";\n const controller = new AbortController();\n let raceTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n // Wire external signal into internal controller\n let raceExternalOnAbort: (() => void) | undefined;\n if (pattern.signal) {\n if (pattern.signal.aborted) {\n controller.abort();\n } else {\n raceExternalOnAbort = () => controller.abort();\n pattern.signal.addEventListener(\"abort\", raceExternalOnAbort, {\n once: true,\n });\n }\n }\n\n if (patternId) {\n fireHook(\"onPatternStart\", {\n patternId: pId,\n patternType: \"race\",\n input,\n timestamp: patternStartTime,\n });\n }\n\n if (timeline) {\n timeline.record({\n type: \"race_start\",\n timestamp: patternStartTime,\n snapshotId: null,\n patternId: pId,\n agents: pattern.handlers,\n });\n }\n\n if (pattern.timeout) {\n raceTimeoutId = setTimeout(() => controller.abort(), pattern.timeout);\n }\n\n let patternError: Error | undefined;\n const agentErrors: Record<string, string> = Object.create(null);\n const startedAgents = [...pattern.handlers];\n\n try {\n // Start all agents, collecting promises\n type RaceEntry = {\n agentId: string;\n promise: Promise<{ agentId: string; result: RunResult<unknown> }>;\n };\n const entries: RaceEntry[] = pattern.handlers.map((agentId) => ({\n agentId,\n // Output guardrails are already checked inside runSingleAgent\n promise: runSingleAgent(agentId, input, {\n signal: controller.signal,\n patternId,\n }).then((result) => ({ agentId, result })),\n }));\n\n // Custom race: track settled count, await all promises for cleanup\n const allPromises = entries.map((e) => e.promise.catch(() => undefined));\n\n const collectedResults: Array<{\n agentId: string;\n result: RunResult<unknown>;\n }> = [];\n\n const result = await new Promise<\n Array<{ agentId: string; result: RunResult<unknown> }>\n >((resolve, reject) => {\n let settledCount = 0;\n let resolved = false;\n\n for (const entry of entries) {\n entry.promise\n .then((winner) => {\n settledCount++;\n if (resolved) {\n return;\n }\n collectedResults.push(winner);\n if (collectedResults.length >= minSuccess) {\n resolved = true;\n controller.abort();\n resolve([...collectedResults]);\n }\n })\n .catch((error) => {\n agentErrors[entry.agentId] =\n error instanceof Error ? error.message : String(error);\n settledCount++;\n\n if (resolved) {\n return;\n }\n\n const failedCount = Object.keys(agentErrors).length;\n const maxPossibleSuccesses =\n collectedResults.length + (entries.length - settledCount);\n\n // All agents failed\n if (\n settledCount === entries.length &&\n failedCount === entries.length\n ) {\n resolved = true;\n reject(\n new Error(\n `[Directive MultiAgent] Race: all ${entries.length} agents failed.\\n` +\n Object.entries(agentErrors)\n .map(([id, msg]) => ` - ${id}: ${msg}`)\n .join(\"\\n\"),\n ),\n );\n } else if (maxPossibleSuccesses < minSuccess) {\n // Impossible to reach minSuccess — some succeeded but not enough can\n resolved = true;\n reject(\n new Error(\n `[Directive MultiAgent] Race: cannot reach minSuccess (${minSuccess}). ` +\n `${failedCount} agent(s) failed.\\n` +\n Object.entries(agentErrors)\n .map(([id, msg]) => ` - ${id}: ${msg}`)\n .join(\"\\n\"),\n ),\n );\n }\n });\n }\n });\n\n // Wait for all losing agents to settle so their side effects\n // (token counting, state mutations) complete before we return\n await Promise.all(allPromises).catch(() => {});\n\n // First result is the \"winner\" (fastest) — guaranteed to exist since minSuccess >= 1\n const first = result[0]!;\n const winnerId = first.agentId;\n const successIds = new Set(result.map((r) => r.agentId));\n const cancelledIds = startedAgents.filter(\n (id) => !successIds.has(id) && !(id in agentErrors),\n );\n\n if (timeline) {\n timeline.record({\n type: \"race_winner\",\n timestamp: Date.now(),\n snapshotId: null,\n patternId: pId,\n winnerId,\n durationMs: Date.now() - patternStartTime,\n });\n if (cancelledIds.length > 0) {\n timeline.record({\n type: \"race_cancelled\",\n timestamp: Date.now(),\n snapshotId: null,\n patternId: pId,\n cancelledIds,\n reason: \"winner_found\",\n });\n }\n }\n\n const extracted = pattern.extract\n ? pattern.extract(first.result)\n : (first.result.output as T);\n\n // Build allResults when minSuccess > 1\n const allResults =\n minSuccess > 1\n ? result.map((r) => ({\n agentId: r.agentId,\n result: pattern.extract\n ? pattern.extract(r.result)\n : (r.result.output as T),\n }))\n : undefined;\n\n return { winnerId, result: extracted, allResults };\n } catch (error) {\n patternError = error instanceof Error ? error : new Error(String(error));\n\n // Record cancellation due to all-failed or timeout\n if (timeline) {\n timeline.record({\n type: \"race_cancelled\",\n timestamp: Date.now(),\n snapshotId: null,\n patternId: pId,\n cancelledIds: startedAgents,\n reason: controller.signal.aborted ? \"timeout\" : \"all_failed\",\n });\n }\n\n throw error;\n } finally {\n if (raceTimeoutId) {\n clearTimeout(raceTimeoutId);\n }\n if (raceExternalOnAbort && pattern.signal) {\n pattern.signal.removeEventListener(\"abort\", raceExternalOnAbort);\n }\n if (patternId) {\n fireHook(\"onPatternComplete\", {\n patternId: pId,\n patternType: \"race\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n }\n\n // ---- Debate Pattern Runner ----\n async function runDebateInternal<T>(\n pattern: DebatePattern<T>,\n input: string,\n patternId?: string,\n resumeFrom?: DebateCheckpointState,\n ): Promise<DebateResult<T>> {\n const {\n handlers: debateAgents,\n evaluator,\n maxRounds = 2,\n extract,\n parseJudgement,\n } = pattern;\n\n if (debateAgents.length < 2) {\n throw new Error(\n \"[Directive MultiAgent] debate requires at least 2 handlers\",\n );\n }\n if (maxRounds < 1 || !Number.isFinite(maxRounds)) {\n throw new Error(\"[Directive MultiAgent] debate maxRounds must be >= 1\");\n }\n\n // Signal/timeout composition\n let effectiveSignal = pattern.signal;\n let debateTimeoutId: ReturnType<typeof setTimeout> | undefined;\n let externalOnAbort: (() => void) | undefined;\n if (pattern.timeout && !effectiveSignal) {\n const ctrl = new AbortController();\n debateTimeoutId = setTimeout(() => ctrl.abort(), pattern.timeout);\n effectiveSignal = ctrl.signal;\n } else if (pattern.timeout && effectiveSignal) {\n const ctrl = new AbortController();\n debateTimeoutId = setTimeout(() => ctrl.abort(), pattern.timeout);\n externalOnAbort = () => ctrl.abort();\n effectiveSignal.addEventListener(\"abort\", externalOnAbort, {\n once: true,\n });\n effectiveSignal = ctrl.signal;\n }\n\n const defaultParseJudgement = (\n output: unknown,\n ): { winnerId: string; feedback?: string; score?: number } => {\n if (typeof output === \"string\") {\n try {\n const parsed = JSON.parse(output);\n if (\n parsed &&\n typeof parsed === \"object\" &&\n typeof parsed.winnerId === \"string\"\n ) {\n return parsed;\n }\n\n if (debug) {\n console.warn(\n \"[Directive MultiAgent] defaultParseJudgement: parsed JSON missing winnerId, falling back to first agent\",\n );\n }\n\n return { winnerId: debateAgents[0]! };\n } catch {\n if (debug) {\n console.warn(\n \"[Directive MultiAgent] defaultParseJudgement: output is not valid JSON, falling back to first agent\",\n );\n }\n\n return { winnerId: debateAgents[0]! };\n }\n }\n if (\n output &&\n typeof output === \"object\" &&\n \"winnerId\" in output &&\n typeof (output as Record<string, unknown>).winnerId === \"string\"\n ) {\n return output as {\n winnerId: string;\n feedback?: string;\n score?: number;\n };\n }\n\n if (debug) {\n console.warn(\n \"[Directive MultiAgent] defaultParseJudgement: unrecognized output format, falling back to first agent\",\n );\n }\n\n return { winnerId: debateAgents[0]! };\n };\n\n const parseJudge = parseJudgement ?? defaultParseJudgement;\n const rounds: DebateResult<T>[\"rounds\"] = resumeFrom?.rounds\n ? [...resumeFrom.rounds]\n : [];\n let currentInput = resumeFrom?.currentInput ?? input;\n let lastWinnerId = resumeFrom?.lastWinnerId ?? debateAgents[0]!;\n let lastWinnerOutput: unknown = resumeFrom?.lastWinnerOutput ?? undefined;\n const startRound = resumeFrom?.round ?? 0;\n\n // Checkpoint config\n const debateCkptConfig = pattern.checkpoint;\n const debateCkptStore = debateCkptConfig?.store ?? checkpointStore;\n const debateCkptEveryN = debateCkptConfig?.everyN ?? 5;\n const debateCkptPrefix = debateCkptConfig?.labelPrefix ?? \"debate\";\n\n const pId = patternId ?? \"__inline_debate\";\n const patternStartTime = Date.now();\n let debateTotalTokens = resumeFrom?.tokensConsumed ?? 0;\n\n if (patternId) {\n fireHook(\"onPatternStart\", {\n patternId: pId,\n patternType: \"debate\",\n input,\n timestamp: patternStartTime,\n });\n }\n\n let patternError: Error | undefined;\n try {\n for (let round = startRound; round < maxRounds; round++) {\n if (effectiveSignal?.aborted) {\n break;\n }\n\n const proposalPromises = debateAgents.map(async (agentId) => {\n const result = await runSingleAgent(agentId, currentInput, {\n signal: effectiveSignal,\n patternId: pId,\n });\n debateTotalTokens += result.totalTokens;\n\n return { agentId, output: result.output };\n });\n const proposals = await Promise.all(proposalPromises);\n\n if (effectiveSignal?.aborted) {\n break;\n }\n\n const evalInput = JSON.stringify({\n round: round + 1,\n totalRounds: maxRounds,\n proposals: proposals.map((p) => ({\n agentId: p.agentId,\n proposal: p.output,\n })),\n });\n\n const evalResult = await runSingleAgent(evaluator, evalInput, {\n signal: effectiveSignal,\n patternId: pId,\n });\n debateTotalTokens += evalResult.totalTokens;\n const judgement = parseJudge(evalResult.output);\n\n // Validate winnerId\n if (!debateAgents.includes(judgement.winnerId)) {\n judgement.winnerId = debateAgents[0]!;\n }\n\n rounds.push({ proposals, judgement });\n\n // Record debate round timeline event\n if (timeline) {\n timeline.record({\n type: \"debate_round\",\n timestamp: Date.now(),\n snapshotId: null,\n patternId: pId,\n round: round + 1,\n totalRounds: maxRounds,\n winnerId: judgement.winnerId,\n score: judgement.score,\n agentCount: debateAgents.length,\n });\n }\n\n lastWinnerId = judgement.winnerId;\n const winnerProposal = proposals.find(\n (p) => p.agentId === judgement.winnerId,\n );\n lastWinnerOutput = winnerProposal?.output ?? proposals[0]!.output;\n\n // Save checkpoint at configured intervals\n if (\n debateCkptConfig &&\n debateCkptStore &&\n round > startRound &&\n (round - startRound) % debateCkptEveryN === 0\n ) {\n const ckptState: DebateCheckpointState = {\n type: \"debate\",\n version: 1,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: `${debateCkptPrefix}:round-${round + 1}`,\n patternId: pId,\n stepsTotal: maxRounds,\n round: round + 1,\n currentInput,\n rounds: [...rounds],\n lastWinnerId,\n lastWinnerOutput,\n tokensConsumed: debateTotalTokens,\n };\n await savePatternCheckpoint(\n ckptState,\n debateCkptStore,\n debateCkptConfig,\n );\n }\n\n if (round < maxRounds - 1 && judgement.feedback) {\n currentInput = `Previous round feedback: ${judgement.feedback}\\n\\nOriginal task: ${input}`;\n }\n }\n\n if (rounds.length === 0) {\n throw new Error(\n \"[Directive MultiAgent] Debate aborted before any round completed\",\n );\n }\n\n const result = extract\n ? extract(lastWinnerOutput)\n : (lastWinnerOutput as T);\n\n return { winnerId: lastWinnerId, result, rounds };\n } catch (error) {\n patternError = error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (debateTimeoutId) {\n clearTimeout(debateTimeoutId);\n }\n if (externalOnAbort && pattern.signal) {\n pattern.signal.removeEventListener(\"abort\", externalOnAbort);\n }\n if (patternId) {\n fireHook(\"onPatternComplete\", {\n patternId: pId,\n patternType: \"debate\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n }\n\n // ---- Goal Pattern Implementation ----\n\n /** Keys that must never appear in goal facts (prototype pollution guard) */\n const GOAL_BLOCKED_KEYS = new Set([\n \"__proto__\",\n \"constructor\",\n \"prototype\",\n \"toString\",\n \"valueOf\",\n \"hasOwnProperty\",\n ]);\n\n function goalSafeMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n ): void {\n for (const key of Object.keys(source)) {\n if (!GOAL_BLOCKED_KEYS.has(key)) {\n target[key] = source[key];\n }\n }\n }\n\n /**\n * Detect cycles in goal node dependency graph.\n * Builds an implicit DAG from produces/requires and applies Kahn's algorithm.\n */\n function validateGoalAcyclic(\n pId: string,\n nodes: Record<string, GoalNode>,\n ): void {\n // Build producer map: factKey → nodeId(s) that produce it\n const producerMap: Record<string, string[]> = Object.create(null);\n for (const [nodeId, node] of Object.entries(nodes)) {\n for (const key of node.produces) {\n if (!producerMap[key]) {\n producerMap[key] = [];\n }\n producerMap[key]!.push(nodeId);\n }\n }\n\n // Build adjacency from requires → produces edges\n const nodeIds = Object.keys(nodes);\n const inDegree: Record<string, number> = Object.create(null);\n const adjacency: Record<string, string[]> = Object.create(null);\n for (const id of nodeIds) {\n inDegree[id] = 0;\n adjacency[id] = [];\n }\n\n for (const [nodeId, node] of Object.entries(nodes)) {\n for (const reqKey of node.requires ?? []) {\n const producers = producerMap[reqKey];\n if (producers) {\n for (const producerId of producers) {\n if (producerId !== nodeId) {\n adjacency[producerId]!.push(nodeId);\n inDegree[nodeId] = (inDegree[nodeId] ?? 0) + 1;\n }\n }\n }\n }\n }\n\n // Kahn's algorithm\n const queue: string[] = [];\n for (const id of nodeIds) {\n if (inDegree[id] === 0) {\n queue.push(id);\n }\n }\n\n let visited = 0;\n while (queue.length > 0) {\n const current = queue.shift()!;\n visited++;\n for (const dependent of adjacency[current] ?? []) {\n inDegree[dependent]!--;\n if (inDegree[dependent] === 0) {\n queue.push(dependent);\n }\n }\n }\n\n if (visited !== nodeIds.length) {\n throw new Error(\n `[Directive MultiAgent] goal pattern \"${pId}\": cycle detected in produces/requires graph. Visited ${visited}/${nodeIds.length} nodes.`,\n );\n }\n }\n\n /**\n * Validate that no two nodes produce the same fact key (M1: producer conflict detection).\n * Logs a dev-mode warning rather than throwing, since some use cases intentionally overlap.\n */\n function validateProducerConflicts(\n pId: string,\n nodes: Record<string, GoalNode>,\n ): void {\n const producerMap: Record<string, string[]> = Object.create(null);\n for (const [nodeId, node] of Object.entries(nodes)) {\n for (const key of node.produces) {\n if (!producerMap[key]) {\n producerMap[key] = [];\n }\n producerMap[key]!.push(nodeId);\n }\n }\n\n for (const [key, producers] of Object.entries(producerMap)) {\n if (producers.length > 1) {\n console.warn(\n `[Directive MultiAgent] goal pattern \"${pId}\": fact key \"${key}\" is produced by multiple nodes: ${producers.join(\", \")}. Last writer wins.`,\n );\n }\n }\n }\n\n /** Safe wrapper for user-provided callbacks (C1). */\n function safeCall<A extends unknown[], R>(\n fn: ((...args: A) => R) | undefined,\n ...args: A\n ): R | undefined {\n if (!fn) {\n return undefined;\n }\n\n try {\n return fn(...args);\n } catch (err) {\n console.error(\"[Directive MultiAgent] goal: user callback threw:\", err);\n\n return undefined;\n }\n }\n\n /** Safe wrapper for async user-provided callbacks (C1). */\n async function safeCallAsync<A extends unknown[], R>(\n fn: ((...args: A) => R | Promise<R>) | undefined,\n ...args: A\n ): Promise<R | undefined> {\n if (!fn) {\n return undefined;\n }\n\n try {\n return await fn(...args);\n } catch (err) {\n console.error(\"[Directive MultiAgent] goal: user callback threw:\", err);\n\n return undefined;\n }\n }\n\n /** Compute estimatedStepsRemaining and decelerating from step history (M7). */\n function computeGoalMetrics(\n currentSatisfaction: number,\n stepMetrics: GoalStepMetrics[],\n _step: number,\n ): GoalMetrics {\n // Calculate recent progress rate (average delta over last 3 steps)\n const recentSteps = stepMetrics.slice(-3);\n const avgDelta =\n recentSteps.length > 0\n ? recentSteps.reduce((sum, s) => sum + s.satisfactionDelta, 0) /\n recentSteps.length\n : 0;\n\n let estimatedStepsRemaining: number | null = null;\n if (avgDelta > 0 && currentSatisfaction < 1.0) {\n estimatedStepsRemaining = Math.ceil(\n (1.0 - currentSatisfaction) / avgDelta,\n );\n }\n\n // Decelerating: compare last 3 deltas to prior 3 deltas\n let decelerating = false;\n if (stepMetrics.length >= 6) {\n const recent3 = stepMetrics.slice(-3);\n const prior3 = stepMetrics.slice(-6, -3);\n const recentAvg =\n recent3.reduce((s, m) => s + m.satisfactionDelta, 0) / 3;\n const priorAvg = prior3.reduce((s, m) => s + m.satisfactionDelta, 0) / 3;\n decelerating = recentAvg < priorAvg * 0.5;\n }\n\n return {\n satisfaction: currentSatisfaction,\n progressRate: avgDelta,\n estimatedStepsRemaining,\n decelerating,\n };\n }\n\n /** Clamp satisfaction to [0, 1] and guard against NaN/Infinity (M4). */\n function clampSatisfaction(value: number | undefined): number {\n if (value == null || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.min(1, value));\n }\n\n async function runGoalInternal<T>(\n pattern: GoalPattern<T>,\n initialInput: string | Record<string, unknown>,\n patternId?: string,\n resumeFrom?: GoalCheckpointState,\n ): Promise<GoalResult<T>> {\n const {\n nodes: originalNodes,\n when: goalWhen,\n satisfaction: satisfactionFn,\n maxSteps = 50,\n extract,\n selectionStrategy,\n relaxation,\n onStep,\n onStall,\n } = pattern;\n\n // Shadow copy of nodes so relaxation mutations don't affect the original (M2)\n const nodes: Record<string, GoalNode> = Object.create(null);\n for (const [id, node] of Object.entries(originalNodes)) {\n nodes[id] = { ...node };\n }\n\n const nodeIds = Object.keys(nodes);\n if (nodeIds.length === 0) {\n throw new Error(\"[Directive MultiAgent] goal requires at least one node\");\n }\n\n const pId = patternId ?? \"__goal\";\n\n // Validate all node handlers (agents or tasks) are registered\n for (const [nodeId, node] of Object.entries(nodes)) {\n if (!agents[node.handler] && !tasks[node.handler]) {\n throw new Error(\n `[Directive MultiAgent] goal node \"${nodeId}\" references unregistered handler \"${node.handler}\"`,\n );\n }\n }\n\n // Cycle detection\n validateGoalAcyclic(pId, nodes);\n\n // Producer conflict warnings\n validateProducerConflicts(pId, nodes);\n\n // Warn if extractOutput is missing (dev guidance)\n for (const [nodeId, node] of Object.entries(nodes)) {\n if (!node.extractOutput) {\n console.warn(\n `[Directive MultiAgent] goal node \"${nodeId}\": no extractOutput defined. Output will be auto-parsed from agent response. Define extractOutput for reliable fact extraction.`,\n );\n }\n }\n\n // Signal/timeout composition\n let effectiveSignal = pattern.signal;\n let goalTimeoutId: ReturnType<typeof setTimeout> | undefined;\n let externalOnAbort: (() => void) | undefined;\n const timeoutMs = pattern.timeout ?? 300_000;\n if (timeoutMs && !effectiveSignal) {\n const ctrl = new AbortController();\n goalTimeoutId = setTimeout(() => ctrl.abort(), timeoutMs);\n effectiveSignal = ctrl.signal;\n } else if (timeoutMs && effectiveSignal) {\n const ctrl = new AbortController();\n goalTimeoutId = setTimeout(() => ctrl.abort(), timeoutMs);\n externalOnAbort = () => ctrl.abort();\n effectiveSignal.addEventListener(\"abort\", externalOnAbort, {\n once: true,\n });\n effectiveSignal = ctrl.signal;\n }\n\n const patternStartTime = Date.now();\n\n if (timeline) {\n const goalHandlers = Object.values(nodes).map((n) => n.handler);\n\n timeline.record({\n type: \"pattern_start\",\n timestamp: patternStartTime,\n snapshotId: null,\n patternId: pId,\n patternType: \"goal\",\n handlers: goalHandlers,\n taskIds: goalHandlers.filter((h) => tasks[h] != null),\n });\n }\n fireHook(\"onPatternStart\", {\n patternId: pId,\n patternType: \"goal\",\n input:\n typeof initialInput === \"string\"\n ? initialInput\n : JSON.stringify(initialInput),\n timestamp: patternStartTime,\n });\n\n // Initialize facts\n const facts: Record<string, unknown> = Object.create(null);\n if (resumeFrom) {\n goalSafeMerge(facts, resumeFrom.facts);\n } else if (typeof initialInput === \"string\") {\n facts.input = initialInput;\n } else {\n goalSafeMerge(facts, initialInput);\n }\n\n // Tracking state — restore from checkpoint or start fresh\n const executionOrder: string[] = resumeFrom\n ? [...resumeFrom.executionOrder]\n : [];\n const nodeResults: Record<string, RunResult<unknown>> = Object.create(null);\n if (resumeFrom) {\n for (const [id, out] of Object.entries(resumeFrom.nodeOutputs)) {\n nodeResults[id] = {\n output: out.output,\n totalTokens: out.totalTokens,\n } as RunResult<unknown>;\n }\n }\n const stepMetrics: GoalStepMetrics[] = resumeFrom\n ? [...resumeFrom.stepMetrics]\n : [];\n const relaxations: RelaxationRecord[] = resumeFrom\n ? [...resumeFrom.relaxations]\n : [];\n const completedNodes = new Set<string>(resumeFrom?.completedNodes ?? []);\n const failedNodes = new Map<string, number>(\n resumeFrom\n ? Object.entries(resumeFrom.failedNodes).map(([k, v]) => [k, v])\n : [],\n );\n const nodeInputHashes = new Map<string, string>(\n resumeFrom ? Object.entries(resumeFrom.nodeInputHashes) : [],\n );\n const agentMetrics: Record<\n string,\n {\n runs: number;\n avgSatisfactionDelta: number;\n tokens: number;\n totalDelta: number;\n }\n > = Object.create(null);\n if (resumeFrom) {\n for (const [id, m] of Object.entries(resumeFrom.agentMetrics)) {\n agentMetrics[id] = {\n runs: m.runs,\n avgSatisfactionDelta: m.runs > 0 ? m.totalDelta / m.runs : 0,\n tokens: m.tokens,\n totalDelta: m.totalDelta,\n };\n }\n }\n let stallSteps = resumeFrom?.stallSteps ?? 0;\n let appliedRelaxationTiers = resumeFrom?.appliedRelaxationTiers ?? 0;\n let lastSatisfaction = resumeFrom?.lastSatisfaction ?? 0;\n let patternError: Error | undefined;\n let goalAchieved = false;\n const startStep = resumeFrom?.step ?? 0;\n\n // Checkpoint config\n const checkpointConfig = pattern.checkpoint;\n const checkpointEveryN = checkpointConfig?.everyN ?? 5;\n const checkpointStoreRef = checkpointConfig?.store ?? checkpointStore;\n const checkpointLabelPrefix = checkpointConfig?.labelPrefix ?? \"goal\";\n let lastCheckpointId: string | undefined;\n void lastCheckpointId; // Used later in checkpoint save\n\n const MAX_CONSECUTIVE_FAILURES = 3;\n\n try {\n for (let step = startStep; step < maxSteps; step++) {\n // Check goal condition (C1: safe-wrap user callback)\n if (safeCall(goalWhen, facts) === true) {\n goalAchieved = true;\n const durationMs = Date.now() - patternStartTime;\n const totalTokens = Object.values(nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n\n return {\n achieved: true,\n result: safeCall(extract, facts) ?? (facts as unknown as T),\n facts: { ...facts },\n executionOrder,\n nodeResults,\n steps: step,\n totalTokens,\n durationMs,\n stepMetrics,\n relaxations,\n };\n }\n\n // Check abort\n if (effectiveSignal?.aborted) {\n const durationMs = Date.now() - patternStartTime;\n const totalTokens = Object.values(nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n\n return {\n achieved: false,\n result: safeCall(extract, facts) ?? (facts as unknown as T),\n facts: { ...facts },\n executionOrder,\n nodeResults,\n steps: step,\n totalTokens,\n durationMs,\n stepMetrics,\n relaxations,\n error: \"Aborted or timed out\",\n };\n }\n\n // Find ready nodes\n const readyNodes: string[] = [];\n for (const [nodeId, node] of Object.entries(nodes)) {\n // Skip permanently failed nodes\n if ((failedNodes.get(nodeId) ?? 0) >= MAX_CONSECUTIVE_FAILURES) {\n continue;\n }\n\n // Check requires satisfied\n const requires = node.requires ?? [];\n const requiresSatisfied = requires.every((key) => facts[key] != null);\n if (!requiresSatisfied) {\n continue;\n }\n\n // Check if already completed\n if (completedNodes.has(nodeId)) {\n if (!node.allowRerun) {\n continue;\n }\n\n // Check if inputs changed\n const inputHash = JSON.stringify(requires.map((key) => facts[key]));\n if (nodeInputHashes.get(nodeId) === inputHash) {\n continue;\n }\n }\n\n readyNodes.push(nodeId);\n }\n\n // Apply selection strategy\n let selectedNodes = readyNodes;\n if (selectionStrategy && readyNodes.length > 0) {\n const rawSatisfaction = satisfactionFn\n ? (safeCall(satisfactionFn, facts) ?? 0)\n : safeCall(goalWhen, facts) === true\n ? 1.0\n : 0.0;\n const currentSatisfaction = clampSatisfaction(rawSatisfaction);\n const goalProgressMetrics = computeGoalMetrics(\n currentSatisfaction,\n stepMetrics,\n step,\n );\n\n // Build per-agent metrics for the strategy\n const strategyMetrics: Record<\n string,\n { runs: number; avgSatisfactionDelta: number; tokens: number }\n > = Object.create(null);\n for (const [id, m] of Object.entries(agentMetrics)) {\n strategyMetrics[id] = {\n runs: m.runs,\n avgSatisfactionDelta: m.runs > 0 ? m.totalDelta / m.runs : 0,\n tokens: m.tokens,\n };\n }\n\n const strategyResult = selectionStrategy.select(\n readyNodes,\n strategyMetrics,\n goalProgressMetrics,\n );\n // Guard against empty selection strategy result — fall back to readyNodes\n selectedNodes =\n strategyResult && strategyResult.length > 0\n ? strategyResult\n : readyNodes;\n }\n\n // Sort by priority (higher first)\n selectedNodes.sort(\n (a, b) => (nodes[b]!.priority ?? 0) - (nodes[a]!.priority ?? 0),\n );\n\n // Fire onStep hook (C1: safe-wrap)\n safeCall(onStep, step, { ...facts }, selectedNodes);\n\n // Handle no ready nodes\n if (selectedNodes.length === 0) {\n // Check relaxation tiers\n stallSteps++;\n let relaxationApplied = false;\n\n if (relaxation) {\n for (\n let tierIdx = appliedRelaxationTiers;\n tierIdx < relaxation.length;\n tierIdx++\n ) {\n const tier = relaxation[tierIdx]!;\n const threshold = tier.afterStallSteps ?? 3;\n if (stallSteps >= threshold) {\n // Apply relaxation\n const strategy = tier.strategy;\n switch (strategy.type) {\n case \"allow_rerun\":\n for (const nid of strategy.nodes) {\n completedNodes.delete(nid);\n nodeInputHashes.delete(nid);\n }\n break;\n case \"alternative_nodes\":\n // Use shadow copy — don't mutate original pattern nodes\n for (const altNode of strategy.nodes) {\n const altId = `__relaxation_${tierIdx}_${altNode.handler}`;\n nodes[altId] = { ...altNode };\n }\n break;\n case \"inject_facts\":\n goalSafeMerge(facts, strategy.facts);\n break;\n case \"accept_partial\": {\n const durationMs = Date.now() - patternStartTime;\n const totalTokens = Object.values(nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n\n return {\n achieved: false,\n result:\n safeCall(extract, facts) ?? (facts as unknown as T),\n facts: { ...facts },\n executionOrder,\n nodeResults,\n steps: step,\n totalTokens,\n durationMs,\n stepMetrics,\n relaxations,\n error: `Accepted partial result via relaxation tier \"${tier.label}\"`,\n };\n }\n case \"custom\": {\n const rawSat = safeCall(satisfactionFn, facts) ?? 0;\n const ctx: RelaxationContext = {\n step,\n facts: { ...facts },\n metrics: computeGoalMetrics(\n clampSatisfaction(rawSat),\n stepMetrics,\n step,\n ),\n completedNodes: new Set(completedNodes),\n failedNodes: new Map(failedNodes),\n };\n // safe-wrap custom strategy callback\n await safeCallAsync(strategy.apply, ctx);\n break;\n }\n }\n\n relaxations.push({\n step,\n tierIndex: tierIdx,\n label: tier.label,\n strategy: strategy.type,\n });\n appliedRelaxationTiers = tierIdx + 1;\n stallSteps = 0;\n relaxationApplied = true;\n break;\n }\n }\n }\n\n if (!relaxationApplied) {\n // Fire onStall hook (C1: safe-wrap, M7: computed metrics)\n const rawSat = safeCall(satisfactionFn, facts) ?? 0;\n const stallMetrics = computeGoalMetrics(\n clampSatisfaction(rawSat),\n stepMetrics,\n step,\n );\n safeCall(onStall, step, stallMetrics);\n\n // If we've exhausted all relaxation tiers and still stalled, fail\n if (!relaxation || appliedRelaxationTiers >= relaxation.length) {\n const durationMs = Date.now() - patternStartTime;\n const totalTokens = Object.values(nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n\n return {\n achieved: false,\n result: safeCall(extract, facts) ?? (facts as unknown as T),\n facts: { ...facts },\n executionOrder,\n nodeResults,\n steps: step,\n totalTokens,\n durationMs,\n stepMetrics,\n relaxations,\n error:\n \"Goal stalled: no ready nodes and no remaining relaxation tiers\",\n };\n }\n }\n\n continue;\n }\n\n // Reset stall counter since we have ready nodes\n stallSteps = 0;\n\n // Run selected nodes in parallel\n const stepStart = Date.now();\n const rawPreSat = satisfactionFn\n ? (safeCall(satisfactionFn, facts) ?? 0)\n : safeCall(goalWhen, facts) === true\n ? 1.0\n : 0.0;\n const preSatisfaction = clampSatisfaction(rawPreSat);\n let stepTokens = 0;\n const factsProduced: string[] = [];\n\n const nodePromises = selectedNodes.map(async (nodeId) => {\n const node = nodes[nodeId]!;\n\n // Record input hash for allowRerun detection\n const requires = node.requires ?? [];\n const inputHash = JSON.stringify(requires.map((key) => facts[key]));\n nodeInputHashes.set(nodeId, inputHash);\n\n // Build input (C1: safe-wrap buildInput)\n let nodeInput: string;\n const customInput = safeCall(node.buildInput, facts);\n if (customInput != null) {\n nodeInput = customInput;\n } else {\n const relevantFacts: Record<string, unknown> = Object.create(null);\n for (const key of requires) {\n if (facts[key] != null) {\n relevantFacts[key] = facts[key];\n }\n }\n if (Object.keys(relevantFacts).length > 0) {\n nodeInput = JSON.stringify(relevantFacts);\n } else if (facts.input != null) {\n nodeInput = String(facts.input);\n } else {\n nodeInput = JSON.stringify(facts);\n }\n }\n\n try {\n const result = await runSingleAgent(node.handler, nodeInput, {\n signal: effectiveSignal ?? undefined,\n patternId: pId,\n });\n nodeResults[nodeId] = result;\n executionOrder.push(nodeId);\n completedNodes.add(nodeId);\n failedNodes.delete(nodeId);\n\n // Extract output facts (C1: safe-wrap extractOutput)\n if (node.extractOutput) {\n const outputFacts = safeCall(node.extractOutput, result);\n if (outputFacts) {\n goalSafeMerge(facts, outputFacts);\n factsProduced.push(...Object.keys(outputFacts));\n }\n } else {\n // Default: try JSON parse of output\n const rawOutput = result.output;\n if (rawOutput && typeof rawOutput === \"object\") {\n goalSafeMerge(facts, rawOutput as Record<string, unknown>);\n factsProduced.push(\n ...Object.keys(rawOutput as Record<string, unknown>),\n );\n } else if (typeof rawOutput === \"string\") {\n try {\n const parsed = JSON.parse(rawOutput);\n if (\n parsed &&\n typeof parsed === \"object\" &&\n !Array.isArray(parsed)\n ) {\n goalSafeMerge(facts, parsed);\n factsProduced.push(...Object.keys(parsed));\n } else {\n // Store under produce keys\n for (const key of node.produces) {\n facts[key] = rawOutput;\n factsProduced.push(key);\n }\n }\n } catch {\n for (const key of node.produces) {\n facts[key] = rawOutput;\n factsProduced.push(key);\n }\n }\n }\n }\n\n stepTokens += result.totalTokens;\n\n return { nodeId, success: true };\n } catch (error) {\n const failures = (failedNodes.get(nodeId) ?? 0) + 1;\n failedNodes.set(nodeId, failures);\n\n return { nodeId, success: false, error };\n }\n });\n\n await Promise.allSettled(nodePromises);\n\n // Compute step metrics (M4: clamp satisfaction)\n const rawPostSat = satisfactionFn\n ? (safeCall(satisfactionFn, facts) ?? 0)\n : safeCall(goalWhen, facts) === true\n ? 1.0\n : 0.0;\n const postSatisfaction = clampSatisfaction(rawPostSat);\n const satisfactionDelta = postSatisfaction - preSatisfaction;\n\n stepMetrics.push({\n step,\n durationMs: Date.now() - stepStart,\n nodesRun: [...selectedNodes],\n factsProduced,\n satisfaction: postSatisfaction,\n satisfactionDelta,\n tokensConsumed: stepTokens,\n });\n\n // Record timeline events for each node run in this step\n if (timeline) {\n for (const nodeId of selectedNodes) {\n const node = nodes[nodeId]!;\n timeline.record({\n type: \"goal_step\",\n timestamp: Date.now(),\n snapshotId: null,\n agentId: node.handler,\n step,\n nodeId,\n satisfaction: postSatisfaction,\n satisfactionDelta,\n });\n }\n }\n\n // Update per-agent metrics\n for (const nodeId of selectedNodes) {\n const node = nodes[nodeId]!;\n if (!agentMetrics[node.handler]) {\n agentMetrics[node.handler] = {\n runs: 0,\n avgSatisfactionDelta: 0,\n tokens: 0,\n totalDelta: 0,\n };\n }\n const m = agentMetrics[node.handler]!;\n m.runs++;\n m.totalDelta += satisfactionDelta;\n m.tokens += nodeResults[nodeId]?.totalTokens ?? 0;\n }\n\n lastSatisfaction = postSatisfaction;\n\n // Track stall (no satisfaction change)\n if (satisfactionDelta <= 0) {\n stallSteps++;\n } else {\n stallSteps = 0;\n }\n\n // Save checkpoint at configured intervals\n if (\n checkpointConfig &&\n checkpointStoreRef &&\n step > startStep &&\n (step - startStep) % checkpointEveryN === 0\n ) {\n const ckptState: GoalCheckpointState = {\n type: \"goal\",\n version: 1,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: `${checkpointLabelPrefix}:step-${step}`,\n patternId: pId,\n stepsTotal: maxSteps,\n step: step + 1, // Next step to run\n facts: structuredClone(facts),\n completedNodes: [...completedNodes],\n failedNodes: Object.fromEntries(failedNodes),\n nodeInputHashes: Object.fromEntries(nodeInputHashes),\n nodeOutputs: Object.fromEntries(\n Object.entries(nodeResults).map(([id, r]) => [\n id,\n { output: r.output, totalTokens: r.totalTokens },\n ]),\n ),\n executionOrder: [...executionOrder],\n stepMetrics: [...stepMetrics],\n relaxations: [...relaxations],\n appliedRelaxationTiers,\n stallSteps,\n lastSatisfaction,\n agentMetrics: Object.fromEntries(\n Object.entries(agentMetrics).map(([id, m]) => [\n id,\n { runs: m.runs, totalDelta: m.totalDelta, tokens: m.tokens },\n ]),\n ),\n };\n const savedId = await savePatternCheckpoint(\n ckptState,\n checkpointStoreRef,\n checkpointConfig,\n );\n if (savedId) {\n lastCheckpointId = savedId;\n }\n }\n }\n\n // Max steps exhausted\n const durationMs = Date.now() - patternStartTime;\n const totalTokens = Object.values(nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n\n return {\n achieved: false,\n result: safeCall(extract, facts) ?? (facts as unknown as T),\n facts: { ...facts },\n executionOrder,\n nodeResults,\n steps: maxSteps,\n totalTokens,\n durationMs,\n stepMetrics,\n relaxations,\n error: `Max steps (${maxSteps}) exhausted without achieving goal`,\n };\n } catch (error) {\n patternError = error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (goalTimeoutId != null) {\n clearTimeout(goalTimeoutId);\n }\n if (externalOnAbort && pattern.signal) {\n pattern.signal.removeEventListener(\"abort\", externalOnAbort);\n }\n if (timeline) {\n const totalTokens = Object.values(nodeResults).reduce(\n (sum, r) => sum + r.totalTokens,\n 0,\n );\n timeline.record({\n type: \"pattern_complete\",\n timestamp: Date.now(),\n snapshotId: null,\n patternId: pId,\n patternType: \"goal\",\n durationMs: Date.now() - patternStartTime,\n achieved: goalAchieved,\n stepMetrics,\n relaxations,\n totalTokens,\n ...(patternError ? { error: patternError.message } : {}),\n });\n }\n fireHook(\"onPatternComplete\", {\n patternId: pId,\n patternType: \"goal\",\n durationMs: Date.now() - patternStartTime,\n timestamp: Date.now(),\n error: patternError,\n });\n }\n }\n\n // ---- Self-Healing Helpers ----\n function findEquivalentAgents(agentId: string): string[] {\n if (!selfHealing) {\n return [];\n }\n\n const equivalents: string[] = [];\n const seen = new Set<string>();\n seen.add(agentId);\n\n // Check explicit groups first\n if (selfHealing.equivalencyGroups) {\n for (const group of Object.values(selfHealing.equivalencyGroups)) {\n if (group.includes(agentId)) {\n for (const id of group) {\n if (!seen.has(id) && agents[id]) {\n equivalents.push(id);\n seen.add(id);\n }\n }\n }\n }\n }\n\n // Then capability matching\n if (selfHealing.useCapabilities !== false) {\n const sourceReg = agents[agentId];\n if (sourceReg?.capabilities && sourceReg.capabilities.length > 0) {\n for (const [id, reg] of Object.entries(agents)) {\n if (seen.has(id)) {\n continue;\n }\n const caps = reg.capabilities ?? [];\n if (sourceReg.capabilities.every((c) => caps.includes(c))) {\n equivalents.push(id);\n seen.add(id);\n }\n }\n }\n }\n\n // Filter out unhealthy agents\n if (healthMonitorInstance) {\n const threshold = selfHealing.healthThreshold ?? 30;\n\n return equivalents.filter((id) => {\n const score = healthMonitorInstance!.getHealthScore(id);\n\n return score > threshold;\n });\n }\n\n return equivalents;\n }\n\n function selectBestEquivalent(equivalents: string[]): string | null {\n if (equivalents.length === 0) {\n return null;\n }\n\n if (!selfHealing || !healthMonitorInstance) {\n return equivalents[0] ?? null;\n }\n\n if (selfHealing.selectionStrategy === \"round-robin\" && roundRobinCounters) {\n // Round-robin across equivalents\n const key = [...equivalents].sort().join(\",\");\n const counter = roundRobinCounters.get(key) ?? 0;\n const selected = equivalents[counter % equivalents.length]!;\n roundRobinCounters.set(key, counter + 1);\n\n return selected;\n }\n\n // Default: healthiest\n let best = equivalents[0]!;\n let bestScore = healthMonitorInstance.getHealthScore(best);\n for (let i = 1; i < equivalents.length; i++) {\n const score = healthMonitorInstance.getHealthScore(equivalents[i]!);\n if (score > bestScore) {\n best = equivalents[i]!;\n bestScore = score;\n }\n }\n\n return best;\n }\n\n // ---- Pattern handler extraction (for debug events) ----\n function getPatternHandlers(pattern: ExecutionPattern): string[] {\n switch (pattern.type) {\n case \"parallel\":\n return pattern.handlers;\n case \"sequential\":\n return pattern.handlers;\n case \"supervisor\":\n return [pattern.supervisor, ...pattern.workers];\n case \"dag\":\n return Object.values(pattern.nodes).map((n) => n.handler);\n case \"reflect\":\n return [pattern.handler, pattern.evaluator];\n case \"race\":\n return pattern.handlers;\n case \"debate\":\n return [...pattern.handlers, pattern.evaluator];\n case \"goal\":\n return Object.values(pattern.nodes).map((n) => n.handler);\n default:\n return [];\n }\n }\n\n // ---- Build Orchestrator Object ----\n const orchestrator: MultiAgentOrchestrator = {\n system: system as unknown as System<any>,\n\n get facts() {\n // biome-ignore lint/suspicious/noExplicitAny: System facts vary\n return system.facts as any;\n },\n\n get timeline() {\n return timeline;\n },\n\n get healthMonitor() {\n return healthMonitorInstance;\n },\n\n get derived() {\n return Object.freeze({ ...derivedValues });\n },\n\n onDerivedChange(\n callback: (id: string, value: unknown) => void,\n ): () => void {\n derivedChangeCallbacks.add(callback);\n\n return () => {\n derivedChangeCallbacks.delete(callback);\n };\n },\n\n get scratchpad() {\n return scratchpadInstance;\n },\n\n runAgent: runSingleAgent,\n runAgentStream: runAgentStreamImpl,\n\n async runPattern<T>(patternId: string, input: string): Promise<T> {\n assertNotDisposed();\n\n const pattern = patterns[patternId];\n if (!pattern) {\n const available = Object.keys(patterns).join(\", \") || \"(none)\";\n\n throw new Error(\n `[Directive MultiAgent] Unknown pattern \"${patternId}\". Available patterns: ${available}`,\n );\n }\n\n const patternStartTime = Date.now();\n if (timeline) {\n const handlerIds = getPatternHandlers(pattern);\n\n timeline.record({\n type: \"pattern_start\",\n timestamp: patternStartTime,\n snapshotId: null,\n patternId,\n patternType: pattern.type,\n handlers: handlerIds,\n taskIds: handlerIds.filter((h) => tasks[h] != null),\n });\n }\n\n let patternError: Error | undefined;\n try {\n switch (pattern.type) {\n case \"parallel\":\n return await runParallelPattern(\n pattern as ParallelPattern<T>,\n input,\n patternId,\n );\n case \"sequential\":\n return await runSequentialPattern(\n pattern as SequentialPattern<T>,\n input,\n patternId,\n );\n case \"supervisor\":\n return await runSupervisorPattern(\n pattern as SupervisorPattern<T>,\n input,\n patternId,\n );\n case \"dag\":\n return await runDagPattern(\n pattern as DagPattern<T>,\n input,\n patternId,\n );\n case \"reflect\":\n return await runReflectPattern(\n pattern as ReflectPattern<T>,\n input,\n patternId,\n );\n case \"race\": {\n const raceResult = await runRacePattern(\n pattern as RacePattern<T>,\n input,\n patternId,\n );\n\n return raceResult.result;\n }\n case \"debate\": {\n const debatePattern = pattern as DebatePattern<T>;\n const debateResult = await runDebateInternal<T>(\n debatePattern,\n input,\n patternId,\n );\n\n return debateResult.result;\n }\n case \"goal\": {\n const goalPattern = pattern as GoalPattern<T>;\n const goalResult = await runGoalInternal<T>(\n goalPattern,\n input,\n patternId,\n );\n\n return goalResult.result;\n }\n default:\n throw new Error(\n `[Directive MultiAgent] Unknown pattern type: ${(pattern as { type: string }).type}`,\n );\n }\n } catch (error) {\n patternError =\n error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n if (timeline) {\n timeline.record({\n type: \"pattern_complete\",\n timestamp: Date.now(),\n snapshotId: null,\n patternId,\n patternType: pattern.type,\n durationMs: Date.now() - patternStartTime,\n ...(patternError ? { error: patternError.message } : {}),\n });\n }\n }\n },\n\n async runParallel<T>(\n agentIds: string[],\n inputs: string | string[],\n merge: (results: RunResult<unknown>[]) => T | Promise<T>,\n options?: { minSuccess?: number; timeout?: number },\n ): Promise<T> {\n assertNotDisposed();\n const inputArray = Array.isArray(inputs)\n ? inputs\n : agentIds.map(() => inputs);\n\n if (inputArray.length !== agentIds.length) {\n throw new Error(\n `[Directive MultiAgent] Input count (${inputArray.length}) must match agent count (${agentIds.length})`,\n );\n }\n\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n if (options?.timeout) {\n timeoutId = setTimeout(() => controller.abort(), options.timeout);\n }\n\n try {\n const promises = agentIds.map((agentId, i) =>\n runSingleAgent(agentId, inputArray[i]!, {\n signal: controller.signal,\n }).catch((error) => {\n if (options?.minSuccess !== undefined) {\n return null;\n }\n\n throw error;\n }),\n );\n\n const results = await Promise.all(promises);\n const successResults = results.filter(\n (r): r is RunResult<unknown> => r !== null,\n );\n\n if (\n options?.minSuccess !== undefined &&\n successResults.length < options.minSuccess\n ) {\n const failCount = results.length - successResults.length;\n\n throw new Error(\n `[Directive MultiAgent] runParallel: Only ${successResults.length}/${agentIds.length} agents succeeded ` +\n `(minimum required: ${options.minSuccess}, failed: ${failCount})`,\n );\n }\n\n return merge(successResults);\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n },\n\n async runSequential<T>(\n agentIds: string[],\n initialInput: string,\n opts?: {\n transform?: (output: unknown, agentId: string, index: number) => string;\n },\n ): Promise<RunResult<T>[]> {\n assertNotDisposed();\n const results: RunResult<unknown>[] = [];\n let currentInput = initialInput;\n\n for (let i = 0; i < agentIds.length; i++) {\n const agentId = agentIds[i]!;\n const result = await runSingleAgent(agentId, currentInput);\n results.push(result);\n\n if (i < agentIds.length - 1) {\n if (opts?.transform) {\n currentInput = opts.transform(result.output, agentId, i);\n } else {\n currentInput =\n typeof result.output === \"string\"\n ? result.output\n : safeStringify(result.output);\n }\n }\n }\n\n return results as RunResult<T>[];\n },\n\n async handoff(\n fromAgent: string,\n toAgent: string,\n input: string,\n context?: Record<string, unknown>,\n ): Promise<RunResult<unknown>> {\n assertNotDisposed();\n\n if (!agents[fromAgent]) {\n const available = Object.keys(agents).join(\", \") || \"(none)\";\n\n throw new Error(\n `[Directive MultiAgent] Handoff source agent \"${fromAgent}\" not found. Registered: ${available}`,\n );\n }\n if (!agents[toAgent]) {\n const available = Object.keys(agents).join(\", \") || \"(none)\";\n\n throw new Error(\n `[Directive MultiAgent] Handoff target agent \"${toAgent}\" not found. Registered: ${available}`,\n );\n }\n\n // ---- Breakpoint: pre_handoff ----\n {\n const bpResult = await handleBreakpoint(\n \"pre_handoff\",\n fromAgent,\n agents[fromAgent]!.agent.name,\n input,\n undefined,\n {\n handoff: { fromAgent, toAgent },\n },\n );\n if (bpResult.skip) {\n return {\n output: undefined as unknown,\n messages: [],\n toolCalls: [],\n totalTokens: 0,\n };\n }\n input = bpResult.input;\n }\n\n const request: HandoffRequest = {\n id: `handoff-${++handoffCounter}`,\n fromAgent,\n toAgent,\n input,\n context,\n requestedAt: Date.now(),\n };\n\n pendingHandoffs.push(request);\n try {\n onHandoff?.(request);\n } catch (e) {\n if (debug) {\n console.debug(\"[Directive MultiAgent] onHandoff threw:\", e);\n }\n }\n fireHook(\"onHandoff\", request);\n\n if (timeline) {\n timeline.record({\n type: \"handoff_start\",\n timestamp: Date.now(),\n snapshotId: null,\n fromAgent,\n toAgent,\n });\n }\n\n // Forward handoff context to receiving agent's memory (best-effort)\n const targetMemory = agents[toAgent]!.memory ?? sharedMemory;\n if (targetMemory && context) {\n try {\n const contextSummary = Object.entries(context)\n .map(([k, v]) => `${k}: ${safeStringify(v)}`)\n .join(\", \");\n targetMemory.addMessages([\n {\n role: \"system\",\n content: `[Handoff from ${fromAgent}] Context: ${contextSummary}`,\n },\n ]);\n } catch (memoryError) {\n if (debug) {\n console.debug(\n \"[Directive MultiAgent] Handoff addMessages failed:\",\n memoryError,\n );\n }\n }\n }\n\n try {\n const result = await runSingleAgent(toAgent, input);\n\n const handoffResult: HandoffResult = {\n request,\n result,\n completedAt: Date.now(),\n };\n\n addHandoffResult(handoffResult);\n try {\n onHandoffComplete?.(handoffResult);\n } catch (e) {\n if (debug) {\n console.debug(\"[Directive MultiAgent] onHandoffComplete threw:\", e);\n }\n }\n fireHook(\"onHandoffComplete\", handoffResult);\n\n if (timeline) {\n timeline.record({\n type: \"handoff_complete\",\n timestamp: Date.now(),\n snapshotId: null,\n fromAgent,\n toAgent,\n durationMs: handoffResult.completedAt - request.requestedAt,\n });\n }\n\n const index = pendingHandoffs.indexOf(request);\n if (index >= 0) pendingHandoffs.splice(index, 1);\n\n return result;\n } catch (error) {\n const index = pendingHandoffs.indexOf(request);\n if (index >= 0) pendingHandoffs.splice(index, 1);\n throw error;\n }\n },\n\n approve(requestId: string): void {\n assertNotDisposed();\n\n // O(1) lookup via reverse index\n const agentId = approvalRequestIndex.get(requestId);\n if (agentId) {\n approvalRequestIndex.delete(requestId);\n const agentFacts = getAgentFacts(agentId);\n system.batch(() => {\n const currentApproval = getApprovalState(agentFacts);\n const MAX_APPROVAL_HISTORY = 200;\n const approved = [...currentApproval.approved, requestId];\n setApprovalState(agentFacts, {\n ...currentApproval,\n pending: currentApproval.pending.filter(\n (r: ApprovalRequest) => r.id !== requestId,\n ),\n approved:\n approved.length > MAX_APPROVAL_HISTORY\n ? approved.slice(-MAX_APPROVAL_HISTORY)\n : approved,\n });\n });\n\n return;\n }\n\n if (debug) {\n console.debug(\n `[Directive MultiAgent] approve() ignored: no pending request \"${requestId}\"`,\n );\n }\n },\n\n reject(requestId: string, reason?: string): void {\n assertNotDisposed();\n\n // O(1) lookup via reverse index\n const agentId = approvalRequestIndex.get(requestId);\n if (agentId) {\n approvalRequestIndex.delete(requestId);\n const agentFacts = getAgentFacts(agentId);\n system.batch(() => {\n const currentApproval = getApprovalState(agentFacts);\n if (reason && debug) {\n console.debug(\n `[Directive MultiAgent] Request ${requestId} rejected: ${reason}`,\n );\n }\n const rejectedRequest: RejectedRequest = {\n id: requestId,\n reason,\n rejectedAt: Date.now(),\n };\n const MAX_REJECTION_HISTORY = 200;\n const rejected = [...currentApproval.rejected, rejectedRequest];\n setApprovalState(agentFacts, {\n ...currentApproval,\n pending: currentApproval.pending.filter(\n (r: ApprovalRequest) => r.id !== requestId,\n ),\n rejected:\n rejected.length > MAX_REJECTION_HISTORY\n ? rejected.slice(-MAX_REJECTION_HISTORY)\n : rejected,\n });\n });\n\n return;\n }\n\n if (debug) {\n console.debug(\n `[Directive MultiAgent] reject() ignored: no pending request \"${requestId}\"`,\n );\n }\n },\n\n pause(): void {\n assertNotDisposed();\n globalStatus = \"paused\";\n if (debug) {\n console.debug(\"[Directive MultiAgent] Orchestrator paused\");\n }\n },\n\n resume(): void {\n assertNotDisposed();\n if (globalStatus === \"paused\") {\n globalStatus = \"idle\";\n if (debug) {\n console.debug(\"[Directive MultiAgent] Orchestrator resumed\");\n }\n }\n },\n\n getAgentState(agentId: string) {\n const state = agentStates[agentId];\n\n return state ? { ...state } : undefined;\n },\n\n getAllAgentStates() {\n return Object.fromEntries(\n Object.entries(agentStates).map(([k, v]) => [k, { ...v }]),\n );\n },\n\n getPendingHandoffs() {\n return [...pendingHandoffs];\n },\n\n /** Total tokens consumed across all agents */\n get totalTokens(): number {\n return globalTokenCount;\n },\n\n /** Wait until all agents are idle (no running agents) */\n waitForIdle(timeoutMs?: number): Promise<void> {\n const allIdle = () =>\n pendingRuns === 0 &&\n Object.values(agentStates).every(\n (s) =>\n s.status === \"idle\" ||\n s.status === \"completed\" ||\n s.status === \"error\",\n );\n if (allIdle()) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const cleanup = () => {\n idleWaiters.delete(check);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n\n const check = () => {\n if (allIdle()) {\n cleanup();\n resolve();\n }\n };\n\n idleWaiters.add(check);\n\n if (timeoutMs !== undefined) {\n timeoutId = setTimeout(() => {\n cleanup();\n reject(\n new Error(\n `[Directive MultiAgent] waitForIdle timed out after ${timeoutMs}ms`,\n ),\n );\n }, timeoutMs);\n }\n });\n },\n\n /** Alias for runAgent */\n run<T>(\n agentId: string,\n input: string,\n options?: MultiAgentRunCallOptions,\n ): Promise<RunResult<T>> {\n return runSingleAgent<T>(agentId, input, options);\n },\n\n /** Alias for runAgentStream */\n runStream<T>(\n agentId: string,\n input: string,\n options?: { signal?: AbortSignal },\n ): OrchestratorStreamResult<T> {\n return runAgentStreamImpl<T>(agentId, input, options);\n },\n\n registerAgent(agentId: string, registration: AgentRegistration): void {\n assertNotDisposed();\n if (RESERVED_IDS.has(agentId)) {\n throw new Error(\n `[Directive MultiAgent] Agent ID \"${agentId}\" is reserved and cannot be used`,\n );\n }\n if (agents[agentId]) {\n throw new Error(\n `[Directive MultiAgent] Agent \"${agentId}\" is already registered. Unregister first.`,\n );\n }\n if (tasks[agentId]) {\n throw new Error(\n `[Directive MultiAgent] ID \"${agentId}\" is already registered as a task`,\n );\n }\n\n // Build per-agent constraints and resolvers (same as initial setup)\n // biome-ignore lint/suspicious/noExplicitAny: Constraint types complex\n const perAgentConstraints: Record<string, any> = registration.constraints\n ? convertOrchestratorConstraints(registration.constraints)\n : {};\n\n // biome-ignore lint/suspicious/noExplicitAny: Resolver types complex\n const perAgentResolvers: Record<string, any> = Object.create(null);\n if (registration.resolvers) {\n for (const [id, resolver] of Object.entries(registration.resolvers)) {\n perAgentResolvers[id] = {\n requirement: resolver.requirement,\n key: resolver.key,\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async (req: Requirement, context: any) => {\n const state = getOrchestratorState(context.facts);\n const combinedFacts = {\n ...context.facts,\n ...state,\n } as unknown as Record<string, unknown> & OrchestratorState;\n\n const resolverContext: OrchestratorResolverContext<\n Record<string, unknown>\n > = {\n facts: combinedFacts,\n runAgent: async <T>(\n agent: AgentLike,\n input: string,\n opts?: RunOptions,\n ) => {\n return runner<T>(agent, input, opts);\n },\n signal: context.signal,\n };\n\n return resolver.resolve(req, resolverContext);\n },\n };\n }\n }\n\n // Create Directive module and register with the System\n const agentModule = createModule(agentId, {\n schema: orchestratorBridgeSchema,\n init: (facts) => {\n setAgentState(facts, {\n status: \"idle\",\n currentAgent: registration.agent.name,\n input: null,\n output: null,\n error: null,\n tokenUsage: 0,\n turnCount: 0,\n startedAt: null,\n completedAt: null,\n });\n setApprovalState(facts, { pending: [], approved: [], rejected: [] });\n setConversation(facts, []);\n setToolCalls(facts, []);\n setBreakpointState(facts, createInitialBreakpointState());\n },\n constraints: perAgentConstraints,\n resolvers:\n Object.keys(perAgentResolvers).length > 0\n ? (perAgentResolvers as any)\n : undefined,\n });\n\n // biome-ignore lint/suspicious/noExplicitAny: System type narrowing loses namespaced overload\n (system as any).registerModule(agentId, agentModule);\n\n // Add to registry\n agents[agentId] = registration;\n\n // Create semaphore\n semaphores.set(agentId, new Semaphore(registration.maxConcurrent ?? 1));\n\n // Initialize agent state\n agentStates[agentId] = {\n status: \"idle\",\n runCount: 0,\n totalTokens: 0,\n };\n\n if (debug) {\n console.debug(\n `[Directive MultiAgent] Registered agent \"${agentId}\" (${registration.agent.name})`,\n );\n }\n\n recomputeDerivations();\n },\n\n unregisterAgent(agentId: string): void {\n assertNotDisposed();\n if (!agents[agentId]) {\n throw new Error(\n `[Directive MultiAgent] Agent \"${agentId}\" is not registered`,\n );\n }\n\n const state = agentStates[agentId];\n if (state?.status === \"running\") {\n throw new Error(\n `[Directive MultiAgent] Cannot unregister agent \"${agentId}\" while it is running`,\n );\n }\n\n // Warn about orphaned patterns referencing this agent\n for (const [patternId, pattern] of Object.entries(patterns)) {\n let referencedAgents: string[];\n switch (pattern.type) {\n case \"supervisor\":\n referencedAgents = [pattern.supervisor, ...pattern.workers];\n break;\n case \"dag\":\n referencedAgents = Object.values(pattern.nodes).map(\n (n) => n.handler,\n );\n break;\n case \"reflect\":\n referencedAgents = [pattern.handler, pattern.evaluator];\n break;\n case \"parallel\":\n case \"sequential\":\n case \"race\":\n referencedAgents = pattern.handlers;\n break;\n case \"debate\":\n referencedAgents = [\n ...(pattern as DebatePattern).handlers,\n (pattern as DebatePattern).evaluator,\n ];\n break;\n default:\n referencedAgents = [];\n }\n if (referencedAgents.includes(agentId)) {\n console.warn(\n `[Directive MultiAgent] Warning: Pattern \"${patternId}\" references unregistered agent \"${agentId}\"`,\n );\n }\n }\n\n // Drain semaphore\n const sem = semaphores.get(agentId);\n if (sem) {\n sem.drain();\n semaphores.delete(agentId);\n }\n\n // Reset per-agent System facts to idle state\n const agentFacts = getAgentFacts(agentId);\n if (agentFacts) {\n system.batch(() => {\n setAgentState(agentFacts, {\n status: \"idle\",\n currentAgent: null,\n input: null,\n output: null,\n error: null,\n tokenUsage: 0,\n turnCount: 0,\n startedAt: null,\n completedAt: null,\n });\n setApprovalState(agentFacts, {\n pending: [],\n approved: [],\n rejected: [],\n });\n setConversation(agentFacts, []);\n setToolCalls(agentFacts, []);\n setBreakpointState(agentFacts, createInitialBreakpointState());\n });\n }\n\n // Remove from local registries\n // Note: Directive System modules cannot be removed at runtime,\n // but the agent's facts are reset and it won't be accessible via orchestrator methods\n delete agents[agentId];\n delete agentStates[agentId];\n\n if (debug) {\n console.debug(`[Directive MultiAgent] Unregistered agent \"${agentId}\"`);\n }\n\n recomputeDerivations();\n },\n\n getAgentIds(): string[] {\n return Object.keys(agents);\n },\n\n registerTask(taskId: string, registration: TaskRegistration): void {\n assertNotDisposed();\n if (RESERVED_IDS.has(taskId)) {\n throw new Error(\n `[Directive MultiAgent] Task ID \"${taskId}\" is reserved and cannot be used`,\n );\n }\n if (\n !taskId ||\n typeof taskId !== \"string\" ||\n taskId.trim() !== taskId ||\n taskId.length === 0\n ) {\n throw new Error(\n \"[Directive MultiAgent] Task ID must be a non-empty trimmed string\",\n );\n }\n if (agents[taskId]) {\n throw new Error(\n `[Directive MultiAgent] ID \"${taskId}\" is already registered as an agent`,\n );\n }\n if (tasks[taskId]) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" is already registered`,\n );\n }\n // Validate timeout and maxConcurrent\n if (\n registration.timeout !== undefined &&\n (!Number.isFinite(registration.timeout) || registration.timeout <= 0)\n ) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" timeout must be a finite number > 0`,\n );\n }\n if (\n registration.maxConcurrent !== undefined &&\n (!Number.isFinite(registration.maxConcurrent) ||\n registration.maxConcurrent < 1 ||\n !Number.isInteger(registration.maxConcurrent))\n ) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" maxConcurrent must be a finite integer >= 1`,\n );\n }\n // Validate retry configuration\n if (registration.retry) {\n const { attempts, delayMs } = registration.retry;\n if (!Number.isFinite(attempts) || attempts < 1) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" retry attempts must be a finite number >= 1`,\n );\n }\n if (\n delayMs !== undefined &&\n (!Number.isFinite(delayMs) || delayMs < 0)\n ) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" retry delayMs must be a finite number >= 0`,\n );\n }\n }\n tasks[taskId] = registration;\n taskStates[taskId] = { status: \"idle\" };\n taskSemaphores.set(\n taskId,\n new Semaphore(registration.maxConcurrent ?? 1),\n );\n\n if (debug) {\n console.debug(\n `[Directive MultiAgent] Registered task \"${taskId}\" (${registration.label ?? taskId})`,\n );\n }\n },\n\n unregisterTask(taskId: string): void {\n assertNotDisposed();\n if (!tasks[taskId]) {\n throw new Error(\n `[Directive MultiAgent] Task \"${taskId}\" is not registered`,\n );\n }\n const state = taskStates[taskId];\n if (state?.status === \"running\") {\n throw new Error(\n `[Directive MultiAgent] Cannot unregister task \"${taskId}\" while it is running`,\n );\n }\n const sem = taskSemaphores.get(taskId);\n if (sem) {\n sem.drain();\n taskSemaphores.delete(taskId);\n }\n delete tasks[taskId];\n delete taskStates[taskId];\n\n if (debug) {\n console.debug(`[Directive MultiAgent] Unregistered task \"${taskId}\"`);\n }\n },\n\n getTaskIds(): string[] {\n return Object.keys(tasks);\n },\n\n getTaskRegistry(): Record<\n string,\n { label?: string; description?: string }\n > {\n const result: Record<string, { label?: string; description?: string }> =\n Object.create(null);\n for (const [id, reg] of Object.entries(tasks)) {\n result[id] = { label: reg.label, description: reg.description };\n }\n\n return result;\n },\n\n getTaskState(taskId: string) {\n const s = taskStates[taskId];\n\n return s ? Object.freeze(structuredClone(s)) : undefined;\n },\n\n getAllTaskStates() {\n const result: Record<\n string,\n {\n status: string;\n lastOutput?: unknown;\n lastError?: string;\n startTime?: number;\n durationMs?: number;\n }\n > = Object.create(null);\n for (const [id, s] of Object.entries(taskStates)) {\n result[id] = Object.freeze(structuredClone(s));\n }\n\n return result;\n },\n\n getNodeIds(): string[] {\n return [...Object.keys(agents), ...Object.keys(tasks)];\n },\n\n reset() {\n assertNotDisposed();\n for (const agentId of Object.keys(agents)) {\n const maxConcurrent = agents[agentId]?.maxConcurrent ?? 1;\n agentStates[agentId] = {\n status: \"idle\",\n runCount: 0,\n totalTokens: 0,\n };\n const existing = semaphores.get(agentId);\n if (existing) {\n existing.drain();\n }\n semaphores.set(agentId, new Semaphore(maxConcurrent));\n\n // Reset per-agent facts\n const agentFacts = getAgentFacts(agentId);\n system.batch(() => {\n setAgentState(agentFacts, {\n status: \"idle\",\n currentAgent: agents[agentId]!.agent.name,\n input: null,\n output: null,\n error: null,\n tokenUsage: 0,\n turnCount: 0,\n startedAt: null,\n completedAt: null,\n });\n setApprovalState(agentFacts, {\n pending: [],\n approved: [],\n rejected: [],\n });\n setConversation(agentFacts, []);\n setToolCalls(agentFacts, []);\n setBreakpointState(agentFacts, createInitialBreakpointState());\n });\n }\n // Reset task states\n for (const taskId of Object.keys(tasks)) {\n taskStates[taskId] = { status: \"idle\" };\n const tsem = taskSemaphores.get(taskId);\n if (tsem) {\n tsem.drain();\n }\n taskSemaphores.set(\n taskId,\n new Semaphore(tasks[taskId]!.maxConcurrent ?? 1),\n );\n }\n\n breakpointModifications.clear();\n breakpointCancelReasons.clear();\n approvalRequestIndex.clear();\n pendingHandoffs.length = 0;\n handoffResults.length = 0;\n handoffCounter = 0;\n globalTokenCount = 0;\n globalStatus = \"idle\";\n pendingRuns = 0;\n notifyIdleWaiters();\n\n // Reset coordinator facts\n const coordFacts = getAgentFacts(\"__coord\");\n system.batch(() => {\n setBridgeFact(coordFacts, \"__globalTokens\", 0);\n setBridgeFact(coordFacts, \"__status\", \"idle\");\n setBridgeFact(coordFacts, \"__handoffs\", []);\n setBridgeFact(coordFacts, \"__handoffResults\", []);\n setBridgeFact(coordFacts, \"__budgetWarningFired\", false);\n if (scratchpadConfig) {\n setBridgeFact(coordFacts, SCRATCHPAD_KEY, {\n ...scratchpadConfig.init,\n });\n }\n });\n\n // Reset health monitor to clear stale metrics\n if (healthMonitorInstance) {\n healthMonitorInstance.reset();\n }\n\n lastReflectionHistory = null;\n\n // Reset derived values and recompute\n for (const key of Object.keys(derivedValues)) {\n delete derivedValues[key];\n }\n recomputeDerivations();\n },\n\n // ---- Checkpoint Methods ----\n\n async checkpoint(opts?: { label?: string }): Promise<Checkpoint> {\n assertNotDisposed();\n\n // Ensure no agents or tasks are running\n for (const [id, s] of Object.entries(agentStates)) {\n if (s.status === \"running\") {\n throw new Error(\n `[Directive MultiAgent] Cannot checkpoint while agent \"${id}\" is running`,\n );\n }\n }\n for (const [id, s] of Object.entries(taskStates)) {\n if (s.status === \"running\") {\n throw new Error(\n `[Directive MultiAgent] Cannot checkpoint while task \"${id}\" is running`,\n );\n }\n }\n if (!(system as any).history?.export) {\n throw new Error(\n \"[Directive MultiAgent] Checkpointing requires history. Set `debug: true` in orchestrator options.\",\n );\n }\n\n const checkpoint: Checkpoint = {\n version: 1,\n id: createCheckpointId(),\n createdAt: new Date().toISOString(),\n label: opts?.label,\n systemExport: (system as any).history.export(),\n timelineExport: timeline?.export() ?? null,\n localState: {\n type: \"multi\",\n globalTokenCount,\n globalStatus,\n agentStates: Object.fromEntries(\n Object.entries(agentStates).map(([k, v]) => [\n k,\n structuredClone(v),\n ]),\n ),\n handoffCounter,\n pendingHandoffs: [...pendingHandoffs],\n handoffResults: [...handoffResults],\n roundRobinCounters: roundRobinCounters\n ? Object.fromEntries(roundRobinCounters)\n : null,\n taskStates: Object.fromEntries(\n Object.entries(taskStates).map(([k, v]) => [\n k,\n {\n lastOutput:\n v.lastOutput != null ? String(v.lastOutput) : undefined,\n lastError: v.lastError,\n },\n ]),\n ),\n } satisfies MultiAgentCheckpointLocalState,\n memoryExport: sharedMemory\n ? ((sharedMemory as any).export?.() ?? null)\n : null,\n orchestratorType: \"multi\",\n };\n\n if (checkpointStore) {\n await checkpointStore.save(checkpoint);\n }\n\n return checkpoint;\n },\n\n restore(cp: Checkpoint, opts?: { restoreTimeline?: boolean }): void {\n assertNotDisposed();\n\n if (!validateCheckpoint(cp)) {\n throw new Error(\"[Directive MultiAgent] Invalid checkpoint data\");\n }\n if (cp.orchestratorType !== \"multi\") {\n throw new Error(\n `[Directive MultiAgent] Expected multi-agent checkpoint, got \"${cp.orchestratorType}\"`,\n );\n }\n\n // Restore system state\n if (!(system as any).history?.import) {\n throw new Error(\n \"[Directive MultiAgent] Restoring a checkpoint requires history. Set `debug: true` in orchestrator options.\",\n );\n }\n (system as any).history.import(cp.systemExport);\n\n // Restore timeline\n if (opts?.restoreTimeline !== false && cp.timelineExport && timeline) {\n timeline.import(cp.timelineExport);\n }\n\n // Restore memory\n if (cp.memoryExport && sharedMemory && (sharedMemory as any).import) {\n (sharedMemory as any).import(cp.memoryExport);\n }\n\n // Restore closure-local state\n const local = cp.localState as MultiAgentCheckpointLocalState;\n globalTokenCount = local.globalTokenCount;\n globalStatus = local.globalStatus;\n handoffCounter = local.handoffCounter;\n pendingHandoffs.length = 0;\n pendingHandoffs.push(...(local.pendingHandoffs as HandoffRequest[]));\n handoffResults.length = 0;\n handoffResults.push(...(local.handoffResults as HandoffResult[]));\n\n // Restore agent states\n for (const [id, s] of Object.entries(local.agentStates)) {\n if (agentStates[id]) {\n agentStates[id] = { ...s };\n }\n }\n\n // Restore round robin counters\n if (local.roundRobinCounters && roundRobinCounters) {\n roundRobinCounters.clear();\n for (const [k, v] of Object.entries(local.roundRobinCounters)) {\n roundRobinCounters.set(k, v);\n }\n }\n\n // Rebuild semaphores from registrations\n for (const [agentId, reg] of Object.entries(agents)) {\n const existing = semaphores.get(agentId);\n if (existing) {\n existing.drain();\n }\n semaphores.set(agentId, new Semaphore(reg.maxConcurrent ?? 1));\n }\n\n // Restore task states\n if (local.taskStates) {\n for (const [id, s] of Object.entries(local.taskStates)) {\n if (!tasks[id]) {\n throw new Error(\n `[Directive MultiAgent] Checkpoint references task \"${id}\" which is not registered. Task run functions cannot be serialized — re-provide the task registration.`,\n );\n }\n taskStates[id] = {\n status: \"idle\",\n lastOutput: s.lastOutput,\n lastError: s.lastError,\n };\n }\n // Rebuild task semaphores\n for (const [taskId, reg] of Object.entries(tasks)) {\n const existing = taskSemaphores.get(taskId);\n if (existing) {\n existing.drain();\n }\n taskSemaphores.set(taskId, new Semaphore(reg.maxConcurrent ?? 1));\n }\n }\n\n // Recompute derivations from restored state\n recomputeDerivations();\n },\n\n // ---- Parallel Streaming ----\n\n runParallelStream<T>(\n agentIds: string[],\n inputs: string | string[],\n merge: (results: RunResult<unknown>[]) => T | Promise<T>,\n opts?: { minSuccess?: number; timeout?: number; signal?: AbortSignal },\n ): MultiplexedStreamResult<T> {\n assertNotDisposed();\n\n const inputArray = Array.isArray(inputs)\n ? inputs\n : agentIds.map(() => inputs);\n\n if (inputArray.length !== agentIds.length) {\n throw new Error(\n `[Directive MultiAgent] Input count (${inputArray.length}) must match agent count (${agentIds.length})`,\n );\n }\n\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n if (opts?.timeout) {\n timeoutId = setTimeout(() => controller.abort(), opts.timeout);\n }\n // External signal handling is done after mergeTaggedStreams setup\n\n // Launch per-agent streams\n const perAgentStreams = agentIds.map((agentId, i) => {\n const streamResult = runAgentStreamImpl(agentId, inputArray[i]!, {\n signal: controller.signal,\n });\n\n return {\n agentId,\n streamResult,\n };\n });\n\n // Merge tagged streams\n const taggedSources = perAgentStreams.map(\n ({ agentId, streamResult }) => ({\n agentId,\n stream: streamResult.stream,\n }),\n );\n\n const { stream: mergedStream, getDroppedCount } =\n mergeTaggedStreams(taggedSources);\n\n // Clean up external abort listener when done\n let externalOnAbort: (() => void) | undefined;\n if (opts?.signal) {\n externalOnAbort = () => controller.abort();\n opts.signal.addEventListener(\"abort\", externalOnAbort, { once: true });\n }\n\n // Collect all results\n const resultsPromise = Promise.allSettled(\n perAgentStreams.map(({ streamResult }) => streamResult.result),\n ).then((settled) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n // Clean up external signal listener\n if (externalOnAbort && opts?.signal) {\n opts.signal.removeEventListener(\"abort\", externalOnAbort);\n }\n\n const successes: RunResult<unknown>[] = [];\n for (const s of settled) {\n if (s.status === \"fulfilled\") {\n successes.push(s.value);\n }\n }\n\n if (\n opts?.minSuccess !== undefined &&\n successes.length < opts.minSuccess\n ) {\n throw new Error(\n `[Directive MultiAgent] runParallelStream: Only ${successes.length}/${agentIds.length} agents succeeded ` +\n `(minimum required: ${opts.minSuccess})`,\n );\n }\n\n return successes;\n });\n\n const mergePromise = resultsPromise.then((results) => merge(results));\n\n // Prevent unhandled rejections\n resultsPromise.catch(() => {});\n mergePromise.catch(() => {});\n\n return {\n stream: mergedStream,\n results: resultsPromise,\n merge: mergePromise,\n getDroppedCount,\n abort: () => {\n controller.abort();\n if (externalOnAbort && opts?.signal) {\n opts.signal.removeEventListener(\"abort\", externalOnAbort);\n }\n for (const { streamResult } of perAgentStreams) {\n streamResult.abort();\n }\n },\n };\n },\n\n // ---- Race ----\n\n async runRace<T>(\n agentIds: string[],\n input: string,\n raceOpts?: {\n extract?: (result: RunResult<unknown>) => T;\n timeout?: number;\n minSuccess?: number;\n signal?: AbortSignal;\n },\n ): Promise<RaceResult<T>> {\n assertNotDisposed();\n\n const pattern: RacePattern<T> = {\n type: \"race\",\n handlers: agentIds,\n extract: raceOpts?.extract,\n timeout: raceOpts?.timeout,\n minSuccess: raceOpts?.minSuccess,\n signal: raceOpts?.signal,\n };\n\n return runRacePattern<T>(pattern, input, \"__imperative_race\");\n },\n\n // ---- Reflect (imperative) ----\n\n async runReflect<T>(\n producerId: string,\n evaluatorId: string,\n input: string,\n reflectOpts?: {\n maxIterations?: number;\n parseEvaluation?: (output: unknown) => ReflectionEvaluation;\n buildRetryInput?: (\n input: string,\n feedback: string,\n iteration: number,\n ) => string;\n extract?: (output: unknown) => T;\n onExhausted?: \"accept-last\" | \"accept-best\" | \"throw\";\n onIteration?: (record: ReflectIterationRecord) => void;\n signal?: AbortSignal;\n timeout?: number;\n threshold?: number | ((iteration: number) => number);\n },\n ): Promise<{\n result: T;\n iterations: number;\n history: ReflectIterationRecord[];\n exhausted: boolean;\n }> {\n assertNotDisposed();\n\n const pattern: ReflectPattern<T> = {\n type: \"reflect\",\n handler: producerId,\n evaluator: evaluatorId,\n maxIterations: reflectOpts?.maxIterations,\n parseEvaluation: reflectOpts?.parseEvaluation,\n buildRetryInput: reflectOpts?.buildRetryInput,\n extract: reflectOpts?.extract,\n onExhausted: reflectOpts?.onExhausted,\n onIteration: reflectOpts?.onIteration,\n signal: reflectOpts?.signal,\n timeout: reflectOpts?.timeout,\n threshold: reflectOpts?.threshold,\n };\n\n const result = await runReflectPattern<T>(\n pattern,\n input,\n \"__imperative_reflect\",\n );\n const history = lastReflectionHistory ? [...lastReflectionHistory] : [];\n const maxIterations = reflectOpts?.maxIterations ?? 2;\n const exhausted =\n history.length > 0 &&\n !history[history.length - 1]!.passed &&\n history.length >= maxIterations;\n\n return { result, iterations: history.length, history, exhausted };\n },\n\n // ---- Debate (imperative) ----\n\n async runDebate<T>(\n agentIds: string[],\n evaluatorId: string,\n input: string,\n debateOpts?: {\n maxRounds?: number;\n extract?: (output: unknown) => T;\n parseJudgement?: (output: unknown) => {\n winnerId: string;\n feedback?: string;\n score?: number;\n };\n signal?: AbortSignal;\n timeout?: number;\n },\n ): Promise<DebateResult<T>> {\n assertNotDisposed();\n\n return runDebateInternal<T>(\n {\n type: \"debate\",\n handlers: agentIds,\n evaluator: evaluatorId,\n maxRounds: debateOpts?.maxRounds,\n extract: debateOpts?.extract,\n parseJudgement: debateOpts?.parseJudgement,\n signal: debateOpts?.signal,\n timeout: debateOpts?.timeout,\n },\n input,\n \"__imperative_debate\",\n );\n },\n\n // ---- Goal Pattern ----\n\n async runGoal<T>(\n nodes: Record<string, GoalNode>,\n initialInput: string | Record<string, unknown>,\n when: (facts: Record<string, unknown>) => boolean,\n goalOpts?: {\n satisfaction?: (facts: Record<string, unknown>) => number;\n maxSteps?: number;\n extract?: (facts: Record<string, unknown>) => T;\n timeout?: number;\n signal?: AbortSignal;\n selectionStrategy?: AgentSelectionStrategy;\n relaxation?: RelaxationTier[];\n onStep?: GoalPattern[\"onStep\"];\n onStall?: GoalPattern[\"onStall\"];\n checkpoint?: PatternCheckpointConfig;\n },\n ): Promise<GoalResult<T>> {\n assertNotDisposed();\n\n return runGoalInternal<T>(\n {\n type: \"goal\",\n nodes,\n when,\n satisfaction: goalOpts?.satisfaction,\n maxSteps: goalOpts?.maxSteps,\n extract: goalOpts?.extract,\n timeout: goalOpts?.timeout,\n signal: goalOpts?.signal,\n selectionStrategy: goalOpts?.selectionStrategy,\n relaxation: goalOpts?.relaxation,\n onStep: goalOpts?.onStep,\n onStall: goalOpts?.onStall,\n checkpoint: goalOpts?.checkpoint,\n },\n initialInput,\n \"__imperative_goal\",\n );\n },\n\n async resumeGoal<T>(\n checkpointState: GoalCheckpointState,\n pattern: GoalPattern<T>,\n ): Promise<GoalResult<T>> {\n assertNotDisposed();\n\n if (\n !checkpointState ||\n checkpointState.version !== 1 ||\n (checkpointState.type !== \"goal\" &&\n (checkpointState as unknown as Record<string, unknown>).type !==\n \"converge\")\n ) {\n throw new Error(\"[Directive MultiAgent] Invalid goal checkpoint state\");\n }\n // Migration shim: accept legacy \"converge\" checkpoint states (shallow copy to avoid mutating input)\n const normalizedState =\n (checkpointState as unknown as Record<string, unknown>).type ===\n \"converge\"\n ? { ...checkpointState, type: \"goal\" as const }\n : checkpointState;\n\n return runGoalInternal<T>(\n pattern,\n {}, // initialInput ignored when resumeFrom is provided\n normalizedState.patternId,\n normalizedState,\n );\n },\n\n async resumeSequential<T>(\n checkpointState: SequentialCheckpointState,\n pattern: SequentialPattern<T>,\n ): Promise<T> {\n assertNotDisposed();\n\n if (\n !checkpointState ||\n checkpointState.version !== 1 ||\n checkpointState.type !== \"sequential\"\n ) {\n throw new Error(\n \"[Directive MultiAgent] Invalid sequential checkpoint state\",\n );\n }\n\n return runSequentialPattern<T>(\n pattern,\n checkpointState.currentInput,\n checkpointState.patternId,\n checkpointState,\n );\n },\n\n async resumeSupervisor<T>(\n checkpointState: SupervisorCheckpointState,\n pattern: SupervisorPattern<T>,\n options?: { input?: string },\n ): Promise<T> {\n assertNotDisposed();\n\n if (\n !checkpointState ||\n checkpointState.version !== 1 ||\n checkpointState.type !== \"supervisor\"\n ) {\n throw new Error(\n \"[Directive MultiAgent] Invalid supervisor checkpoint state\",\n );\n }\n\n const input = options?.input ?? checkpointState.currentInput;\n\n return runSupervisorPattern<T>(\n pattern,\n input,\n checkpointState.patternId,\n checkpointState,\n );\n },\n\n async resumeReflect<T>(\n checkpointState: ReflectCheckpointState,\n pattern: ReflectPattern<T>,\n options?: { input?: string },\n ): Promise<T> {\n assertNotDisposed();\n\n if (\n !checkpointState ||\n checkpointState.version !== 1 ||\n checkpointState.type !== \"reflect\"\n ) {\n throw new Error(\n \"[Directive MultiAgent] Invalid reflect checkpoint state\",\n );\n }\n\n const input = options?.input ?? checkpointState.effectiveInput;\n\n return runReflectPattern<T>(\n pattern,\n input,\n checkpointState.patternId,\n checkpointState,\n );\n },\n\n async resumeDebate<T>(\n checkpointState: DebateCheckpointState,\n pattern: DebatePattern<T>,\n ): Promise<DebateResult<T>> {\n assertNotDisposed();\n\n if (\n !checkpointState ||\n checkpointState.version !== 1 ||\n checkpointState.type !== \"debate\"\n ) {\n throw new Error(\n \"[Directive MultiAgent] Invalid debate checkpoint state\",\n );\n }\n\n return runDebateInternal<T>(\n pattern,\n checkpointState.currentInput,\n checkpointState.patternId,\n checkpointState,\n );\n },\n\n async resumeDag<T>(\n checkpointState: DagCheckpointState,\n pattern: DagPattern<T>,\n options?: { input?: string },\n ): Promise<T> {\n assertNotDisposed();\n\n if (\n !checkpointState ||\n checkpointState.version !== 1 ||\n checkpointState.type !== \"dag\"\n ) {\n throw new Error(\"[Directive MultiAgent] Invalid DAG checkpoint state\");\n }\n\n const input = options?.input ?? checkpointState.input;\n\n return runDagPattern<T>(\n pattern,\n input,\n checkpointState.patternId,\n checkpointState,\n );\n },\n\n async replay<T>(\n checkpointId: string,\n pattern: ExecutionPattern,\n options?: { input?: string },\n ): Promise<T> {\n assertNotDisposed();\n\n if (!checkpointStore) {\n throw new Error(\n \"[Directive MultiAgent] No checkpoint store configured\",\n );\n }\n\n const checkpoint = await checkpointStore.load(checkpointId);\n if (!checkpoint) {\n throw new Error(\n `[Directive MultiAgent] Checkpoint not found: ${checkpointId}`,\n );\n }\n\n // Validate parsed state — prototype pollution defense + structure check\n let state: PatternCheckpointState;\n try {\n const parsed = JSON.parse(checkpoint.systemExport);\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"Parsed checkpoint state is not an object\");\n }\n\n const BLOCKED = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n for (const key of Object.keys(parsed)) {\n if (BLOCKED.has(key)) {\n throw new Error(`Checkpoint state contains blocked key: ${key}`);\n }\n }\n\n const validTypes = new Set([\n \"sequential\",\n \"supervisor\",\n \"reflect\",\n \"debate\",\n \"dag\",\n \"goal\",\n \"converge\",\n ]);\n if (!validTypes.has(parsed.type)) {\n throw new Error(`Unknown checkpoint pattern type: ${parsed.type}`);\n }\n if (parsed.version !== 1) {\n throw new Error(`Unsupported checkpoint version: ${parsed.version}`);\n }\n\n state = parsed as PatternCheckpointState;\n } catch (err) {\n throw new Error(\n `[Directive MultiAgent] Invalid checkpoint state: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const step = getPatternStep(state);\n const replayInput =\n options?.input ??\n (\"currentInput\" in state\n ? (state as { currentInput: string }).currentInput\n : \"\");\n\n // Record timeline event\n if (timeline) {\n timeline.record({\n type: \"checkpoint_restore\",\n timestamp: Date.now(),\n snapshotId: null,\n checkpointId,\n patternType: state.type,\n step,\n });\n }\n\n switch (state.type) {\n case \"sequential\":\n return runSequentialPattern<T>(\n pattern as SequentialPattern<T>,\n replayInput,\n state.patternId,\n state,\n );\n case \"supervisor\":\n return runSupervisorPattern<T>(\n pattern as SupervisorPattern<T>,\n replayInput,\n state.patternId,\n state,\n );\n case \"reflect\":\n return runReflectPattern<T>(\n pattern as ReflectPattern<T>,\n replayInput,\n state.patternId,\n state,\n );\n case \"debate\":\n return runDebateInternal(\n pattern as DebatePattern<T>,\n replayInput,\n state.patternId,\n state,\n ) as Promise<T>;\n case \"dag\":\n return runDagPattern<T>(\n pattern as DagPattern<T>,\n replayInput,\n state.patternId,\n state,\n );\n case \"goal\":\n return runGoalInternal(\n pattern as GoalPattern<T>,\n state.facts,\n state.patternId,\n state,\n ) as Promise<T>;\n }\n },\n\n // ---- Breakpoint Methods ----\n\n resumeBreakpoint(\n id: string,\n modifications?: BreakpointModifications,\n ): void {\n assertNotDisposed();\n\n if (modifications) {\n breakpointModifications.set(id, modifications);\n }\n\n // Find which agent has this breakpoint pending and resolve it\n for (const agentId of Object.keys(agents)) {\n const agentFacts = getAgentFacts(agentId);\n const bpState = getBreakpointState(agentFacts);\n if (bpState.pending.some((r: BreakpointRequest) => r.id === id)) {\n system.batch(() => {\n const currentBp = getBreakpointState(agentFacts);\n const resolved = [...currentBp.resolved, id];\n setBreakpointState(agentFacts, {\n ...currentBp,\n pending: currentBp.pending.filter(\n (r: BreakpointRequest) => r.id !== id,\n ),\n resolved:\n resolved.length > MAX_BREAKPOINT_HISTORY\n ? resolved.slice(-MAX_BREAKPOINT_HISTORY)\n : resolved,\n });\n });\n\n return;\n }\n }\n\n if (debug) {\n console.debug(\n `[Directive MultiAgent] resumeBreakpoint() ignored: no pending breakpoint \"${id}\"`,\n );\n }\n },\n\n cancelBreakpoint(id: string, reason?: string): void {\n assertNotDisposed();\n\n if (reason) {\n breakpointCancelReasons.set(id, reason);\n }\n\n for (const agentId of Object.keys(agents)) {\n const agentFacts = getAgentFacts(agentId);\n const bpState = getBreakpointState(agentFacts);\n if (bpState.pending.some((r: BreakpointRequest) => r.id === id)) {\n system.batch(() => {\n const currentBp = getBreakpointState(agentFacts);\n const cancelled = [...currentBp.cancelled, id];\n setBreakpointState(agentFacts, {\n ...currentBp,\n pending: currentBp.pending.filter(\n (r: BreakpointRequest) => r.id !== id,\n ),\n cancelled:\n cancelled.length > MAX_BREAKPOINT_HISTORY\n ? cancelled.slice(-MAX_BREAKPOINT_HISTORY)\n : cancelled,\n });\n });\n\n return;\n }\n }\n\n if (debug) {\n console.debug(\n `[Directive MultiAgent] cancelBreakpoint() ignored: no pending breakpoint \"${id}\"`,\n );\n }\n },\n\n getPendingBreakpoints(): BreakpointRequest[] {\n const pending: BreakpointRequest[] = [];\n for (const agentId of Object.keys(agents)) {\n const agentFacts = getAgentFacts(agentId);\n const bpState = getBreakpointState(agentFacts);\n pending.push(...bpState.pending);\n }\n\n return pending;\n },\n\n getLastReflectionHistory(): ReflectIterationRecord[] | null {\n return lastReflectionHistory ? [...lastReflectionHistory] : null;\n },\n\n dispose() {\n if (disposed) {\n return;\n }\n // Reset before marking as disposed (reset() calls assertNotDisposed())\n orchestrator.reset();\n // Clear callback references to allow garbage collection\n scratchpadChangeCallbacks.clear();\n scratchpadKeyCallbacks.clear();\n derivedChangeCallbacks.clear();\n idleWaiters.clear();\n disposed = true;\n system.destroy();\n },\n };\n\n // Compute initial derivation values so they're available immediately\n recomputeDerivations();\n\n return orchestrator;\n}\n\n/**\n * Validate that a DAG has no cycles using Kahn's algorithm.\n * Throws if a cycle is detected.\n */\nfunction validateDagAcyclic(\n patternId: string,\n nodes: Record<string, DagNode>,\n): void {\n const nodeIds = Object.keys(nodes);\n\n // Validate deps reference valid node IDs\n for (const [nodeId, node] of Object.entries(nodes)) {\n for (const depId of node.deps ?? []) {\n if (!nodes[depId]) {\n throw new Error(\n `[Directive MultiAgent] DAG pattern \"${patternId}\": node \"${nodeId}\" depends on unknown node \"${depId}\"`,\n );\n }\n }\n }\n\n // Ensure at least one root node\n const hasRoot = nodeIds.some((id) => {\n const deps = nodes[id]?.deps;\n\n return !deps || deps.length === 0;\n });\n if (!hasRoot) {\n throw new Error(\n `[Directive MultiAgent] DAG pattern \"${patternId}\": no root nodes (every node has dependencies)`,\n );\n }\n\n // Kahn's algorithm for cycle detection\n const inDegree: Record<string, number> = Object.create(null);\n const adjacency: Record<string, string[]> = Object.create(null);\n for (const id of nodeIds) {\n adjacency[id] = [];\n }\n for (const [nodeId, node] of Object.entries(nodes)) {\n inDegree[nodeId] = (node.deps ?? []).length;\n for (const depId of node.deps ?? []) {\n adjacency[depId]!.push(nodeId);\n }\n }\n\n const queue: string[] = [];\n for (const id of nodeIds) {\n if (inDegree[id] === 0) {\n queue.push(id);\n }\n }\n\n let visited = 0;\n while (queue.length > 0) {\n const current = queue.shift()!;\n visited++;\n for (const dependent of adjacency[current] ?? []) {\n inDegree[dependent]!--;\n if (inDegree[dependent] === 0) {\n queue.push(dependent);\n }\n }\n }\n\n if (visited !== nodeIds.length) {\n throw new Error(\n `[Directive MultiAgent] DAG pattern \"${patternId}\": cycle detected. Visited ${visited}/${nodeIds.length} nodes.`,\n );\n }\n}\n\n// ============================================================================\n// Barrel Re-exports from Extracted Modules\n// ============================================================================\n// These modules were extracted for maintainability. Re-exporting here so all\n// existing `import { ... } from \"./multi-agent-orchestrator.js\"` continue to work.\n\nexport * from \"./pattern-factories.js\";\nexport * from \"./pattern-serialization.js\";\nexport * from \"./pattern-composition.js\";\n","/**\n * Directive AI Testing Utilities\n *\n * Provides testing helpers for:\n * - Mock agent runners with configurable responses\n * - Guardrail testing with assertions\n * - Approval workflow simulation\n * - Snapshot testing for constraint evaluation\n *\n * @example\n * ```typescript\n * import { createMockAgentRunner, testGuardrail, createApprovalSimulator } from '@directive-run/ai/testing';\n *\n * describe('MyOrchestrator', () => {\n * it('should block PII in input', async () => {\n * const result = await testGuardrail(createPIIGuardrail(), {\n * input: 'My SSN is 123-45-6789',\n * });\n * expect(result.passed).toBe(false);\n * expect(result.reason).toContain('PII');\n * });\n * });\n * ```\n */\n\nimport {\n type AgentOrchestrator,\n type OrchestratorOptions,\n createAgentOrchestrator,\n} from \"./agent-orchestrator.js\";\nimport type {\n BreakpointModifications,\n BreakpointRequest,\n} from \"./breakpoints.js\";\nimport {\n type Checkpoint,\n type CheckpointStore,\n InMemoryCheckpointStore,\n} from \"./checkpoint.js\";\nimport {\n type MultiAgentOrchestrator,\n type MultiAgentOrchestratorOptions,\n type TaskRegistration,\n createMultiAgentOrchestrator,\n} from \"./multi-agent-orchestrator.js\";\nimport type { MultiplexedStreamChunk } from \"./streaming.js\";\nimport type {\n AgentLike,\n AgentRunner,\n ApprovalRequest,\n GuardrailContext,\n GuardrailFn,\n GuardrailResult,\n InputGuardrailData,\n Message,\n OutputGuardrailData,\n RunOptions,\n RunResult,\n ToolCall,\n ToolCallGuardrailData,\n} from \"./types.js\";\n\n// ============================================================================\n// Mock Agent Runner\n// ============================================================================\n\n/** Configuration for mock agent responses */\nexport interface MockAgentConfig<T = unknown> {\n /** Final output to return */\n output: T;\n /** Messages to emit during run */\n messages?: Message[];\n /** Tool calls to emit during run */\n toolCalls?: ToolCall[];\n /** Total tokens to report */\n totalTokens?: number;\n /** Delay before responding (ms) */\n delay?: number;\n /** Error to throw instead of returning */\n error?: Error;\n /** Function to generate dynamic responses */\n generate?: (input: string, agent: AgentLike) => Partial<MockAgentConfig<T>>;\n}\n\n/** Mock agent runner options */\nexport interface MockAgentRunnerOptions {\n /** Default response for unmatched agents */\n defaultResponse?: MockAgentConfig;\n /** Responses keyed by agent name */\n responses?: Record<string, MockAgentConfig>;\n /** Record all calls for assertions */\n recordCalls?: boolean;\n /** Callback for each run */\n onRun?: (agent: AgentLike, input: string) => void;\n}\n\n/** Recorded call for assertions */\nexport interface RecordedCall {\n agent: AgentLike;\n input: string;\n options?: RunOptions;\n timestamp: number;\n}\n\n/** Mock agent runner instance */\nexport interface MockAgentRunner {\n /** The run function to pass to orchestrator */\n run: AgentRunner;\n /** Get all recorded calls */\n getCalls(): RecordedCall[];\n /** Get calls for a specific agent */\n getCallsFor(agentName: string): RecordedCall[];\n /** Clear recorded calls */\n clearCalls(): void;\n /** Set response for an agent */\n setResponse<T>(agentName: string, config: MockAgentConfig<T>): void;\n /** Set default response */\n setDefaultResponse<T>(config: MockAgentConfig<T>): void;\n}\n\n/**\n * Create a mock agent runner for testing.\n *\n * @example\n * ```typescript\n * const mock = createMockAgentRunner({\n * responses: {\n * 'my-agent': {\n * output: 'Hello, world!',\n * totalTokens: 100,\n * },\n * },\n * });\n *\n * const orchestrator = createAgentOrchestrator({ runner: mock.run });\n * const result = await orchestrator.run(myAgent, 'Hi');\n *\n * expect(result.output).toBe('Hello, world!');\n * expect(mock.getCalls()).toHaveLength(1);\n * ```\n */\nexport function createMockAgentRunner(\n options: MockAgentRunnerOptions = {},\n): MockAgentRunner {\n const {\n defaultResponse = { output: \"mock response\", totalTokens: 10 },\n responses = {},\n recordCalls = true,\n onRun,\n } = options;\n\n const calls: RecordedCall[] = [];\n const responseMap = new Map<string, MockAgentConfig>(\n Object.entries(responses),\n );\n let currentDefault = defaultResponse;\n\n const run: AgentRunner = async <T>(\n agent: AgentLike,\n input: string,\n runOptions?: RunOptions,\n ): Promise<RunResult<T>> => {\n onRun?.(agent, input);\n\n if (recordCalls) {\n calls.push({\n agent,\n input,\n options: runOptions,\n timestamp: Date.now(),\n });\n }\n\n // Get config for this agent\n let config = responseMap.get(agent.name) ?? currentDefault;\n\n // Apply dynamic generation if present\n if (config.generate) {\n const generated = config.generate(input, agent);\n config = { ...config, ...generated };\n }\n\n // Handle error case\n if (config.error) {\n throw config.error;\n }\n\n // Apply delay\n if (config.delay && config.delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, config.delay));\n }\n\n // Emit messages\n const messages = config.messages ?? [];\n for (const message of messages) {\n runOptions?.onMessage?.(message);\n }\n\n // Emit tool calls\n const toolCalls = config.toolCalls ?? [];\n for (const toolCall of toolCalls) {\n runOptions?.onToolCall?.(toolCall);\n }\n\n return {\n output: config.output as T,\n messages,\n toolCalls,\n totalTokens: config.totalTokens ?? 10,\n };\n };\n\n return {\n run,\n getCalls: () => [...calls],\n getCallsFor: (name) => calls.filter((c) => c.agent.name === name),\n clearCalls: () => (calls.length = 0),\n setResponse: (name, config) => responseMap.set(name, config),\n setDefaultResponse: (config) => (currentDefault = config),\n };\n}\n\n// ============================================================================\n// Guardrail Testing\n// ============================================================================\n\n/** Test input for guardrail testing */\nexport type GuardrailTestInput<T> = T extends InputGuardrailData\n ? { input: string; agentName?: string }\n : T extends OutputGuardrailData\n ? {\n output: unknown;\n agentName?: string;\n input?: string;\n messages?: Message[];\n }\n : T extends ToolCallGuardrailData\n ? { toolCall: ToolCall; agentName?: string; input?: string }\n : Partial<T>;\n\n/** Extended guardrail result with test assertions */\nexport interface GuardrailTestResult extends GuardrailResult {\n /** Time taken to evaluate (ms) */\n duration: number;\n /** The data that was tested */\n testedData: unknown;\n /** Assert that the guardrail passed */\n assertPassed(): void;\n /** Assert that the guardrail failed */\n assertFailed(expectedReason?: string | RegExp): void;\n /** Assert that transformation occurred */\n assertTransformed(expected?: unknown): void;\n}\n\n/**\n * Test a guardrail with assertions.\n *\n * @example\n * ```typescript\n * // Test PII detection\n * const result = await testGuardrail(createPIIGuardrail(), {\n * input: 'My SSN is 123-45-6789',\n * });\n * result.assertFailed(/PII/);\n *\n * // Test input transformation\n * const redactResult = await testGuardrail(createPIIGuardrail({ redact: true }), {\n * input: 'My SSN is 123-45-6789',\n * });\n * redactResult.assertPassed();\n * redactResult.assertTransformed();\n * ```\n */\nexport async function testGuardrail<T>(\n guardrail: GuardrailFn<T>,\n testInput: GuardrailTestInput<T>,\n context?: Partial<GuardrailContext>,\n): Promise<GuardrailTestResult> {\n // Build full data object\n const data = {\n agentName: \"test-agent\",\n input: \"\",\n ...testInput,\n } as unknown as T;\n\n // Build context\n const fullContext: GuardrailContext = {\n agentName: (testInput as { agentName?: string }).agentName ?? \"test-agent\",\n input: (testInput as { input?: string }).input ?? \"\",\n facts: context?.facts ?? {},\n ...context,\n };\n\n const start = Date.now();\n const result = await guardrail(data, fullContext);\n const duration = Date.now() - start;\n\n return {\n ...result,\n duration,\n testedData: data,\n assertPassed() {\n if (!result.passed) {\n throw new Error(\n `Expected guardrail to pass, but it failed: ${result.reason}`,\n );\n }\n },\n assertFailed(expectedReason) {\n if (result.passed) {\n throw new Error(\"Expected guardrail to fail, but it passed\");\n }\n if (expectedReason !== undefined) {\n if (\n typeof expectedReason === \"string\" &&\n !result.reason?.includes(expectedReason)\n ) {\n throw new Error(\n `Expected failure reason to include \"${expectedReason}\", got: ${result.reason}`,\n );\n }\n if (\n expectedReason instanceof RegExp &&\n !expectedReason.test(result.reason ?? \"\")\n ) {\n throw new Error(\n `Expected failure reason to match ${expectedReason}, got: ${result.reason}`,\n );\n }\n }\n },\n assertTransformed(expected) {\n if (result.transformed === undefined) {\n throw new Error(\n \"Expected guardrail to transform input, but no transformation occurred\",\n );\n }\n if (expected !== undefined && result.transformed !== expected) {\n throw new Error(\n `Expected transformation to be ${JSON.stringify(expected)}, got: ${JSON.stringify(result.transformed)}`,\n );\n }\n },\n };\n}\n\n/**\n * Test multiple inputs against a guardrail.\n *\n * @example\n * ```typescript\n * const results = await testGuardrailBatch(createPIIGuardrail(), [\n * { input: 'Hello world', expect: 'pass' },\n * { input: 'My SSN is 123-45-6789', expect: 'fail' },\n * { input: 'Email: test@example.com', expect: 'fail' },\n * ]);\n *\n * expect(results.allPassed()).toBe(true);\n * ```\n */\nexport async function testGuardrailBatch<T>(\n guardrail: GuardrailFn<T>,\n testCases: Array<{\n input: GuardrailTestInput<T>;\n expect: \"pass\" | \"fail\" | \"transform\";\n context?: Partial<GuardrailContext>;\n }>,\n): Promise<{\n results: GuardrailTestResult[];\n allPassed(): boolean;\n failures(): Array<{\n index: number;\n expected: string;\n actual: GuardrailTestResult;\n }>;\n}> {\n const results: GuardrailTestResult[] = [];\n const failures: Array<{\n index: number;\n expected: string;\n actual: GuardrailTestResult;\n }> = [];\n\n for (let i = 0; i < testCases.length; i++) {\n const testCase = testCases[i]!;\n const result = await testGuardrail(\n guardrail,\n testCase.input,\n testCase.context,\n );\n results.push(result);\n\n const actualOutcome = !result.passed\n ? \"fail\"\n : result.transformed !== undefined\n ? \"transform\"\n : \"pass\";\n\n if (actualOutcome !== testCase.expect) {\n failures.push({ index: i, expected: testCase.expect, actual: result });\n }\n }\n\n return {\n results,\n allPassed: () => failures.length === 0,\n failures: () => failures,\n };\n}\n\n// ============================================================================\n// Approval Simulation\n// ============================================================================\n\n/** Approval simulator options */\nexport interface ApprovalSimulatorOptions {\n /** Auto-approve requests matching this predicate */\n autoApprove?: (request: ApprovalRequest) => boolean;\n /** Auto-reject requests matching this predicate */\n autoReject?: (request: ApprovalRequest) => boolean | string;\n /** Delay before auto-approval/rejection (ms) */\n delay?: number;\n /** Record all requests for assertions */\n recordRequests?: boolean;\n}\n\n/** Approval simulator instance */\nexport interface ApprovalSimulator {\n /** Handle an approval request */\n handle(request: ApprovalRequest): Promise<\"approved\" | \"rejected\">;\n /** Get all recorded requests */\n getRequests(): ApprovalRequest[];\n /** Clear recorded requests */\n clearRequests(): void;\n /** Manually approve a request */\n approve(requestId: string): void;\n /** Manually reject a request */\n reject(requestId: string, reason?: string): void;\n /** Wait for a specific request */\n waitForRequest(\n predicate: (req: ApprovalRequest) => boolean,\n timeoutMs?: number,\n ): Promise<ApprovalRequest>;\n}\n\n/**\n * Create an approval simulator for testing approval workflows.\n *\n * @example\n * ```typescript\n * const simulator = createApprovalSimulator({\n * autoApprove: (req) => req.type === 'tool_call' && req.data.name === 'search',\n * autoReject: (req) => req.type === 'tool_call' && req.data.name === 'delete',\n * });\n *\n * // Use in tests\n * orchestrator.onApprovalRequest = (req) => simulator.handle(req);\n * ```\n */\nexport function createApprovalSimulator(\n options: ApprovalSimulatorOptions = {},\n): ApprovalSimulator {\n const { autoApprove, autoReject, delay = 0, recordRequests = true } = options;\n\n const requests: ApprovalRequest[] = [];\n const pendingRequests = new Map<\n string,\n {\n request: ApprovalRequest;\n resolve: (decision: \"approved\" | \"rejected\") => void;\n }\n >();\n const requestWaiters: Array<{\n predicate: (req: ApprovalRequest) => boolean;\n resolve: (req: ApprovalRequest) => void;\n }> = [];\n\n return {\n async handle(request: ApprovalRequest): Promise<\"approved\" | \"rejected\"> {\n if (recordRequests) {\n requests.push(request);\n }\n\n // Notify waiters (resolve matching ones, remove them from array)\n for (let i = requestWaiters.length - 1; i >= 0; i--) {\n const waiter = requestWaiters[i]!;\n if (waiter.predicate(request)) {\n requestWaiters.splice(i, 1);\n waiter.resolve(request);\n }\n }\n\n // Apply delay\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n // Check auto-reject first (security-first)\n if (autoReject) {\n const rejectResult = autoReject(request);\n if (rejectResult) {\n return \"rejected\";\n }\n }\n\n // Check auto-approve\n if (autoApprove?.(request)) {\n return \"approved\";\n }\n\n // Wait for manual decision\n return new Promise((resolve) => {\n pendingRequests.set(request.id, { request, resolve });\n });\n },\n\n getRequests: () => [...requests],\n clearRequests: () => (requests.length = 0),\n\n approve(requestId: string) {\n const pending = pendingRequests.get(requestId);\n if (pending) {\n pending.resolve(\"approved\");\n pendingRequests.delete(requestId);\n }\n },\n\n reject(requestId: string, reason?: string) {\n const pending = pendingRequests.get(requestId);\n if (pending) {\n pending.resolve(\"rejected\");\n pendingRequests.delete(requestId);\n // Store reason on the request for test assertions\n const request = requests.find((r) => r.id === requestId);\n if (request) {\n (\n request as ApprovalRequest & { rejectionReason?: string }\n ).rejectionReason = reason;\n }\n }\n },\n\n waitForRequest(predicate, timeoutMs = 5000): Promise<ApprovalRequest> {\n // Check existing requests first\n const existing = requests.find(predicate);\n if (existing) {\n return Promise.resolve(existing);\n }\n\n // Wait for future request\n return new Promise((resolve, reject) => {\n const entry = {\n predicate,\n resolve: (req: ApprovalRequest) => {\n clearTimeout(timeout);\n resolve(req);\n },\n };\n\n const timeout = setTimeout(() => {\n const idx = requestWaiters.indexOf(entry);\n if (idx >= 0) {\n requestWaiters.splice(idx, 1);\n }\n reject(new Error(\"Timeout waiting for approval request\"));\n }, timeoutMs);\n\n requestWaiters.push(entry);\n });\n },\n };\n}\n\n// ============================================================================\n// Test Orchestrator Factory\n// ============================================================================\n\n/** Options for test orchestrator */\nexport interface TestOrchestratorOptions<F extends Record<string, unknown>>\n extends Omit<OrchestratorOptions<F>, \"runner\"> {\n /** Mock responses for agents */\n mockResponses?: Record<string, MockAgentConfig>;\n /** Default mock response */\n defaultMockResponse?: MockAgentConfig;\n}\n\n/** Test orchestrator with additional testing utilities */\nexport interface TestOrchestrator<F extends Record<string, unknown>>\n extends AgentOrchestrator<F> {\n /** The mock runner */\n mockRunner: MockAgentRunner;\n /** Approval simulator */\n approvalSimulator: ApprovalSimulator;\n /** Get recorded agent calls */\n getCalls(): RecordedCall[];\n /** Get approval requests */\n getApprovalRequests(): ApprovalRequest[];\n /** Reset all state */\n resetAll(): void;\n}\n\n/**\n * Create a test orchestrator with mocking and simulation built in.\n *\n * @example\n * ```typescript\n * const test = createTestOrchestrator({\n * mockResponses: {\n * 'my-agent': { output: 'test response' },\n * },\n * constraints: {\n * needsApproval: {\n * when: () => true,\n * require: { type: 'NEED_APPROVAL' },\n * },\n * },\n * });\n *\n * await test.run(myAgent, 'Hello');\n * expect(test.getCalls()).toHaveLength(1);\n * ```\n */\nexport function createTestOrchestrator<\n F extends Record<string, unknown> = Record<string, never>,\n>(options: TestOrchestratorOptions<F> = {}): TestOrchestrator<F> {\n const { mockResponses, defaultMockResponse, ...orchestratorOptions } =\n options;\n\n const mockRunner = createMockAgentRunner({\n responses: mockResponses,\n defaultResponse: defaultMockResponse,\n });\n\n const approvalSimulator = createApprovalSimulator();\n\n const orchestrator = createAgentOrchestrator<F>({\n ...orchestratorOptions,\n runner: mockRunner.run,\n onApprovalRequest: (req) => {\n approvalSimulator.handle(req);\n orchestratorOptions.onApprovalRequest?.(req);\n },\n });\n\n // Use Object.create to preserve getters instead of { ...orchestrator } which evaluates them once\n const testOrchestrator = Object.create(orchestrator) as TestOrchestrator<F>;\n testOrchestrator.mockRunner = mockRunner;\n testOrchestrator.approvalSimulator = approvalSimulator;\n testOrchestrator.getCalls = () => mockRunner.getCalls();\n testOrchestrator.getApprovalRequests = () => approvalSimulator.getRequests();\n testOrchestrator.resetAll = () => {\n orchestrator.reset();\n mockRunner.clearCalls();\n approvalSimulator.clearRequests();\n };\n\n return testOrchestrator;\n}\n\n// ============================================================================\n// Snapshot Testing\n// ============================================================================\n\n/** Constraint evaluation snapshot */\nexport interface ConstraintSnapshot {\n constraintId: string;\n triggered: boolean;\n requirement?: unknown;\n facts: Record<string, unknown>;\n timestamp: number;\n}\n\n/**\n * Create a constraint evaluation recorder for snapshot testing.\n *\n * @example\n * ```typescript\n * const recorder = createConstraintRecorder();\n * const orchestrator = createAgentOrchestrator({\n * plugins: [recorder.plugin],\n * });\n *\n * await orchestrator.run(agent, 'Hello');\n *\n * expect(recorder.getSnapshots()).toMatchSnapshot();\n * ```\n */\nexport function createConstraintRecorder(): {\n plugin: {\n name: string;\n onRequirementCreated: (data: {\n constraintId: string;\n requirement: unknown;\n facts: unknown;\n }) => void;\n };\n getSnapshots(): ConstraintSnapshot[];\n clearSnapshots(): void;\n} {\n const snapshots: ConstraintSnapshot[] = [];\n\n return {\n plugin: {\n name: \"constraint-recorder\",\n onRequirementCreated(data) {\n snapshots.push({\n constraintId: data.constraintId,\n triggered: true,\n requirement: data.requirement,\n facts: data.facts as Record<string, unknown>,\n timestamp: Date.now(),\n });\n },\n },\n getSnapshots: () => [...snapshots],\n clearSnapshots: () => (snapshots.length = 0),\n };\n}\n\n// ============================================================================\n// Assertion Helpers\n// ============================================================================\n\n/**\n * Assert that an orchestrator has specific state.\n *\n * @example\n * ```typescript\n * assertOrchestratorState(orchestrator, {\n * agentStatus: 'completed',\n * tokenUsage: { min: 0, max: 1000 },\n * pendingApprovals: 0,\n * });\n * ```\n */\nexport function assertOrchestratorState<F extends Record<string, unknown>>(\n orchestrator: AgentOrchestrator<F>,\n expected: {\n agentStatus?: \"idle\" | \"running\" | \"paused\" | \"completed\" | \"error\";\n tokenUsage?: { min?: number; max?: number; exact?: number };\n pendingApprovals?: number;\n conversationLength?: { min?: number; max?: number; exact?: number };\n },\n): void {\n const state = orchestrator.facts;\n\n if (\n expected.agentStatus !== undefined &&\n state.agent.status !== expected.agentStatus\n ) {\n throw new Error(\n `Expected agent status to be \"${expected.agentStatus}\", got \"${state.agent.status}\"`,\n );\n }\n\n if (expected.tokenUsage !== undefined) {\n const { min, max, exact } = expected.tokenUsage;\n if (exact !== undefined && state.agent.tokenUsage !== exact) {\n throw new Error(\n `Expected token usage to be exactly ${exact}, got ${state.agent.tokenUsage}`,\n );\n }\n if (min !== undefined && state.agent.tokenUsage < min) {\n throw new Error(\n `Expected token usage to be at least ${min}, got ${state.agent.tokenUsage}`,\n );\n }\n if (max !== undefined && state.agent.tokenUsage > max) {\n throw new Error(\n `Expected token usage to be at most ${max}, got ${state.agent.tokenUsage}`,\n );\n }\n }\n\n if (\n expected.pendingApprovals !== undefined &&\n state.approval.pending.length !== expected.pendingApprovals\n ) {\n throw new Error(\n `Expected ${expected.pendingApprovals} pending approvals, got ${state.approval.pending.length}`,\n );\n }\n\n if (expected.conversationLength !== undefined) {\n const { min, max, exact } = expected.conversationLength;\n const len = state.conversation.length;\n if (exact !== undefined && len !== exact) {\n throw new Error(\n `Expected conversation length to be exactly ${exact}, got ${len}`,\n );\n }\n if (min !== undefined && len < min) {\n throw new Error(\n `Expected conversation length to be at least ${min}, got ${len}`,\n );\n }\n if (max !== undefined && len > max) {\n throw new Error(\n `Expected conversation length to be at most ${max}, got ${len}`,\n );\n }\n }\n}\n\n// ============================================================================\n// Fake Timers Support\n// ============================================================================\n\n/**\n * Create a time controller for testing time-dependent behavior.\n *\n * @example\n * ```typescript\n * const time = createTimeController();\n *\n * // Override Date.now\n * const originalNow = Date.now;\n * Date.now = () => time.now();\n *\n * time.advance(1000); // Advance 1 second\n *\n * // Restore\n * Date.now = originalNow;\n * ```\n */\nexport function createTimeController(startTime = Date.now()): {\n now(): number;\n advance(ms: number): void;\n set(time: number): void;\n reset(): void;\n} {\n let currentTime = startTime;\n const initial = startTime;\n\n return {\n now: () => currentTime,\n advance: (ms) => {\n currentTime += ms;\n },\n set: (time) => {\n currentTime = time;\n },\n reset: () => {\n currentTime = initial;\n },\n };\n}\n\n// ============================================================================\n// Multi-Agent Test Orchestrator\n// ============================================================================\n\n/** Options for test multi-agent orchestrator */\nexport interface TestMultiAgentOrchestratorOptions\n extends Omit<MultiAgentOrchestratorOptions, \"runner\"> {\n /** Mock responses keyed by agent ID — internally mapped to agent names for the mock runner */\n mockResponses?: Record<string, MockAgentConfig>;\n /** Default mock response for unmatched agents */\n defaultMockResponse?: MockAgentConfig;\n /** Mock tasks keyed by task ID — auto-generates TaskRegistration wrappers */\n mockTasks?: Record<\n string,\n { output: unknown; delay?: number; shouldError?: boolean }\n >;\n}\n\n/** Test multi-agent orchestrator with additional testing utilities */\nexport interface TestMultiAgentOrchestrator extends MultiAgentOrchestrator {\n /** The mock runner */\n mockRunner: MockAgentRunner;\n /** Approval simulator */\n approvalSimulator: ApprovalSimulator;\n /** Get recorded agent calls */\n getCalls(): RecordedCall[];\n /** Get approval requests */\n getApprovalRequests(): ApprovalRequest[];\n /** Reset all state */\n resetAll(): void;\n}\n\n/**\n * Create a test multi-agent orchestrator with mocking and simulation built in.\n *\n * @example\n * ```typescript\n * const test = createTestMultiAgentOrchestrator({\n * agents: {\n * researcher: { agent: { name: 'researcher' } },\n * writer: { agent: { name: 'writer' } },\n * },\n * mockResponses: {\n * researcher: { output: 'Research results', totalTokens: 100 },\n * writer: { output: 'Written article', totalTokens: 200 },\n * },\n * });\n *\n * const result = await test.runAgent('researcher', 'What is AI?');\n * expect(result.output).toBe('Research results');\n * expect(test.getCalls()).toHaveLength(1);\n * ```\n */\nexport function createTestMultiAgentOrchestrator(\n options: TestMultiAgentOrchestratorOptions,\n): TestMultiAgentOrchestrator {\n const {\n mockResponses = {},\n defaultMockResponse,\n mockTasks: mockTaskConfigs,\n ...orchestratorOptions\n } = options;\n\n // Convert mockTasks into real TaskRegistration entries\n if (mockTaskConfigs) {\n const existingTasks = orchestratorOptions.tasks ?? {};\n for (const [taskId, config] of Object.entries(mockTaskConfigs)) {\n if (!existingTasks[taskId]) {\n existingTasks[taskId] = createMockTask(config.output, {\n delay: config.delay,\n shouldError: config.shouldError,\n });\n }\n }\n orchestratorOptions.tasks = existingTasks;\n }\n\n // Map mock responses by agent name (from agent registration)\n const responsesByName: Record<string, MockAgentConfig> = {};\n for (const [agentId, config] of Object.entries(mockResponses)) {\n const registration = orchestratorOptions.agents[agentId];\n if (registration) {\n responsesByName[registration.agent.name] = config;\n }\n }\n\n const mockRunner = createMockAgentRunner({\n responses: responsesByName,\n defaultResponse: defaultMockResponse,\n });\n\n const approvalSimulator = createApprovalSimulator();\n\n const orchestrator = createMultiAgentOrchestrator({\n ...orchestratorOptions,\n runner: mockRunner.run,\n onApprovalRequest: (req) => {\n approvalSimulator.handle(req);\n orchestratorOptions.onApprovalRequest?.(req);\n },\n });\n\n // Use Object.create to preserve getters (derived, scratchpad, timeline, etc.)\n // instead of { ...orchestrator } which evaluates getters at spread time\n const testOrchestrator = Object.create(\n orchestrator,\n ) as TestMultiAgentOrchestrator;\n testOrchestrator.mockRunner = mockRunner;\n testOrchestrator.approvalSimulator = approvalSimulator;\n testOrchestrator.getCalls = () => mockRunner.getCalls();\n testOrchestrator.getApprovalRequests = () => approvalSimulator.getRequests();\n testOrchestrator.resetAll = () => {\n orchestrator.reset();\n mockRunner.clearCalls();\n approvalSimulator.clearRequests();\n };\n\n return testOrchestrator;\n}\n\n// ============================================================================\n// Multi-Agent Assertion Helpers\n// ============================================================================\n\n/**\n * Assert that a multi-agent orchestrator has specific state.\n *\n * @example\n * ```typescript\n * assertMultiAgentState(orchestrator, {\n * agentStatus: { researcher: 'completed', writer: 'idle' },\n * globalTokens: { min: 0, max: 1000 },\n * pendingHandoffs: 0,\n * });\n * ```\n */\nexport function assertMultiAgentState(\n orchestrator: MultiAgentOrchestrator,\n expected: {\n agentStatus?: Record<string, \"idle\" | \"running\" | \"completed\" | \"error\">;\n taskStatus?: Record<string, string>;\n totalTokens?: { agentId?: string; min?: number; max?: number };\n globalTokens?: { min?: number; max?: number };\n pendingHandoffs?: number;\n },\n): void {\n if (expected.taskStatus) {\n for (const [taskId, expectedStatus] of Object.entries(\n expected.taskStatus,\n )) {\n const state = orchestrator.getTaskState(taskId);\n if (!state) {\n throw new Error(\n `Expected task \"${taskId}\" to exist, but it was not found`,\n );\n }\n if (state.status !== expectedStatus) {\n throw new Error(\n `Expected task \"${taskId}\" status to be \"${expectedStatus}\", got \"${state.status}\"`,\n );\n }\n }\n }\n\n if (expected.agentStatus) {\n for (const [agentId, expectedStatus] of Object.entries(\n expected.agentStatus,\n )) {\n const state = orchestrator.getAgentState(agentId);\n if (!state) {\n throw new Error(\n `Expected agent \"${agentId}\" to exist, but it was not found`,\n );\n }\n if (state.status !== expectedStatus) {\n throw new Error(\n `Expected agent \"${agentId}\" status to be \"${expectedStatus}\", got \"${state.status}\"`,\n );\n }\n }\n }\n\n if (expected.totalTokens) {\n const { agentId, min, max } = expected.totalTokens;\n if (agentId) {\n const state = orchestrator.getAgentState(agentId);\n if (!state) {\n throw new Error(\n `Expected agent \"${agentId}\" to exist, but it was not found`,\n );\n }\n if (min !== undefined && state.totalTokens < min) {\n throw new Error(\n `Expected agent \"${agentId}\" tokens to be at least ${min}, got ${state.totalTokens}`,\n );\n }\n if (max !== undefined && state.totalTokens > max) {\n throw new Error(\n `Expected agent \"${agentId}\" tokens to be at most ${max}, got ${state.totalTokens}`,\n );\n }\n } else {\n const allStates = orchestrator.getAllAgentStates();\n const total = Object.values(allStates).reduce(\n (sum, s) => sum + s.totalTokens,\n 0,\n );\n if (min !== undefined && total < min) {\n throw new Error(\n `Expected total tokens to be at least ${min}, got ${total}`,\n );\n }\n if (max !== undefined && total > max) {\n throw new Error(\n `Expected total tokens to be at most ${max}, got ${total}`,\n );\n }\n }\n }\n\n if (expected.globalTokens) {\n const { min, max } = expected.globalTokens;\n const total = orchestrator.totalTokens;\n if (min !== undefined && total < min) {\n throw new Error(\n `Expected global tokens to be at least ${min}, got ${total}`,\n );\n }\n if (max !== undefined && total > max) {\n throw new Error(\n `Expected global tokens to be at most ${max}, got ${total}`,\n );\n }\n }\n\n if (expected.pendingHandoffs !== undefined) {\n const pendingCount = orchestrator.getPendingHandoffs().length;\n if (pendingCount !== expected.pendingHandoffs) {\n throw new Error(\n `Expected ${expected.pendingHandoffs} pending handoffs, got ${pendingCount}`,\n );\n }\n }\n}\n\n// ============================================================================\n// Mock Task Helpers\n// ============================================================================\n\n/**\n * Create a mock TaskRegistration for testing.\n *\n * @example\n * ```typescript\n * const task = createMockTask({ result: \"processed\" }, { delay: 100 });\n * const orchestrator = createTestMultiAgentOrchestrator({\n * agents: { writer: { agent: { name: \"writer\" } } },\n * tasks: { process: task },\n * });\n * ```\n */\nexport function createMockTask(\n output: unknown,\n options?: {\n delay?: number;\n shouldError?: boolean;\n label?: string;\n description?: string;\n },\n): TaskRegistration {\n return {\n run: async (_input: string, signal: AbortSignal) => {\n if (signal.aborted) {\n throw new Error(\"Task aborted\");\n }\n if (options?.delay && options.delay > 0) {\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, options.delay);\n signal.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(new Error(\"Task aborted\"));\n },\n { once: true },\n );\n });\n }\n\n if (options?.shouldError) {\n throw new Error(\"Mock task error\");\n }\n\n return output;\n },\n label: options?.label ?? \"Mock Task\",\n description: options?.description,\n };\n}\n\n// ============================================================================\n// DAG Testing Helpers\n// ============================================================================\n\nimport { dag } from \"./multi-agent-orchestrator.js\";\nimport type {\n DagExecutionContext,\n DagNode,\n DagNodeStatus,\n DagPattern,\n} from \"./types.js\";\n\n/**\n * Create a test DAG pattern from a simplified node spec.\n *\n * @example\n * ```typescript\n * const pattern = createTestDag({\n * A: { handler: \"researcher\" },\n * B: { handler: \"writer\", deps: [\"A\"] },\n * C: { handler: \"reviewer\", deps: [\"B\"] },\n * });\n * ```\n */\nexport function createTestDag<T = unknown>(\n nodes: Record<\n string,\n Pick<\n DagNode,\n \"handler\" | \"deps\" | \"when\" | \"transform\" | \"timeout\" | \"priority\"\n >\n >,\n merge?: (context: DagExecutionContext) => T | Promise<T>,\n options?: {\n timeout?: number;\n maxConcurrent?: number;\n onNodeError?: \"fail\" | \"skip-downstream\" | \"continue\";\n },\n): DagPattern<T> {\n const defaultMerge = (context: DagExecutionContext) =>\n context.outputs as unknown as T;\n\n return dag<T>(nodes, merge ?? defaultMerge, options);\n}\n\n/**\n * Assert that a DAG execution produced the expected node statuses.\n *\n * @example\n * ```typescript\n * assertDagExecution(context, {\n * nodeStatuses: { A: \"completed\", B: \"completed\", C: \"skipped\" },\n * completedNodes: [\"A\", \"B\"],\n * skippedNodes: [\"C\"],\n * });\n * ```\n */\nexport function assertDagExecution(\n context: DagExecutionContext,\n expected: {\n nodeStatuses?: Record<string, DagNodeStatus>;\n completedNodes?: string[];\n skippedNodes?: string[];\n errorNodes?: string[];\n outputContains?: Record<string, unknown>;\n },\n): void {\n if (expected.nodeStatuses) {\n for (const [nodeId, expectedStatus] of Object.entries(\n expected.nodeStatuses,\n )) {\n const actual = context.statuses[nodeId];\n if (actual !== expectedStatus) {\n throw new Error(\n `Expected node \"${nodeId}\" status to be \"${expectedStatus}\", got \"${actual}\"`,\n );\n }\n }\n }\n\n if (expected.completedNodes) {\n for (const nodeId of expected.completedNodes) {\n if (context.statuses[nodeId] !== \"completed\") {\n throw new Error(\n `Expected node \"${nodeId}\" to be completed, got \"${context.statuses[nodeId]}\"`,\n );\n }\n }\n }\n\n if (expected.skippedNodes) {\n for (const nodeId of expected.skippedNodes) {\n if (context.statuses[nodeId] !== \"skipped\") {\n throw new Error(\n `Expected node \"${nodeId}\" to be skipped, got \"${context.statuses[nodeId]}\"`,\n );\n }\n }\n }\n\n if (expected.errorNodes) {\n for (const nodeId of expected.errorNodes) {\n if (context.statuses[nodeId] !== \"error\") {\n throw new Error(\n `Expected node \"${nodeId}\" to be error, got \"${context.statuses[nodeId]}\"`,\n );\n }\n }\n }\n\n if (expected.outputContains) {\n for (const [nodeId, expectedOutput] of Object.entries(\n expected.outputContains,\n )) {\n const actual = context.outputs[nodeId];\n if (actual !== expectedOutput) {\n throw new Error(\n `Expected node \"${nodeId}\" output to be ${JSON.stringify(expectedOutput)}, got ${JSON.stringify(actual)}`,\n );\n }\n }\n }\n}\n\n// ============================================================================\n// Debug Timeline Testing Helpers\n// ============================================================================\n\nimport { type DebugTimeline, createDebugTimeline } from \"./debug-timeline.js\";\nimport type { DebugEvent, DebugEventType } from \"./types.js\";\n\n/**\n * Create a test debug timeline pre-populated with events.\n *\n * @example\n * ```typescript\n * const timeline = createTestTimeline([\n * { type: \"agent_start\", agentId: \"researcher\", inputLength: 42 },\n * { type: \"agent_complete\", agentId: \"researcher\", outputLength: 100, durationMs: 500, totalTokens: 200 },\n * ]);\n *\n * expect(timeline.getEventsForAgent(\"researcher\")).toHaveLength(2);\n * ```\n */\nexport function createTestTimeline(\n events?: Array<Partial<DebugEvent> & { type: DebugEventType }>,\n options?: { maxEvents?: number },\n): DebugTimeline {\n const timeline = createDebugTimeline({\n maxEvents: options?.maxEvents ?? 500,\n });\n\n if (events) {\n for (const event of events) {\n timeline.record({\n timestamp: Date.now(),\n snapshotId: null,\n agentId: \"\",\n ...event,\n } as Omit<DebugEvent, \"id\">);\n }\n }\n\n return timeline;\n}\n\n/**\n * Assert that a debug timeline contains expected events.\n *\n * @example\n * ```typescript\n * assertTimelineEvents(timeline, {\n * totalEvents: 5,\n * eventTypes: [\"agent_start\", \"guardrail_check\", \"agent_complete\"],\n * agentEvents: { researcher: 3, writer: 2 },\n * hasType: \"guardrail_check\",\n * });\n * ```\n */\nexport function assertTimelineEvents(\n timeline: DebugTimeline,\n expected: {\n totalEvents?: number;\n minEvents?: number;\n maxEvents?: number;\n eventTypes?: DebugEventType[];\n agentEvents?: Record<string, number>;\n hasType?: DebugEventType;\n doesNotHaveType?: DebugEventType;\n },\n): void {\n const events = timeline.getEvents();\n\n if (\n expected.totalEvents !== undefined &&\n events.length !== expected.totalEvents\n ) {\n throw new Error(\n `Expected ${expected.totalEvents} timeline events, got ${events.length}`,\n );\n }\n\n if (expected.minEvents !== undefined && events.length < expected.minEvents) {\n throw new Error(\n `Expected at least ${expected.minEvents} timeline events, got ${events.length}`,\n );\n }\n\n if (expected.maxEvents !== undefined && events.length > expected.maxEvents) {\n throw new Error(\n `Expected at most ${expected.maxEvents} timeline events, got ${events.length}`,\n );\n }\n\n if (expected.eventTypes) {\n for (const type of expected.eventTypes) {\n const found = events.some((e) => e.type === type);\n if (!found) {\n throw new Error(\n `Expected timeline to contain event of type \"${type}\", but none found`,\n );\n }\n }\n }\n\n if (expected.agentEvents) {\n for (const [agentId, expectedCount] of Object.entries(\n expected.agentEvents,\n )) {\n const actual = timeline.getEventsForAgent(agentId).length;\n if (actual !== expectedCount) {\n throw new Error(\n `Expected ${expectedCount} events for agent \"${agentId}\", got ${actual}`,\n );\n }\n }\n }\n\n if (expected.hasType) {\n const found = events.some((e) => e.type === expected.hasType);\n if (!found) {\n throw new Error(\n `Expected timeline to contain event of type \"${expected.hasType}\"`,\n );\n }\n }\n\n if (expected.doesNotHaveType) {\n const found = events.some((e) => e.type === expected.doesNotHaveType);\n if (found) {\n throw new Error(\n `Expected timeline NOT to contain event of type \"${expected.doesNotHaveType}\"`,\n );\n }\n }\n}\n\n// ============================================================================\n// Self-Healing Testing Helpers\n// ============================================================================\n\nimport type { HealthMonitor } from \"./health-monitor.js\";\nimport type { ReflectionEvaluator } from \"./reflection.js\";\nimport type { RerouteEvent, Scratchpad } from \"./types.js\";\n\n/**\n * Create a runner that always fails, useful for testing self-healing.\n *\n * @example\n * ```typescript\n * const failing = createFailingRunner(new Error(\"Provider down\"));\n * const orchestrator = createAgentOrchestrator({\n * runner: failing,\n * selfHealing: { fallbackRunners: [backupRunner] },\n * });\n * ```\n */\nexport function createFailingRunner(\n error?: Error,\n options?: { delay?: number; failAfter?: number },\n): AgentRunner {\n let callCount = 0;\n const failAfter = options?.failAfter ?? 0;\n\n return async <T>(\n _agent: AgentLike,\n _input: string,\n _runOptions?: RunOptions,\n ): Promise<RunResult<T>> => {\n callCount++;\n\n if (failAfter > 0 && callCount <= failAfter) {\n return {\n output: \"success\" as T,\n messages: [],\n toolCalls: [],\n totalTokens: 10,\n };\n }\n\n if (options?.delay && options.delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, options.delay));\n }\n\n throw error ?? new Error(\"Runner failed\");\n };\n}\n\n/**\n * Assert that an agent was rerouted during execution.\n *\n * @example\n * ```typescript\n * const events: RerouteEvent[] = [];\n * const orchestrator = createMultiAgentOrchestrator({\n * selfHealing: {\n * onReroute: (event) => events.push(event),\n * },\n * });\n *\n * // ... trigger reroute ...\n * assertRerouted(events, {\n * fromAgent: \"primary\",\n * toAgent: \"backup\",\n * reason: /circuit breaker/i,\n * });\n * ```\n */\nexport function assertRerouted(\n events: RerouteEvent[],\n expected: {\n fromAgent?: string;\n toAgent?: string;\n reason?: string | RegExp;\n minReroutes?: number;\n },\n): void {\n if (events.length === 0) {\n throw new Error(\"Expected at least one reroute event, but none occurred\");\n }\n\n if (\n expected.minReroutes !== undefined &&\n events.length < expected.minReroutes\n ) {\n throw new Error(\n `Expected at least ${expected.minReroutes} reroute events, got ${events.length}`,\n );\n }\n\n if (expected.fromAgent) {\n const found = events.some((e) => e.originalAgent === expected.fromAgent);\n if (!found) {\n throw new Error(\n `Expected reroute from agent \"${expected.fromAgent}\", but no matching event found`,\n );\n }\n }\n\n if (expected.toAgent) {\n const found = events.some((e) => e.reroutedTo === expected.toAgent);\n if (!found) {\n throw new Error(\n `Expected reroute to agent \"${expected.toAgent}\", but no matching event found`,\n );\n }\n }\n\n if (expected.reason) {\n const found = events.some((e) => {\n if (typeof expected.reason === \"string\") {\n return e.reason.includes(expected.reason);\n }\n\n return expected.reason!.test(e.reason);\n });\n if (!found) {\n throw new Error(\n `Expected reroute reason matching ${expected.reason}, but no matching event found`,\n );\n }\n }\n}\n\n/**\n * Assert the health state of an agent in the health monitor.\n *\n * @example\n * ```typescript\n * assertAgentHealth(monitor, \"researcher\", {\n * minScore: 70,\n * circuitState: \"CLOSED\",\n * });\n * ```\n */\nexport function assertAgentHealth(\n monitor: HealthMonitor,\n agentId: string,\n expected: {\n minScore?: number;\n maxScore?: number;\n circuitState?: \"CLOSED\" | \"OPEN\" | \"HALF_OPEN\";\n minSuccessRate?: number;\n },\n): void {\n const metrics = monitor.getMetrics(agentId);\n\n if (\n expected.minScore !== undefined &&\n metrics.healthScore < expected.minScore\n ) {\n throw new Error(\n `Expected agent \"${agentId}\" health score to be at least ${expected.minScore}, got ${metrics.healthScore}`,\n );\n }\n\n if (\n expected.maxScore !== undefined &&\n metrics.healthScore > expected.maxScore\n ) {\n throw new Error(\n `Expected agent \"${agentId}\" health score to be at most ${expected.maxScore}, got ${metrics.healthScore}`,\n );\n }\n\n if (\n expected.circuitState !== undefined &&\n metrics.circuitState !== expected.circuitState\n ) {\n throw new Error(\n `Expected agent \"${agentId}\" circuit state to be \"${expected.circuitState}\", got \"${metrics.circuitState}\"`,\n );\n }\n\n if (\n expected.minSuccessRate !== undefined &&\n metrics.successRate < expected.minSuccessRate\n ) {\n throw new Error(\n `Expected agent \"${agentId}\" success rate to be at least ${expected.minSuccessRate}, got ${metrics.successRate}`,\n );\n }\n}\n\n// ============================================================================\n// Checkpoint Test Helpers\n// ============================================================================\n\n/**\n * Create a test checkpoint store (wraps InMemoryCheckpointStore with assertion helpers).\n *\n * @example\n * ```typescript\n * const store = createTestCheckpointStore();\n * const orchestrator = createAgentOrchestrator({ runner, checkpointStore: store });\n * const cp = await orchestrator.checkpoint();\n * expect(store.saved).toHaveLength(1);\n * ```\n */\nexport function createTestCheckpointStore(\n maxCheckpoints = 100,\n): CheckpointStore & {\n saved: Checkpoint[];\n inner: InMemoryCheckpointStore;\n /** Get the most recently saved checkpoint */\n getLatest: () => Checkpoint | undefined;\n} {\n const inner = new InMemoryCheckpointStore({ maxCheckpoints });\n const saved: Checkpoint[] = [];\n\n return {\n inner,\n saved,\n getLatest: () => saved[saved.length - 1],\n async save(checkpoint: Checkpoint): Promise<string> {\n saved.push(checkpoint);\n\n return inner.save(checkpoint);\n },\n load: (id: string) => inner.load(id),\n list: () => inner.list(),\n delete: (id: string) => inner.delete(id),\n clear: () => inner.clear(),\n prune: () => inner.prune(),\n };\n}\n\n/**\n * Assert that a checkpoint has expected properties.\n */\nexport function assertCheckpoint(\n checkpoint: Checkpoint,\n expected: {\n orchestratorType?: \"single\" | \"multi\";\n hasTimeline?: boolean;\n hasMemory?: boolean;\n hasSystemExport?: boolean;\n label?: string;\n },\n): void {\n if (\n expected.orchestratorType !== undefined &&\n checkpoint.orchestratorType !== expected.orchestratorType\n ) {\n throw new Error(\n `Expected checkpoint orchestratorType \"${expected.orchestratorType}\", got \"${checkpoint.orchestratorType}\"`,\n );\n }\n\n if (\n expected.hasSystemExport === true &&\n (!checkpoint.systemExport || checkpoint.systemExport === \"\")\n ) {\n throw new Error(\n \"Expected checkpoint to have non-empty systemExport, but it was empty\",\n );\n }\n\n if (expected.hasTimeline === true && checkpoint.timelineExport === null) {\n throw new Error(\n \"Expected checkpoint to have timeline export, but it was null\",\n );\n }\n\n if (expected.hasTimeline === false && checkpoint.timelineExport !== null) {\n throw new Error(\n \"Expected checkpoint to have no timeline export, but it was present\",\n );\n }\n\n if (expected.hasMemory === true && checkpoint.memoryExport === null) {\n throw new Error(\n \"Expected checkpoint to have memory export, but it was null\",\n );\n }\n\n if (expected.hasMemory === false && checkpoint.memoryExport !== null) {\n throw new Error(\n \"Expected checkpoint to have no memory export, but it was present\",\n );\n }\n\n if (expected.label !== undefined && checkpoint.label !== expected.label) {\n throw new Error(\n `Expected checkpoint label \"${expected.label}\", got \"${checkpoint.label}\"`,\n );\n }\n}\n\n// ============================================================================\n// Breakpoint Test Helpers\n// ============================================================================\n\n/** Options for the breakpoint simulator */\nexport interface BreakpointSimulatorOptions {\n /** Auto-resume after this delay (ms). Default: 0 (immediate) */\n autoResumeDelay?: number;\n /** Modifications to apply on resume */\n modifications?: BreakpointModifications;\n /** If true, cancel instead of resume */\n cancel?: boolean;\n /** Cancel reason */\n cancelReason?: string;\n}\n\n/**\n * Create a breakpoint simulator that auto-resolves breakpoints.\n *\n * @example\n * ```typescript\n * const simulator = createBreakpointSimulator({ autoResumeDelay: 10 });\n * const orchestrator = createAgentOrchestrator({\n * runner,\n * breakpoints: [{ type: \"pre_agent_run\" }],\n * onBreakpoint: simulator.handler,\n * });\n * // Run agent — breakpoint fires and auto-resumes\n * await orchestrator.run(\"test input\");\n * expect(simulator.hits).toHaveLength(1);\n * ```\n */\n/** Minimal interface for breakpoint-capable orchestrators */\nexport interface BreakpointCapable {\n resumeBreakpoint(id: string, modifications?: BreakpointModifications): void;\n cancelBreakpoint(id: string, reason?: string): void;\n}\n\n/**\n * Create a breakpoint simulator that auto-resolves breakpoints for testing.\n *\n * @param options - Simulator options including `autoResumeDelay` and `modifications`.\n * @returns An object with `handler`, `hits`, and `attachTo` for test assertions.\n */\nexport function createBreakpointSimulator(\n options: BreakpointSimulatorOptions = {},\n): {\n handler: (request: BreakpointRequest) => void;\n hits: BreakpointRequest[];\n attachTo: (orchestrator: BreakpointCapable) => void;\n} {\n const hits: BreakpointRequest[] = [];\n let orchestratorRef: BreakpointCapable | null = null;\n let attached = false;\n\n const handler = (request: BreakpointRequest) => {\n hits.push(request);\n\n if (!attached) {\n throw new Error(\n \"[Directive] BreakpointSimulator: handler called but attachTo() was never called. \" +\n \"Breakpoints will not be resolved. Call simulator.attachTo(orchestrator) after creation.\",\n );\n }\n\n const delay = options.autoResumeDelay ?? 0;\n\n const doResolve = () => {\n if (!orchestratorRef) {\n return;\n }\n if (options.cancel) {\n orchestratorRef.cancelBreakpoint(request.id, options.cancelReason);\n } else {\n orchestratorRef.resumeBreakpoint(request.id, options.modifications);\n }\n };\n\n if (delay > 0) {\n setTimeout(doResolve, delay);\n } else {\n // Use queueMicrotask so the breakpoint state is written before we resolve\n queueMicrotask(doResolve);\n }\n };\n\n return {\n handler,\n hits,\n attachTo: (orch: BreakpointCapable) => {\n orchestratorRef = orch;\n attached = true;\n },\n };\n}\n\n/**\n * Assert that a breakpoint was hit with expected properties.\n */\nexport function assertBreakpointHit(\n hits: BreakpointRequest[],\n expected: {\n type?: string;\n agentId?: string;\n count?: number;\n },\n): void {\n if (expected.count !== undefined && hits.length !== expected.count) {\n throw new Error(\n `Expected ${expected.count} breakpoint hits, got ${hits.length}`,\n );\n }\n\n if (expected.type) {\n const found = hits.some((h) => h.type === expected.type);\n if (!found) {\n const types = hits.map((h) => h.type).join(\", \");\n\n throw new Error(\n `Expected breakpoint of type \"${expected.type}\", found types: [${types}]`,\n );\n }\n }\n\n if (expected.agentId) {\n const found = hits.some((h) => h.agentId === expected.agentId);\n if (!found) {\n const agents = hits.map((h) => h.agentId).join(\", \");\n\n throw new Error(\n `Expected breakpoint for agent \"${expected.agentId}\", found agents: [${agents}]`,\n );\n }\n }\n}\n\n// ============================================================================\n// Structured Output Test Helpers\n// ============================================================================\n\n/**\n * Create a mock SafeParseable schema for testing.\n *\n * @example\n * ```typescript\n * const schema = createMockSchema((data) => typeof data === \"object\" && data !== null);\n * const orchestrator = createAgentOrchestrator({\n * runner,\n * outputSchema: schema,\n * });\n * ```\n */\nexport function createMockSchema<T>(\n validate: (data: unknown) => boolean,\n description?: string,\n): {\n safeParse: (data: unknown) => {\n success: boolean;\n data?: T;\n error?: { message: string };\n };\n description?: string;\n} {\n return {\n safeParse: (data: unknown) => {\n if (validate(data)) {\n return { success: true, data: data as T };\n }\n\n return { success: false, error: { message: \"Validation failed\" } };\n },\n description,\n };\n}\n\n// ============================================================================\n// Multiplexed Stream Test Helpers\n// ============================================================================\n\n/**\n * Collect all chunks from a multiplexed stream into an array.\n *\n * @example\n * ```typescript\n * const { stream } = orchestrator.runParallelStream([\"a\", \"b\"], \"input\", merge);\n * const chunks = await collectMultiplexedStream(stream);\n * expect(chunks.length).toBeGreaterThan(0);\n * ```\n */\nexport async function collectMultiplexedStream(\n stream: AsyncIterable<MultiplexedStreamChunk>,\n): Promise<MultiplexedStreamChunk[]> {\n const chunks: MultiplexedStreamChunk[] = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n\n return chunks;\n}\n\n/**\n * Assert properties of collected multiplexed stream chunks.\n */\nexport function assertMultiplexedStream(\n chunks: MultiplexedStreamChunk[],\n expected: {\n agentIds?: string[];\n minChunks?: number;\n hasDone?: boolean;\n hasErrors?: boolean;\n },\n): void {\n if (expected.minChunks !== undefined && chunks.length < expected.minChunks) {\n throw new Error(\n `Expected at least ${expected.minChunks} chunks, got ${chunks.length}`,\n );\n }\n\n if (expected.agentIds) {\n const seenAgents = new Set(chunks.map((c) => c.agentId));\n for (const agentId of expected.agentIds) {\n if (!seenAgents.has(agentId)) {\n throw new Error(\n `Expected chunks from agent \"${agentId}\", found agents: [${[...seenAgents].join(\", \")}]`,\n );\n }\n }\n }\n\n if (expected.hasDone === true) {\n const hasDone = chunks.some((c) => c.chunk.type === \"done\");\n if (!hasDone) {\n throw new Error(\"Expected at least one 'done' chunk, found none\");\n }\n }\n\n if (expected.hasErrors === true) {\n const hasError = chunks.some((c) => c.chunk.type === \"error\");\n if (!hasError) {\n throw new Error(\"Expected at least one 'error' chunk, found none\");\n }\n }\n\n if (expected.hasErrors === false) {\n const hasError = chunks.some((c) => c.chunk.type === \"error\");\n if (hasError) {\n throw new Error(\"Expected no 'error' chunks, but found some\");\n }\n }\n}\n\n// ============================================================================\n// Reflection Test Helpers\n// ============================================================================\n\n/**\n * Create a test reflection evaluator that passes after N iterations.\n *\n * @example\n * ```typescript\n * const evaluator = createTestReflectionEvaluator({ passAfter: 2 });\n * const reflective = withReflection(runner, { evaluate: evaluator });\n * ```\n */\nexport function createTestReflectionEvaluator(options?: {\n /** Pass after this many evaluations (1 = pass on first try). Default: 1 */\n passAfter?: number;\n /** Feedback to provide on failure */\n feedback?: string;\n /** Score to assign (0-1) */\n score?: number;\n}): ReflectionEvaluator {\n const passAfter = options?.passAfter ?? 1;\n const feedback = options?.feedback ?? \"Needs improvement\";\n const score = options?.score;\n let callCount = 0;\n\n return (_output: unknown, _context) => {\n callCount++;\n const passed = callCount >= passAfter;\n\n return {\n passed,\n feedback: passed ? undefined : feedback,\n score: score ?? (passed ? 1 : 0.5),\n };\n };\n}\n\n// ============================================================================\n// Scratchpad Test Helpers\n// ============================================================================\n\n/**\n * Assert that a scratchpad contains expected values.\n *\n * @example\n * ```typescript\n * assertScratchpadState(orchestrator.scratchpad!, {\n * \"plan.status\": \"complete\",\n * \"research.results\": expect.any(Array),\n * });\n * ```\n */\nexport function assertScratchpadState(\n scratchpad: Scratchpad,\n expected: Record<string, unknown>,\n): void {\n const all = scratchpad.getAll();\n for (const [key, expectedValue] of Object.entries(expected)) {\n const actual = all[key];\n if (actual !== expectedValue) {\n throw new Error(\n `Expected scratchpad key \"${key}\" to be ${JSON.stringify(expectedValue)}, got ${JSON.stringify(actual)}`,\n );\n }\n }\n}\n\n// ============================================================================\n// Derivation Test Helpers\n// ============================================================================\n\n/**\n * Assert that derived values match expected values.\n *\n * @example\n * ```typescript\n * assertDerivedValues(orchestrator, {\n * totalRuns: 3,\n * allComplete: true,\n * });\n * ```\n */\nexport function assertDerivedValues(\n orchestrator: MultiAgentOrchestrator,\n expected: Record<string, unknown>,\n): void {\n const derived = orchestrator.derived;\n for (const [key, expectedValue] of Object.entries(expected)) {\n const actual = derived[key];\n if (typeof expectedValue === \"object\" && expectedValue !== null) {\n // Sort keys for order-independent comparison\n const sortedStringify = (v: unknown): string =>\n JSON.stringify(v, Object.keys(v as Record<string, unknown>).sort());\n if (sortedStringify(actual) !== sortedStringify(expectedValue)) {\n throw new Error(\n `Expected derived value \"${key}\" to be ${JSON.stringify(expectedValue)}, got ${JSON.stringify(actual)}`,\n );\n }\n } else if (actual !== expectedValue) {\n throw new Error(\n `Expected derived value \"${key}\" to be ${JSON.stringify(expectedValue)}, got ${JSON.stringify(actual)}`,\n );\n }\n }\n}\n"]}