@bluecopa/harness 0.1.0-snapshot.99 → 2.0.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.
- package/dist/arc/index.d.ts +796 -0
- package/dist/arc/index.js +2863 -0
- package/dist/arc/index.js.map +1 -0
- package/dist/observability/otel.d.ts +36 -0
- package/dist/observability/otel.js +73 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/shared-types-DRxnerLT.d.ts +138 -0
- package/dist/skills/index.d.ts +67 -0
- package/dist/skills/index.js +282 -0
- package/dist/skills/index.js.map +1 -0
- package/package.json +11 -15
- package/dist/arc/app-adapter.d.ts +0 -101
- package/dist/arc/app-adapter.js +0 -312
- package/dist/arc/app-adapter.js.map +0 -1
- package/dist/arc/create-arc-agent.d.ts +0 -50
- package/dist/arc/create-arc-agent.js +0 -2926
- package/dist/arc/create-arc-agent.js.map +0 -1
- package/dist/arc/profile-builder.d.ts +0 -49
- package/dist/arc/profile-builder.js +0 -163
- package/dist/arc/profile-builder.js.map +0 -1
- package/dist/loop/vercel-agent-loop.d.ts +0 -99
- package/dist/loop/vercel-agent-loop.js +0 -308
- package/dist/loop/vercel-agent-loop.js.map +0 -1
- package/dist/types-g-3DvSSE.d.ts +0 -745
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/agent/types.ts","../../src/arc/arc-types.ts","../../src/arc/message-convert.ts","../../src/arc/types.ts","../../src/loop/vercel-agent-loop.ts","../../src/arc/tools.ts","../../src/arc/openrouter-models.ts","../../src/arc/context-window.ts","../../src/arc/memory-manager.ts","../../src/arc/consolidation.ts","../../src/skills/skill-router.ts","../../src/skills/skill-loader.ts","../../src/arc/skill-resolver.ts","../../src/arc/episode-compressor.ts","../../src/arc/utils.ts","../../src/arc/agent-runner.ts","../../src/arc/sig.ts","../../src/arc/profile-builder.ts","../../src/arc/process-manager.ts","../../src/arc/orchestrator-turn-runner.ts","../../src/arc/completion-policy.ts","../../src/arc/arc-loop.ts","../../src/arc/create-arc-agent.ts"],"names":["tool","z","generateText","defaultAnthropicProvider","id","resolvePath","readFile","randomUUID","result","aiTool","streamText","stepCountIs","text","generateObject","start","resultText","process","name","proc"],"mappings":"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","file":"create-arc-agent.js","sourcesContent":["export interface ToolCallInfo {\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n /** Provider-specific metadata preserved across round-trips (e.g., Gemini thought signatures). */\n providerMetadata?: Record<string, unknown>;\n}\n\nexport interface ToolResultInfo {\n toolCallId: string;\n toolName: string;\n result: string;\n isError?: boolean;\n}\n\nexport type ContentPart =\n | { type: 'text'; text: string }\n | { type: 'image'; image: Buffer | Uint8Array; mimeType: string };\n\nexport interface AgentMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string | ContentPart[];\n toolCalls?: ToolCallInfo[]; // assistant messages: what tools were called\n toolResults?: ToolResultInfo[]; // tool messages: results keyed by toolCallId\n /** Provider-specific metadata preserved across round-trips (e.g., Gemini thought signatures). */\n providerMetadata?: Record<string, unknown>;\n}\n\n/** Extract plain text from content (string or ContentPart[]). */\nexport function getTextContent(content: string | ContentPart[]): string {\n if (typeof content === 'string') return content;\n return content\n .filter((p): p is Extract<ContentPart, { type: 'text' }> => p.type === 'text')\n .map((p) => p.text)\n .join('\\n');\n}\n\nexport interface ToolCallAction {\n type: 'tool';\n name: string;\n args: Record<string, unknown>;\n toolCallId?: string;\n}\n\nexport interface FinalAction {\n type: 'final';\n content: string;\n}\n\nexport interface ToolBatchAction {\n type: 'tool_batch';\n calls: ToolCallAction[];\n}\n\nexport type AgentAction = ToolCallAction | FinalAction | ToolBatchAction;\n\nexport interface AgentRunResult {\n messages: AgentMessage[];\n output: string;\n steps: number;\n}\n\n/** Token usage breakdown for a single LLM step. */\nexport interface StepUsage {\n inputTokens?: number;\n outputTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n reasoningTokens?: number;\n}\n\nexport type AgentStreamEvent =\n | { type: 'text_delta'; text: string }\n | { type: 'tool_start'; name: string; args: Record<string, unknown>; toolCallId?: string }\n | { type: 'tool_end'; name: string; result: { success: boolean; output: string; error?: string; [key: string]: unknown } }\n | { type: 'step_start'; step: number }\n | { type: 'step_end'; step: number; usage?: StepUsage }\n | { type: 'done'; output: string; steps: number };\n\nexport interface AgentLoop {\n nextAction(messages: AgentMessage[]): Promise<AgentAction>;\n streamAction?(messages: AgentMessage[]): AsyncIterable<AgentStreamEvent>;\n}\n\n/** Context passed to `prepareStep` before each LLM call. */\nexport interface PrepareStepContext {\n stepNumber: number;\n toolCallHistory: string[];\n}\n\n/** Overrides returned by `prepareStep`. All fields optional — omit to keep defaults. */\nexport interface PrepareStepResult {\n model?: string;\n activeTools?: string[];\n}\n","import type { AgentMessage } from '../agent/types';\nimport type { Tool } from 'ai';\n\n// ── Episode types ──\n\nexport interface Episode {\n id: string;\n taskId: string;\n sessionId: string;\n index: number;\n threadAction: string;\n summary: string;\n toolCalls: string[];\n filesRead: string[];\n filesModified: string[];\n model: string;\n steps: number;\n success: boolean;\n createdAt: number;\n parentEpisodeIds: string[];\n /** Typed output from generateObject when profile has a typed signature. */\n structuredOutput?: Record<string, unknown>;\n}\n\nexport interface EpisodeTrace {\n episodeId: string;\n messages: AgentMessage[];\n createdAt: number;\n ttl?: number;\n}\n\n// ── Session memo types ──\n\nexport interface SessionMemo {\n id: string;\n sessionId: string;\n content: string;\n sourceEpisodeIds: string[];\n createdAt: number;\n updatedAt?: number;\n}\n\n// ── Long-term memory types ──\n\nexport interface LongTermMemory {\n id: string;\n content: string;\n category: string;\n sourceSessionMemoIds: string[];\n createdAt: number;\n updatedAt: number;\n}\n\n// ── Store interfaces ──\n\nexport interface EpisodeStore {\n addEpisode(episode: Episode): Promise<void>;\n addTrace(trace: EpisodeTrace): Promise<void>;\n getEpisode(id: string): Promise<Episode | null>;\n getTrace(episodeId: string): Promise<EpisodeTrace | null>;\n getEpisodesByTask(taskId: string): Promise<Episode[]>;\n getEpisodesBySession(sessionId: string): Promise<Episode[]>;\n getRecentEpisodes(limit: number): Promise<Episode[]>;\n evictTraces(olderThan: number): Promise<number>;\n}\n\nexport interface SessionMemoStore {\n addMemo(memo: SessionMemo): Promise<void>;\n getMemo(id: string): Promise<SessionMemo | null>;\n getMemoBySession?(sessionId: string): Promise<SessionMemo | null>;\n getMemosBySession(sessionId: string): Promise<SessionMemo[]>;\n getRecentMemos(limit: number): Promise<SessionMemo[]>;\n}\n\nexport interface LongTermStore {\n addMemory(memory: LongTermMemory): Promise<void>;\n getMemory(id: string): Promise<LongTermMemory | null>;\n getAllMemories(): Promise<LongTermMemory[]>;\n getMemoriesByCategory(category: string): Promise<LongTermMemory[]>;\n updateMemory(id: string, updates: Partial<Pick<LongTermMemory, 'content' | 'category' | 'updatedAt'>>): Promise<void>;\n deleteMemory(id: string): Promise<void>;\n}\n\n// ── Model tiers ──\n\nexport type ModelTier = 'fast' | 'medium' | 'strong';\n\n/** Default model IDs for each tier. Override via ArcLoopConfig.modelMap. */\nexport const DEFAULT_MODEL_MAP: Record<ModelTier, string> = {\n fast: 'claude-haiku-4-5',\n medium: 'claude-sonnet-4-6',\n strong: 'claude-opus-4-6',\n};\n\n/** Resolve a model tier name or raw model ID to a concrete model ID. */\nexport function resolveModel(modelOrTier: string | undefined, modelMap: Record<ModelTier, string>, fallback: string): string {\n if (!modelOrTier) return fallback;\n if (modelOrTier in modelMap) return modelMap[modelOrTier as ModelTier];\n return modelOrTier; // raw model ID passthrough\n}\n\n// ── Shared tool alias ──\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyTool = Tool<any, any>;\n\n// ── Debug export ──\n\nexport interface DebugExport {\n taskId?: string;\n sessionId?: string;\n exportedAt: number;\n episodes: Episode[];\n traces: EpisodeTrace[];\n sessionMemos: SessionMemo[];\n longTermMemories: LongTermMemory[];\n}\n","import type { AgentMessage } from '../agent/types';\nimport { getTextContent } from '../agent/types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ModelMessage = any;\n\n/**\n * Convert AgentMessage[] to Vercel AI SDK ModelMessage[].\n * Extracted from VercelAgentLoop — identical logic, standalone pure function.\n *\n * System messages that appear after user/assistant/tool messages are\n * converted to user messages with a [System] prefix. The Anthropic API\n * does not allow interleaved system messages; the actual system prompt\n * is passed separately via the `system` parameter.\n */\nexport function toModelMessages(messages: AgentMessage[]): ModelMessage[] {\n const out: ModelMessage[] = [];\n\n // Track whether we have seen a non-system message. After that point,\n // any system-role message must be converted to a user message.\n let seenNonSystem = false;\n\n for (const msg of messages) {\n if (msg.role === 'system') {\n const text = typeof msg.content === 'string' ? msg.content : getTextContent(msg.content);\n if (seenNonSystem) {\n // Convert to user message to avoid Anthropic SDK error\n out.push({ role: 'user', content: `[System] ${text}` });\n } else {\n out.push({ role: 'system', content: text });\n }\n continue;\n }\n\n seenNonSystem = true;\n\n if (msg.role === 'user') {\n out.push({ role: 'user', content: msg.content });\n continue;\n }\n\n if (msg.role === 'assistant') {\n const textContent = typeof msg.content === 'string' ? msg.content : getTextContent(msg.content);\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const parts: any[] = [];\n if (textContent) {\n parts.push({ type: 'text', text: textContent });\n }\n for (const tc of msg.toolCalls) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const part: any = {\n type: 'tool-call',\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n input: tc.args,\n };\n // Preserve per-tool-call provider options (e.g., Gemini thought signatures)\n if (tc.providerMetadata) {\n part.providerOptions = tc.providerMetadata;\n }\n parts.push(part);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const assistantMsg: any = { role: 'assistant', content: parts };\n // Preserve response-level provider options (e.g., Gemini thought signatures)\n if (msg.providerMetadata) {\n assistantMsg.providerOptions = msg.providerMetadata;\n }\n out.push(assistantMsg);\n } else {\n out.push({ role: 'assistant', content: textContent });\n }\n continue;\n }\n\n if (msg.role === 'tool') {\n if (msg.toolResults && msg.toolResults.length > 0) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const parts: any[] = msg.toolResults.map(tr => ({\n type: 'tool-result',\n toolCallId: tr.toolCallId,\n toolName: tr.toolName,\n output: tr.isError\n ? { type: 'error-text', value: tr.result }\n : { type: 'text', value: tr.result },\n }));\n out.push({ role: 'tool', content: parts });\n } else {\n const textContent = typeof msg.content === 'string' ? msg.content : getTextContent(msg.content);\n out.push({ role: 'user', content: `[Tool result]: ${textContent}` });\n }\n continue;\n }\n }\n\n return out;\n}\n\n/** Rough token estimate: ~4 chars per token. */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n/** Estimate total tokens across an array of messages. */\nexport function estimateMessagesTokens(messages: AgentMessage[]): number {\n let total = 0;\n for (const msg of messages) {\n const text = typeof msg.content === 'string' ? msg.content : getTextContent(msg.content);\n total += estimateTokens(text);\n if (msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n total += estimateTokens(JSON.stringify(tc.args));\n }\n }\n if (msg.toolResults) {\n for (const tr of msg.toolResults) {\n total += estimateTokens(tr.result);\n }\n }\n }\n return total;\n}\n","// ── Re-exports from shared types ──\n\nexport type {\n Episode,\n EpisodeTrace,\n SessionMemo,\n LongTermMemory,\n EpisodeStore,\n SessionMemoStore,\n LongTermStore,\n AnyTool,\n} from './arc-types';\n\nexport { DEFAULT_MODEL_MAP, resolveModel } from './arc-types';\nexport type { ModelTier } from './arc-types';\n\nexport type {\n AgentMessage,\n ToolCallAction,\n ToolCallInfo,\n ToolResultInfo,\n ContentPart,\n AgentRunResult,\n StepUsage,\n} from '../agent/types';\nexport { getTextContent } from '../agent/types';\n\nexport type { ToolProvider, ToolResult } from '../interfaces/tool-provider';\nexport type { SandboxProvider } from '../interfaces/sandbox-provider';\nexport type { HarnessTelemetry } from '../observability/otel';\nexport type { HookRunner } from '../hooks/hook-runner';\nexport type { PermissionManager } from '../permissions/permission-manager';\nexport type { SkillManager } from '../skills/skill-manager';\n\n// ── Episode artifacts ──\n\nexport interface EpisodeArtifact {\n key: string; // e.g. 'error_output', 'modified_code', 'test_result'\n content: string; // verbatim extracted content\n}\n\n// ── Model factory ──\n\n/** Creates an ai-sdk LanguageModel from a model ID string. Defaults to anthropic(). */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ModelFactory = (modelId: string) => any;\n\n// ── Tool choice ──\n\n/** Static tool choice value for LLM calls. */\nexport type ToolChoiceValue = 'auto' | 'required' | 'none' | { type: 'tool'; toolName: string };\n\n/**\n * Tool choice configuration — static value or per-turn callback.\n *\n * As a callback, receives the turn/step number (0-indexed) and returns the choice for that turn.\n * This enables patterns like forcing tool use on the first turn only:\n * `(turn) => turn === 0 ? 'required' : 'auto'`\n */\nexport type ToolChoiceConfig = ToolChoiceValue | ((turn: number) => ToolChoiceValue);\n\n/** Resolve a ToolChoiceConfig to a concrete value for a given turn. */\nexport function resolveToolChoice(config: ToolChoiceConfig | undefined, turn: number): ToolChoiceValue {\n if (!config) return 'auto';\n return typeof config === 'function' ? config(turn) : config;\n}\n\n// ── ArcLoop v2 Config ──\n\nexport interface ArcLoopConfig {\n // Orchestrator\n /** Orchestrator model (default: 'claude-opus-4-6'). Accepts a model ID or tier name. */\n model?: string;\n /** Model tier mapping. Override to use different models for fast/medium/strong. */\n modelMap?: Record<import('./arc-types').ModelTier, string>;\n /** Model factory — creates an ai-sdk LanguageModel from a model ID. Defaults to anthropic(). */\n createModel?: ModelFactory;\n /** @deprecated Use createModel instead. Anthropic API key (set via ANTHROPIC_API_KEY env var). */\n apiKey?: string;\n /** Custom orchestrator system prompt */\n systemPrompt?: string;\n /** Max orchestrator turns before stopping (default: 30) */\n maxTurns?: number;\n /** Extra orchestrator tools beyond Thread/Check/Cancel/Remember */\n extraOrchestratorTools?: Record<string, import('./arc-types').AnyTool>;\n /** Handler for extra orchestrator tools. Return an AgentAction (typically FinalAction with directive). */\n onOrchestratorTool?: (name: string, args: Record<string, unknown>) => Promise<import('../agent/types').AgentAction>;\n /** Optional resilience policy applied to LLM calls (retry, circuit breaker, timeout, etc.). */\n resilience?: import('./resilience/types').ResiliencePolicy;\n\n /** Tool choice for orchestrator LLM calls. Supports per-turn callbacks. Default: 'auto'. */\n orchestratorToolChoice?: ToolChoiceConfig;\n /** Default tool choice for all processes. Individual profiles can override. Default: 'auto'. */\n processToolChoice?: ToolChoiceConfig;\n\n /** ResultPager for storing large tool results externally in processes. */\n resultPager?: import('./result-pager').ResultPager;\n /** Character threshold above which tool results are paged. Default: 4000. */\n resultPageThreshold?: number;\n /** Tool names to never page (e.g., ['Read', 'Edit']). */\n pagingExclude?: string[];\n /** Hard cap on tool result length (chars) when no resultPager is configured. Truncates with a note. */\n maxToolResultLength?: number;\n /** Structured facts injected into process system prompts (e.g., from long-term memory). */\n contextFacts?: string[];\n /** Max context tokens for worker threads. When set, stubs old tool results to keep within budget. */\n maxContextTokens?: number;\n /**\n * Seed context injected into every process as a system message.\n * Use this to pass the user's original request, attachment metadata,\n * or other context that threads need but the orchestrator may not include\n * in the Thread action text.\n */\n processSeedContext?: string | import('../agent/types').AgentMessage[];\n\n // Processes\n /** Per-process timeout in ms (default: 120_000) */\n processTimeout?: number;\n /** Per-process max steps (default: 20) */\n processMaxSteps?: number;\n /** Default system prompt for all processes (overrides the built-in default) */\n processSystemPrompt?: string;\n /** Named process profiles. Accepts ProfileDeclaration (new, declarative) or ProcessProfile (legacy). */\n processProfiles?: Record<string, ProfileConfig>;\n /** Tools available inside processes (default: builtinTools) */\n processTools?: Record<string, import('./arc-types').AnyTool>;\n\n // Context\n /** Context window size in tokens (default: 200_000) */\n contextWindowSize?: number;\n /** Tokens reserved for output (default: 20_000) */\n outputReserve?: number;\n /**\n * Enable dynamic context window detection via OpenRouter API.\n * When true, fetches model-specific context_length from OpenRouter.\n * Falls back to 128K tokens for unknown models.\n * Overrides contextWindowSize if both are set.\n * @default false\n */\n dynamicContextWindow?: boolean;\n\n // Stores (required)\n episodeStore: import('./arc-types').EpisodeStore;\n sessionMemoStore: import('./arc-types').SessionMemoStore;\n longTermStore: import('./arc-types').LongTermStore;\n\n // Identity (required)\n taskId: string;\n sessionId: string;\n\n // Memory\n /** Enable auto-memory detection and promotion (default: true) */\n autoMemory?: boolean;\n\n // Dependency injection\n /** Pre-built SkillResolver instance. If omitted, one is created from skillIndexPath (if provided). */\n skillResolver?: import('./skill-resolver').SkillResolver;\n\n // Tools & providers\n toolProvider: import('../interfaces/tool-provider').ToolProvider;\n /** Tool provider for skill-matched processes (sandbox) */\n skillToolProvider?: import('../interfaces/tool-provider').ToolProvider;\n /** Local directory to sync sandbox output artifacts to (default: './outputs') */\n localOutputDir?: string;\n\n // Runtime (passed through to processes)\n sandboxProvider?: import('../interfaces/sandbox-provider').SandboxProvider;\n skillManager?: import('../skills/skill-manager').SkillManager;\n skillIndexPath?: string;\n telemetry?: import('../observability/otel').HarnessTelemetry;\n hookRunner?: import('../hooks/hook-runner').HookRunner;\n permissionManager?: import('../permissions/permission-manager').PermissionManager;\n executeToolAction?: (action: import('../agent/types').ToolCallAction) => Promise<import('../interfaces/tool-provider').ToolResult | null>;\n}\n\n// ── Process types ──\n\nexport interface Process {\n id: string;\n action: string;\n model: string;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';\n\n /** Outbox: observable stream of events from this process. */\n outbox: AsyncIterable<ProcessEvent>;\n\n /** Inbox: send messages or signals to a running process. */\n inbox: {\n send(message: import('../agent/types').AgentMessage): void;\n cancel(): void;\n };\n\n /** Result (available after completion). */\n result?: ProcessResult;\n}\n\nexport type ProcessEvent =\n | { type: 'activity'; activity: Activity }\n | { type: 'text_delta'; text: string }\n | { type: 'step_start'; step: number }\n | { type: 'step_end'; step: number; usage?: import('../agent/types').StepUsage }\n | { type: 'episode'; episode: import('./arc-types').Episode }\n | { type: 'done'; result: ProcessResult }\n | { type: 'failed'; error: string };\n\nexport interface ProcessResult {\n episode: import('./arc-types').Episode;\n trace: import('./arc-types').EpisodeTrace;\n artifacts: EpisodeArtifact[];\n success: boolean;\n durationMs: number;\n resolvedModel: string;\n error?: string;\n}\n\nexport interface ProcessRequest {\n action: string;\n contextEpisodeIds?: string[];\n model?: import('./arc-types').ModelTier;\n maxSteps?: number;\n label?: string;\n /** Named profile to use for this process (looked up from ArcLoopConfig.processProfiles). */\n profile?: string;\n}\n\n/**\n * ProfileDeclaration — typed, declarative profile definition.\n *\n * Replaces hand-written system prompts with structured declarations.\n * The system generates prompts from the declaration and enforces tool constraints.\n *\n * @example\n * const visual: ProfileDeclaration = {\n * name: 'visual',\n * signature: 'description -> compiledArtifact',\n * tools: ['CompileJsx', 'Read', 'ListFiles'],\n * skills: ['visual-explainer'],\n * };\n */\nexport interface ProfileDeclaration {\n /** Profile name (matches the Thread tool's profile parameter). */\n name: string;\n /** Typed signature: \"input -> output\". Describes what this profile produces. */\n signature: string;\n /** Tool names this profile can use. Only these tools are available — enforced at schema + executor level. */\n tools: string[];\n /** Domain knowledge injected into system prompt (skill content, color systems, etc.). */\n background?: string;\n /** Default model tier. */\n model?: import('./arc-types').ModelTier;\n /** Max LLM steps. */\n maxSteps?: number;\n /** Skill names this profile can use. SkillRouter is constrained to this set. Omit for all skills. */\n skills?: string[];\n /** Few-shot demonstration examples. Rendered as user/assistant message pairs in the prompt. */\n demos?: Array<{\n input: Record<string, string>;\n output: Record<string, unknown>;\n }>;\n}\n\n/** A named process profile — runtime form with resolved prompt and tools. */\nexport interface ProcessProfile {\n /** System prompt for processes using this profile. */\n systemPrompt: string;\n /** Tools available to processes using this profile (overrides processTools). */\n tools?: Record<string, import('./arc-types').AnyTool>;\n /** Default model tier for this profile (Thread tool's explicit model overrides this). */\n model?: import('./arc-types').ModelTier;\n /** Max steps for this profile (Thread tool's explicit maxSteps overrides this). */\n maxSteps?: number;\n /** Allowed tool names for executor-level validation (populated from ProfileDeclaration.tools). */\n allowedToolNames?: string[];\n /** Zod schema for structured output on the terminal step (generated from typed signatures). */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n outputSchema?: import('zod').ZodObject<any>;\n /** Few-shot demo messages rendered before the task prompt. */\n demoMessages?: import('../agent/types').AgentMessage[];\n}\n\n/** A profile config can be either a declaration (new) or a raw ProcessProfile (backward compat). */\nexport type ProfileConfig = ProfileDeclaration | ProcessProfile;\n\n/** Type guard: check if a profile config is a declaration. */\nexport function isProfileDeclaration(p: ProfileConfig): p is ProfileDeclaration {\n return 'signature' in p && typeof (p as ProfileDeclaration).signature === 'string';\n}\n\nexport type Activity =\n | { type: 'tool_start'; name: string; args: Record<string, unknown>; ts: number }\n | { type: 'tool_end'; name: string; ok: boolean; ms: number; preview?: string; ts: number };\n\n// ── Context window types ──\n\nexport interface Turn {\n role: 'orchestrator' | 'process_result' | 'user';\n messages: import('../agent/types').AgentMessage[];\n tokenEstimate: number;\n timestamp: number;\n}\n\nexport interface TokenBudget {\n limit: number;\n used: number;\n layers: {\n system: number;\n memories: number;\n episodes: number;\n conversation: number;\n };\n}\n\nexport interface PreparedContext {\n messages: import('../agent/types').AgentMessage[];\n budget: TokenBudget;\n}\n\n// ── Compression types ──\n\nexport interface CompressInput {\n taskId: string;\n sessionId: string;\n index: number;\n threadAction: string;\n messages: import('../agent/types').AgentMessage[];\n model: string;\n parentEpisodeIds: string[];\n success: boolean;\n}\n\nexport interface CompressOutput {\n episode: import('./arc-types').Episode;\n trace: import('./arc-types').EpisodeTrace;\n artifacts: EpisodeArtifact[];\n}\n\n// ── Event protocol ──\n\nexport type ArcEvent =\n | { type: 'text_delta'; text: string }\n | { type: 'turn_start'; turn: number }\n | { type: 'turn_end'; turn: number }\n | { type: 'process_dispatched'; id: string; action: string; model: string; label?: string; profile?: string }\n | { type: 'thread_rejected'; action: string; reason: string }\n | { type: 'skill_resolved'; processId: string; skillName: string; skillPath: string }\n | { type: 'process_activity'; id: string; activity: Activity }\n | { type: 'process_text_delta'; id: string; text: string }\n | { type: 'process_step_start'; id: string; step: number }\n | { type: 'process_step_end'; id: string; step: number; usage?: import('../agent/types').StepUsage }\n | { type: 'process_completed'; id: string; episodeId: string; summary: string; durationMs: number }\n | { type: 'process_failed'; id: string; error: string }\n | { type: 'process_cancelled'; id: string }\n | { type: 'memory_stored'; id: string; content: string }\n | { type: 'context_compressed'; tier: 'template' | 'episode_group' | 'llm'; tokensSaved: number }\n | { type: 'done'; output: string; stats: RunStats };\n\nexport interface RunStats {\n turns: number;\n processes: number;\n durationMs: number;\n}\n\nexport interface ArcRunResult {\n output: string;\n events: ArcEvent[];\n}\n\n// ── Trace types (for Stateright verification bridge) ──\n\nexport interface TraceEvent {\n ts: number;\n kind: TraceEventKind;\n}\n\nexport type TraceEventKind =\n | { type: 'turn_start'; turn: number }\n | { type: 'turn_end'; turn: number }\n | { type: 'llm_call_start' }\n | { type: 'llm_call_end'; response_type: string }\n | { type: 'process_created'; id: string; status: string }\n | { type: 'process_transition'; id: string; from: string; to: string }\n | { type: 'tool_call'; tool: string; process_id?: string }\n | { type: 'context_prepare'; used: number; limit: number; compression_tier: string }\n | { type: 'abort_signal'; target?: string }\n | { type: 'done' };\n","import { generateText, streamText, stepCountIs, tool, type Tool } from 'ai';\nimport { anthropic as defaultAnthropicProvider } from '@ai-sdk/anthropic';\nimport type { ModelFactory, ToolChoiceConfig } from '../arc/types';\nimport { resolveToolChoice } from '../arc/types';\nimport { z } from 'zod';\n\nimport type { AgentAction, AgentMessage, AgentLoop, AgentStreamEvent, StepUsage, ToolCallAction, ToolBatchAction, PrepareStepContext, PrepareStepResult } from '../agent/types';\nimport { getTextContent } from '../agent/types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyTool = Tool<any, any>;\n\n// ── Native tool definitions (no execute — harness runs them) ──\n\n/** Built-in tool schemas. Merge with custom tools: `{ ...builtinTools, ...myTools }` */\nexport const builtinTools = {\n Bash: tool({\n description: 'Run a shell command',\n inputSchema: z.object({\n command: z.string().describe('The shell command to run'),\n cwd: z.string().optional().describe('Working directory'),\n timeout: z.number().optional().describe('Timeout in milliseconds'),\n }),\n }),\n Read: tool({\n description: 'Read a file from the filesystem',\n inputSchema: z.object({\n path: z.string().describe('Absolute path to the file'),\n }),\n }),\n Write: tool({\n description: 'Write content to a file (creates or overwrites)',\n inputSchema: z.object({\n path: z.string().describe('Absolute path to the file'),\n content: z.string().describe('Content to write'),\n }),\n }),\n Edit: tool({\n description: 'Replace text in a file (exact match)',\n inputSchema: z.object({\n path: z.string().describe('Absolute path to the file'),\n old_text: z.string().describe('Exact text to find'),\n new_text: z.string().describe('Replacement text'),\n }),\n }),\n Glob: tool({\n description: 'Find files matching a glob pattern',\n inputSchema: z.object({\n pattern: z.string().describe('Glob pattern (e.g. **/*.ts)'),\n }),\n }),\n Grep: tool({\n description: 'Search file contents with a regex pattern',\n inputSchema: z.object({\n pattern: z.string().describe('Regex pattern to search for'),\n path: z.string().optional().describe('Directory or file to search in'),\n }),\n }),\n WebFetch: tool({\n description: 'Fetch content from a URL',\n inputSchema: z.object({\n url: z.string().describe('URL to fetch'),\n selector: z.string().optional().describe('CSS selector to extract'),\n maxContentLength: z.number().optional().describe('Max content length'),\n }),\n }),\n WebSearch: tool({\n description: 'Search the web',\n inputSchema: z.object({\n query: z.string().describe('Search query'),\n }),\n }),\n AskUser: tool({\n description: 'Ask the user a question and wait for their response',\n inputSchema: z.object({\n question: z.string().describe('The question to ask'),\n options: z.array(z.string()).optional().describe('Optional choices'),\n }),\n }),\n TellUser: tool({\n description: 'Display a message to the user (no response expected)',\n inputSchema: z.object({\n message: z.string().describe('The message to display'),\n }),\n }),\n DownloadRawFile: tool({\n description: 'Download a file from the sandbox to the local machine',\n inputSchema: z.object({\n path: z.string().describe('Sandbox path to download'),\n }),\n }),\n};\n\n// ── Convert AgentMessage[] to Vercel AI SDK ModelMessage[] ──\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ModelMessage = any;\n\nfunction toModelMessages(messages: AgentMessage[]): ModelMessage[] {\n const out: ModelMessage[] = [];\n\n for (const msg of messages) {\n if (msg.role === 'system') {\n // System messages are always text\n out.push({ role: 'system', content: typeof msg.content === 'string' ? msg.content : getTextContent(msg.content) });\n continue;\n }\n\n if (msg.role === 'user') {\n // Pass through ContentPart[] directly for multimodal (images)\n out.push({ role: 'user', content: msg.content });\n continue;\n }\n\n if (msg.role === 'assistant') {\n const textContent = typeof msg.content === 'string' ? msg.content : getTextContent(msg.content);\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n // Structured assistant message with tool calls\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const parts: any[] = [];\n if (textContent) {\n parts.push({ type: 'text', text: textContent });\n }\n for (const tc of msg.toolCalls) {\n parts.push({\n type: 'tool-call',\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n input: tc.args,\n });\n }\n out.push({ role: 'assistant', content: parts });\n } else {\n out.push({ role: 'assistant', content: textContent });\n }\n continue;\n }\n\n if (msg.role === 'tool') {\n if (msg.toolResults && msg.toolResults.length > 0) {\n // Structured tool result message\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const parts: any[] = msg.toolResults.map(tr => ({\n type: 'tool-result',\n toolCallId: tr.toolCallId,\n toolName: tr.toolName,\n output: tr.isError\n ? { type: 'error-text', value: tr.result }\n : { type: 'text', value: tr.result },\n }));\n out.push({ role: 'tool', content: parts });\n } else {\n // Fallback: no structured fields — wrap as user message\n const textContent = typeof msg.content === 'string' ? msg.content : getTextContent(msg.content);\n out.push({ role: 'user', content: `[Tool result]: ${textContent}` });\n }\n continue;\n }\n }\n\n return out;\n}\n\n/** A system prompt block with optional Anthropic cache control. */\nexport interface SystemPromptBlock {\n text: string;\n cacheControl?: { type: 'ephemeral' };\n}\n\nexport interface VercelAgentLoopConfig {\n model?: string;\n /** System prompt — string or structured blocks with cache control markers. */\n systemPrompt?: string | SystemPromptBlock[];\n createModel?: ModelFactory;\n /** @deprecated Prefer createModel. */\n apiKey?: string;\n /** Custom tool definitions. If provided, replaces built-in agentTools for LLM calls. */\n tools?: Record<string, AnyTool>;\n /** Tool choice for LLM calls. Supports per-turn callbacks. Default: 'auto'. */\n toolChoice?: ToolChoiceConfig;\n /** Provider options passed to generateText/streamText (e.g. anthropic thinking config). */\n providerOptions?: Record<string, unknown>;\n /** Per-step callback to override model and active tools before each LLM call. */\n prepareStep?: (context: PrepareStepContext) => PrepareStepResult | void;\n}\n\nexport class VercelAgentLoop implements AgentLoop {\n private readonly model: string;\n private readonly createModel: ModelFactory;\n private readonly systemPrompt: string | SystemPromptBlock[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly tools: Record<string, AnyTool>;\n private readonly validToolNames: Set<string>;\n private readonly toolChoiceConfig: ToolChoiceConfig | undefined;\n private readonly providerOptions: Record<string, unknown> | undefined;\n private readonly prepareStep: VercelAgentLoopConfig['prepareStep'];\n /** Track tool names called across steps for prepareStep context. */\n private toolCallHistory: string[] = [];\n private step = 0;\n\n /** Last step's token usage — read after nextAction/streamAction completes. */\n public lastUsage: StepUsage | undefined;\n\n constructor(config: VercelAgentLoopConfig = {}) {\n this.toolChoiceConfig = config.toolChoice;\n this.model = config.model ?? process.env.HARNESS_MODEL ?? 'claude-sonnet-4-5';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.createModel = config.createModel ?? defaultAnthropicProvider;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.tools = config.tools ?? builtinTools as any;\n this.validToolNames = new Set(Object.keys(this.tools));\n this.providerOptions = config.providerOptions;\n this.prepareStep = config.prepareStep;\n this.systemPrompt =\n config.systemPrompt ??\n [\n 'You are an agent that accomplishes tasks using tools.',\n 'You may call multiple independent tools in a single turn.',\n 'Use tools when shell or filesystem access is required.',\n 'For file-generation tasks, prefer one-shot execution with a single Bash command (heredoc/script + run + verify) instead of repeated Write rewrites.',\n 'Avoid rewriting the same file multiple times unless a previous run returned an error that requires a fix.',\n 'When the task is fully complete, respond with a brief text summary (no tool call).',\n ].join(' ');\n\n if (config.apiKey) {\n process.env.ANTHROPIC_API_KEY = config.apiKey;\n }\n }\n\n /** Build the `system` parameter for generateText/streamText. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private buildSystemParam(): any {\n if (typeof this.systemPrompt === 'string') return this.systemPrompt;\n // Structured blocks → AI SDK v6 SystemModelMessage format\n return this.systemPrompt.map(block => ({\n role: 'system' as const,\n content: block.text,\n ...(block.cacheControl\n ? { providerOptions: { anthropic: { cacheControl: block.cacheControl } } }\n : {}),\n }));\n }\n\n /** Resolve model + tools for this step via prepareStep callback. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private resolveStep(stepNumber: number): { model: string; tools: Record<string, any>; validNames: Set<string> } {\n if (!this.prepareStep) {\n return { model: this.model, tools: this.tools, validNames: this.validToolNames };\n }\n const overrides = this.prepareStep({ stepNumber, toolCallHistory: this.toolCallHistory });\n if (!overrides) {\n return { model: this.model, tools: this.tools, validNames: this.validToolNames };\n }\n const model = overrides.model ?? this.model;\n let tools: Record<string, AnyTool> = this.tools;\n let validNames = this.validToolNames;\n if (overrides.activeTools) {\n const allowed = new Set(overrides.activeTools);\n tools = Object.fromEntries(Object.entries(this.tools).filter(([k]) => allowed.has(k)));\n validNames = new Set(Object.keys(tools));\n }\n return { model, tools, validNames };\n }\n\n /** Extract StepUsage from AI SDK usage object. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static extractUsage(usage: any): StepUsage | undefined {\n if (!usage) return undefined;\n const u: StepUsage = {};\n if (usage.inputTokens != null) u.inputTokens = usage.inputTokens;\n if (usage.outputTokens != null) u.outputTokens = usage.outputTokens;\n // AI SDK v6 nests cache/reasoning under inputTokenDetails/outputTokenDetails\n const inputDetails = usage.inputTokenDetails ?? usage;\n const outputDetails = usage.outputTokenDetails ?? usage;\n if (inputDetails.cacheReadTokens != null) u.cacheReadTokens = inputDetails.cacheReadTokens;\n if (inputDetails.cacheWriteTokens != null) u.cacheWriteTokens = inputDetails.cacheWriteTokens;\n if (outputDetails.reasoningTokens != null) u.reasoningTokens = outputDetails.reasoningTokens;\n return Object.keys(u).length > 0 ? u : undefined;\n }\n\n async nextAction(messages: AgentMessage[]): Promise<AgentAction> {\n const currentStep = this.step++;\n\n const { model, tools, validNames } = this.resolveStep(currentStep + 1);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = await (generateText as any)({\n model: this.createModel(model),\n tools,\n toolChoice: resolveToolChoice(this.toolChoiceConfig, currentStep),\n system: this.buildSystemParam(),\n messages: toModelMessages(messages),\n stopWhen: stepCountIs(1),\n ...(this.providerOptions ? { providerOptions: this.providerOptions } : {}),\n });\n\n // Capture usage\n this.lastUsage = VercelAgentLoop.extractUsage(result.usage);\n\n // If the model made tool calls, extract them\n if (result.toolCalls && result.toolCalls.length > 0) {\n const validCalls: ToolCallAction[] = [];\n for (const call of result.toolCalls) {\n const name = call.toolName;\n if (validNames.has(name)) {\n const toolCallId = (call as { toolCallId?: string }).toolCallId;\n validCalls.push({\n type: 'tool',\n name,\n args: (call as { input: Record<string, unknown> }).input,\n ...(toolCallId != null ? { toolCallId } : {}),\n });\n this.toolCallHistory.push(name);\n }\n }\n\n if (validCalls.length === 0) {\n return { type: 'final', content: `Unknown tool: ${result.toolCalls[0]!.toolName}` };\n }\n\n // Single call → backward-compatible ToolCallAction\n if (validCalls.length === 1) {\n return validCalls[0]!;\n }\n\n // Multiple calls → ToolBatchAction\n return { type: 'tool_batch', calls: validCalls } satisfies ToolBatchAction;\n }\n\n // No tool call — model responded with text (task complete)\n const text = result.text?.trim();\n return { type: 'final', content: text || 'Done.' };\n }\n\n async *streamAction(messages: AgentMessage[]): AsyncGenerator<AgentStreamEvent> {\n const currentStep = this.step++;\n\n const { model, tools, validNames } = this.resolveStep(currentStep + 1);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = (streamText as any)({\n model: this.createModel(model),\n tools,\n toolChoice: resolveToolChoice(this.toolChoiceConfig, currentStep),\n system: this.buildSystemParam(),\n messages: toModelMessages(messages),\n stopWhen: stepCountIs(1),\n ...(this.providerOptions ? { providerOptions: this.providerOptions } : {}),\n });\n\n const toolArgs = new Map<string, string>();\n\n for await (const part of result.fullStream) {\n if (part.type === 'text-delta') {\n yield { type: 'text_delta', text: part.text };\n }\n if (part.type === 'tool-input-start') {\n toolArgs.set(part.id, '');\n }\n if (part.type === 'tool-input-delta') {\n toolArgs.set(part.id, (toolArgs.get(part.id) ?? '') + part.delta);\n }\n if (part.type === 'tool-call') {\n const name = part.toolName;\n if (validNames.has(name)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const p = part as any;\n const args: Record<string, unknown> = p.args ?? p.input ?? {};\n const toolCallId: string | undefined = p.toolCallId;\n yield { type: 'tool_start', name, args, ...(toolCallId != null ? { toolCallId } : {}) };\n this.toolCallHistory.push(name);\n }\n }\n }\n\n // Capture usage after stream completes\n try {\n const usage = await result.usage;\n this.lastUsage = VercelAgentLoop.extractUsage(usage);\n } catch {\n this.lastUsage = undefined;\n }\n }\n}\n","import { tool } from 'ai';\nimport { z } from 'zod';\n\n// ── Orchestrator tools ──\n\nexport const Thread = tool({\n description: 'Dispatch a process. Returns immediately. Multiple per turn = parallel.',\n inputSchema: z.object({\n action: z.string().describe('What the process should accomplish'),\n contextEpisodeIds: z.array(z.string()).optional().describe('Episode IDs to seed as context'),\n model: z.enum(['fast', 'medium', 'strong']).optional().describe('Model tier (default: medium)'),\n maxSteps: z.number().optional().describe('Max tool-call steps'),\n label: z.string().optional().describe('Human-readable label'),\n profile: z.string().optional().describe('Named process profile (e.g. \"readonly\", \"generalist\")'),\n }),\n});\n\nexport const Check = tool({\n description: 'Check status or retrieve results of a process by ID.',\n inputSchema: z.object({\n id: z.string().describe('Process ID to check'),\n }),\n});\n\nexport const Cancel = tool({\n description: 'Cancel a running process.',\n inputSchema: z.object({\n id: z.string().describe('Process ID to cancel'),\n }),\n});\n\nexport const Remember = tool({\n description: 'Save information to persistent memory.',\n inputSchema: z.object({\n content: z.string().describe('What to remember'),\n category: z.enum(['instruction', 'preference', 'fact', 'pattern']).optional().describe('Memory category'),\n }),\n});\n\nexport const ReadEpisode = tool({\n description: 'Retrieve the full trace of a completed episode by ID. Use to inspect detailed tool outputs, file contents, or error messages that the episode summary omits.',\n inputSchema: z.object({\n id: z.string().describe('Episode ID to read'),\n maxTokens: z.number().optional().describe('Max tokens to return (truncates from the end). Default: no limit.'),\n }),\n});\n\nexport const orchestratorTools = { Thread, Check, Cancel, Remember, ReadEpisode };\n\n// ── Process tools ──\n\nexport { builtinTools } from '../loop/vercel-agent-loop';\n\nexport const AskUser = tool({\n description: 'Ask the user a question and wait for their response.',\n inputSchema: z.object({\n question: z.string().describe('The question to ask'),\n options: z.array(z.string()).optional().describe('Optional choices'),\n }),\n});\n\nexport const TellUser = tool({\n description: 'Display a message to the user (no response expected).',\n inputSchema: z.object({\n message: z.string().describe('The message to display'),\n }),\n});\n","/**\n * OpenRouter Models API integration for dynamic context limit fetching.\n * \n * Fetches model metadata from OpenRouter API and caches results to avoid\n * repeated network calls. Falls back to 128K tokens for unknown models.\n */\n\n// OpenRouter model response types\nexport interface OpenRouterModel {\n id: string;\n name: string;\n created: number;\n description?: string;\n context_length: number;\n architecture?: {\n modality?: string;\n tokenizer?: string;\n instruct_type?: string;\n };\n pricing?: {\n prompt?: string;\n completion?: string;\n };\n top_provider?: {\n max_completion_tokens?: number;\n is_moderated?: boolean;\n };\n}\n\nexport interface OpenRouterModelsResponse {\n data: OpenRouterModel[];\n}\n\n// Cache structure\ninterface ModelCache {\n models: Map<string, number>; // model id -> context_length\n fetchedAt: number;\n}\n\nconst OPENROUTER_API_URL = 'https://openrouter.ai/api/v1/models';\nconst CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\nconst DEFAULT_CONTEXT_LIMIT = 128_000; // 128K tokens fallback\n\n/**\n * In-memory cache for OpenRouter model data.\n * Module-level singleton to share across instances.\n */\nlet modelCache: ModelCache | null = null;\nlet fetchPromise: Promise<Map<string, number>> | null = null;\n\n/**\n * Fetch model context limits from OpenRouter API.\n * Caches results for CACHE_TTL_MS to avoid rate limits.\n * \n * @returns Map of model ID to context_length\n */\nexport async function fetchOpenRouterModels(): Promise<Map<string, number>> {\n // Return cached data if still valid\n if (modelCache && Date.now() - modelCache.fetchedAt < CACHE_TTL_MS) {\n return modelCache.models;\n }\n\n // Return in-flight request if one exists\n if (fetchPromise) {\n return fetchPromise;\n }\n\n fetchPromise = (async (): Promise<Map<string, number>> => {\n try {\n const response = await fetch(OPENROUTER_API_URL, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`OpenRouter API error: ${response.status} ${response.statusText}`);\n }\n\n const data: OpenRouterModelsResponse = await response.json();\n const models = new Map<string, number>();\n\n for (const model of data.data) {\n if (model.context_length) {\n models.set(model.id, model.context_length);\n }\n }\n\n // Update cache\n modelCache = {\n models,\n fetchedAt: Date.now(),\n };\n\n return models;\n } catch (error) {\n // Log error but don't fail - will use fallback\n console.warn('[OpenRouter] Failed to fetch models, using fallback:', error);\n // Return empty map - caller will use fallback\n const emptyCache = new Map<string, number>();\n modelCache = {\n models: emptyCache,\n fetchedAt: Date.now(),\n };\n return emptyCache;\n } finally {\n fetchPromise = null;\n }\n })();\n\n return fetchPromise;\n}\n\n/**\n * Get context limit for a specific model.\n * \n * @param modelId - The model ID (e.g., 'anthropic/claude-3.5-sonnet')\n * @param fallback - Optional fallback value (default: 128K)\n * @returns Context limit in tokens\n */\nexport async function getModelContextLimit(\n modelId: string,\n fallback: number = DEFAULT_CONTEXT_LIMIT,\n): Promise<number> {\n const models = await fetchOpenRouterModels();\n \n // Try exact match first\n if (models.has(modelId)) {\n return models.get(modelId)!;\n }\n\n // Try partial match (for models without provider prefix)\n for (const [id, limit] of models.entries()) {\n if (id.endsWith(modelId) || modelId.endsWith(id)) {\n return limit;\n }\n }\n\n // Return fallback for unknown models\n return fallback;\n}\n\n/**\n * Clear the model cache (useful for testing or forced refresh).\n */\nexport function clearModelCache(): void {\n modelCache = null;\n fetchPromise = null;\n}\n\n/**\n * Get cached context limit without fetching.\n * Returns undefined if not cached or cache expired.\n * \n * @param modelId - The model ID\n * @returns Cached context limit or undefined\n */\nexport function getCachedContextLimit(modelId: string): number | undefined {\n if (!modelCache || Date.now() - modelCache.fetchedAt >= CACHE_TTL_MS) {\n return undefined;\n }\n \n // Try exact match\n if (modelCache.models.has(modelId)) {\n return modelCache.models.get(modelId);\n }\n\n // Try partial match\n for (const [id, limit] of modelCache.models.entries()) {\n if (id.endsWith(modelId) || modelId.endsWith(id)) {\n return limit;\n }\n }\n\n return undefined;\n}\n","import { generateText } from 'ai';\nimport { anthropic as defaultAnthropicProvider } from '@ai-sdk/anthropic';\nimport type { ModelFactory } from './types';\nimport type { AgentMessage } from '../agent/types';\nimport { getTextContent } from '../agent/types';\nimport type { Episode, EpisodeStore } from './arc-types';\nimport { resolveModel, DEFAULT_MODEL_MAP } from './arc-types';\nimport type { Turn, TokenBudget, PreparedContext, ArcLoopConfig } from './types';\nimport { estimateTokens, estimateMessagesTokens } from './message-convert';\nimport { MemoryManager } from './memory-manager';\nimport { getModelContextLimit } from './openrouter-models';\n\n// ── ContextWindow ──\n\nexport interface ContextWindowConfig {\n contextWindowSize: number;\n outputReserve: number;\n systemPrompt: string;\n episodeStore: EpisodeStore;\n memory: MemoryManager;\n taskId: string;\n createModel?: ModelFactory;\n /** Model ID for dynamic context window lookup (e.g., 'anthropic/claude-3.5-sonnet') */\n modelId?: string;\n /** Enable dynamic context window detection via OpenRouter API */\n dynamicContextWindow?: boolean;\n}\n\nexport class ContextWindow {\n private readonly config: ContextWindowConfig;\n private readonly turns: Turn[] = [];\n private episodes: Episode[] = [];\n private cachedContextSize: number | null = null;\n\n constructor(config: ContextWindowConfig) {\n this.config = config;\n }\n\n /**\n * Get the effective context window size.\n * If dynamicContextWindow is enabled, fetches from OpenRouter API.\n * Otherwise uses the configured contextWindowSize.\n */\n private async getContextWindowSize(): Promise<number> {\n // Return cached value if available\n if (this.cachedContextSize !== null) {\n return this.cachedContextSize;\n }\n\n // Use dynamic context window if enabled\n if (this.config.dynamicContextWindow && this.config.modelId) {\n try {\n const dynamicSize = await getModelContextLimit(this.config.modelId, 128_000);\n this.cachedContextSize = dynamicSize;\n return dynamicSize;\n } catch (error) {\n console.warn('[ContextWindow] Failed to fetch dynamic context limit, using fallback:', error);\n this.cachedContextSize = 128_000;\n return 128_000;\n }\n }\n\n // Use configured size or default fallback\n this.cachedContextSize = this.config.contextWindowSize;\n return this.config.contextWindowSize;\n }\n\n async prepare(signal?: AbortSignal): Promise<PreparedContext> {\n const contextWindowSize = await this.getContextWindowSize();\n const totalBudget = contextWindowSize - this.config.outputReserve;\n\n this.episodes = await this.config.episodeStore.getEpisodesByTask(this.config.taskId);\n\n const filesBeingTouched = this.extractFilesBeingTouched();\n\n const systemTokens = estimateTokens(this.config.systemPrompt);\n\n const memoryBudget = Math.min(Math.floor(totalBudget * 0.15), 4000);\n const memoryMessages = await this.config.memory.retrieve(memoryBudget, { filesBeingTouched });\n const memoryTokens = estimateMessagesTokens(memoryMessages);\n\n const episodeMessages = this.buildEpisodeSummaries();\n let episodeTokens = estimateMessagesTokens(episodeMessages);\n\n let turnMessages = this.buildTurnMessages();\n let conversationTokens = estimateMessagesTokens(turnMessages);\n\n let totalUsed = systemTokens + memoryTokens + episodeTokens + conversationTokens;\n\n if (totalUsed > totalBudget * 0.6) {\n turnMessages = this.compressTemplate(turnMessages);\n conversationTokens = estimateMessagesTokens(turnMessages);\n totalUsed = systemTokens + memoryTokens + episodeTokens + conversationTokens;\n }\n\n const episodeBudget = Math.floor(totalBudget * 0.2);\n if (episodeTokens > episodeBudget && this.episodes.length > 10) {\n const grouped = this.groupEpisodeSummaries();\n episodeTokens = estimateMessagesTokens(grouped);\n episodeMessages.length = 0;\n episodeMessages.push(...grouped);\n totalUsed = systemTokens + memoryTokens + episodeTokens + conversationTokens;\n }\n\n if (totalUsed > totalBudget * 0.8 && signal) {\n try {\n turnMessages = await this.compressLLM(turnMessages, signal);\n conversationTokens = estimateMessagesTokens(turnMessages);\n totalUsed = systemTokens + memoryTokens + episodeTokens + conversationTokens;\n } catch {\n // LLM compression failed — proceed with what we have\n }\n }\n\n const finalMemoryMessages = await this.config.memory.retrieve(memoryBudget, { filesBeingTouched });\n const finalMemoryTokens = estimateMessagesTokens(finalMemoryMessages);\n\n const messages: AgentMessage[] = [\n ...finalMemoryMessages,\n ...episodeMessages,\n ...turnMessages,\n ];\n\n const budget: TokenBudget = {\n limit: totalBudget,\n used: systemTokens + finalMemoryTokens + episodeTokens + conversationTokens,\n layers: {\n system: systemTokens,\n memories: finalMemoryTokens,\n episodes: episodeTokens,\n conversation: conversationTokens,\n },\n };\n\n const statusText = `[Context: ${Math.round(budget.used / 1000)}K/${Math.round(budget.limit / 1000)}K tokens | system: ${Math.round(budget.layers.system / 1000)}K | memories: ${Math.round(budget.layers.memories / 1000)}K | episodes: ${Math.round(budget.layers.episodes / 1000)}K | conversation: ${Math.round(budget.layers.conversation / 1000)}K]`;\n messages.push({ role: 'system', content: statusText });\n\n return { messages, budget };\n }\n\n recordTurn(turn: Turn): void {\n this.turns.push(turn);\n }\n\n async budget(): Promise<TokenBudget> {\n const contextWindowSize = await this.getContextWindowSize();\n const totalBudget = contextWindowSize - this.config.outputReserve;\n const systemTokens = estimateTokens(this.config.systemPrompt);\n\n let conversationTokens = 0;\n for (const turn of this.turns) {\n conversationTokens += turn.tokenEstimate;\n }\n\n let episodeTokens = 0;\n for (const ep of this.episodes) {\n episodeTokens += estimateTokens(ep.summary);\n }\n\n return {\n limit: totalBudget,\n used: systemTokens + conversationTokens + episodeTokens,\n layers: {\n system: systemTokens,\n memories: 0,\n episodes: episodeTokens,\n conversation: conversationTokens,\n },\n };\n }\n\n addEpisode(episode: Episode): void {\n this.episodes.push(episode);\n }\n\n private extractFilesBeingTouched(): string[] {\n const files = new Set<string>();\n for (const ep of this.episodes) {\n for (const f of ep.filesModified) files.add(f);\n for (const f of ep.filesRead) files.add(f);\n }\n for (const turn of this.turns.slice(-5)) {\n for (const msg of turn.messages) {\n const text = typeof msg.content === 'string' ? msg.content : getTextContent(msg.content);\n const pathMatches = text.match(/(?:\\/[\\w.-]+)+\\.\\w+/g);\n if (pathMatches) {\n for (const p of pathMatches) files.add(p);\n }\n }\n }\n return [...files];\n }\n\n private buildEpisodeSummaries(): AgentMessage[] {\n if (this.episodes.length === 0) return [];\n\n const episodeText = this.episodes\n .map(e => `Episode ${e.index} [${e.id}] (${e.success ? 'ok' : 'failed'}):\\n${e.summary}`)\n .join('\\n\\n');\n\n return [{\n role: 'system',\n content: `Prior episodes for this task:\\n${episodeText}`,\n }];\n }\n\n private buildTurnMessages(): AgentMessage[] {\n const messages: AgentMessage[] = [];\n for (const turn of this.turns) {\n messages.push(...turn.messages);\n }\n return messages;\n }\n\n private compressTemplate(messages: AgentMessage[]): AgentMessage[] {\n if (messages.length <= 6) return messages;\n\n const result: AgentMessage[] = [];\n const recentCount = Math.min(6, Math.ceil(messages.length * 0.3));\n const oldMessages = messages.slice(0, -recentCount);\n const recentMessages = messages.slice(-recentCount);\n\n for (const msg of oldMessages) {\n if (msg.role === 'tool') {\n const text = typeof msg.content === 'string' ? msg.content : getTextContent(msg.content);\n const truncated = text.length > 500 ? text.slice(0, 500) + '...' : text;\n const compressed: AgentMessage = { ...msg, content: truncated };\n if (msg.toolResults) {\n compressed.toolResults = msg.toolResults.map(tr => ({\n ...tr,\n result: tr.result.length > 500 ? tr.result.slice(0, 500) + '...' : tr.result,\n }));\n }\n result.push(compressed);\n } else if (msg.role === 'assistant') {\n const text = typeof msg.content === 'string' ? msg.content : getTextContent(msg.content);\n const oneLiner = text.length > 200 ? text.slice(0, 200) + '...' : text;\n result.push({\n ...msg,\n content: oneLiner,\n });\n } else {\n result.push(msg);\n }\n }\n\n result.push(...recentMessages);\n return result;\n }\n\n private groupEpisodeSummaries(): AgentMessage[] {\n if (this.episodes.length <= 10) return this.buildEpisodeSummaries();\n\n const oldEpisodes = this.episodes.slice(0, -5);\n const recentEpisodes = this.episodes.slice(-5);\n\n const groupSummary = [\n `Grouped summary of ${oldEpisodes.length} earlier episodes:`,\n ` Successful: ${oldEpisodes.filter(e => e.success).length}`,\n ` Failed: ${oldEpisodes.filter(e => !e.success).length}`,\n ` Files modified: ${[...new Set(oldEpisodes.flatMap(e => e.filesModified))].join(', ')}`,\n ` Actions: ${oldEpisodes.map(e => e.threadAction.slice(0, 60)).join('; ')}`,\n ].join('\\n');\n\n const recentText = recentEpisodes\n .map(e => `Episode ${e.index} [${e.id}] (${e.success ? 'ok' : 'failed'}):\\n${e.summary}`)\n .join('\\n\\n');\n\n return [{\n role: 'system',\n content: `${groupSummary}\\n\\nRecent episodes:\\n${recentText}`,\n }];\n }\n\n private async compressLLM(messages: AgentMessage[], signal: AbortSignal): Promise<AgentMessage[]> {\n if (messages.length <= 10) return messages;\n\n const splitPoint = Math.floor(messages.length / 2);\n const toSummarize = messages.slice(0, splitPoint);\n const toKeep = messages.slice(splitPoint);\n\n const textToSummarize = toSummarize\n .map(m => {\n const text = typeof m.content === 'string' ? m.content : getTextContent(m.content);\n return `[${m.role}] ${text.slice(0, 300)}`;\n })\n .join('\\n');\n\n const fastModel = resolveModel('fast', DEFAULT_MODEL_MAP, DEFAULT_MODEL_MAP.fast);\n const result = await generateText({\n model: (this.config.createModel ?? defaultAnthropicProvider)(fastModel),\n system: 'Summarize this conversation history into a concise context summary. Preserve key decisions, outcomes, and any information needed to continue the conversation. Keep under 500 words.',\n messages: [{ role: 'user', content: textToSummarize.slice(0, 8000) }],\n abortSignal: signal,\n });\n\n const summaryMessage: AgentMessage = {\n role: 'system',\n content: `[Compressed conversation history]\\n${result.text}`,\n };\n\n return [summaryMessage, ...toKeep];\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { AgentMessage, ToolCallAction } from '../agent/types';\nimport type {\n Episode,\n LongTermMemory,\n SessionMemo,\n EpisodeStore,\n SessionMemoStore,\n LongTermStore,\n} from './arc-types';\nimport { estimateTokens } from './message-convert';\n\n// ── Topic mapping: file globs → memory categories ──\n\nconst TOPIC_MAP: [RegExp, string][] = [\n [/\\bapi\\b/i, 'api-rules'],\n [/\\bauth\\b/i, 'auth'],\n [/\\btest/i, 'testing'],\n [/\\bbuild\\b|\\bci\\b|\\bpipeline\\b/i, 'build'],\n [/\\bdeploy/i, 'deployment'],\n [/\\bdb\\b|\\bmigrat/i, 'database'],\n [/\\bstyle|\\.css|\\.scss/i, 'styling'],\n [/\\bconfig/i, 'config'],\n];\n\nfunction matchTopics(filesBeingTouched: string[]): Set<string> {\n const topics = new Set<string>();\n for (const file of filesBeingTouched) {\n for (const [pattern, topic] of TOPIC_MAP) {\n if (pattern.test(file)) {\n topics.add(topic);\n }\n }\n }\n return topics;\n}\n\n// ── MemoryManager ──\n\nexport interface MemoryManagerConfig {\n sessionMemoStore: SessionMemoStore;\n longTermStore: LongTermStore;\n sessionId: string;\n}\n\nexport class MemoryManager {\n private readonly memoStore: SessionMemoStore;\n private readonly ltStore: LongTermStore;\n private readonly sessionId: string;\n\n constructor(config: MemoryManagerConfig) {\n this.memoStore = config.sessionMemoStore;\n this.ltStore = config.longTermStore;\n this.sessionId = config.sessionId;\n }\n\n async store(\n content: string,\n opts?: { category?: string; scope?: 'session' | 'persistent' },\n ): Promise<string> {\n const scope = opts?.scope ?? 'session';\n\n if (scope === 'persistent') {\n const id = randomUUID();\n const now = Date.now();\n const memory: LongTermMemory = {\n id,\n content,\n category: opts?.category ?? 'fact',\n sourceSessionMemoIds: [],\n createdAt: now,\n updatedAt: now,\n };\n await this.ltStore.addMemory(memory);\n return id;\n }\n\n const existing = this.memoStore.getMemoBySession\n ? await this.memoStore.getMemoBySession(this.sessionId)\n : (await this.memoStore.getMemosBySession(this.sessionId))[0] ?? null;\n const createdAt = existing?.createdAt ?? Date.now();\n const updatedAt = Date.now();\n const combinedContent = existing?.content\n ? `${existing.content}\\n${content}`\n : content;\n const id = this.sessionId;\n const memo: SessionMemo = {\n id,\n sessionId: this.sessionId,\n content: combinedContent,\n sourceEpisodeIds: [],\n createdAt,\n updatedAt,\n };\n await this.memoStore.addMemo(memo);\n return id;\n }\n\n async retrieve(\n budget: number,\n context: {\n prompt?: string;\n sessionId?: string;\n filesBeingTouched?: string[];\n },\n ): Promise<AgentMessage[]> {\n const messages: AgentMessage[] = [];\n let used = 0;\n\n const allMemories = await this.ltStore.getAllMemories();\n const indexMemories = allMemories.filter(m => m.category === 'index');\n const indexBudget = Math.min(budget * 0.15, 2000);\n\n if (indexMemories.length > 0) {\n const indexText = indexMemories.map(m => m.content).join('\\n');\n const tokens = estimateTokens(indexText);\n if (tokens <= indexBudget) {\n messages.push({ role: 'system', content: `[Memory Index]\\n${indexText}` });\n used += tokens;\n }\n }\n\n if (context.filesBeingTouched && context.filesBeingTouched.length > 0) {\n const topics = matchTopics(context.filesBeingTouched);\n const topicBudget = Math.min((budget - used) * 0.3, 4000);\n let topicUsed = 0;\n\n for (const topic of topics) {\n if (topicUsed >= topicBudget) break;\n const topicMemories = allMemories.filter(m => m.category === topic);\n for (const mem of topicMemories) {\n const tokens = estimateTokens(mem.content);\n if (topicUsed + tokens > topicBudget) break;\n messages.push({ role: 'system', content: `[Memory: ${topic}]\\n${mem.content}` });\n topicUsed += tokens;\n used += tokens;\n }\n }\n }\n\n const remaining = budget - used;\n if (remaining > 0) {\n const sid = context.sessionId ?? this.sessionId;\n const memo = this.memoStore.getMemoBySession\n ? await this.memoStore.getMemoBySession(sid)\n : (await this.memoStore.getMemosBySession(sid))[0] ?? null;\n if (memo) {\n const memoBudget = remaining * 0.5;\n const tokens = estimateTokens(memo.content);\n if (tokens <= memoBudget) {\n messages.push({ role: 'system', content: `[Session Memo]\\n${memo.content}` });\n used += tokens;\n }\n }\n\n const alreadyCategories = new Set([\n 'index',\n ...(context.filesBeingTouched ? matchTopics(context.filesBeingTouched) : []),\n ]);\n const ltByRecency = allMemories\n .filter(m => !alreadyCategories.has(m.category))\n .sort((a, b) => b.updatedAt - a.updatedAt);\n\n for (const mem of ltByRecency) {\n const tokens = estimateTokens(mem.content);\n if (used + tokens > budget) break;\n messages.push({ role: 'system', content: `[Memory: ${mem.category}]\\n${mem.content}` });\n used += tokens;\n }\n }\n\n return messages;\n }\n\n async detectAndPromote(episodes: Episode[]): Promise<void> {\n if (episodes.length < 2) return;\n\n const fileFreq = new Map<string, number>();\n const errorPatterns = new Map<string, number>();\n\n for (const ep of episodes) {\n for (const f of ep.filesModified) {\n fileFreq.set(f, (fileFreq.get(f) ?? 0) + 1);\n }\n if (!ep.success) {\n const normalized = ep.threadAction.toLowerCase().slice(0, 100);\n errorPatterns.set(normalized, (errorPatterns.get(normalized) ?? 0) + 1);\n }\n }\n\n const frequentFiles = [...fileFreq.entries()].filter(([, count]) => count >= 3);\n if (frequentFiles.length > 0) {\n const content = `Frequently modified files:\\n${frequentFiles.map(([f, n]) => ` ${f} (${n}x)`).join('\\n')}`;\n await this.store(content, { category: 'pattern', scope: 'session' });\n }\n\n const repeatedErrors = [...errorPatterns.entries()].filter(([, count]) => count >= 2);\n if (repeatedErrors.length > 0) {\n const content = `Common failure patterns:\\n${repeatedErrors.map(([action, n]) => ` \"${action}\" failed ${n}x`).join('\\n')}`;\n await this.store(content, { category: 'pattern', scope: 'session' });\n }\n }\n\n async compact(): Promise<{ removed: number; merged: number }> {\n const allMemories = await this.ltStore.getAllMemories();\n if (allMemories.length < 2) return { removed: 0, merged: 0 };\n\n let removed = 0;\n let merged = 0;\n\n const keywordSets = allMemories.map(m => {\n const words = m.content.toLowerCase().split(/\\s+/).filter(w => w.length > 3);\n return new Set(words);\n });\n\n const toRemove = new Set<string>();\n\n for (let i = 0; i < allMemories.length; i++) {\n if (toRemove.has(allMemories[i]!.id)) continue;\n\n for (let j = i + 1; j < allMemories.length; j++) {\n if (toRemove.has(allMemories[j]!.id)) continue;\n\n const setA = keywordSets[i]!;\n const setB = keywordSets[j]!;\n const intersection = [...setA].filter(w => setB.has(w)).length;\n const union = new Set([...setA, ...setB]).size;\n const overlap = union > 0 ? intersection / union : 0;\n\n if (overlap > 0.7) {\n const keepIdx = allMemories[i]!.updatedAt >= allMemories[j]!.updatedAt ? i : j;\n const removeIdx = keepIdx === i ? j : i;\n toRemove.add(allMemories[removeIdx]!.id);\n merged++;\n }\n }\n }\n\n const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000;\n for (const mem of allMemories) {\n if (mem.category === 'session-summary' && mem.updatedAt < thirtyDaysAgo) {\n toRemove.add(mem.id);\n }\n }\n\n for (const id of toRemove) {\n await this.ltStore.deleteMemory(id);\n removed++;\n }\n\n return { removed, merged };\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { Episode, SessionMemo, LongTermMemory, EpisodeStore, SessionMemoStore, LongTermStore } from './arc-types';\n\n/**\n * Consolidate episodes into a session memo.\n * Called at task boundaries (async, non-blocking).\n * Distills key learnings from a set of episodes into a compact memo.\n */\nexport async function consolidateEpisodes(\n episodes: Episode[],\n sessionId: string,\n sessionMemoStore: SessionMemoStore,\n): Promise<SessionMemo> {\n if (episodes.length === 0) {\n throw new Error('Cannot consolidate zero episodes');\n }\n\n // Template-based consolidation: extract key patterns from episodes\n const filesModified = new Set<string>();\n const toolsUsed = new Set<string>();\n const actions: string[] = [];\n let successCount = 0;\n\n for (const ep of episodes) {\n for (const f of ep.filesModified) filesModified.add(f);\n for (const t of ep.toolCalls) toolsUsed.add(t);\n actions.push(`${ep.index}. ${ep.threadAction} (${ep.success ? 'ok' : 'failed'})`);\n if (ep.success) successCount++;\n }\n\n const parts: string[] = [\n `Task summary (${episodes.length} threads, ${successCount} succeeded):`,\n ...actions,\n ];\n\n if (filesModified.size > 0) {\n parts.push(`Files modified: ${[...filesModified].join(', ')}`);\n }\n if (toolsUsed.size > 0) {\n parts.push(`Tools used: ${[...toolsUsed].join(', ')}`);\n }\n\n const existing = sessionMemoStore.getMemoBySession\n ? await sessionMemoStore.getMemoBySession(sessionId)\n : (await sessionMemoStore.getMemosBySession(sessionId))[0] ?? null;\n const createdAt = existing?.createdAt ?? Date.now();\n const updatedAt = Date.now();\n\n const memo: SessionMemo = {\n id: sessionId,\n sessionId,\n content: parts.join('\\n'),\n sourceEpisodeIds: episodes.map(e => e.id),\n createdAt,\n updatedAt,\n };\n\n await sessionMemoStore.addMemo(memo);\n return memo;\n}\n\n/**\n * Consolidate session memos into long-term memories.\n * Called at session boundaries (async, non-blocking).\n * Extracts durable patterns/learnings from session work.\n */\nexport async function consolidateMemos(\n memos: SessionMemo[],\n longTermStore: LongTermStore,\n): Promise<LongTermMemory[]> {\n if (memos.length === 0) return [];\n\n // Check for duplicate consolidation\n const existingMemories = await longTermStore.getAllMemories();\n const existingSourceIds = new Set<string>();\n for (const mem of existingMemories) {\n for (const id of mem.sourceSessionMemoIds) {\n existingSourceIds.add(id);\n }\n }\n\n // Filter out already-consolidated memos\n const newMemos = memos.filter(m => !existingSourceIds.has(m.id));\n if (newMemos.length === 0) return [];\n\n // Template-based: create one long-term memory summarizing the session\n const now = Date.now();\n const sessionContent = newMemos.map(m => m.content).join('\\n---\\n');\n\n const memory: LongTermMemory = {\n id: randomUUID(),\n content: `Session work:\\n${sessionContent}`,\n category: 'session-summary',\n sourceSessionMemoIds: newMemos.map(m => m.id),\n createdAt: now,\n updatedAt: now,\n };\n\n await longTermStore.addMemory(memory);\n return [memory];\n}\n\n/**\n * Lightweight consolidation: episodes → session memo only.\n * Safe to call after every turn — no long-term promotion.\n */\nexport async function runConsolidation(\n _taskId: string,\n sessionId: string,\n episodeStore: EpisodeStore,\n sessionMemoStore: SessionMemoStore,\n _longTermStore: LongTermStore,\n): Promise<void> {\n // Only consolidate task episodes into session memo.\n // Long-term promotion is deferred to runFullConsolidation() which\n // should be called at session end, not every turn.\n const episodes = await episodeStore.getEpisodesBySession(sessionId);\n if (episodes.length > 0) {\n await consolidateEpisodes(episodes, sessionId, sessionMemoStore);\n }\n}\n\n/**\n * Full consolidation pipeline: episodes → memo → long-term.\n * Call at session boundaries only (not every turn).\n */\nexport async function runFullConsolidation(\n _taskId: string,\n sessionId: string,\n episodeStore: EpisodeStore,\n sessionMemoStore: SessionMemoStore,\n longTermStore: LongTermStore,\n): Promise<void> {\n const episodes = await episodeStore.getEpisodesBySession(sessionId);\n if (episodes.length > 0) {\n await consolidateEpisodes(episodes, sessionId, sessionMemoStore);\n }\n\n const memos = await sessionMemoStore.getMemosBySession(sessionId);\n if (memos.length > 0) {\n await consolidateMemos(memos, longTermStore);\n }\n}\n","import { generateObject } from 'ai';\nimport { anthropic as defaultAnthropicProvider } from '@ai-sdk/anthropic';\nimport { z } from 'zod';\n\nimport type { SkillSummary } from './skill-types';\nimport type { ModelFactory } from '../arc/types';\n\nconst routeSchema = z.object({\n skillName: z.string().nullable(),\n confidence: z.number().min(0).max(1),\n rationale: z.string()\n});\n\nexport interface SkillRouterConfig {\n model?: string;\n createModel?: ModelFactory;\n minConfidence?: number;\n aliases?: Record<string, string[]>;\n}\n\nconst DEFAULT_ALIASES: Record<string, string[]> = {\n xlsx: ['excel', 'spreadsheet', 'workbook', 'csv'],\n docx: ['word', 'document', 'doc'],\n pptx: ['powerpoint', 'slides', 'presentation'],\n 'visual-explainer': ['visual explainer', 'visual explanation', 'interactive visual', 'visualize', 'diagram d3', 'data visualization', 'd3'],\n 'excalidraw-diagram': ['excalidraw', 'architecture diagram', 'flowchart', 'sequence diagram'],\n 'json-render': ['jsonrender', 'interactive ui', 'action buttons'],\n};\n\nexport class SkillRouter {\n private readonly model: string;\n private readonly createModel: ModelFactory;\n private readonly minConfidence: number;\n private readonly aliases: Record<string, string[]>;\n\n constructor(config: SkillRouterConfig = {}) {\n this.model = config.model ?? process.env.HARNESS_SKILL_ROUTER_MODEL ?? 'claude-3-5-haiku-latest';\n this.createModel = config.createModel ?? defaultAnthropicProvider;\n this.minConfidence = config.minConfidence ?? Number(process.env.HARNESS_SKILL_ROUTER_THRESHOLD ?? '0.55');\n this.aliases = {\n ...DEFAULT_ALIASES,\n ...(config.aliases ?? {})\n };\n }\n\n async selectSkill(prompt: string, summaries: SkillSummary[]): Promise<SkillSummary | null> {\n if (summaries.length === 0) return null;\n const lower = prompt.toLowerCase();\n\n const direct = summaries.find((skill) => this.containsToken(lower, skill.name.toLowerCase()));\n if (direct) return direct;\n\n for (const summary of summaries) {\n const aliasList = this.aliases[summary.name.toLowerCase()] ?? [];\n if (aliasList.some((alias) => this.containsToken(lower, alias.toLowerCase()))) {\n return summary;\n }\n }\n\n // LLM-based routing — if no API key is configured, the provider will fail\n // and the catch block below will return null (graceful fallback).\n\n try {\n const skillList = summaries\n .map((s) => `- ${s.name}: ${s.description}`)\n .join('\\n');\n\n const { object } = await generateObject({\n model: this.createModel(this.model),\n schema: routeSchema,\n system: [\n 'You are a skill router.',\n 'Pick at most one skill name from the provided list.',\n 'Only choose a skill when it clearly helps with the user request.',\n 'If nothing clearly matches, return null skillName and low confidence.'\n ].join(' '),\n prompt: [\n 'User request:',\n prompt,\n '',\n 'Available skills:',\n skillList,\n '',\n 'Return one object with skillName, confidence, rationale.'\n ].join('\\n')\n });\n\n if (!object.skillName || object.confidence < this.minConfidence) {\n return null;\n }\n\n return summaries.find((s) => s.name === object.skillName) ?? null;\n } catch {\n return null;\n }\n }\n\n private containsToken(haystack: string, needle: string): boolean {\n if (!needle) return false;\n const escaped = needle.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(`\\\\b${escaped}\\\\b`, 'i');\n return regex.test(haystack);\n }\n}\n\n","import { readFile } from 'node:fs/promises';\n\nimport type { SkillDefinition } from './skill-types';\n\nfunction parseFrontmatter(raw: string): { meta: Record<string, string>; body: string } {\n if (!raw.startsWith('---\\n')) {\n return { meta: {}, body: raw };\n }\n\n const end = raw.indexOf('\\n---\\n', 4);\n if (end === -1) {\n return { meta: {}, body: raw };\n }\n\n const header = raw.slice(4, end).split('\\n');\n const meta: Record<string, string> = {};\n for (const line of header) {\n const idx = line.indexOf(':');\n if (idx <= 0) continue;\n const key = line.slice(0, idx).trim();\n const value = line.slice(idx + 1).trim().replace(/^\"|\"$/g, '');\n meta[key] = value;\n }\n\n return {\n meta,\n body: raw.slice(end + 5).trim()\n };\n}\n\nexport async function loadSkillFromFile(path: string): Promise<SkillDefinition> {\n const raw = await readFile(path, 'utf8');\n const parsed = parseFrontmatter(raw);\n const pythonDeps = parsed.meta.python_deps\n ? parsed.meta.python_deps.split(',').map((item) => item.trim()).filter(Boolean)\n : [];\n const npmDeps = parsed.meta.npm_deps\n ? parsed.meta.npm_deps.split(',').map((item) => item.trim()).filter(Boolean)\n : [];\n\n return {\n name: parsed.meta.name ?? path.split('/').slice(-2, -1)[0] ?? 'unknown-skill',\n description: parsed.meta.description ?? 'No description provided',\n path,\n contextMode: parsed.meta.context === 'fork' ? 'fork' : 'inline',\n dependencies: {\n python: pythonDeps,\n npm: npmDeps\n },\n instructions: parsed.body\n };\n}\n","/**\n * SkillResolver — pluggable interface for resolving skill instructions from action text.\n *\n * Extracted from ArcLoop to satisfy DIP + SRP:\n * - ArcLoop depends on the interface, not on SkillRouter/file loader directly\n * - Tests can mock skill resolution without filesystem\n * - Alternative implementations (remote registries) plug in without touching ArcLoop\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { resolve as resolvePath, dirname } from 'node:path';\n\nimport { SkillRouter } from '../skills/skill-router';\nimport { loadSkillFromFile } from '../skills/skill-loader';\nimport type { SkillSummary } from '../skills/skill-types';\n\n// ── Interface ──\n\nexport interface ResolvedSkill {\n name: string;\n /** Full skill instructions (for legacy injection). */\n systemPrompt: string;\n /** File path to the skill (for progressive loading). */\n path: string;\n /** Pre-resolved sub-guide contents keyed by filename. */\n subGuides?: Record<string, string>;\n}\n\nexport interface SkillResolver {\n resolve(action: string, profileSkills?: string[]): Promise<ResolvedSkill | null>;\n}\n\n// ── Default implementation ──\n\nexport interface DefaultSkillResolverConfig {\n /** Path to skills-index.json */\n skillIndexPath: string;\n /** Optional SkillRouter config (aliases, model, etc.) */\n routerConfig?: ConstructorParameters<typeof SkillRouter>[0];\n}\n\nexport class DefaultSkillResolver implements SkillResolver {\n private readonly router: SkillRouter;\n private readonly summariesPromise: Promise<SkillSummary[]>;\n private summaries: SkillSummary[] | null = null;\n\n constructor(config: DefaultSkillResolverConfig) {\n this.router = new SkillRouter(config.routerConfig);\n this.summariesPromise = import('node:fs/promises')\n .then(fs => fs.readFile(config.skillIndexPath, 'utf-8'))\n .then(raw => JSON.parse(raw) as SkillSummary[])\n .catch(() => []);\n }\n\n async resolve(action: string, profileSkills?: string[]): Promise<ResolvedSkill | null> {\n if (!this.summaries) {\n this.summaries = await this.summariesPromise;\n }\n if (this.summaries.length === 0) return null;\n\n // If profile restricts skills, filter summaries to that set\n const candidates = profileSkills\n ? this.summaries.filter(s => profileSkills.includes(s.name))\n : this.summaries;\n\n if (candidates.length === 0) return null;\n\n const matched = await this.router.selectSkill(action, candidates);\n if (matched) {\n console.log(`[skill-resolver] Matched skill \"${matched.name}\" for action: \"${action.slice(0, 80)}...\"`);\n } else {\n console.log(`[skill-resolver] No match for action: \"${action.slice(0, 80)}...\"`);\n }\n if (!matched) return null;\n\n try {\n const skill = await loadSkillFromFile(matched.path);\n console.log(`[skill-resolver] Loaded skill \"${matched.name}\" (${skill.instructions?.length ?? 0} chars) path: ${matched.path}`);\n if (!skill.instructions) return null;\n\n // Pre-read sub-guide files referenced in the skill\n const subGuides: Record<string, string> = {};\n const linkPattern = /\\[([^\\]]+)\\]\\(([^)]+\\.md)\\)/g;\n let m: RegExpExecArray | null;\n const dir = dirname(resolvePath(matched.path));\n while ((m = linkPattern.exec(skill.instructions)) !== null) {\n const file = m[2]!;\n if (subGuides[file]) continue;\n try {\n const content = await readFile(resolvePath(dir, file), 'utf8');\n subGuides[file] = content;\n console.log(`[skill-resolver] Pre-read sub-guide \"${file}\" (${content.length} chars)`);\n } catch {\n // Sub-guide not found — skip silently\n }\n }\n\n return {\n name: matched.name,\n systemPrompt: skill.instructions,\n path: matched.path,\n ...(Object.keys(subGuides).length > 0 ? { subGuides } : {}),\n };\n } catch (err) {\n console.error(`[skill-resolver] Failed to load skill \"${matched.name}\":`, err);\n return null;\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { generateText } from 'ai';\nimport { anthropic as defaultAnthropicProvider } from '@ai-sdk/anthropic';\nimport type { ModelFactory } from './types';\nimport type { AgentMessage } from '../agent/types';\nimport { getTextContent } from '../agent/types';\nimport type { Episode, EpisodeTrace } from './arc-types';\nimport type { CompressInput, CompressOutput, EpisodeArtifact } from './types';\nimport { resolveModel, DEFAULT_MODEL_MAP } from './arc-types';\n\n// ── Extractors (reused from v1) ──\n\nexport function extractToolNames(messages: AgentMessage[]): string[] {\n const names = new Set<string>();\n for (const msg of messages) {\n if (msg.role === 'assistant' && msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n names.add(tc.toolName);\n }\n }\n }\n return [...names];\n}\n\nexport function extractFilesRead(messages: AgentMessage[]): string[] {\n const paths = new Set<string>();\n for (const msg of messages) {\n if (msg.role === 'assistant' && msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n if (tc.toolName === 'Read' && tc.args.path) {\n paths.add(String(tc.args.path));\n }\n }\n }\n }\n return [...paths];\n}\n\nexport function extractFilesModified(messages: AgentMessage[]): string[] {\n const paths = new Set<string>();\n for (const msg of messages) {\n if (msg.role === 'assistant' && msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n if ((tc.toolName === 'Write' || tc.toolName === 'Edit') && tc.args.path) {\n paths.add(String(tc.args.path));\n }\n }\n }\n }\n return [...paths];\n}\n\nexport function countSteps(messages: AgentMessage[]): number {\n return messages.filter(m => m.role === 'assistant' && m.toolCalls && m.toolCalls.length > 0).length;\n}\n\nexport function extractFinalOutput(messages: AgentMessage[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]!;\n if (msg.role === 'assistant' && (!msg.toolCalls || msg.toolCalls.length === 0)) {\n return getTextContent(msg.content).slice(0, 200);\n }\n }\n return '';\n}\n\n// ── Template summary ──\n\nfunction templateSummary(threadAction: string, messages: AgentMessage[], success: boolean): string {\n const toolNames = extractToolNames(messages);\n const filesRead = extractFilesRead(messages);\n const filesModified = extractFilesModified(messages);\n const finalOutput = extractFinalOutput(messages);\n const steps = countSteps(messages);\n\n const parts: string[] = [\n `Action: ${threadAction}`,\n `Status: ${success ? 'success' : 'failed'}`,\n `Steps: ${steps}`,\n ];\n\n if (toolNames.length > 0) {\n parts.push(`Tools used: ${toolNames.join(', ')}`);\n }\n if (filesRead.length > 0) {\n parts.push(`Files read: ${filesRead.slice(0, 10).join(', ')}${filesRead.length > 10 ? ` (+${filesRead.length - 10} more)` : ''}`);\n }\n if (filesModified.length > 0) {\n parts.push(`Files modified: ${filesModified.join(', ')}`);\n }\n if (finalOutput) {\n parts.push(`Result: ${finalOutput}`);\n }\n\n return parts.join('\\n');\n}\n\n// ── Artifact extraction ──\n\nfunction extractArtifacts(messages: AgentMessage[]): EpisodeArtifact[] {\n const artifacts: EpisodeArtifact[] = [];\n\n for (const msg of messages) {\n if (msg.role === 'tool' && msg.toolResults) {\n for (const tr of msg.toolResults) {\n if (tr.isError) {\n artifacts.push({\n key: `error_${tr.toolName}`,\n content: tr.result.slice(0, 2000),\n });\n }\n }\n }\n }\n\n for (const msg of messages) {\n if (msg.role === 'assistant' && msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n if ((tc.toolName === 'Write' || tc.toolName === 'Edit') && tc.args.path) {\n const filename = String(tc.args.path).split('/').pop() ?? String(tc.args.path);\n const preview = tc.toolName === 'Edit'\n ? `old: ${String(tc.args.old_text ?? '').slice(0, 200)}\\nnew: ${String(tc.args.new_text ?? '').slice(0, 200)}`\n : String(tc.args.content ?? '').slice(0, 400);\n artifacts.push({\n key: `edit_${filename}`,\n content: `${tc.args.path}\\n${preview}`,\n });\n }\n }\n }\n }\n\n const finalOutput = extractFinalOutput(messages);\n if (finalOutput) {\n artifacts.push({\n key: 'final_output',\n content: finalOutput,\n });\n }\n\n return artifacts;\n}\n\n// ── EpisodeCompressor class ──\n\nexport class EpisodeCompressor {\n private readonly createModel: ModelFactory;\n\n constructor(createModel?: ModelFactory) {\n this.createModel = createModel ?? defaultAnthropicProvider;\n }\n\n compress(input: CompressInput): CompressOutput {\n const now = Date.now();\n const id = randomUUID();\n\n const episode: Episode = {\n id,\n taskId: input.taskId,\n sessionId: input.sessionId,\n index: input.index,\n threadAction: input.threadAction,\n summary: templateSummary(input.threadAction, input.messages, input.success),\n toolCalls: extractToolNames(input.messages),\n filesRead: extractFilesRead(input.messages),\n filesModified: extractFilesModified(input.messages),\n model: input.model,\n steps: countSteps(input.messages),\n success: input.success,\n createdAt: now,\n parentEpisodeIds: input.parentEpisodeIds,\n };\n\n const trace: EpisodeTrace = {\n episodeId: id,\n messages: input.messages,\n createdAt: now,\n };\n\n const artifacts = extractArtifacts(input.messages);\n\n return { episode, trace, artifacts };\n }\n\n async compressLLM(input: CompressInput, signal: AbortSignal): Promise<CompressOutput> {\n const result = this.compress(input);\n\n if (countSteps(input.messages) <= 10) {\n return result;\n }\n\n try {\n const conversationText = input.messages\n .map(m => {\n const text = typeof m.content === 'string' ? m.content : getTextContent(m.content);\n if (m.role === 'assistant' && m.toolCalls?.length) {\n const calls = m.toolCalls.map(tc => `${tc.toolName}(${JSON.stringify(tc.args).slice(0, 100)})`).join(', ');\n return `[assistant] ${text}\\n tools: ${calls}`;\n }\n if (m.role === 'tool' && m.toolResults?.length) {\n const results = m.toolResults.map(tr => `${tr.toolName}: ${tr.result.slice(0, 200)}`).join('; ');\n return `[tool] ${results}`;\n }\n return `[${m.role}] ${text.slice(0, 300)}`;\n })\n .join('\\n');\n\n const fastModel = resolveModel('fast', DEFAULT_MODEL_MAP, DEFAULT_MODEL_MAP.fast);\n const llmResult = await generateText({\n model: this.createModel(fastModel),\n system: 'Summarize this agent conversation into a concise episode summary. Focus on: what was attempted, what tools were used, what files were changed, and the outcome. Keep it under 300 words.',\n messages: [{ role: 'user', content: conversationText.slice(0, 8000) }],\n abortSignal: signal,\n });\n\n if (llmResult.text) {\n result.episode.summary = llmResult.text;\n }\n } catch {\n // LLM failed — template summary is still valid\n }\n\n return result;\n }\n}\n","/**\n * Pick only the keys from `obj` whose values are not null/undefined.\n * Returns a new partial object containing only the defined entries.\n *\n * At runtime the result never contains null/undefined values, but the return\n * type uses `Partial<Pick<T, K>>` for ergonomic spreading into config objects.\n */\n/**\n * Normalize tool definitions: ai-sdk v6 reads `inputSchema` but the `tool()` helper\n * wraps schemas under `parameters`. This remaps for provider compatibility.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function normalizeTools(tools: Record<string, any>): Record<string, any> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const out: Record<string, any> = {};\n for (const [name, t] of Object.entries(tools)) {\n if (t.parameters && !t.inputSchema) {\n out[name] = { ...t, inputSchema: t.parameters };\n } else {\n out[name] = t;\n }\n }\n return out;\n}\n\nexport function pickDefined<T, K extends keyof T>(\n obj: T,\n keys: K[],\n): Partial<Pick<T, K>> {\n const result = {} as Partial<Pick<T, K>>;\n for (const key of keys) {\n if (obj[key] != null) {\n (result as Pick<T, K>)[key] = obj[key];\n }\n }\n return result;\n}\n","import { randomUUID } from 'node:crypto';\nimport { generateObject, streamText, stepCountIs, tool as aiTool } from 'ai';\nimport { anthropic as defaultAnthropicProvider } from '@ai-sdk/anthropic';\nimport { z } from 'zod';\nimport type { ModelFactory } from './types';\nimport type { AgentMessage, AgentStreamEvent, ToolCallAction, ToolCallInfo } from '../agent/types';\nimport { getTextContent } from '../agent/types';\nimport type { ToolProvider, ToolResult } from '../interfaces/tool-provider';\nimport type { HookRunner } from '../hooks/hook-runner';\nimport type { PermissionManager } from '../permissions/permission-manager';\nimport type { HarnessTelemetry } from '../observability/otel';\nimport type { Activity, Process, ProcessEvent, ProcessRequest, ProcessResult, ArcLoopConfig, ToolChoiceConfig } from './types';\nimport { resolveToolChoice } from './types';\nimport type { ResultPager } from './result-pager';\nimport type { Episode, EpisodeStore, ModelTier } from './arc-types';\nimport type { ResiliencePolicy, ExecutionContext } from './resilience/types';\nimport { resolveModel, DEFAULT_MODEL_MAP } from './arc-types';\nimport { toModelMessages, estimateTokens } from './message-convert';\nimport { EpisodeCompressor } from './episode-compressor';\nimport { pickDefined, normalizeTools } from './utils';\n\n// ── Async channel (push-based async iterable for outbox) ──\n\ninterface Channel<T> {\n push(value: T): void;\n close(): void;\n [Symbol.asyncIterator](): AsyncIterableIterator<T>;\n}\n\nexport function createChannel<T>(): Channel<T> {\n const buffer: T[] = [];\n let closed = false;\n let resolve: (() => void) | null = null;\n\n return {\n push(value: T) {\n if (closed) return;\n buffer.push(value);\n if (resolve) {\n const r = resolve;\n resolve = null;\n r();\n }\n },\n\n close() {\n closed = true;\n if (resolve) {\n const r = resolve;\n resolve = null;\n r();\n }\n },\n\n async *[Symbol.asyncIterator]() {\n let index = 0;\n while (true) {\n while (index < buffer.length) {\n yield buffer[index]!;\n index++;\n }\n if (closed) return;\n await new Promise<void>(r => { resolve = r; });\n }\n },\n };\n}\n\n/** Wait for the first event of a given type from an async iterable. */\nexport async function firstEvent<T extends { type: string }>(\n iterable: AsyncIterable<T>,\n type: string,\n): Promise<T> {\n for await (const event of iterable) {\n if (event.type === type) return event;\n }\n throw new Error(`Stream ended without '${type}' event`);\n}\n\n// ── Constants ──\n\n/** Default character threshold above which tool results are paged externally. */\nexport const DEFAULT_PAGE_THRESHOLD = 4_000;\n\n/** Hard cap on ReadFullResult output — never re-paged, prevents infinite recursion. */\nexport const READ_FULL_RESULT_HARD_CAP = 32_000;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractStepUsage(usage: any): import('../agent/types').StepUsage | undefined {\n if (!usage) return undefined;\n const u: import('../agent/types').StepUsage = {};\n if (usage.inputTokens != null) u.inputTokens = usage.inputTokens;\n if (usage.outputTokens != null) u.outputTokens = usage.outputTokens;\n const inputDetails = usage.inputTokenDetails ?? usage;\n const outputDetails = usage.outputTokenDetails ?? usage;\n if (inputDetails.cacheReadTokens != null) u.cacheReadTokens = inputDetails.cacheReadTokens;\n if (inputDetails.cacheWriteTokens != null) u.cacheWriteTokens = inputDetails.cacheWriteTokens;\n if (outputDetails.reasoningTokens != null) u.reasoningTokens = outputDetails.reasoningTokens;\n return Object.keys(u).length > 0 ? u : undefined;\n}\n\n// ── Process system prompt ──\n\nconst PROCESS_SYSTEM_PROMPT = [\n 'You are a focused execution thread within a larger agent system.',\n 'Complete the assigned task using the available tools.',\n 'Be efficient — accomplish the objective with minimal steps.',\n 'If your context includes the user\\'s original message or attachment metadata, use that information directly.',\n 'When done, provide a brief summary of what you accomplished.',\n].join(' ');\n\n// ── Tool execution ──\n\nasync function executeBuiltinTool(\n provider: ToolProvider,\n action: ToolCallAction,\n runtime: { askUser?: (q: string, opts?: string[]) => Promise<string>; tellUser?: (msg: string) => Promise<void>; downloadRawFile?: (path: string) => Promise<string> },\n): Promise<ToolResult> {\n switch (action.name) {\n case 'Bash':\n return provider.bash(String(action.args.command ?? ''), {\n cwd: action.args.cwd as string | undefined,\n timeout: action.args.timeout as number | undefined,\n });\n case 'Read':\n return provider.readFile(String(action.args.path ?? ''));\n case 'Write':\n return provider.writeFile(String(action.args.path ?? ''), String(action.args.content ?? ''));\n case 'Edit':\n return provider.editFile(\n String(action.args.path ?? ''),\n String(action.args.old_text ?? ''),\n String(action.args.new_text ?? ''),\n );\n case 'Glob':\n return provider.glob(String(action.args.pattern ?? ''));\n case 'Grep':\n return provider.grep(String(action.args.pattern ?? ''), action.args.path as string | undefined);\n case 'WebFetch':\n if (!provider.webFetch) return { success: false, output: '', error: 'WebFetch unavailable' };\n return provider.webFetch({\n url: String(action.args.url ?? ''),\n selector: action.args.selector as string | undefined,\n maxContentLength: action.args.maxContentLength as number | undefined,\n });\n case 'WebSearch':\n if (!provider.webSearch) return { success: false, output: '', error: 'WebSearch unavailable' };\n return provider.webSearch(String(action.args.query ?? ''));\n case 'AskUser':\n if (!runtime.askUser) return { success: false, output: '', error: 'AskUser unavailable' };\n return { success: true, output: await runtime.askUser(String(action.args.question ?? ''), Array.isArray(action.args.options) ? action.args.options.map(String) : undefined) };\n case 'TellUser':\n if (!runtime.tellUser) return { success: false, output: '', error: 'TellUser unavailable' };\n await runtime.tellUser(String(action.args.message ?? ''));\n return { success: true, output: 'ok' };\n case 'DownloadRawFile':\n if (!runtime.downloadRawFile) return { success: false, output: '', error: 'DownloadRawFile unavailable' };\n return { success: true, output: await runtime.downloadRawFile(String(action.args.path ?? '')) };\n default:\n return { success: false, output: '', error: `Unknown tool: ${action.name}` };\n }\n}\n\nasync function executeTool(\n action: ToolCallAction,\n provider: ToolProvider,\n runtime: {\n executeToolAction?: (action: ToolCallAction) => Promise<ToolResult | null>;\n hookRunner?: HookRunner;\n permissionManager?: PermissionManager;\n askUser?: (q: string, opts?: string[]) => Promise<string>;\n tellUser?: (msg: string) => Promise<void>;\n downloadRawFile?: (path: string) => Promise<string>;\n },\n): Promise<ToolResult> {\n if (runtime.hookRunner) {\n const pre = await runtime.hookRunner.run({ event: 'PreToolUse', toolName: action.name, input: action.args });\n if (!pre.allow) {\n return { success: false, output: '', error: pre.reason ?? 'blocked by pre-hook' };\n }\n }\n\n if (runtime.permissionManager) {\n const permission = await runtime.permissionManager.check({ toolName: action.name, input: action.args });\n if (!permission.allow) {\n return { success: false, output: '', error: permission.reason ?? 'blocked by permission manager' };\n }\n }\n\n if (runtime.executeToolAction) {\n const result = await runtime.executeToolAction(action);\n if (result) {\n if (runtime.hookRunner) {\n await runtime.hookRunner.run({ event: 'PostToolUse', toolName: action.name, input: action.args, output: result });\n }\n return result;\n }\n }\n\n const result = await executeBuiltinTool(provider, action, runtime);\n\n if (runtime.hookRunner) {\n await runtime.hookRunner.run({ event: 'PostToolUse', toolName: action.name, input: action.args, output: result });\n }\n\n return result;\n}\n\n// ── AgentRunner ──\n\nexport interface AgentRunnerConfig {\n model: string;\n createModel?: ModelFactory;\n prompt: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tools: Record<string, any>;\n systemPrompt: string;\n toolProvider: ToolProvider;\n maxSteps: number;\n signal: AbortSignal;\n seed?: AgentMessage[];\n inbox?: AsyncIterable<AgentMessage>;\n onActivity?: (activity: Activity) => void;\n /** Allowed tool names for executor-level validation (defense-in-depth). */\n allowedToolNames?: string[];\n /** Zod schema for structured output. When set, the terminal step uses generateObject instead of generateText. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n outputSchema?: import('zod').ZodObject<any>;\n\n // Runtime extras\n hookRunner?: HookRunner;\n permissionManager?: PermissionManager;\n telemetry?: HarnessTelemetry;\n executeToolAction?: (action: ToolCallAction) => Promise<ToolResult | null>;\n askUser?: (q: string, opts?: string[]) => Promise<string>;\n tellUser?: (msg: string) => Promise<void>;\n downloadRawFile?: (path: string) => Promise<string>;\n\n /** Optional resilience policy applied to generateText calls. */\n resilience?: ResiliencePolicy;\n\n /** Tool choice for LLM calls. Supports per-turn callbacks. Default: 'auto'. */\n toolChoice?: ToolChoiceConfig;\n\n /** ResultPager for storing large tool results externally. When set, enables context paging. */\n resultPager?: ResultPager;\n /** Character threshold above which tool results are paged. Default: 4000. */\n resultPageThreshold?: number;\n /** Tool names to never page (e.g., ['Read', 'Edit'] — filesystem tools return needed content). */\n pagingExclude?: string[];\n /** Hard cap on tool result length (chars) when no resultPager is configured. Truncates with a note. No default (unlimited). */\n maxToolResultLength?: number;\n\n /** Structured facts injected into the system prompt (e.g., from long-term memory). */\n contextFacts?: string[];\n /** Max context tokens before old messages are trimmed. When set, stubs old tool results to keep within budget. */\n maxContextTokens?: number;\n}\n\nexport interface AgentRunResult {\n messages: AgentMessage[];\n output: string;\n steps: number;\n /** Structured output from generateObject when outputSchema is set. */\n structuredOutput?: Record<string, unknown>;\n}\n\nexport class AgentRunner {\n async run(config: AgentRunnerConfig): Promise<AgentRunResult> {\n const stream = this.stream(config);\n while (true) {\n const next = await stream.next();\n if (next.done) return next.value;\n }\n }\n\n async *stream(config: AgentRunnerConfig): AsyncGenerator<AgentStreamEvent, AgentRunResult> {\n const messages: AgentMessage[] = [\n ...(config.seed ?? []),\n { role: 'user', content: config.prompt },\n ];\n\n const systemContent = config.contextFacts?.length\n ? config.systemPrompt + '\\n\\n## Known Facts\\n' + config.contextFacts.map(f => `- ${f}`).join('\\n')\n : config.systemPrompt;\n\n const cachedSystem = [{\n role: 'system' as const,\n content: systemContent,\n }];\n\n const pageThreshold = config.resultPageThreshold ?? DEFAULT_PAGE_THRESHOLD;\n const pagingExcludeSet = new Set(config.pagingExclude ?? []);\n\n const effectiveTools = config.resultPager\n ? {\n ...config.tools,\n ReadFullResult: aiTool({\n description: 'Retrieve the full content of a paged tool result. Use when the summary is insufficient and you need the complete data.',\n inputSchema: z.object({\n ref: z.string().describe('The paged result reference from a previous tool output'),\n lineRange: z.object({\n start: z.number().int().min(1).describe('Start line (1-indexed, inclusive)'),\n end: z.number().int().min(1).describe('End line (1-indexed, inclusive)'),\n }).optional().describe('Optional line range to retrieve. Omit for full content.'),\n }),\n }),\n }\n : config.tools;\n\n for (let step = 0; step < config.maxSteps; step++) {\n config.signal.throwIfAborted();\n yield { type: 'step_start', step: step + 1 };\n\n if (config.inbox) {\n for await (const msg of drainNonBlocking(config.inbox)) {\n messages.push(msg);\n }\n }\n\n if (config.maxContextTokens && step > 0) {\n trimContext(messages, config.maxContextTokens);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = (streamText as any)({\n model: (config.createModel ?? defaultAnthropicProvider)(config.model),\n tools: normalizeTools(effectiveTools),\n toolChoice: resolveToolChoice(config.toolChoice, step),\n messages: toModelMessages(messages),\n system: cachedSystem,\n abortSignal: config.signal,\n stopWhen: stepCountIs(1),\n });\n\n const toolCalls: Array<{ toolName: string; input: Record<string, unknown>; toolCallId?: string; providerMetadata?: Record<string, unknown> }> = [];\n let finalText = '';\n\n for await (const part of result.fullStream) {\n if (part.type === 'text-delta') {\n finalText += part.text;\n yield { type: 'text_delta', text: part.text };\n }\n if (part.type === 'tool-call') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const raw = part as any;\n toolCalls.push({\n toolName: raw.toolName,\n input: raw.args ?? raw.input ?? {},\n ...(raw.toolCallId != null ? { toolCallId: raw.toolCallId } : {}),\n ...(raw.providerMetadata || raw.experimental_providerMetadata\n ? { providerMetadata: raw.providerMetadata ?? raw.experimental_providerMetadata }\n : {}),\n });\n }\n }\n\n let usage: import('../agent/types').StepUsage | undefined;\n try {\n usage = extractStepUsage(await result.usage);\n } catch {\n usage = undefined;\n }\n\n if (toolCalls.length === 0) {\n const rawText = finalText.trim();\n if (!rawText && step === 0) {\n const text = 'ERROR: LLM returned empty response with no tool calls on first step. This may indicate an API billing issue, authentication error, or rate limit.';\n messages.push({ role: 'assistant', content: text });\n yield usage ? { type: 'step_end', step: step + 1, usage } : { type: 'step_end', step: step + 1 };\n return { messages, output: text, steps: step + 1 };\n }\n\n const text = rawText || 'Done.';\n messages.push({ role: 'assistant', content: text });\n\n if (config.hookRunner) {\n const decision = await config.hookRunner.run({\n event: 'RunComplete',\n metadata: {\n messages,\n steps: step + 1,\n output: text,\n },\n });\n if (!decision.allow) {\n messages.push({\n role: 'user',\n content: decision.reason ?? 'Continue — a required post-completion step was not performed.',\n });\n yield usage ? { type: 'step_end', step: step + 1, usage } : { type: 'step_end', step: step + 1 };\n continue;\n }\n }\n\n if (config.outputSchema) {\n try {\n const extractionMessages: AgentMessage[] = [\n ...messages,\n { role: 'user', content: 'Extract the structured output from your response above.' },\n ];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const structured = await (generateObject as any)({\n model: (config.createModel ?? defaultAnthropicProvider)(config.model),\n schema: config.outputSchema,\n messages: toModelMessages(extractionMessages),\n system: config.systemPrompt,\n abortSignal: config.signal,\n });\n yield usage ? { type: 'step_end', step: step + 1, usage } : { type: 'step_end', step: step + 1 };\n return { messages, output: text, steps: step + 1, structuredOutput: structured.object };\n } catch {\n // fall through to text result\n }\n }\n\n yield usage ? { type: 'step_end', step: step + 1, usage } : { type: 'step_end', step: step + 1 };\n return { messages, output: text, steps: step + 1 };\n }\n\n const toolCallInfos = toolCalls.map(tc => {\n const info: ToolCallInfo = {\n toolCallId: tc.toolCallId ?? randomUUID(),\n toolName: tc.toolName,\n args: tc.input ?? {},\n };\n if (tc.providerMetadata) {\n info.providerMetadata = tc.providerMetadata;\n }\n return info;\n });\n\n messages.push({\n role: 'assistant',\n content: finalText || toolCalls.map(tc => `${tc.toolName}(${JSON.stringify(tc.input ?? {}).slice(0, 100)})`).join(', '),\n toolCalls: toolCallInfos,\n });\n\n for (let index = 0; index < toolCallInfos.length; index += 1) {\n const tc = toolCallInfos[index]!;\n const action: ToolCallAction = {\n type: 'tool',\n name: tc.toolName,\n args: tc.args,\n toolCallId: tc.toolCallId,\n };\n\n config.onActivity?.({\n type: 'tool_start',\n name: tc.toolName,\n args: tc.args,\n ts: Date.now(),\n });\n yield { type: 'tool_start', name: tc.toolName, args: tc.args, ...(tc.toolCallId ? { toolCallId: tc.toolCallId } : {}) };\n\n if (tc.toolName === 'ReadFullResult' && config.resultPager) {\n const ref = String(tc.args.ref ?? '');\n const content = await config.resultPager.retrieve(ref);\n if (!content) {\n const errorText = 'ERROR: Content expired or not found. Use the summary above.';\n messages.push({\n role: 'tool',\n content: errorText,\n toolResults: [{ toolCallId: tc.toolCallId, toolName: tc.toolName, result: errorText, isError: true }],\n });\n config.onActivity?.({\n type: 'tool_end',\n name: tc.toolName,\n ok: false,\n ms: 0,\n preview: '',\n ts: Date.now(),\n });\n yield { type: 'tool_end', name: tc.toolName, result: { success: false, output: '', error: errorText } };\n continue;\n }\n let output = content;\n const lr = tc.args.lineRange;\n if (lr && typeof lr === 'object' && 'start' in lr && 'end' in lr) {\n const start = Number(lr.start);\n const end = Number(lr.end);\n if (Number.isFinite(start) && Number.isFinite(end) && start >= 1 && end >= start) {\n const lines = content.split('\\n');\n output = lines.slice(start - 1, end).join('\\n');\n }\n }\n if (output.length > READ_FULL_RESULT_HARD_CAP) {\n output = output.slice(0, READ_FULL_RESULT_HARD_CAP)\n + `\\n\\n[Showing first ${READ_FULL_RESULT_HARD_CAP} of ${output.length} chars. Use lineRange for specific sections.]`;\n }\n messages.push({\n role: 'tool',\n content: output,\n toolResults: [{ toolCallId: tc.toolCallId, toolName: tc.toolName, result: output, isError: false }],\n });\n config.onActivity?.({\n type: 'tool_end',\n name: tc.toolName,\n ok: true,\n ms: 0,\n preview: output.slice(0, 200),\n ts: Date.now(),\n });\n yield { type: 'tool_end', name: tc.toolName, result: { success: true, output } };\n continue;\n }\n\n if (config.allowedToolNames && !config.allowedToolNames.includes(tc.toolName)) {\n const resultText = `ERROR: Tool \"${tc.toolName}\" is not available in this profile.`;\n messages.push({\n role: 'tool',\n content: resultText,\n toolResults: [{\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n result: resultText,\n isError: true,\n }],\n });\n config.onActivity?.({\n type: 'tool_end',\n name: tc.toolName,\n ok: false,\n ms: 0,\n preview: '',\n ts: Date.now(),\n });\n yield { type: 'tool_end', name: tc.toolName, result: { success: false, output: '', error: resultText } };\n continue;\n }\n\n const start = Date.now();\n let toolResult: ToolResult;\n try {\n toolResult = await executeTool(action, config.toolProvider, {\n ...(config.executeToolAction != null ? { executeToolAction: config.executeToolAction } : {}),\n ...(config.hookRunner != null ? { hookRunner: config.hookRunner } : {}),\n ...(config.permissionManager != null ? { permissionManager: config.permissionManager } : {}),\n ...(config.askUser != null ? { askUser: config.askUser } : {}),\n ...(config.tellUser != null ? { tellUser: config.tellUser } : {}),\n ...(config.downloadRawFile != null ? { downloadRawFile: config.downloadRawFile } : {}),\n });\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n toolResult = {\n success: false,\n output: '',\n error: errorMsg.length > 500 ? errorMsg.slice(0, 500) + '...' : errorMsg,\n };\n }\n const durationMs = Date.now() - start;\n\n let resultText = toolResult.success\n ? toolResult.output\n : `ERROR: ${toolResult.error ?? 'unknown failure'}`;\n\n if (\n config.resultPager &&\n toolResult.success &&\n resultText.length > pageThreshold &&\n !pagingExcludeSet.has(tc.toolName) &&\n tc.toolName !== 'ReadFullResult'\n ) {\n try {\n const paged = await config.resultPager.page(resultText, {\n toolName: tc.toolName,\n toolCallId: tc.toolCallId,\n });\n resultText = [\n paged.summary,\n '',\n `[Full result: ${paged.originalLength} chars — call ReadFullResult(\"${paged.ref}\") to retrieve]`,\n ].join('\\n');\n } catch {\n resultText = resultText.slice(0, pageThreshold)\n + `\\n\\n[Truncated — ${resultText.length} chars total. Storage unavailable.]`;\n }\n }\n\n if (config.maxToolResultLength && resultText.length > config.maxToolResultLength) {\n const originalLength = resultText.length;\n resultText = resultText.slice(0, config.maxToolResultLength)\n + `\\n\\n[Truncated — ${originalLength} chars total, showing first ${config.maxToolResultLength}.]`;\n }\n\n messages.push({\n role: 'tool',\n content: resultText,\n toolResults: [{\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n result: resultText,\n isError: !toolResult.success,\n }],\n });\n config.onActivity?.({\n type: 'tool_end',\n name: tc.toolName,\n ok: toolResult.success,\n ms: durationMs,\n preview: toolResult.output.slice(0, 200),\n ts: Date.now(),\n });\n yield {\n type: 'tool_end',\n name: tc.toolName,\n result: {\n success: toolResult.success,\n output: toolResult.output,\n ...(toolResult.error != null ? { error: toolResult.error } : {}),\n },\n };\n }\n\n yield usage ? { type: 'step_end', step: step + 1, usage } : { type: 'step_end', step: step + 1 };\n }\n\n return { messages, output: 'max steps reached', steps: config.maxSteps };\n }\n}\n\n// ── createProcess factory ──\n\nexport interface CreateProcessConfig {\n createModel?: ModelFactory;\n toolProvider: ToolProvider;\n episodeStore: EpisodeStore;\n taskId: string;\n sessionId: string;\n modelMap: Record<ModelTier, string>;\n defaultModel: string;\n processMaxSteps: number;\n processTimeout: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n processTools: Record<string, any>;\n parentSignal: AbortSignal;\n /** Custom system prompt for this process (overrides PROCESS_SYSTEM_PROMPT). */\n processSystemPrompt?: string;\n /** Async skill instructions to prepend to system prompt (resolved during process startup). */\n /** Async skill instructions to prepend to system prompt (resolved during process startup). */\n skillPromptPromise?: Promise<string | null>;\n /** Skill reference with optional pre-loaded content and sub-guides. */\n skillRefPromise?: Promise<{ name: string; path: string; content?: string; subGuides?: Record<string, string> } | null>;\n /** Allowed tool names for executor-level validation (defense-in-depth against hallucinated tool calls). */\n allowedToolNames?: string[];\n /** Zod schema for structured output on the terminal step. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n outputSchema?: import('zod').ZodObject<any>;\n /** Few-shot demo messages prepended before context episodes. */\n demoMessages?: AgentMessage[];\n /** Seed context messages injected into every process (user message, attachments, etc.). */\n processSeedContext?: string | AgentMessage[];\n\n /** Tool choice for process LLM calls. Default: 'auto'. */\n toolChoice?: ToolChoiceConfig;\n /** ResultPager for context paging. */\n resultPager?: ResultPager;\n /** Character threshold for paging. Default: 4000. */\n resultPageThreshold?: number;\n /** Tool names to never page. */\n pagingExclude?: string[];\n /** Hard cap on tool result length when no pager is configured. */\n maxToolResultLength?: number;\n /** Structured facts injected into the process system prompt. */\n contextFacts?: string[];\n /** Max context tokens for worker thread trimming. */\n maxContextTokens?: number;\n\n // Runtime extras\n hookRunner?: HookRunner;\n permissionManager?: PermissionManager;\n telemetry?: HarnessTelemetry;\n executeToolAction?: (action: ToolCallAction) => Promise<ToolResult | null>;\n askUser?: (q: string, opts?: string[]) => Promise<string>;\n tellUser?: (msg: string) => Promise<void>;\n downloadRawFile?: (path: string) => Promise<string>;\n}\n\nexport function createProcess(\n request: ProcessRequest,\n config: CreateProcessConfig,\n): Process {\n const id = randomUUID();\n const model = resolveModel(request.model, config.modelMap, config.defaultModel);\n const maxSteps = request.model === 'fast' ? 1 : (request.maxSteps ?? config.processMaxSteps);\n\n const inboxChannel = createChannel<AgentMessage>();\n const ac = new AbortController();\n\n const onParentAbort = () => ac.abort();\n config.parentSignal.addEventListener('abort', onParentAbort, { once: true });\n\n const outbox = createChannel<ProcessEvent>();\n\n const compressor = new EpisodeCompressor(config.createModel);\n const runner = new AgentRunner();\n\n const process: Process = {\n id,\n action: request.action,\n model,\n status: 'pending',\n outbox,\n inbox: {\n send(message: AgentMessage) {\n inboxChannel.push(message);\n },\n cancel() {\n ac.abort();\n inboxChannel.close();\n },\n },\n };\n\n const seedPromise = buildSeedMessages(request.contextEpisodeIds ?? [], config.episodeStore);\n\n const startTime = Date.now();\n void (async () => {\n try {\n process.status = 'running';\n const seed = [\n ...(config.demoMessages ?? []),\n ...(await seedPromise),\n ...normalizeSeedContext(config.processSeedContext),\n ];\n\n // Build system prompt: base + optional skill instructions\n let systemPrompt = config.processSystemPrompt ?? PROCESS_SYSTEM_PROMPT;\n\n // Inject skill + pre-read sub-guides directly into system prompt\n const skillRef = config.skillRefPromise ? await config.skillRefPromise : null;\n if (skillRef) {\n // Build sub-guide content blocks\n const subGuideBlocks = skillRef.subGuides\n ? Object.entries(skillRef.subGuides)\n .map(([file, content]) => `\\n### Sub-guide: ${file}\\n\\n${content}`)\n .join('\\n')\n : '';\n\n systemPrompt += `\\n\\n<skill_system>\n**Skill: ${skillRef.name}**\n\nFollow these skill instructions precisely. Do NOT use alternative tools or libraries.\n\n${skillRef.content ?? ''}\n${subGuideBlocks}\n</skill_system>`;\n } else if (config.skillPromptPromise) {\n // Legacy: full content injection (fallback)\n const skillInstructions = await config.skillPromptPromise;\n if (skillInstructions) {\n systemPrompt += '\\n\\n<skill_instructions>\\n'\n + 'IMPORTANT: Follow the skill instructions below precisely. They contain tested, working patterns.\\n\\n'\n + skillInstructions\n + '\\n</skill_instructions>';\n }\n }\n\n const result = await Promise.race([\n (async () => {\n const stream = runner.stream({\n model,\n prompt: request.action,\n tools: config.processTools,\n systemPrompt,\n toolProvider: config.toolProvider,\n maxSteps,\n signal: ac.signal,\n seed,\n inbox: inboxChannel,\n ...pickDefined(config, [\n 'createModel',\n 'hookRunner',\n 'permissionManager',\n 'telemetry',\n 'executeToolAction',\n 'askUser',\n 'tellUser',\n 'downloadRawFile',\n 'allowedToolNames',\n 'outputSchema',\n 'toolChoice',\n 'resultPager',\n 'resultPageThreshold',\n 'pagingExclude',\n 'maxToolResultLength',\n 'contextFacts',\n 'maxContextTokens',\n ]),\n });\n\n while (true) {\n const next = await stream.next();\n if (next.done) {\n return next.value;\n }\n\n const event = next.value;\n if (event.type === 'text_delta') {\n outbox.push({ type: 'text_delta', text: event.text });\n continue;\n }\n if (event.type === 'step_start') {\n outbox.push({ type: 'step_start', step: event.step });\n continue;\n }\n if (event.type === 'step_end') {\n outbox.push({\n type: 'step_end',\n step: event.step,\n ...(event.usage ? { usage: event.usage } : {}),\n });\n continue;\n }\n if (event.type === 'tool_start') {\n outbox.push({\n type: 'activity',\n activity: {\n type: 'tool_start',\n name: event.name,\n args: event.args,\n ts: Date.now(),\n },\n });\n continue;\n }\n if (event.type === 'tool_end') {\n outbox.push({\n type: 'activity',\n activity: {\n type: 'tool_end',\n name: event.name,\n ok: event.result.success,\n ms: 0,\n preview: String(event.result.output ?? '').slice(0, 200),\n ts: Date.now(),\n },\n });\n }\n }\n })(),\n timeoutPromise(config.processTimeout),\n ]);\n\n const durationMs = Date.now() - startTime;\n const nextIndex = await getNextEpisodeIndex(config.episodeStore, config.taskId);\n\n const compressInput = {\n taskId: config.taskId,\n sessionId: config.sessionId,\n index: nextIndex,\n threadAction: request.action,\n messages: result.messages,\n model,\n parentEpisodeIds: request.contextEpisodeIds ?? [],\n success: true,\n };\n\n const { episode, trace, artifacts } = compressor.compress(compressInput);\n\n // Attach structured output from generateObject if present\n if (result.structuredOutput) {\n episode.structuredOutput = result.structuredOutput;\n }\n\n await config.episodeStore.addEpisode(episode);\n await config.episodeStore.addTrace(trace);\n\n const processResult: ProcessResult = {\n episode,\n trace,\n artifacts,\n success: true,\n durationMs,\n resolvedModel: model,\n };\n\n process.result = processResult;\n process.status = 'completed';\n outbox.push({ type: 'episode', episode });\n outbox.push({ type: 'done', result: processResult });\n\n // Async LLM upgrade for long episodes\n if (episode.steps > 10) {\n const upgradeAc = new AbortController();\n void compressor.compressLLM(compressInput, upgradeAc.signal).then(async (upgraded) => {\n episode.summary = upgraded.episode.summary;\n await config.episodeStore.addEpisode(episode);\n }).catch(() => { /* template summary remains */ });\n }\n } catch (error) {\n const durationMs = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n if (ac.signal.aborted) {\n process.status = 'cancelled';\n outbox.push({ type: 'failed', error: 'cancelled' });\n outbox.close();\n return;\n }\n\n const nextIndex = await getNextEpisodeIndex(config.episodeStore, config.taskId).catch(() => 0);\n\n const { episode, trace, artifacts } = compressor.compress({\n taskId: config.taskId,\n sessionId: config.sessionId,\n index: nextIndex,\n threadAction: request.action,\n messages: [\n { role: 'user', content: request.action },\n { role: 'assistant', content: `Failed: ${errorMessage}` },\n ],\n model,\n parentEpisodeIds: request.contextEpisodeIds ?? [],\n success: false,\n });\n\n await config.episodeStore.addEpisode(episode).catch(() => {});\n await config.episodeStore.addTrace(trace).catch(() => {});\n\n const processResult: ProcessResult = {\n episode,\n trace,\n artifacts,\n success: false,\n durationMs,\n resolvedModel: model,\n error: errorMessage,\n };\n\n process.result = processResult;\n process.status = 'failed';\n outbox.push({ type: 'failed', error: errorMessage });\n } finally {\n config.parentSignal.removeEventListener('abort', onParentAbort);\n outbox.close();\n inboxChannel.close();\n }\n })();\n\n return process;\n}\n\n// ── Context trimming for worker threads ──\n\nconst STUB_THRESHOLD = 500;\n\n/**\n * Trim conversation context by stubbing large tool results in older messages.\n * Preserves the most recent messages (hot zone) and stubs outputs in the cold zone.\n */\nfunction trimContext(messages: AgentMessage[], maxTokens: number): void {\n // Estimate current size using the same estimator as ContextWindow\n let totalTokens = 0;\n for (const m of messages) {\n const text = typeof m.content === 'string' ? m.content : '';\n totalTokens += estimateTokens(text);\n }\n if (totalTokens <= maxTokens) return;\n\n // Preserve last 60% of messages as hot zone\n const hotBoundary = Math.floor(messages.length * 0.6);\n\n for (let i = 0; i < hotBoundary; i++) {\n const m = messages[i]!;\n if (m.role === 'tool' && typeof m.content === 'string' && m.content.length > STUB_THRESHOLD) {\n const toolName = m.toolResults?.[0]?.toolName ?? 'tool';\n const stubbed = `[${toolName}: output stubbed, ${m.content.length} chars]`;\n m.content = stubbed;\n if (m.toolResults) {\n for (const tr of m.toolResults) {\n tr.result = stubbed;\n }\n }\n }\n }\n}\n\n// ── Helpers ──\n\nasync function getNextEpisodeIndex(store: EpisodeStore, taskId: string): Promise<number> {\n const episodes = await store.getEpisodesByTask(taskId);\n return episodes.length;\n}\n\nasync function buildSeedMessages(\n episodeIds: string[],\n episodeStore: EpisodeStore,\n): Promise<AgentMessage[]> {\n if (episodeIds.length === 0) return [];\n\n const messages: AgentMessage[] = [];\n for (const id of episodeIds) {\n const trace = await episodeStore.getTrace(id);\n if (!trace) continue;\n\n const traceText = trace.messages\n .map(m => {\n const text = getTextContent(m.content);\n if (m.role === 'assistant' && m.toolCalls?.length) {\n const calls = m.toolCalls.map(tc => ` ${tc.toolName}(${JSON.stringify(tc.args)})`).join('\\n');\n return `[assistant]\\n${text}\\n[tool calls]\\n${calls}`;\n }\n if (m.role === 'tool' && m.toolResults?.length) {\n const results = m.toolResults.map(tr => {\n const output = tr.result.length > 500 ? tr.result.slice(0, 500) + '...' : tr.result;\n return ` ${tr.toolName}: ${tr.isError ? 'ERROR: ' : ''}${output}`;\n }).join('\\n');\n return `[tool results]\\n${results}`;\n }\n return `[${m.role}]\\n${text}`;\n })\n .join('\\n\\n');\n\n messages.push({\n role: 'system',\n content: `Context from prior episode (${id}):\\n${traceText}`,\n });\n }\n\n return messages;\n}\n\nfunction normalizeSeedContext(ctx: string | AgentMessage[] | undefined): AgentMessage[] {\n if (!ctx) return [];\n if (typeof ctx === 'string') {\n return [{ role: 'system', content: ctx }];\n }\n return ctx;\n}\n\nfunction timeoutPromise(ms: number): Promise<never> {\n return new Promise((_, reject) =>\n setTimeout(() => reject(new Error(`Process timed out after ${ms}ms`)), ms)\n );\n}\n\nasync function* drainNonBlocking<T>(iterable: AsyncIterable<T>): AsyncGenerator<T> {\n const iterator = iterable[Symbol.asyncIterator]();\n while (true) {\n const next = await Promise.race([\n iterator.next(),\n Promise.resolve({ done: true as const, value: undefined }),\n ]);\n if (next.done) return;\n yield next.value as T;\n }\n}\n","/**\n * DSPy-style signature parsing and schema generation.\n *\n * Parses signature strings like \"question:string -> evidence:string[], confidence:number\"\n * into typed field definitions, and generates Zod schemas for structured output.\n */\n\nimport { z } from 'zod';\n\n// ── Types ──\n\nexport interface SignatureField {\n name: string;\n type: 'string' | 'number' | 'boolean';\n isArray: boolean;\n isOptional: boolean;\n description?: string;\n}\n\nexport interface ParsedSignature {\n inputs: SignatureField[];\n outputs: SignatureField[];\n}\n\n// ── Parser ──\n\nconst FIELD_RE = /^(\\w+)(?::(\\w+)(\\[\\])?)(\\?)?(?:\\s*\\(([^)]+)\\))?$/;\n\nfunction parseField(raw: string): SignatureField {\n const trimmed = raw.trim();\n const match = trimmed.match(FIELD_RE);\n\n if (!match) {\n // Bare field name — default to string\n const name = trimmed.replace(/\\?$/, '');\n return {\n name,\n type: 'string',\n isArray: false,\n isOptional: trimmed.endsWith('?'),\n };\n }\n\n const [, name, typeStr, arrayMark, optionalMark, desc] = match;\n const type = (['string', 'number', 'boolean'].includes(typeStr!) ? typeStr : 'string') as SignatureField['type'];\n\n const field: SignatureField = {\n name: name!,\n type,\n isArray: arrayMark === '[]',\n isOptional: optionalMark === '?',\n };\n if (desc) field.description = desc.trim();\n return field;\n}\n\n/**\n * Parse a signature string into typed input/output fields.\n *\n * @example\n * parseSignature('question:string -> evidence:string[], confidence:number')\n * // { inputs: [{ name: 'question', type: 'string', ... }],\n * // outputs: [{ name: 'evidence', type: 'string', isArray: true, ... },\n * // { name: 'confidence', type: 'number', ... }] }\n *\n * parseSignature('query -> findings')\n * // All fields default to type 'string', isArray false\n */\nexport function parseSignature(sig: string): ParsedSignature {\n const arrowIdx = sig.indexOf('->');\n if (arrowIdx < 0) {\n throw new Error(`Invalid signature: missing \"->\". Got: \"${sig}\"`);\n }\n\n const inputStr = sig.slice(0, arrowIdx).trim();\n const outputStr = sig.slice(arrowIdx + 2).trim();\n\n const inputs = inputStr.split(',').map(s => s.trim()).filter(Boolean).map(parseField);\n const outputs = outputStr.split(',').map(s => s.trim()).filter(Boolean).map(parseField);\n\n return { inputs, outputs };\n}\n\n// ── Schema generation ──\n\n/**\n * Convert a parsed signature's output fields into a Zod schema.\n * Used with ai-sdk's generateObject() for structured output extraction.\n */\nexport function signatureToSchema(sig: ParsedSignature): z.ZodObject<Record<string, z.ZodTypeAny>> {\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const field of sig.outputs) {\n let base: z.ZodTypeAny;\n switch (field.type) {\n case 'number': base = z.number(); break;\n case 'boolean': base = z.boolean(); break;\n default: base = z.string(); break;\n }\n if (field.isArray) base = z.array(base);\n if (field.description) base = base.describe(field.description);\n if (field.isOptional) base = base.optional();\n shape[field.name] = base;\n }\n\n return z.object(shape);\n}\n\n/**\n * Check if a signature string has typed fields (contains ':').\n * Untyped signatures like 'query -> findings' are treated as cosmetic labels.\n */\nexport function isTypedSignature(sig: string): boolean {\n return /\\b\\w+:\\w+/.test(sig);\n}\n","/**\n * Profile builder — generates prompts and resolves tools from ProfileDeclarations.\n *\n * The core idea: profiles declare WHAT (signature, tools, background).\n * This module generates the HOW (system prompts, tool objects).\n */\n\nimport type { AnyTool } from './arc-types';\nimport type { ProfileDeclaration, ProcessProfile, ProfileConfig } from './types';\nimport { isProfileDeclaration } from './types';\nimport { parseSignature, signatureToSchema, isTypedSignature } from './sig';\n\n// ── Thread prompt generation ────────────────────────────────────\n\n/**\n * Generate a thread system prompt from a ProfileDeclaration.\n *\n * The prompt tells the thread:\n * - What it is (name)\n * - What it produces (signature)\n * - What tools it has (enforced, not suggested)\n * - Domain knowledge (background)\n */\nexport function buildProfilePrompt(decl: ProfileDeclaration): string {\n const [input, output] = decl.signature.split('->').map(s => s.trim());\n const lines = [\n `You are a ${decl.name} thread.`,\n `Your task: take ${input} and produce ${output}.`,\n '',\n `## Available tools`,\n `You have access to: ${decl.tools.join(', ')}`,\n 'Use ONLY these tools. You cannot use any other tools.',\n 'If you have Skill Instructions below, follow them for delivery method and style.',\n ];\n\n if (decl.background) {\n lines.push('', '## Background', decl.background);\n }\n\n return lines.join('\\n');\n}\n\n// ── Orchestrator prompt generation ──────────────────────────────\n\n/**\n * Generate an orchestrator system prompt from a set of profile declarations.\n *\n * The orchestrator sees profile names, signatures, and tool counts —\n * enough to route correctly. No tool names, no delivery methods.\n *\n * @param profiles - The registered profiles\n * @param preamble - Optional strategy preamble (phasing, rules, context).\n * Composed with the auto-generated profile catalog.\n */\nexport function buildOrchestratorPrompt(\n profiles: Record<string, ProfileConfig>,\n preamble?: string,\n): string {\n const profileList = Object.entries(profiles)\n .map(([name, p]) => {\n if (isProfileDeclaration(p)) {\n return `- **${name}** — ${p.signature} (tools: ${p.tools.length}, ${p.model || 'medium'})`;\n }\n // Legacy ProcessProfile — show name only\n return `- **${name}**`;\n })\n .join('\\n');\n\n const sections = [\n 'You are an orchestrator. Accomplish tasks by decomposing them into focused threads, delegating each to the right profile, and synthesizing results.',\n '',\n '## Workflow: Decompose → Delegate → Synthesize',\n '',\n '1. **Decompose**: Break the request into independent, focused sub-tasks.',\n '2. **Delegate**: Dispatch each sub-task as a Thread call with the appropriate profile. Independent sub-tasks go in the SAME turn (parallel).',\n '3. **Synthesize**: Combine thread results into a coherent response.',\n '',\n '## Profiles',\n profileList,\n '',\n '## Thread actions',\n 'Describe WHAT to produce, not HOW. 2-5 sentences. Threads have tools and skill instructions — they know delivery methods.',\n 'ALWAYS set the profile parameter on every Thread call.',\n '',\n '## Concurrency',\n 'Dispatch at most 3 threads per turn. If more are needed, batch them.',\n '',\n '## Context passing',\n 'Threads automatically receive the user\\'s current message and attachments as seed context. Focus action text on WHAT to produce — threads already know what the user asked and what files are available.',\n 'Use contextEpisodeIds to chain dependent threads: research threads first (parallel), then implementation threads with their episodeIds.',\n ];\n\n if (preamble) {\n // Insert preamble after the identity line\n sections.splice(1, 0, '', preamble);\n }\n\n return sections.join('\\n');\n}\n\n// ── Tool resolution ─────────────────────────────────────────────\n\n/**\n * Resolve tool names to tool objects from the global tool registry.\n * Returns only the tools listed in the declaration.\n */\nexport function resolveProfileTools(\n toolNames: string[],\n globalTools: Record<string, AnyTool>,\n): Record<string, AnyTool> {\n const resolved: Record<string, AnyTool> = {};\n for (const name of toolNames) {\n if (globalTools[name]) {\n resolved[name] = globalTools[name];\n }\n }\n return resolved;\n}\n\n// ── ProfileDeclaration → ProcessProfile conversion ──────────────\n\n/**\n * Build a runtime ProcessProfile from a ProfileDeclaration.\n * Generates the system prompt and resolves tool objects.\n */\nexport function buildProcessProfile(\n decl: ProfileDeclaration,\n globalTools: Record<string, AnyTool>,\n): ProcessProfile {\n const profile: ProcessProfile = {\n systemPrompt: buildProfilePrompt(decl),\n tools: resolveProfileTools(decl.tools, globalTools),\n allowedToolNames: decl.tools,\n };\n if (decl.model) profile.model = decl.model;\n if (decl.maxSteps) profile.maxSteps = decl.maxSteps;\n // Generate output schema from typed signatures (e.g., 'question:string -> evidence:string[]')\n if (isTypedSignature(decl.signature)) {\n const parsed = parseSignature(decl.signature);\n if (parsed.outputs.length > 0) {\n profile.outputSchema = signatureToSchema(parsed);\n }\n }\n // Render demos as user/assistant message pairs\n if (decl.demos && decl.demos.length > 0) {\n profile.demoMessages = decl.demos.flatMap(demo => [\n { role: 'user' as const, content: Object.entries(demo.input).map(([k, v]) => `${k}: ${v}`).join('\\n') },\n { role: 'assistant' as const, content: JSON.stringify(demo.output, null, 2) },\n ]);\n }\n return profile;\n}\n\n/**\n * Resolve a ProfileConfig (declaration or legacy) into a ProcessProfile.\n * Declarations are built; legacy profiles are passed through.\n */\nexport function resolveProfile(\n config: ProfileConfig,\n globalTools: Record<string, AnyTool>,\n): ProcessProfile {\n if (isProfileDeclaration(config)) {\n return buildProcessProfile(config, globalTools);\n }\n // Backfill allowedToolNames for legacy profiles when tools are defined\n if (config.tools && !config.allowedToolNames) {\n return { ...config, allowedToolNames: Object.keys(config.tools) };\n }\n return config;\n}\n","import { builtinTools } from '../loop/vercel-agent-loop';\nimport { createProcess } from './agent-runner';\nimport type { Episode, ModelTier } from './arc-types';\nimport { isProfileDeclaration } from './types';\nimport type {\n ArcEvent,\n ArcLoopConfig,\n Process,\n ProcessRequest,\n TraceEvent,\n} from './types';\nimport type { ModelFactory } from './types';\nimport { pickDefined } from './utils';\nimport type { SkillResolver } from './skill-resolver';\nimport { resolveProfile } from './profile-builder';\n\ntype ProcessManagerConfig = {\n loopConfig: ArcLoopConfig;\n createModel: ModelFactory;\n modelMap: Record<ModelTier, string>;\n skillResolver?: SkillResolver;\n onEpisodeCompleted?: (episode: Episode) => void;\n trace?: (kind: TraceEvent['kind']) => void;\n};\n\nfunction normalizeAction(action: string): string {\n return action.trim().replace(/\\s+/g, ' ');\n}\n\nexport class ProcessManager {\n private readonly config: ProcessManagerConfig;\n private readonly processes = new Map<string, Process>();\n private readonly actionIndex = new Map<string, string>();\n private readonly processListeners: Promise<void>[] = [];\n private readonly pendingEventResolvers = new Set<() => void>();\n private readonly tracedRunning = new Set<string>();\n private pendingEvents: ArcEvent[] = [];\n private cachedSessionMemoFacts: string[] = [];\n\n constructor(config: ProcessManagerConfig) {\n this.config = config;\n }\n\n setSessionMemoFacts(facts: string[] | undefined): void {\n this.cachedSessionMemoFacts = facts ?? [];\n }\n\n get size(): number {\n return this.processes.size;\n }\n\n get(id: string): Process | undefined {\n return this.processes.get(id);\n }\n\n values(): IterableIterator<Process> {\n return this.processes.values();\n }\n\n entries(): IterableIterator<[string, Process]> {\n return this.processes.entries();\n }\n\n findByAction(action: string): Process | undefined {\n const existingId = this.actionIndex.get(normalizeAction(action));\n return existingId ? this.processes.get(existingId) : undefined;\n }\n\n dispatch(request: ProcessRequest, parentSignal: AbortSignal): Process {\n const { loopConfig } = this.config;\n const profileConfig = request.profile\n ? loopConfig.processProfiles?.[request.profile]\n : undefined;\n\n const globalTools = (loopConfig.processTools ?? builtinTools) as Record<string, import('./arc-types').AnyTool>;\n const profile = profileConfig\n ? resolveProfile(profileConfig, globalTools)\n : undefined;\n\n const defaultModel = this.config.modelMap[\n (profile?.model ?? 'medium') as ModelTier\n ] ?? this.config.modelMap.medium;\n\n const profileSkills = profileConfig && isProfileDeclaration(profileConfig)\n ? profileConfig.skills\n : undefined;\n\n let resolvedSkillName: string | null = null;\n let resolvedSkillPath: string | null = null;\n\n const skillRefPromise = this.config.skillResolver\n ? this.config.skillResolver.resolve(request.action, profileSkills).then((result) => {\n if (!result) return null;\n resolvedSkillName = result.name;\n resolvedSkillPath = result.path;\n return {\n name: result.name,\n path: result.path,\n ...(result.systemPrompt ? { content: result.systemPrompt } : {}),\n ...(result.subGuides ? { subGuides: result.subGuides } : {}),\n };\n })\n : undefined;\n\n const skillPromptPromise = skillRefPromise?.then(() => null);\n\n const threadContextFacts = [\n ...(loopConfig.contextFacts ?? []),\n ...this.cachedSessionMemoFacts,\n ];\n\n const proc = createProcess(request, {\n toolProvider: loopConfig.toolProvider,\n episodeStore: loopConfig.episodeStore,\n taskId: loopConfig.taskId,\n sessionId: loopConfig.sessionId,\n createModel: this.config.createModel,\n modelMap: this.config.modelMap,\n defaultModel,\n processMaxSteps: profile?.maxSteps ?? loopConfig.processMaxSteps ?? 20,\n processTimeout: loopConfig.processTimeout ?? 120_000,\n processTools: (profile?.tools ?? globalTools) as Record<string, import('./arc-types').AnyTool>,\n ...(profile?.systemPrompt ?? loopConfig.processSystemPrompt\n ? { processSystemPrompt: profile?.systemPrompt ?? loopConfig.processSystemPrompt }\n : {}),\n ...(profile?.allowedToolNames ? { allowedToolNames: profile.allowedToolNames } : {}),\n ...(profile?.outputSchema ? { outputSchema: profile.outputSchema } : {}),\n ...(profile?.demoMessages ? { demoMessages: profile.demoMessages } : {}),\n ...(loopConfig.processToolChoice ? { toolChoice: loopConfig.processToolChoice } : {}),\n ...(loopConfig.resultPager ? { resultPager: loopConfig.resultPager } : {}),\n ...(loopConfig.resultPageThreshold != null ? { resultPageThreshold: loopConfig.resultPageThreshold } : {}),\n ...(loopConfig.pagingExclude ? { pagingExclude: loopConfig.pagingExclude } : {}),\n ...(loopConfig.maxToolResultLength != null ? { maxToolResultLength: loopConfig.maxToolResultLength } : {}),\n contextFacts: threadContextFacts,\n ...(loopConfig.maxContextTokens != null ? { maxContextTokens: loopConfig.maxContextTokens } : {}),\n ...(loopConfig.processSeedContext ? { processSeedContext: loopConfig.processSeedContext } : {}),\n ...(skillPromptPromise ? { skillPromptPromise } : {}),\n ...(skillRefPromise ? { skillRefPromise } : {}),\n parentSignal,\n ...pickDefined(loopConfig, [\n 'hookRunner',\n 'permissionManager',\n 'telemetry',\n 'executeToolAction',\n ]),\n });\n\n this.processes.set(proc.id, proc);\n this.actionIndex.set(normalizeAction(request.action), proc.id);\n this.processListeners.push(this.listenToProcess(proc));\n\n this.trace({ type: 'process_created', id: proc.id, status: 'pending' });\n\n if (skillRefPromise) {\n skillRefPromise.then((ref) => {\n if (ref) {\n this.enqueuePendingEvent({\n type: 'skill_resolved',\n processId: proc.id,\n skillName: ref.name,\n skillPath: ref.path,\n });\n }\n }).catch(() => {});\n }\n\n void resolvedSkillName;\n void resolvedSkillPath;\n\n return proc;\n }\n\n cancel(id: string): Process | undefined {\n const proc = this.processes.get(id);\n if (!proc) return undefined;\n proc.inbox.cancel();\n this.trace({ type: 'process_transition', id, from: proc.status, to: 'cancelled' });\n this.enqueuePendingEvent({ type: 'process_cancelled', id });\n return proc;\n }\n\n hasRunningProcesses(): boolean {\n for (const proc of this.processes.values()) {\n if (proc.status === 'running' || proc.status === 'pending') {\n return true;\n }\n }\n return false;\n }\n\n *drainPendingEvents(): Generator<ArcEvent> {\n while (this.pendingEvents.length > 0) {\n yield this.pendingEvents.shift()!;\n }\n }\n\n async waitForPendingEvent(signal: AbortSignal, timeoutMs: number): Promise<void> {\n if (this.pendingEvents.length > 0) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n const onAbort = () => {\n cleanup();\n resolve();\n };\n const onEvent = () => {\n cleanup();\n resolve();\n };\n const timer = setTimeout(() => {\n cleanup();\n resolve();\n }, timeoutMs);\n\n const cleanup = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', onAbort);\n this.pendingEventResolvers.delete(onEvent);\n };\n\n signal.addEventListener('abort', onAbort, { once: true });\n this.pendingEventResolvers.add(onEvent);\n });\n }\n\n async waitForProcessListeners(): Promise<void> {\n await Promise.allSettled(this.processListeners);\n }\n\n private trace(kind: TraceEvent['kind']): void {\n this.config.trace?.(kind);\n }\n\n private traceProcessRunning(procId: string): void {\n if (!this.tracedRunning.has(procId)) {\n this.tracedRunning.add(procId);\n this.trace({ type: 'process_transition', id: procId, from: 'pending', to: 'running' });\n }\n }\n\n private enqueuePendingEvent(event: ArcEvent): void {\n this.pendingEvents.push(event);\n for (const resolve of this.pendingEventResolvers) {\n resolve();\n }\n this.pendingEventResolvers.clear();\n }\n\n private async listenToProcess(proc: Process): Promise<void> {\n try {\n for await (const event of proc.outbox) {\n if (event.type === 'activity') {\n this.traceProcessRunning(proc.id);\n this.enqueuePendingEvent({\n type: 'process_activity',\n id: proc.id,\n activity: event.activity,\n });\n } else if (event.type === 'text_delta') {\n this.traceProcessRunning(proc.id);\n this.enqueuePendingEvent({\n type: 'process_text_delta',\n id: proc.id,\n text: event.text,\n });\n } else if (event.type === 'step_start') {\n this.traceProcessRunning(proc.id);\n this.enqueuePendingEvent({\n type: 'process_step_start',\n id: proc.id,\n step: event.step,\n });\n } else if (event.type === 'step_end') {\n this.traceProcessRunning(proc.id);\n this.enqueuePendingEvent({\n type: 'process_step_end',\n id: proc.id,\n step: event.step,\n ...(event.usage ? { usage: event.usage } : {}),\n });\n } else if (event.type === 'done') {\n this.traceProcessRunning(proc.id);\n this.trace({ type: 'process_transition', id: proc.id, from: 'running', to: 'completed' });\n this.config.onEpisodeCompleted?.(event.result.episode);\n this.enqueuePendingEvent({\n type: 'process_completed',\n id: proc.id,\n episodeId: event.result.episode.id,\n summary: event.result.episode.summary,\n durationMs: event.result.durationMs,\n });\n } else if (event.type === 'failed') {\n this.traceProcessRunning(proc.id);\n const toStatus = event.error === 'cancelled' ? 'cancelled' : 'failed';\n this.trace({ type: 'process_transition', id: proc.id, from: 'running', to: toStatus });\n this.enqueuePendingEvent({\n type: 'process_failed',\n id: proc.id,\n error: event.error,\n });\n }\n }\n } catch {\n // Process outbox closed\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { streamText } from 'ai';\nimport type { AgentMessage, AgentAction } from '../agent/types';\nimport { getTextContent } from '../agent/types';\nimport type { ContextWindow } from './context-window';\nimport type { MemoryManager } from './memory-manager';\nimport type { ProcessManager } from './process-manager';\nimport type {\n ArcEvent,\n ArcLoopConfig,\n ModelFactory,\n PreparedContext,\n ProcessRequest,\n TraceEvent,\n} from './types';\nimport type { ResiliencePolicy, ExecutionContext } from './resilience/types';\nimport { resolveToolChoice } from './types';\nimport { normalizeTools } from './utils';\nimport { toModelMessages, estimateTokens } from './message-convert';\n\ntype ToolCall = {\n toolName: string;\n args: Record<string, unknown>;\n toolCallId?: string;\n};\n\nexport type OrchestratorTurnResult =\n | { type: 'retry_empty' }\n | { type: 'done'; output: string }\n | { type: 'continue' };\n\ntype OrchestratorTurnRunnerConfig = {\n createModel: ModelFactory;\n orchestratorModel: string;\n tools: Record<string, unknown>;\n cachedSystem: unknown;\n orchestratorToolChoice?: ArcLoopConfig['orchestratorToolChoice'];\n resilience?: ResiliencePolicy;\n config: ArcLoopConfig;\n ctx: ContextWindow;\n memory: MemoryManager;\n processManager: ProcessManager;\n trace: (kind: TraceEvent['kind']) => void;\n};\n\nexport class OrchestratorTurnRunner {\n private readonly config: OrchestratorTurnRunnerConfig;\n\n constructor(config: OrchestratorTurnRunnerConfig) {\n this.config = config;\n }\n\n async *runTurn(params: {\n turn: number;\n maxTurns: number;\n prepared: PreparedContext;\n signal: AbortSignal;\n forcedFinalResponseRetry: boolean;\n }): AsyncGenerator<ArcEvent, OrchestratorTurnResult> {\n const { turn, maxTurns, prepared, signal, forcedFinalResponseRetry } = params;\n\n this.config.trace({ type: 'llm_call_start' });\n\n const callLLM = async (effectiveSignal: AbortSignal) =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (streamText as any)({\n model: this.config.createModel(this.config.orchestratorModel),\n tools: normalizeTools(this.config.tools),\n toolChoice: resolveToolChoice(this.config.orchestratorToolChoice, turn),\n messages: toModelMessages(prepared.messages),\n system: this.config.cachedSystem,\n abortSignal: effectiveSignal,\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let stream: any;\n if (this.config.resilience) {\n const resilienceCtx: ExecutionContext = {\n attempt: 0,\n totalAttempts: 1,\n startTime: Date.now(),\n signal,\n };\n stream = await this.config.resilience.execute(\n (ctx) => callLLM(ctx.signal),\n resilienceCtx,\n );\n } else {\n stream = await callLLM(signal);\n }\n\n const toolCalls: ToolCall[] = [];\n let text = '';\n\n for await (const part of stream.fullStream) {\n if (part.type === 'text-delta') {\n text += part.text;\n yield { type: 'text_delta', text: part.text };\n }\n if (part.type === 'tool-call') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const p = part as any;\n toolCalls.push({\n toolName: p.toolName,\n args: p.args ?? p.input ?? {},\n toolCallId: p.toolCallId,\n });\n }\n }\n\n const responseType = toolCalls.length === 0 ? 'text_only'\n : toolCalls.length === 1 ? 'single_tool'\n : 'multiple_tools';\n this.config.trace({ type: 'llm_call_end', response_type: responseType });\n\n if (toolCalls.length === 0) {\n if (!text.trim()) {\n if (!forcedFinalResponseRetry && turn < maxTurns - 1) {\n const retryInstruction =\n 'Respond to the user now using the completed thread results. Do not call tools or dispatch threads unless absolutely necessary. Give a direct final answer.';\n this.config.ctx.recordTurn({\n role: 'user',\n messages: [{ role: 'user', content: retryInstruction }],\n tokenEstimate: estimateTokens(retryInstruction),\n timestamp: Date.now(),\n });\n return { type: 'retry_empty' };\n }\n\n text = 'No final synthesis was produced.';\n }\n\n this.config.ctx.recordTurn({\n role: 'orchestrator',\n messages: [{ role: 'assistant', content: text }],\n tokenEstimate: estimateTokens(text),\n timestamp: Date.now(),\n });\n\n return { type: 'done', output: text };\n }\n\n const assistantMessages = this.buildAssistantMessages(text, toolCalls);\n this.config.ctx.recordTurn({\n role: 'orchestrator',\n messages: assistantMessages,\n tokenEstimate: estimateTokens(text) + toolCalls.reduce((sum, call) => sum + estimateTokens(JSON.stringify(call.args)), 0),\n timestamp: Date.now(),\n });\n\n const toolResultMessages: AgentMessage[] = [];\n\n for (const call of toolCalls) {\n const toolCallId = call.toolCallId ?? randomUUID();\n this.config.trace({ type: 'tool_call', tool: call.toolName });\n\n if (call.toolName === 'Thread') {\n const request = this.toProcessRequest(call.args);\n const hasProfiles = this.config.config.processProfiles && Object.keys(this.config.config.processProfiles).length > 0;\n\n if (hasProfiles && !request.profile) {\n const names = Object.keys(this.config.config.processProfiles!).map((name) => `\"${name}\"`).join(', ');\n const resultText = `ERROR: profile parameter is required. Available profiles: ${names}. Re-call Thread with a profile.`;\n toolResultMessages.push({\n role: 'tool',\n content: resultText,\n toolResults: [{ toolCallId, toolName: 'Thread', result: resultText }],\n });\n yield { type: 'thread_rejected', action: request.action, reason: 'missing profile' };\n continue;\n }\n\n if (hasProfiles && request.profile && !this.config.config.processProfiles![request.profile]) {\n const names = Object.keys(this.config.config.processProfiles!).map((name) => `\"${name}\"`).join(', ');\n const resultText = `ERROR: unknown profile \"${request.profile}\". Available profiles: ${names}. Re-call Thread with a valid profile.`;\n toolResultMessages.push({\n role: 'tool',\n content: resultText,\n toolResults: [{ toolCallId, toolName: 'Thread', result: resultText }],\n });\n yield { type: 'thread_rejected', action: request.action, reason: `unknown profile \"${request.profile}\"` };\n continue;\n }\n\n const existing = this.config.processManager.findByAction(request.action);\n if (existing && (existing.status === 'running' || existing.status === 'pending')) {\n const resultText = `DUPLICATE — thread already running for this action (process ${existing.id}). Wait for it to complete.`;\n toolResultMessages.push({\n role: 'tool',\n content: resultText,\n toolResults: [{ toolCallId, toolName: 'Thread', result: resultText }],\n });\n yield { type: 'thread_rejected', action: request.action, reason: 'duplicate (running)' };\n continue;\n }\n\n if (existing && existing.status === 'completed' && existing.result) {\n const ep = existing.result.episode;\n const resultText = `DUPLICATE — this action already completed (process ${existing.id}, episodeId: ${ep.id}). Use contextEpisodeIds: [\"${ep.id}\"] to reference it.`;\n toolResultMessages.push({\n role: 'tool',\n content: resultText,\n toolResults: [{ toolCallId, toolName: 'Thread', result: resultText }],\n });\n yield { type: 'thread_rejected', action: request.action, reason: 'duplicate (completed)' };\n continue;\n }\n\n const completedEpisodeIds = [...this.config.processManager.values()]\n .filter((proc) => proc.status === 'completed' && proc.result?.episode)\n .map((proc) => proc.result!.episode.id);\n if (completedEpisodeIds.length > 0) {\n request.contextEpisodeIds = [\n ...(request.contextEpisodeIds ?? []),\n ...completedEpisodeIds.filter((id) => !request.contextEpisodeIds?.includes(id)),\n ];\n }\n\n const proc = this.config.processManager.dispatch(request, signal);\n const resultText = `Process ${proc.id} dispatched: \"${request.action}\" (model: ${request.model ?? 'medium'})`;\n toolResultMessages.push({\n role: 'tool',\n content: resultText,\n toolResults: [{ toolCallId, toolName: 'Thread', result: resultText }],\n });\n yield {\n type: 'process_dispatched',\n id: proc.id,\n action: request.action,\n model: proc.model,\n ...(request.label ? { label: request.label } : {}),\n ...(request.profile ? { profile: request.profile } : {}),\n };\n continue;\n }\n\n if (call.toolName === 'Check') {\n const proc = this.config.processManager.get(String(call.args.id));\n let resultText: string;\n if (!proc) {\n resultText = `Process not found: ${call.args.id}`;\n } else if (proc.result) {\n resultText = `Process ${proc.id} [${proc.status}] (episodeId: ${proc.result.episode.id}):\\n${proc.result.episode.summary}`;\n } else {\n resultText = `Process ${proc.id}: status=${proc.status}`;\n }\n toolResultMessages.push({\n role: 'tool',\n content: resultText,\n toolResults: [{ toolCallId, toolName: 'Check', result: resultText }],\n });\n continue;\n }\n\n if (call.toolName === 'Cancel') {\n const proc = this.config.processManager.cancel(String(call.args.id));\n const resultText = proc ? `Process ${call.args.id} cancelled` : `Process not found: ${call.args.id}`;\n toolResultMessages.push({\n role: 'tool',\n content: resultText,\n toolResults: [{ toolCallId, toolName: 'Cancel', result: resultText }],\n });\n continue;\n }\n\n if (call.toolName === 'ReadEpisode') {\n const episodeId = String(call.args.id);\n const trace = await this.config.config.episodeStore.getTrace(episodeId);\n let resultText: string;\n if (!trace) {\n resultText = `Trace not found for episode: ${episodeId}`;\n } else {\n resultText = trace.messages\n .map((message) => {\n const textContent = getTextContent(message.content);\n if (message.role === 'assistant' && message.toolCalls?.length) {\n const calls = message.toolCalls.map((toolCall) => ` ${toolCall.toolName}(${JSON.stringify(toolCall.args)})`).join('\\n');\n return `[assistant]\\n${textContent}\\n[tool calls]\\n${calls}`;\n }\n if (message.role === 'tool' && message.toolResults?.length) {\n const results = message.toolResults.map((toolResult) => {\n const output = toolResult.result.length > 500 ? toolResult.result.slice(0, 500) + '...' : toolResult.result;\n return ` ${toolResult.toolName}: ${toolResult.isError ? 'ERROR: ' : ''}${output}`;\n }).join('\\n');\n return `[tool results]\\n${results}`;\n }\n return `[${message.role}]\\n${textContent}`;\n })\n .join('\\n\\n');\n\n const proc = [...this.config.processManager.values()].find((process) => process.result?.episode.id === episodeId);\n if (proc?.result && proc.result.artifacts.length > 0) {\n resultText += '\\n\\n--- Artifacts ---\\n';\n resultText += proc.result.artifacts\n .map((artifact) => `[${artifact.key}]\\n${artifact.content}`)\n .join('\\n\\n');\n }\n\n if (typeof call.args.maxTokens === 'number' && call.args.maxTokens > 0) {\n const maxChars = call.args.maxTokens * 4;\n if (resultText.length > maxChars) {\n resultText = resultText.slice(0, maxChars) + '\\n... [truncated]';\n }\n }\n }\n toolResultMessages.push({\n role: 'tool',\n content: resultText,\n toolResults: [{ toolCallId, toolName: 'ReadEpisode', result: resultText }],\n });\n continue;\n }\n\n if (call.toolName === 'Remember') {\n const memOpts: { category?: string } = {};\n if (call.args.category != null) memOpts.category = String(call.args.category);\n const memId = await this.config.memory.store(String(call.args.content), memOpts);\n yield { type: 'memory_stored', id: memId, content: String(call.args.content) };\n const resultText = `Stored to memory (id: ${memId})`;\n toolResultMessages.push({\n role: 'tool',\n content: resultText,\n toolResults: [{ toolCallId, toolName: 'Remember', result: resultText }],\n });\n continue;\n }\n\n if (this.config.config.onOrchestratorTool) {\n const action = await this.config.config.onOrchestratorTool(call.toolName, call.args);\n const resultText = this.toToolContent(action, call.toolName);\n toolResultMessages.push({\n role: 'tool',\n content: resultText,\n toolResults: [{ toolCallId, toolName: call.toolName, result: resultText }],\n });\n }\n }\n\n if (toolResultMessages.length > 0) {\n this.config.ctx.recordTurn({\n role: 'process_result',\n messages: toolResultMessages,\n tokenEstimate: toolResultMessages.reduce((sum, message) => {\n const textContent = typeof message.content === 'string' ? message.content : getTextContent(message.content);\n return sum + estimateTokens(textContent);\n }, 0),\n timestamp: Date.now(),\n });\n }\n\n return { type: 'continue' };\n }\n\n private toProcessRequest(args: Record<string, unknown>): ProcessRequest {\n const req: ProcessRequest = { action: String(args.action ?? '') };\n if (Array.isArray(args.contextEpisodeIds)) {\n req.contextEpisodeIds = args.contextEpisodeIds.map(String);\n }\n if (args.model != null) {\n req.model = String(args.model) as NonNullable<ProcessRequest['model']>;\n }\n if (typeof args.maxSteps === 'number') {\n req.maxSteps = args.maxSteps;\n }\n if (typeof args.label === 'string') {\n req.label = args.label;\n }\n if (typeof args.profile === 'string') {\n req.profile = args.profile;\n }\n return req;\n }\n\n private buildAssistantMessages(text: string, toolCalls: ToolCall[]): AgentMessage[] {\n const content = text || toolCalls.map((call) => `${call.toolName}: ${JSON.stringify(call.args).slice(0, 100)}`).join('\\n');\n return [{\n role: 'assistant',\n content,\n toolCalls: toolCalls.map((call) => ({\n toolCallId: call.toolCallId ?? randomUUID(),\n toolName: call.toolName,\n args: call.args,\n })),\n }];\n }\n\n private toToolContent(action: AgentAction | undefined, toolName: string): string {\n return action && 'content' in action && typeof action.content === 'string'\n ? action.content\n : `${toolName}: handled`;\n }\n}\n","import type { AgentMessage } from '../agent/types';\nimport { getTextContent } from '../agent/types';\nimport { estimateTokens } from './message-convert';\nimport type { ContextWindow } from './context-window';\nimport type { ProcessManager } from './process-manager';\nimport type { ArcEvent } from './types';\n\ntype CompletionPolicyConfig = {\n ctx: ContextWindow;\n processManager: ProcessManager;\n processTimeout?: number;\n};\n\nexport class CompletionPolicy {\n private readonly config: CompletionPolicyConfig;\n private readonly reportedCompletions = new Set<string>();\n\n constructor(config: CompletionPolicyConfig) {\n this.config = config;\n }\n\n async *settleTurn(signal: AbortSignal): AsyncGenerator<ArcEvent> {\n yield* this.waitForRunningProcesses(signal);\n this.recordCompletionMessages();\n }\n\n private async *waitForRunningProcesses(signal: AbortSignal): AsyncGenerator<ArcEvent> {\n const active = [...this.config.processManager.values()].filter(\n (process) => process.status === 'running' || process.status === 'pending',\n );\n if (active.length === 0) return;\n\n const deadline = Date.now() + (this.config.processTimeout ?? 120_000);\n while (active.some((process) => process.status === 'running' || process.status === 'pending') && Date.now() <= deadline) {\n await this.config.processManager.waitForPendingEvent(signal, 400);\n yield* this.config.processManager.drainPendingEvents();\n }\n }\n\n private recordCompletionMessages(): void {\n const completionMessages: AgentMessage[] = [];\n\n for (const [id, process] of this.config.processManager.entries()) {\n if (!process.result || this.reportedCompletions.has(id)) continue;\n\n this.reportedCompletions.add(id);\n\n const episode = process.result.episode;\n const status = process.result.success ? 'success' : `failed: ${process.result.error ?? 'unknown'}`;\n const deliveredFile = process.result.trace?.messages?.some(\n (message) => message.role === 'tool' && message.toolResults?.some(\n (toolResult) => toolResult.toolName === 'DownloadRawFile' && !toolResult.isError,\n ),\n );\n\n const hints = [\n `To give a dependent thread the full data from this thread, pass contextEpisodeIds: [\"${episode.id}\"]`,\n ];\n if (deliveredFile) {\n hints.push('File was delivered to the user. Do NOT recreate or redo this work — synthesize the result and respond.');\n }\n\n completionMessages.push({\n role: 'user',\n content: `[Thread ${id} completed] (episodeId: ${episode.id}) — ${status}\\n${episode.summary}\\n\\n${hints.join('\\n')}`,\n });\n }\n\n if (completionMessages.length === 0) return;\n\n this.config.ctx.recordTurn({\n role: 'process_result',\n messages: completionMessages,\n tokenEstimate: completionMessages.reduce((sum, message) => {\n const text = typeof message.content === 'string' ? message.content : getTextContent(message.content);\n return sum + estimateTokens(text);\n }, 0),\n timestamp: Date.now(),\n });\n }\n}\n","import { anthropic as defaultAnthropicProvider, createAnthropic } from '@ai-sdk/anthropic';\nimport type { ModelFactory } from './types';\nimport type { AgentMessage } from '../agent/types';\nimport { getTextContent } from '../agent/types';\nimport type { ModelTier } from './arc-types';\nimport { DEFAULT_MODEL_MAP, resolveModel } from './arc-types';\nimport type {\n ArcLoopConfig,\n ArcEvent,\n ArcRunResult,\n TraceEvent,\n} from './types';\nimport type { ResiliencePolicy } from './resilience/types';\nimport { estimateTokens } from './message-convert';\nimport { orchestratorTools } from './tools';\nimport { ContextWindow } from './context-window';\nimport { MemoryManager } from './memory-manager';\nimport { runConsolidation } from './consolidation';\nimport type { SkillResolver } from './skill-resolver';\nimport { DefaultSkillResolver } from './skill-resolver';\nimport { ProcessManager } from './process-manager';\nimport { OrchestratorTurnRunner } from './orchestrator-turn-runner';\nimport { CompletionPolicy } from './completion-policy';\n\n// ── Default orchestrator prompt ──\n\nconst DEFAULT_ORCHESTRATOR_PROMPT = `You are an orchestrator agent. You accomplish tasks by decomposing them into focused processes, delegating each to a Thread, and synthesizing the results.\n\n## Workflow: Decompose → Delegate → Synthesize\n\n1. **Decompose**: Break the user's request into independent, focused sub-tasks.\n2. **Delegate**: Dispatch each sub-task as a Thread call. Independent sub-tasks go in the SAME turn (parallel).\n3. **Synthesize**: Once threads complete, combine their results into a coherent response.\n\n## Tools\n\n- **Thread**: Dispatch a background process. Returns immediately. Multiple per turn = parallel.\n- **Check**: Check status or results of a process by ID.\n- **Cancel**: Cancel a running process.\n- **Remember**: Save information to persistent memory.\n- **ReadEpisode**: Retrieve the full trace of a completed episode (detailed tool outputs, file contents, errors).\n\n## When to dispatch threads\n\nDispatch when the task requires tool use (search, code, file I/O, web access). Examples:\n- \"Research X and Y\" → 2 parallel research threads\n- \"Read file A, then modify it\" → 1 read thread, then 1 write thread with contextEpisodeIds\n- \"Create a report with data from 3 sources\" → 3 parallel data threads, then 1 synthesis thread\n\n## When NOT to dispatch\n\nDo NOT dispatch threads for tasks you can answer directly:\n- Simple factual questions from your knowledge\n- Clarifying the user's request (ask directly instead)\n- Summarizing results already in your context\n\n## Clarification\n\nIf the request is ambiguous, ask the user before dispatching. It is better to ask one clarifying question than to dispatch threads that do the wrong thing.\n\n## Model selection\n\n- **\"fast\"** — 1 step only: a single search, read, or check. Use parallel fast threads for multiple lookups.\n- **\"medium\"** (default) — implementation, writing code, running tests, standard tasks.\n- **\"strong\"** — complex refactoring, debugging subtle issues, architectural decisions, multi-file changes.\n\n## Concurrency\n\nDispatch at most 3 threads per turn. If more are needed, dispatch the first batch and wait for results before the next.\n\n## Context passing\n\nThreads automatically receive the user's current message and any attachment metadata as seed context. You do NOT need to copy-paste URLs, file contents, or pasted data into the action text — threads can read this directly from their context.\n\nUse contextEpisodeIds to chain dependent threads: research threads first (parallel), then implementation threads with their episodeIds.\n\n## Completion\n\nWhen the task is fully complete, respond with a text summary (no Thread call). Include key findings, actions taken, and any follow-up recommendations.`;\n\n// ── ArcLoop v2 ──\n\nexport class ArcLoop {\n private readonly config: ArcLoopConfig;\n private readonly ctx: ContextWindow;\n private readonly memory: MemoryManager;\n private readonly modelMap: Record<ModelTier, string>;\n private readonly orchestratorModel: string;\n private readonly systemPrompt: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly cachedSystem: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly tools: Record<string, any>;\n private readonly resilience: ResiliencePolicy | undefined;\n private readonly traceWriter: ((event: TraceEvent) => void) | undefined;\n private readonly skillResolver: SkillResolver | undefined;\n private readonly createModel: ModelFactory;\n private readonly processManager: ProcessManager;\n private readonly turnRunner: OrchestratorTurnRunner;\n private readonly completionPolicy: CompletionPolicy;\n /** Cached session memo facts — loaded once at stream start, injected into all threads. */\n private cachedSessionMemoFacts: string[] | undefined;\n\n constructor(config: ArcLoopConfig) {\n this.config = config;\n this.createModel = config.createModel\n ?? (config.apiKey ? createAnthropic({ apiKey: config.apiKey }) : defaultAnthropicProvider);\n this.modelMap = { ...DEFAULT_MODEL_MAP, ...config.modelMap };\n this.orchestratorModel = resolveModel(config.model, this.modelMap, this.modelMap.strong);\n this.systemPrompt = config.systemPrompt ?? DEFAULT_ORCHESTRATOR_PROMPT;\n\n this.cachedSystem = [{\n role: 'system' as const,\n content: this.systemPrompt,\n }];\n\n this.tools = {\n ...orchestratorTools,\n ...config.extraOrchestratorTools,\n };\n\n this.memory = new MemoryManager({\n sessionMemoStore: config.sessionMemoStore,\n longTermStore: config.longTermStore,\n sessionId: config.sessionId,\n });\n\n this.ctx = new ContextWindow({\n contextWindowSize: config.contextWindowSize ?? 200_000,\n outputReserve: config.outputReserve ?? 20_000,\n systemPrompt: this.systemPrompt,\n episodeStore: config.episodeStore,\n memory: this.memory,\n taskId: config.taskId,\n createModel: this.createModel,\n modelId: this.orchestratorModel,\n dynamicContextWindow: config.dynamicContextWindow ?? false,\n });\n\n this.resilience = config.resilience;\n this.traceWriter = (config as ArcLoopConfig & { traceWriter?: (event: TraceEvent) => void }).traceWriter;\n\n this.skillResolver = config.skillResolver\n ?? (config.skillIndexPath\n ? new DefaultSkillResolver({\n skillIndexPath: config.skillIndexPath,\n routerConfig: {\n createModel: this.createModel,\n model: this.modelMap.fast,\n },\n })\n : undefined);\n\n this.processManager = new ProcessManager({\n loopConfig: config,\n createModel: this.createModel,\n modelMap: this.modelMap,\n ...(this.skillResolver ? { skillResolver: this.skillResolver } : {}),\n onEpisodeCompleted: (episode) => {\n this.ctx.addEpisode(episode);\n },\n trace: (kind) => {\n this.trace(kind);\n },\n });\n\n this.turnRunner = new OrchestratorTurnRunner({\n createModel: this.createModel,\n orchestratorModel: this.orchestratorModel,\n tools: this.tools,\n cachedSystem: this.cachedSystem,\n ...(this.config.orchestratorToolChoice\n ? { orchestratorToolChoice: this.config.orchestratorToolChoice }\n : {}),\n ...(this.resilience ? { resilience: this.resilience } : {}),\n config: this.config,\n ctx: this.ctx,\n memory: this.memory,\n processManager: this.processManager,\n trace: (kind) => {\n this.trace(kind);\n },\n });\n\n this.completionPolicy = new CompletionPolicy({\n ctx: this.ctx,\n processManager: this.processManager,\n ...(this.config.processTimeout != null ? { processTimeout: this.config.processTimeout } : {}),\n });\n }\n\n private trace(kind: TraceEvent['kind']): void {\n this.traceWriter?.({ ts: Date.now(), kind });\n }\n\n async *stream(userMessages: AgentMessage[], signal: AbortSignal): AsyncGenerator<ArcEvent> {\n // Pre-load session memos once so dispatch() can inject them synchronously\n try {\n const memo = this.config.sessionMemoStore.getMemoBySession\n ? await this.config.sessionMemoStore.getMemoBySession(this.config.sessionId)\n : (await this.config.sessionMemoStore.getMemosBySession(this.config.sessionId))[0] ?? null;\n this.cachedSessionMemoFacts = memo ? [memo.content] : [];\n } catch { this.cachedSessionMemoFacts = []; }\n this.processManager.setSessionMemoFacts(this.cachedSessionMemoFacts);\n\n const startTime = Date.now();\n const maxTurns = this.config.maxTurns ?? 30;\n let forcedFinalResponseRetry = false;\n\n this.ctx.recordTurn({\n role: 'user',\n messages: userMessages,\n tokenEstimate: userMessages.reduce((sum, m) => {\n const text = typeof m.content === 'string' ? m.content : getTextContent(m.content);\n return sum + estimateTokens(text);\n }, 0),\n timestamp: Date.now(),\n });\n\n for (let turn = 0; turn < maxTurns; turn++) {\n signal.throwIfAborted();\n this.trace({ type: 'turn_start', turn });\n yield { type: 'turn_start', turn };\n\n yield* this.processManager.drainPendingEvents();\n\n if (this.processManager.hasRunningProcesses()) {\n await this.processManager.waitForPendingEvent(signal, 400);\n const pending = [...this.processManager.drainPendingEvents()];\n if (pending.length > 0) {\n yield* pending;\n continue;\n }\n }\n\n const prepared = await this.ctx.prepare(signal);\n this.trace({\n type: 'context_prepare',\n used: prepared.budget.used,\n limit: prepared.budget.limit,\n compression_tier: 'none', // TODO: propagate actual tier from ContextWindow\n });\n\n const turnResult = yield* this.turnRunner.runTurn({\n turn,\n maxTurns,\n prepared,\n signal,\n forcedFinalResponseRetry,\n });\n\n if (turnResult.type === 'retry_empty') {\n forcedFinalResponseRetry = true;\n continue;\n }\n\n if (turnResult.type === 'done') {\n this.trace({ type: 'turn_end', turn });\n yield { type: 'turn_end', turn };\n\n await this.processManager.waitForProcessListeners();\n yield* this.processManager.drainPendingEvents();\n\n this.trace({ type: 'done' });\n yield {\n type: 'done',\n output: turnResult.output,\n stats: { turns: turn + 1, processes: this.processManager.size, durationMs: Date.now() - startTime },\n };\n return;\n }\n\n this.trace({ type: 'turn_end', turn });\n yield { type: 'turn_end', turn };\n yield* this.completionPolicy.settleTurn(signal);\n }\n\n await this.processManager.waitForProcessListeners();\n yield* this.processManager.drainPendingEvents();\n\n this.trace({ type: 'done' });\n yield {\n type: 'done',\n output: 'Orchestrator reached maximum turns.',\n stats: { turns: maxTurns, processes: this.processManager.size, durationMs: Date.now() - startTime },\n };\n }\n\n async run(messages: AgentMessage[], signal: AbortSignal): Promise<ArcRunResult> {\n let output = '';\n const events: ArcEvent[] = [];\n for await (const e of this.stream(messages, signal)) {\n events.push(e);\n if (e.type === 'done') output = e.output;\n }\n return { output, events };\n }\n}\n\n// ── Convenience factory ──\n\nexport interface CreateArcAgentV2Config extends ArcLoopConfig {\n consolidate?: boolean;\n traceWriter?: (event: TraceEvent) => void;\n}\n\nexport async function createArcAgentV2(config: CreateArcAgentV2Config) {\n const loop = new ArcLoop(config);\n\n return {\n loop,\n\n async run(messages: AgentMessage[], signal?: AbortSignal): Promise<ArcRunResult> {\n const ac = new AbortController();\n const effectiveSignal = signal ?? ac.signal;\n\n const result = await loop.run(messages, effectiveSignal);\n\n if (config.consolidate !== false) {\n try {\n await runConsolidation(\n config.taskId,\n config.sessionId,\n config.episodeStore,\n config.sessionMemoStore,\n config.longTermStore,\n );\n } catch {\n // Consolidation is best-effort\n }\n\n if (config.autoMemory !== false) {\n const memory = new MemoryManager({\n sessionMemoStore: config.sessionMemoStore,\n longTermStore: config.longTermStore,\n sessionId: config.sessionId,\n });\n try {\n const episodes = await config.episodeStore.getEpisodesByTask(config.taskId);\n await memory.detectAndPromote(episodes);\n } catch {\n // Best-effort\n }\n }\n }\n\n return result;\n },\n\n async *stream(messages: AgentMessage[], signal?: AbortSignal): AsyncGenerator<ArcEvent> {\n const ac = new AbortController();\n const effectiveSignal = signal ?? ac.signal;\n\n yield* loop.stream(messages, effectiveSignal);\n\n if (config.consolidate !== false) {\n void (async () => {\n try {\n await runConsolidation(\n config.taskId,\n config.sessionId,\n config.episodeStore,\n config.sessionMemoStore,\n config.longTermStore,\n );\n } catch { /* best-effort */ }\n\n if (config.autoMemory !== false) {\n const memory = new MemoryManager({\n sessionMemoStore: config.sessionMemoStore,\n longTermStore: config.longTermStore,\n sessionId: config.sessionId,\n });\n try {\n const episodes = await config.episodeStore.getEpisodesByTask(config.taskId);\n await memory.detectAndPromote(episodes);\n } catch { /* best-effort */ }\n }\n })();\n }\n },\n };\n}\n","import type { AgentMessage } from '../agent/types';\nimport type { ArcLoopConfig, ArcEvent, ArcRunResult, TraceEvent } from './types';\nimport { ArcLoop } from './arc-loop';\nimport { runConsolidation } from './consolidation';\nimport { MemoryManager } from './memory-manager';\n\nexport interface ArcAgentConfig extends ArcLoopConfig {\n /** Run consolidation after task completion (default: true) */\n consolidate?: boolean;\n /** Automatically detect patterns and promote to long-term memory (default: true) */\n autoMemory?: boolean;\n /** Trace writer for Stateright verification bridge */\n traceWriter?: (event: TraceEvent) => void;\n}\n\n/**\n * Create an agent powered by the ArcLoop v2 orchestrator.\n *\n * Returns an object with run() and stream() methods that drive\n * the ArcLoop directly. Consolidation runs automatically after\n * each run/stream completes.\n */\nexport function createArcAgent(config: ArcAgentConfig) {\n const loop = new ArcLoop(config);\n\n return {\n loop,\n\n async run(messages: AgentMessage[], signal?: AbortSignal): Promise<ArcRunResult> {\n const ac = new AbortController();\n const effectiveSignal = signal ?? ac.signal;\n\n const result = await loop.run(messages, effectiveSignal);\n\n if (config.consolidate !== false) {\n try {\n await runConsolidation(\n config.taskId,\n config.sessionId,\n config.episodeStore,\n config.sessionMemoStore,\n config.longTermStore,\n );\n } catch {\n // Consolidation is best-effort\n }\n\n if (config.autoMemory !== false) {\n const memory = new MemoryManager({\n sessionMemoStore: config.sessionMemoStore,\n longTermStore: config.longTermStore,\n sessionId: config.sessionId,\n });\n try {\n const episodes = await config.episodeStore.getEpisodesByTask(config.taskId);\n await memory.detectAndPromote(episodes);\n } catch {\n // Best-effort\n }\n }\n }\n\n return result;\n },\n\n async *stream(messages: AgentMessage[], signal?: AbortSignal): AsyncGenerator<ArcEvent> {\n const ac = new AbortController();\n const effectiveSignal = signal ?? ac.signal;\n\n yield* loop.stream(messages, effectiveSignal);\n\n if (config.consolidate !== false) {\n void (async () => {\n try {\n await runConsolidation(\n config.taskId,\n config.sessionId,\n config.episodeStore,\n config.sessionMemoStore,\n config.longTermStore,\n );\n } catch { /* best-effort */ }\n\n if (config.autoMemory !== false) {\n const memory = new MemoryManager({\n sessionMemoStore: config.sessionMemoStore,\n longTermStore: config.longTermStore,\n sessionId: config.sessionId,\n });\n try {\n const episodes = await config.episodeStore.getEpisodesByTask(config.taskId);\n await memory.detectAndPromote(episodes);\n } catch { /* best-effort */ }\n }\n })();\n }\n },\n };\n}\n"]}
|